1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#ifndef SH_STRING_H
#define SH_STRING_H
#include <stdio.h>
/* String definition and utility functions.
*/
typedef struct sh_str_struct
{
char * str; /* always NULL terminated */
size_t len; /* without terminating \0 */
size_t siz; /* size of allocated buffer */
} sh_string;
sh_string * sh_string_new(size_t size);
void sh_string_destroy(sh_string ** s);
#define sh_string_str(a) ((a)->str)
#define sh_string_len(a) ((a)->len)
/* concat string to sh_string
*/
sh_string * sh_string_cat_lchar(sh_string * s, const char * str, size_t len);
/* add char array to end of string */
sh_string * sh_string_add_from_char(sh_string * s, const char * str);
/* set sh_string from string
*/
sh_string * sh_string_set_from_char(sh_string * s, const char * str);
/* create new sh_string from array of given length
*/
sh_string * sh_string_new_from_lchar(const char * str, size_t len);
#define sh_string_copy(a) ((a) ? sh_string_new_from_lchar(((a)->str), ((a)->len)) : NULL)
#define sh_string_add(a,b) ((a && b) ? sh_string_cat_lchar((a), ((b)->str), ((b)->len)) : NULL)
/* create new sh_string from three arrays of given length
*/
sh_string * sh_string_new_from_lchar3(const char * str1, size_t len1,
const char * str2, size_t len2,
const char * str3, size_t len3);
/* Truncate to desired length.
*/
sh_string * sh_string_truncate(sh_string * s, size_t len);
/* If requested increase is zero, increase by default amount.
*/
sh_string * sh_string_grow(sh_string * s, size_t increase);
/* Read a string from a file, with maxlen. Return 0 on EOF,
* -1 on error, and -2 if a line exceeds maxlen.
*/
size_t sh_string_read(sh_string * s, FILE * fp, size_t maxlen);
/* Read a string from a file, with maxlen. Return 0 on EOF,
* -1 on error, and -2 if a line exceeds maxlen.
* If 'cont' != NULL, continuation lines starting with a char
* in 'cont' are concatenated.
*/
size_t sh_string_read_cont(sh_string * s, FILE * fp, size_t maxlen, char *cont);
/* Split array at delim in at most nfields fields.
* Empty fields are returned as empty (zero-length) strings.
* Leading and trailing WS are removed from token.
* The number of fields is returned in 'nfields', their
* lengths in 'lengths'.
* A single delimiter will return two empty fields.
*/
char ** split_array(char *line, unsigned int * nfields,
char delim, size_t * lengths);
/* Split array at whitespace in at most nfields fields.
* Multiple whitespaces are collapsed.
* Empty fields are returned as empty (zero-length) strings.
* The number of fields is returned in nfields.
* An empty string will return zero fields.
* If nfields < actual fields, last string will be remainder.
*/
char ** split_array_ws(char *line, unsigned int * nfields, size_t * lengths);
/* Same as above, but split on [space, tab, comma]
*/
char ** split_array_list(char *line, unsigned int * nfields, size_t * lengths);
/* Same as above, but split on delimiter list (token)
*/
char ** split_array_token (char *line,
unsigned int * nfields, size_t * lengths,
const char * token);
/* Return a split_array_list() of a list contained in 'PREFIX\s*( list ).*'
*/
char ** split_array_braced (char *line, const char * prefix,
unsigned int * nfields, size_t * lengths);
/* Replaces fields in s with 'replacement'. Fields are given
* in the ordered array ovector, comprising ovecnum pairs
* ovector[i], ovector[i+1] which list offset of first char
* of field, offset of first char after field (this is how
* the pcre library does it).
*/
sh_string * sh_string_replace(const sh_string * s,
const int * ovector, int ovecnum,
const char * replacement, size_t rlen);
#endif
|