split-man 2.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 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]`;