# 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...

/^(static| )*(const +)?CONFIG_INT_TABLE .*\{/,/\};/ { 
    if ($1 ~ /VAR/) {
	print "int " substr($3,2,length($3)-2) ";" > "int_vars.h"
	if (++itab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
	    print |"sed 's/[ 	][ 	]*/ /g' > int_table.h"
	}
    }
}
/^(static| )*(const +)?CONFIG_STR_TABLE .*\{/,/\};/ { 
    if ($1 ~ /^VAR/) {
	print "char *" substr($3,2,length($3)-2) ";" > "str_vars.h"
	if (++stab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
	    print |"sed 's/[ 	][ 	]*/ /g' > str_table.h"
	}
    }
}
/^(static| )*(const +)?CONFIG_RAW_TABLE .*\{/,/\};/ { 
    if ($1 ~ /^VAR/) {
	print "char *" substr($3,2,length($3)-2) ";" > "raw_vars.h"
	if (++rtab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
	    print |"sed 's/[ 	][ 	]*/ /g' > raw_table.h"
	}
    }
}
/^(static| )*(const +)?CONFIG_BOOL_TABLE .*\{/,/\};/ { 
    if ($1 ~ /^VAR/) {
	print "int " substr($3,2,length($3)-2) ";" > "bool_vars.h"
	if (++btab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
	    print |"sed 's/[ 	][ 	]*/ /g' > bool_table.h"
	}
    }
}
/^(static| )*(const +)?CONFIG_TIME_TABLE .*\{/,/\};/ { 
    if ($1 ~ /^VAR/) {
	print "int " substr($3,2,length($3)-2) ";" > "time_vars.h"
	if (++ttab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
	    print |"sed 's/[ 	][ 	]*/ /g' > time_table.h" 
	}
    }
}

# Workaround for broken gawk versions.

END { exit(0); }
