113 строки
2.5 KiB
Perl
Executable File
113 строки
2.5 KiB
Perl
Executable File
#!/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]`;
|