xref: /freebsd/crypto/krb5/src/util/et/et_h.awk (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
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
79	tab_base_high = int(table_number / mod_base)
80	tab_base_sign = 1;
81
82	# figure out: table_number_base=table_number*256
83	tab_base_low = tab_base_low * 256
84	tab_base_high = (tab_base_high * 256) + int(tab_base_low / mod_base)
85	tab_base_low = tab_base_low % mod_base
86
87	if (table_number > 128*256*256) {
88		# figure out:  table_number_base -= 256*256*256*256
89		# sub_high, sub_low is 256*256*256*256
90		sub_low = 256*256*256 % mod_base
91		sub_high = int(256*256*256 / mod_base)
92
93		sub_low = sub_low * 256
94		sub_high = (sub_high * 256) + int(sub_low / mod_base)
95		sub_low = sub_low % mod_base
96
97		tab_base_low = sub_low - tab_base_low;
98		tab_base_high = sub_high - tab_base_high;
99		tab_base_sign = -1;
100		if (tab_base_low < 0) {
101			tab_base_low = tab_base_low + mod_base
102			tab_base_high--
103		}
104	}
105	curr_low = tab_base_low
106	curr_high = tab_base_high
107	curr_sign = tab_base_sign
108	print "/*" > outfile
109	print " * " outfile ":" > outfile
110	print " * This file is automatically generated; please do not edit it." > outfile
111	print " */" > outfile
112	print "" > outfile
113	print "#include <com_err.h>" > outfile
114	print "" > outfile
115	table_item_count = 0
116}
117
118/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,/ {
119	tag=substr($2,1,length($2)-1)
120	if (curr_high == 0) {
121		printf "#define %-40s (%dL)\n", tag, curr_sign*curr_low > outfile
122	} else {
123		printf "#define %-40s (%d%06dL)\n", tag, curr_high*curr_sign, curr_low > outfile
124	}
125	curr_low += curr_sign;
126	if (curr_low >= mod_base) {
127		curr_low -= mod_base;
128		curr_high++
129	}
130	if (curr_low < 0) {
131		cur_low += mod_base
132		cur_high--
133	}
134}
135
136END {
137	if (table_item_count > 256) {
138	    print "Error table too large!" | "cat 1>&2"
139	    exit 1
140	}
141	if (tab_base_high == 0) {
142		base = sprintf("%dL", tab_base_sign * tab_base_low)
143	} else {
144		base = sprintf("%d%06dL", tab_base_sign * tab_base_high, tab_base_low)
145	}
146	print "#define ERROR_TABLE_BASE_" table_name " (" base ")" > outfile
147	print "" > outfile
148	print "extern const struct error_table et_" table_name "_error_table;" > outfile
149	print "" > outfile
150	print "#if !defined(_WIN32)" > outfile
151	print "/* for compatibility with older versions... */" > outfile
152	print "extern void initialize_" table_name "_error_table (void) /*@modifies internalState@*/;" > outfile
153	print "#else" > outfile
154	print "#define initialize_" table_name "_error_table()" > outfile
155	print "#endif" > outfile
156	print "" > outfile
157	print "#if !defined(_WIN32)" > outfile
158	print "#define init_" table_name "_err_tbl initialize_" table_name "_error_table" > outfile
159	print "#define " table_name "_err_base ERROR_TABLE_BASE_" table_name > outfile
160	print "#endif" > outfile
161}
162
163