1# Extract initialization tables from actual source code.
2
3# XXX: Associated variable aliasing:
4#
5# Some parameters bind to different variables in different contexts,
6# And other parameters map to associated variables in a many-to-1
7# fashion. This is mostly the result of the SMTP+LMTP integration
8# and the overloading of parameters that have identical semantics,
9# for the corresponding context.
10#
11# The "++table[...]" below ignores the associated variable name
12# when doing duplicate elimination. Differences in the default value
13# or lower/upper bounds still result in "postconf -d" duplicates,
14# which are a sign of an error somewhere...
15#
16# XXX Work around ancient AWK implementations with a 10 file limit
17# and no working close() operator (e.g. Solaris). Some systems
18# have a more modern implementation that is XPG4-compatible, but it
19# is too much bother to find out where each system keeps these.
20
21{ owned_by_library = (FILENAME ~ /\/(global|tls)\//) }
22
23/^(static| )*(const +)?CONFIG_INT_TABLE .*\{/,/\};/ {
24    if ($1 ~ /VAR/) {
25          if (!owned_by_library)
26              int_vars["int " substr($3,2,length($3)-2) ";"] = 1
27          if (++itab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
28              int_table[$0] = 1
29          }
30    }
31}
32/^(static| )*(const +)?CONFIG_STR_TABLE .*\{/,/\};/ {
33    if ($1 ~ /^VAR/) {
34          if (!owned_by_library)
35              str_vars["char *" substr($3,2,length($3)-2) ";"] = 1
36          if (++stab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
37              str_table[$0] = 1
38          }
39    }
40}
41/^(static| )*(const +)?CONFIG_STR_FN_TABLE .*\{/,/\};/ {
42    if ($1 ~ /^VAR/) {
43          if (!owned_by_library)
44              str_fn_vars["char *" substr($3,2,length($3)-2) ";"] = 1
45          $2 = "pcf_" $2
46          if (++stab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
47              str_fn_table[$0] = 1
48          }
49    }
50}
51/^(static| )*(const +)?CONFIG_RAW_TABLE .*\{/,/\};/ {
52    if ($1 ~ /^VAR/) {
53          if (!owned_by_library)
54              raw_vars["char *" substr($3,2,length($3)-2) ";"] = 1
55          if (++rtab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
56              raw_table[$0] = 1
57          }
58    }
59}
60/^(static| )*(const +)?CONFIG_BOOL_TABLE .*\{/,/\};/ {
61    if ($1 ~ /^VAR/) {
62          if (!owned_by_library)
63              bool_vars["int " substr($3,2,length($3)-2) ";"] = 1
64          if (++btab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
65              bool_table[$0] = 1
66          }
67    }
68}
69/^(static| )*(const +)?CONFIG_TIME_TABLE .*\{/,/\};/ {
70    if ($1 ~ /^VAR/) {
71          if (!owned_by_library)
72              time_vars["int " substr($3,2,length($3)-2) ";"] = 1
73          if (++ttab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
74              time_table[$0] = 1
75          }
76    }
77}
78/^(static| )*(const +)?CONFIG_NINT_TABLE .*\{/,/\};/ {
79    if ($1 ~ /VAR/) {
80          if (!owned_by_library)
81              nint_vars["int " substr($3,2,length($3)-2) ";"] = 1
82          if (++itab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
83              nint_table[$0] = 1
84          }
85    }
86}
87/^(static| )*(const +)?CONFIG_NBOOL_TABLE .*\{/,/\};/ {
88    if ($1 ~ /^VAR/) {
89          if (!owned_by_library)
90              nbool_vars["int " substr($3,2,length($3)-2) ";"] = 1
91          if (++btab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
92              nbool_table[$0] = 1
93          }
94    }
95}
96/^(static| )*(const +)?CONFIG_LONG_TABLE .*\{/,/\};/ {
97    if ($1 ~ /VAR/) {
98          if (!owned_by_library)
99              long_vars["long " substr($3,2,length($3)-2) ";"] = 1
100          if (++itab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
101              long_table[$0] = 1
102          }
103    }
104}
105
106END {
107    # Print parameter declarations without busting old AWK's file limit.
108    print "cat >int_vars.h <<'EOF'"
109    for (key in int_vars)
110          print key
111    print "EOF"
112
113    print "cat >str_vars.h <<'EOF'"
114    for (key in str_vars)
115          print key
116    print "EOF"
117
118    print "cat >str_fn_vars.h <<'EOF'"
119    for (key in str_fn_vars)
120          print key
121    print "EOF"
122
123    print "cat >raw_vars.h <<'EOF'"
124    for (key in raw_vars)
125          print key
126    print "EOF"
127
128    print "cat >bool_vars.h <<'EOF'"
129    for (key in bool_vars)
130          print key
131    print "EOF"
132
133    print "cat >time_vars.h <<'EOF'"
134    for (key in time_vars)
135          print key
136    print "EOF"
137
138    print "cat >nint_vars.h <<'EOF'"
139    for (key in nint_vars)
140          print key
141    print "EOF"
142
143    print "cat >nbool_vars.h <<'EOF'"
144    for (key in nbool_vars)
145          print key
146    print "EOF"
147
148    print "cat >long_vars.h <<'EOF'"
149    for (key in long_vars)
150          print key
151    print "EOF"
152
153    # Print parameter initializations without busting old AWK's file limit.
154    print "sed 's/[           ][        ]*/ /g' >int_table.h <<'EOF'"
155    for (key in int_table)
156          print key
157    print "EOF"
158
159    print "sed 's/[           ][        ]*/ /g' >str_table.h <<'EOF'"
160    for (key in str_table)
161          print key
162    print "EOF"
163
164    print "sed 's/[           ][        ]*/ /g' >str_fn_table.h <<'EOF'"
165    for (key in str_fn_table)
166          print key
167    print "EOF"
168
169    print "sed 's/[           ][        ]*/ /g' >raw_table.h <<'EOF'"
170    for (key in raw_table)
171          print key
172    print "EOF"
173
174    print "sed 's/[           ][        ]*/ /g' >bool_table.h <<'EOF'"
175    for (key in bool_table)
176          print key
177    print "EOF"
178
179    print "sed 's/[           ][        ]*/ /g' >time_table.h <<'EOF'"
180    for (key in time_table)
181          print key
182    print "EOF"
183
184    print "sed 's/[           ][        ]*/ /g' >nint_table.h <<'EOF'"
185    for (key in nint_table)
186          print key
187    print "EOF"
188
189    print "sed 's/[           ][        ]*/ /g' >nbool_table.h <<'EOF'"
190    for (key in nbool_table)
191          print key
192    print "EOF"
193
194    print "sed 's/[           ][        ]*/ /g' >long_table.h <<'EOF'"
195    for (key in long_table)
196          print key
197    print "EOF"
198
199    # Flush output nicely.
200    exit(0);
201}
202