[Process] Concatenate envirnoment key and value in managed
[mono-project.git] / eglib / src / gstring.c
blobba75789bc80788719d2e9ffaf972e835a88f6887
1 /*
2 * String functions
4 * Author:
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.
29 #include <stdio.h>
30 #include <glib.h>
32 #define GROW_IF_NECESSARY(s,l) { \
33 if(s->len + l >= s->allocated_len) { \
34 s->allocated_len = (s->allocated_len + l + 16) * 2; \
35 s->str = g_realloc(s->str, s->allocated_len); \
36 } \
39 GString *
40 g_string_new_len (const gchar *init, gssize len)
42 GString *ret = g_new (GString, 1);
44 if (init == NULL)
45 ret->len = 0;
46 else
47 ret->len = len < 0 ? strlen(init) : len;
48 ret->allocated_len = MAX(ret->len + 1, 16);
49 ret->str = g_malloc(ret->allocated_len);
50 if (init)
51 memcpy(ret->str, init, ret->len);
52 ret->str[ret->len] = 0;
54 return ret;
57 GString *
58 g_string_new (const gchar *init)
60 return g_string_new_len(init, -1);
63 GString *
64 g_string_sized_new (gsize default_size)
66 GString *ret = g_new (GString, 1);
68 ret->str = g_malloc (default_size);
69 ret->str [0] = 0;
70 ret->len = 0;
71 ret->allocated_len = default_size;
73 return ret;
76 gchar *
77 g_string_free (GString *string, gboolean free_segment)
79 gchar *data;
81 g_return_val_if_fail (string != NULL, NULL);
83 data = string->str;
84 g_free(string);
86 if(!free_segment) {
87 return data;
90 g_free(data);
91 return NULL;
94 GString *
95 g_string_append_len (GString *string, const gchar *val, gssize len)
97 g_return_val_if_fail(string != NULL, NULL);
98 g_return_val_if_fail(val != NULL, string);
100 if(len < 0) {
101 len = strlen(val);
104 GROW_IF_NECESSARY(string, len);
105 memcpy(string->str + string->len, val, len);
106 string->len += len;
107 string->str[string->len] = 0;
109 return string;
112 GString *
113 g_string_append (GString *string, const gchar *val)
115 g_return_val_if_fail(string != NULL, NULL);
116 g_return_val_if_fail(val != NULL, string);
118 return g_string_append_len(string, val, -1);
121 GString *
122 g_string_append_c (GString *string, gchar c)
124 g_return_val_if_fail(string != NULL, NULL);
126 GROW_IF_NECESSARY(string, 1);
128 string->str[string->len] = c;
129 string->str[string->len + 1] = 0;
130 string->len++;
132 return string;
135 GString *
136 g_string_append_unichar (GString *string, gunichar c)
138 gchar utf8[6];
139 gint len;
141 g_return_val_if_fail (string != NULL, NULL);
143 if ((len = g_unichar_to_utf8 (c, utf8)) <= 0)
144 return string;
146 return g_string_append_len (string, utf8, len);
149 GString *
150 g_string_prepend (GString *string, const gchar *val)
152 gssize len;
154 g_return_val_if_fail (string != NULL, string);
155 g_return_val_if_fail (val != NULL, string);
157 len = strlen (val);
159 GROW_IF_NECESSARY(string, len);
160 memmove(string->str + len, string->str, string->len + 1);
161 memcpy(string->str, val, len);
163 return string;
166 GString *
167 g_string_insert (GString *string, gssize pos, const gchar *val)
169 gssize len;
171 g_return_val_if_fail (string != NULL, string);
172 g_return_val_if_fail (val != NULL, string);
173 g_return_val_if_fail (pos <= string->len, string);
175 len = strlen (val);
177 GROW_IF_NECESSARY(string, len);
178 memmove(string->str + pos + len, string->str + pos, string->len - pos - len + 1);
179 memcpy(string->str + pos, val, len);
181 return string;
184 void
185 g_string_append_printf (GString *string, const gchar *format, ...)
187 char *ret;
188 va_list args;
190 g_return_if_fail (string != NULL);
191 g_return_if_fail (format != NULL);
193 va_start (args, format);
194 ret = g_strdup_vprintf (format, args);
195 va_end (args);
196 g_string_append (string, ret);
198 g_free (ret);
201 void
202 g_string_append_vprintf (GString *string, const gchar *format, va_list args)
204 char *ret;
206 g_return_if_fail (string != NULL);
207 g_return_if_fail (format != NULL);
209 ret = g_strdup_vprintf (format, args);
210 g_string_append (string, ret);
211 g_free (ret);
214 void
215 g_string_printf (GString *string, const gchar *format, ...)
217 va_list args;
219 g_return_if_fail (string != NULL);
220 g_return_if_fail (format != NULL);
222 g_free (string->str);
224 va_start (args, format);
225 string->str = g_strdup_vprintf (format, args);
226 va_end (args);
228 string->len = strlen (string->str);
229 string->allocated_len = string->len+1;
232 GString *
233 g_string_truncate (GString *string, gsize len)
235 g_return_val_if_fail (string != NULL, string);
237 /* Silent return */
238 if (len >= string->len)
239 return string;
241 string->len = len;
242 string->str[len] = 0;
243 return string;
246 GString *
247 g_string_set_size (GString *string, gsize len)
249 g_return_val_if_fail (string != NULL, string);
251 GROW_IF_NECESSARY(string, len);
253 string->len = len;
254 string->str[len] = 0;
255 return string;
258 GString *
259 g_string_erase (GString *string, gssize pos, gssize len)
261 g_return_val_if_fail (string != NULL, string);
263 /* Silent return */
264 if (pos >= string->len)
265 return string;
267 if (len == -1 || (pos + len) >= string->len) {
268 string->str[pos] = 0;
270 else {
271 memmove (string->str + pos, string->str + pos + len, string->len - (pos + len) + 1);
272 string->len -= len;
275 return string;