docs/Writerside/topics/string.h.md

Thu, 25 Dec 2025 11:39:26 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 25 Dec 2025 11:39:26 +0100
changeset 1668
3ffdfe1776b4
parent 1667
608cc0b25352
child 1671
cf19b7820ff0
permissions
-rw-r--r--

add cx_strat()

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

mercurial