blob: 03897fe6a75d706a90cb7f9d881768189bbc3c9c [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#!/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]`;