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.
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); \
41 g_string_new_len (const gchar
*init
, gssize len
)
43 GString
*ret
= g_new (GString
, 1);
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
);
52 memcpy(ret
->str
, init
, ret
->len
);
53 ret
->str
[ret
->len
] = 0;
59 g_string_new (const gchar
*init
)
61 return g_string_new_len(init
, -1);
65 g_string_sized_new (gsize default_size
)
67 GString
*ret
= g_new (GString
, 1);
69 ret
->str
= g_malloc (default_size
);
72 ret
->allocated_len
= default_size
;
78 g_string_free (GString
*string
, gboolean free_segment
)
82 g_return_val_if_fail (string
!= NULL
, NULL
);
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
);
105 GROW_IF_NECESSARY(string
, len
);
106 memcpy(string
->str
+ string
->len
, val
, len
);
108 string
->str
[string
->len
] = 0;
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);
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;
137 g_string_append_unichar (GString
*string
, gunichar c
)
142 g_return_val_if_fail (string
!= NULL
, NULL
);
144 if ((len
= g_unichar_to_utf8 (c
, utf8
)) <= 0)
147 return g_string_append_len (string
, utf8
, len
);
151 g_string_append_printf (GString
*string
, const gchar
*format
, ...)
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
);
162 g_string_append (string
, ret
);
168 g_string_append_vprintf (GString
*string
, const gchar
*format
, va_list args
)
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
);
181 g_string_printf (GString
*string
, const gchar
*format
, ...)
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
);
194 string
->len
= strlen (string
->str
);
195 string
->allocated_len
= string
->len
+1;
199 g_string_truncate (GString
*string
, gsize len
)
201 g_return_val_if_fail (string
!= NULL
, string
);
204 if (len
>= string
->len
)
208 string
->str
[len
] = 0;
213 g_string_set_size (GString
*string
, gsize len
)
215 g_return_val_if_fail (string
!= NULL
, string
);
217 GROW_IF_NECESSARY(string
, len
);
220 string
->str
[len
] = 0;