Home | History | Annotate | Line # | Download | only in mantools
      1 #!/usr/bin/perl
      2 
      3 use Getopt::Std;
      4 
      5 # xpostconf - extract parameter info from postconf prototype file
      6 
      7 # Usage: xpostconf [options] protofile [parameter...]
      8 #
      9 # -b: Brief output: print only the first sentence of each definition
     10 #
     11 # -c: print the classes named on the command line (default: all).
     12 #
     13 # -h: print help message.
     14 #
     15 # -p: print the parameters named on the command line (default: all).
     16 #
     17 # -s specfile: process the entries listed in the named file: ordinary
     18 # text is copied as is, 
     19 #	%CLASS class-name mode
     20 #	%PARAM param-name mode
     21 # are replaced by the respective information. Mode is b (brief)
     22 # f (full) or i (ignore).
     23 #
     24 # If no -s is specified, extracts the named parameter text (all
     25 # parameters by default).
     26 
     27 $opt_b = undef;
     28 $opt_c = undef;
     29 $opt_p = undef;
     30 $opt_s = undef;
     31 $opt_v = undef;
     32 getopts("bcps:v");
     33 
     34 die "Usage: $0 [-bcpv] [-s specfile] protofile [parameter...]\n" 
     35 	unless $protofile = shift(@ARGV);
     36 
     37 # Save one definition.
     38 
     39 sub save_text {
     40     if ($category eq "PARAM") {
     41 	$param_text{$name} = $text;
     42 	if ($opt_v) {
     43 	    printf "saving entry %s %.20s..\n", $name, $text;
     44 	} 
     45     } elsif ($category eq "CLASS") {
     46 	$class_text{$name} = $text;
     47 	if ($opt_v) {
     48 	    printf "saving class %s %.20s..\n", $name, $text;
     49 	} 
     50     } else {
     51 	die "Unknown category: $category. Need PARAM or CLASS.\n";
     52     }
     53 }
     54 
     55 # Read the whole file even if we want to print only one parameter.
     56 
     57 open(POSTCONF, $protofile) || die " cannot open $protofile: $!\n";
     58 
     59 while(<POSTCONF>) {
     60 
     61     next if /^#/ && $text eq "";
     62     next unless ($name || /\S/);
     63 
     64     if (/^%(PARAM|CLASS)/) {
     65 
     66 	# Save the accumulated text.
     67 
     68 	if ($name && $text) {
     69 	    save_text();
     70 	}
     71 
     72 	# Reset the parameter name and accumulated text.
     73 
     74 	$name = $text = "";
     75 	$category = $1;
     76 
     77 	# Accumulate the parameter name and default value.
     78 
     79 	do {
     80 	    $text .= $_;
     81 	} while(($_ = <POSTCONF>) && /\S/);
     82 	($junk, $name, $junk) = split(/\s+/, $text, 3);
     83 
     84     } 
     85 
     86     # Accumulate the text in the class or parameter definition.
     87 
     88     $text .= $_;
     89 
     90 }
     91 
     92 # Save the last definition.
     93 
     94 if ($name && $text) {
     95     save_text();
     96 }
     97 
     98 # If working from a spec file, emit output in the specified order.
     99 
    100 if ($opt_s) {
    101     open(SPEC, "$opt_s") || die "cannot open $opt_s: $!\m";
    102     while(<SPEC>) {
    103 	if (/^%/) {
    104 	    ($category, $name, $mode) = split(/\s+/, substr($_, 1));
    105 	    if ($category eq "CLASS") {
    106 		die "Unknown class name: $name.\n" 
    107 		    unless $text = $class_text{$name};
    108 	    } elsif ($category eq "PARAM") {
    109 		die "Unknown parameter name: $name.\n"
    110 		    unless $text = $param_text{$name};
    111 	    } else {
    112 		die "Unknown category: $category. Need CLASS or PARAM\n";
    113 	    }
    114 	    if ($mode eq "i") {
    115 		next;
    116 	    } elsif ($mode eq "b") {
    117 		$text =~ s/\.\s.*/.\n\n/s;
    118 	    } elsif ($mode ne "p") {
    119 		die "Unknown mode: $mode. Need b or p or i,\n";
    120 	    }
    121 	    print $text, "\n";
    122 	} else {
    123 	    print;
    124 	}
    125     }
    126     exit;
    127 }
    128 
    129 # Print all the parameters.
    130 
    131 if ($opt_c) {
    132     $what = \%class_text;
    133 } else {
    134     $what = \%param_text;
    135 }
    136 
    137 if ($#ARGV < 0) {
    138     for $name (sort keys %{$what}) {
    139 	$text = ${$what}{$name};
    140 	$text =~ s/\.\s.*/.\n\n/s if ($opt_b);
    141 	print $text, "\n";
    142     }
    143 } 
    144 
    145 # Print parameters in the specified order.
    146 
    147 else {
    148     for $name (@ARGV) {
    149 	$text = ${$what}{$name};
    150 	$text =~ s/\.\s.*/.\n\n/s if ($opt_b);
    151 	print $text;
    152     }
    153 }
    154