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-- } } curr_low = tab_base_low curr_high = tab_base_high curr_sign = tab_base_sign print "/*" > outfile print " * " outfile ":" > outfile print " * This file is automatically generated; please do not edit it." > outfile print " */" > outfile } /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,/ { tag=substr($2,1,length($2)-1) if (curr_high == 0) { printf "#define %-40s (%dL)\n", tag, \ curr_sign*curr_low > outfile } else { printf "#define %-40s (%d%06dL)\n", tag, curr_high*curr_sign, \ curr_low > outfile } curr_low += curr_sign; if (curr_low >= mod_base) { curr_low -= mod_base; curr_high++ } if (curr_low < 0) { cur_low += mod_base cur_high-- } } END { print "extern void initialize_" table_name "_error_table ();" > outfile if (tab_base_high == 0) { print "#define ERROR_TABLE_BASE_" table_name " (" \ sprintf("%d", tab_base_sign*tab_base_low) \ "L)" > outfile } else { print "#define ERROR_TABLE_BASE_" table_name " (" \ sprintf("%d%06d", tab_base_sign*tab_base_high, \ tab_base_low) "L)" > outfile } print "" > outfile print "/* for compatibility with older versions... */" > outfile print "#define init_" table_name "_err_tbl initialize_" table_name "_error_table" > outfile print "#define " table_name "_err_base ERROR_TABLE_BASE_" table_name > outfile }