entities.awk (924B)
- BEGIN {
- for (i = 32; i <= 126; ++i)
- ord[sprintf("%c", i)] = i
- n = -1
- }
- function makenode(c) {
- ++n
- splits[n] = c
- left[n] = -1
- equal[n] = -1
- right[n] = -1
- values[n] = 0
- }
- function insert(nodes, id, c) {
- nextid = nodes[id]
- if (nextid != -1)
- return nextid
- makenode(c)
- nodes[id] = n
- return n
- }
- /^(#|$)/ {next}
- {
- id = 0
- c = ord[substr($1, 1, 1)]
- if (n < 0)
- makenode(c)
- for (i = 1; i <= length($1) + 1;) {
- if (c < splits[id]) {
- id = insert(left, id, c)
- } else if (c == splits[id]) {
- if (i >= length($1))
- values[id] = $2
- if (c == 0)
- break
- ++i
- c = i <= length($1) ? ord[substr($1, i, 1)] : 0
- id = insert(equal, id, c)
- } else {
- id = insert(right, id, c)
- }
- }
- }
- END {
- print "static hubbub_entity_node dict[] = {"
- for (i = 0; i <= n; ++i)
- print "\t{ "splits[i]", "left[i]", "equal[i]", "right[i]", "values[i]" },"
- print "};"
- print "static int32_t dict_root = 0;"
- }