diff options
author | Jacob Moody <moody@posixcafe.org> | 2023-03-26 01:02:20 +0000 |
---|---|---|
committer | Jacob Moody <moody@posixcafe.org> | 2023-03-26 01:02:20 +0000 |
commit | 04759ec9af6dcc78ea5873ceaf6db2e3b3920b22 (patch) | |
tree | 0e20684eee0f36fff952c46bc14828f1005dfb31 /sys/src/libc/test/runenorm.c | |
parent | 2163aebcb85e8214869a2c026b3fc5bd9ddac22c (diff) |
runecomp(2)
Diffstat (limited to 'sys/src/libc/test/runenorm.c')
-rw-r--r-- | sys/src/libc/test/runenorm.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/sys/src/libc/test/runenorm.c b/sys/src/libc/test/runenorm.c new file mode 100644 index 000000000..fb4168e28 --- /dev/null +++ b/sys/src/libc/test/runenorm.c @@ -0,0 +1,92 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +static int +estrtoul(char *s) +{ + char *epr; + Rune code; + + code = strtoul(s, &epr, 16); + if(s == epr) + sysfatal("bad code point hex string"); + return code; +} + +void +main(int, char) +{ + Rune buffer1[64]; + Rune buffer2[64]; + char utfbuff1[128]; + char utfbuff2[128]; + char srctmp[128], tmp1[128], tmp2[128]; + char *fields[10]; + char *runes[32]; + char *p; + int n, n2; + int i; + uint fail; + Biobuf *b; + + b = Bopen("/lib/ucd/NormalizationTest.txt", OREAD); + if(b == nil) + sysfatal("could not load composition exclusions: %r"); + + struct { + Rune src[32]; + Rune nfc[32]; + Rune nfd[32]; + } test; + while((p = Brdline(b, '\n')) != nil){ + p[Blinelen(b)-1] = 0; + if(p[0] == 0 || p[0] == '#' || p[0] == '@') + continue; + getfields(p, fields, 6 + 1, 0, ";"); + n = getfields(fields[0], runes, nelem(runes), 0, " "); + for(i = 0; i < n; i++) + test.src[i] = estrtoul(runes[i]); + test.src[i] = 0; + + n = getfields(fields[1], runes, nelem(runes), 0, " "); + for(i = 0; i < n; i++) + test.nfc[i] = estrtoul(runes[i]); + test.nfc[i] = 0; + + n = getfields(fields[2], runes, nelem(runes), 0, " "); + for(i = 0; i < n; i++) + test.nfd[i] = estrtoul(runes[i]); + test.nfd[i] = 0; + + n = runecomp(buffer1, test.src, nelem(buffer1)); + n2 = runedecomp(buffer2, test.src, nelem(buffer2)); + fail = 0; + + if(runestrcmp(buffer1, test.nfc) != 0) + fail |= 1<<0; + if(runestrcmp(buffer2, test.nfd) != 0) + fail |= 1<<1; + if(fail) + print("%d %d %S %S %S %S %S\n", fail, i, test.src, test.nfd, test.nfc, buffer2, buffer1); + assert(n == runestrlen(test.nfc)); + assert(n2 == runestrlen(test.nfd)); + + snprint(srctmp, sizeof tmp1, "%S", test.src); + snprint(tmp1, sizeof tmp1, "%S", test.nfc); + snprint(tmp2, sizeof tmp2, "%S", test.nfd); + + n = utfcomp(utfbuff1, srctmp, nelem(utfbuff1)); + n2 = utfdecomp(utfbuff2, srctmp, nelem(utfbuff2)); + + if(strcmp(utfbuff1, tmp1) != 0) + fail |= 1<<2; + if(strcmp(utfbuff2, tmp2) != 0) + fail |= 1<<3; + if(fail) + print("%d %d %s %s %s %s %s\n", fail, i, srctmp, tmp2, tmp1, utfbuff2, utfbuff1); + assert(n == strlen(tmp1)); + assert(n2 == strlen(tmp2)); + } + exits(nil); +} |