#!/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 \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(){ # Starting modes if(// || //){ $mode = 1; } elsif(//){ $mode = 2; } elsif(/]*>([^<]*)<.*$/){ $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 < $front $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 "9\n"; } if(/<\/refentry>/){ print REF <About this document This documentation was generated with kernel version $ARGV[2]. EOF } # For some reason, we title the synopsis twice in the main DocBook if(! /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]`;