2 * gstr.c: String Utility Functions.
5 * Miguel de Icaza (miguel@novell.com)
6 * Aaron Bockover (abockover@novell.com)
8 * (C) 2006 Novell, Inc.
10 * Permission is hereby granted, free of charge, to any person obtaining
11 * a copy of this software and associated documentation files (the
12 * "Software"), to deal in the Software without restriction, including
13 * without limitation the rights to use, copy, modify, merge, publish,
14 * distribute, sublicense, and/or sell copies of the Software, and to
15 * permit persons to whom the Software is furnished to do so, subject to
16 * the following conditions:
18 * The above copyright notice and this permission notice shall be
19 * included in all copies or substantial portions of the Software.
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 /* This is not a macro, because I dont want to put _GNU_SOURCE in the glib.h header */
36 g_strndup (const gchar *str, gsize n)
38 return strndup (str, n);
42 g_strfreev (gchar **str_array)
44 gchar **orig = str_array;
45 if (str_array == NULL)
47 while (*str_array != NULL){
55 g_strv_length(gchar **str_array)
58 g_return_val_if_fail(str_array != NULL, 0);
59 for(length = 0; str_array[length] != NULL; length++);
64 g_str_has_suffix(const gchar *str, const gchar *suffix)
69 g_return_val_if_fail(str != NULL, FALSE);
70 g_return_val_if_fail(suffix != NULL, FALSE);
72 str_length = strlen(str);
73 suffix_length = strlen(suffix);
75 return suffix_length <= str_length ?
76 strncmp(str + str_length - suffix_length, suffix, suffix_length) == 0 :
81 g_str_has_prefix(const gchar *str, const gchar *prefix)
86 g_return_val_if_fail(str != NULL, FALSE);
87 g_return_val_if_fail(prefix != NULL, FALSE);
89 str_length = strlen(str);
90 prefix_length = strlen(prefix);
92 return prefix_length <= str_length ?
93 strncmp(str, prefix, prefix_length) == 0 :
98 g_strdup_vprintf (const gchar *format, va_list args)
103 n = vasprintf (&ret, format, args);
111 g_strdup_printf (const gchar *format, ...)
117 va_start (args, format);
118 n = vasprintf (&ret, format, args);
127 g_strerror (gint errnum)
129 return strerror (errnum);
133 g_strconcat (const gchar *first, ...)
135 g_return_val_if_fail (first != NULL, NULL);
140 total += strlen (first);
141 va_start (args, first);
142 for (s = va_arg (args, char *); s != NULL; s = va_arg(args, char *)){
147 ret = g_malloc (total + 1);
153 va_start (args, first);
154 for (s = va_arg (args, char *); s != NULL; s = va_arg(args, char *)){
163 g_strsplit (const gchar *string, const gchar *delimiter, gint max_tokens)
166 gchar *strtok_save, **vector;
167 gchar *token, *token_c;
171 g_return_val_if_fail(string != NULL, NULL);
172 g_return_val_if_fail(delimiter != NULL, NULL);
173 g_return_val_if_fail(delimiter[0] != '\0', NULL);
175 token_length = strlen(string);
176 string_c = (gchar *)g_malloc(token_length + 1);
177 strncpy(string_c, string, token_length);
178 string_c[token_length] = '\0';
181 token = (gchar *)strtok_r(string_c, delimiter, &strtok_save);
183 while(token != NULL) {
184 token_length = strlen(token);
185 token_c = (gchar *)g_malloc(token_length + 1);
186 strncpy(token_c, token, token_length);
187 token_c[token_length] = '\0';
189 vector = vector == NULL ?
190 (gchar **)g_malloc(sizeof(vector)) :
191 (gchar **)g_realloc(vector, (size + 1) * sizeof(vector));
193 vector[size - 1] = token_c;
196 if(max_tokens > 0 && size >= max_tokens) {
197 if(size > max_tokens) {
203 token = (gchar *)strtok_r(NULL, delimiter, &strtok_save);
207 vector[size - 1] = NULL;
215 g_strreverse (gchar *str)
227 for (i = 0; i < half; i++, len--) {