# Extract a documentation section from a CWEB file
# John Walker -- October 2002
# perl cwebextract.pl cwebfile.w 'section name'
# This program searches cwebfile.w for the specified
# 'section name' (which must appear on the line containing
# the "@" introducing the section--matching is case insensitive
# and the first partial match is accepted). The documentation
# following on subsequent lines until the next line with an
# "@" in column 1 (or end of file) is copied to standard
# output with initial and trailing blank lines discarded.
#
# This program is usually employed to extract TeX documentation
# from a CWEB file for translation to other documentation
# languages, for example, by the cwebtex2man.pl program in
# this directory.
# Validate command line arguments and open
# input file.
if ($#ARGV != 1) {
print(STDERR "Usage: perl cwebextract.pl cwebfile.w 'section name'\n");
exit(2);
}
$ifname = $ARGV[0];
open(FI, "<$ifname") || die("Cannot open input file $ifname");
$sec = $ARGV[1]; # Requested section name
$isec = $sec; # Save for diagnostics
# Transform Perl regular expression metacharacters into
# quoted literal characters for section search.
$sec =~ s/([\\\^\.\$\|\(\)\[\]\*\+\?\{\}])/\\$1/g;
#print("Transformed pattern: <<$sec>>\n");
$ln = 0;
# Search for requested section
while (&nextline) {
if (($l =~ m/^\@[\*\s]*/) &&
($l =~ m/^\S+.*$sec/i)) {
#print("Found: $l\n");
last;
}
}
if (!(defined $l)) {
print(STDERR "Section name \"$isec\" not found in $ifname.\n");
goto bail;
}
# Ignore blank lines before start of section text
while (&nextline && defined($l) && (length($l) > 0)) {
}
if (!(defined $l)) {
print(STDERR "Section name \"$isec\" is void in $ifname.\n");
goto bail;
}
# Accumulate lines from section in array. We store the
# lines in an array to permit trimming trailing blank
# lines without tangled logic.
$n = 0;
while (&nextline && defined($l) && (!($l =~ m/^\@/))) {
$text[$n++] = $l;
}
# End of section. Trim trailing blank lines.
while (($n > 0) && (length($text[$n - 1]) == 0)) {
$n--;
}
# Emit trimmed section to standard output.
for ($i = 0; $i < $n; $i++) {
print("$text[$i]\n");
}
exit(0); # Success
bail:
close(FI);
exit(1);
# Read the next line into $l, stripping trailing spaces.
# Returns 1 for success, 0 at end of file.
sub nextline {
if ($l = <FI>) {
$l =~ s/\s*$//;
$ln++;
return 1;
}
undef $l;
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1