version 1.1, 2002/01/03 03:49:16 |
version 1.2, 2004/09/28 15:10:51 |
|
|
# var_name |
# var_name |
# TYPE |
# TYPE |
# description (or NULL) |
# description (or NULL) |
|
# array of struct def_values if TYPE == T_TUPLE |
|
|
# Deal with optional -o (output) argument |
# Deal with optional -o (output) argument |
if ($#ARGV > 0 && $ARGV[0] eq "-o") { |
if ($#ARGV > 0 && $ARGV[0] eq "-o") { |
|
|
$header .= '.h'; |
$header .= '.h'; |
$cfile .= '.c'; |
$cfile .= '.c'; |
} |
} |
die "usage: $0 input_file" unless $#ARGV == 0; |
die "usage: $0 input_file\n" unless $#ARGV == 0; |
|
|
$infile = $ARGV[0]; |
$infile = $ARGV[0]; |
if (!defined($header)) { |
if (!defined($header)) { |
|
|
open(HEADER, ">$header") || die "$0: can't open $header: $!\n"; |
open(HEADER, ">$header") || die "$0: can't open $header: $!\n"; |
open(CFILE, ">$cfile") || die "$0: can't open $cfile: $!\n"; |
open(CFILE, ">$cfile") || die "$0: can't open $cfile: $!\n"; |
|
|
print CFILE "struct sudo_defs_types sudo_defs_table[] = {\n {\n"; |
$count = 0; |
|
@tuple_values = ( "never" ); |
$count = -1; |
@records = (); |
while(<IN>) { |
while(<IN>) { |
chomp; |
chomp; |
|
s/\s*#.*$//; |
next if /^\s*$/; |
next if /^\s*$/; |
next if /^\s*#/; |
|
|
|
if (/^\S/) { |
if (/^\S/) { |
# Print last record |
# Store previous record and begin new one |
&print_record() if defined($var); |
$records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var); |
|
|
$var = $_; |
$var = $_; |
($type, $desc) = (undef, undef); |
$type = ''; |
$count++; |
$desc = undef; |
|
$values = undef; |
|
$callback = undef; |
|
$field = 0; |
} else { |
} else { |
|
$field++; |
s/^\s+//; |
s/^\s+//; |
s/\s+$//; |
s/\s+$//; |
die "$0: syntax error near line $.\n" if |
if ($field == 1) { |
defined($type) && defined($desc); |
# type |
next if /^NULL$/; |
|
if (defined($type)) { |
|
# Strip leading and trailing double quote and escape the rest |
|
s/^"//; |
|
s/"$//; |
|
s/"/\\"/g; |
|
$desc = "\"$_\""; |
|
} else { |
|
$type = $_; |
$type = $_; |
|
} elsif ($field == 2) { |
|
# description |
|
if ($_ eq "NULL") { |
|
$desc = "NULL"; |
|
} else { |
|
# Strip leading and trailing double quote and escape the rest |
|
s/^"//; |
|
s/"$//; |
|
s/"/\\"/g; |
|
$desc = "\"$_\""; |
|
} |
|
} elsif ($field == 3 || $field == 4) { |
|
if (s/^\*//) { |
|
$callback = $_; |
|
} else { |
|
die "$0: syntax error near line $.\n" if $type !~ /^T_TUPLE/; |
|
$values = [ split ]; |
|
foreach $v (@$values) { |
|
push(@tuple_values, $v) unless grep(/^$v$/, @tuple_values); |
|
} |
|
} |
|
} else { |
|
die "$0: syntax error near line $.\n"; |
} |
} |
} |
} |
} |
} |
&print_record(); |
$records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var); |
|
|
|
# Print out value arrays |
|
for ($i = 0; $i < $count; $i++) { |
|
if (defined($records[$i]->[3])) { |
|
die "Values list specified for non-tupple\n" unless |
|
$records[$i]->[1] =~ /^T_TUPLE/; |
|
printf CFILE "static struct def_values def_data_%s[] = {\n", $records[$i]->[0]; |
|
foreach (@{$records[$i]->[3]}) { |
|
print CFILE " { \"$_\", $_ },\n"; |
|
} |
|
print CFILE " { NULL, 0 },\n"; |
|
print CFILE "};\n\n"; |
|
} |
|
} |
|
|
|
# Print each record |
|
print CFILE "struct sudo_defs_types sudo_defs_table[] = {\n {\n"; |
|
for ($i = 0; $i < $count; $i++) { |
|
&print_record($records[$i], $i); |
|
} |
print CFILE "\tNULL, 0, NULL\n }\n};\n"; |
print CFILE "\tNULL, 0, NULL\n }\n};\n"; |
|
|
|
# Print out def_tuple |
|
if (@tuple_values) { |
|
print HEADER "\nenum def_tupple {\n"; |
|
foreach (@tuple_values) { |
|
print HEADER "\t$_,\n"; |
|
} |
|
print HEADER "};\n"; |
|
} |
|
|
close(IN); |
close(IN); |
close(HEADER); |
close(HEADER); |
close(CFILE); |
close(CFILE); |
|
|
sub print_record { |
sub print_record { |
$defname = "I_" . uc($var); |
my ($rec, $recnum) = @_; |
printf HEADER "#define %-24s%d", $defname, $count; |
my ($i, $v, $defname); |
#print HEADER "\t/* $desc */" if defined($desc); |
# each variable gets a macro to access its value |
|
for ($rec->[1]) { |
|
if (/^T_U?INT/) { $v = "ival"; } |
|
elsif (/^T_STR/) { $v = "str"; } |
|
elsif (/^T_FLAG/) { $v = "flag"; } |
|
elsif (/^T_MODE/) { $v = "mode"; } |
|
elsif (/^T_LIST/) { $v = "list"; } |
|
elsif (/^T_LOGFAC/) { $v = "ival"; } |
|
elsif (/^T_LOGPRI/) { $v = "ival"; } |
|
elsif (/^T_TUPLE/) { $v = "tuple"; } |
|
else { die "$0: unknown defaults type: $type\n"; } |
|
} |
|
printf HEADER "#define %-23s (sudo_defs_table[$recnum].sd_un.${v})\n", |
|
"def_$rec->[0]"; |
|
|
|
$defname = "I_" . uc($rec->[0]); |
|
printf HEADER "#define %-24s%d", $defname, $recnum; |
|
#print HEADER "\t/* $rec->[2] */" if defined($rec->[2]); |
print HEADER "\n"; |
print HEADER "\n"; |
|
|
$desc = "NULL" unless defined($desc); |
print CFILE "\t\"$rec->[0]\", $rec->[1],\n\t$rec->[2],\n"; |
print CFILE "\t\"$var\", $type,\n\t$desc\n }, {\n"; |
if (defined($rec->[3])) { |
|
printf CFILE "\tdef_data_$rec->[0],\n"; |
|
} else { |
|
printf CFILE "\tNULL,\n"; |
|
} |
|
printf CFILE "\t$rec->[4],\n" if defined($rec->[4]); |
|
print CFILE " }, {\n"; |
} |
} |