2 * Copyright (c) 1998-2002, Darren Hiebert
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.
7 * Provides the external interface for resizeable strings.
9 #ifndef CTAGS_MAIN_VSTRING_H
10 #define CTAGS_MAIN_VSTRING_H
15 #include "general.h" /* must always come first */
17 #include <stdlib.h> /* to define size_t */
28 #define vStringValue(vs) ((vs)->buffer)
29 #define vStringChar(vs,i) ((vs)->buffer[i])
30 #define vStringLast(vs) ((vs)->buffer[(vs)->length - 1])
31 #define vStringLength(vs) ((vs)->length)
32 #define vStringIsEmpty(vs) ((vs)->length == 0)
33 #define vStringSize(vs) ((vs)->size)
34 #define vStringLower(vs) toLowerString((vs)->buffer)
35 #define vStringUpper(vs) toUpperString((vs)->buffer)
36 #define vStringClear(string) \
38 vString *vStringClear_s = (string); \
39 vStringClear_s->length = 0; \
40 vStringClear_s->buffer[0] = '\0'; \
47 typedef struct sVString
{
48 size_t length
; /* size of buffer used */
49 size_t size
; /* allocated size of buffer */
50 char *buffer
; /* location of buffer */
56 extern void vStringResize (vString
*const string
, const size_t newSize
);
57 extern vString
*vStringNew (void);
58 extern void vStringDelete (vString
*const string
);
59 extern bool vStringStripNewline (vString
*const string
);
60 extern void vStringStripLeading (vString
*const string
);
61 extern void vStringChop (vString
*const string
);
62 extern void vStringStripTrailing (vString
*const string
);
63 extern void vStringCat (vString
*const string
, const vString
*const s
);
64 extern void vStringCatS (vString
*const string
, const char *const s
);
65 extern void vStringNCat (vString
*const string
, const vString
*const s
, const size_t length
);
67 /* vStringNCatS calls strnlen(S,LENGTH) thought it takes LENGTH because
68 * the handle the case that the length of S is smaller than LENGTH.
70 * In the case a caller knows the length equals to or is greater than LENGTH,
71 * calling strlen is just overhead. vStringNCatSUnsafe doesn't call strlen. */
72 extern void vStringNCatS (vString
*const string
, const char *const s
, const size_t length
);
73 extern void vStringNCatSUnsafe (vString
*const string
, const char *const s
, const size_t length
);
75 extern vString
*vStringNewCopy (const vString
*const string
);
76 extern vString
*vStringNewInit (const char *const s
);
77 extern vString
*vStringNewNInit (const char *const s
, const size_t length
);
78 extern void vStringCopy (vString
*const string
, const vString
*const s
);
79 extern void vStringCopyS (vString
*const string
, const char *const s
);
80 extern void vStringNCopy (vString
*const string
, const vString
*const s
, const size_t length
);
81 extern void vStringNCopyS (vString
*const string
, const char *const s
, const size_t length
);
82 extern void vStringNCopySUnsafe (vString
*const string
, const char *const s
, const size_t length
);
83 extern void vStringCopyToLower (vString
*const dest
, const vString
*const src
);
84 extern void vStringSetLength (vString
*const string
);
85 extern void vStringTruncate (vString
*const string
, const size_t length
);
86 #define vStringTruncateTrailing vStringTruncate
87 extern void vStringTruncateLeading (vString
*const string
, const size_t length
);
88 extern void vStringTranslate(vString
*const string
, char fromC
, char toC
);
90 extern vString
*vStringNewOrClear (vString
*const string
);
91 extern vString
*vStringNewOrClearWithAutoRelease (vString
*const string
);
93 extern vString
*vStringNewOwn (char *s
);
94 extern char *vStringDeleteUnwrap (vString
*const string
);
95 extern char *vStringStrdup (const vString
*const string
);
97 extern void vStringCatSWithEscaping (vString
* b
, const char *s
);
98 extern void vStringCatSWithEscapingAsPattern (vString
*output
, const char* input
);
103 CTAGS_INLINE
void vStringPutNewlinAgainUnsafe (vString
*const string
)
105 string
->buffer
[string
->length
++] = '\n';
108 CTAGS_INLINE
void vStringPutImpl (vString
*const string
, const int c
)
110 /* verify the given character is an unsigned char value */
111 Assert (c
>= 0 && c
<= 0xff);
113 if (string
->length
+ 1 == string
->size
) /* check for buffer overflow */
114 vStringResize (string
, string
->size
* 2);
116 string
->buffer
[string
->length
] = (char) c
;
118 string
->buffer
[++string
->length
] = '\0';
121 #define vStringPut(s, c) (sizeof(c) == sizeof(char) \
122 ? vStringPutImpl((s), (unsigned char) (c)) \
123 : vStringPutImpl((s), (c)))
125 CTAGS_INLINE
bool vStringPutWithLimitImpl (vString
*const string
, const int c
,
128 if (vStringLength (string
) < maxlen
|| maxlen
== 0)
130 vStringPut (string
, c
);
136 #define vStringPutWithLimit(s, c, l) \
137 (sizeof(c) == sizeof(char) \
138 ? vStringPutWithLimitImpl((s), (unsigned char) (c), (l)) \
139 : vStringPutWithLimitImpl((s), (c), (l)))
141 CTAGS_INLINE
void vStringAccumulate (vString
*accumulator
, vString
*string
)
143 vStringCat (accumulator
, string
);
144 vStringClear (string
);
147 #define vStringPutUnlessEmpty(s, c) \
149 if (!vStringIsEmpty(s)) \
150 vStringPut ((s), (c)); \
153 #define vStringJoin(string, c, s) do { \
154 vStringPutUnlessEmpty ((string), (c)); \
155 vStringCat((string), (s)); \
158 #define vStringJoinS(string, c, s) do { \
159 vStringPutUnlessEmpty ((string), (c)); \
160 vStringCatS((string), (s)); \
163 /* If cstrlit is a C string listeral and LTO is enabled,
164 * this macro is efficient */
165 #define vStringEqC(vstr, cstrlit) ((vStringLength ((vstr)) == strlen ((cstrlit)) \
166 && strncmp (vStringValue ((vstr)), (cstrlit), strlen ((cstrlit))) == 0))
167 #endif /* CTAGS_MAIN_VSTRING_H */