Home | History | Annotate | Download | only in et
      1 BEGIN { 
      2 if ( length(outfn) == 0) {
      3 	outfn = outfile
      4 }
      5 char_shift=64
      6 ## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
      7 c2n["A"]=1
      8 c2n["B"]=2
      9 c2n["C"]=3
     10 c2n["D"]=4
     11 c2n["E"]=5
     12 c2n["F"]=6
     13 c2n["G"]=7
     14 c2n["H"]=8
     15 c2n["I"]=9
     16 c2n["J"]=10
     17 c2n["K"]=11
     18 c2n["L"]=12
     19 c2n["M"]=13
     20 c2n["N"]=14
     21 c2n["O"]=15
     22 c2n["P"]=16
     23 c2n["Q"]=17
     24 c2n["R"]=18
     25 c2n["S"]=19
     26 c2n["T"]=20
     27 c2n["U"]=21
     28 c2n["V"]=22
     29 c2n["W"]=23
     30 c2n["X"]=24
     31 c2n["Y"]=25
     32 c2n["Z"]=26
     33 c2n["a"]=27
     34 c2n["b"]=28
     35 c2n["c"]=29
     36 c2n["d"]=30
     37 c2n["e"]=31
     38 c2n["f"]=32
     39 c2n["g"]=33
     40 c2n["h"]=34
     41 c2n["i"]=35
     42 c2n["j"]=36
     43 c2n["k"]=37
     44 c2n["l"]=38
     45 c2n["m"]=39
     46 c2n["n"]=40
     47 c2n["o"]=41
     48 c2n["p"]=42
     49 c2n["q"]=43
     50 c2n["r"]=44
     51 c2n["s"]=45
     52 c2n["t"]=46
     53 c2n["u"]=47
     54 c2n["v"]=48
     55 c2n["w"]=49
     56 c2n["x"]=50
     57 c2n["y"]=51
     58 c2n["z"]=52
     59 c2n["0"]=53
     60 c2n["1"]=54
     61 c2n["2"]=55
     62 c2n["3"]=56
     63 c2n["4"]=57
     64 c2n["5"]=58
     65 c2n["6"]=59
     66 c2n["7"]=60
     67 c2n["8"]=61
     68 c2n["9"]=62
     69 c2n["_"]=63
     70 }
     71 /^#/ { next }
     72 /^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ {
     73 	table_number = 0
     74 	mod_base = 1000000
     75 	if (NF > 2) {
     76 	    table_name = $3
     77 	    base_name = $2
     78 	} else {
     79 	    table_name = $2
     80 	    base_name = table_name
     81 	}
     82 	for(i=1; i<=length(base_name); i++) {
     83 	    table_number=(table_number*char_shift)+c2n[substr(base_name,i,1)]
     84 	}
     85 	# We start playing *_high, *low games here because the some
     86 	# awk programs do not have the necessary precision (sigh)
     87 	tab_base_low = table_number % mod_base
     88 	if (tab_base_low < 0) {
     89 		# Work around stupid bug in the ARM libm
     90 		tab_base_low = tab_base_low + mod_base
     91 	}
     92 	tab_base_high = int(table_number / mod_base)
     93 	tab_base_sign = 1;
     94 
     95 	# figure out: table_number_base=table_number*256
     96 	tab_base_low = tab_base_low * 256
     97 	tab_base_high = (tab_base_high * 256) + \
     98 			int(tab_base_low / mod_base)
     99 	tab_base_low = tab_base_low % mod_base
    100 	if (tab_base_low < 0) {
    101 		# Work around stupid bug in the ARM libm
    102 		tab_base_low = tab_base_low + mod_base
    103 	}
    104 
    105 	if (table_number > 128*256*256) {
    106 		# figure out:  table_number_base -= 256*256*256*256
    107 		# sub_high, sub_low is 256*256*256*256
    108 		sub_low = 256*256*256 % mod_base
    109 		sub_high = int(256*256*256 / mod_base)
    110 
    111 		sub_low = sub_low * 256
    112 		sub_high = (sub_high * 256) + int(sub_low / mod_base)
    113 		sub_low = sub_low % mod_base
    114 
    115 		tab_base_low = sub_low - tab_base_low;
    116 		tab_base_high = sub_high - tab_base_high;
    117 		tab_base_sign = -1;
    118 		if (tab_base_low < 0) {
    119 			tab_base_low = tab_base_low + mod_base
    120 			tab_base_high--
    121 		}
    122 	}
    123 	prefix_str = ""
    124 	curr_idx = 0
    125 	curr_low = tab_base_low
    126 	curr_high = tab_base_high
    127 	curr_sign = tab_base_sign
    128 	print "/*" > outfile
    129 	print " * " outfn ":" > outfile
    130 	print " * This file is automatically generated; please do not edit it." > outfile
    131 	print " */" > outfile
    132 	print "" > outfile
    133 	print "#include <et/com_err.h>" > outfile
    134 	print "" > outfile
    135 }
    136 
    137 /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,/ {
    138 	# Be tolerant to missing whitespace after `,' ...
    139 	sub(/,/, ", ")
    140 
    141 	tag=prefix_str substr($2,1,length($2)-1)
    142 	if (curr_high == 0) {
    143 		printf "#define %-40s (%dL)\n", tag, \
    144 			curr_sign*curr_low > outfile
    145 	} else {
    146 		printf "#define %-40s (%d%06dL)\n", tag, curr_high*curr_sign, \
    147 			curr_low > outfile
    148 	}
    149 	curr_low += curr_sign;
    150 	curr_idx++;
    151 	if (curr_low >= mod_base) {
    152 		curr_low -= mod_base;
    153 		curr_high++
    154 	}
    155 	if (curr_low < 0) {
    156 		cur_low += mod_base
    157 		cur_high--
    158 	}
    159 }
    160 
    161 /^[ \t]*(prefix)$/ {
    162 	prefix_str = ""
    163 }
    164 
    165 /^[ \t]*(prefix)[ \t]+[A-Z_0-9]+/ {
    166 	prefix_str = $2 "_"
    167 }
    168 
    169 /^[ \t]*(index)[ \t]+[A-Z_0-9]+/ {
    170 	new_idx = $2
    171 	curr_low += curr_sign * (new_idx - curr_idx)
    172 	curr_idx = new_idx
    173 	if (curr_low >= mod_base) {
    174 		curr_low -= mod_base;
    175 		curr_high++
    176 	}
    177 	if (curr_low < 0) {
    178 		cur_low += mod_base
    179 		cur_high--
    180 	}
    181 }
    182 
    183 
    184 END {
    185 	print "extern const struct error_table et_" table_name "_error_table;" > outfile
    186 	print "extern void initialize_" table_name "_error_table(void);" > outfile
    187 	print "" > outfile
    188 	print "/* For compatibility with Heimdal */" > outfile
    189 	print "extern void initialize_" table_name "_error_table_r(struct et_list **list);" > outfile
    190 	print "" > outfile
    191 	if (tab_base_high == 0) {
    192 		print "#define ERROR_TABLE_BASE_" table_name " (" \
    193 			sprintf("%d", tab_base_sign*tab_base_low) \
    194 			"L)" > outfile
    195 	} else {
    196 		print "#define ERROR_TABLE_BASE_" table_name " (" \
    197 			sprintf("%d%06d", tab_base_sign*tab_base_high, \
    198 			tab_base_low) "L)" > outfile
    199 	}
    200 	print "" > outfile
    201 	print "/* for compatibility with older versions... */" > outfile
    202 	print "#define init_" table_name "_err_tbl initialize_" table_name "_error_table" > outfile
    203 	print "#define " table_name "_err_base ERROR_TABLE_BASE_" table_name > outfile
    204 }
    205