Loading...
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]`; |