diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-04-20 00:24:03 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-04-20 00:24:03 +0200 |
commit | a541a957e7ea83d31b411fb82e86870c3bf82652 (patch) | |
tree | 21bc6216298dbe19f192630b300a30cf176415c8 /gen | |
parent | db816ef1e678e20d91d1b5308b2d7a182a3f114c (diff) |
Add uprop_get_nf{,k}{c,d}_qc()
Diffstat (limited to 'gen')
-rwxr-xr-x | gen/prop/nfXX_qc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/gen/prop/nfXX_qc b/gen/prop/nfXX_qc new file mode 100755 index 0000000..fed603e --- /dev/null +++ b/gen/prop/nfXX_qc @@ -0,0 +1,77 @@ +#!/bin/sh + +set -e +cd "${0%/*}/../.." + +for x in c d kc kd +do + gawk -v s=$x ' + BEGIN { + FS = "[ ;]+" + + _default = "NF" toupper(s) "_QC_Y" + + print "/* This file is autogenerated by gen/prop/nfXX_qc; DO NOT EDIT. */" + print "" + print "/* The macros.h include may be unused */" + print "" + print "#include \"_bsearch.h\"" + print "#include \"macros.h\"" + print "#include \"rune.h\"" + print "#include \"unicode/prop.h\"" + print "" + } + + /^[A-F0-9]/ && $2 == "NF" toupper(s) "_QC" { + n = split($1, a, /\.\./) + lo = strtonum("0X" a[1]) + hi = strtonum("0X" a[n]) + + for (i = lo; i <= hi; i++) + props[i] = "NF" toupper(s) "_QC_" $3 + if (lo < 0x100) + want_lat1_tbl = 1 + } + + END { + if (want_lat1_tbl) { + print "static constexpr enum uprop_nf" s "_qc lookup_lat1[] = {" + for (i = 0; i < 0x100; i++) { + if (i % 8 == 0) + printf "\t" + printf "%s,%s", props[i] ? props[i] : _default, \ + i % 8 == 7 ? "\n" : " " + } + print "};" + print "" + } + + print "static const struct {" + print "\trune lo, hi;" + print "\tenum uprop_nf" s "_qc val;" + print "} lookup[] = {" + + for (i = want_lat1_tbl ? 0x100 : 0; i <= 0x10FFFF; i++) { + if (!props[i]) + continue + for (lo = i; props[lo] == props[i + 1]; i++) + ; + printf "\t{RUNE_C(0x%06X), RUNE_C(0x%06X), %s},\n", lo, i, props[i] + } + + print "};" + print "" + print "_MLIB_DEFINE_BSEARCH(enum uprop_nf" s "_qc, lookup, " _default ")" + print "" + print "enum uprop_nf" s "_qc" + print "uprop_get_nf" s "_qc(rune ch)" + print "{" + if (want_lat1_tbl) + print "\treturn ch < lengthof(lookup_lat1) ? lookup_lat1[ch] : mlib_lookup(ch);" + else + print "\treturn ch < lookup[0].lo ? " _default " : mlib_lookup(ch);" + print "}" + } + ' data/DerivedNormalizationProps \ + | sed 's/\s*$//' >lib/unicode/prop/uprop_get_nf${x}_qc.c +done |