at v2.6.12-rc2 2.6 kB view raw
1#!/usr/bin/perl 2 3use strict; 4 5## Copyright (C) Michael Still (mikal@stillhq.com) 6## Released under the terms of the GNU GPL 7## 8## Hoon through the specified DocBook SGML file, and split out the 9## man pages. These can then be processed into groff format, and 10## installed if desired... 11## 12## Arguements: $1 -- the name of the sgml file 13## $2 -- the directory to put the generated SGML files in 14## $3 -- kernel version 15 16my($SGML, $REF, $front, $refdata, $mode, $filename); 17 18if(($ARGV[0] eq "") || ($ARGV[1] eq "") || ($ARGV[2] eq "")){ 19 die "Usage: split-man <sgml file> <output dir> <kernel version>\n"; 20} 21 22open SGML, "< $ARGV[0]" or die "Could not open input file \"$ARGV[0]\"\n"; 23if( ! -d "$ARGV[1]" ){ 24 die "Output directory \"$ARGV[1]\" does not exist\n"; 25} 26 27# Possible modes: 28# 0: Looking for input I care about 29# 1: Inside book front matter 30# 2: Inside a refentry 31# 3: Inside a refentry, and we know the filename 32 33$mode = 0; 34$refdata = ""; 35$front = ""; 36while(<SGML>){ 37 # Starting modes 38 if(/<bookinfo>/ || /<docinfo>/){ 39 $mode = 1; 40 } 41 elsif(/<refentry>/){ 42 $mode = 2; 43 } 44 elsif(/<refentrytitle><phrase[^>]*>([^<]*)<.*$/){ 45 $mode = 3; 46 $filename = $1; 47 48 $filename =~ s/struct //; 49 $filename =~ s/typedef //; 50 51 print "Found manpage for $filename\n"; 52 open REF, "> $ARGV[1]/$filename.sgml" or 53 die "Couldn't open output file \"$ARGV[1]/$filename.sgml\": $!\n"; 54 print REF <<EOF; 55<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 56 57<!-- BEGINFRONTTAG: The following is front matter for the parent book --> 58$front 59<!-- ENDFRONTTAG: End front matter --> 60 61$refdata 62EOF 63 $refdata = ""; 64 } 65 66 # Extraction 67 if($mode == 1){ 68 chomp $_; 69 $front = "$front<!-- $_ -->\n"; 70 } 71 elsif($mode == 2){ 72 $refdata = "$refdata$_"; 73 } 74 elsif($mode == 3){ 75 # There are some fixups which need to be applied 76 if(/<\/refmeta>/){ 77 print REF "<manvolnum>9</manvolnum>\n"; 78 } 79 if(/<\/refentry>/){ 80 print REF <<EOF; 81<refsect1><title>About this document</title> 82<para> 83This documentation was generated with kernel version $ARGV[2]. 84</para> 85</refsect1> 86EOF 87 } 88 89 # For some reason, we title the synopsis twice in the main DocBook 90 if(! /<title>Synopsis<\/title>/){ 91 if(/<refentrytitle>/){ 92 s/struct //; 93 s/typedef //; 94 } 95 96 print REF "$_"; 97 } 98 } 99 100 # Ending modes 101 if(/<\/bookinfo>/ || /<\/docinfo>/){ 102 $mode = 0; 103 } 104 elsif(/<\/refentry>/){ 105 $mode = 0; 106 close REF; 107 } 108} 109 110# And make sure we don't process this unnessesarily 111$ARGV[0] =~ s/\.sgml/.9/; 112`touch $ARGV[0]`;