#!/usr/bin/perl

for $filename (@ARGV) {
    open(SRC, $filename) || die "$filename: $!";
    $state = 0;
    delete @tvars{keys %tvars};
    $module = "";
    while(<SRC>) {
	chomp;
	if(($state == 0) && /struct configvar/ && /\[\]/) {
	    $state = 1;
	}
	if(($state == 0) && /struct module/ && /=/) {
	    $state = 3;
	}
	if(($state == 1) && /^\s*\/\*\*/) {
	    $curdoc = "";
	    $state = 2;
	    s/^\s*\/\*//;
	}
	if(($state == 1) && /\{CONF_VAR_(\w+), \"([^\"]*)\"/) {
	    $var = $2; $type = $1; $def = "";
	    if($type eq "INT") {
		($def) = /\.num = (\d+)/;
	    } elsif($type eq "BOOL") {
		($def) = /\.num = (\d+)/;
		if($def) {
		    $def = "true";
		} else {
		    $def = "false";
		}
	    } elsif($type eq "STRING") {
		($def) = /\.str = L\"([^\"]*)\"/;
		$def = "\"$def\"";
	    }
	    $tvars{$var} = {"doc" => $curdoc, "type" => $type, "def" => $def};
	    $curdoc = "";
	}
	if(($state == 1) && /\s*\};$/) {
	    $state = 0;
	}
	if($state == 2) {
	    if(/\*\/$/) {
		$state = 1;
		s/\*\/$//;
	    }
	    s/^\s*\*\s*//;
	    s/\s*$//;
	    if(length($curdoc) > 0) {
		$curdoc .= " ";
	    }
	    $curdoc .= $_;
	}
	if(($state == 3) && /\.name\s*=\s*\"([^\"]+)\"/) {
	    $module = $1;
	}
	if(($state == 3) && /\s*\};$/) {
	    $state = 0;
	}
    }
    close SRC;
    #$module = $filename;
    #$module =~ s/^.*\///;
    #$module =~ s/\..*$//;
    if($module eq "") {
	print STDERR "$filename is not a module\n";
    } else {
	print STDERR ("$filename is module $module and has " . scalar(keys %tvars) . " variables\n");
	for $var (keys %tvars) {
	    $vars{"$module.$var"} = $tvars{$var};
	}
    }
}
print STDERR ("total number of variables: " . scalar(keys %vars) . "\n");

$types{"BOOL"} = "boolean";
$types{"INT"} = "integer";
$types{"STRING"} = "string";
$types{"IPV4"} = "IPv4 address";
while(<STDIN>) {
    if(/\@DATE\@/) {
	@lt = localtime time;
	$date = sprintf("%04i-%02i-%02i", $lt[5] + 1900, $lt[4] + 1, $lt[3]);
	s/\@DATE\@/$date/;
    }
    if(/\@VARIABLES\@/) {
	$_ = "";
	for $var (sort keys %vars) {
	    $_ .= ".TP\n.BI $var \" ";
	    $_ .= $types{$vars{$var}->{"type"}};
	    $_ .= "\"\n";
	    $_ .= $vars{$var}->{"doc"};
	    if(!($vars{$var}->{"type"} eq "IPV4")) {
		$_ .= "\n\nDefault value: ";
		$_ .= $vars{$var}->{"def"};
	    }
	    $_ .= "\n";
	}
    }
    print;
}
