1 #ifndef STRING_BUILDER_H
2 #define STRING_BUILDER_H
3 
4 typedef struct _string_builder_t {
5 	int used_length;
6 	int alloc_length;
7 	char* buffer;
8 } string_builder_t;
9 
10 string_builder_t* sb_alloc(int alloc_length);
11 void  sb_free(string_builder_t* psb);
12 void  sb_init(string_builder_t* psb, int alloc_length);
13 void _sb_enlarge(string_builder_t* psb); // private method
14 
sb_append_char(string_builder_t * psb,char c)15 static inline void sb_append_char(string_builder_t* psb, char c) {
16 	if (psb->used_length >= psb->alloc_length)
17 		_sb_enlarge(psb);
18 	psb->buffer[psb->used_length++] = c;
19 }
sb_append_chars(string_builder_t * psb,char * s,int so,int eo)20 static inline void sb_append_chars(string_builder_t* psb, char* s, int so, int eo) {
21 	char* p = s+so;
22 	char* e = s+eo;
23 	while (p <= e)
24 		sb_append_char(psb, *(p++));
25 }
sb_append_char_range(string_builder_t * psb,char * b,char * e)26 static inline void sb_append_char_range(string_builder_t* psb, char* b, char* e) {
27 	char* p = b;
28 	while (p <= e)
29 		sb_append_char(psb, *(p++));
30 }
31 
32 void  sb_append_string(string_builder_t* psb, char* s);
33 int   sb_is_empty(string_builder_t* psb);
34 // The caller should free() the return value:
35 char* sb_finish(string_builder_t* psb);
36 char* sb_finish_with_length(string_builder_t* psb, int* pline_length);
37 
38 #endif // STRING_BUILDER_H
39