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 * Provides the external interface for resizeable strings.
8 */
9 #ifndef CTAGS_MAIN_VSTRING_H
10 #define CTAGS_MAIN_VSTRING_H
11
12 /*
13 * INCLUDE FILES
14 */
15 #include "general.h" /* must always come first */
16
17 #include <stdlib.h> /* to define size_t */
18
19 #include <stdio.h>
20
21 #include "inline.h"
22
23 /*
24 * MACROS
25 */
26
27 #define vStringValue(vs) ((vs)->buffer)
28 #define vStringChar(vs,i) ((vs)->buffer[i])
29 #define vStringLast(vs) ((vs)->buffer[(vs)->length - 1])
30 #define vStringLength(vs) ((vs)->length)
31 #define vStringIsEmpty(vs) ((vs)->length == 0)
32 #define vStringSize(vs) ((vs)->size)
33 #define vStringLower(vs) toLowerString((vs)->buffer)
34 #define vStringUpper(vs) toUpperString((vs)->buffer)
35 #define vStringClear(string) \
36 do { \
37 vString *vStringClear_s = (string); \
38 vStringClear_s->length = 0; \
39 vStringClear_s->buffer[0] = '\0'; \
40 } while (false)
41
42 /*
43 * DATA DECLARATIONS
44 */
45
46 typedef struct sVString {
47 size_t length; /* size of buffer used */
48 size_t size; /* allocated size of buffer */
49 char *buffer; /* location of buffer */
50 } vString;
51
52 /*
53 * FUNCTION PROTOTYPES
54 */
55 extern void vStringResize (vString *const string, const size_t newSize);
56 extern vString *vStringNew (void);
57 extern void vStringDelete (vString *const string);
58 extern bool vStringStripNewline (vString *const string);
59 extern void vStringStripLeading (vString *const string);
60 extern void vStringChop (vString *const string);
61 extern void vStringStripTrailing (vString *const string);
62 extern void vStringCat (vString *const string, const vString *const s);
63 extern void vStringCatS (vString *const string, const char *const s);
64 extern void vStringNCat (vString *const string, const vString *const s, const size_t length);
65
66 /* vStringNCatS calls strlen(S) thought it takes LENGTH because
67 * the handle the case that strlen(S) is smaller than LENGTH.
68 *
69 * In the case a caller knows strlen(S) equals to or is greater than LENGTH,
70 * calling strlen is just overhead. vStringNCatSUnsafe doesn't call strlen. */
71 extern void vStringNCatS (vString *const string, const char *const s, const size_t length);
72 extern void vStringNCatSUnsafe (vString *const string, const char *const s, const size_t length);
73
74 extern vString *vStringNewCopy (const vString *const string);
75 extern vString *vStringNewInit (const char *const s);
76 extern vString *vStringNewNInit (const char *const s, const size_t length);
77 extern void vStringCopy (vString *const string, const vString *const s);
78 extern void vStringCopyS (vString *const string, const char *const s);
79 extern void vStringNCopy (vString *const string, const vString *const s, const size_t length);
80 extern void vStringNCopyS (vString *const string, const char *const s, const size_t length);
81 extern void vStringCopyToLower (vString *const dest, const vString *const src);
82 extern void vStringSetLength (vString *const string);
83 extern void vStringTruncate (vString *const string, const size_t length);
84 extern void vStringTranslate(vString *const string, char fromC, char toC);
85
86 extern vString *vStringNewOrClear (vString *const string);
87 extern vString *vStringNewOrClearWithAutoRelease (vString *const string);
88
89 extern vString *vStringNewOwn (char *s);
90 extern char *vStringDeleteUnwrap (vString *const string);
91 extern char *vStringStrdup (const vString *const string);
92
93 extern void vStringCatSWithEscaping (vString* b, const char *s);
94 extern void vStringCatSWithEscapingAsPattern (vString *output, const char* input);
95
96 /*
97 * INLINE FUNCTIONS
98 */
vStringPutNewlinAgainUnsafe(vString * const string)99 CTAGS_INLINE void vStringPutNewlinAgainUnsafe (vString *const string)
100 {
101 string->buffer [string->length++] = '\n';
102 }
103
vStringPut(vString * const string,const int c)104 CTAGS_INLINE void vStringPut (vString *const string, const int c)
105 {
106 if (string->length + 1 == string->size) /* check for buffer overflow */
107 vStringResize (string, string->size * 2);
108
109 string->buffer [string->length] = c;
110 if (c != '\0')
111 string->buffer [++string->length] = '\0';
112 }
113
vStringPutWithLimit(vString * const string,const int c,unsigned int maxlen)114 CTAGS_INLINE void vStringPutWithLimit (vString *const string, const int c,
115 unsigned int maxlen)
116 {
117 if (vStringLength (string) < maxlen || maxlen == 0)
118 vStringPut (string, c);
119 }
120
121 #endif /* CTAGS_MAIN_VSTRING_H */
122