112 lines · 2.5 KB · Text
RawDownload
#!/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 --> $refdataEOF    $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]`;