Thu, 30 Oct 2025 19:27:18 +0100
fix typo bug in cxListDifference() - resolves #745
| 1143 
0559812df10c
assign proper names to the documentation topics
 Mike Becker <universe@uap-core.de> parents: 
1142diff
changeset | 1 | # String | 
| 1141 | 2 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 5 | In general, UCX strings are *not* necessarily zero-terminated. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
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: 
1141diff
changeset | 9 | |
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 10 | ## Basics | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 11 | |
| 1332 
02946dc73e6a
add support for C-strings in cx_strcast() - resolves #549
 Mike Becker <universe@uap-core.de> parents: 
1318diff
changeset | 12 | > To simplify documentation, we introduce the pseudo-type `AnyStr` with the meaning that | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 13 | > both `cxstring` and `cxmutstr` are accepted for that argument. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 15 | {style="note"} | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 16 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 17 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 18 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 19 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 21 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 22 | struct cx_mutstr_s {char *ptr; size_t length;}; | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 23 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 24 | typedef struct cx_string_s cxstring; | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 25 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 26 | typedef struct cx_mutstr_s cxmutstr; | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 27 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 28 | cxstring cx_str(const char *cstring); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 29 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 30 | cxstring cx_strn(const char *cstring, size_t length); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 31 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 32 | cxmutstr cx_mutstr(char *cstring); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 33 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 34 | cxmutstr cx_mutstrn(char *cstring, size_t length); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 35 | |
| 1218 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 36 | cxmutstr cx_strdup(AnyStr string); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 37 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 38 | cxmutstr cx_strdup_a(const CxAllocator *allocator, AnyStr string); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 39 | |
| 1304 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 40 | int cx_strcpy(cxmutstr *dest, cxstring source); | 
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 41 | |
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 42 | int cx_strcpy_a(const CxAllocator *allocator, | 
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 43 | cxmutstr *dest, cxstring source); | 
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 44 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 45 | void cx_strfree(cxmutstr *str); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 46 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 47 | 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: 
1226diff
changeset | 48 | |
| 
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
 Mike Becker <universe@uap-core.de> parents: 
1226diff
changeset | 49 | |
| 
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
 Mike Becker <universe@uap-core.de> parents: 
1226diff
changeset | 50 | #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: 
1226diff
changeset | 51 | #define CX_PRIstr ".*s" | 
| 1332 
02946dc73e6a
add support for C-strings in cx_strcast() - resolves #549
 Mike Becker <universe@uap-core.de> parents: 
1318diff
changeset | 52 | #define cx_strcast(s) // converts any string to cxstring | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 53 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 54 | |
| 1218 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 55 | The functions `cx_str()` and `cx_mutstr()` create a UCX string from a `const char*` or a `char*` | 
| 1334 
7763892ed801
allow NULL for creating UCX strings - resolves #683
 Mike Becker <universe@uap-core.de> parents: 
1332diff
changeset | 56 | and compute the length with a call to stdlib `strlen()` (except for `NULL` in which case the length is set to zero). | 
| 1218 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 57 | 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: 
1217diff
changeset | 58 | |
| 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 59 | 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: 
1217diff
changeset | 60 | and guarantees that the result string is zero-terminated. | 
| 1318 
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
 Mike Becker <universe@uap-core.de> parents: 
1304diff
changeset | 61 | 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: 
1217diff
changeset | 62 | |
| 1304 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 63 | 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: 
1297diff
changeset | 64 | and also guarantee zero-termination of the resulting string. | 
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 65 | 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: 
1297diff
changeset | 66 | |
| 1218 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 67 | 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: 
1217diff
changeset | 68 | 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: 
1217diff
changeset | 69 | 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: 
1217diff
changeset | 70 | 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: 
1190diff
changeset | 71 | |
| 1297 
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
 Mike Becker <universe@uap-core.de> parents: 
