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 #if defined(HAVE_STDLIB_H)
18 # include <stdlib.h>  /* to define size_t */
19 #endif
20 
21 #include <stdio.h>
22 
23 #include "inline.h"
24 #include "mio.h"
25 
26 /*
27 *   MACROS
28 */
29 
30 #define vStringValue(vs)      ((vs)->buffer)
31 #define vStringItem(vs,i)     ((vs)->buffer[i])
32 #define vStringLast(vs)       ((vs)->buffer[(vs)->length - 1])
33 #define vStringLength(vs)     ((vs)->length)
34 #define vStringIsEmpty(vs)    ((vs)->length == 0)
35 #define vStringSize(vs)       ((vs)->size)
36 #define vStringChar(vs,i)     ((vs)->buffer[i])
37 #define vStringLower(vs)      toLowerString((vs)->buffer)
38 #define vStringUpper(vs)      toUpperString((vs)->buffer)
39 #define vStringClear(string) \
40 	do { \
41 		vString *vStringClear_s = (string); \
42 		vStringClear_s->length = 0; \
43 		vStringClear_s->buffer[0] = '\0'; \
44 	} while (false)
45 
46 /*
47 *   DATA DECLARATIONS
48 */
49 
50 typedef struct sVString {
51 	size_t  length;  /* size of buffer used */
52 	size_t  size;    /* allocated size of buffer */
53 	char   *buffer;  /* location of buffer */
54 } vString;
55 
56 /*
57 *   FUNCTION PROTOTYPES
58 */
59 extern void vStringResize (vString *const string, const size_t newSize);
60 extern vString *vStringNew (void);
61 extern void vStringDelete (vString *const string);
62 extern void vStringStripNewline (vString *const string);
63 extern void vStringStripLeading (vString *const string);
64 extern void vStringChop (vString *const string);
65 extern void vStringStripTrailing (vString *const string);
66 extern void vStringCat (vString *const string, const vString *const s);
67 extern void vStringCatS (vString *const string, const char *const s);
68 extern void vStringNCat (vString *const string, const vString *const s, const size_t length);
69 extern void vStringNCatS (vString *const string, const char *const s, const size_t length);
70 extern vString *vStringNewCopy (const vString *const string);
71 extern vString *vStringNewInit (const char *const s);
72 extern vString *vStringNewNInit (const char *const s, const size_t length);
73 extern void vStringCopy (vString *const string, const vString *const s);
74 extern void vStringCopyS (vString *const string, const char *const s);
75 extern void vStringNCopy (vString *const string, const vString *const s, const size_t length);
76 extern void vStringNCopyS (vString *const string, const char *const s, const size_t length);
77 extern void vStringCopyToLower (vString *const dest, const vString *const src);
78 extern void vStringSetLength (vString *const string);
79 extern void vStringTruncate (vString *const string, const size_t length);
80 extern void vStringTranslate(vString *const string, char fromC, char toC);
81 
82 extern vString *vStringNewOrClear (vString *const string);
83 extern vString *vStringNewOrClearWithAutoRelease (vString *const string);
84 
85 extern vString *vStringNewOwn (char *s);
86 extern char    *vStringDeleteUnwrap (vString *const string);
87 
88 extern void vStringCatSWithEscaping (vString* b, const char *s);
89 extern void vStringCatSWithEscapingAsPattern (vString *output, const char* input);
90 
91 /*
92 *   INLINE FUNCTIONS
93 */
94 
vStringPut(vString * const string,const int c)95 CTAGS_INLINE void vStringPut (vString *const string, const int c)
96 {
97 	if (string->length + 1 == string->size)  /*  check for buffer overflow */
98 		vStringResize (string, string->size * 2);
99 
100 	string->buffer [string->length] = c;
101 	if (c != '\0')
102 		string->buffer [++string->length] = '\0';
103 }
104 
105 #endif  /* CTAGS_MAIN_VSTRING_H */
106