diff options
Diffstat (limited to 'gen/prop/gc')
-rwxr-xr-x | gen/prop/gc | 85 |
1 files changed, 33 insertions, 52 deletions
diff --git a/gen/prop/gc b/gen/prop/gc index 48c6659..219df8a 100755 --- a/gen/prop/gc +++ b/gen/prop/gc @@ -2,56 +2,19 @@ set -e cd "${0%/*}/../.." -exec >include/unicode/__gc.h - -cat <<C -/* This file is autogenerated by gen/prop/gc; DO NOT EDIT. */ - -#ifndef MLIB_UNICODE_PROP___GC_H -#define MLIB_UNICODE_PROP___GC_H - -#include "unicode/prop.h" - -static const enum uprop_gc __mlib_gc_lat1_lt[] = { -C +exec >lib/unicode/prop/uprop_get_gc.c gawk ' BEGIN { FS = ";" -} - -{ - s = "GC_" toupper($3) - lo = strtonum("0X" $1) - - if ($2 ~ /First/) { - getline - hi = strtonum("0X" $1) - } else - hi = lo - - for (i = lo; i <= hi; i++) - props[i] = s -} - -END { - for (i = 0; i <= 0xFF; i++) - print props[i] "," -} -' data/UnicodeData.txt | paste -d' ' - - - - - - - - | sed 's/^/\t/' - -cat <<C -}; - -static const struct { - rune lo, hi; - enum uprop_gc val; -} __mlib_gc_lt[] = { -C -gawk ' -BEGIN { - FS = ";" + print "/* This file is autogenerated by gen/prop/gc; DO NOT EDIT. */" + print "" + print "#include \"__bsearch.h\"" + print "#include \"macros.h\"" + print "#include \"rune.h\"" + print "#include \"unicode/prop.h\"" + print "" } { @@ -69,6 +32,20 @@ BEGIN { } END { + print "static constexpr enum uprop_gc lookup_lat1[] = {" + for (i = 0; i < 0x100; i++) { + if (i % 8 == 0) + printf "\t" + printf "%5s,%s", props[i], i % 8 == 7 ? "\n" : " " + } + print "};" + print "" + print "static const struct {" + print "\trune lo, hi;" + print "\tenum uprop_gc val;" + print "} lookup[] = {" + print "" + for (i = 0x100; i <= 0x10FFFF; i++) { if (!props[i]) continue @@ -77,11 +54,15 @@ END { i++ printf "\t{RUNE_C(0x%06X), RUNE_C(0x%06X), %s},\n", lo, i, props[lo] } -} -' data/UnicodeData.txt | sort -cat <<C -}; - -#endif /* !MLIB_UNICODE_PROP___GC_H */ -C + print "};" + print "" + print "__MLIB_DEFINE_BSEARCH(enum uprop_gc, lookup, GC_CN)" + print "" + print "enum uprop_gc" + print "uprop_get_gc(rune ch)" + print "{" + print "\treturn ch < lengthof(lookup_lat1) ? lookup_lat1[ch] : mlib_lookup(ch);" + print "}" +} +' data/UnicodeData.txt |