#!/usr/bin/perl -w
# configen.pl -- automatic config file parser generator written for frox.
# Needs a template file (in C), and a variable definitions file.
# This is the only perl program I have ever written, and it probably shows.
if (scalar @ARGV !=3) {
print STDERR "Usage $0 defs template output\n";
exit 1;
}
open DEFS, $ARGV[0]
or die "Can't open definitions file: $!";
open TEMPLATE, $ARGV[1]
or die "Can't open template file: $!";
open OUTPUT, ">$ARGV[2]"
or die "Can't open output file: $!";
while(<DEFS>){
next unless /\S/;
next if /^#/;
chomp;
push @defs, $_;
}
%i = ( "name" => 0,
"type" => 1,
"var" => 2,
"cl" => 3,
"reload" => 4,
"needed" => 5,
"default" => 6 );
while(<TEMPLATE>){
if(/%_REPLACE_/){
if(/%_REPLACE_OPTIONS_INIT_%/) {opt_init();}
if(/%_REPLACE_OPTIONS_DEFAULTS_%/) {opt_defaults();}
if(/%_REPLACE_OPTIONS_DEFINITION_%/) {opt_define();}
if(/%_REPLACE_COMMENT_%/) {print_comment();}
} else {
print OUTPUT;
}
}
exit 0;
sub opt_init {
foreach(@defs){
if(/^(ifdef|endif)/){
print OUTPUT "#$_\n";
next;
}
@tmp=split;
if(scalar @tmp != 7) {
print STDERR "Wrong number of args in template file\n";
print STDERR "\"$_\"\n";
exit 1;
}
if($tmp[$i{name}] =~ /^-$/) {$tmp[$i{name}]=""};
print OUTPUT ' {"'.$tmp[$i{name}].'",';
print OUTPUT " " x (16-length $tmp[$i{name}]);
print OUTPUT "$tmp[$i{type}],";
print OUTPUT " " x (8 - length $tmp[$i{type}]);
print OUTPUT "&config.$tmp[$i{var}],";
print OUTPUT " " x (12 - length $tmp[$i{var}]);
if($tmp[$i{cl}] =~ /^-$/) { print OUTPUT "'\\0', ";}
else { print OUTPUT "'$tmp[$i{cl}]', ";}
print OUTPUT "$tmp[$i{reload}],";
print OUTPUT " " x (6 - length $tmp[$i{needed}]);
print OUTPUT "$tmp[$i{needed}]";
print OUTPUT " " x (5 - length $tmp[$i{needed}]);
print OUTPUT "},\n"
}
print OUTPUT " {0, 0, 0, 0, 0, 0}\n";
}
sub opt_defaults {
foreach(@defs){
if(/^(ifdef|endif)/){
print OUTPUT "#$_\n";
next;
}
@tmp=split;
if(scalar @tmp != 7)
{die "Wrong number of args in template file" ;}
next if $tmp[$i{default}] =~ /^-$/;
if($tmp[$i{type}] =~ /PRTRNGE/) {
print OUTPUT "\tsstr_cpy2(tmp, \"$tmp[$i{name}] $tmp[$i{default}]\");\n";
print OUTPUT "\tparse_line(tmp);\n";
} else {
print OUTPUT "\tconfig.$tmp[$i{var}] = $tmp[$i{default}];\n";
}
}
}
sub opt_define {
foreach(@defs){
next if /^(ifdef|endif)/; # Always define, just in case. #
@tmp=split;
if(scalar @tmp != 7)
{die "Wrong number of args in template file" ;}
elsif($tmp[$i{type}] =~ /^BOOL$/) {
print OUTPUT "\tint $tmp[$i{var}];\n";
}
elsif($tmp[$i{type}] =~ /^(FILENAME|DIRECTRY|STRING)$/) {
print OUTPUT "\tchar * $tmp[$i{var}];\n";
}
elsif($tmp[$i{type}] =~ /^ADDRESS$/) {
print OUTPUT "\tstruct in_addr $tmp[$i{var}];\n";
}
elsif($tmp[$i{type}] =~ /^ADDRPRT$/) {
print OUTPUT "\tstruct sockaddr_in $tmp[$i{var}];\n";
}
elsif($tmp[$i{type}] =~ /^INT$/) {
print OUTPUT "\tint $tmp[$i{var}];\n";
}
elsif($tmp[$i{type}] =~ /^PRTRNGE$/) {
print OUTPUT "\tint $tmp[$i{var}]"."[2];\n";
}
elsif($tmp[$i{type}] =~ /^ACL$/) {
print OUTPUT "\tstruct acl_list $tmp[$i{var}];\n";
}
elsif($tmp[$i{type}] =~ /^SUBSECT$/) {
print OUTPUT "\tstruct subsect_list $tmp[$i{var}];\n";
}
}
}
sub print_comment {
print OUTPUT "***** This file was autogenerated by $0 from\n";
print OUTPUT "***** $ARGV[0] and $ARGV[1]\n";
print OUTPUT "***** CHANGES TO THIS FILE WILL BE LOST. Please\n";
print OUTPUT "***** edit $ARGV[0] or $ARGV[1] instead\n";
}
syntax highlighted by Code2HTML, v. 0.9.1