Sun, 20 Apr 2025 10:41:25 +0200
some cxListIterator() variants now also allow NULL lists
| 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 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
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 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 36 | cxstring cx_strcast(AnyStr str); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 37 | |
| 1218 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 38 | cxmutstr cx_strdup(AnyStr string); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 39 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 40 | cxmutstr cx_strdup_a(const CxAllocator *allocator, AnyStr string); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 41 | |
| 1304 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 42 | int cx_strcpy(cxmutstr *dest, cxstring source); | 
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 43 | |
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 44 | int cx_strcpy_a(const CxAllocator *allocator, | 
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 45 | cxmutstr *dest, cxstring source); | 
| 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
changeset | 46 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 47 | void cx_strfree(cxmutstr *str); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 48 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1226diff
changeset | 50 | |
| 
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
 Mike Becker <universe@uap-core.de> parents: 
1226diff
changeset | 51 | |
| 
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
 Mike Becker <universe@uap-core.de> parents: 
1226diff
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: 
1226diff
changeset | 53 | #define CX_PRIstr ".*s" | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 54 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 55 | |
| 1218 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
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: 
1217diff
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: 
1217diff
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: 
1217diff
changeset | 59 | |
| 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
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: 
1217diff
changeset | 61 | and guarantees that the result string is zero-terminated. | 
| 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 62 | The function `cx_strdup()` is equivalent to `cx_strdup_a()`, except that it uses the default stdlib allocator. | 
| 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
changeset | 63 | |
| 1304 
57e062a4bb05
adds cx_strcpy() and cx_strcpy_a()
 Mike Becker <universe@uap-core.de> parents: 
1297diff
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: 
1297diff
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: 
1297diff
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: 
1297diff
changeset | 67 | |
| 1218 
cbb48edaf433
write Section about basic string functions
 Mike Becker <universe@uap-core.de> parents: 
1217diff
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: 
1217diff
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: 
1217diff
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: 
1217diff
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: 
1190diff
changeset | 72 | |
| 1297 
0811fb9a8dba
bring back CX_PRIstr and CX_SFMT macros - resolves #612
 Mike Becker <universe@uap-core.de> parents: 
1226diff
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: 
1226diff
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: 
1226diff
changeset | 75 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
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: 
1190diff
changeset | 78 | > effectively saving an invocation of `strlen()`. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1146diff
changeset | 80 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 81 | ## Comparison | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 82 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 83 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 84 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 85 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 86 | int cx_strcmp(cxstring s1, cxstring s2); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 87 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 89 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 90 | bool cx_strprefix(cxstring string, cxstring prefix); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 91 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 92 | bool cx_strsuffix(cxstring string, cxstring suffix); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 93 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 94 | int cx_strcasecmp(cxstring s1, cxstring s2); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 95 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 97 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 98 | bool cx_strcaseprefix(cxstring string, cxstring prefix); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 99 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 100 | bool cx_strcasesuffix(cxstring string, cxstring suffix); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 101 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 102 | |
| 1219 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
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: 
1218diff
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: 
1218diff
changeset | 106 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
changeset | 108 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
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: 
1218diff
changeset | 111 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
changeset | 113 | {style="note"} | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 114 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 115 | ## Concatenation | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 116 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 117 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 118 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 119 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 120 | cxmutstr cx_strcat(size_t count, ... ); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 121 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 123 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 124 | cxmutstr cx_strcat_m(cxmutstr str, size_t count, ... ); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 125 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 126 | cxmutstr cx_strcat_ma(const CxAllocator *alloc, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 127 | cxmutstr str, size_t count, ... ); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 128 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 129 | size_t cx_strlen(size_t count, ...); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 130 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 131 | |
| 1219 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
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: 
1218diff
changeset | 134 | and copies the contents of the strings to the new memory. | 
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 135 | `cx_strcat()` is equivalent, except that is uses the default stdlib allocator. | 
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
changeset | 136 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
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: 
1218diff
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: 
1218diff
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: 
1218diff
changeset | 141 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
changeset | 143 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1218diff
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: 
1218diff
changeset | 146 | |
| 
9c1c33ac077a
write section in string docu about comparisons and concatenation
 Mike Becker <universe@uap-core.de> parents: 
1218diff
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: 
1146diff
changeset | 148 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 149 | ## Find Characters and Substrings | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 150 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 151 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 152 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 153 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 154 | cxstring cx_strchr(cxstring string, int chr); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 155 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 156 | cxstring cx_strrchr(cxstring string, int chr); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 157 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 158 | cxstring cx_strstr(cxstring string, cxstring search); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 159 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 160 | cxstring cx_strsubs(cxstring string, size_t start); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 161 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 163 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 164 | cxstring cx_strtrim(cxstring string); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 165 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 166 | cxmutstr cx_strchr_m(cxmutstr string, int chr); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 167 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 168 | cxmutstr cx_strrchr_m(cxmutstr string, int chr); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 169 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 170 | cxmutstr cx_strstr_m(cxmutstr string, cxstring search); | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
changeset | 171 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 172 | cxmutstr cx_strsubs_m(cxmutstr string, size_t start); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 173 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 175 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 176 | cxmutstr cx_strtrim_m(cxmutstr string); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 177 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 178 | |
| 1220 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
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: 
1219diff
changeset | 180 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
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: 
1219diff
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: 
1219diff
changeset | 183 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
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: 
1219diff
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: 
1219diff
changeset | 186 | |
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
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: 
1219diff
changeset | 188 | except that they operate on a `cxmustr`. | 
| 
e9dfb1e92481
document substring family of functions
 Mike Becker <universe@uap-core.de> parents: 
