use environment variable SWFTOOLS_TMP instead of TEMP
[swftools.git] / parsedoc.pl
blobeab30004684a0f7b41f54f634724084736fa7e5b
1 use File::Find;
2 use strict;
4 my $file = $ARGV[0];
5 if(!$file) {
6 print "Usage: parsedoc.pl <docfile.doc>\n";
7 exit(0);
10 my $paramhelp = "";
12 sub add_option_to_manpage
14 my $shortopt = shift;
15 my $longopt = shift;
16 my $params = shift;
17 my $doc = shift;
18 my $longdoc = shift;
19 chomp $longdoc;
20 chomp $longdoc;
21 $shortopt =~ s|-|\\-|;
22 $params =~ s|<(.*)>|\\fI\1\\fR|;
23 $longdoc =~ s/<([a-zA-Z0-9_-]+)>/\\fI\1\\fR/;
24 #$longdoc =~ s/%/%%$1/g;
25 print manpage << "EOF"
26 .TP
27 \\fB\\-$shortopt\\fR, \\fB\\-\\-$longopt\\fR $params
28 $longdoc
29 EOF
33 sub add_option_to_help
35 my $shortopt = shift;
36 my $longopt = shift;
37 my $params = shift;
38 my $doc = shift;
39 my $longdoc = shift;
40 chomp $doc;
41 chomp $doc;
42 my $s1 = " "x(2-length($shortopt));
43 my $s2 = " "x(20-length($longopt." ".$params));
44 $doc =~ s/"/\\"/g;
45 $paramhelp .= " printf(\"-$shortopt$s1, --$longopt $params$s2$doc\\n\");\n";
48 sub add_header_to_manpage
50 my $package = shift;
51 my $progname = shift;
52 my $short_description = shift;
53 my $long_description = shift;
54 my $usage = shift;
55 my $date = `date +"%B %Y"`;
56 my $newusage = "";
57 chomp $date;
59 $long_description =~ s/([^\\])-/\1\\-/g;
61 my @chunks = split(/\n/,$usage);
62 my $p = "";
63 foreach my $u (@chunks) {
64 $u =~ s/%s/$progname/g;
65 $newusage .= "$p.B $u\n";
66 $p = ".PP\n";
68 $newusage =~ s/([^\\])-/\1\\-/g;
69 print manpage << "EOF"
70 .TH $progname "1" "$date" "$progname" "$package"
71 .SH NAME
72 $progname \\- $short_description
73 .SH Synopsis
74 $newusage
75 .SH DESCRIPTION
76 $long_description
77 .SH OPTIONS
78 EOF
81 open(fi, "$file") or die "File not found";
83 my $package = "swftools";
84 my $progname = $file;
85 $progname =~ s|(^/?([^/]+/))*([^/]+).doc|$3|;
86 my $path = $1;
88 open(manpage, ">$path$progname.1") or die;
90 my $usage = "";
91 my $short_description = "";
92 my $long_description = "";
93 while(<fi>) {
94 last if(/^\s*$/);
95 s/^\s*Usage:\s*//g;
96 s/^\s*OR:\s*//g;
97 $usage .= $_;
99 while(<fi>) {
100 last if(/^\s*$/);
101 $short_description .= $_;
103 while(<fi>) {
104 last if(/^\s*$/);
105 $long_description .= $_;
108 add_header_to_manpage($package, $progname, $short_description, $long_description, $usage);
110 $_=<fi>;
112 my $numopts = 0;
113 my @shortopts;
114 my @longopts;
116 while(1) {
117 if(/^-([^\s,]+)[\s,]+--([^\s]+)(\s+(.*))?$/) {
118 my $shortopt = $1;
119 my $longopt = $2;
120 my $params = $4;
121 my $doc = "";
122 my $longdoc = "";
123 while(<fi>) {
124 last if(/^-/);
125 last if(/^\s*$/);
126 if(!$doc) {
127 $doc .= $_;
128 } else {
129 $longdoc .= $_;
132 $longdoc = $doc if(!$longdoc || ($longdoc =~ /^\s*$/));
134 $shortopts[$numopts] = $shortopt;
135 $longopts[$numopts] = $longopt;
136 $numopts++;
138 add_option_to_manpage($shortopt,$longopt,$params,$doc,$longdoc);
139 add_option_to_help($shortopt,$longopt,$params,$doc,$longdoc);
140 last if(eof(fi));
141 next;
143 last if(/^\s*/);
144 last if(!($_=<fi>));
145 last if(/^\s*/);
148 my $tail = "";
149 while(<fi>) {
150 $tail .= $_;
152 $tail =~ s/([^\\])-/\1\\-/g;
154 print manpage $tail;
155 close(manpage);
158 my $filename = "$path$progname.c";
159 my $cfile;
160 if(!open($cfile, "<$filename")) {
161 $filename = "$path$progname.cpp";
162 if(!open($cfile, "<$filename")) {
163 $filename = "$path$progname.cc";
164 if(!open($cfile, "<$filename")) {
165 $filename = "$path$progname.c++";
166 open($cfile, "<$filename") or die;
171 my $src="";
172 while(<$cfile>)
174 if(/void\s*args_callback_usage.*\(.*\*/) {
175 print "substituting usage in $filename\n";
176 if(!/{/) {<$cfile>;}
177 $src .= "void args_callback_usage(char *name)\n";
178 $src .= "{\n";
179 $src .= " printf(\"\\n\");\n";
180 while(<$cfile>) {
181 last if(/}\s*$/);
183 my @chunks = split(/\n/,$usage);
184 my $prefix = "Usage:";
185 my $u;
186 foreach $u (@chunks) {
187 if($u =~ /%s/) {
188 $src .= " printf(\"$prefix $u\\n\", name);\n";
189 } else {
190 $src .= " printf(\"$prefix $u\\n\");\n";
192 $prefix = "OR: ";
194 $src .= " printf(\"\\n\");\n";
196 $src .= "$paramhelp";
198 $src .= " printf(\"\\n\");\n";
200 $src .= "}\n";
201 next;
203 if(/^\s*(static\s+)?(struct\s+)?options_t.*=/) {
204 print "substituting options_t in $filename\n";
205 while(<$cfile>) {
206 last if(/;$/);
208 split(/\n/,$usage);
209 $src .= "static struct options_t options[] = {\n";
210 for(my $t=0;$t<$numopts;$t++) {
211 my $s = $shortopts[$t];
212 my $l = $longopts[$t];
213 $src .= "{\"$s\", \"$l\"},\n";
215 $src .= "{0,0}\n};\n";
216 next;
218 $src .= $_;
221 close($cfile);
222 open($cfile, ">$filename") or die;
223 print $cfile $src;
224 close($cfile);