Fri, 23 May 2025 12:44:24 +0200
make test-compile depend on both static and shared
the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build
1143
0559812df10c
assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents:
1142
diff
changeset
|
1 | # String |
1141 | 2 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
3 | UCX strings store character arrays together with a length and come in two variants: immutable (`cxstring`) and mutable (`cxmutstr`). |
1141 | 4 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
5 | In general, UCX strings are *not* necessarily zero-terminated. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
6 | If a function guarantees to return a zero-terminated string, it is explicitly mentioned in the documentation. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
7 | As a rule of thumb, you _should not_ pass a character array of a UCX string structure to another API without explicitly |
1141 | 8 | ensuring that the string is zero-terminated. |
1142
9437530176bc
add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents:
1141
diff
changeset
|
9 | |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
10 | ## Basics |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
11 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
12 | > To make documentation simpler, we introduce the pseudo-type `AnyStr` with the meaning that |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
13 | > both `cxstring` and `cxmutstr` are accepted for that argument. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
14 | > The implementation is actually hidden behind a macro which uses `cx_strcast()` to guarantee compatibility. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
15 | {style="note"} |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
16 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
17 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
18 | #include <cx/string.h> |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
19 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
20 | struct cx_string_s {const char *ptr; size_t length;}; |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
21 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
22 | struct cx_mutstr_s {char *ptr; size_t length;}; |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
23 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
24 | typedef struct cx_string_s cxstring; |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
25 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
26 | typedef struct cx_mutstr_s cxmutstr; |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
27 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
28 | cxstring cx_str(const char *cstring); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
29 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
30 | cxstring cx_strn(const char *cstring, size_t length); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
31 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
32 | cxmutstr cx_mutstr(char *cstring); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
33 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
34 | cxmutstr cx_mutstrn(char *cstring, size_t length); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
35 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
36 | cxstring cx_strcast(AnyStr str); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
37 | |
1218
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
38 | cxmutstr cx_strdup(AnyStr string); |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
39 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
40 | cxmutstr cx_strdup_a(const CxAllocator *allocator, AnyStr string); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
41 | |
1304
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
42 | int cx_strcpy(cxmutstr *dest, cxstring source); |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
43 | |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
44 | int cx_strcpy_a(const CxAllocator *allocator, |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
45 | cxmutstr *dest, cxstring source); |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
46 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
47 | void cx_strfree(cxmutstr *str); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
48 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
49 | void cx_strfree_a(const CxAllocator *alloc, cxmutstr *str); |
1297
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
Mike Becker <universe@uap-core.de>
parents:
1226
diff
changeset
|
50 | |
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
Mike Becker <universe@uap-core.de>
parents:
1226
diff
changeset
|
51 | |
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
Mike Becker <universe@uap-core.de>
parents:
1226
diff
changeset
|
52 | #define CX_SFMT(s) (int) (s).length, (s).ptr |
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
Mike Becker <universe@uap-core.de>
parents:
1226
diff
changeset
|
53 | #define CX_PRIstr ".*s" |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
54 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
55 | |
1218
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
56 | The functions `cx_str()` and `cx_mutstr()` create a UCX string from a `const char*` or a `char*` |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
57 | and compute the length with a call to stdlib `strlen()`. |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
58 | In case you already know the length, or the string is not zero-terminated, you can use `cx_strn()` or `cx_mutstrn()`. |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
59 | |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
60 | The function `cx_strdup_a()` allocates new memory with the given `allocator` and copies the given `string` |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
61 | and guarantees that the result string is zero-terminated. |
1318
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents:
1304
diff
changeset
|
62 | The function `cx_strdup()` is equivalent to `cx_strdup_a()`, except that it uses the [default allocator](allocator.h.md#default-allocator). |
1218
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
63 | |
1304
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
64 | The functions `cx_strcpy_a()` and `cx_strcpy()` copy the contents of the `source` string to the `dest` string, |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
65 | and also guarantee zero-termination of the resulting string. |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
66 | The memory in `dest` is either freshly allocated or re-allocated to fit the size of the string plus the terminator. |
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
Mike Becker <universe@uap-core.de>
parents:
1297
diff
changeset
|
67 | |
1218
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
68 | Allocated strings are always of type `cxmutstr` and can be deallocated by a call to `cx_strfree()` or `cx_strfree_a()`. |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
69 | The caller must make sure to use the correct allocator for deallocating a string. |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
70 | It is safe to call these functions multiple times on a given string, as the pointer will be nulled and the length set to zero. |
cbb48edaf433
write Section about basic string functions
Mike Becker <universe@uap-core.de>
parents:
1217
diff
changeset
|
71 | It is also safe to call the functions with a `NULL`-pointer, just like any other `free()`-like function. |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
72 | |
1297
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
Mike Becker <universe@uap-core.de>
parents:
1226
diff
changeset
|
73 | When you want to use a UCX string in a `printf`-like function, you can use the macro `CX_PRIstr` for the format specifier, |
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
Mike Becker <universe@uap-core.de>
parents:
1226
diff
changeset
|
74 | and the `CX_SFMT(s)` macro to expand the arguments. |
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
Mike Becker <universe@uap-core.de>
parents:
1226
diff
changeset
|
75 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
76 | > When you want to convert a string _literal_ into a UCX string, you can also use the `CX_STR(lit)` macro. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
77 | > This macro uses the fact that `sizeof(lit)` for a string literal `lit` is always the string length plus one, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
78 | > effectively saving an invocation of `strlen()`. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
79 | > However, this only works for literals - in all other cases you must use `cx_str()` or `cx_strn`. |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
80 | |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
81 | ## Comparison |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
82 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
83 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
84 | #include <cx/string.h> |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
85 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
86 | int cx_strcmp(cxstring s1, cxstring s2); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
87 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
88 | int cx_strcmp_p(const void *s1, const void *s2); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
89 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
90 | bool cx_strprefix(cxstring string, cxstring prefix); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
91 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
92 | bool cx_strsuffix(cxstring string, cxstring suffix); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
93 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
94 | int cx_strcasecmp(cxstring s1, cxstring s2); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
95 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
96 | int cx_strcasecmp_p(const void *s1, const void *s2); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
97 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
98 | bool cx_strcaseprefix(cxstring string, cxstring prefix); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
99 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
100 | bool cx_strcasesuffix(cxstring string, cxstring suffix); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
101 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
102 | |
1219
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
103 | The `cx_strcmp()` function compares two UCX strings lexicographically |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
104 | and returns an integer greater than, equal to, or less than 0, if `s1` is greater than, equal to, or less than `s2`, respectively. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
105 | The `cx_strcmp_p()` function is equivalent, except that it takes pointers to the UCX strings and the signature is compatible with `cx_compare_func`. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
106 | |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
107 | The functions `cx_strprefix()` and `cx_strsuffic()` check if `string` starts with `prefix` or ends with `suffix`, respectively. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
108 | |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
109 | The functions `cx_strcasecmp()`, `cx_strcasecmp_p()`, `cx_strcaseprefix()`, and `cx_strcasesuffix()` are equivalent, |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
110 | except that they compare the strings case-insensitive. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
111 | |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
112 | > In the current version of UCX, case-insensitive comparisons are only guaranteed to work with ASCII characters. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
113 | {style="note"} |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
114 | |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
115 | ## Concatenation |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
116 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
117 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
118 | #include <cx/string.h> |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
119 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
120 | cxmutstr cx_strcat(size_t count, ... ); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
121 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
122 | cxmutstr cx_strcat_a(const CxAllocator *alloc, size_t count, ... ); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
123 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
124 | cxmutstr cx_strcat_m(cxmutstr str, size_t count, ... ); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
125 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
126 | cxmutstr cx_strcat_ma(const CxAllocator *alloc, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
127 | cxmutstr str, size_t count, ... ); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
128 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
129 | size_t cx_strlen(size_t count, ...); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
130 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
131 | |
1219
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
132 | The `cx_strcat_a()` function takes `count` UCX strings, |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
133 | allocates memory for a concatenation of those strings _with a single allocation_, |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
134 | and copies the contents of the strings to the new memory. |
1318
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents:
1304
diff
changeset
|
135 | `cx_strcat()` is equivalent, except that it uses the [default allocator](allocator.h.md#default-allocator). |
1219
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
136 | |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
137 | The `cx_strcat_ma()` and `cx_strcat_m()` append the `count` strings to the specified string `str` and, |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
138 | instead of allocating new memory, reallocate the existing memory in `str`. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
139 | If the pointer in `str` is `NULL`, there is no difference to `cx_strcat_a()`. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
140 | Note, that `count` always denotes the number of variadic arguments in _both_ variants. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
141 | |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
142 | The function `cx_strlen()` sums the length of the specified strings. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
143 | |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
144 | > There is no reason to use `cx_strlen()` for a single UCX string. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
145 | > Just access the `length` field of the structure directly. |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
146 | |
9c1c33ac077a
write section in string docu about comparisons and concatenation
Mike Becker <universe@uap-core.de>
parents:
1218
diff
changeset
|
147 | > You can mix `cxstring` and `cxmutstr` in the variadic arguments without the need of `cx_strcast()`. |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
148 | |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
149 | ## Find Characters and Substrings |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
150 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
151 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
152 | #include <cx/string.h> |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
153 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
154 | cxstring cx_strchr(cxstring string, int chr); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
155 | |
1220
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
156 | cxstring cx_strrchr(cxstring string, int chr); |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
157 | |
1220
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
158 | cxstring cx_strstr(cxstring string, cxstring search); |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
159 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
160 | cxstring cx_strsubs(cxstring string, size_t start); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
161 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
162 | cxstring cx_strsubsl(cxstring string, size_t start, size_t length); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
163 | |
1220
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
164 | cxstring cx_strtrim(cxstring string); |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
165 | |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
166 | cxmutstr cx_strchr_m(cxmutstr string, int chr); |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
167 | |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
168 | cxmutstr cx_strrchr_m(cxmutstr string, int chr); |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
169 | |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
170 | cxmutstr cx_strstr_m(cxmutstr string, cxstring search); |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
171 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
172 | cxmutstr cx_strsubs_m(cxmutstr string, size_t start); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
173 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
174 | cxmutstr cx_strsubsl_m(cxmutstr string, size_t start, size_t length); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
175 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
176 | cxmutstr cx_strtrim_m(cxmutstr string); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
177 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
178 | |
1220
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
179 | The functions `cx_strchr()`, `cx_strrchr()`, and `cx_strstr()`, behave like their stdlib counterparts. |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
180 | |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
181 | The function `cx_strsubs()` returns the substring starting at the specified `start` index, |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
182 | and `cx_strsubsl()` returns a substring with at most `length` bytes. |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
183 | |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
184 | The function `cx_strtrim()` returns the substring that results when removing all leading and trailing |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
185 | whitespace characters (a space character is one of the following string: `" \t\r\n\v\f"`). |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
186 | |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
187 | All functions with the `_m` suffix behave exactly the same as their counterparts without `_m` suffix, |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
188 | except that they operate on a `cxmustr`. |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
189 | In _both_ variants the functions return a view into the given `string` |
e9dfb1e92481
document substring family of functions
Mike Becker <universe@uap-core.de>
parents:
1219
diff
changeset
|
190 | and thus the returned strings must never be passed to `cx_strfree()`. |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
191 | |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
192 | ## Replace Substrings |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
193 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
194 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
195 | #include <cx/string.h> |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
196 | |
1221
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
197 | cxmutstr cx_strreplace(cxstring str, |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
198 | cxstring search, cxstring replacement); |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
199 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
200 | cxmutstr cx_strreplace_a(const CxAllocator *allocator, cxstring str, |
1221
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
201 | cxstring search, cxstring replacement); |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
202 | |
1221
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
203 | cxmutstr cx_strreplacen(cxstring str, |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
204 | cxstring search, cxstring replacement, size_t replmax); |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
205 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
206 | cxmutstr cx_strreplacen_a(const CxAllocator *allocator, cxstring str, |
1221
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
207 | cxstring search, cxstring replacement, size_t replmax); |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
208 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
209 | |
1221
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
210 | The function `cx_strreplace()` allocates a new string which will contain a copy of `str` |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
211 | where every occurrence of `search` is replaced with `replacement`. |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
212 | The new string is guaranteed to be zero-terminated even if `str` is not. |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
213 | |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
214 | The function `cx_strreplace_a()` uses the specified `allocator` to allocate the new string. |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
215 | |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
216 | The functions `cx_strreplacen()` and `cx_strreplacen_a()` are equivalent, except that they stop |
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
Mike Becker <universe@uap-core.de>
parents:
1220
diff
changeset
|
217 | after `replmax` number of replacements. |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
218 | |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
219 | ## Basic Splitting |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
220 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
221 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
222 | #include <cx/string.h> |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
223 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
224 | size_t cx_strsplit(cxstring string, cxstring delim, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
225 | size_t limit, cxstring *output); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
226 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
227 | size_t cx_strsplit_a(const CxAllocator *allocator, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
228 | cxstring string, cxstring delim, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
229 | size_t limit, cxstring **output); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
230 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
231 | size_t cx_strsplit_m(cxmutstr string, cxstring delim, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
232 | size_t limit, cxmutstr *output); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
233 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
234 | size_t cx_strsplit_ma(const CxAllocator *allocator, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
235 | cxmutstr string, cxstring delim, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
236 | size_t limit, cxmutstr **output); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
237 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
238 | |
1222
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
239 | The `cx_strsplit()` function splits the input `string` using the specified delimiter `delim` |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
240 | and writes the substrings into the pre-allocated `output` array. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
241 | The maximum number of resulting strings can be specified with `limit`. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
242 | That means, at most `limit-1` splits are performed. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
243 | The function returns the actual number of items written to `output`. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
244 | |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
245 | On the other hand, `cx_strsplit_a()` uses the specified `allocator` to allocate the output array, |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
246 | and writes the pointer to the allocated memory to `output`. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
247 | |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
248 | The functions `cx_strsplit_m()` and `cx_strsplit_ma()` are equivalent to `cx_strsplit()` and `cx_strsplit_a()`, |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
249 | except that they work on `cxmustr` instead of `cxstring`. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
250 | |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
251 | > The `allocator` in `cx_strsplit_a()` and `cx_strsplit_ma()` is _only_ used to allocate the output array. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
252 | > The strings will always point into the original `string` |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
253 | > and you need to use `cx_strdup()` or `cx_strdup_a()` if you want copies or zero-terminated strings after performing the split. |
952e712df557
add documentation for cx_strsplit()
Mike Becker <universe@uap-core.de>
parents:
1221
diff
changeset
|
254 | {style="note"} |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
255 | |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
256 | ## Complex Tokenization |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
257 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
258 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
259 | #include <cx/string.h> |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
260 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
261 | CxStrtokCtx cx_strtok(AnyStr str, AnyStr delim, size_t limit); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
262 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
263 | void cx_strtok_delim(CxStrtokCtx *ctx, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
264 | const cxstring *delim, size_t count); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
265 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
266 | bool cx_strtok_next(CxStrtokCtx *ctx, cxstring *token); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
267 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
268 | bool cx_strtok_next_m(CxStrtokCtx *ctx, cxmutstr *token); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
269 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
270 | |
1226
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
271 | You can tokenize a string by creating a _tokenization_ context with `cx_strtok()`, |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
272 | and calling `cx_strtok_next()` or `cx_strtok_next_m()` as long as they return `true`. |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
273 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
274 | The tokenization context is initialized with the string `str` to tokenize, |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
275 | one delimiter `delim`, and a `limit` for the maximum number of tokens. |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
276 | When `limit` is reached, the remaining part of `str` is returned as one single token. |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
277 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
278 | You can add additional delimiters to the context by calling `cx_strtok_delim()`, and |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
279 | specifying an array of delimiters to use. |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
280 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
281 | > Regardless of how the context was initialized, you can use either `cx_strtok_next()` |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
282 | > or `cx_strtok_next_m()` to retrieve the tokens. However, keep in mind that modifying |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
283 | > characters in a token returned by `cx_strtok_next_m()` has only defined behavior, when the |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
284 | > underlying `str` is a `cxmutstr`. |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
285 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
286 | ### Example |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
287 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
288 | ```C |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
289 | #include <cx/string.h> |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
290 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
291 | cxstring str = cx_str("an,arbitrarily;||separated;string"); |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
292 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
293 | // create the context |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
294 | CxStrtokCtx ctx = cx_strtok(str, CX_STR(","), 10); |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
295 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
296 | // add two more delimters |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
297 | cxstring delim_more[2] = {CX_STR("||"), CX_STR(";")}; |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
298 | cx_strtok_delim(&ctx, delim_more, 2); |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
299 | |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
300 | // iterate over the tokens |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
301 | cxstring tok; |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
302 | while(cx_strtok_next(&ctx, &tok)) { |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
303 | // to something with the tokens |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
304 | // be aware that tok is NOT zero-terminated! |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
305 | } |
129ef9bb1477
complete documentation for string.h
Mike Becker <universe@uap-core.de>
parents:
1222
diff
changeset
|
306 | ``` |
1165
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
307 | |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
308 | ## Conversion to Numbers |
e4e2c43d12c2
basic structur for the strings chapter
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
309 | |
1217
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
310 | For each integer type, as well as `float` and `double`, there are functions to convert a UCX string to a number of that type. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
311 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
312 | Integer conversion comes in two flavours: |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
313 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
314 | int cx_strtoi(AnyStr str, int *output, int base); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
315 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
316 | int cx_strtoi_lc(AnyStr str, int *output, int base, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
317 | const char *groupsep); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
318 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
319 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
320 | The basic variant takes a string of any UCX string type, a pointer to the `output` integer, and the `base` (one of 2, 8, 10, or 16). |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
321 | Conversion is attempted with respect to the specified `base` and respects possible special notations for that base. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
322 | Hexadecimal numbers may be prefixed with `0x`, `x`, or `#`, and binary numbers may be prefixed with `0b` or `b`. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
323 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
324 | The `_lc` versions of the integer conversion functions are equivalent, except that they allow the specification of an |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
325 | array of group separator chars, each of which is simply ignored during conversion. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
326 | The default group separator for the basic version is a comma `,`. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
327 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
328 | The signature for the floating point conversions is quite similar: |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
329 | ```C |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
330 | int cx_strtof(AnyStr str, float *output); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
331 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
332 | int cx_strtof_lc(AnyStr str, float *output, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
333 | char decsep, const char *groupsep); |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
334 | ``` |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
335 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
336 | The two differences are that the floating point versions do not support different bases, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
337 | and the `_lc` variant allows specifying not only an array of group separators, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
338 | but also the character used for the decimal separator. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
339 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
340 | In the basic variant, the group separator is again a comma `,`, and the decimal separator is a dot `.`. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
341 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
342 | > The floating point conversions of UCX 3.1 do not achieve the same precision as standard library implementations |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
343 | > which usually use more sophisticated algorithms. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
344 | > The precision might increase in future UCX releases, |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
345 | > but until then be aware of slight inaccuracies, in particular when working with `double`. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
346 | {style="warning"} |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
347 | |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
348 | > The UCX string to number conversions are intentionally not considering any locale settings |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
349 | > and are therefore independent of any global state. |
23f25e91d367
start documenting the string functions
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
350 | {style="note"} |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1165
diff
changeset
|
351 | |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1165
diff
changeset
|
352 | <seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1165
diff
changeset
|
353 | <category ref="apidoc"> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1165
diff
changeset
|
354 | <a href="https://ucx.sourceforge.io/api/string_8h.html">string.h</a> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1165
diff
changeset
|
355 | </category> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1165
diff
changeset
|
356 | </seealso> |