Update all parsers and related files to ctags p6.1.20240421.0
[geany-mirror.git] / ctags / main / vstring.h
blob0ec883460f46a1cd606f1141ced51e2264100815
1 /*
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.
8 */
9 #ifndef CTAGS_MAIN_VSTRING_H
10 #define CTAGS_MAIN_VSTRING_H
13 * INCLUDE FILES
15 #include "general.h" /* must always come first */
17 #include <stdlib.h> /* to define size_t */
19 #include <stdio.h>
21 #include "debug.h"
22 #include "inline.h"
25 * MACROS
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) \
37 do { \
38 vString *vStringClear_s = (string); \
39 vStringClear_s->length = 0; \
40 vStringClear_s->buffer[0] = '\0'; \
41 } while (false)
44 * DATA DECLARATIONS
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 */
51 } vString;
54 * FUNCTION PROTOTYPES
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);
101 * INLINE FUNCTIONS
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;
117 if (c != '\0')
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,
126 unsigned int maxlen)
128 if (vStringLength (string) < maxlen || maxlen == 0)
130 vStringPut (string, c);
131 return true;
133 return false;
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) \
148 do { \
149 if (!vStringIsEmpty(s)) \
150 vStringPut ((s), (c)); \
151 } while (0)
153 #define vStringJoin(string, c, s) do { \
154 vStringPutUnlessEmpty ((string), (c)); \
155 vStringCat((string), (s)); \
156 } while (0)
158 #define vStringJoinS(string, c, s) do { \
159 vStringPutUnlessEmpty ((string), (c)); \
160 vStringCatS((string), (s)); \
161 } while (0)
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 */