scc

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

commit a378af318684a868015e1efa73b14ab525d3ac27
parent c675740de75457783b309d357f586a768cf31fed
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date:   Thu, 20 Mar 2025 20:28:37 +0100

tests/libc: Add 0041-mbrlen()

Diffstat:
Mtests/libc/execute/0039-mbrtowc.c | 46++--------------------------------------------
Atests/libc/execute/0041-mbrlen.c | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtests/libc/execute/libc-tests.lst | 1+
Atests/libc/execute/mbtest.h | 43+++++++++++++++++++++++++++++++++++++++++++
4 files changed, 121 insertions(+), 44 deletions(-)

diff --git a/tests/libc/execute/0039-mbrtowc.c b/tests/libc/execute/0039-mbrtowc.c @@ -5,6 +5,8 @@ #include <string.h> #include <wchar.h> +#include "mbtest.h" + /* output: testing @@ -17,50 +19,6 @@ end: #define NELEM(x) (sizeof(x)/sizeof(x[0])) -static wchar_t wc; -static struct mbtest { - char *s; - int l; - int r; - int mbstate; - int syserr; - wchar_t *pwc; - wchar_t wc; -} tests[] = { - {"\0", 2, 0, 1, 0, &wc, 0}, - {"\x21", 2, 1, 1, 0, &wc, 0x21}, - {"\xc2\xa1", 3, 2, 1, 0, &wc, 0x00A1}, - {"\xc2\xa1", 2, 2, 1, 0, &wc, 0x00A1}, - {"\xe2\x80\x94", 4, 3, 1, 0, &wc, 0x2014}, - {"\xf0\x9f\x92\xa9", 5, 4, 1, 0, &wc, 0x01F4A9}, - {"\xf0\x9f\x92\xa9", 5, 4, 1, 0, NULL, -1}, - {"\xf0\x9f\x92\xa9", -1, 4, 1, 0, &wc, 0x01F4A9}, - - {NULL, 4, 0, 1, 0, NULL, -1}, - {"\xed\x9f\xbf", 4, 3, 1, 0, &wc, 0xd7ff}, - {"\xed\xa0\x80", 4, -1, 1, EILSEQ, &wc, -1}, - {"\xed\xb3\xbf", 4, -1, 1, EILSEQ, &wc, -1}, - {"\xed\xb4\x80", 4, 3, 1, 0, &wc, 0xdd00}, - - {"\xf0\x9f\x92\xa9", 3, -2, 0, 0, &wc, -1}, - {"\xa9", 2, 1, 1, 0, &wc, 0x01F4A9}, - {"\xf0\x9f\x92\xa9", 3, -2, 0, 0, &wc, -1}, - {NULL, 4, -1, 1, EILSEQ, &wc, -1}, - {"\xa9", 2, -1, 1, EILSEQ, &wc, -1}, - {"\xf0\x9f\x92\xa9", 3, -2, 0, 0, &wc, -1}, - {NULL, 4, -1, 1, EILSEQ, &wc, -1}, - {"\x21", 2, 1, 1, 0, &wc, 0x21}, - {"\xf0\x9f\x92\xa9", 2, -2, 0, 0, &wc, -1}, - {"\xf0\x9f\x92\xa9", 0, -2, 0, 0, &wc, -1}, - {"\x92\xa9", 2, 2, 1, 0, &wc, 0x01F4A9}, - - {"\x80", 2, -1, 1, EILSEQ, &wc, -1}, - {"\xc0\x80", 2, -1, 1, EILSEQ, &wc, -1}, - {"\xc0\x00", 2, -1, 1, EILSEQ, &wc, -1}, - {"\xf8\x81\x82\x83\x84\x85", -1, -1, 1, EILSEQ, &wc, -1}, - {"\xfe\x81\x82\x83\x84\x85\x86", 8, -1, 1, EILSEQ, &wc, -1}, -}; - void tests_mbrtowc(void) { diff --git a/tests/libc/execute/0041-mbrlen.c b/tests/libc/execute/0041-mbrlen.c @@ -0,0 +1,75 @@ +#include <assert.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +#include "mbtest.h" + +/* +output: +testing +testing mbrlen1 +testing mbrlen2 +testing mblen +done +end: +*/ + +#define NELEM(x) (sizeof(x)/sizeof(x[0])) + +void +tests_mbrlen(void) +{ + struct mbtest *tp; + int r; + mbstate_t s; + + puts("testing mbrlen1"); + for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { + wc = -1; + errno = 0; + r = mbrlen(tp->s, tp->l, NULL); + assert(tp->r == r); + assert(tp->syserr == errno); + } + + puts("testing mbrlen2"); + memset(&s, 0, sizeof(s)); + for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { + wc = -1; + errno = 0; + r = mbrlen(tp->s, tp->l, &s); + assert(tp->r == r); + assert(tp->syserr == errno); + assert(mbsinit(&s) != 0 == tp->mbstate); + } +} + +void +tests_mblen(void) +{ + struct mbtest *tp; + int r, rt; + + puts("testing mblen"); + for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { + wc = -1; + errno = 0; + r = mblen(tp->s, tp->l); + assert(tp->syserr == errno); + rt = (tp->r >= 0) ? tp->r : -1; + assert(rt == r); + } +} + +int +main() +{ + puts("testing"); + tests_mbrlen(); + tests_mblen(); + puts("done"); + return 0; +} diff --git a/tests/libc/execute/libc-tests.lst b/tests/libc/execute/libc-tests.lst @@ -37,3 +37,4 @@ 0038-mbsinit 0039-mbrtowc 0040-wcrtomb +0041-mbrlen diff --git a/tests/libc/execute/mbtest.h b/tests/libc/execute/mbtest.h @@ -0,0 +1,43 @@ +static wchar_t wc; +static struct mbtest { + char *s; + int l; + int r; + int mbstate; + int syserr; + wchar_t *pwc; + wchar_t wc; +} tests[] = { + {"\0", 2, 0, 1, 0, &wc, 0}, + {"\x21", 2, 1, 1, 0, &wc, 0x21}, + {"\xc2\xa1", 3, 2, 1, 0, &wc, 0x00A1}, + {"\xc2\xa1", 2, 2, 1, 0, &wc, 0x00A1}, + {"\xe2\x80\x94", 4, 3, 1, 0, &wc, 0x2014}, + {"\xf0\x9f\x92\xa9", 5, 4, 1, 0, &wc, 0x01F4A9}, + {"\xf0\x9f\x92\xa9", 5, 4, 1, 0, NULL, -1}, + {"\xf0\x9f\x92\xa9", -1, 4, 1, 0, &wc, 0x01F4A9}, + + {NULL, 4, 0, 1, 0, NULL, -1}, + {"\xed\x9f\xbf", 4, 3, 1, 0, &wc, 0xd7ff}, + {"\xed\xa0\x80", 4, -1, 1, EILSEQ, &wc, -1}, + {"\xed\xb3\xbf", 4, -1, 1, EILSEQ, &wc, -1}, + {"\xed\xb4\x80", 4, 3, 1, 0, &wc, 0xdd00}, + + {"\xf0\x9f\x92\xa9", 3, -2, 0, 0, &wc, -1}, + {"\xa9", 2, 1, 1, 0, &wc, 0x01F4A9}, + {"\xf0\x9f\x92\xa9", 3, -2, 0, 0, &wc, -1}, + {NULL, 4, -1, 1, EILSEQ, &wc, -1}, + {"\xa9", 2, -1, 1, EILSEQ, &wc, -1}, + {"\xf0\x9f\x92\xa9", 3, -2, 0, 0, &wc, -1}, + {NULL, 4, -1, 1, EILSEQ, &wc, -1}, + {"\x21", 2, 1, 1, 0, &wc, 0x21}, + {"\xf0\x9f\x92\xa9", 2, -2, 0, 0, &wc, -1}, + {"\xf0\x9f\x92\xa9", 0, -2, 0, 0, &wc, -1}, + {"\x92\xa9", 2, 2, 1, 0, &wc, 0x01F4A9}, + + {"\x80", 2, -1, 1, EILSEQ, &wc, -1}, + {"\xc0\x80", 2, -1, 1, EILSEQ, &wc, -1}, + {"\xc0\x00", 2, -1, 1, EILSEQ, &wc, -1}, + {"\xf8\x81\x82\x83\x84\x85", -1, -1, 1, EILSEQ, &wc, -1}, + {"\xfe\x81\x82\x83\x84\x85\x86", 8, -1, 1, EILSEQ, &wc, -1}, +};