# Extract initialization tables from actual source code.
# XXX: Associated variable aliasing:
#
# Some parameters bind to different variables in different contexts,
# And other parameters map to associated variables in a many-to-1
# fashion. This is mostly the result of the SMTP+LMTP integration
# and the overloading of parameters that have identical semantics,
# for the corresponding context.
#
# The "++table[...]" below ignores the associated variable name
# when doing duplicate elimination. Differences in the default value
# or lower/upper bounds still result in "postconf -d" duplicates,
# which are a sign of an error somewhere...
#
# XXX Work around ancient AWK implementations with a 10 file limit
# and no working close() operator (e.g. Solaris). Some systems
# have a more modern implementation that is XPG4-compatible, but it
# is too much bother to find out where each system keeps these.
{ owned_by_library = (FILENAME ~ /\/(global|tls)\//) }
/^(static| )*(const +)?CONFIG_INT_TABLE .*\{/,/\};/ {
if ($1 ~ /VAR/) {
if (!owned_by_library)
int_vars["int " substr($3,2,length($3)-2) ";"] = 1
if (++itab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
int_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_STR_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
str_vars["char *" substr($3,2,length($3)-2) ";"] = 1
if (++stab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
str_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_STR_FN_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
str_fn_vars["char *" substr($3,2,length($3)-2) ";"] = 1
$2 = "pcf_" $2
if (++stab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
str_fn_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_RAW_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
raw_vars["char *" substr($3,2,length($3)-2) ";"] = 1
if (++rtab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
raw_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_BOOL_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
bool_vars["int " substr($3,2,length($3)-2) ";"] = 1
if (++btab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
bool_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_TIME_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
time_vars["int " substr($3,2,length($3)-2) ";"] = 1
if (++ttab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
time_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_NINT_TABLE .*\{/,/\};/ {
if ($1 ~ /VAR/) {
if (!owned_by_library)
nint_vars["int " substr($3,2,length($3)-2) ";"] = 1
if (++itab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
nint_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_NBOOL_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
nbool_vars["int " substr($3,2,length($3)-2) ";"] = 1
if (++btab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
nbool_table[$0] = 1
}
}
}
/^(static| )*(const +)?CONFIG_LONG_TABLE .*\{/,/\};/ {
if ($1 ~ /VAR/) {
if (!owned_by_library)
long_vars["long " substr($3,2,length($3)-2) ";"] = 1
if (++itab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
long_table[$0] = 1
}
}
}
END {
# Print parameter declarations without busting old AWK's file limit.
print "cat >int_vars.h <<'EOF'"
for (key in int_vars)
print key
print "EOF"
print "cat >str_vars.h <<'EOF'"
for (key in str_vars)
print key
print "EOF"
print "cat >str_fn_vars.h <<'EOF'"
for (key in str_fn_vars)
print key
print "EOF"
print "cat >raw_vars.h <<'EOF'"
for (key in raw_vars)
print key
print "EOF"
print "cat >bool_vars.h <<'EOF'"
for (key in bool_vars)
print key
print "EOF"
print "cat >time_vars.h <<'EOF'"
for (key in time_vars)
print key
print "EOF"
print "cat >nint_vars.h <<'EOF'"
for (key in nint_vars)
print key
print "EOF"
print "cat >nbool_vars.h <<'EOF'"
for (key in nbool_vars)
print key
print "EOF"
print "cat >long_vars.h <<'EOF'"
for (key in long_vars)
print key
print "EOF"
# Print parameter initializations without busting old AWK's file limit.
print "sed 's/[ ][ ]*/ /g' >int_table.h <<'EOF'"
for (key in int_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >str_table.h <<'EOF'"
for (key in str_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >str_fn_table.h <<'EOF'"
for (key in str_fn_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >raw_table.h <<'EOF'"
for (key in raw_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >bool_table.h <<'EOF'"
for (key in bool_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >time_table.h <<'EOF'"
for (key in time_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >nint_table.h <<'EOF'"
for (key in nint_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >nbool_table.h <<'EOF'"
for (key in nbool_table)
print key
print "EOF"
print "sed 's/[ ][ ]*/ /g' >long_table.h <<'EOF'"
for (key in long_table)
print key
print "EOF"
# Flush output nicely.
exit(0);
}