| #!/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]`; |