Previous patch

Home

Next patch

./src/configen.pl

Patch: Additional logging in NTP

+#!/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";
+}
+-