LLVM OpenMP 23.0.0git
TestKmpStr.cpp
Go to the documentation of this file.
1//===- TestKmpStr.cpp - Tests for kmp_str utilities ----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "kmp_str.h"
10#include "gtest/gtest.h"
11#include <cstring>
12
13namespace {
14
15// Test basic string buffer initialization
16TEST(KmpStrTest, BufferInit) {
17 kmp_str_buf_t buffer;
18 __kmp_str_buf_init(&buffer);
19
20 EXPECT_NE(buffer.str, nullptr);
21 EXPECT_GT(buffer.size, 0u);
22 EXPECT_EQ(buffer.used, 0);
23 EXPECT_EQ(buffer.str[0], '\0');
24}
25
26// Test string buffer clear
27TEST(KmpStrTest, BufferClear) {
28 kmp_str_buf_t buffer;
29 __kmp_str_buf_init(&buffer);
30 __kmp_str_buf_print(&buffer, "test string");
31
32 EXPECT_GT(buffer.used, 0);
33
34 __kmp_str_buf_clear(&buffer);
35 EXPECT_EQ(buffer.used, 0);
36 EXPECT_EQ(buffer.str[0], '\0');
37
38 __kmp_str_buf_free(&buffer);
39}
40
41// Test string buffer print
42TEST(KmpStrTest, BufferPrint) {
43 kmp_str_buf_t buffer;
44 __kmp_str_buf_init(&buffer);
45
46 __kmp_str_buf_print(&buffer, "Hello, %s!", "World");
47
48 EXPECT_STREQ(buffer.str, "Hello, World!");
49 EXPECT_EQ(buffer.used, 13);
50
51 __kmp_str_buf_free(&buffer);
52}
53
54// Test string buffer concatenation
55TEST(KmpStrTest, BufferCat) {
56 kmp_str_buf_t buffer;
57 __kmp_str_buf_init(&buffer);
58
59 __kmp_str_buf_cat(&buffer, "Hello", 5);
60 __kmp_str_buf_cat(&buffer, " ", 1);
61 __kmp_str_buf_cat(&buffer, "World", 5);
62
63 EXPECT_STREQ(buffer.str, "Hello World");
64
65 __kmp_str_buf_free(&buffer);
66}
67
68// Test string buffer reservation
69TEST(KmpStrTest, BufferReserve) {
70 kmp_str_buf_t buffer;
71 __kmp_str_buf_init(&buffer);
72
73 size_t large_size = 2048;
74 __kmp_str_buf_reserve(&buffer, large_size);
75
76 EXPECT_GE(buffer.size, large_size);
77
78 __kmp_str_buf_free(&buffer);
79}
80
81// Test basic string to int conversion
82TEST(KmpStrTest, BasicStrToInt) {
83 EXPECT_EQ(__kmp_basic_str_to_int("0"), 0);
84 EXPECT_EQ(__kmp_basic_str_to_int("1"), 1);
85 EXPECT_EQ(__kmp_basic_str_to_int("42"), 42);
86 EXPECT_EQ(__kmp_basic_str_to_int("123"), 123);
87}
88
89// Test basic string to int conversion with invalid inputs
90TEST(KmpStrTest, BasicStrToIntInvalid) {
91 // Empty string returns 0
92 EXPECT_EQ(__kmp_basic_str_to_int(""), 0);
93
94 // Strings starting with non-digits return 0
95 EXPECT_EQ(__kmp_basic_str_to_int("abc"), 0);
96 EXPECT_EQ(__kmp_basic_str_to_int("hello"), 0);
97 EXPECT_EQ(__kmp_basic_str_to_int("xyz123"), 0);
98
99 // Special characters return 0
100 EXPECT_EQ(__kmp_basic_str_to_int("!@#"), 0);
101 EXPECT_EQ(__kmp_basic_str_to_int("+42"), 0);
102 EXPECT_EQ(__kmp_basic_str_to_int("-42"), 0);
103
104 // Leading whitespace causes early stop (returns 0)
105 EXPECT_EQ(__kmp_basic_str_to_int(" 42"), 0);
106 EXPECT_EQ(__kmp_basic_str_to_int("\t42"), 0);
107
108 // Mixed content: parses digits until first non-digit
109 EXPECT_EQ(__kmp_basic_str_to_int("123abc"), 123);
110 EXPECT_EQ(__kmp_basic_str_to_int("42 "), 42);
111 EXPECT_EQ(__kmp_basic_str_to_int("7.5"), 7);
112}
113
114// Test string match
115TEST(KmpStrTest, StrMatch) {
116 const char *data = "Hello World";
117
118 // Test exact match (len == 0)
119 EXPECT_TRUE(__kmp_str_match("Hello World", 0, data));
120 EXPECT_FALSE(__kmp_str_match("Hello", 0, data)); // Not exact (data is longer)
121
122 // Test prefix match (len < 0)
123 EXPECT_TRUE(
124 __kmp_str_match("Hello", -1, data)); // "Hello" is prefix of "Hello World"
125 EXPECT_FALSE(__kmp_str_match("World", -1, data)); // "World" is not a prefix
126
127 // Test minimum length match (len > 0)
128 EXPECT_TRUE(__kmp_str_match("Hello", 5, data)); // At least 5 chars match
129 EXPECT_TRUE(__kmp_str_match("Hello", 3, data)); // At least 3 chars match
130 EXPECT_FALSE(__kmp_str_match("World", 5, data)); // First chars don't match
131}
132
133// Test string contains
134TEST(KmpStrTest, StrContains) {
135 const char *data = "Hello World";
136
137 EXPECT_TRUE(__kmp_str_contains("Hello", 5, data));
138 EXPECT_TRUE(__kmp_str_contains("World", 5, data));
139 EXPECT_TRUE(__kmp_str_contains("lo Wo", 5, data));
140 EXPECT_FALSE(__kmp_str_contains("Goodbye", 7, data));
141}
142
143// Test string match for true/false values
144TEST(KmpStrTest, MatchBool) {
145 // Test true values
146 EXPECT_TRUE(__kmp_str_match_true("true"));
147 EXPECT_TRUE(__kmp_str_match_true("TRUE"));
148 EXPECT_TRUE(__kmp_str_match_true("on"));
149 EXPECT_TRUE(__kmp_str_match_true("ON"));
150 EXPECT_TRUE(__kmp_str_match_true("1"));
151 EXPECT_TRUE(__kmp_str_match_true("yes"));
152 EXPECT_TRUE(__kmp_str_match_true("YES"));
153
154 // Test false values
155 EXPECT_TRUE(__kmp_str_match_false("false"));
156 EXPECT_TRUE(__kmp_str_match_false("FALSE"));
157 EXPECT_TRUE(__kmp_str_match_false("off"));
158 EXPECT_TRUE(__kmp_str_match_false("OFF"));
159 EXPECT_TRUE(__kmp_str_match_false("0"));
160 EXPECT_TRUE(__kmp_str_match_false("no"));
161 EXPECT_TRUE(__kmp_str_match_false("NO"));
162
163 // Note: Trailing characters after a valid prefix still match due to
164 // minimum-length prefix matching (e.g., "true" uses len=1, "yes" uses len=1)
165 EXPECT_TRUE(__kmp_str_match_true("true "));
166 EXPECT_TRUE(__kmp_str_match_false("false "));
167 EXPECT_TRUE(__kmp_str_match_true("truex"));
168 EXPECT_TRUE(__kmp_str_match_false("falsex"));
169
170 // Partial prefixes also match due to minimum-length matching
171 EXPECT_TRUE(__kmp_str_match_true("t"));
172 EXPECT_TRUE(__kmp_str_match_true("tru"));
173 EXPECT_TRUE(__kmp_str_match_false("f"));
174 EXPECT_TRUE(__kmp_str_match_false("fals"));
175 EXPECT_TRUE(__kmp_str_match_true("y"));
176 EXPECT_TRUE(__kmp_str_match_true("yess"));
177 EXPECT_TRUE(__kmp_str_match_false("n"));
178 EXPECT_TRUE(__kmp_str_match_false("noo"));
179
180 // "on" and "off" require at least 2 characters
181 EXPECT_TRUE(__kmp_str_match_true("on"));
182 EXPECT_TRUE(__kmp_str_match_false("of"));
183 EXPECT_TRUE(__kmp_str_match_false("off"));
184
185 // "enabled" and "disabled" require exact match (len=0)
186 EXPECT_TRUE(__kmp_str_match_true("enabled"));
187 EXPECT_TRUE(__kmp_str_match_false("disabled"));
188}
189
190// Test string match for invalid bool values
191TEST(KmpStrTest, MatchBoolInvalid) {
192 // Empty string is neither true nor false
193 EXPECT_FALSE(__kmp_str_match_true(""));
194 EXPECT_FALSE(__kmp_str_match_false(""));
195
196 // Random strings are neither true nor false
197 EXPECT_FALSE(__kmp_str_match_true("hello"));
198 EXPECT_FALSE(__kmp_str_match_false("hello"));
199 EXPECT_FALSE(__kmp_str_match_true("abc"));
200 EXPECT_FALSE(__kmp_str_match_false("abc"));
201
202 // Numbers other than 0/1 are neither true nor false
203 EXPECT_FALSE(__kmp_str_match_true("2"));
204 EXPECT_FALSE(__kmp_str_match_false("2"));
205 EXPECT_FALSE(__kmp_str_match_true("42"));
206 EXPECT_FALSE(__kmp_str_match_false("42"));
207 EXPECT_FALSE(__kmp_str_match_true("-1"));
208 EXPECT_FALSE(__kmp_str_match_false("-1"));
209
210 // Leading whitespace prevents matching
211 EXPECT_FALSE(__kmp_str_match_true(" true"));
212 EXPECT_FALSE(__kmp_str_match_false(" false"));
213
214 // "on" and "off" require at least 2 characters
215 EXPECT_FALSE(__kmp_str_match_true("o"));
216 EXPECT_FALSE(__kmp_str_match_false("o"));
217
218 // "enabled" and "disabled" require exact match (len=0)
219 EXPECT_FALSE(__kmp_str_match_true("enable"));
220 EXPECT_FALSE(__kmp_str_match_false("disable"));
221
222 // True values don't match as false and vice versa
223 EXPECT_FALSE(__kmp_str_match_false("true"));
224 EXPECT_FALSE(__kmp_str_match_false("1"));
225 EXPECT_FALSE(__kmp_str_match_false("yes"));
226 EXPECT_FALSE(__kmp_str_match_true("false"));
227 EXPECT_FALSE(__kmp_str_match_true("0"));
228 EXPECT_FALSE(__kmp_str_match_true("no"));
229}
230
231// Test string replace
232TEST(KmpStrTest, StrReplace) {
233 char str[] = "Hello World";
234 __kmp_str_replace(str, ' ', '_');
235 EXPECT_STREQ(str, "Hello_World");
236
237 __kmp_str_replace(str, 'o', '0');
238 EXPECT_STREQ(str, "Hell0_W0rld");
239}
240
241// Test string split
242TEST(KmpStrTest, StrSplit) {
243 char str[] = "key=value";
244 char *head = nullptr;
245 char *tail = nullptr;
246
247 __kmp_str_split(str, '=', &head, &tail);
248
249 EXPECT_STREQ(head, "key");
250 EXPECT_STREQ(tail, "value");
251}
252
253// Test file name parsing
254TEST(KmpStrTest, FileNameInit) {
255 const char *path = "/path/to/file.txt";
256 kmp_str_fname_t fname;
257 __kmp_str_fname_init(&fname, path);
258
259 EXPECT_NE(fname.path, nullptr);
260 EXPECT_STREQ(fname.path, path);
261 EXPECT_NE(fname.base, nullptr);
262 EXPECT_STREQ(fname.base, "file.txt");
263
264 __kmp_str_fname_free(&fname);
265}
266
267// Test string format
268TEST(KmpStrTest, StrFormat) {
269 char *result = __kmp_str_format("Number: %d, String: %s", 42, "test");
270
271 EXPECT_NE(result, nullptr);
272 EXPECT_STREQ(result, "Number: 42, String: test");
273
275 EXPECT_EQ(result, nullptr);
276}
277
278// Test string buffer concatenate buffers
279TEST(KmpStrTest, BufferCatBuf) {
280 kmp_str_buf_t buf1, buf2;
281 __kmp_str_buf_init(&buf1);
282 __kmp_str_buf_init(&buf2);
283
284 __kmp_str_buf_print(&buf1, "Hello");
285 __kmp_str_buf_print(&buf2, " World");
286
287 __kmp_str_buf_catbuf(&buf1, &buf2);
288
289 EXPECT_STREQ(buf1.str, "Hello World");
290
291 __kmp_str_buf_free(&buf1);
292 __kmp_str_buf_free(&buf2);
293}
294
295// Test size string parsing
296TEST(KmpStrTest, StrToSize) {
297 size_t result;
298 const char *error = nullptr;
299
300 __kmp_str_to_size("100", &result, 1, &error);
301 EXPECT_EQ(error, nullptr);
302 EXPECT_EQ(result, 100u);
303
304 __kmp_str_to_size("1K", &result, 1024, &error);
305 EXPECT_EQ(error, nullptr);
306 EXPECT_EQ(result, 1024u);
307
308 __kmp_str_to_size("2M", &result, 1024, &error);
309 EXPECT_EQ(error, nullptr);
310 EXPECT_EQ(result, 2u * 1024u * 1024u);
311}
312
313// Test uint string parsing
314TEST(KmpStrTest, StrToUint) {
316 const char *error = nullptr;
317
318 __kmp_str_to_uint("0", &result, &error);
319 EXPECT_EQ(error, nullptr);
320 EXPECT_EQ(result, 0u);
321
322 __kmp_str_to_uint("42", &result, &error);
323 EXPECT_EQ(error, nullptr);
324 EXPECT_EQ(result, 42u);
325
326 __kmp_str_to_uint("1234567890", &result, &error);
327 EXPECT_EQ(error, nullptr);
328 EXPECT_EQ(result, 1234567890u);
329}
330
331} // namespace
#define TEST(test_suite_name, test_name)
int result[2]
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void * data
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event ITT_FORMAT __itt_group_mark d void const wchar_t const wchar_t int ITT_FORMAT __itt_group_sync __itt_group_fsync x void const wchar_t int const wchar_t int int ITT_FORMAT __itt_group_sync __itt_group_fsync x void ITT_FORMAT __itt_group_sync __itt_group_fsync p void ITT_FORMAT __itt_group_sync __itt_group_fsync p void size_t ITT_FORMAT lu no args __itt_obj_prop_t __itt_obj_state_t ITT_FORMAT d const char ITT_FORMAT s const char ITT_FORMAT s __itt_frame ITT_FORMAT p __itt_counter ITT_FORMAT p __itt_counter unsigned long long ITT_FORMAT lu __itt_counter unsigned long long ITT_FORMAT lu __itt_counter __itt_clock_domain unsigned long long void ITT_FORMAT p const wchar_t ITT_FORMAT S __itt_mark_type const wchar_t ITT_FORMAT S __itt_mark_type const char ITT_FORMAT s __itt_mark_type ITT_FORMAT d __itt_caller ITT_FORMAT p __itt_caller ITT_FORMAT p no args const __itt_domain __itt_clock_domain unsigned long long __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_id void ITT_FORMAT p const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_string_handle __itt_scope ITT_FORMAT d const __itt_domain __itt_scope __itt_string_handle const char size_t ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_relation __itt_id ITT_FORMAT lu __itt_track_group __itt_string_handle __itt_track_group_type ITT_FORMAT d __itt_track ITT_FORMAT p void int const int int const char int ITT_FORMAT d void void const char * path
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id head
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id tail
unsigned long long kmp_uint64
void __kmp_str_fname_init(kmp_str_fname_t *fname, char const *path)
Definition kmp_str.cpp:246
void __kmp_str_to_uint(char const *str, kmp_uint64 *out, char const **error)
Definition kmp_str.cpp:807
void __kmp_str_to_size(char const *str, size_t *out, size_t dfactor, char const **error)
Definition kmp_str.cpp:706
void __kmp_str_fname_free(kmp_str_fname_t *fname)
Definition kmp_str.cpp:277
void __kmp_str_split(char *str, char delim, char **head, char **tail)
Definition kmp_str.cpp:571
void __kmp_str_buf_clear(kmp_str_buf_t *buffer)
Definition kmp_str.cpp:71
void __kmp_str_replace(char *str, char search_for, char replace_with)
Definition kmp_str.cpp:561
bool __kmp_str_contains(char const *target, int len, char const *data)
Definition kmp_str.cpp:520
void __kmp_str_buf_reserve(kmp_str_buf_t *buffer, size_t size)
Definition kmp_str.cpp:80
int __kmp_str_match(char const *target, int len, char const *data)
Definition kmp_str.cpp:505
void __kmp_str_buf_free(kmp_str_buf_t *buffer)
Definition kmp_str.cpp:123
char * __kmp_str_format(char const *format,...)
Definition kmp_str.cpp:448
int __kmp_str_match_true(char const *data)
Definition kmp_str.cpp:552
void __kmp_str_buf_cat(kmp_str_buf_t *buffer, char const *str, size_t len)
Definition kmp_str.cpp:134
int __kmp_basic_str_to_int(char const *str)
Definition kmp_str.cpp:622
void __kmp_str_buf_catbuf(kmp_str_buf_t *dest, const kmp_str_buf_t *src)
Definition kmp_str.cpp:146
int __kmp_str_buf_print(kmp_str_buf_t *buffer, char const *format,...)
Definition kmp_str.cpp:221
int __kmp_str_match_false(char const *data)
Definition kmp_str.cpp:543
void __kmp_str_free(char **str)
Definition kmp_str.cpp:494
struct kmp_str_fname kmp_str_fname_t
Definition kmp_str.h:72
struct kmp_str_buf kmp_str_buf_t
Definition kmp_str.h:38
#define __kmp_str_buf_init(b)
Definition kmp_str.h:40
unsigned int size
Definition kmp_str.h:34
char * str
Definition kmp_str.h:33
char * base
Definition kmp_str.h:70
char * path
Definition kmp_str.h:68