aboutsummaryrefslogtreecommitdiff
path: root/gen/prop/ccc
blob: 4f370e74ba7a30af6a2e5549270e3f097005c6df (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/bin/sh

set -e
cd "${0%/*}/../.."
exec >lib/unicode/prop/uprop_get_ccc.c

gawk '
BEGIN {
	FS = ";"

	map[1]   = "OV"
	map[6]   = "HANR"
	map[7]   = "NK"
	map[8]   = "KV"
	map[9]   = "VR"
	map[10]  = "CCC10"
	map[11]  = "CCC11"
	map[12]  = "CCC12"
	map[13]  = "CCC13"
	map[14]  = "CCC14"
	map[15]  = "CCC15"
	map[16]  = "CCC16"
	map[17]  = "CCC17"
	map[18]  = "CCC18"
	map[19]  = "CCC19"
	map[20]  = "CCC20"
	map[21]  = "CCC21"
	map[22]  = "CCC22"
	map[23]  = "CCC23"
	map[24]  = "CCC24"
	map[25]  = "CCC25"
	map[26]  = "CCC26"
	map[27]  = "CCC27"
	map[28]  = "CCC28"
	map[29]  = "CCC29"
	map[30]  = "CCC30"
	map[31]  = "CCC31"
	map[32]  = "CCC32"
	map[33]  = "CCC33"
	map[34]  = "CCC34"
	map[35]  = "CCC35"
	map[36]  = "CCC36"
	map[84]  = "CCC84"
	map[91]  = "CCC91"
	map[103] = "CCC103"
	map[107] = "CCC107"
	map[118] = "CCC118"
	map[122] = "CCC122"
	map[129] = "CCC129"
	map[130] = "CCC130"
	map[132] = "CCC132"
	map[133] = "CCC133"
	map[200] = "ATBL"
	map[202] = "ATB"
	map[214] = "ATA"
	map[216] = "ATAR"
	map[218] = "BL"
	map[220] = "B"
	map[222] = "BR"
	map[224] = "L"
	map[226] = "R"
	map[228] = "AL"
	map[230] = "A"
	map[232] = "AR"
	map[233] = "DB"
	map[234] = "DA"
	map[240] = "IS"

	print "/* This file is autogenerated by gen/prop/ccc; DO NOT EDIT. */"
	print ""
	print "#include \"_bsearch.h\""
	print "#include \"macros.h\""
	print "#include \"rune.h\""
	print "#include \"unicode/prop.h\""
	print ""
}

{
	s = "CCC_" (map[$4] ? map[$4] : "NR")
	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 {
	print "static const struct {"
	print "\trune lo, hi;"
	print "\tenum uprop_ccc val;"
	print "} lookup[] = {"

	for (i = 0; i <= 0x10FFFF; i++) {
		if (!props[i] || props[i] == "CCC_NR")
			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[lo]
	}

	print "};"
	print ""
	print "_MLIB_DEFINE_BSEARCH(enum uprop_ccc, lookup, CCC_NR)"
	print ""
	print "enum uprop_ccc"
	print "uprop_get_ccc(rune ch)"
	print "{"
	print "\treturn ch < lookup[0].lo ? CCC_NR : mlib_lookup(ch);"
	print "}"
}
' data/UnicodeData