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