/src/dovecot/src/lib/strfuncs.h
Line | Count | Source |
1 | | #ifndef STRFUNC_H |
2 | | #define STRFUNC_H |
3 | | |
4 | | /* Maximum number of bytes needed for the largest uintmax_t or the lowest |
5 | | intmax_t number in base 10. This value includes the trailing \0. */ |
6 | 0 | #define MAX_INT_STRLEN ((sizeof(uintmax_t) * CHAR_BIT + 2) / 3 + 1) |
7 | | |
8 | | extern const unsigned char uchar_nul; /* (const unsigned char *)"" */ |
9 | | extern const unsigned char *uchar_empty_ptr; /* non-NULL pointer that shouldn't be dereferenced. */ |
10 | | extern const char *const empty_str_array[]; |
11 | | |
12 | | /* Returns -1 if dest wasn't large enough, 0 if not. */ |
13 | | int i_snprintf(char *dest, size_t max_chars, const char *format, ...) |
14 | | ATTR_FORMAT(3, 4); |
15 | | |
16 | | char *p_strdup(pool_t pool, const char *str) ATTR_MALLOC; |
17 | | void *p_memdup(pool_t pool, const void *data, size_t size) ATTR_MALLOC; |
18 | | /* return NULL if str = "" */ |
19 | | char *p_strdup_empty(pool_t pool, const char *str) ATTR_MALLOC; |
20 | | /* *end isn't included */ |
21 | | char *p_strdup_until(pool_t pool, const void *start, const void *end) |
22 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
23 | | char *p_strndup(pool_t pool, const void *str, size_t max_chars) ATTR_MALLOC; |
24 | | char *p_strdup_printf(pool_t pool, const char *format, ...) |
25 | | ATTR_FORMAT(2, 3) ATTR_MALLOC ATTR_RETURNS_NONNULL; |
26 | | char *p_strdup_vprintf(pool_t pool, const char *format, va_list args) |
27 | | ATTR_FORMAT(2, 0) ATTR_MALLOC ATTR_RETURNS_NONNULL; |
28 | | char *p_strconcat(pool_t pool, const char *str1, ...) |
29 | | ATTR_SENTINEL ATTR_MALLOC; |
30 | | |
31 | | /* same with temporary memory allocations: */ |
32 | | const char *t_strdup(const char *str) ATTR_MALLOC; |
33 | | char *t_strdup_noconst(const char *str) ATTR_MALLOC; |
34 | | const void *t_memdup(const void *data, size_t size) ATTR_MALLOC; |
35 | | void *t_memdup_noconst(const void *data, size_t size) ATTR_MALLOC; |
36 | | /* return NULL if str = "" */ |
37 | | const char *t_strdup_empty(const char *str) ATTR_MALLOC; |
38 | | /* *end isn't included */ |
39 | | const char *t_strdup_until(const void *start, const void *end) |
40 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
41 | | char *t_strdup_until_noconst(const void *start, const void *end) |
42 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
43 | | const char *t_strndup(const void *str, size_t max_chars) ATTR_MALLOC; |
44 | | const char *t_strdup_printf(const char *format, ...) |
45 | | ATTR_FORMAT(1, 2) ATTR_MALLOC ATTR_RETURNS_NONNULL; |
46 | | const char *t_strdup_vprintf(const char *format, va_list args) |
47 | | ATTR_FORMAT(1, 0) ATTR_MALLOC ATTR_RETURNS_NONNULL; |
48 | | const char *t_strconcat(const char *str1, ...) |
49 | | ATTR_SENTINEL ATTR_MALLOC; |
50 | | |
51 | | /* Like t_strdup(), but stop at cutchar. */ |
52 | | const char *t_strcut(const char *str, char cutchar); |
53 | | /* Replace all from->to chars in the string. */ |
54 | | const char *t_str_replace(const char *str, char from, char to); |
55 | | /* Put the string on a single line by replacing all newlines with spaces and |
56 | | dropping any carriage returns. Sequences of several newlines are merged into |
57 | | one space and newlines at the beginning and end of the string are dropped. */ |
58 | | const char *t_str_oneline(const char *str); |
59 | | |
60 | | /* Like strlcpy(), but return -1 if buffer was overflown, 0 if not. */ |
61 | | int i_strocpy(char *dest, const char *src, size_t dstsize); |
62 | | |
63 | | char *str_ucase(char *str); |
64 | | char *str_lcase(char *str); |
65 | | const char *t_str_lcase(const char *str); |
66 | | const char *t_str_ucase(const char *str); |
67 | | |
68 | | /* Return pointer to first matching needle */ |
69 | | const char *i_strstr_arr(const char *haystack, const char *const *needles); |
70 | | |
71 | | /* Trim matching chars from either side of the string */ |
72 | | const char *t_str_trim(const char *str, const char *chars); |
73 | | const char *p_str_trim(pool_t pool, const char *str, const char *chars); |
74 | | const char *str_ltrim(const char *str, const char *chars); |
75 | | const char *t_str_ltrim(const char *str, const char *chars); |
76 | | const char *p_str_ltrim(pool_t pool, const char *str, const char *chars); |
77 | | const char *t_str_rtrim(const char *str, const char *chars); |
78 | | const char *p_str_rtrim(pool_t pool, const char *str, const char *chars); |
79 | | |
80 | | int null_strcmp(const char *s1, const char *s2) ATTR_PURE; |
81 | | int null_strcasecmp(const char *s1, const char *s2) ATTR_PURE; |
82 | | int i_memcasecmp(const void *p1, const void *p2, size_t size) ATTR_PURE; |
83 | | int i_strcmp_p(const char *const *p1, const char *const *p2) ATTR_PURE; |
84 | | int i_strcasecmp_p(const char *const *p1, const char *const *p2) ATTR_PURE; |
85 | | /* Returns TRUE if the two memory areas are equal. This function is safe |
86 | | against timing attacks, so it compares all the bytes every time. */ |
87 | | bool mem_equals_timing_safe(const void *p1, const void *p2, size_t size); |
88 | | /* Returns TRUE if the two strings are equal. Similar to |
89 | | mem_equals_timing_safe() this function is safe against timing attacks when |
90 | | the string lengths are the same. If not, the length of the secret string may |
91 | | be leaked, but otherwise the contents won't be. */ |
92 | | bool str_equals_timing_almost_safe(const char *s1, const char *s2); |
93 | | |
94 | | size_t str_match(const char *p1, const char *p2) ATTR_PURE; |
95 | | size_t str_match_icase(const char *p1, const char *p2) ATTR_PURE; |
96 | | bool str_begins(const char *haystack, const char *needle, |
97 | | const char **suffix_r); |
98 | | bool str_begins_icase(const char *haystack, const char *needle, |
99 | | const char **suffix_r); |
100 | | static inline ATTR_PURE bool |
101 | | str_begins_with(const char *haystack, const char *needle) |
102 | 0 | { |
103 | 0 | return needle[str_match(haystack, needle)] == '\0'; |
104 | 0 | } Unexecuted instantiation: fuzz-imap-utf7.c:str_begins_with Unexecuted instantiation: imap-utf7.c:str_begins_with Unexecuted instantiation: fuzzer.c:str_begins_with Unexecuted instantiation: buffer.c:str_begins_with Unexecuted instantiation: data-stack.c:str_begins_with Unexecuted instantiation: event-log.c:str_begins_with Unexecuted instantiation: failures.c:str_begins_with Unexecuted instantiation: fd-util.c:str_begins_with Unexecuted instantiation: hostpid.c:str_begins_with Unexecuted instantiation: imem.c:str_begins_with Unexecuted instantiation: iostream-pump.c:str_begins_with Unexecuted instantiation: istream.c:str_begins_with Unexecuted instantiation: istream-data.c:str_begins_with Unexecuted instantiation: ioloop.c:str_begins_with Unexecuted instantiation: ioloop-notify-inotify.c:str_begins_with Unexecuted instantiation: ioloop-epoll.c:str_begins_with Unexecuted instantiation: lib.c:str_begins_with Unexecuted instantiation: lib-event.c:str_begins_with Unexecuted instantiation: lib-signals.c:str_begins_with Unexecuted instantiation: memarea.c:str_begins_with Unexecuted instantiation: mempool.c:str_begins_with Unexecuted instantiation: mempool-alloconly.c:str_begins_with Unexecuted instantiation: mempool-datastack.c:str_begins_with Unexecuted instantiation: mempool-system.c:str_begins_with Unexecuted instantiation: mempool-unsafe-datastack.c:str_begins_with Unexecuted instantiation: net.c:str_begins_with Unexecuted instantiation: ostream.c:str_begins_with Unexecuted instantiation: ostream-file.c:str_begins_with Unexecuted instantiation: path-util.c:str_begins_with Unexecuted instantiation: printf-format-fix.c:str_begins_with Unexecuted instantiation: process-title.c:str_begins_with Unexecuted instantiation: priorityq.c:str_begins_with Unexecuted instantiation: randgen.c:str_begins_with Unexecuted instantiation: rand.c:str_begins_with Unexecuted instantiation: restrict-access.c:str_begins_with Unexecuted instantiation: safe-memset.c:str_begins_with Unexecuted instantiation: sendfile-util.c:str_begins_with Unexecuted instantiation: sleep.c:str_begins_with Unexecuted instantiation: str.c:str_begins_with Unexecuted instantiation: strescape.c:str_begins_with Unexecuted instantiation: strfuncs.c:str_begins_with Unexecuted instantiation: strnum.c:str_begins_with Unexecuted instantiation: time-util.c:str_begins_with Unexecuted instantiation: unichar.c:str_begins_with Unexecuted instantiation: unicode-break.c:str_begins_with Unexecuted instantiation: unicode-data-tables.c:str_begins_with Unexecuted instantiation: unicode-transform.c:str_begins_with Unexecuted instantiation: write-full.c:str_begins_with Unexecuted instantiation: array.c:str_begins_with Unexecuted instantiation: backtrace-string.c:str_begins_with Unexecuted instantiation: bits.c:str_begins_with Unexecuted instantiation: env-util.c:str_begins_with Unexecuted instantiation: event-filter.c:str_begins_with Unexecuted instantiation: event-filter-lexer.c:str_begins_with Unexecuted instantiation: event-filter-parser.c:str_begins_with Unexecuted instantiation: hash.c:str_begins_with Unexecuted instantiation: ipwd.c:str_begins_with Unexecuted instantiation: iostream.c:str_begins_with Unexecuted instantiation: istream-file.c:str_begins_with Unexecuted instantiation: ioloop-iolist.c:str_begins_with Unexecuted instantiation: ioloop-notify-fd.c:str_begins_with Unexecuted instantiation: primes.c:str_begins_with Unexecuted instantiation: str-parse.c:str_begins_with Unexecuted instantiation: wildcard-match.c:str_begins_with |
105 | | static inline ATTR_PURE bool |
106 | | str_begins_icase_with(const char *haystack, const char *needle) |
107 | 0 | { |
108 | 0 | return needle[str_match_icase(haystack, needle)] == '\0'; |
109 | 0 | } Unexecuted instantiation: fuzz-imap-utf7.c:str_begins_icase_with Unexecuted instantiation: imap-utf7.c:str_begins_icase_with Unexecuted instantiation: fuzzer.c:str_begins_icase_with Unexecuted instantiation: buffer.c:str_begins_icase_with Unexecuted instantiation: data-stack.c:str_begins_icase_with Unexecuted instantiation: event-log.c:str_begins_icase_with Unexecuted instantiation: failures.c:str_begins_icase_with Unexecuted instantiation: fd-util.c:str_begins_icase_with Unexecuted instantiation: hostpid.c:str_begins_icase_with Unexecuted instantiation: imem.c:str_begins_icase_with Unexecuted instantiation: iostream-pump.c:str_begins_icase_with Unexecuted instantiation: istream.c:str_begins_icase_with Unexecuted instantiation: istream-data.c:str_begins_icase_with Unexecuted instantiation: ioloop.c:str_begins_icase_with Unexecuted instantiation: ioloop-notify-inotify.c:str_begins_icase_with Unexecuted instantiation: ioloop-epoll.c:str_begins_icase_with Unexecuted instantiation: lib.c:str_begins_icase_with Unexecuted instantiation: lib-event.c:str_begins_icase_with Unexecuted instantiation: lib-signals.c:str_begins_icase_with Unexecuted instantiation: memarea.c:str_begins_icase_with Unexecuted instantiation: mempool.c:str_begins_icase_with Unexecuted instantiation: mempool-alloconly.c:str_begins_icase_with Unexecuted instantiation: mempool-datastack.c:str_begins_icase_with Unexecuted instantiation: mempool-system.c:str_begins_icase_with Unexecuted instantiation: mempool-unsafe-datastack.c:str_begins_icase_with Unexecuted instantiation: net.c:str_begins_icase_with Unexecuted instantiation: ostream.c:str_begins_icase_with Unexecuted instantiation: ostream-file.c:str_begins_icase_with Unexecuted instantiation: path-util.c:str_begins_icase_with Unexecuted instantiation: printf-format-fix.c:str_begins_icase_with Unexecuted instantiation: process-title.c:str_begins_icase_with Unexecuted instantiation: priorityq.c:str_begins_icase_with Unexecuted instantiation: randgen.c:str_begins_icase_with Unexecuted instantiation: rand.c:str_begins_icase_with Unexecuted instantiation: restrict-access.c:str_begins_icase_with Unexecuted instantiation: safe-memset.c:str_begins_icase_with Unexecuted instantiation: sendfile-util.c:str_begins_icase_with Unexecuted instantiation: sleep.c:str_begins_icase_with Unexecuted instantiation: str.c:str_begins_icase_with Unexecuted instantiation: strescape.c:str_begins_icase_with Unexecuted instantiation: strfuncs.c:str_begins_icase_with Unexecuted instantiation: strnum.c:str_begins_icase_with Unexecuted instantiation: time-util.c:str_begins_icase_with Unexecuted instantiation: unichar.c:str_begins_icase_with Unexecuted instantiation: unicode-break.c:str_begins_icase_with Unexecuted instantiation: unicode-data-tables.c:str_begins_icase_with Unexecuted instantiation: unicode-transform.c:str_begins_icase_with Unexecuted instantiation: write-full.c:str_begins_icase_with Unexecuted instantiation: array.c:str_begins_icase_with Unexecuted instantiation: backtrace-string.c:str_begins_icase_with Unexecuted instantiation: bits.c:str_begins_icase_with Unexecuted instantiation: env-util.c:str_begins_icase_with Unexecuted instantiation: event-filter.c:str_begins_icase_with Unexecuted instantiation: event-filter-lexer.c:str_begins_icase_with Unexecuted instantiation: event-filter-parser.c:str_begins_icase_with Unexecuted instantiation: hash.c:str_begins_icase_with Unexecuted instantiation: ipwd.c:str_begins_icase_with Unexecuted instantiation: iostream.c:str_begins_icase_with Unexecuted instantiation: istream-file.c:str_begins_icase_with Unexecuted instantiation: ioloop-iolist.c:str_begins_icase_with Unexecuted instantiation: ioloop-notify-fd.c:str_begins_icase_with Unexecuted instantiation: primes.c:str_begins_icase_with Unexecuted instantiation: str-parse.c:str_begins_icase_with Unexecuted instantiation: wildcard-match.c:str_begins_icase_with |
110 | | #if defined(__GNUC__) && (__GNUC__ >= 2) && !defined(STATIC_CHECKER) |
111 | | /* GCC (and Clang) are known to have a compile-time strlen("literal") shortcut, and |
112 | | an optimised strncmp(), so use that by default. Macro is multi-evaluation safe. */ |
113 | | static inline bool |
114 | | str_begins_builtin_success(const char *haystack, size_t needle_len, |
115 | | const char **suffix_r) |
116 | 0 | { |
117 | 0 | *suffix_r = haystack + needle_len; |
118 | 0 | return TRUE; |
119 | 0 | } Unexecuted instantiation: fuzz-imap-utf7.c:str_begins_builtin_success Unexecuted instantiation: imap-utf7.c:str_begins_builtin_success Unexecuted instantiation: fuzzer.c:str_begins_builtin_success Unexecuted instantiation: buffer.c:str_begins_builtin_success Unexecuted instantiation: data-stack.c:str_begins_builtin_success Unexecuted instantiation: event-log.c:str_begins_builtin_success Unexecuted instantiation: failures.c:str_begins_builtin_success Unexecuted instantiation: fd-util.c:str_begins_builtin_success Unexecuted instantiation: hostpid.c:str_begins_builtin_success Unexecuted instantiation: imem.c:str_begins_builtin_success Unexecuted instantiation: iostream-pump.c:str_begins_builtin_success Unexecuted instantiation: istream.c:str_begins_builtin_success Unexecuted instantiation: istream-data.c:str_begins_builtin_success Unexecuted instantiation: ioloop.c:str_begins_builtin_success Unexecuted instantiation: ioloop-notify-inotify.c:str_begins_builtin_success Unexecuted instantiation: ioloop-epoll.c:str_begins_builtin_success Unexecuted instantiation: lib.c:str_begins_builtin_success Unexecuted instantiation: lib-event.c:str_begins_builtin_success Unexecuted instantiation: lib-signals.c:str_begins_builtin_success Unexecuted instantiation: memarea.c:str_begins_builtin_success Unexecuted instantiation: mempool.c:str_begins_builtin_success Unexecuted instantiation: mempool-alloconly.c:str_begins_builtin_success Unexecuted instantiation: mempool-datastack.c:str_begins_builtin_success Unexecuted instantiation: mempool-system.c:str_begins_builtin_success Unexecuted instantiation: mempool-unsafe-datastack.c:str_begins_builtin_success Unexecuted instantiation: net.c:str_begins_builtin_success Unexecuted instantiation: ostream.c:str_begins_builtin_success Unexecuted instantiation: ostream-file.c:str_begins_builtin_success Unexecuted instantiation: path-util.c:str_begins_builtin_success Unexecuted instantiation: printf-format-fix.c:str_begins_builtin_success Unexecuted instantiation: process-title.c:str_begins_builtin_success Unexecuted instantiation: priorityq.c:str_begins_builtin_success Unexecuted instantiation: randgen.c:str_begins_builtin_success Unexecuted instantiation: rand.c:str_begins_builtin_success Unexecuted instantiation: restrict-access.c:str_begins_builtin_success Unexecuted instantiation: safe-memset.c:str_begins_builtin_success Unexecuted instantiation: sendfile-util.c:str_begins_builtin_success Unexecuted instantiation: sleep.c:str_begins_builtin_success Unexecuted instantiation: str.c:str_begins_builtin_success Unexecuted instantiation: strescape.c:str_begins_builtin_success Unexecuted instantiation: strfuncs.c:str_begins_builtin_success Unexecuted instantiation: strnum.c:str_begins_builtin_success Unexecuted instantiation: time-util.c:str_begins_builtin_success Unexecuted instantiation: unichar.c:str_begins_builtin_success Unexecuted instantiation: unicode-break.c:str_begins_builtin_success Unexecuted instantiation: unicode-data-tables.c:str_begins_builtin_success Unexecuted instantiation: unicode-transform.c:str_begins_builtin_success Unexecuted instantiation: write-full.c:str_begins_builtin_success Unexecuted instantiation: array.c:str_begins_builtin_success Unexecuted instantiation: backtrace-string.c:str_begins_builtin_success Unexecuted instantiation: bits.c:str_begins_builtin_success Unexecuted instantiation: env-util.c:str_begins_builtin_success Unexecuted instantiation: event-filter.c:str_begins_builtin_success Unexecuted instantiation: event-filter-lexer.c:str_begins_builtin_success Unexecuted instantiation: event-filter-parser.c:str_begins_builtin_success Unexecuted instantiation: hash.c:str_begins_builtin_success Unexecuted instantiation: ipwd.c:str_begins_builtin_success Unexecuted instantiation: iostream.c:str_begins_builtin_success Unexecuted instantiation: istream-file.c:str_begins_builtin_success Unexecuted instantiation: ioloop-iolist.c:str_begins_builtin_success Unexecuted instantiation: ioloop-notify-fd.c:str_begins_builtin_success Unexecuted instantiation: primes.c:str_begins_builtin_success Unexecuted instantiation: str-parse.c:str_begins_builtin_success Unexecuted instantiation: wildcard-match.c:str_begins_builtin_success |
120 | | # define str_begins_with(h, n) \ |
121 | 0 | (__builtin_constant_p(n) ? strncmp((h), (n), strlen(n))==0 : \ |
122 | 0 | (str_begins_with)((h), (n))) |
123 | | # define str_begins(h, n, suffix_r) \ |
124 | | (!__builtin_constant_p(n) ? (str_begins)((h), (n), (suffix_r)) : \ |
125 | | (strncmp((h), (n), strlen(n)) != 0 ? FALSE : \ |
126 | | str_begins_builtin_success((h), strlen(n), suffix_r))) |
127 | | |
128 | | # define str_begins_icase_with(h, n) \ |
129 | 0 | (__builtin_constant_p(n) ? strncasecmp((h), (n), strlen(n))==0 : \ |
130 | 0 | (str_begins_icase_with)((h), (n))) |
131 | | # define str_begins_icase(h, n, suffix_r) \ |
132 | | (!__builtin_constant_p(n) ? (str_begins_icase)((h), (n), (suffix_r)) : \ |
133 | | (strncasecmp((h), (n), strlen(n)) != 0 ? FALSE : \ |
134 | | str_begins_builtin_success((h), strlen(n), suffix_r))) |
135 | | #endif |
136 | | |
137 | | static inline ATTR_PURE bool |
138 | | str_ends_with(const char *haystack, const char *suffix) |
139 | 0 | { |
140 | 0 | size_t haystack_len = strlen(haystack); |
141 | 0 | size_t suffix_len = strlen(suffix); |
142 | 0 | if (haystack_len < suffix_len) |
143 | 0 | return FALSE; |
144 | 0 | return strcmp(haystack + haystack_len - suffix_len, suffix) == 0; |
145 | 0 | } Unexecuted instantiation: fuzz-imap-utf7.c:str_ends_with Unexecuted instantiation: imap-utf7.c:str_ends_with Unexecuted instantiation: fuzzer.c:str_ends_with Unexecuted instantiation: buffer.c:str_ends_with Unexecuted instantiation: data-stack.c:str_ends_with Unexecuted instantiation: event-log.c:str_ends_with Unexecuted instantiation: failures.c:str_ends_with Unexecuted instantiation: fd-util.c:str_ends_with Unexecuted instantiation: hostpid.c:str_ends_with Unexecuted instantiation: imem.c:str_ends_with Unexecuted instantiation: iostream-pump.c:str_ends_with Unexecuted instantiation: istream.c:str_ends_with Unexecuted instantiation: istream-data.c:str_ends_with Unexecuted instantiation: ioloop.c:str_ends_with Unexecuted instantiation: ioloop-notify-inotify.c:str_ends_with Unexecuted instantiation: ioloop-epoll.c:str_ends_with Unexecuted instantiation: lib.c:str_ends_with Unexecuted instantiation: lib-event.c:str_ends_with Unexecuted instantiation: lib-signals.c:str_ends_with Unexecuted instantiation: memarea.c:str_ends_with Unexecuted instantiation: mempool.c:str_ends_with Unexecuted instantiation: mempool-alloconly.c:str_ends_with Unexecuted instantiation: mempool-datastack.c:str_ends_with Unexecuted instantiation: mempool-system.c:str_ends_with Unexecuted instantiation: mempool-unsafe-datastack.c:str_ends_with Unexecuted instantiation: net.c:str_ends_with Unexecuted instantiation: ostream.c:str_ends_with Unexecuted instantiation: ostream-file.c:str_ends_with Unexecuted instantiation: path-util.c:str_ends_with Unexecuted instantiation: printf-format-fix.c:str_ends_with Unexecuted instantiation: process-title.c:str_ends_with Unexecuted instantiation: priorityq.c:str_ends_with Unexecuted instantiation: randgen.c:str_ends_with Unexecuted instantiation: rand.c:str_ends_with Unexecuted instantiation: restrict-access.c:str_ends_with Unexecuted instantiation: safe-memset.c:str_ends_with Unexecuted instantiation: sendfile-util.c:str_ends_with Unexecuted instantiation: sleep.c:str_ends_with Unexecuted instantiation: str.c:str_ends_with Unexecuted instantiation: strescape.c:str_ends_with Unexecuted instantiation: strfuncs.c:str_ends_with Unexecuted instantiation: strnum.c:str_ends_with Unexecuted instantiation: time-util.c:str_ends_with Unexecuted instantiation: unichar.c:str_ends_with Unexecuted instantiation: unicode-break.c:str_ends_with Unexecuted instantiation: unicode-data-tables.c:str_ends_with Unexecuted instantiation: unicode-transform.c:str_ends_with Unexecuted instantiation: write-full.c:str_ends_with Unexecuted instantiation: array.c:str_ends_with Unexecuted instantiation: backtrace-string.c:str_ends_with Unexecuted instantiation: bits.c:str_ends_with Unexecuted instantiation: env-util.c:str_ends_with Unexecuted instantiation: event-filter.c:str_ends_with Unexecuted instantiation: event-filter-lexer.c:str_ends_with Unexecuted instantiation: event-filter-parser.c:str_ends_with Unexecuted instantiation: hash.c:str_ends_with Unexecuted instantiation: ipwd.c:str_ends_with Unexecuted instantiation: iostream.c:str_ends_with Unexecuted instantiation: istream-file.c:str_ends_with Unexecuted instantiation: ioloop-iolist.c:str_ends_with Unexecuted instantiation: ioloop-notify-fd.c:str_ends_with Unexecuted instantiation: primes.c:str_ends_with Unexecuted instantiation: str-parse.c:str_ends_with Unexecuted instantiation: wildcard-match.c:str_ends_with |
146 | | |
147 | | static inline ATTR_PURE bool |
148 | | str_ends_icase_with(const char *haystack, const char *suffix) |
149 | 0 | { |
150 | 0 | size_t haystack_len = strlen(haystack); |
151 | 0 | size_t suffix_len = strlen(suffix); |
152 | 0 | if (haystack_len < suffix_len) |
153 | 0 | return FALSE; |
154 | 0 | return strcasecmp(haystack + haystack_len - suffix_len, suffix) == 0; |
155 | 0 | } Unexecuted instantiation: fuzz-imap-utf7.c:str_ends_icase_with Unexecuted instantiation: imap-utf7.c:str_ends_icase_with Unexecuted instantiation: fuzzer.c:str_ends_icase_with Unexecuted instantiation: buffer.c:str_ends_icase_with Unexecuted instantiation: data-stack.c:str_ends_icase_with Unexecuted instantiation: event-log.c:str_ends_icase_with Unexecuted instantiation: failures.c:str_ends_icase_with Unexecuted instantiation: fd-util.c:str_ends_icase_with Unexecuted instantiation: hostpid.c:str_ends_icase_with Unexecuted instantiation: imem.c:str_ends_icase_with Unexecuted instantiation: iostream-pump.c:str_ends_icase_with Unexecuted instantiation: istream.c:str_ends_icase_with Unexecuted instantiation: istream-data.c:str_ends_icase_with Unexecuted instantiation: ioloop.c:str_ends_icase_with Unexecuted instantiation: ioloop-notify-inotify.c:str_ends_icase_with Unexecuted instantiation: ioloop-epoll.c:str_ends_icase_with Unexecuted instantiation: lib.c:str_ends_icase_with Unexecuted instantiation: lib-event.c:str_ends_icase_with Unexecuted instantiation: lib-signals.c:str_ends_icase_with Unexecuted instantiation: memarea.c:str_ends_icase_with Unexecuted instantiation: mempool.c:str_ends_icase_with Unexecuted instantiation: mempool-alloconly.c:str_ends_icase_with Unexecuted instantiation: mempool-datastack.c:str_ends_icase_with Unexecuted instantiation: mempool-system.c:str_ends_icase_with Unexecuted instantiation: mempool-unsafe-datastack.c:str_ends_icase_with Unexecuted instantiation: net.c:str_ends_icase_with Unexecuted instantiation: ostream.c:str_ends_icase_with Unexecuted instantiation: ostream-file.c:str_ends_icase_with Unexecuted instantiation: path-util.c:str_ends_icase_with Unexecuted instantiation: printf-format-fix.c:str_ends_icase_with Unexecuted instantiation: process-title.c:str_ends_icase_with Unexecuted instantiation: priorityq.c:str_ends_icase_with Unexecuted instantiation: randgen.c:str_ends_icase_with Unexecuted instantiation: rand.c:str_ends_icase_with Unexecuted instantiation: restrict-access.c:str_ends_icase_with Unexecuted instantiation: safe-memset.c:str_ends_icase_with Unexecuted instantiation: sendfile-util.c:str_ends_icase_with Unexecuted instantiation: sleep.c:str_ends_icase_with Unexecuted instantiation: str.c:str_ends_icase_with Unexecuted instantiation: strescape.c:str_ends_icase_with Unexecuted instantiation: strfuncs.c:str_ends_icase_with Unexecuted instantiation: strnum.c:str_ends_icase_with Unexecuted instantiation: time-util.c:str_ends_icase_with Unexecuted instantiation: unichar.c:str_ends_icase_with Unexecuted instantiation: unicode-break.c:str_ends_icase_with Unexecuted instantiation: unicode-data-tables.c:str_ends_icase_with Unexecuted instantiation: unicode-transform.c:str_ends_icase_with Unexecuted instantiation: write-full.c:str_ends_icase_with Unexecuted instantiation: array.c:str_ends_icase_with Unexecuted instantiation: backtrace-string.c:str_ends_icase_with Unexecuted instantiation: bits.c:str_ends_icase_with Unexecuted instantiation: env-util.c:str_ends_icase_with Unexecuted instantiation: event-filter.c:str_ends_icase_with Unexecuted instantiation: event-filter-lexer.c:str_ends_icase_with Unexecuted instantiation: event-filter-parser.c:str_ends_icase_with Unexecuted instantiation: hash.c:str_ends_icase_with Unexecuted instantiation: ipwd.c:str_ends_icase_with Unexecuted instantiation: iostream.c:str_ends_icase_with Unexecuted instantiation: istream-file.c:str_ends_icase_with Unexecuted instantiation: ioloop-iolist.c:str_ends_icase_with Unexecuted instantiation: ioloop-notify-fd.c:str_ends_icase_with Unexecuted instantiation: primes.c:str_ends_icase_with Unexecuted instantiation: str-parse.c:str_ends_icase_with Unexecuted instantiation: wildcard-match.c:str_ends_icase_with |
156 | | |
157 | | /* Get length of a prefix segment. |
158 | | |
159 | | Calculates the length (in bytes) of the initial segment of s which consists |
160 | | entirely of bytes in accept. |
161 | | */ |
162 | | size_t i_memspn(const void *data, size_t data_len, |
163 | | const void *accept, size_t accept_len); |
164 | | /* Get length of a prefix segment. |
165 | | |
166 | | Calculates the length of the initial segment of s which consists entirely of |
167 | | bytes not in reject. |
168 | | */ |
169 | | size_t i_memcspn(const void *data, size_t data_len, |
170 | | const void *reject, size_t reject_len); |
171 | | |
172 | | static inline char *i_strchr_to_next(const char *str, char chr) |
173 | 0 | { |
174 | 0 | char *tmp = (char *)strchr(str, chr); |
175 | 0 | return tmp == NULL ? NULL : tmp+1; |
176 | 0 | } Unexecuted instantiation: fuzz-imap-utf7.c:i_strchr_to_next Unexecuted instantiation: imap-utf7.c:i_strchr_to_next Unexecuted instantiation: fuzzer.c:i_strchr_to_next Unexecuted instantiation: buffer.c:i_strchr_to_next Unexecuted instantiation: data-stack.c:i_strchr_to_next Unexecuted instantiation: event-log.c:i_strchr_to_next Unexecuted instantiation: failures.c:i_strchr_to_next Unexecuted instantiation: fd-util.c:i_strchr_to_next Unexecuted instantiation: hostpid.c:i_strchr_to_next Unexecuted instantiation: imem.c:i_strchr_to_next Unexecuted instantiation: iostream-pump.c:i_strchr_to_next Unexecuted instantiation: istream.c:i_strchr_to_next Unexecuted instantiation: istream-data.c:i_strchr_to_next Unexecuted instantiation: ioloop.c:i_strchr_to_next Unexecuted instantiation: ioloop-notify-inotify.c:i_strchr_to_next Unexecuted instantiation: ioloop-epoll.c:i_strchr_to_next Unexecuted instantiation: lib.c:i_strchr_to_next Unexecuted instantiation: lib-event.c:i_strchr_to_next Unexecuted instantiation: lib-signals.c:i_strchr_to_next Unexecuted instantiation: memarea.c:i_strchr_to_next Unexecuted instantiation: mempool.c:i_strchr_to_next Unexecuted instantiation: mempool-alloconly.c:i_strchr_to_next Unexecuted instantiation: mempool-datastack.c:i_strchr_to_next Unexecuted instantiation: mempool-system.c:i_strchr_to_next Unexecuted instantiation: mempool-unsafe-datastack.c:i_strchr_to_next Unexecuted instantiation: net.c:i_strchr_to_next Unexecuted instantiation: ostream.c:i_strchr_to_next Unexecuted instantiation: ostream-file.c:i_strchr_to_next Unexecuted instantiation: path-util.c:i_strchr_to_next Unexecuted instantiation: printf-format-fix.c:i_strchr_to_next Unexecuted instantiation: process-title.c:i_strchr_to_next Unexecuted instantiation: priorityq.c:i_strchr_to_next Unexecuted instantiation: randgen.c:i_strchr_to_next Unexecuted instantiation: rand.c:i_strchr_to_next Unexecuted instantiation: restrict-access.c:i_strchr_to_next Unexecuted instantiation: safe-memset.c:i_strchr_to_next Unexecuted instantiation: sendfile-util.c:i_strchr_to_next Unexecuted instantiation: sleep.c:i_strchr_to_next Unexecuted instantiation: str.c:i_strchr_to_next Unexecuted instantiation: strescape.c:i_strchr_to_next Unexecuted instantiation: strfuncs.c:i_strchr_to_next Unexecuted instantiation: strnum.c:i_strchr_to_next Unexecuted instantiation: time-util.c:i_strchr_to_next Unexecuted instantiation: unichar.c:i_strchr_to_next Unexecuted instantiation: unicode-break.c:i_strchr_to_next Unexecuted instantiation: unicode-data-tables.c:i_strchr_to_next Unexecuted instantiation: unicode-transform.c:i_strchr_to_next Unexecuted instantiation: write-full.c:i_strchr_to_next Unexecuted instantiation: array.c:i_strchr_to_next Unexecuted instantiation: backtrace-string.c:i_strchr_to_next Unexecuted instantiation: bits.c:i_strchr_to_next Unexecuted instantiation: env-util.c:i_strchr_to_next Unexecuted instantiation: event-filter.c:i_strchr_to_next Unexecuted instantiation: event-filter-lexer.c:i_strchr_to_next Unexecuted instantiation: event-filter-parser.c:i_strchr_to_next Unexecuted instantiation: hash.c:i_strchr_to_next Unexecuted instantiation: ipwd.c:i_strchr_to_next Unexecuted instantiation: iostream.c:i_strchr_to_next Unexecuted instantiation: istream-file.c:i_strchr_to_next Unexecuted instantiation: ioloop-iolist.c:i_strchr_to_next Unexecuted instantiation: ioloop-notify-fd.c:i_strchr_to_next Unexecuted instantiation: primes.c:i_strchr_to_next Unexecuted instantiation: str-parse.c:i_strchr_to_next Unexecuted instantiation: wildcard-match.c:i_strchr_to_next |
177 | | |
178 | | /* Split only on the first separator encountered. |
179 | | Returns TRUE if the separator was found, FALSE and *value_r = "" otherwise. |
180 | | Normally it's fine (or even useful) to treat "key" and "key=" identically, |
181 | | so return value can just be ignored. */ |
182 | | bool t_split_key_value(const char *arg, char separator, |
183 | | const char **key_r, const char **value_r) |
184 | | ATTR_NOWARN_UNUSED_RESULT; |
185 | | static inline bool ATTR_NOWARN_UNUSED_RESULT |
186 | 0 | t_split_key_value_eq(const char *arg, const char **key_r, const char **value_r) { |
187 | 0 | return t_split_key_value(arg, '=', key_r, value_r); |
188 | 0 | } Unexecuted instantiation: fuzz-imap-utf7.c:t_split_key_value_eq Unexecuted instantiation: imap-utf7.c:t_split_key_value_eq Unexecuted instantiation: fuzzer.c:t_split_key_value_eq Unexecuted instantiation: buffer.c:t_split_key_value_eq Unexecuted instantiation: data-stack.c:t_split_key_value_eq Unexecuted instantiation: event-log.c:t_split_key_value_eq Unexecuted instantiation: failures.c:t_split_key_value_eq Unexecuted instantiation: fd-util.c:t_split_key_value_eq Unexecuted instantiation: hostpid.c:t_split_key_value_eq Unexecuted instantiation: imem.c:t_split_key_value_eq Unexecuted instantiation: iostream-pump.c:t_split_key_value_eq Unexecuted instantiation: istream.c:t_split_key_value_eq Unexecuted instantiation: istream-data.c:t_split_key_value_eq Unexecuted instantiation: ioloop.c:t_split_key_value_eq Unexecuted instantiation: ioloop-notify-inotify.c:t_split_key_value_eq Unexecuted instantiation: ioloop-epoll.c:t_split_key_value_eq Unexecuted instantiation: lib.c:t_split_key_value_eq Unexecuted instantiation: lib-event.c:t_split_key_value_eq Unexecuted instantiation: lib-signals.c:t_split_key_value_eq Unexecuted instantiation: memarea.c:t_split_key_value_eq Unexecuted instantiation: mempool.c:t_split_key_value_eq Unexecuted instantiation: mempool-alloconly.c:t_split_key_value_eq Unexecuted instantiation: mempool-datastack.c:t_split_key_value_eq Unexecuted instantiation: mempool-system.c:t_split_key_value_eq Unexecuted instantiation: mempool-unsafe-datastack.c:t_split_key_value_eq Unexecuted instantiation: net.c:t_split_key_value_eq Unexecuted instantiation: ostream.c:t_split_key_value_eq Unexecuted instantiation: ostream-file.c:t_split_key_value_eq Unexecuted instantiation: path-util.c:t_split_key_value_eq Unexecuted instantiation: printf-format-fix.c:t_split_key_value_eq Unexecuted instantiation: process-title.c:t_split_key_value_eq Unexecuted instantiation: priorityq.c:t_split_key_value_eq Unexecuted instantiation: randgen.c:t_split_key_value_eq Unexecuted instantiation: rand.c:t_split_key_value_eq Unexecuted instantiation: restrict-access.c:t_split_key_value_eq Unexecuted instantiation: safe-memset.c:t_split_key_value_eq Unexecuted instantiation: sendfile-util.c:t_split_key_value_eq Unexecuted instantiation: sleep.c:t_split_key_value_eq Unexecuted instantiation: str.c:t_split_key_value_eq Unexecuted instantiation: strescape.c:t_split_key_value_eq Unexecuted instantiation: strfuncs.c:t_split_key_value_eq Unexecuted instantiation: strnum.c:t_split_key_value_eq Unexecuted instantiation: time-util.c:t_split_key_value_eq Unexecuted instantiation: unichar.c:t_split_key_value_eq Unexecuted instantiation: unicode-break.c:t_split_key_value_eq Unexecuted instantiation: unicode-data-tables.c:t_split_key_value_eq Unexecuted instantiation: unicode-transform.c:t_split_key_value_eq Unexecuted instantiation: write-full.c:t_split_key_value_eq Unexecuted instantiation: array.c:t_split_key_value_eq Unexecuted instantiation: backtrace-string.c:t_split_key_value_eq Unexecuted instantiation: bits.c:t_split_key_value_eq Unexecuted instantiation: env-util.c:t_split_key_value_eq Unexecuted instantiation: event-filter.c:t_split_key_value_eq Unexecuted instantiation: event-filter-lexer.c:t_split_key_value_eq Unexecuted instantiation: event-filter-parser.c:t_split_key_value_eq Unexecuted instantiation: hash.c:t_split_key_value_eq Unexecuted instantiation: ipwd.c:t_split_key_value_eq Unexecuted instantiation: iostream.c:t_split_key_value_eq Unexecuted instantiation: istream-file.c:t_split_key_value_eq Unexecuted instantiation: ioloop-iolist.c:t_split_key_value_eq Unexecuted instantiation: ioloop-notify-fd.c:t_split_key_value_eq Unexecuted instantiation: primes.c:t_split_key_value_eq Unexecuted instantiation: str-parse.c:t_split_key_value_eq Unexecuted instantiation: wildcard-match.c:t_split_key_value_eq |
189 | | |
190 | | /* separators is an array of separator characters, not a separator string. |
191 | | an empty data string results in an array containing only NULL. */ |
192 | | char **p_strsplit(pool_t pool, const char *data, const char *separators) |
193 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
194 | | const char **t_strsplit(const char *data, const char *separators) |
195 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
196 | | /* like p_strsplit(), but treats multiple adjacent separators as a single |
197 | | separator. separators at the beginning or at the end of the string are also |
198 | | ignored, so it's not possible for the result to have any empty strings. */ |
199 | | char **p_strsplit_spaces(pool_t pool, const char *data, const char *separators) |
200 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
201 | | const char **t_strsplit_spaces(const char *data, const char *separators) |
202 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
203 | | void p_strsplit_free(pool_t pool, char **arr); |
204 | | |
205 | | const char *dec2str(uintmax_t number); |
206 | | /* Use the given buffer to write out the number. Returns pointer to the |
207 | | written number in the buffer. Note that this isn't the same as the beginning |
208 | | of the buffer. */ |
209 | | char *dec2str_buf(char buffer[STATIC_ARRAY MAX_INT_STRLEN], uintmax_t number); |
210 | | |
211 | | /* Return length of NULL-terminated list string array */ |
212 | | unsigned int str_array_length(const char *const *arr) ATTR_PURE; |
213 | | /* Return all strings from array joined into one string. */ |
214 | | const char *t_strarray_join(const char *const *arr, const char *separator) |
215 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
216 | | /* Removes a value from NULL-terminated string array. Returns TRUE if found. */ |
217 | | bool str_array_remove(const char **arr, const char *value); |
218 | | /* Returns TRUE if value exists in NULL-terminated string array. */ |
219 | | bool str_array_find(const char *const *arr, const char *value); |
220 | | /* Like str_array_find(), but use strcasecmp(). */ |
221 | | bool str_array_icase_find(const char *const *arr, const char *value); |
222 | | /* Duplicate array of strings. The memory can be freed by freeing the |
223 | | return value. */ |
224 | | const char **p_strarray_dup(pool_t pool, const char *const *arr) |
225 | | ATTR_MALLOC ATTR_RETURNS_NONNULL; |
226 | | |
227 | | /* Join ARRAY_TYPE(const_string) to a string, similar to t_strarray_join() */ |
228 | | char *p_array_const_string_join(pool_t pool, const ARRAY_TYPE(const_string) *arr, |
229 | | const char *separator); |
230 | | #define t_array_const_string_join(arr, separator) \ |
231 | 0 | ((const char *)p_array_const_string_join(unsafe_data_stack_pool, arr, separator)) |
232 | | |
233 | | /* INTERNAL */ |
234 | | char *t_noalloc_strdup_vprintf(const char *format, va_list args, |
235 | | unsigned int *size_r) |
236 | | ATTR_FORMAT(1, 0) ATTR_RETURNS_NONNULL; |
237 | | char *vstrconcat(const char *str1, va_list args, size_t *ret_len) ATTR_MALLOC; |
238 | | |
239 | | #endif |