]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blame - lib/et/et_h.awk
Change compile_et to generate header files that use <et/com_err.h>
[thirdparty/e2fsprogs.git] / lib / et / et_h.awk
CommitLineData
3839e657
TT
1BEGIN {
2char_shift=64
3## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
4c2n["A"]=1
5c2n["B"]=2
6c2n["C"]=3
7c2n["D"]=4
8c2n["E"]=5
9c2n["F"]=6
10c2n["G"]=7
11c2n["H"]=8
12c2n["I"]=9
13c2n["J"]=10
14c2n["K"]=11
15c2n["L"]=12
16c2n["M"]=13
17c2n["N"]=14
18c2n["O"]=15
19c2n["P"]=16
20c2n["Q"]=17
21c2n["R"]=18
22c2n["S"]=19
23c2n["T"]=20
24c2n["U"]=21
25c2n["V"]=22
26c2n["W"]=23
27c2n["X"]=24
28c2n["Y"]=25
29c2n["Z"]=26
30c2n["a"]=27
31c2n["b"]=28
32c2n["c"]=29
33c2n["d"]=30
34c2n["e"]=31
35c2n["f"]=32
36c2n["g"]=33
37c2n["h"]=34
38c2n["i"]=35
39c2n["j"]=36
40c2n["k"]=37
41c2n["l"]=38
42c2n["m"]=39
43c2n["n"]=40
44c2n["o"]=41
45c2n["p"]=42
46c2n["q"]=43
47c2n["r"]=44
48c2n["s"]=45
49c2n["t"]=46
50c2n["u"]=47
51c2n["v"]=48
52c2n["w"]=49
53c2n["x"]=50
54c2n["y"]=51
55c2n["z"]=52
56c2n["0"]=53
57c2n["1"]=54
58c2n["2"]=55
59c2n["3"]=56
60c2n["4"]=57
61c2n["5"]=58
62c2n["6"]=59
63c2n["7"]=60
64c2n["8"]=61
65c2n["9"]=62
66c2n["_"]=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
b6627cdd
TT
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 }
3839e657
TT
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
b6627cdd
TT
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 }
3839e657
TT
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
3839e657 121 print "" > outfile
91835c15 122 print "#include <et/com_err.h>" > outfile
00aba967 123 print "" > outfile
3839e657
TT
124}
125
126/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,/ {
127 tag=substr($2,1,length($2)-1)
128 if (curr_high == 0) {
129 printf "#define %-40s (%dL)\n", tag, \
130 curr_sign*curr_low > outfile
131 } else {
132 printf "#define %-40s (%d%06dL)\n", tag, curr_high*curr_sign, \
133 curr_low > outfile
134 }
135 curr_low += curr_sign;
136 if (curr_low >= mod_base) {
137 curr_low -= mod_base;
138 curr_high++
139 }
140 if (curr_low < 0) {
141 cur_low += mod_base
142 cur_high--
143 }
144}
145
146END {
00aba967 147 print "extern const struct error_table et_" table_name "_error_table;" > outfile
291c9049 148 print "extern void initialize_" table_name "_error_table(void);" > outfile
3839e657
TT
149 if (tab_base_high == 0) {
150 print "#define ERROR_TABLE_BASE_" table_name " (" \
151 sprintf("%d", tab_base_sign*tab_base_low) \
152 "L)" > outfile
153 } else {
154 print "#define ERROR_TABLE_BASE_" table_name " (" \
155 sprintf("%d%06d", tab_base_sign*tab_base_high, \
156 tab_base_low) "L)" > outfile
157 }
158 print "" > outfile
159 print "/* for compatibility with older versions... */" > outfile
160 print "#define init_" table_name "_err_tbl initialize_" table_name "_error_table" > outfile
161 print "#define " table_name "_err_base ERROR_TABLE_BASE_" table_name > outfile
162}