[netcore] Add libc name transition
[mono-project.git] / mono / eglib / gstring.c
blob403b3ec416736e7bd3afa02bde8fff57fcfd4870
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 "config.h"
30 #include <stdio.h>
31 #include <glib.h>
33 #define GROW_IF_NECESSARY(s,l) { \
34 if(s->len + l >= s->allocated_len) { \
35 s->allocated_len = (s->allocated_len + l + 16) * 2; \
36 s->str = g_realloc(s->str, s->allocated_len); \
37 } \
40 GString *
41 g_string_new_len (const gchar *init, gssize len)
43 GString *ret = g_new (GString, 1);
45 if (init == NULL)
46 ret->len = 0;
47 else
48 ret->len = len < 0 ? strlen(init) : len;
49 ret->allocated_len = MAX(ret->len + 1, 16);
50 ret->str = g_malloc(ret->allocated_len);
51 if (init)
52 memcpy(ret->str, init, ret->len);
53 ret->str[ret->len] = 0;
55 return ret;
58 GString *
59 g_string_new (const gchar *init)
61 return g_string_new_len(init, -1);
64 GString *
65 g_string_sized_new (gsize default_size)
67 GString *ret = g_new (GString, 1);
69 ret->str = g_malloc (default_size);
70 ret->str [0] = 0;
71 ret->len = 0;
72 ret->allocated_len = default_size;
74 return ret;
77 gchar *
78 g_string_free (GString *string, gboolean free_segment)
80 gchar *data;
82 g_return_val_if_fail (string != NULL, NULL);
84 data = string->str;
85 g_free(string);
87 if(!free_segment) {
88 return data;
91 g_free(data);
92 return NULL;
95 GString *
96 g_string_append_len (GString *string, const gchar *val, gssize len)
98 g_return_val_if_fail(string != NULL, NULL);
99 g_return_val_if_fail(val != NULL, string);
101 if(len < 0) {
102 len = strlen(val);
105 GROW_IF_NECESSARY(string, len);
106 memcpy(string->str + string->len, val, len);
107 string->len += len;
108 string->str[string->len] = 0;
110 return string;
113 GString *
114 g_string_append (GString *string, const gchar *val)
116 g_return_val_if_fail(string != NULL, NULL);
117 g_return_val_if_fail(val != NULL, string);
119 return g_string_append_len(string, val, -1);
122 GString *
123 g_string_append_c (GString *string, gchar c)
125 g_return_val_if_fail(string != NULL, NULL);
127 GROW_IF_NECESSARY(string, 1);
129 string->str[string->len] = c;
130 string->str[string->len + 1] = 0;
131 string->len++;
133 return string;
136 GString *
137 g_string_append_unichar (GString *string, gunichar c)
139 gchar utf8[6];
140 gint len;
142 g_return_val_if_fail (string != NULL, NULL);
144 if ((len = g_unichar_to_utf8 (c, utf8)) <= 0)
145 return string;
147 return g_string_append_len (string, utf8, len);
150 void
151 g_string_append_printf (GString *string, const gchar *format, ...)
153 char *ret;
154 va_list args;
156 g_return_if_fail (string != NULL);
157 g_return_if_fail (format != NULL);
159 va_start (args, format);
160 ret = g_strdup_vprintf (format, args);
161 va_end (args);
162 g_string_append (string, ret);
164 g_free (ret);
167 void
168 g_string_append_vprintf (GString *string, const gchar *format, va_list args)
170 char *ret;
172 g_return_if_fail (string != NULL);
173 g_return_if_fail (format != NULL);
175 ret = g_strdup_vprintf (format, args);
176 g_string_append (string, ret);
177 g_free (ret);
180 void
181 g_string_printf (GString *string, const gchar *format, ...)
183 va_list args;
185 g_return_if_fail (string != NULL);
186 g_return_if_fail (format != NULL);
188 g_free (string->str);
190 va_start (args, format);
191 string->str = g_strdup_vprintf (format, args);
192 va_end (args);
194 string->len = strlen (string->str);
195 string->allocated_len = string->len+1;
198 GString *
199 g_string_truncate (GString *string, gsize len)
201 g_return_val_if_fail (string != NULL, string);
203 /* Silent return */
204 if (len >= string->len)
205 return string;
207 string->len = len;
208 string->str[len] = 0;
209 return string;
212 GString *
213 g_string_set_size (GString *string, gsize len)
215 g_return_val_if_fail (string != NULL, string);
217 GROW_IF_NECESSARY(string, len);
219 string->len = len;
220 string->str[len] = 0;
221 return string;