#! /usr/bin/gawk -f # Last edited on 2026-09-29 17:13:32 by stolfi # Caller must define with "-i" the function {factor_text} # and with "-v" the variable {utype} as "ps" or "wp". BEGIN { if (utype == "") { arg_error("must define {utype}"); } ntoks = 0; # Total tokens. ngarb = 0; # Tokens with '?' on input. nbugs = 0; # Tokens with no '?' but violating model. } /^ *([#]|$)/ { print; next; } /^<[bf][0-9A-Za-z.;]+>/ { loc = $1; text = substr($0, length(loc)+1); printf "%s", loc; if (utype == "ps") { # Isolated pinyin syllables with diacritic or numeric tones: if (substr(loc,2,1) != "b") { data_error("bad locator"); } } else if (utype == "wp") { # EVA tokens, ignore commas: if (substr(loc,2,1) != "f") { data_error("bad locator"); } gsub(/[-.]/, " ", text); gsub(/[,]/, "", text); # printf "%s\n", text > "/dev/stderr" # Split some probable joined words: gsub(/\/, "aiin al", text) gsub(/\/, "aiin d", text) gsub(/\/, "aiir aly", text) gsub(/\/, "air al", text) gsub(/\/, "air am", text) gsub(/\/, "air od", text) gsub(/\/, "air ody", text) gsub(/\/, "air ol", text) gsub(/\/, "air oy", text) gsub(/\/, "chedy kar", text) gsub(/\/, "cheol chey", text) gsub(/\/, "cheol kaiin", text) gsub(/\/, "cheol kain", text) gsub(/\/, "cheol kedy", text) gsub(/\/, "chod chy", text) gsub(/\/, "chol chedy", text) gsub(/\/, "chol cheol", text) gsub(/\/, "chol chey", text) gsub(/\/, "chol kaiin", text) gsub(/\/, "chol kain", text) gsub(/\/, "chol kar", text) gsub(/\/, "chol kedy", text) gsub(/\/, "chol keedy", text) gsub(/\/, "chol keey", text) gsub(/\/, "chol kor", text) gsub(/\/, "chol ky", text) gsub(/\/, "chor chy", text) gsub(/\/, "daiin dy", text) gsub(/\/, "daiin ody", text) gsub(/\/, "daiir al", text) gsub(/\/, "dair air", text) gsub(/\/, "dair al", text) gsub(/\/, "dair am", text) gsub(/\/, "dair ar", text) gsub(/\/, "dair in", text) gsub(/\/, "dair ody", text) gsub(/\/, "dair y", text) gsub(/\/, "kair am", text) gsub(/\/, "kal chdy", text) gsub(/\/, "kal chedy", text) gsub(/\/, "kal kal", text) gsub(/\/, "kcho kchy", text) gsub(/\/, "kol chedy", text) gsub(/\/, "kor chy", text) gsub(/\/, "og am", text) gsub(/\/, "okair y", text) gsub(/\/, "okal chedy", text) gsub(/\/, "okal chy", text) gsub(/\/, "okal chy", text) gsub(/\/, "okal ody", text) gsub(/\/, "okol chy", text) gsub(/\/, "opal kaiin", text) gsub(/\/, "otair or", text) gsub(/\/, "otal kedy", text) gsub(/\/, "otol chey", text) gsub(/\/, "otor chy", text) gsub(/\/, "oty tam", text) gsub(/\/, "pol chdy", text) gsub(/\/, "pol ched", text) gsub(/\/, "pol chedy", text) gsub(/\/, "pol shy", text) gsub(/\/, "qokaiin os", text) gsub(/\/, "qokal chdy", text) gsub(/\/, "qokal chedy", text) gsub(/\/, "qokar ary", text) gsub(/\/, "qokol chedy", text) gsub(/\/, "qotol chy", text) gsub(/\/, "sair om", text) gsub(/\/, "sair y", text) gsub(/\/, "sheol kain", text) gsub(/\/, "shol kal", text) gsub(/\/, "shol keedy", text) gsub(/\/, "tol chedy", text) gsub(/\/, "tol chor", text) gsub(/\/, "tol shey", text) gsub(/\/, "tol shy", text) gsub(/\/, "tor chey", text) gsub(/\/, "tor shor", text) gsub(/\/, "ycheeol kaiin", text) } n = split(text, fld) buggy = 0 for (i = 1; i <= n; i++) { x = fld[i] y = factor_text(x); if (match(x, /[?]/)) { ngarb++; } else { if (match(y, /[?]/)) { nbugs++; buggy = 1; } } printf " %s", y; ntoks ++; } printf " \n"; if (buggy) { printf "%s\n", loc > "/dev/stderr"; } next } // { file_line_error(FILENAME, FNR, "invalid line format", $0) } END{ printf "%d unreadable or weirdo tokens in %d", ngarb, ntoks > "/dev/stderr" printf " (%.3f%%)\n", 100*ngarb/ntoks > "/dev/stderr" printf "%d tokens with bad form in %d", nbugs, ntoks-ngarb > "/dev/stderr" printf " (%.3f%%)\n", 100*nbugs/(ntoks-ngarb) > "/dev/stderr" }