| 33 | 33 | 
| 34 cxmutstr cx_mutstrn(char *cstring, size_t length); | 34 cxmutstr cx_mutstrn(char *cstring, size_t length); | 
| 35 | 35 | 
| 36 cxstring cx_strcast(AnyStr str); | 36 cxstring cx_strcast(AnyStr str); | 
| 37 | 37 | 
| 38 cxmutstr cx_strdupa(AnyStr string); | 38 cxmutstr cx_strdup(AnyStr string); | 
| 39 | 39 | 
| 40 cxmutstr cx_strdup_a(const CxAllocator *allocator, AnyStr string); | 40 cxmutstr cx_strdup_a(const CxAllocator *allocator, AnyStr string); | 
| 41 | 41 | 
| 42 void cx_strfree(cxmutstr *str); | 42 void cx_strfree(cxmutstr *str); | 
| 43 | 43 | 
| 44 void cx_strfree_a(const CxAllocator *alloc, cxmutstr *str); | 44 void cx_strfree_a(const CxAllocator *alloc, cxmutstr *str); | 
| 45 ``` | 45 ``` | 
| 46 | 46 | 
| 47 > Documentation work in progress. | 47 The functions `cx_str()` and `cx_mutstr()` create a UCX string from a `const char*` or a `char*` | 
| 48 >{style="warning"} | 48 and compute the length with a call to stdlib `strlen()`. | 
|  | 49 In case you already know the length, or the string is not zero-terminated, you can use `cx_strn()` or `cx_mutstrn()`. | 
|  | 50 | 
|  | 51 The function `cx_strdup_a()` allocates new memory with the given `allocator` and copies the given `string` | 
|  | 52 and guarantees that the result string is zero-terminated. | 
|  | 53 The function `cx_strdup()` is equivalent to `cx_strdup_a()`, except that it uses the default stdlib allocator. | 
|  | 54 | 
|  | 55 Allocated strings are always of type `cxmutstr` and can be deallocated by a call to `cx_strfree()` or `cx_strfree_a()`. | 
|  | 56 The caller must make sure to use the correct allocator for deallocating a string. | 
|  | 57 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. | 
|  | 58 It is also safe to call the functions with a `NULL`-pointer, just like any other `free()`-like function. | 
| 49 | 59 | 
| 50 > When you want to convert a string _literal_ into a UCX string, you can also use the `CX_STR(lit)` macro. | 60 > When you want to convert a string _literal_ into a UCX string, you can also use the `CX_STR(lit)` macro. | 
| 51 > This macro uses the fact that `sizeof(lit)` for a string literal `lit` is always the string length plus one, | 61 > This macro uses the fact that `sizeof(lit)` for a string literal `lit` is always the string length plus one, | 
| 52 > effectively saving an invocation of `strlen()`. | 62 > effectively saving an invocation of `strlen()`. | 
| 53 > However, this only works for literals - in all other cases you must use `cx_str()` or `cx_strn`. | 63 > However, this only works for literals - in all other cases you must use `cx_str()` or `cx_strn`. |