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 }