1 #ifndef NM_STRING_H_
2 #define NM_STRING_H_
3 
4 #include <nm_vector.h>
5 #include <stdlib.h>
6 #include <stdint.h>
7 
8 typedef struct {
9     char *data;
10     size_t len;
11     size_t alloc_bytes;
12 } nm_str_t;
13 
14 #define NM_INIT_STR (nm_str_t) { NULL, 0, 0 }
15 
16 void nm_str_alloc_text(nm_str_t *str, const char *src);
17 void nm_str_alloc_str(nm_str_t *str, const nm_str_t *src);
18 void nm_str_add_char(nm_str_t *str, char ch);
19 void nm_str_add_char_opt(nm_str_t *str, char ch);
20 void nm_str_add_text(nm_str_t *str, const char *src);
21 void nm_str_add_text_part(nm_str_t *str, const char *src, size_t len);
22 void nm_str_add_str(nm_str_t *str, const nm_str_t *src);
23 void nm_str_add_str_part(nm_str_t *str, const nm_str_t *src, size_t len);
24 void nm_str_copy(nm_str_t *str, const nm_str_t *src);
25 void nm_str_trunc(nm_str_t *str, size_t len);
26 void nm_str_free(nm_str_t *str);
27 void nm_str_dirname(const nm_str_t *str, nm_str_t *res);
28 void nm_str_basename(const nm_str_t *str, nm_str_t *res);
29 uint32_t nm_str_stoui(const nm_str_t *str, int base);
30 uint64_t nm_str_stoul(const nm_str_t *str, int base);
31 int64_t nm_str_stol(const nm_str_t *str, int base);
32 uint64_t nm_str_ttoul(const char *str, int base);
33 int nm_str_cmp_st(const nm_str_t *str, const char *text);
34 int nm_str_cmp_tt(const char *text1, const char *text2);
35 int nm_str_cmp_ss(const nm_str_t *str1, const nm_str_t *str2);
36 int nm_strn_cmp_ss(const nm_str_t *str1, const nm_str_t *str2);
37 int nm_str_case_cmp_tt(const char *text1, const char *text2);
38 size_t nm_strlcpy(char *dst, const char *src, size_t buflen);
39 void nm_str_remove_char(nm_str_t *str, char ch);
40 void nm_str_append_to_vect(const nm_str_t *src, nm_vect_t *v, const char *delim);
41 void nm_str_format(nm_str_t *str, const char *fmt, ...)
42     __attribute__ ((format(printf, 2, 3)));
43 void nm_str_append_format(nm_str_t *str, const char *fmt, ...)
44     __attribute__ ((format(printf, 2, 3)));
45 void nm_str_replace_text(nm_str_t *str, const char *old, const char *new);
46 
47 void nm_str_vect_ins_cb(void *unit_p, const void *ctx);
48 void nm_str_vect_free_cb(void *unit_p);
49 
nm_vect_str(const nm_vect_t * v,const size_t index)50 static inline nm_str_t *nm_vect_str(const nm_vect_t *v, const size_t index)
51 {
52     return (nm_str_t *)nm_vect_at(v, index);
53 }
nm_vect_str_ctx(const nm_vect_t * v,const size_t index)54 static inline char *nm_vect_str_ctx(const nm_vect_t *v, const size_t index)
55 {
56     return nm_vect_str(v, index)->data;
57 }
nm_vect_str_len(const nm_vect_t * v,const size_t index)58 static inline size_t nm_vect_str_len(const nm_vect_t *v, const size_t index)
59 {
60     return nm_vect_str(v, index)->len;
61 }
62 
63 #endif /* NM_STRING_H_ */
64 /* vim:set ts=4 sw=4: */
65