123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- BEGIN {
- 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
- table_name = $2
- mod_base = 1000000
- for(i=1; i<=length(table_name); i++) {
- table_number=(table_number*char_shift)+c2n[substr(table_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
- 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 (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 " * " outfile ":" > outfile
- print " * This file is automatically generated; please do not edit it." > outfile
- print " */" > outfile
- print "#if defined(_WIN32)" > outfile
- print "# include \"win-mac.h\"" > outfile
- print "#endif" > outfile
- print "" > outfile
- print "#if !defined(_WIN32)" > outfile
- print "extern void initialize_" table_name "_error_table (void);" > outfile
- print "#endif" > outfile
- print "" > outfile
- print "#define N_(x) (x)" > outfile
- print "" > outfile
- print "/* Lclint doesn't handle null annotations on arrays" > outfile
- print " properly, so we need this typedef in each" > outfile
- print " generated .c file. */" > outfile
- print "/*@-redef@*/" > outfile
- print "typedef /*@null@*/ const char *ncptr;" > outfile
- print "/*@=redef@*/" > outfile
- print "" > outfile
- print "static ncptr 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]*$/ {
- 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
- 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
- }
- END {
- if (table_item_count > 256) {
- print "Error table too large!" | "cat 1>&2"
- exit 1
- }
- # Put text domain and/or localedir at the end of the list.
- if (textdomain) {
- printf " \"%s\", /* Text domain */\n", textdomain > outfile
- if (localedir) {
- printf " \"%s\", /* Locale dir */\n", localedir > outfile
- }
- }
- print " 0" > outfile
- print "};" > outfile
- print "" > outfile
- print "#include <com_err.h>" > 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 "#if !defined(_WIN32)" > outfile
- print "void initialize_" table_name "_error_table (void)" > outfile
- print " /*@modifies internalState@*/" > outfile
- print "{" > outfile
- print " (void) add_error_table (&et_" table_name "_error_table);" > outfile
- print "}" > outfile
- print "#endif" > outfile
- }
|