diff options
Diffstat (limited to 'src/mds-kbdc/string.c')
-rw-r--r-- | src/mds-kbdc/string.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/src/mds-kbdc/string.c b/src/mds-kbdc/string.c index ac3ef4b..69f8f25 100644 --- a/src/mds-kbdc/string.c +++ b/src/mds-kbdc/string.c @@ -20,29 +20,30 @@ #include <libmdsserver/macros.h> #include <stdlib.h> +#include <string.h> /** - * Get the length of a string. + * Get the length of a string * - * @param string The string. - * @return The length of the string. + * @param string The string + * @return The length of the string */ size_t string_length(const char32_t* restrict string) { size_t i = 0; - while (string[i] >= 0) + while (string[i] > -1) i++; return i; } /** - * Convert a NUL-terminated UTF-8 string to a -1-terminated UTF-32 string. + * Convert a NUL-terminated UTF-8 string to a -1-terminated UTF-32 string * - * @param string The UTF-8 string. - * @return The string in UTF-32, `NULL` on error. + * @param string The UTF-8 string + * @return The string in UTF-32, `NULL` on error */ char32_t* string_decode(const char* restrict string) { @@ -84,10 +85,12 @@ char32_t* string_decode(const char* restrict string) /** - * Convert a -1-terminated UTF-32 string to a NUL-terminated Modified UTF-8 string. + * Convert a -1-terminated UTF-32 string to a NUL-terminated Modified UTF-8 string * - * @param string The UTF-32 string. - * @return The string in UTF-8, `NULL` on error. + * Negative values apart from -1 are converted to 0x00 + * + * @param string The UTF-32 string + * @return The string in UTF-8, `NULL` on error */ char* string_encode(const char32_t* restrict string) { @@ -119,3 +122,24 @@ char* string_encode(const char32_t* restrict string) return rc[j] = '\0', rc; } + +/** + * Create duplicate of a string + * + * @param string The string + * @return A duplicate of the strnig, `NULL` on error or if `string` is `NULL` + */ +char32_t* string_dup(const char32_t* restrict string) +{ + size_t n; + char32_t* rc; + if (string == NULL) + return NULL; + n = string_length(string) + 1; + rc = malloc(n * sizeof(char32_t)); + if (rc == NULL) + return NULL; + memcpy(rc, string, n * sizeof(char32_t)); + return rc; +} + |