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