1 #ifndef INCLUDED_STRING_H_
2 #define INCLUDED_STRING_H_
3
4 /*
5 String stores ascii-Z strings. Char * args may be NULL.
6
7 string_format() assumes C99 is active (see the snprintf() manpage)
8 */
9
10 #include "../root/root.h"
11
12 #include <stdarg.h>
13 #include <string.h>
14
15 typedef struct
16 {
17 size_t d_size; /* buffer size of d_str */
18 size_t d_length; /* length not counting ascii-Z */
19 char *d_str;
20 }
21 String;
22
23 static inline void string_construct(String *s, char const *str);
24 String *string_new(char const *str);
25 static inline void string_destruct(register String *sp);
26 void string_delete(register String **sp);
27
28
29 void string_add(String *dest, String *src);
30 void string_addchar(String *sp, int c); /* actually: c is a char */
31 void string_addcharOnce(String *sp, int c); /* not if already there */
32 void string_additerators(String *string, char const *begin,
33 char const *end);
34 void string_addstr(String *sp, char const *str);
35 void string_assign(String *sp, char const *str);
36 void string_copy(String *dest, String *src);
37 size_t string_count(String *sp, char needle);
38 void string_fill(String *s, size_t length, int fill);
39 /* FAILED if no such character */
40 size_t string_find_first_of(String *sp, char const *accept);
41 size_t string_find_first_not_of(String *sp, int (*fun)(int));
42 char *string_firstword(char **str); /* returns new string */
43 /* or NULL if none */
44 /* *str points beyond */
45 /* assigns new contents */
46 void string_format(String *sp, char const *fmt, ...)
47 ATTRIBUTE_FORMAT_PRINTF(2, 3);
48 char string_popfront(String *sp);
49 char *string_release(String *sp); /* returns interal str */
50 /* reassigning text OK */
51
52 char *string_grab(String **sp); /* returns interal str */
53 /* *sp = 0 . */
54
55 void string_replace(String *sp, char const *srch, char const *replace);
56 /* allocates and formats */
57 /* returned string. size (incl. */
58 /* ascii-Z) in n */
59 char *string_str_replace(char const *cp,
60 char const *srch, char const *replace);
61 /* allocates and formats */
62 /* returned string. size (incl. */
63 /* ascii-Z) in n */
64 char *string_vformat(size_t *n, char const *fmt, va_list list)
65 ATTRIBUTE_FORMAT_PRINTF(2, 0);
66
67 void string_swallow(String *dest, String *src); /* dest eats src */
68 /* following string_swallow */
69 /* src is invalid */
70 char const *string_short (char const *s);
71 char *string_strip(char **str); /* returns *str as stripped str */
72
73
74 /*
75 Internal String use only. Not used outside of this directory, needed here
76 to allow proper compilation of the static inline functions below
77 */
78
79 #include <stdlib.h>
80
81 extern char const s_stringEmpty[];
82 void s_init(String *sp, char const *txt); /* disregards sp's contents */
83
84
85 /* public interface continues from here */
86
87
string_str(register String const * sp)88 static inline char const *string_str(register String const *sp)
89 {
90 return sp->d_str;
91 }
92
string_destruct(register String * sp)93 static inline void string_destruct(register String *sp)
94 {
95 free(sp->d_str);
96 }
97
string_length(register String const * sp)98 static inline size_t string_length(register String const *sp)
99 {
100 return sp->d_length;
101 }
102
string_erase(String * sp)103 static inline void string_erase(String *sp) /* resets to "" */
104 {
105 string_assign(sp, 0);
106 }
107
string_construct(String * s,char const * str)108 static inline void string_construct(String *s, char const *str)
109 {
110 s_init(s, str ? str : s_stringEmpty);
111 }
112
string_last(String const * sp)113 static inline int string_last(String const *sp)
114 {
115 return sp->d_length == 0 ? 0 : sp->d_str[sp->d_length - 1];
116 }
117
118 #endif
119
120
121
122