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 
     86 	# We start playing *_high, *low games here because the some
     87 	# awk programs do not have the necessary precision (sigh)
     88 	tab_base_low = table_number % mod_base
     89 	if (tab_base_low < 0) {
     90 		# Work around stupid bug in the ARM libm
     91 		tab_base_low = tab_base_low + mod_base
     92 	}
     93 	tab_base_high = int(table_number / mod_base)
     94 	tab_base_sign = 1;
     95 
     96 	# figure out: table_number_base=table_number*256
     97 	tab_base_low = tab_base_low * 256
     98 	tab_base_high = (tab_base_high * 256) + \
     99 			int(tab_base_low / mod_base)
    100 	tab_base_low = tab_base_low % mod_base
    101 	if (tab_base_low < 0) {
    102 		# Work around stupid bug in the ARM libm
    103 		tab_base_low = tab_base_low + mod_base
    104 	}
    105 
    106 	if (table_number > 128*256*256) {
    107 		# figure out:  table_number_base -= 256*256*256*256
    108 		# sub_high, sub_low is 256*256*256*256
    109 		sub_low = 256*256*256 % mod_base
    110 		sub_high = int(256*256*256 / mod_base)
    111 
    112 		sub_low = sub_low * 256
    113 		sub_high = (sub_high * 256) + int(sub_low / mod_base)
    114 		sub_low = sub_low % mod_base
    115 
    116 		tab_base_low = sub_low - tab_base_low;
    117 		tab_base_high = sub_high - tab_base_high;
    118 		tab_base_sign = -1;
    119 		if (tab_base_low < 0) {
    120 			tab_base_low = tab_base_low + mod_base
    121 			tab_base_high--
    122 		}
    123 	}
    124 	print "/*" > outfile
    125 	print " * " outfn ":" > outfile
    126 	print " * This file is automatically generated; please do not edit it." > outfile
    127 	print " */" > outfile
    128 
    129 	print "" > outfile
    130 	print "#include <stdlib.h>" > outfile
    131 	print "" > outfile
    132 	print "#define N_(a) a" > outfile
    133 	print "" > outfile
    134 	print "static const char * const text[] = {" > outfile
    135 	table_item_count = 0
    136 }
    137 
    138 (continuation == 1) && ($0 ~ /\\[ \t]*$/) {
    139 	text=substr($0,1,length($0)-1);
    140 #	printf "\t\t\"%s\"\n", text > outfile
    141 	cont_buf=cont_buf text;
    142 }
    143 
    144 (continuation == 1) && ($0 ~ /"[ \t]*$/) {
    145 #	printf "\t\t\"%s,\n", $0 > outfile
    146 	printf "\tN_(%s),\n", cont_buf $0 > outfile
    147 	continuation = 0;
    148 }
    149 
    150 /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[^ \t]/ {
    151 	# Be tolerant to missing whitespace after `,' ...
    152 	sub(/,/, ", ")
    153 }
    154 
    155 /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*$/ {
    156 	table_item_count++
    157 	skipone=1
    158 	next
    159 }
    160 
    161 /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*"[ \t]*$/ {
    162 	text=""
    163 	for (i=3; i<=NF; i++) { 
    164 	    text = text FS $i
    165 	}
    166 	text=substr(text,2,length(text)-1);
    167 	printf "\tN_(%s),\n", text > outfile
    168 	table_item_count++
    169 }
    170 
    171 /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*\\[ \t]*$/ {
    172 	text=""
    173 	for (i=3; i<=NF; i++) { 
    174 	    text = text FS $i
    175 	}
    176 	text=substr(text,2,length(text)-2);
    177 #	printf "\t%s\"\n", text > outfile
    178 	cont_buf=text
    179 	table_item_count++
    180 	continuation++;
    181 }
    182 
    183 /^[ \t]*".*\\[ \t]*$/ {
    184 	if (skipone) {
    185 	    text=substr($0,1,length($0)-1);
    186 #	    printf "\t%s\"\n", text > outfile
    187 	    cont_buf=text
    188 	    continuation++;
    189 	}
    190 	skipone=0
    191 }
    192 
    193 { 
    194 	if (skipone) {
    195 	    printf "\tN_(%s),\n", $0 > outfile
    196 	}
    197 	skipone=0
    198 }
    199 
    200 /^[ \t]*(prefix)$/ {
    201 	prefix_str = ""
    202 }
    203 
    204 /^[ \t]*(prefix)[ \t]+[A-Z_0-9]+/ {
    205 	prefix_str = $2 "_"
    206 }
    207 
    208 /^[ \t]*(index)[ \t]+[A-Z_0-9]+/ {
    209 	new_idx = $2
    210 	for (i = table_item_count ; i < new_idx; i++) {
    211 		printf "\tN_(\"Reserved %s error (%d)\"),\n", \
    212 			table_name, table_item_count++ > outfile
    213 	}
    214 }
    215 
    216 END {
    217 	print "    0" > outfile
    218 	print "};" > outfile
    219 	print "" > outfile
    220 	print "struct error_table {" > outfile
    221 	print "    char const * const * msgs;" > outfile
    222 	print "    long base;" > outfile
    223 	print "    int n_msgs;" > outfile
    224 	print "};" > outfile
    225 	print "struct et_list {" > outfile
    226 	print "    struct et_list *next;" > outfile
    227 	print "    const struct error_table * table;" > outfile
    228 	print "};" > outfile
    229 	print "extern struct et_list *_et_list;" > outfile
    230 	print "" > outfile
    231 	if (tab_base_high == 0) {
    232 		print "const struct error_table et_" table_name "_error_table = { text, " \
    233 		sprintf("%dL, %d };", tab_base_sign*tab_base_low, \
    234 		table_item_count) > outfile
    235 	} else {
    236 		print "const struct error_table et_" table_name "_error_table = { text, " \
    237 		sprintf("%d%06dL, %d };", tab_base_sign*tab_base_high, \
    238 		tab_base_low, table_item_count) > outfile
    239 	}
    240 	print "" > outfile
    241 	print "static struct et_list link = { 0, 0 };" > outfile
    242 	print "" > outfile
    243 	print "void initialize_" table_name "_error_table_r(struct et_list **list);" > outfile
    244 	print "void initialize_" table_name "_error_table(void);" > outfile
    245 	print "" > outfile
    246 	print "void initialize_" table_name "_error_table(void) {" > outfile
    247 	print "    initialize_" table_name "_error_table_r(&_et_list);" > outfile
    248 	print "}" > outfile
    249 	print "" > outfile
    250 	print "/* For Heimdal compatibility */" > outfile
    251 	print "void initialize_" table_name "_error_table_r(struct et_list **list)" > outfile
    252 	print "{" > outfile
    253 	print "    struct et_list *et, **end;" > outfile
    254 	print "" > outfile
    255 	print "    for (end = list, et = *list; et; end = &et->next, et = et->next)" > outfile
    256 	print "        if (et->table->msgs == text)" > outfile
    257 	print "            return;" > outfile
    258 	print "    et = malloc(sizeof(struct et_list));" > outfile
    259 	print "    if (et == 0) {" > outfile
    260 	print "        if (!link.table)" > outfile
    261 	print "            et = &link;" > outfile
    262 	print "        else" > outfile
    263 	print "            return;" > outfile
    264 	print "    }" > outfile
    265 	print "    et->table = &et_" table_name "_error_table;" > outfile
    266 	print "    et->next = 0;" > outfile
    267 	print "    *end = et;" > outfile
    268 	print "}" > outfile
    269 }
    270