From 5dced3d1b3deca80e01415a2e35dc7972dcbfae7 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 11:25:10 +0200 Subject: Adding upstream version 1.47.0. Signed-off-by: Daniel Baumann --- lib/et/et_c.awk | 269 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 lib/et/et_c.awk (limited to 'lib/et/et_c.awk') diff --git a/lib/et/et_c.awk b/lib/et/et_c.awk new file mode 100644 index 0000000..99c33ba --- /dev/null +++ b/lib/et/et_c.awk @@ -0,0 +1,269 @@ +BEGIN { +if ( length(outfn) == 0) { + outfn = outfile +} +char_shift=64 +## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; +c2n["A"]=1 +c2n["B"]=2 +c2n["C"]=3 +c2n["D"]=4 +c2n["E"]=5 +c2n["F"]=6 +c2n["G"]=7 +c2n["H"]=8 +c2n["I"]=9 +c2n["J"]=10 +c2n["K"]=11 +c2n["L"]=12 +c2n["M"]=13 +c2n["N"]=14 +c2n["O"]=15 +c2n["P"]=16 +c2n["Q"]=17 +c2n["R"]=18 +c2n["S"]=19 +c2n["T"]=20 +c2n["U"]=21 +c2n["V"]=22 +c2n["W"]=23 +c2n["X"]=24 +c2n["Y"]=25 +c2n["Z"]=26 +c2n["a"]=27 +c2n["b"]=28 +c2n["c"]=29 +c2n["d"]=30 +c2n["e"]=31 +c2n["f"]=32 +c2n["g"]=33 +c2n["h"]=34 +c2n["i"]=35 +c2n["j"]=36 +c2n["k"]=37 +c2n["l"]=38 +c2n["m"]=39 +c2n["n"]=40 +c2n["o"]=41 +c2n["p"]=42 +c2n["q"]=43 +c2n["r"]=44 +c2n["s"]=45 +c2n["t"]=46 +c2n["u"]=47 +c2n["v"]=48 +c2n["w"]=49 +c2n["x"]=50 +c2n["y"]=51 +c2n["z"]=52 +c2n["0"]=53 +c2n["1"]=54 +c2n["2"]=55 +c2n["3"]=56 +c2n["4"]=57 +c2n["5"]=58 +c2n["6"]=59 +c2n["7"]=60 +c2n["8"]=61 +c2n["9"]=62 +c2n["_"]=63 +} +/^#/ { next } +/^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ { + table_number = 0 + mod_base = 1000000 + if (NF > 2) { + table_name = $3 + base_name = $2 + } else { + table_name = $2 + base_name = table_name + } + for(i=1; i<=length(base_name); i++) { + table_number=(table_number*char_shift)+c2n[substr(base_name,i,1)] + } + + # We start playing *_high, *low games here because the some + # awk programs do not have the necessary precision (sigh) + tab_base_low = table_number % mod_base + if (tab_base_low < 0) { + # Work around stupid bug in the ARM libm + tab_base_low = tab_base_low + mod_base + } + tab_base_high = int(table_number / mod_base) + tab_base_sign = 1; + + # figure out: table_number_base=table_number*256 + tab_base_low = tab_base_low * 256 + tab_base_high = (tab_base_high * 256) + \ + int(tab_base_low / mod_base) + tab_base_low = tab_base_low % mod_base + if (tab_base_low < 0) { + # Work around stupid bug in the ARM libm + tab_base_low = tab_base_low + mod_base + } + + if (table_number > 128*256*256) { + # figure out: table_number_base -= 256*256*256*256 + # sub_high, sub_low is 256*256*256*256 + sub_low = 256*256*256 % mod_base + sub_high = int(256*256*256 / mod_base) + + sub_low = sub_low * 256 + sub_high = (sub_high * 256) + int(sub_low / mod_base) + sub_low = sub_low % mod_base + + tab_base_low = sub_low - tab_base_low; + tab_base_high = sub_high - tab_base_high; + tab_base_sign = -1; + if (tab_base_low < 0) { + tab_base_low = tab_base_low + mod_base + tab_base_high-- + } + } + print "/*" > outfile + print " * " outfn ":" > outfile + print " * This file is automatically generated; please do not edit it." > outfile + print " */" > outfile + + print "" > outfile + print "#include " > outfile + print "" > outfile + print "#define N_(a) a" > outfile + print "" > outfile + print "static const char * const text[] = {" > outfile + table_item_count = 0 +} + +(continuation == 1) && ($0 ~ /\\[ \t]*$/) { + text=substr($0,1,length($0)-1); +# printf "\t\t\"%s\"\n", text > outfile + cont_buf=cont_buf text; +} + +(continuation == 1) && ($0 ~ /"[ \t]*$/) { +# printf "\t\t\"%s,\n", $0 > outfile + printf "\tN_(%s),\n", cont_buf $0 > outfile + continuation = 0; +} + +/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[^ \t]/ { + # Be tolerant to missing whitespace after `,' ... + sub(/,/, ", ") +} + +/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*$/ { + table_item_count++ + skipone=1 + next +} + +/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*"[ \t]*$/ { + text="" + for (i=3; i<=NF; i++) { + text = text FS $i + } + text=substr(text,2,length(text)-1); + printf "\tN_(%s),\n", text > outfile + table_item_count++ +} + +/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*\\[ \t]*$/ { + text="" + for (i=3; i<=NF; i++) { + text = text FS $i + } + text=substr(text,2,length(text)-2); +# printf "\t%s\"\n", text > outfile + cont_buf=text + table_item_count++ + continuation++; +} + +/^[ \t]*".*\\[ \t]*$/ { + if (skipone) { + text=substr($0,1,length($0)-1); +# printf "\t%s\"\n", text > outfile + cont_buf=text + continuation++; + } + skipone=0 +} + +{ + if (skipone) { + printf "\tN_(%s),\n", $0 > outfile + } + skipone=0 +} + +/^[ \t]*(prefix)$/ { + prefix_str = "" +} + +/^[ \t]*(prefix)[ \t]+[A-Z_0-9]+/ { + prefix_str = $2 "_" +} + +/^[ \t]*(index)[ \t]+[A-Z_0-9]+/ { + new_idx = $2 + for (i = table_item_count ; i < new_idx; i++) { + printf "\tN_(\"Reserved %s error (%d)\"),\n", \ + table_name, table_item_count++ > outfile + } +} + +END { + print " 0" > outfile + print "};" > outfile + print "" > outfile + print "struct error_table {" > outfile + print " char const * const * msgs;" > outfile + print " long base;" > outfile + print " int n_msgs;" > outfile + print "};" > outfile + print "struct et_list {" > outfile + print " struct et_list *next;" > outfile + print " const struct error_table * table;" > outfile + print "};" > outfile + print "extern struct et_list *_et_list;" > outfile + print "" > outfile + if (tab_base_high == 0) { + print "const struct error_table et_" table_name "_error_table = { text, " \ + sprintf("%dL, %d };", tab_base_sign*tab_base_low, \ + table_item_count) > outfile + } else { + print "const struct error_table et_" table_name "_error_table = { text, " \ + sprintf("%d%06dL, %d };", tab_base_sign*tab_base_high, \ + tab_base_low, table_item_count) > outfile + } + print "" > outfile + print "static struct et_list link = { 0, 0 };" > outfile + print "" > outfile + print "void initialize_" table_name "_error_table_r(struct et_list **list);" > outfile + print "void initialize_" table_name "_error_table(void);" > outfile + print "" > outfile + print "void initialize_" table_name "_error_table(void) {" > outfile + print " initialize_" table_name "_error_table_r(&_et_list);" > outfile + print "}" > outfile + print "" > outfile + print "/* For Heimdal compatibility */" > outfile + print "void initialize_" table_name "_error_table_r(struct et_list **list)" > outfile + print "{" > outfile + print " struct et_list *et, **end;" > outfile + print "" > outfile + print " for (end = list, et = *list; et; end = &et->next, et = et->next)" > outfile + print " if (et->table->msgs == text)" > outfile + print " return;" > outfile + print " et = malloc(sizeof(struct et_list));" > outfile + print " if (et == 0) {" > outfile + print " if (!link.table)" > outfile + print " et = &link;" > outfile + print " else" > outfile + print " return;" > outfile + print " }" > outfile + print " et->table = &et_" table_name "_error_table;" > outfile + print " et->next = 0;" > outfile + print " *end = et;" > outfile + print "}" > outfile +} -- cgit v1.2.3