diff options
Diffstat (limited to 'scripts/split-man')
-rwxr-xr-x | scripts/split-man | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/scripts/split-man b/scripts/split-man new file mode 100755 index 0000000..03897fe --- /dev/null +++ b/scripts/split-man @@ -0,0 +1,112 @@ +#!/usr/bin/perl + +use strict; + +## Copyright (C) Michael Still (mikal@stillhq.com) +## Released under the terms of the GNU GPL +## +## Hoon through the specified DocBook SGML file, and split out the +## man pages. These can then be processed into groff format, and +## installed if desired... +## +## Arguements: $1 -- the name of the sgml file +## $2 -- the directory to put the generated SGML files in +## $3 -- kernel version + +my($SGML, $REF, $front, $refdata, $mode, $filename); + +if(($ARGV[0] eq "") || ($ARGV[1] eq "") || ($ARGV[2] eq "")){ + die "Usage: split-man <sgml file> <output dir> <kernel version>\n"; +} + +open SGML, "< $ARGV[0]" or die "Could not open input file \"$ARGV[0]\"\n"; +if( ! -d "$ARGV[1]" ){ + die "Output directory \"$ARGV[1]\" does not exist\n"; +} + +# Possible modes: +# 0: Looking for input I care about +# 1: Inside book front matter +# 2: Inside a refentry +# 3: Inside a refentry, and we know the filename + +$mode = 0; +$refdata = ""; +$front = ""; +while(<SGML>){ + # Starting modes + if(/<bookinfo>/ || /<docinfo>/){ + $mode = 1; + } + elsif(/<refentry>/){ + $mode = 2; + } + elsif(/<refentrytitle><phrase[^>]*>([^<]*)<.*$/){ + $mode = 3; + $filename = $1; + + $filename =~ s/struct //; + $filename =~ s/typedef //; + + print "Found manpage for $filename\n"; + open REF, "> $ARGV[1]/$filename.sgml" or + die "Couldn't open output file \"$ARGV[1]/$filename.sgml\": $!\n"; + print REF <<EOF; +<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> + +<!-- BEGINFRONTTAG: The following is front matter for the parent book --> +$front +<!-- ENDFRONTTAG: End front matter --> + +$refdata +EOF + $refdata = ""; + } + + # Extraction + if($mode == 1){ + chomp $_; + $front = "$front<!-- $_ -->\n"; + } + elsif($mode == 2){ + $refdata = "$refdata$_"; + } + elsif($mode == 3){ + # There are some fixups which need to be applied + if(/<\/refmeta>/){ + print REF "<manvolnum>9</manvolnum>\n"; + } + if(/<\/refentry>/){ + print REF <<EOF; +<refsect1><title>About this document</title> +<para> +This documentation was generated with kernel version $ARGV[2]. +</para> +</refsect1> +EOF + } + + # For some reason, we title the synopsis twice in the main DocBook + if(! /<title>Synopsis<\/title>/){ + if(/<refentrytitle>/){ + s/struct //; + s/typedef //; + } + + print REF "$_"; + } + } + + # Ending modes + if(/<\/bookinfo>/ || /<\/docinfo>/){ + $mode = 0; + } + elsif(/<\/refentry>/){ + $mode = 0; + close REF; + } +} + +# And make sure we don't process this unnessesarily +$ARGV[0] =~ s/\.sgml/.9/; +`touch $ARGV[0]`; |