fix crashes reported by Debian Cylab Mayhem Team
[swftools.git] / parsedoc.pl
blob898e7bba9be90b66e852f0c7089f5e3608f71058
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 $doc =~ s/%/%%/g;
46 $paramhelp .= " printf(\"-$shortopt$s1, --$longopt $params$s2$doc\\n\");\n";
49 sub add_header_to_manpage
51 my $package = shift;
52 my $progname = shift;
53 my $short_description = shift;
54 my $long_description = shift;
55 my $usage = shift;
56 my $date = `date +"%B %Y"`;
57 my $newusage = "";
58 chomp $date;
60 $long_description =~ s/([^\\])-/\1\\-/g;
62 my @chunks = split(/\n/,$usage);
63 my $p = "";
64 foreach my $u (@chunks) {
65 $u =~ s/%s/$progname/g;
66 $newusage .= "$p.B $u\n";
67 $p = ".PP\n";
69 $newusage =~ s/([^\\])-/\1\\-/g;
70 print manpage << "EOF"
71 .TH $progname "1" "$date" "$progname" "$package"
72 .SH NAME
73 $progname \\- $short_description
74 .SH Synopsis
75 $newusage
76 .SH DESCRIPTION
77 $long_description
78 .SH OPTIONS
79 EOF
82 open(fi, "$file") or die "File not found";
84 my $package = "swftools";
85 my $progname = $file;
86 $progname =~ s|(^/?([^/]+/))*([^/]+).doc|$3|;
87 my $path = $1;
89 open(manpage, ">$path$progname.1") or die;
91 my $usage = "";
92 my $short_description = "";
93 my $long_description = "";
94 while(<fi>) {
95 last if(/^\s*$/);
96 s/^\s*Usage:\s*//g;
97 s/^\s*OR:\s*//g;
98 $usage .= $_;
100 while(<fi>) {
101 last if(/^\s*$/);
102 $short_description .= $_;
104 while(<fi>) {
105 last if(/^\s*$/);
106 $long_description .= $_;
109 add_header_to_manpage($package, $progname, $short_description, $long_description, $usage);
111 $_=<fi>;
113 my $numopts = 0;
114 my @shortopts;
115 my @longopts;
117 while(1) {
118 if(/^-([^\s,]+)[\s,]+--([^\s]+)(\s+(.*))?$/) {
119 my $shortopt = $1;
120 my $longopt = $2;
121 my $params = $4;
122 my $doc = "";
123 my $longdoc = "";
124 while(<fi>) {
125 last if(/^-/);
126 last if(/^\s*$/);
127 if(!$doc) {
128 $doc .= $_;
129 } else {
130 $longdoc .= $_;
133 $longdoc = $doc if(!$longdoc || ($longdoc =~ /^\s*$/));
135 $shortopts[$numopts] = $shortopt;
136 $longopts[$numopts] = $longopt;
137 $numopts++;
139 add_option_to_manpage($shortopt,$longopt,$params,$doc,$longdoc);
140 add_option_to_help($shortopt,$longopt,$params,$doc,$longdoc);
141 last if(eof(fi));
142 next;
144 last if(/^\s*/);
145 last if(!($_=<fi>));
146 last if(/^\s*/);
149 my $tail = "";
150 while(<fi>) {
151 $tail .= $_;
153 $tail =~ s/([^\\])-/\1\\-/g;
155 print manpage $tail;
156 close(manpage);
159 my $filename = "$path$progname.c";
160 my $cfile;
161 if(!open($cfile, "<$filename")) {
162 $filename = "$path$progname.cpp";
163 if(!open($cfile, "<$filename")) {
164 $filename = "$path$progname.cc";
165 if(!open($cfile, "<$filename")) {
166 $filename = "$path$progname.c++";
167 open($cfile, "<$filename") or die;
172 my $src="";
173 while(<$cfile>)
175 if(/void\s*args_callback_usage.*\(.*\*/) {
176 print "substituting usage in $filename\n";
177 if(!/{/) {<$cfile>;}
178 $src .= "void args_callback_usage(char *name)\n";
179 $src .= "{\n";
180 $src .= " printf(\"\\n\");\n";
181 while(<$cfile>) {
182 last if(/}\s*$/);
184 my @chunks = split(/\n/,$usage);
185 my $prefix = "Usage:";
186 my $u;
187 foreach $u (@chunks) {
188 if($u =~ /%s/) {
189 $src .= " printf(\"$prefix $u\\n\", name);\n";
190 } else {
191 $u =~ s/%/%%/;
192 $src .= " printf(\"$prefix $u\\n\");\n";
194 $prefix = "OR: ";
196 $src .= " printf(\"\\n\");\n";
198 $src .= "$paramhelp";
200 $src .= " printf(\"\\n\");\n";
202 $src .= "}\n";
203 next;
205 if(/^\s*(static\s+)?(struct\s+)?options_t.*=/) {
206 print "substituting options_t in $filename\n";
207 while(<$cfile>) {
208 last if(/;$/);
210 split(/\n/,$usage);
211 $src .= "static struct options_t options[] = {\n";
212 for(my $t=0;$t<$numopts;$t++) {
213 my $s = $shortopts[$t];
214 my $l = $longopts[$t];
215 $src .= "{\"$s\", \"$l\"},\n";
217 $src .= "{0,0}\n};\n";
218 next;
220 $src .= $_;
223 close($cfile);
224 open($cfile, ">$filename") or die;
225 print $cfile $src;
226 close($cfile);