Whamcloud - gitweb
Fixes necessary for e2fsprogs to work using the diet libc.
[tools/e2fsprogs.git] / lib / et / et_h.awk
1 BEGIN { 
2 char_shift=64
3 ## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
4 c2n["A"]=1
5 c2n["B"]=2
6 c2n["C"]=3
7 c2n["D"]=4
8 c2n["E"]=5
9 c2n["F"]=6
10 c2n["G"]=7
11 c2n["H"]=8
12 c2n["I"]=9
13 c2n["J"]=10
14 c2n["K"]=11
15 c2n["L"]=12
16 c2n["M"]=13
17 c2n["N"]=14
18 c2n["O"]=15
19 c2n["P"]=16
20 c2n["Q"]=17
21 c2n["R"]=18
22 c2n["S"]=19
23 c2n["T"]=20
24 c2n["U"]=21
25 c2n["V"]=22
26 c2n["W"]=23
27 c2n["X"]=24
28 c2n["Y"]=25
29 c2n["Z"]=26
30 c2n["a"]=27
31 c2n["b"]=28
32 c2n["c"]=29
33 c2n["d"]=30
34 c2n["e"]=31
35 c2n["f"]=32
36 c2n["g"]=33
37 c2n["h"]=34
38 c2n["i"]=35
39 c2n["j"]=36
40 c2n["k"]=37
41 c2n["l"]=38
42 c2n["m"]=39
43 c2n["n"]=40
44 c2n["o"]=41
45 c2n["p"]=42
46 c2n["q"]=43
47 c2n["r"]=44
48 c2n["s"]=45
49 c2n["t"]=46
50 c2n["u"]=47
51 c2n["v"]=48
52 c2n["w"]=49
53 c2n["x"]=50
54 c2n["y"]=51
55 c2n["z"]=52
56 c2n["0"]=53
57 c2n["1"]=54
58 c2n["2"]=55
59 c2n["3"]=56
60 c2n["4"]=57
61 c2n["5"]=58
62 c2n["6"]=59
63 c2n["7"]=60
64 c2n["8"]=61
65 c2n["9"]=62
66 c2n["_"]=63
67 }
68 /^#/ { next }
69 /^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ {
70         table_number = 0
71         table_name = $2
72         mod_base = 1000000
73         for(i=1; i<=length(table_name); i++) {
74             table_number=(table_number*char_shift)+c2n[substr(table_name,i,1)]
75         }
76         # We start playing *_high, *low games here because the some
77         # awk programs do not have the necessary precision (sigh)
78         tab_base_low = table_number % mod_base
79         if (tab_base_low < 0) {
80                 # Work around stupid bug in the ARM libm
81                 tab_base_low = tab_base_low + mod_base
82         }
83         tab_base_high = int(table_number / mod_base)
84         tab_base_sign = 1;
85
86         # figure out: table_number_base=table_number*256
87         tab_base_low = tab_base_low * 256
88         tab_base_high = (tab_base_high * 256) + \
89                         int(tab_base_low / mod_base)
90         tab_base_low = tab_base_low % mod_base
91         if (tab_base_low < 0) {
92                 # Work around stupid bug in the ARM libm
93                 tab_base_low = tab_base_low + mod_base
94         }
95
96         if (table_number > 128*256*256) {
97                 # figure out:  table_number_base -= 256*256*256*256
98                 # sub_high, sub_low is 256*256*256*256
99                 sub_low = 256*256*256 % mod_base
100                 sub_high = int(256*256*256 / mod_base)
101
102                 sub_low = sub_low * 256
103                 sub_high = (sub_high * 256) + int(sub_low / mod_base)
104                 sub_low = sub_low % mod_base
105
106                 tab_base_low = sub_low - tab_base_low;
107                 tab_base_high = sub_high - tab_base_high;
108                 tab_base_sign = -1;
109                 if (tab_base_low < 0) {
110                         tab_base_low = tab_base_low + mod_base
111                         tab_base_high--
112                 }
113         }
114         curr_low = tab_base_low
115         curr_high = tab_base_high
116         curr_sign = tab_base_sign
117         print "/*" > outfile
118         print " * " outfile ":" > outfile
119         print " * This file is automatically generated; please do not edit it." > outfile
120         print " */" > outfile
121         print "" > outfile
122 }
123
124 /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,/ {
125         tag=substr($2,1,length($2)-1)
126         if (curr_high == 0) {
127                 printf "#define %-40s (%dL)\n", tag, \
128                         curr_sign*curr_low > outfile
129         } else {
130                 printf "#define %-40s (%d%06dL)\n", tag, curr_high*curr_sign, \
131                         curr_low > outfile
132         }
133         curr_low += curr_sign;
134         if (curr_low >= mod_base) {
135                 curr_low -= mod_base;
136                 curr_high++
137         }
138         if (curr_low < 0) {
139                 cur_low += mod_base
140                 cur_high--
141         }
142 }
143
144 END {
145         print "extern void initialize_" table_name "_error_table(void);" > outfile
146         if (tab_base_high == 0) {
147                 print "#define ERROR_TABLE_BASE_" table_name " (" \
148                         sprintf("%d", tab_base_sign*tab_base_low) \
149                         "L)" > outfile
150         } else {
151                 print "#define ERROR_TABLE_BASE_" table_name " (" \
152                         sprintf("%d%06d", tab_base_sign*tab_base_high, \
153                         tab_base_low) "L)" > outfile
154         }
155         print "" > outfile
156         print "/* for compatibility with older versions... */" > outfile
157         print "#define init_" table_name "_err_tbl initialize_" table_name "_error_table" > outfile
158         print "#define " table_name "_err_base ERROR_TABLE_BASE_" table_name > outfile
159 }