Annotation of src/usr.bin/sudo/mkdefaults, Revision 1.1.2.1
1.1 millert 1: #!/usr/bin/perl -w
2: #
3: # Generate sudo_defs_table and associated defines
4: #
5: # Input should be formatted thusly:
6: #
7: # var_name
8: # TYPE
9: # description (or NULL)
10:
11: # Deal with optional -o (output) argument
12: if ($#ARGV > 0 && $ARGV[0] eq "-o") {
13: shift;
14: $header = $cfile = shift;
15: $header .= '.h';
16: $cfile .= '.c';
17: }
18: die "usage: $0 input_file" unless $#ARGV == 0;
19:
20: $infile = $ARGV[0];
21: if (!defined($header)) {
22: $header = $infile;
23: $header =~ s/(\.in)?$/.h/;
24: }
25: if (!defined($cfile)) {
26: $cfile = $infile;
27: $cfile =~ s/(\.in)?$/.c/;
28: }
29:
30: open(IN, "<$infile") || die "$0: can't open $infile: $!\n";
31: open(HEADER, ">$header") || die "$0: can't open $header: $!\n";
32: open(CFILE, ">$cfile") || die "$0: can't open $cfile: $!\n";
33:
34: print CFILE "struct sudo_defs_types sudo_defs_table[] = {\n {\n";
35:
36: $count = -1;
37: while(<IN>) {
38: chomp;
39: next if /^\s*$/;
40: next if /^\s*#/;
41:
42: if (/^\S/) {
43: # Print last record
44: &print_record() if defined($var);
45:
46: $var = $_;
47: ($type, $desc) = (undef, undef);
48: $count++;
49: } else {
50: s/^\s+//;
51: s/\s+$//;
52: die "$0: syntax error near line $.\n" if
53: defined($type) && defined($desc);
54: next if /^NULL$/;
55: if (defined($type)) {
56: # Strip leading and trailing double quote and escape the rest
57: s/^"//;
58: s/"$//;
59: s/"/\\"/g;
60: $desc = "\"$_\"";
61: } else {
62: $type = $_;
63: }
64: }
65: }
66: &print_record();
67: print CFILE "\tNULL, 0, NULL\n }\n};\n";
68:
69: close(IN);
70: close(HEADER);
71: close(CFILE);
72:
73: sub print_record {
74: $defname = "I_" . uc($var);
75: printf HEADER "#define %-24s%d", $defname, $count;
76: #print HEADER "\t/* $desc */" if defined($desc);
77: print HEADER "\n";
78:
79: $desc = "NULL" unless defined($desc);
80: print CFILE "\t\"$var\", $type,\n\t$desc\n }, {\n";
81: }