1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 
3 /*
4  *  GThumb
5  *
6  *  Copyright (C) 2001-2008 Free Software Foundation, Inc.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #include <string.h>
23 #include "glib-utils.h"
24 #include "gth-string-list.h"
25 
26 
27 struct _GthStringListPrivate {
28 	GList *list;
29 };
30 
31 
G_DEFINE_TYPE_WITH_CODE(GthStringList,gth_string_list,G_TYPE_OBJECT,G_ADD_PRIVATE (GthStringList))32 G_DEFINE_TYPE_WITH_CODE (GthStringList,
33 			 gth_string_list,
34 			 G_TYPE_OBJECT,
35 			 G_ADD_PRIVATE (GthStringList))
36 
37 
38 static void
39 gth_string_list_finalize (GObject *obj)
40 {
41 	GthStringList *self;
42 
43 	self = GTH_STRING_LIST (obj);
44 
45 	_g_string_list_free (self->priv->list);
46 
47 	G_OBJECT_CLASS (gth_string_list_parent_class)->finalize (obj);
48 }
49 
50 
51 static void
gth_string_list_class_init(GthStringListClass * klass)52 gth_string_list_class_init (GthStringListClass *klass)
53 {
54 	G_OBJECT_CLASS (klass)->finalize = gth_string_list_finalize;
55 }
56 
57 
58 static void
gth_string_list_init(GthStringList * self)59 gth_string_list_init (GthStringList *self) {
60 	self->priv = gth_string_list_get_instance_private (self);
61 	self->priv->list = NULL;
62 }
63 
64 
65 GthStringList *
gth_string_list_new(GList * list)66 gth_string_list_new (GList *list)
67 {
68 	GthStringList *string_list;
69 
70 	string_list = g_object_new (GTH_TYPE_STRING_LIST, NULL);
71 	string_list->priv->list = _g_string_list_dup (list);
72 
73 	return string_list;
74 }
75 
76 
77 GthStringList *
gth_string_list_new_from_strv(char ** strv)78 gth_string_list_new_from_strv (char **strv)
79 {
80 	GthStringList *string_list;
81 	int            i;
82 
83 	string_list = g_object_new (GTH_TYPE_STRING_LIST, NULL);
84 	if (strv != NULL) {
85 		for (i = 0; strv[i] != NULL; i++)
86 			string_list->priv->list = g_list_prepend (string_list->priv->list, g_strdup (g_strstrip (strv[i])));
87 		string_list->priv->list = g_list_reverse (string_list->priv->list);
88 	}
89 	else
90 		string_list->priv->list = NULL;
91 
92 	return string_list;
93 }
94 
95 
96 GthStringList *
gth_string_list_new_from_ptr_array(GPtrArray * array)97 gth_string_list_new_from_ptr_array (GPtrArray *array)
98 {
99 	GthStringList *string_list;
100 	int            i;
101 
102 	string_list = g_object_new (GTH_TYPE_STRING_LIST, NULL);
103 	if (array != NULL) {
104 		for (i = 0; i < array->len; i++)
105 			string_list->priv->list = g_list_prepend (string_list->priv->list, g_strdup (g_ptr_array_index (array, i)));
106 		string_list->priv->list = g_list_reverse (string_list->priv->list);
107 	}
108 	else
109 		string_list->priv->list = NULL;
110 
111 	return string_list;
112 }
113 
114 
115 GList *
gth_string_list_get_list(GthStringList * list)116 gth_string_list_get_list (GthStringList *list)
117 {
118 	if (list == NULL)
119 		return NULL;
120 	return list->priv->list;
121 }
122 
123 
124 void
gth_string_list_set_list(GthStringList * list,GList * value)125 gth_string_list_set_list (GthStringList *list,
126 			  GList         *value)
127 {
128 	list->priv->list = value;
129 }
130 
131 
132 char *
gth_string_list_join(GthStringList * list,const char * separator)133 gth_string_list_join (GthStringList *list,
134 		      const char    *separator)
135 {
136 	GString *str;
137 	GList   *scan;
138 
139 	str = g_string_new ("");
140 	for (scan = list->priv->list; scan; scan = scan->next) {
141 		if (scan != list->priv->list)
142 			g_string_append (str, separator);
143 		g_string_append (str, (char *) scan->data);
144 	}
145 
146 	return g_string_free (str, FALSE);
147 }
148 
149 
150 gboolean
gth_string_list_equal(GthStringList * list1,GthStringList * list2)151 gth_string_list_equal (GthStringList  *list1,
152 		       GthStringList  *list2)
153 {
154 	return gth_string_list_equal_custom (list1, list2, (GCompareFunc) strcmp);
155 }
156 
157 
158 gboolean
gth_string_list_equal_custom(GthStringList * list1,GthStringList * list2,GCompareFunc compare_func)159 gth_string_list_equal_custom (GthStringList  *list1,
160 			      GthStringList  *list2,
161 			      GCompareFunc    compare_func)
162 {
163 	GList *keys1;
164 	GList *keys2;
165 	GList *scan;
166 
167 	if ((list1 == NULL) && (list2 == NULL))
168 		return TRUE;
169 	if ((list1 == NULL) || (list2 == NULL))
170 		return FALSE;
171 
172 	keys1 = list1->priv->list;
173 	keys2 = list2->priv->list;
174 
175 	if (g_list_length (keys1) != g_list_length (keys2))
176 		return FALSE;
177 
178 	for (scan = keys1; scan; scan = scan->next)
179 		if (! g_list_find_custom (keys2, scan->data, compare_func))
180 			return FALSE;
181 
182 	return TRUE;
183 }
184 
185 
186 void
gth_string_list_append(GthStringList * list1,GthStringList * list2)187 gth_string_list_append (GthStringList *list1,
188 			GthStringList *list2)
189 {
190 	GList *scan;
191 
192 	g_return_if_fail (GTH_IS_STRING_LIST (list1));
193 
194 	if (list2 == NULL)
195 		return;
196 
197 	for (scan = list2->priv->list; scan; scan = scan->next)
198 		if (! g_list_find_custom (list1->priv->list, scan->data, (GCompareFunc) strcmp))
199 			list1->priv->list = g_list_append (list1->priv->list, g_strdup (scan->data));
200 }
201 
202 
203 void
gth_string_list_concat(GthStringList * list1,GthStringList * list2)204 gth_string_list_concat (GthStringList  *list1,
205 			GthStringList  *list2)
206 {
207 	if (list2 == NULL)
208 		return;
209 	list1->priv->list = g_list_concat (list1->priv->list, _g_string_list_dup (list2->priv->list));
210 }
211 
212 
213 GHashTable *
_g_hash_table_from_string_list(GthStringList * list)214 _g_hash_table_from_string_list (GthStringList *list)
215 {
216 	GHashTable *h;
217 	GList      *scan;
218 
219 	h = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
220 	for (scan = gth_string_list_get_list (list); scan; scan = scan->next)
221 		g_hash_table_insert (h, g_strdup (scan->data), GINT_TO_POINTER (1));
222 
223 	return h;
224 }
225