aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdocs/autodocifier.pl255
1 files changed, 175 insertions, 80 deletions
diff --git a/docs/autodocifier.pl b/docs/autodocifier.pl
index 2ce1edd75..e5b9767d2 100755
--- a/docs/autodocifier.pl
+++ b/docs/autodocifier.pl
@@ -1,88 +1,183 @@
#!/usr/bin/perl -w
-#
-# autodocufier.pl - extracts usage messages from busybox usage.c and
-# pretty-prints them to stdout.
use strict;
+use Getopt::Long;
+
+# collect lines continued with a '\' into an array
+sub continuation {
+ my $fh = shift;
+ my @line;
-my $line;
-my $applet;
-my $count;
-my $full_usage;
-
-open(USAGE, 'usage.h') or die "usage.h: $!";
-
-while (defined($line = <USAGE>)) {
- $count=0;
- if ($line =~ /^#define (\w+)_trivial_usage/) {
- # grab the applet name
- $applet = $1;
- print "\n$applet:\n";
-
- while (defined($line = <USAGE>)) {
- if ( $count==0 ) {
- $count++;
- print "\t$applet ";
- } else { print "\t"; }
- $full_usage = $applet . "_full_usage";
- last if ( $line =~ /$full_usage/ );
- # Skip preprocessor stuff
- next if $line =~ /^\s*#/;
- # Strip the continuation char
- $line =~ s/\\$//;
- # strip quotes off
- $line =~ s/^\s*"//;
- $line =~ s/"\s*$//;
- # substitute escape sequences
- # (there's probably a better way to do this...)
- $line =~ s/\\t/ /g;
- $line =~ s/\\n//g;
- # fix up preprocessor macros
- $line =~ s/USAGE_\w+\([\s]*?(".*?").*?\)/$1/sg;
- # Strip any empty quotes out
- $line =~ s/"[\s]*"//sg;
- # strip line end quotes, again
- $line =~ s/^\s*"//;
- $line =~ s/"\s*$//;
-
- # Finally, print it
- print "$line\n";
+ while (<$fh>) {
+ my $s = $_;
+ $s =~ s/\\\s*$//;
+ $s =~ s/#.*$//;
+ push @line, $s;
+ last unless (/\\\s*$/);
+ }
+ return @line;
+}
+
+# regex && eval away unwanted strings from documentation
+sub beautify {
+ my $text = shift;
+ $text =~ s/USAGE_\w+\([\s]*?(".*?").*?\)/$1/sg;
+ $text =~ s/"[\s]*"//sg;
+ my @line = split("\n", $text);
+ $text = join('',
+ map { eval }
+ map { qq[ sprintf(qq#$_#) ] }
+ map {
+ s/^\s*//;
+ s/"//g;
+ s/% /%% /g;
+ $_
}
- printf("\n");
- while (defined($line = <USAGE>)) {
- if ( $count==0 ) {
- $count++;
- print "\t$applet ";
- } else { print "\t"; }
- # we're done if we hit a line lacking a '\' at the end
- #last if ! $line !~ /\\$/;
- if ( $line !~ /\\$/ ) {
- #print "Got one at $line\n";
- last;
- }
- # Skip preprocessor stuff
- next if $line =~ /^\s*#/;
- # Strip the continuation char
- $line =~ s/\\$//;
- # strip quotes off
- $line =~ s/^\s*"//;
- $line =~ s/"\s*$//;
- # substitute escape sequences
- # (there's probably a better way to do this...)
- $line =~ s/\\t/ /g;
- $line =~ s/\\n//g;
- # Automagically #define all preprocessor lines
- #$line =~ s/USAGE_\w+\([\s]*?(".*?")\s,\s".*"\s\)/$1/sg;
- $line =~ s/USAGE_\w+\(\s*?(".*").*\)/$1/sg;
- # Strip any empty quotes out
- $line =~ s/"[\s]*"//sg;
- # strip line end quotes, again
- $line =~ s/^\s*"//;
- $line =~ s/"\s*$//;
-
- # Finally, print it
- print "$line\n";
+ @line
+ );
+ return $text;
+}
+
+# generate POD for an applet
+sub pod_for_usage {
+ my $name = shift;
+ my $usage = shift;
+
+ my $trivial = $usage->{trivial};
+ $trivial !~ /^\s/ && $trivial =~s/(?<!\w)(-\w+)/B<$1>/sxg;
+
+ my @full =
+ map { $_ !~ /^\s/ && s/(?<!\w)(-\w+)/B<$1>/g; $_ }
+ split("\n", $usage->{full});
+
+ return
+ "-------------------------------\n".
+ "\n".
+ "=item $name".
+ "\n\n".
+ "$name $trivial".
+ "\n\n".
+ join("\n", @full).
+ "\n\n"
+ ;
+}
+
+# generate SGML for an applet
+sub sgml_for_usage {
+ my $name = shift;
+ my $usage = shift;
+ return
+ "FIXME";
+}
+
+# the keys are applet names, and the values will contain
+# hashrefs of the form:
+# {
+# trivial => "...",
+# full => "...",
+# }
+my %docs;
+
+# get command-line options
+my %opt;
+
+GetOptions(
+ \%opt,
+ "help|h",
+ "sgml|s",
+ "pod|p",
+ "verbose|v",
+);
+
+if (defined $opt{help}) {
+ print
+ "$0 [OPTION]... [FILE]...\n",
+ "\t--help\n",
+ "\t--sgml\n",
+ "\t--pod\n",
+ "\t--verbose\n",
+ ;
+ exit 1;
+}
+
+#
+# collect documenation into %docs
+foreach (@ARGV) {
+ open(USAGE, $_) || die("$0: $!");
+ my $fh = *USAGE;
+ my ($applet, $type, @line);
+ while (<$fh>) {
+
+ if (/^#define (\w+)_(\w+)_usage/) {
+ $applet = $1;
+ $type = $2;
+ @line = continuation($fh);
+ my $doc = $docs{$applet} ||= { };
+
+ my $text = join("\n", @line);
+ $doc->{$type} = beautify($text);
}
- printf("\n\n");
+
}
}
+
+#use Data::Dumper;
+#print Data::Dumper->Dump([\%docs], [qw(docs)]);
+
+foreach my $name (sort keys %docs) {
+ print pod_for_usage($name, $docs{$name});
+}
+
+exit 0;
+
+__END__
+
+=head1 NAME
+
+autodocifier.pl - generate docs for busybox based on usage.h
+
+=head1 SYNOPSIS
+
+autodocifier.pl usage.h > something
+
+=head1 DESCRIPTION
+
+The purpose of this script is to automagically generate documentation
+for busybox using its usage.h as the original source for content.
+Currently, the same content has to be duplicated in 3 places in
+slightly different formats -- F<usage.h>, F<docs/busybox.pod>, and
+F<docs/busybox.sgml>. Duplicating the same content in these 3 places
+is tedious, so Perl has come to the rescue.
+
+This script was based on an original work by
+Erik Andersen (andersen@lineo.com).
+
+=head1 OPTIONS
+
+these control my behaviour
+
+=over 8
+
+=item --help
+
+This displays the help message.
+
+=back
+
+=head1 FILES
+
+files that I manipulate
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001 John BEPPU. All rights reserved. This program is
+free software; you can redistribute it and/or modify it under the same
+terms as Perl itself.
+
+=head1 AUTHOR
+
+John BEPPU <beppu@lineo.com>
+
+=cut
+
+# $Id: autodocifier.pl,v 1.2 2001/02/23 02:33:28 beppu Exp $