]>
Commit | Line | Data |
---|---|---|
8abcf290 DB |
1 | #ifndef UTIL_LINUX_STRUTILS |
2 | #define UTIL_LINUX_STRUTILS | |
3 | ||
23106a29 | 4 | #include <stdlib.h> |
8abcf290 DB |
5 | #include <inttypes.h> |
6 | #include <string.h> | |
ce877f2d | 7 | #include <sys/types.h> |
675de3f5 | 8 | #include <ctype.h> |
8abcf290 | 9 | |
a99c9130 KZ |
10 | /* default strtoxx_or_err() exit code */ |
11 | #ifndef STRTOXX_EXIT_CODE | |
12 | # define STRTOXX_EXIT_CODE EXIT_FAILURE | |
13 | #endif | |
14 | ||
15 | ||
23106a29 | 16 | extern int parse_size(const char *str, uintmax_t *res, int *power); |
8abcf290 | 17 | extern int strtosize(const char *str, uintmax_t *res); |
551dae40 KZ |
18 | extern uintmax_t strtosize_or_err(const char *str, const char *errmesg); |
19 | ||
20 | extern int16_t strtos16_or_err(const char *str, const char *errmesg); | |
21 | extern uint16_t strtou16_or_err(const char *str, const char *errmesg); | |
22 | ||
23 | extern int32_t strtos32_or_err(const char *str, const char *errmesg); | |
24 | extern uint32_t strtou32_or_err(const char *str, const char *errmesg); | |
25 | ||
26 | extern int64_t strtos64_or_err(const char *str, const char *errmesg); | |
27 | extern uint64_t strtou64_or_err(const char *str, const char *errmesg); | |
28 | ||
a9f97001 | 29 | extern double strtod_or_err(const char *str, const char *errmesg); |
551dae40 | 30 | |
8abcf290 | 31 | extern long strtol_or_err(const char *str, const char *errmesg); |
e53bc960 | 32 | extern unsigned long strtoul_or_err(const char *str, const char *errmesg); |
8abcf290 | 33 | |
477254da KZ |
34 | extern void strtotimeval_or_err(const char *str, struct timeval *tv, |
35 | const char *errmesg); | |
36 | ||
416c43a9 KZ |
37 | extern int isdigit_string(const char *str); |
38 | ||
02887b73 DT |
39 | #ifndef HAVE_MEMPCPY |
40 | extern void *mempcpy(void *restrict dest, const void *restrict src, size_t n); | |
41 | #endif | |
8abcf290 DB |
42 | #ifndef HAVE_STRNLEN |
43 | extern size_t strnlen(const char *s, size_t maxlen); | |
44 | #endif | |
45 | #ifndef HAVE_STRNDUP | |
46 | extern char *strndup(const char *s, size_t n); | |
47 | #endif | |
48 | #ifndef HAVE_STRNCHR | |
49 | extern char *strnchr(const char *s, size_t maxlen, int c); | |
50 | #endif | |
51 | ||
52 | /* caller guarantees n > 0 */ | |
53 | static inline void xstrncpy(char *dest, const char *src, size_t n) | |
54 | { | |
55 | strncpy(dest, src, n-1); | |
56 | dest[n-1] = 0; | |
57 | } | |
ce877f2d | 58 | |
23106a29 KZ |
59 | static inline char *strdup_to_offset(void *stru, size_t offset, const char *str) |
60 | { | |
61 | char *n = NULL; | |
62 | char **o = (char **) ((char *) stru + offset); | |
63 | ||
64 | if (str) { | |
65 | n = strdup(str); | |
66 | if (!n) | |
67 | return NULL; | |
68 | } | |
69 | ||
70 | free(*o); | |
71 | *o = n; | |
72 | return n; | |
73 | } | |
74 | ||
75 | #define strdup_to_struct_member(_s, _m, _str) \ | |
76 | strdup_to_offset((void *) _s, offsetof(__typeof__(*(_s)), _m), _str) | |
77 | ||
ce877f2d | 78 | extern void strmode(mode_t mode, char *str); |
5d2a9849 FC |
79 | |
80 | /* Options for size_to_human_string() */ | |
81 | enum | |
82 | { | |
83 | SIZE_SUFFIX_1LETTER = 0, | |
84 | SIZE_SUFFIX_3LETTER = 1, | |
85 | SIZE_SUFFIX_SPACE = 2 | |
86 | }; | |
87 | ||
88 | extern char *size_to_human_string(int options, uint64_t bytes); | |
ce877f2d | 89 | |
c87638ad KZ |
90 | extern int string_to_idarray(const char *list, int ary[], size_t arysz, |
91 | int (name2id)(const char *, size_t)); | |
f5077b51 MB |
92 | extern int string_add_to_idarray(const char *list, int ary[], |
93 | size_t arysz, int *ary_pos, | |
94 | int (name2id)(const char *, size_t)); | |
95 | ||
c87638ad KZ |
96 | extern int string_to_bitarray(const char *list, char *ary, |
97 | int (*name2bit)(const char *, size_t)); | |
98 | ||
5ef16771 KZ |
99 | extern int string_to_bitmask(const char *list, |
100 | unsigned long *mask, | |
101 | long (*name2flag)(const char *, size_t)); | |
af7df9ee | 102 | extern int parse_range(const char *str, int *lower, int *upper, int def); |
a883c634 | 103 | |
b106d052 PU |
104 | extern int streq_except_trailing_slash(const char *s1, const char *s2); |
105 | ||
646e159a KZ |
106 | /* |
107 | * Match string beginning. | |
108 | */ | |
109 | static inline const char *startswith(const char *s, const char *prefix) | |
110 | { | |
111 | size_t sz = prefix ? strlen(prefix) : 0; | |
112 | ||
113 | if (s && sz && strncmp(s, prefix, sz) == 0) | |
114 | return s + sz; | |
115 | return NULL; | |
116 | } | |
117 | ||
118 | /* | |
119 | * Case insensitive match string beginning. | |
120 | */ | |
121 | static inline const char *startswith_no_case(const char *s, const char *prefix) | |
122 | { | |
123 | size_t sz = prefix ? strlen(prefix) : 0; | |
124 | ||
125 | if (s && sz && strncasecmp(s, prefix, sz) == 0) | |
126 | return s + sz; | |
127 | return NULL; | |
128 | } | |
129 | ||
130 | /* | |
131 | * Match string ending. | |
132 | */ | |
133 | static inline const char *endswith(const char *s, const char *postfix) | |
134 | { | |
135 | size_t sl = s ? strlen(s) : 0; | |
136 | size_t pl = postfix ? strlen(postfix) : 0; | |
137 | ||
138 | if (pl == 0) | |
139 | return (char *)s + sl; | |
140 | if (sl < pl) | |
141 | return NULL; | |
142 | if (memcmp(s + sl - pl, postfix, pl) != 0) | |
143 | return NULL; | |
144 | return (char *)s + sl - pl; | |
145 | } | |
199e939d | 146 | |
675de3f5 OO |
147 | /* |
148 | * Skip leading white space. | |
149 | */ | |
150 | static inline const char *skip_space(const char *p) | |
151 | { | |
152 | while (isspace(*p)) | |
153 | ++p; | |
154 | return p; | |
155 | } | |
156 | ||
157 | static inline const char *skip_blank(const char *p) | |
158 | { | |
159 | while (isblank(*p)) | |
160 | ++p; | |
161 | return p; | |
162 | } | |
163 | ||
22e9e9c8 KZ |
164 | |
165 | /* Removes whitespace from the right-hand side of a string (trailing | |
166 | * whitespace). | |
167 | * | |
168 | * Returns size of the new string (without \0). | |
169 | */ | |
170 | static inline size_t rtrim_whitespace(unsigned char *str) | |
171 | { | |
172 | size_t i = strlen((char *) str); | |
173 | ||
2f8610ee SK |
174 | while (i) { |
175 | i--; | |
176 | if (!isspace(str[i])) { | |
177 | i++; | |
22e9e9c8 | 178 | break; |
2f8610ee | 179 | } |
22e9e9c8 | 180 | } |
2f8610ee | 181 | str[i] = '\0'; |
22e9e9c8 KZ |
182 | return i; |
183 | } | |
184 | ||
185 | /* Removes whitespace from the left-hand side of a string. | |
186 | * | |
187 | * Returns size of the new string (without \0). | |
188 | */ | |
189 | static inline size_t ltrim_whitespace(unsigned char *str) | |
190 | { | |
191 | size_t len; | |
192 | unsigned char *p; | |
193 | ||
194 | for (p = str; p && isspace(*p); p++); | |
195 | ||
196 | len = strlen((char *) p); | |
197 | ||
198 | if (len && p > str) | |
199 | memmove(str, p, len + 1); | |
200 | ||
201 | return len; | |
202 | } | |
203 | ||
8abcf290 | 204 | #endif |