xref: /Universal-ctags/main/vstring.h (revision d325d3e6cf56987737f10b7c02f7aa9821681a22)
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