1d4c6f1e6SMasatake YAMATO /*
2d4c6f1e6SMasatake YAMATO * Copyright (c) 1998-2002, Darren Hiebert
3d4c6f1e6SMasatake YAMATO *
4d4c6f1e6SMasatake YAMATO * This source code is released for free distribution under the terms of the
50ce38835Sviccuad * GNU General Public License version 2 or (at your option) any later version.
6d4c6f1e6SMasatake YAMATO *
7d4c6f1e6SMasatake YAMATO * Provides the external interface for resizeable strings.
8d4c6f1e6SMasatake YAMATO */
95474c2e5SMasatake YAMATO #ifndef CTAGS_MAIN_VSTRING_H
105474c2e5SMasatake YAMATO #define CTAGS_MAIN_VSTRING_H
11d4c6f1e6SMasatake YAMATO
12d4c6f1e6SMasatake YAMATO /*
13d4c6f1e6SMasatake YAMATO * INCLUDE FILES
14d4c6f1e6SMasatake YAMATO */
15d4c6f1e6SMasatake YAMATO #include "general.h" /* must always come first */
16d4c6f1e6SMasatake YAMATO
17d4c6f1e6SMasatake YAMATO #include <stdlib.h> /* to define size_t */
18d4c6f1e6SMasatake YAMATO
1921ec78adSMasatake YAMATO #include <stdio.h>
2021ec78adSMasatake YAMATO
21741d9cb6SMasatake YAMATO #include "inline.h"
22509a47dbSJiří Techet
23d4c6f1e6SMasatake YAMATO /*
24d4c6f1e6SMasatake YAMATO * MACROS
25d4c6f1e6SMasatake YAMATO */
26d4c6f1e6SMasatake YAMATO
27d4c6f1e6SMasatake YAMATO #define vStringValue(vs) ((vs)->buffer)
287171591bSMasatake YAMATO #define vStringChar(vs,i) ((vs)->buffer[i])
29d4c6f1e6SMasatake YAMATO #define vStringLast(vs) ((vs)->buffer[(vs)->length - 1])
30d4c6f1e6SMasatake YAMATO #define vStringLength(vs) ((vs)->length)
3188556b4aSMasatake YAMATO #define vStringIsEmpty(vs) ((vs)->length == 0)
32d4c6f1e6SMasatake YAMATO #define vStringSize(vs) ((vs)->size)
33d4c6f1e6SMasatake YAMATO #define vStringLower(vs) toLowerString((vs)->buffer)
34d4c6f1e6SMasatake YAMATO #define vStringUpper(vs) toUpperString((vs)->buffer)
352ee69f9eSJiří Techet #define vStringClear(string) \
362ee69f9eSJiří Techet do { \
372ee69f9eSJiří Techet vString *vStringClear_s = (string); \
382ee69f9eSJiří Techet vStringClear_s->length = 0; \
392ee69f9eSJiří Techet vStringClear_s->buffer[0] = '\0'; \
402ee69f9eSJiří Techet } while (false)
41d4c6f1e6SMasatake YAMATO
42d4c6f1e6SMasatake YAMATO /*
43d4c6f1e6SMasatake YAMATO * DATA DECLARATIONS
44d4c6f1e6SMasatake YAMATO */
45d4c6f1e6SMasatake YAMATO
46d4c6f1e6SMasatake YAMATO typedef struct sVString {
47d4c6f1e6SMasatake YAMATO size_t length; /* size of buffer used */
48d4c6f1e6SMasatake YAMATO size_t size; /* allocated size of buffer */
49d4c6f1e6SMasatake YAMATO char *buffer; /* location of buffer */
50d4c6f1e6SMasatake YAMATO } vString;
51d4c6f1e6SMasatake YAMATO
52d4c6f1e6SMasatake YAMATO /*
53d4c6f1e6SMasatake YAMATO * FUNCTION PROTOTYPES
54d4c6f1e6SMasatake YAMATO */
558a3d0750SJiří Techet extern void vStringResize (vString *const string, const size_t newSize);
56d4c6f1e6SMasatake YAMATO extern vString *vStringNew (void);
57d4c6f1e6SMasatake YAMATO extern void vStringDelete (vString *const string);
58*5b7dabdaSMasatake YAMATO extern bool vStringStripNewline (vString *const string);
59d4c6f1e6SMasatake YAMATO extern void vStringStripLeading (vString *const string);
60d4c6f1e6SMasatake YAMATO extern void vStringChop (vString *const string);
61d4c6f1e6SMasatake YAMATO extern void vStringStripTrailing (vString *const string);
626ee565f3SJiří Techet extern void vStringCat (vString *const string, const vString *const s);
63d4c6f1e6SMasatake YAMATO extern void vStringCatS (vString *const string, const char *const s);
646ee565f3SJiří Techet extern void vStringNCat (vString *const string, const vString *const s, const size_t length);
650b374a37SMasatake YAMATO
660b374a37SMasatake YAMATO /* vStringNCatS calls strlen(S) thought it takes LENGTH because
670b374a37SMasatake YAMATO * the handle the case that strlen(S) is smaller than LENGTH.
680b374a37SMasatake YAMATO *
690b374a37SMasatake YAMATO * In the case a caller knows strlen(S) equals to or is greater than LENGTH,
700b374a37SMasatake YAMATO * calling strlen is just overhead. vStringNCatSUnsafe doesn't call strlen. */
71d4c6f1e6SMasatake YAMATO extern void vStringNCatS (vString *const string, const char *const s, const size_t length);
720b374a37SMasatake YAMATO extern void vStringNCatSUnsafe (vString *const string, const char *const s, const size_t length);
730b374a37SMasatake YAMATO
74d4c6f1e6SMasatake YAMATO extern vString *vStringNewCopy (const vString *const string);
75d4c6f1e6SMasatake YAMATO extern vString *vStringNewInit (const char *const s);
7653e1215bSMasatake YAMATO extern vString *vStringNewNInit (const char *const s, const size_t length);
776ee565f3SJiří Techet extern void vStringCopy (vString *const string, const vString *const s);
78d4c6f1e6SMasatake YAMATO extern void vStringCopyS (vString *const string, const char *const s);
796ee565f3SJiří Techet extern void vStringNCopy (vString *const string, const vString *const s, const size_t length);
80d4c6f1e6SMasatake YAMATO extern void vStringNCopyS (vString *const string, const char *const s, const size_t length);
81d4c6f1e6SMasatake YAMATO extern void vStringCopyToLower (vString *const dest, const vString *const src);
82d4c6f1e6SMasatake YAMATO extern void vStringSetLength (vString *const string);
834e3d9edfSColomban Wendling extern void vStringTruncate (vString *const string, const size_t length);
84c5a701a9SMasatake YAMATO extern void vStringTranslate(vString *const string, char fromC, char toC);
85d4c6f1e6SMasatake YAMATO
86bffaa988SMasatake YAMATO extern vString *vStringNewOrClear (vString *const string);
8756065e52SMasatake YAMATO extern vString *vStringNewOrClearWithAutoRelease (vString *const string);
88bffaa988SMasatake YAMATO
89d4c6f1e6SMasatake YAMATO extern vString *vStringNewOwn (char *s);
90d4c6f1e6SMasatake YAMATO extern char *vStringDeleteUnwrap (vString *const string);
91f270909bSMasatake YAMATO extern char *vStringStrdup (const vString *const string);
92d4c6f1e6SMasatake YAMATO
93e8175bbbSMasatake YAMATO extern void vStringCatSWithEscaping (vString* b, const char *s);
949042b8b4SMasatake YAMATO extern void vStringCatSWithEscapingAsPattern (vString *output, const char* input);
95e8175bbbSMasatake YAMATO
96f36edef4SThomas Braun /*
97f36edef4SThomas Braun * INLINE FUNCTIONS
98f36edef4SThomas Braun */
vStringPutNewlinAgainUnsafe(vString * const string)99*5b7dabdaSMasatake YAMATO CTAGS_INLINE void vStringPutNewlinAgainUnsafe (vString *const string)
100*5b7dabdaSMasatake YAMATO {
101*5b7dabdaSMasatake YAMATO string->buffer [string->length++] = '\n';
102*5b7dabdaSMasatake YAMATO }
103f36edef4SThomas Braun
vStringPut(vString * const string,const int c)104741d9cb6SMasatake YAMATO CTAGS_INLINE void vStringPut (vString *const string, const int c)
105f36edef4SThomas Braun {
106f36edef4SThomas Braun if (string->length + 1 == string->size) /* check for buffer overflow */
107f36edef4SThomas Braun vStringResize (string, string->size * 2);
108f36edef4SThomas Braun
109f36edef4SThomas Braun string->buffer [string->length] = c;
110f36edef4SThomas Braun if (c != '\0')
111f36edef4SThomas Braun string->buffer [++string->length] = '\0';
112f36edef4SThomas Braun }
113f36edef4SThomas Braun
vStringPutWithLimit(vString * const string,const int c,unsigned int maxlen)11473482c5eSMasatake YAMATO CTAGS_INLINE void vStringPutWithLimit (vString *const string, const int c,
11573482c5eSMasatake YAMATO unsigned int maxlen)
11673482c5eSMasatake YAMATO {
11773482c5eSMasatake YAMATO if (vStringLength (string) < maxlen || maxlen == 0)
11873482c5eSMasatake YAMATO vStringPut (string, c);
11973482c5eSMasatake YAMATO }
12073482c5eSMasatake YAMATO
1215474c2e5SMasatake YAMATO #endif /* CTAGS_MAIN_VSTRING_H */
122