Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 1 | BEGIN { |
Theodore Ts'o | 153b449 | 2005-05-06 09:42:34 -0400 | [diff] [blame] | 2 | if ( length(outfn) == 0) { |
| 3 | outfn = outfile |
| 4 | } |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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 |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 74 | mod_base = 1000000 |
Theodore Ts'o | 44104b2 | 2003-08-01 08:59:40 -0400 | [diff] [blame] | 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)] |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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 |
Theodore Ts'o | b6627cd | 1998-06-27 05:23:55 +0000 | [diff] [blame] | 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 | } |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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 |
Theodore Ts'o | b6627cd | 1998-06-27 05:23:55 +0000 | [diff] [blame] | 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 | } |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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 |
Theodore Ts'o | 153b449 | 2005-05-06 09:42:34 -0400 | [diff] [blame] | 125 | print " * " outfn ":" > outfile |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 126 | print " * This file is automatically generated; please do not edit it." > outfile |
| 127 | print " */" > outfile |
| 128 | |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 129 | print "" > outfile |
Theodore Ts'o | d035509 | 2003-05-05 23:07:32 -0400 | [diff] [blame] | 130 | print "#include <stdlib.h>" > outfile |
| 131 | print "" > outfile |
Theodore Ts'o | da5a6b4 | 2011-10-05 00:39:40 -0400 | [diff] [blame] | 132 | print "#define N_(a) a" > outfile |
| 133 | print "" > outfile |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 134 | print "static const char * const text[] = {" > outfile |
| 135 | table_item_count = 0 |
| 136 | } |
| 137 | |
Theodore Ts'o | b16fb62 | 2003-05-05 20:02:39 -0400 | [diff] [blame] | 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 |
Theodore Ts'o | da5a6b4 | 2011-10-05 00:39:40 -0400 | [diff] [blame] | 146 | printf "\tN_(%s),\n", cont_buf $0 > outfile |
Theodore Ts'o | b16fb62 | 2003-05-05 20:02:39 -0400 | [diff] [blame] | 147 | continuation = 0; |
| 148 | } |
| 149 | |
Theodore Ts'o | 44104b2 | 2003-08-01 08:59:40 -0400 | [diff] [blame] | 150 | /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[^ \t]/ { |
| 151 | # Be tolerant to missing whitespace after `,' ... |
| 152 | sub(/,/, ", ") |
| 153 | } |
| 154 | |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 155 | /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*$/ { |
Theodore Ts'o | b16fb62 | 2003-05-05 20:02:39 -0400 | [diff] [blame] | 156 | table_item_count++ |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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); |
Theodore Ts'o | da5a6b4 | 2011-10-05 00:39:40 -0400 | [diff] [blame] | 167 | printf "\tN_(%s),\n", text > outfile |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 168 | table_item_count++ |
| 169 | } |
| 170 | |
Theodore Ts'o | b16fb62 | 2003-05-05 20:02:39 -0400 | [diff] [blame] | 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 |
Theodore Ts'o | 5bf9b4c | 2005-07-19 08:24:59 -0500 | [diff] [blame] | 179 | table_item_count++ |
Theodore Ts'o | b16fb62 | 2003-05-05 20:02:39 -0400 | [diff] [blame] | 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 | |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 193 | { |
| 194 | if (skipone) { |
Theodore Ts'o | da5a6b4 | 2011-10-05 00:39:40 -0400 | [diff] [blame] | 195 | printf "\tN_(%s),\n", $0 > outfile |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 196 | } |
| 197 | skipone=0 |
| 198 | } |
Theodore Ts'o | d035509 | 2003-05-05 23:07:32 -0400 | [diff] [blame] | 199 | |
Theodore Ts'o | 44104b2 | 2003-08-01 08:59:40 -0400 | [diff] [blame] | 200 | /^[ \t]*(prefix)$/ { |
| 201 | prefix_str = "" |
| 202 | } |
| 203 | |
Theodore Ts'o | d035509 | 2003-05-05 23:07:32 -0400 | [diff] [blame] | 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++) { |
Theodore Ts'o | da5a6b4 | 2011-10-05 00:39:40 -0400 | [diff] [blame] | 211 | printf "\tN_(\"Reserved %s error (%d)\"),\n", \ |
Theodore Ts'o | d035509 | 2003-05-05 23:07:32 -0400 | [diff] [blame] | 212 | table_name, table_item_count++ > outfile |
| 213 | } |
| 214 | } |
| 215 | |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 216 | END { |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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) { |
Theodore Ts'o | 00aba96 | 2003-03-19 19:46:02 -0500 | [diff] [blame] | 232 | print "const struct error_table et_" table_name "_error_table = { text, " \ |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 233 | sprintf("%dL, %d };", tab_base_sign*tab_base_low, \ |
| 234 | table_item_count) > outfile |
| 235 | } else { |
Theodore Ts'o | 00aba96 | 2003-03-19 19:46:02 -0500 | [diff] [blame] | 236 | print "const struct error_table et_" table_name "_error_table = { text, " \ |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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 |
Theodore Ts'o | e7d32fc | 2005-06-20 16:24:04 -0400 | [diff] [blame] | 243 | print "void initialize_" table_name "_error_table_r(struct et_list **list);" > outfile |
Theodore Ts'o | 291c904 | 1997-10-31 06:17:08 +0000 | [diff] [blame] | 244 | print "void initialize_" table_name "_error_table(void);" > outfile |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 245 | print "" > outfile |
Theodore Ts'o | 291c904 | 1997-10-31 06:17:08 +0000 | [diff] [blame] | 246 | print "void initialize_" table_name "_error_table(void) {" > outfile |
Theodore Ts'o | e7d32fc | 2005-06-20 16:24:04 -0400 | [diff] [blame] | 247 | print " initialize_" table_name "_error_table_r(&_et_list);" > outfile |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 248 | print "}" > outfile |
Theodore Ts'o | d035509 | 2003-05-05 23:07:32 -0400 | [diff] [blame] | 249 | print "" > outfile |
Theodore Ts'o | 44104b2 | 2003-08-01 08:59:40 -0400 | [diff] [blame] | 250 | print "/* For Heimdal compatibility */" > outfile |
Theodore Ts'o | d035509 | 2003-05-05 23:07:32 -0400 | [diff] [blame] | 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 |
Theodore Ts'o | e7d32fc | 2005-06-20 16:24:04 -0400 | [diff] [blame] | 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 |
Theodore Ts'o | d035509 | 2003-05-05 23:07:32 -0400 | [diff] [blame] | 265 | print " et->table = &et_" table_name "_error_table;" > outfile |
| 266 | print " et->next = 0;" > outfile |
| 267 | print " *end = et;" > outfile |
| 268 | print "}" > outfile |
Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 269 | } |