geany  1.38
About: Geany is a text editor (using GTK2) with basic features of an integrated development environment (syntax highlighting, code folding, symbol name auto-completion, ...). F: office T: editor programming GTK+ IDE
  Fossies Dox: geany-1.38.tar.bz2  ("unofficial" and yet experimental doxygen-generated source code documentation)  

vstring.c
Go to the documentation of this file.
1/*
2* Copyright (c) 1998-2002, Darren Hiebert
3*
4* This source code is released for free distribution under the terms of the
5* GNU General Public License version 2 or (at your option) any later version.
6*
7* This module contains functions supporting resizeable strings.
8*/
9
10/*
11* INCLUDE FILES
12*/
13#include "general.h" /* must always come first */
14
15#include <limits.h> /* to define INT_MAX */
16#include <string.h>
17#include <ctype.h>
18
19#include "debug.h"
20#include "routines.h"
21#include "vstring.h"
22#include "trashbox.h"
23
24/*
25* DATA DEFINITIONS
26*/
27static const size_t vStringInitialSize = 32;
28
29/*
30* FUNCTION DEFINITIONS
31*/
32
33/*
34* External interface
35*/
36
37extern void vStringResize (vString *const string, const size_t newSize)
38{
39 size_t size = vStringInitialSize;
40
41 while (size < newSize)
42 size *= 2;
43
44 if (size > string->size)
45 {
46 string->size = size;
47 string->buffer = xRealloc (string->buffer, size, char);
48 }
49}
50
51extern void vStringTruncate (vString *const string, const size_t length)
52{
53 Assert (length <= string->length);
54 string->length = length;
55 string->buffer[string->length] = '\0';
56 DebugStatement ( memset (string->buffer + string->length, 0,
57 string->size - string->length); )
58}
59
60extern void vStringDelete (vString *const string)
61{
62 if (string != NULL)
63 {
64 if (string->buffer != NULL)
65 eFree (string->buffer);
66 eFree (string);
67 }
68}
69
70extern vString *vStringNew (void)
71{
72 vString *const string = xMalloc (1, vString);
73
74 string->length = 0;
75 string->size = vStringInitialSize;
76 string->buffer = xMalloc (string->size, char);
77
78 vStringClear (string);
79
80 return string;
81}
82
83extern vString *vStringNewCopy (const vString *const string)
84{
85 vString *vs = vStringNew ();
86 vStringCatS (vs, string->buffer);
87 return vs;
88}
89
90extern vString *vStringNewInit (const char *const s)
91{
92 vString *vs = vStringNew ();
93 vStringCatS (vs, s);
94 return vs;
95}
96
97extern vString *vStringNewNInit (const char *const s, const size_t length)
98{
99 vString *vs = vStringNew ();
100 vStringNCatS (vs, s, length);
101 return vs;
102}
103
104static void stringCat (
105 vString *const string, const char *const s, const size_t length)
106{
107 if (string->length + length + 1 > string->size)
108 vStringResize (string, string->length + length + 1);
109
110 memcpy (string->buffer + string->length, s, length);
111 string->length += length;
112 vStringPut (string, '\0');
113}
114
115extern void vStringNCat (
116 vString *const string, const vString *const s, const size_t length)
117{
118 size_t len = vStringLength (s);
119
120 len = len < length ? len: length;
121 stringCat (string, s->buffer, len);
122}
123
124extern void vStringNCatS (
125 vString *const string, const char *const s, const size_t length)
126{
127 size_t len = strlen (s);
128
129 len = len < length ? len : length;
130 stringCat (string, s, len);
131}
132
134 vString *const string, const char *const s, const size_t length)
135{
136 stringCat (string, s, length);
137}
138
139extern void vStringCat (vString *const string, const vString *const s)
140{
141 size_t len = vStringLength (s);
142
143 stringCat (string, s->buffer, len);
144}
145
146extern void vStringCatS (vString *const string, const char *const s)
147{
148 size_t len = strlen (s);
149
150 stringCat (string, s, len);
151}
152
153/* Strip trailing newline from string.
154 */
155extern void vStringStripNewline (vString *const string)
156{
157 const size_t final = string->length - 1;
158
159 if (string->length == 0)
160 return;
161
162 if (string->buffer [final] == '\n')
163 {
164 string->buffer [final] = '\0';
165 string->length--;
166 }
167}
168
169/* Strip leading white space from string.
170 */
171extern void vStringStripLeading (vString *const string)
172{
173 size_t n = 0;
174
175 while (n < string->length && isspace ((int) string->buffer [n]))
176 n++;
177 if (n > 0)
178 {
179 memmove (string->buffer, string->buffer + n, string->length - n);
180 vStringTruncate (string, string->length - n);
181 }
182}
183
184/* Strip trailing white space from string.
185 */
186extern void vStringStripTrailing (vString *const string)
187{
188 while (string->length > 0 &&
189 isspace ((int) string->buffer [string->length - 1]))
190 {
191 string->length--;
192 string->buffer [string->length] = '\0';
193 }
194}
195
196/* Chop last character from string.
197 */
198extern void vStringChop (vString *const string)
199{
200 if (string->length > 0)
201 {
202 --string->length;
203 string->buffer [string->length] = '\0';
204 }
205}
206
207extern void vStringCopy (vString *const string, const vString *const s)
208{
209 vStringClear (string);
210 vStringCat (string, s);
211}
212
213extern void vStringCopyS (vString *const string, const char *const s)
214{
215 vStringClear (string);
216 vStringCatS (string, s);
217}
218
219extern void vStringNCopy (
220 vString *const string, const vString *const s, const size_t length)
221{
222 vStringClear (string);
223 vStringNCat (string, s, length);
224}
225
226extern void vStringNCopyS (
227 vString *const string, const char *const s, const size_t length)
228{
229 vStringClear (string);
230 vStringNCatS (string, s, length);
231}
232
233extern void vStringCopyToLower (vString *const dest, const vString *const src)
234{
235 const size_t length = src->length;
236 const char *s = src->buffer;
237 char *d;
238 size_t i;
239
240 if (dest->size < src->size)
241 vStringResize (dest, src->size);
242 d = dest->buffer;
243 for (i = 0 ; i < length ; ++i)
244 {
245 int c = s [i];
246
247 d [i] = tolower (c);
248 }
249 d [i] = '\0';
250}
251
252extern void vStringSetLength (vString *const string)
253{
254 string->length = strlen (string->buffer);
255}
256
257extern vString *vStringNewOwn (char *s)
258{
259 vString *r;
260
261 r = vStringNewInit (s);
262 eFree (s);
263
264 return r;
265}
266
267extern char *vStringDeleteUnwrap (vString *const string)
268{
269 char *buffer = NULL;
270
271
272 if (string != NULL)
273 {
274 buffer = string->buffer;
275 string->buffer = NULL;
276
277 string->size = 0;
278 string->length = 0;
279
280 eFree (string);
281 }
282
283 return buffer;
284}
285
286extern char *vStringStrdup (const vString *const string)
287{
288 char *str = xMalloc (vStringLength(string) + 1, char);
289 str[vStringLength(string)] = '\0';
290 memcpy (str, string->buffer, vStringLength(string));
291 return str;
292}
293
294static char valueToXDigit (int v)
295{
296 Assert (v >= 0 && v <= 0xF);
297
298 if (v >= 0xA)
299 return 'A' + (v - 0xA);
300 else
301 return '0' + v;
302}
303
304extern void vStringCatSWithEscaping (vString* b, const char *s)
305{
306 for(; *s; s++)
307 {
308 int c = *s;
309
310 /* escape control characters (incl. \t) */
311 if ((c > 0x00 && c <= 0x1F) || c == 0x7F || c == '\\')
312 {
313 vStringPut (b, '\\');
314
315 switch (c)
316 {
317 /* use a short form for known escapes */
318 case '\a':
319 c = 'a'; break;
320 case '\b':
321 c = 'b'; break;
322 case '\t':
323 c = 't'; break;
324 case '\n':
325 c = 'n'; break;
326 case '\v':
327 c = 'v'; break;
328 case '\f':
329 c = 'f'; break;
330 case '\r':
331 c = 'r'; break;
332 case '\\':
333 c = '\\'; break;
334 default:
335 vStringPut (b, 'x');
336 vStringPut (b, valueToXDigit ((c & 0xF0) >> 4));
337 vStringPut (b, valueToXDigit (c & 0x0F));
338 continue;
339 }
340 }
341 vStringPut (b, c);
342 }
343}
344
345extern void vStringCatSWithEscapingAsPattern (vString *output, const char* input)
346{
347 while (*input)
348 {
349 switch (*input)
350 {
351 case '\\':
352 vStringPut(output, '\\');
353 vStringPut(output, '\\');
354 break;
355 case '/':
356 vStringPut(output, '\\');
357 vStringPut(output, '/');
358 break;
359 default:
360 vStringPut(output, *input);
361 break;
362
363 }
364 input++;
365 }
366}
367
368extern vString *vStringNewOrClear (vString *const string)
369{
370 if (string)
371 {
372 vStringClear (string);
373 return string;
374 }
375 else
376 return vStringNew ();
377}
378
380{
381 vString *r;
382
383 bool autoRelease = false;
384 if (!string)
385 autoRelease = true;
386
387 r = vStringNewOrClear(string);
388 if (autoRelease)
390
391 return r;
392}
393
394extern void vStringTranslate(vString *const string, char fromC, char toC)
395{
396 for (unsigned int i = 0; i < vStringLength(string); i++)
397 {
398 if (string->buffer[i] == fromC)
399 string->buffer[i] = toC;
400 }
401}
#define Assert(c)
Definition: debug.h:47
#define DebugStatement(x)
Definition: debug.h:45
#define NULL
Definition: rbtree.h:150
void eFree(void *const ptr)
Definition: routines.c:252
#define xMalloc(n, Type)
Definition: routines.h:23
#define xRealloc(p, n, Type)
Definition: routines.h:25
size_t length
Definition: vstring.h:48
size_t size
Definition: vstring.h:49
char * buffer
Definition: vstring.h:50
#define DEFAULT_TRASH_BOX(PTR, PROC)
Definition: trashbox.h:34
void vStringNCatS(vString *const string, const char *const s, const size_t length)
Definition: vstring.c:124
void vStringNCopy(vString *const string, const vString *const s, const size_t length)
Definition: vstring.c:219
void vStringStripTrailing(vString *const string)
Definition: vstring.c:186
void vStringTranslate(vString *const string, char fromC, char toC)
Definition: vstring.c:394
void vStringCopyS(vString *const string, const char *const s)
Definition: vstring.c:213
char * vStringStrdup(const vString *const string)
Definition: vstring.c:286
static const size_t vStringInitialSize
Definition: vstring.c:27
vString * vStringNewOrClear(vString *const string)
Definition: vstring.c:368
void vStringNCatSUnsafe(vString *const string, const char *const s, const size_t length)
Definition: vstring.c:133
vString * vStringNew(void)
Definition: vstring.c:70
void vStringStripNewline(vString *const string)
Definition: vstring.c:155
vString * vStringNewCopy(const vString *const string)
Definition: vstring.c:83
void vStringDelete(vString *const string)
Definition: vstring.c:60
void vStringStripLeading(vString *const string)
Definition: vstring.c:171
vString * vStringNewOrClearWithAutoRelease(vString *const string)
Definition: vstring.c:379
vString * vStringNewOwn(char *s)
Definition: vstring.c:257
void vStringCatSWithEscaping(vString *b, const char *s)
Definition: vstring.c:304
void vStringNCopyS(vString *const string, const char *const s, const size_t length)
Definition: vstring.c:226
void vStringSetLength(vString *const string)
Definition: vstring.c:252
void vStringNCat(vString *const string, const vString *const s, const size_t length)
Definition: vstring.c:115
void vStringCatS(vString *const string, const char *const s)
Definition: vstring.c:146
void vStringChop(vString *const string)
Definition: vstring.c:198
static char valueToXDigit(int v)
Definition: vstring.c:294
static void stringCat(vString *const string, const char *const s, const size_t length)
Definition: vstring.c:104
vString * vStringNewInit(const char *const s)
Definition: vstring.c:90
void vStringResize(vString *const string, const size_t newSize)
Definition: vstring.c:37
char * vStringDeleteUnwrap(vString *const string)
Definition: vstring.c:267
void vStringCopyToLower(vString *const dest, const vString *const src)
Definition: vstring.c:233
void vStringTruncate(vString *const string, const size_t length)
Definition: vstring.c:51
void vStringCat(vString *const string, const vString *const s)
Definition: vstring.c:139
vString * vStringNewNInit(const char *const s, const size_t length)
Definition: vstring.c:97
void vStringCatSWithEscapingAsPattern(vString *output, const char *input)
Definition: vstring.c:345
void vStringCopy(vString *const string, const vString *const s)
Definition: vstring.c:207
#define vStringClear(string)
Definition: vstring.h:36
#define vStringLength(vs)
Definition: vstring.h:31
static void vStringPut(vString *const string, const int c)
Definition: vstring.h:101