scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 09245abd272928c778c739e2402517a464b1a678
parent 1b9b9b8ada90d264546916bc65e2867ba3a0fca3
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date:   Tue, 25 Mar 2025 21:44:30 +0100

libc/wchar: Add wcsstr()

Diffstat:
Msrc/libc/objs/common-objs.mk | 1+
Asrc/libc/wchar/wcsstr.c | 22++++++++++++++++++++++
Mtests/libc/execute/.gitignore | 1+
Atests/libc/execute/0059-wcsstr.c | 32++++++++++++++++++++++++++++++++
Mtests/libc/execute/libc-tests.lst | 1+
5 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/src/libc/objs/common-objs.mk b/src/libc/objs/common-objs.mk @@ -135,6 +135,7 @@ COMMON_OBJS =\ wchar/wcsncat.$O\ wchar/wcschr.$O\ wchar/wcsrchr.$O\ + wchar/wcsstr.$O\ wchar/wcsrtombs.$O\ wchar/wcwidth.$O\ wchar/wmemchr.$O\ diff --git a/src/libc/wchar/wcsstr.c b/src/libc/wchar/wcsstr.c @@ -0,0 +1,22 @@ +#include <wchar.h> + +#undef wcsstr + +wchar_t * +wcsstr(const wchar_t *s1, const wchar_t *s2) +{ + wchar_t *p = (wchar_t *) s1; + wchar_t c = *s2; + size_t len; + + if ((len = wcslen(s2)) == 0) + return p; + + for ( ; p = wcschr(p, c); ++p) { + if (!wcsncmp(p, s2, len)) + return p; + } + + return NULL; +} + diff --git a/tests/libc/execute/.gitignore b/tests/libc/execute/.gitignore @@ -55,4 +55,5 @@ 0056-wcsncat 0057-wcschr 0058-wcsrchr +0059-wcsstr test.log diff --git a/tests/libc/execute/0059-wcsstr.c b/tests/libc/execute/0059-wcsstr.c @@ -0,0 +1,32 @@ +#include <assert.h> +#include <stdio.h> +#include <wchar.h> + +/* +output: +testing +done +end: +*/ + +int +main() +{ + wchar_t buf[30] = L"abc"; + + puts("testing"); + assert(wcsstr(buf, L"abc") == buf); + assert(wcsstr(buf, L"bc") == buf + 1); + assert(wcsstr(buf, L"c") == buf + 2); + assert(wcsstr(buf, L"d") == NULL); + wcscpy(buf, L"ababc"); + assert(wcsstr(buf, L"abc") == buf+2); + assert(wcsstr(L"", L"abc") == NULL); + assert(wcsstr(buf, L"") == buf); + buf[0] = '\0'; + assert(wcsstr(buf, L"") == buf); + puts("done"); + + return 0; +} + diff --git a/tests/libc/execute/libc-tests.lst b/tests/libc/execute/libc-tests.lst @@ -54,3 +54,4 @@ 0056-wcsncat 0057-wcschr 0058-wcsrchr +0059-wcsstr