1226diff
changeset | 72 | 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: 
1226diff
changeset | 73 | 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: 
1226diff
changeset | 74 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 75 | > 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: 
1190diff
changeset | 76 | > 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: 
1190diff
changeset | 77 | > effectively saving an invocation of `strlen()`. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 78 | > 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: 
1146diff
changeset | 79 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 80 | ## Comparison | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 81 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 82 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 83 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 84 | |
| 1426 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 85 | int cx_strcmp(AnyStr s1, AnyStr s2); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 86 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 87 | int cx_strcmp_p(const void *s1, const void *s2); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 88 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 89 | int cx_strcasecmp_p(const void *s1, const void *s2); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 90 | |
| 1426 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 91 | bool cx_strprefix(AnyStr string, AnyStr prefix); | 
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 92 | |
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 93 | bool cx_strsuffix(AnyStr string, AnyStr suffix); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 94 | |
| 1426 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 95 | int cx_strcasecmp(AnyStr s1, AnyStr s2); | 
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 96 | |
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 97 | bool cx_strcaseprefix(AnyStr string, AnyStr prefix); | 
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 98 | |
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 99 | bool cx_strcasesuffix(AnyStr string, AnyStr suffix); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 100 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 101 | |
| 1426 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 102 | The `cx_strcmp()` function compares two strings lexicographically | 
| 1219 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 103 | and returns an integer greater than, equal to, or less than 0, if `s1` is greater than, equal to, or less than `s2`, respectively. | 
| 1426 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 104 | |
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 105 | The `cx_strcmp_p()` function takes pointers to UCX strings (i.e., only to `cxstring` and `cxmutstr`) and the signature is compatible with `cx_compare_func`. | 
| 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 Mike Becker <universe@uap-core.de> parents: 
1424diff
changeset | 106 | Use this as a compare function for lists or other data structures. | 
| 1219 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 107 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 108 | 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: 
1218diff
changeset | 109 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 110 | 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: 
1218diff
changeset | 111 | 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: 
1218diff
changeset | 112 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 113 | > 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: 
1218diff
changeset | 114 | {style="note"} | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 115 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 116 | ## Concatenation | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 117 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 118 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 119 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 120 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 121 | cxmutstr cx_strcat(size_t count, ... ); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 122 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 123 | cxmutstr cx_strcat_a(const CxAllocator *alloc, size_t count, ... ); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 124 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 125 | cxmutstr cx_strcat_m(cxmutstr str, size_t count, ... ); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 126 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 127 | cxmutstr cx_strcat_ma(const CxAllocator *alloc, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 128 | cxmutstr str, size_t count, ... ); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 129 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 130 | size_t cx_strlen(size_t count, ...); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 131 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 132 | |
| 1219 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 133 | 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: 
1218diff
changeset | 134 | 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: 
1218diff
changeset | 135 | 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: 
1304diff
changeset | 136 | `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: 
1218diff
changeset | 137 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 138 | 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: 
1218diff
changeset | 139 | 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: 
1218diff
changeset | 140 | 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: 
1218diff
changeset | 141 | 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: 
1218diff
changeset | 142 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 143 | 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: 
1218diff
changeset | 144 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 145 | > There is no reason to use `cx_strlen()` for a single UCX string. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1334diff
changeset | 146 | > You can access the `length` field of the structure directly. | 
| 1219 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 147 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 148 | > 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: 
1146diff
changeset | 149 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 150 | ## Find Characters and Substrings | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 151 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 152 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 153 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 154 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 155 | cxstring cx_strchr(cxstring string, int chr); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 156 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 157 | cxstring cx_strrchr(cxstring string, int chr); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 158 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 159 | cxstring cx_strstr(cxstring string, cxstring search); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 160 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 161 | cxstring cx_strsubs(cxstring string, size_t start); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 162 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 163 | cxstring cx_strsubsl(cxstring string, size_t start, size_t length); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 164 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 165 | cxstring cx_strtrim(cxstring string); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 166 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 167 | cxmutstr cx_strchr_m(cxmutstr string, int chr); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 168 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 169 | cxmutstr cx_strrchr_m(cxmutstr string, int chr); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 170 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 171 | cxmutstr cx_strstr_m(cxmutstr string, cxstring search); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 172 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 173 | cxmutstr cx_strsubs_m(cxmutstr string, size_t start); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 174 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 175 | 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: 
1190diff
changeset | 176 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 177 | cxmutstr cx_strtrim_m(cxmutstr string); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 178 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 179 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 180 | 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: 
1219diff
changeset | 181 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 182 | 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: 
1219diff
changeset | 183 | and `cx_strsubsl()` returns a substring with at most `length` bytes. | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 184 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 185 | The function `cx_strtrim()` returns the substring that results when removing all leading and trailing | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1334diff
changeset | 186 | whitespace characters. | 
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 187 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 188 | 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: 
1219diff
changeset | 189 | except that they operate on a `cxmustr`. | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 190 | 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: 
1219diff
changeset | 191 | 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: 
1146diff
changeset | 192 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 193 | ## Replace Substrings | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 194 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 195 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 196 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 197 | |
| 1221 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 198 | cxmutstr cx_strreplace(cxstring str, | 
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 199 | cxstring search, cxstring replacement); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 200 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 201 | 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: 
1220diff
changeset | 202 | cxstring search, cxstring replacement); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 203 | |
| 1221 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 204 | cxmutstr cx_strreplacen(cxstring str, | 
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 205 | cxstring search, cxstring replacement, size_t replmax); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 206 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 207 | 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: 
1220diff
changeset | 208 | cxstring search, cxstring replacement, size_t replmax); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 209 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 210 | |
| 1221 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 211 | 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: 
1220diff
changeset | 212 | 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: 
1220diff
changeset | 213 | 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: 
1220diff
changeset | 214 | |
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 215 | 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: 
1220diff
changeset | 216 | |
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 217 | 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: 
1220diff
changeset | 218 | after `replmax` number of replacements. | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 219 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 220 | ## Basic Splitting | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 221 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 222 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 223 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 224 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 225 | size_t cx_strsplit(cxstring string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 226 | size_t limit, cxstring *output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 227 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 228 | size_t cx_strsplit_a(const CxAllocator *allocator, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 229 | cxstring string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 230 | size_t limit, cxstring **output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 231 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 232 | size_t cx_strsplit_m(cxmutstr string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 233 | size_t limit, cxmutstr *output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 234 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 235 | size_t cx_strsplit_ma(const CxAllocator *allocator, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 236 | cxmutstr string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 237 | size_t limit, cxmutstr **output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 238 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 239 | |
| 1222 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 240 | 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: 
1221diff
changeset | 241 | and writes the substrings into the pre-allocated `output` array. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 242 | The maximum number of resulting strings can be specified with `limit`. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 243 | That means, at most `limit-1` splits are performed. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 244 | The function returns the actual number of items written to `output`. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 245 | |
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 246 | 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: 
1221diff
changeset | 247 | and writes the pointer to the allocated memory to `output`. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 248 | |
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 249 | 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: 
1221diff
changeset | 250 | except that they work on `cxmustr` instead of `cxstring`. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 251 | |
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 252 | > 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: 
1221diff
changeset | 253 | > The strings will always point into the original `string` | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 254 | > 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: 
1221diff
changeset | 255 | {style="note"} | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 256 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 257 | ## Complex Tokenization | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 258 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 259 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 260 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 261 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 262 | CxStrtokCtx cx_strtok(AnyStr str, AnyStr delim, size_t limit); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 263 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 264 | void cx_strtok_delim(CxStrtokCtx *ctx, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 265 | const cxstring *delim, size_t count); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 266 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 267 | bool cx_strtok_next(CxStrtokCtx *ctx, cxstring *token); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 268 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 269 | bool cx_strtok_next_m(CxStrtokCtx *ctx, cxmutstr *token); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 270 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 271 | |
| 1226 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 272 | 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: 
1222diff
changeset | 273 | 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: 
1222diff
changeset | 274 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 275 | The tokenization context is initialized with the string `str` to tokenize, | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 276 | 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: 
1222diff
changeset | 277 | 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: 
1222diff
changeset | 278 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 279 | 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: 
1222diff
changeset | 280 | specifying an array of delimiters to use. | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 281 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 282 | > 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: 
1222diff
changeset | 283 | > 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: 
1222diff
changeset | 284 | > 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: 
1222diff
changeset | 285 | > underlying `str` is a `cxmutstr`. | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 286 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 287 | ### Example | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 288 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 289 | ```C | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 290 | #include <cx/string.h> | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 291 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 292 | cxstring str = cx_str("an,arbitrarily;||separated;string"); | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 293 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 294 | // create the context | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 295 | CxStrtokCtx ctx = cx_strtok(str, CX_STR(","), 10); | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 296 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 297 | // add two more delimters | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 298 | cxstring delim_more[2] = {CX_STR("||"), CX_STR(";")}; | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 299 | cx_strtok_delim(&ctx, delim_more, 2); | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 300 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 301 | // iterate over the tokens | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 302 | cxstring tok; | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 303 | while(cx_strtok_next(&ctx, &tok)) { | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 304 | // to something with the tokens | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 305 | // be aware that tok is NOT zero-terminated! | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 306 | } | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 307 | ``` | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 308 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 309 | ## Conversion to Numbers | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 310 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1334diff
changeset | 311 | For each integer type, as well as `float` and `double`, there are functions to convert a UCX string to a value of those types. | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 312 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1334diff
changeset | 313 | Integer conversion comes in two flavors: | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 314 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 315 | int cx_strtoi(AnyStr str, int *output, int base); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 316 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 317 | int cx_strtoi_lc(AnyStr str, int *output, int base, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 318 | const char *groupsep); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 319 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 320 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 321 | 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: 
1190diff
changeset | 322 | 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: 
1190diff
changeset | 323 | 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: 
1190diff
changeset | 324 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 325 | 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: 
1190diff
changeset | 326 | 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: 
1190diff
changeset | 327 | The default group separator for the basic version is a comma `,`. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 328 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1334diff
changeset | 329 | The signature for the floating-point conversions is quite similar: | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 330 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 331 | int cx_strtof(AnyStr str, float *output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 332 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 333 | int cx_strtof_lc(AnyStr str, float *output, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 334 | char decsep, const char *groupsep); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 335 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 336 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1334diff
changeset | 337 | The two differences are that the floating-point versions do not support different bases, | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 338 | 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: 
1190diff
changeset | 339 | but also the character used for the decimal separator. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 340 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 341 | 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: 
1190diff
changeset | 342 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1334diff
changeset | 343 | > The floating-point conversions of UCX 3.1 do not achieve the same precision as standard library implementations | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 344 | > which usually use more sophisticated algorithms. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 345 | > The precision might increase in future UCX releases, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 346 | > 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: 
1190diff
changeset | 347 | {style="warning"} | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 348 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 349 | > 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: 
1190diff
changeset | 350 | > and are therefore independent of any global state. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 351 | {style="note"} | 
| 1190 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 352 | |
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 353 | <seealso> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 354 | <category ref="apidoc"> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 355 | <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: 
1165diff
changeset | 356 | </category> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 357 | </seealso> |