1219diff
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: 
1219diff
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: 
1146diff
changeset | 191 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 192 | ## Replace Substrings | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 193 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 194 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 195 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 196 | |
| 1221 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 197 | cxmutstr cx_strreplace(cxstring str, | 
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 198 | cxstring search, cxstring replacement); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 199 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1220diff
changeset | 201 | cxstring search, cxstring replacement); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 202 | |
| 1221 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 203 | cxmutstr cx_strreplacen(cxstring str, | 
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
changeset | 204 | cxstring search, cxstring replacement, size_t replmax); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 205 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1220diff
changeset | 207 | cxstring search, cxstring replacement, size_t replmax); | 
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 208 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 209 | |
| 1221 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
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: 
1220diff
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: 
1220diff
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: 
1220diff
changeset | 213 | |
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
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: 
1220diff
changeset | 215 | |
| 
304f4f7b37d1
document cx_strreplace() family of functions and improve docstrings
 Mike Becker <universe@uap-core.de> parents: 
1220diff
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: 
1220diff
changeset | 217 | after `replmax` number of replacements. | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 218 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 219 | ## Basic Splitting | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 220 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 221 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 222 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 223 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 224 | size_t cx_strsplit(cxstring string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 225 | size_t limit, cxstring *output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 226 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 227 | size_t cx_strsplit_a(const CxAllocator *allocator, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 228 | cxstring string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 229 | size_t limit, cxstring **output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 230 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 231 | size_t cx_strsplit_m(cxmutstr string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 232 | size_t limit, cxmutstr *output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 233 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 234 | size_t cx_strsplit_ma(const CxAllocator *allocator, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 235 | cxmutstr string, cxstring delim, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 236 | size_t limit, cxmutstr **output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 237 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 238 | |
| 1222 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
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: 
1221diff
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: 
1221diff
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: 
1221diff
changeset | 242 | That means, at most `limit-1` splits are performed. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
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: 
1221diff
changeset | 244 | |
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
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: 
1221diff
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: 
1221diff
changeset | 247 | |
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
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: 
1221diff
changeset | 249 | except that they work on `cxmustr` instead of `cxstring`. | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
changeset | 250 | |
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
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: 
1221diff
changeset | 252 | > The strings will always point into the original `string` | 
| 
952e712df557
add documentation for cx_strsplit()
 Mike Becker <universe@uap-core.de> parents: 
1221diff
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: 
1221diff
changeset | 254 | {style="note"} | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 255 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 256 | ## Complex Tokenization | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 257 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 258 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 259 | #include <cx/string.h> | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 260 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 262 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 263 | void cx_strtok_delim(CxStrtokCtx *ctx, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 264 | const cxstring *delim, size_t count); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 265 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 266 | bool cx_strtok_next(CxStrtokCtx *ctx, cxstring *token); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 267 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 268 | bool cx_strtok_next_m(CxStrtokCtx *ctx, cxmutstr *token); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 269 | ``` | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 270 | |
| 1226 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
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: 
1222diff
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: 
1222diff
changeset | 273 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
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: 
1222diff
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: 
1222diff
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: 
1222diff
changeset | 277 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
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: 
1222diff
changeset | 279 | specifying an array of delimiters to use. | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 280 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
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: 
1222diff
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: 
1222diff
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: 
1222diff
changeset | 284 | > underlying `str` is a `cxmutstr`. | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 285 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 286 | ### Example | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 287 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 288 | ```C | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 289 | #include <cx/string.h> | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 290 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 291 | cxstring str = cx_str("an,arbitrarily;||separated;string"); | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 292 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 293 | // create the context | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 294 | CxStrtokCtx ctx = cx_strtok(str, CX_STR(","), 10); | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 295 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 296 | // add two more delimters | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 297 | cxstring delim_more[2] = {CX_STR("||"), CX_STR(";")}; | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 298 | cx_strtok_delim(&ctx, delim_more, 2); | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 299 | |
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 300 | // iterate over the tokens | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 301 | cxstring tok; | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 302 | while(cx_strtok_next(&ctx, &tok)) { | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 303 | // to something with the tokens | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 304 | // be aware that tok is NOT zero-terminated! | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 305 | } | 
| 
129ef9bb1477
complete documentation for string.h
 Mike Becker <universe@uap-core.de> parents: 
1222diff
changeset | 306 | ``` | 
| 1165 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 307 | |
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 308 | ## Conversion to Numbers | 
| 
e4e2c43d12c2
basic structur for the strings chapter
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 309 | |
| 1217 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 311 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 312 | Integer conversion comes in two flavours: | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 313 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 314 | int cx_strtoi(AnyStr str, int *output, int base); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 315 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 317 | const char *groupsep); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 318 | ``` | 
| 
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 | 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 | 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: 
1190diff
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: 
1190diff
changeset | 323 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
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: 
1190diff
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: 
1190diff
changeset | 327 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 329 | ```C | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 330 | int cx_strtof(AnyStr str, float *output); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 331 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 332 | int cx_strtof_lc(AnyStr str, float *output, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 333 | char decsep, const char *groupsep); | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 334 | ``` | 
| 
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 | 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: 
1190diff
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: 
1190diff
changeset | 338 | but also the character used for the decimal separator. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 339 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 341 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 343 | > which usually use more sophisticated algorithms. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 344 | > The precision might increase in future UCX releases, | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 346 | {style="warning"} | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 347 | |
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 349 | > and are therefore independent of any global state. | 
| 
23f25e91d367
start documenting the string functions
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 350 | {style="note"} | 
| 1190 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 351 | |
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 352 | <seealso> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 353 | <category ref="apidoc"> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
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: 
1165diff
changeset | 355 | </category> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1165diff
changeset | 356 | </seealso> |