From 05350eca60b1c25ac97a6fc66c4e5fdf516cdb17 Mon Sep 17 00:00:00 2001 From: Gautham <41098605+ahgamut@users.noreply.github.com> Date: Thu, 10 Jun 2021 08:04:27 +0530 Subject: [PATCH] Added wcstok and wmemcmp (#183) --- libc/str/str.h | 1 + libc/str/wcstok.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++ libc/str/wmemcmp.c | 40 ++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 libc/str/wcstok.c create mode 100644 libc/str/wmemcmp.c diff --git a/libc/str/str.h b/libc/str/str.h index a5fc31167..a245c330e 100644 --- a/libc/str/str.h +++ b/libc/str/str.h @@ -165,6 +165,7 @@ char *strncpy(char *, const char *, size_t) memcpyesque; char *strtok(char *, const char *) paramsnonnull((2)) libcesque; char *strtok_r(char *, const char *, char **) paramsnonnull((2, 3)); uint16_t *strcpyzbw(uint16_t *, const char *) memcpyesque; +wchar_t *wcstok(wchar_t *, const wchar_t *, wchar_t **) paramsnonnull((2, 3)); char *wstrtrunc(uint16_t *) memcpyesque; char *wstrntrunc(uint16_t *, size_t) memcpyesque; bool startswith(const char *, const char *) strlenesque; diff --git a/libc/str/wcstok.c b/libc/str/wcstok.c new file mode 100644 index 000000000..4cbcf8a3a --- /dev/null +++ b/libc/str/wcstok.c @@ -0,0 +1,61 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ This is free and unencumbered software released into the public domain. │ +│ │ +│ Anyone is free to copy, modify, publish, use, compile, sell, or │ +│ distribute this software, either in source code form or as a compiled │ +│ binary, for any purpose, commercial or non-commercial, and by any │ +│ means. │ +│ │ +│ In jurisdictions that recognize copyright laws, the author or authors │ +│ of this software dedicate any and all copyright interest in the │ +│ software to the public domain. We make this dedication for the benefit │ +│ of the public at large and to the detriment of our heirs and │ +│ successors. We intend this dedication to be an overt act of │ +│ relinquishment in perpetuity of all present and future rights to this │ +│ software under copyright law. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ +│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ +│ OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +/** + * Extracts non-empty tokens from string. + * + * @param s is mutated and should be NULL on subsequent calls + * @param sep is a NUL-terminated set of wchars to consider separators + * @param state tracks progress between calls + * @return pointer to next token or NULL for end + */ +wchar_t *wcstok(wchar_t *s, const wchar_t *sep, wchar_t **state) { + size_t leadingseps, tokenlen; + if (!s) { + s = *state; + if (!s) { + return NULL; + } + } + leadingseps = wcsspn(s, sep); + s += leadingseps; + if (*s) { + tokenlen = wcscspn(s, sep); + if (s[tokenlen]) { + s[tokenlen] = L'\0'; + *state = &s[tokenlen + 1]; + return s; + } else if (tokenlen) { + s[tokenlen] = L'\0'; + *state = NULL; + return s; + } + } + return (*state = NULL); +} diff --git a/libc/str/wmemcmp.c b/libc/str/wmemcmp.c new file mode 100644 index 000000000..cae978ac7 --- /dev/null +++ b/libc/str/wmemcmp.c @@ -0,0 +1,40 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ This is free and unencumbered software released into the public domain. │ +│ │ +│ Anyone is free to copy, modify, publish, use, compile, sell, or │ +│ distribute this software, either in source code form or as a compiled │ +│ binary, for any purpose, commercial or non-commercial, and by any │ +│ means. │ +│ │ +│ In jurisdictions that recognize copyright laws, the author or authors │ +│ of this software dedicate any and all copyright interest in the │ +│ software to the public domain. We make this dedication for the benefit │ +│ of the public at large and to the detriment of our heirs and │ +│ successors. We intend this dedication to be an overt act of │ +│ relinquishment in perpetuity of all present and future rights to this │ +│ software under copyright law. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ +│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ +│ OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +/** + * Compares NUL-terminated wide strings w/ limit. + * + * @param a is first non-null NUL-terminated string pointer + * @param b is second non-null NUL-terminated string pointer + * @return is <0, 0, or >0 based on uint8_t comparison + * @asyncsignalsafe + */ +int wmemcmp(const wchar_t *a, const wchar_t *b, size_t n) { + return wcsncmp(a, b, n); +}