From 7e100ed6ee3981bcf12170f98fae46a873175661 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 18 Nov 2015 06:57:34 +0100 Subject: implement additional string.h and wchar.h functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/wchar/new.c | 336 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 src/wchar/new.c (limited to 'src/wchar') diff --git a/src/wchar/new.c b/src/wchar/new.c new file mode 100644 index 0000000..3f76087 --- /dev/null +++ b/src/wchar/new.c @@ -0,0 +1,336 @@ +/** + * slibc — Yet another C library + * Copyright © 2015 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include + + + +wchar_t* (wmemrchr)(const wchar_t* segment, wchar_t c, size_t size) /* slibc+gnu: completeness */ +{ + for (;;) + if (segment[--size] == c) + return segment + size; +} + +wchar_t* (rawwmemcasemem)(const wchar_t* haystack, const wchar_t* needle, size_t needle_length) /* slibc: completeness */ +{ + return (wmemcasemem)(haystack, SIZE_MAX, needle, needle_length); +} + +wchar_t* (rawwmemmem)(const wchar_t* haystack, const wchar_t* needle, size_t needle_length) /* slibc: completeness */ +{ + return (wmemmem)(haystack, SIZE_MAX, needle, needle_length); +} + +wchar_t* (wmemccasemem)(const wchar_t* haystack, size_t haystack_length, const wchar_t* needle, size_t needle_length, wchar_t stop) /* slibc: completeness */ +{ + const wchar_t* p = wmemchr(haystack, stop, haystack_length); + return (wmemcasemem)(haystack, p ? (size_t)(p - haystack) : haystack_length, needle, needle_length); +} + +wchar_t* (wmemcmem)(const wchar_t* haystack, size_t haystack_length, const wchar_t* needle, size_t needle_length, wchar_t stop) /* slibc: completeness */ +{ + const wchar_t* p = wmemchr(haystack, stop, haystack_length); + return (wmemmem)(haystack, p ? (size_t)(p - haystack) : haystack_length, needle, needle_length); +} + +wchar_t* (wcsccasestr)(const wchar_t* haystack, const wchar_t* needle, wchar_t stop) /* slibc: completeness */ +{ + return (wmemcasemem)(haystack, wscclen(haystack, stop), needle, wsclen(needle)); +} + +wchar_t* (wcscstr)(const wchar_t* haystack, const wchar_t* needle, wchar_t stop) /* slibc: completeness */ +{ + return (wmemmem)(haystack, wscclen(haystack, stop), needle, wsclen(needle)); +} + +wchar_t* (wcscncasestr)(const wchar_t* haystack, const wchar_t* needle, wchar_t stop, size_t maxlen) /* slibc: completeness */ +{ + return (wmemcasemem)(haystack, wsccnlen(haystack, stop, maxlen), needle, wsclen(needle)); +} + +wchar_t* (wcscnstr)(const wchar_t* haystack, const wchar_t* needle, wchar_t stop, size_t maxlen) /* slibc: completeness */ +{ + return (wmemmem)(haystack, wsccnlen(haystack, stop, maxlen), needle, wsclen(needle)); +} + +size_t wscclen(const wchar_t* string, wchar_t stop) /* slibc: completeness */ +{ + return (size_t)(wscchrnul(string, stop) - string); +} + +size_t wsccnlen(const wchar_t* string, wchar_t stop, size_t maxlen) /* slibc: completeness */ +{ + const wchar_t* end = wscnchr(string, stop, maxlen); + return end ? (size_t)(end - string) : maxlen; +} + +size_t wscstrlen(const wchar_t* string, const wchar_t* stop) /* slibc: completeness */ +{ + const wchar_t* end = wscstr(string, stop); + return end ? (size_t)(end - string) : wsclen(string); +} + +size_t wscstrnlen(const wchar_t* string, const wchar_t* stop, size_t maxlen) /* slibc: completeness */ +{ + const wchar_t* end = wscnstr(string, stop, maxlen); + return end ? (size_t)(end - string) : maxlen; +} + +wchar_t* (wcsnchr)(const wchar_t* string, wchar_t c, size_t maxlen) /* slibc: completeness */ +{ + for (;;) + if (*string == c) + return string; + else if (!*string++ || !maxlen--) + return NULL; +} + +wchar_t* (wcsnchrnul)(const wchar_t* string, wchar_t c, size_t maxlen) /* slibc+gnu: completeness */ +{ + for (;; string++) + if (*string == c) + return string; + else if (!*string || !maxlen--) + return string; +} + +wchar_t* (wmemcchr)(const wchar_t* segment, wchar_t c, wchar_t stop, size_t size) /* slibc: completeness */ +{ + wchar_t* s = segment; + for (;;) + if (*s == c) + return s; + else if ((*s++ == stop) || !size--) + return NULL; +} + +wchar_t* (wcscchr)(const wchar_t* string, wchar_t c, wchar_t stop) /* slibc: completeness */ +{ + for (;;) + if (*string == c) + return string; + else if (!*string || (*string++ == stop)) + return NULL; +} + +wchar_t* (wcscnchr)(const wchar_t* string, wchar_t c, wchar_t stop, size_t maxlen) /* slibc: completeness */ +{ + for (;;) + if (*string == c) + return string; + else if (!*string || (*string++ == stop) || !maxlen--) + return NULL; +} + +wchar_t* (wcscchrnul)(const wchar_t* string, wchar_t c, wchar_t stop) /* slibc+gnu: completeness */ +{ + for (;; string++) + if (*string == c) + return string; + else if (!*string || (*string == stop)) + return string; +} + +wchar_t* (wcscnchrnul)(const wchar_t* string, wchar_t c, wchar_t stop, size_t maxlen) /* slibc+gnu: completeness */ +{ + for (;; string++) + if (*string == c) + return string; + else if (!*string || (*string == stop) || !maxlen--) + return string; +} + +wchar_t* (wcsnrchr)(const wchar_t* string, wchar_t c, size_t maxlen) /* slibc: completeness */ +{ + wchar_t* r = NULL; + while (maxlen--) + if (*string == c) + r = string; + else if (!*string++) + return c ? r : (string - 1); +} + +void* (wmemcrchr)(const void* segment, wchar_t c, wchar_t stop, size_t size) /* slibc: completeness */ +{ + wchar_t* r = NULL; + for (;; size--) + if (*segment == c) + r = segment; + else if ((*segment == stop) || !size) + return r; +} + +wchar_t* (wcscrchr)(const wchar_t* string, wchar_t c, wchar_t stop) /* slibc: completeness */ +{ + wchar_t* r = NULL; + for (;;) + if (*string == c) + r = string; + else if (!*string++) + return c ? r : (string - 1); + else if (*string == stop) + return r; +} + +wchar_t* (wcscnrchr)(const wchar_t* string, wchar_t c, wchar_t stop, size_t maxlen) /* slibc: completeness */ +{ + wchar_t* r = NULL; + while (maxlen--) + if (*string == c) + r = string; + else if (!*string++) + return c ? r : (string - 1); +} + +wchar_t* wcsnsep(wchar_t** restrict string, const wchar_t* restrict delimiters, + size_t* restrict maxlen) /* slibc: completeness */ +{ + wchar_t* r = *string; + wchar_t* next; + if (r == NULL) + return NULL; + + next = wcsnpbrk(r, delimiters, *maxlen); + if (next != NULL) + *next++ = 0, *maxlen -= (size_t)(next - r); + *string = next; + + return r; +} + +wchar_t* wcsntok(wchar_t* restrict string, const wchar_t* restrict delimiters, + wchar_t** restrict state, size_t* restrict maxlen) /* slibc: completeness */ +{ + wchar_t* r; + if (string == NULL) + *state = string; + for (;;) + { + r = wcsnsep(state, delimiters, maxlen); + if (r == NULL) + return NULL; + if (*r) + return r; + } +} + +wchar_t* (wcspcbrk)(const wchar_t* string, const wchar_t* skipset) /* slibc: completeness */ +{ + string += wcsspn(string, skipset); + return *string ? string : NULL; +} + +wchar_t* (wcsnpbrk)(const wchar_t* string, const wchar_t* stopset, size_t maxlen) /* slibc: completeness */ +{ + wchar_t s = string; + string += wcsncspn(string, stopset, maxlen); + return (((size_t)(string - s) < maxlen) && *string) ? string : NULL; +} + +wchar_t* (wcsnpcbrk)(const wchar_t* string, const wchar_t* skipset, size_t maxlen) /* slibc: completeness */ +{ + wchar_t s = string; + string += wcsnspn(string, skipset, maxlen); + return (((size_t)(string - s) < maxlen) && *string) ? string : NULL; +} + +wchar_t* (wcspbrknul)(const wchar_t* string, const wchar_t* stopset) /* slibc: completeness */ +{ + return string + wcscspn(string, stopset); +} + +wchar_t* (wcspcbrknul)(const wchar_t* string, const wchar_t* skipset) /* slibc: completeness */ +{ + return string + wcsspn(string, skipset); +} + +wchar_t* (wcsnpbrknul)(const wchar_t* string, const wchar_t* stopset, size_t maxlen) /* slibc: completeness */ +{ + return string + wcscspn(string, stopset, maxlen); +} + +wchar_t* (wcsnpcbrknul)(const wchar_t* string, const wchar_t* skipset, size_t maxlen) /* slibc: completeness */ +{ + return string + wcsspn(string, skipset, maxlen); +} + +size_t wcsnspn(const wchar_t* string, const wchar_t* skipset, size_t maxlen) /* slibc: completeness */ +{ + wchar_t* s = string; + wchar_t c; + for (; maxlen && ((c = *s++)); maxlen--) + if (wcschr(skipset, c) == NULL) + break; + return (size_t)(s - !!maxlen - string); +} + +size_t wcsncspn(const wchar_t* string, const wchar_t* stopset, size_t maxlen) /* slibc: completeness */ +{ + size_t i, end = wcsnlen(string, maxlen); + wchar_t* s; + wchar_t c; + while ((c = *stopset++)) + for (i = 0, s = string; i < end; i++, s++) + if (*s == c) + { + end = (size_t)(s - string); + break; + } + return end; +} + +wchar_t* (wcsprbrk)(const wchar_t* string, const wchar_t* stopset) /* slibc: completeness */ +{ + wchar_t* r; + int found = 0; + while (string) + if ((r = wcspbrk(string + 1, stopset))) + string = r, found = 1; + return found ? string : NULL; +} + +wchar_t* (wcsprcbrk)(const wchar_t* string, const wchar_t* skipset) /* slibc: completeness */ +{ + wchar_t* r; + int found = 0; + while (string) + if ((r = wcspcbrk(string + 1, skipset))) + string = r, found = 1; + return found ? string : NULL; +} + +wchar_t* (wcsnprbrk)(const wchar_t* string, const wchar_t* stopset, size_t maxlen) /* slibc: completeness */ +{ + wchar_t* r; + int found = 0; + while (string) + if ((r = wcsnpbrk(string + 1, stopset, maxlen - 1))) + maxlen -= (r - string), string = r, found = 1; + return found ? string : NULL; +} + +wchar_t* (wcsnprcbrk)(const wchar_t* string, const wchar_t* skipset, size_t maxlen) /* slibc: completeness */ +{ + wchar_t* r; + int found = 0; + while (string) + if ((r = wcsnpcbrk(string + 1, skipset, maxlen - 1))) + maxlen -= (r - string), string = r, found = 1; + return found ? string : NULL; +} + -- cgit v1.2.3-70-g09d2