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