"Fossies" - the Fresh Open Source Software Archive 
Member "global-6.6.5/convert.pl" (3 Sep 2020, 10140 Bytes) of package /linux/misc/global-6.6.5.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "convert.pl" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
6.6.4_vs_6.6.5.
1 #!/usr/bin/perl
2 #
3 # Copyright (c) 2001 Tama Communications Corporation
4 #
5 # This file is part of GNU GLOBAL.
6 #
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 # Main procedure.
21 #
22 $com = $0;
23 $com =~ s/.*\///;
24 while ($ARGV[0] =~ /^-/) {
25 $opt = shift;
26 if ($opt eq '--c') {
27 $c = 1;
28 } elsif ($opt eq '--perl') {
29 $perl = 1;
30 } elsif ($opt eq '--man') {
31 $man = 1;
32 } elsif ($opt eq '--info') {
33 $info = 1;
34 } elsif ($opt eq '--menu') {
35 $menu = 1;
36 }
37 }
38 if ($menu) {
39 &menu'gen(@ARGV);
40 } else {
41 $infile = $ARGV[0];
42 open(INFILE, $infile) || die("cannot open '$infile'\n");
43 if ($c) {
44 &c'gen();
45 } elsif ($perl) {
46 &perl'gen();
47 } elsif ($man) {
48 &man'gen();
49 } elsif ($info) {
50 &info'gen();
51 }
52 close(INFILE);
53 }
54 exit 0;
55 #------------------------------------------------------------------
56 #
57 # Generate langmap statement.
58 #
59 #------------------------------------------------------------------
60 #
61 # Get a value from configure.ac file by name.
62 #
63 sub getvalue {
64 my($name) = @_;
65 my $value;
66 #
67 # A value should be defined as:
68 # NAME='VALUE'
69 #
70 my $line=`grep "$name=" configure.ac`;
71 ($value) = $line =~ /^$name='(.*)'$/;
72 unless ($value) {
73 print STDERR "$name not found.\n";
74 exit(1);
75 }
76 $value;
77 }
78 #
79 # Generate statements about the langmap variable.
80 #
81 sub langmapstatement {
82 my($maps) = getvalue('DEFAULTLANGMAP');
83 my(@statement);
84 my %name = (
85 'c' => 'C',
86 'yacc' => 'Yacc',
87 'java' => 'Java',
88 'cpp' => 'C++',
89 'php' => 'PHP',
90 'asm' => 'assembly language',
91 );
92 my $line = '';
93 my @maps = split(/,/, $maps);
94 for ($i = 0; $i < @maps; $i++) {
95 $_ = $maps[$i];
96 my($lang, $suffixes) = /([^:]+):(.*)/;
97 if ($i > 0) {
98 if ($i + 1 == @maps) { # last
99 $line .= ' and ';
100 } else {
101 $line .= ', ';
102 }
103 }
104 $line .= $name{$lang};
105 }
106 $line .= " source files.\n";
107 unshift(@statement, $line);
108 foreach (@maps) {
109 my($lang, $suffixes) = /([^:]+):(.*)/;
110 unless ($name{$lang}) {
111 print STDERR "ERROR: $lang not defined.\n";
112 exit(1);
113 }
114 $suffixes =~ s/^\.//;
115 my(@suffixes) = split(/\./, $suffixes);
116 $line = 'Files whose names end in ';
117 for ($i = 0; $i < @suffixes; $i++) {
118 my $sx = $suffixes[$i];
119 $line .= ', ' if ($i > 0);
120 $line .= "\@file{.$sx}";
121 }
122 $line .= " are assumed to be $name{$lang} source files.\n";
123 unshift(@statement, $line);
124 }
125 @statement;
126 }
127 #------------------------------------------------------------------
128 #
129 # Read line.
130 #
131 #------------------------------------------------------------------
132 @lines = ();
133 sub getline {
134 if (@lines > 0) {
135 $_ = pop(@lines);
136 } else {
137 while (<INFILE>) {
138 if (/\@LANGMAPSTATEMENT\@/) {
139 @lines = &'langmapstatement();
140 $_ = pop(@lines);
141 } elsif (/\@DEFAULTLANGMAP\@/) {
142 my $value = &'getvalue('DEFAULTLANGMAP');
143 s/\@DEFAULTLANGMAP\@/$value/;
144 } elsif (/\@DEFAULTINCLUDEFILESUFFIXES\@/) {
145 my $value = &'getvalue('DEFAULTINCLUDEFILESUFFIXES');
146 s/\@DEFAULTINCLUDEFILESUFFIXES\@/$value/;
147 }
148 last unless (/^#/);
149 }
150 }
151 ($_) ? 1 : 0;
152 }
153 sub ungetline {
154 push(@lines, $_);
155 }
156 #------------------------------------------------------------------
157 #
158 # C package.
159 #
160 #------------------------------------------------------------------
161 package c;
162 sub convert {
163 local($arg) = '[^},]+';
164 local($macros) = 'arg|code|var|file|name|option|val|samp|kbd';
165 chop;
166 s/^\s+//;
167 while (s/\@($macros)\{($arg)\}/$2/) {
168 ;
169 }
170 while (s/\@xref\{($arg),($arg)\}/$1($2)/) {
171 ;
172 }
173 while (s/\@(begin|end)_verbatim//) {
174 ;
175 }
176 }
177 sub gen {
178 local($help_const) = 0;
179 print "/* This file is generated automatically by $'com from $'infile. */\n";
180 while (&'getline()) {
181 if (/^\@NAME\s+(.*)\s+-/) {
182 print "const char *progname = \"$1\";\n";
183 } elsif (/^\@SYNOPSIS$/) {
184 local($first) = 1;
185 print "const char *usage_const = \"";
186 while (&'getline()) {
187 if (/^\@/) {
188 &'ungetline();
189 last;
190 }
191 convert();
192 if ($first) {
193 $first = 0;
194 print "Usage: ";
195 } else {
196 print "\\n\\\n";
197 print " ";
198 }
199 print $_;
200 }
201 print "\\n\";\n";
202 } elsif (/^\@COMMANDS$/ || /^\@OPTIONS$/) {
203 if (!$help_const) {
204 $help_const = 1;
205 print "const char *help_const = \"";
206 }
207 if (/^\@COMMANDS$/) {
208 print "Commands:";
209 } else {
210 print "Options:";
211 }
212 print "\\n\\\n";
213 local($itemize) = 0;
214 while (&'getline()) {
215 if (/^\@/) {
216 &'ungetline();
217 last;
218 }
219 convert();
220 if (/^\@begin_itemize$/) {
221 $itemize = 1;
222 } elsif (/^\@end_itemize$/) {
223 $itemize = 0;
224 } elsif ($itemize) {
225 if (/^\@item\{(.*)\}$/) {
226 print $1;
227 } else {
228 print " ";
229 print;
230 }
231 print "\\n\\\n";
232 }
233 }
234 }
235 }
236 print "See also:\\n\\\n";
237 print " GNU GLOBAL web site: http://www.gnu.org/software/global/\\n\\\n";
238 print "\";\n";
239 }
240 #------------------------------------------------------------------
241 #
242 # Man package.
243 #
244 #------------------------------------------------------------------
245 package man;
246 sub convert {
247 local($arg) = '[^},]+';
248 s/^\s+//;
249 while (s/\@arg\{($arg)\}/\\fI$1\\fP/) {
250 ;
251 }
252 while (/\@code\{($arg)\}/) {
253 $val = $1;
254 $val =~ s/\./\\./g;
255 s/\@code\{$arg\}/$val/;
256 }
257 while (s/\@(val|samp|kbd)\{([^}]+)\}/\\'$2\\'/) {
258 ;
259 }
260 while (s/\@file\{($arg)\}/\\'$1\\'/) {
261 ;
262 }
263 while (s/\@(var|name|option)\{($arg)\}/\\fB$2\\fP/) {
264 ;
265 }
266 while (s/\@xref\{($arg),($arg)\}/\\fB$1\\fP($2)/) {
267 ;
268 }
269 s/\@\{/\{/g;
270 s/\@\}/\}/g;
271 s/\@br$/\n.br/;
272 s/\@\@/@/g;
273 s/^\./\\&./;
274 }
275 sub gen {
276 local($arg) = '[^,]+';
277 print ".\\\" This file is generated automatically by $'com from $'infile.\n";
278 while (&'getline()) {
279 if (/^\@HEADER\s+($arg),($arg),($arg),($arg)\n$/) {
280 print ".TH $1 $2 \"$3\" \"$4\"\n";
281 } elsif (/^\@NAME\s+(.*)$/) {
282 local($name) = $1;
283 $name =~ s/-/\\-/;
284 print ".SH NAME\n$name\n";
285 } elsif (/^\@(SYNOPSIS)$/) {
286 print ".SH $1\n";
287 while (&'getline()) {
288 if (/^\@/) {
289 &'ungetline();
290 last;
291 } elsif (/^$/) {
292 print ".PP\n";
293 next;
294 }
295 convert();
296 print;
297 print ".br\n";
298 }
299 } elsif (/^\@(.*)$/) {
300 $type = $1;
301 if ($type =~ /\s+/) {
302 $type = "\"$type\"";
303 }
304 print ".SH $type\n";
305 local($itemize) = 0;
306 local($verbatim) = 0;
307 while (&'getline()) {
308 if (/^\s*\@begin_verbatim\s*$/) {
309 $verbatim = 1;
310 print ".nf\n";
311 next;
312 } elsif (/^\s*\@end_verbatim\s*$/) {
313 $verbatim = 0;
314 print ".fi\n";
315 next;
316 } elsif (/^\@/) {
317 &'ungetline();
318 last;
319 } elsif (/^$/) {
320 print ".PP\n";
321 next;
322 }
323 convert();
324 if (/^\@begin_itemize$/) {
325 $itemize = 1;
326 } elsif (/^\@end_itemize$/) {
327 $itemize = 0;
328 } elsif ($itemize && /^\@item\{(.*)\}$/) {
329 print ".TP\n$1\n";
330 } else {
331 print;
332 }
333 }
334 }
335 }
336 }
337 #------------------------------------------------------------------
338 #
339 # Info package.
340 #
341 #------------------------------------------------------------------
342 package info;
343 sub convert {
344 local($arg) = '[^},]+';
345 chop;
346 s/^\s+//;
347 while (s/\@xref\{($arg),($arg)\}/$1($2)/) {
348 ;
349 }
350 s/\@option\{/\@samp\{/g;
351 s/\@val\{/\@samp\{/g;
352 while (s/\@(arg|name)\{($arg)\}/$2/) {
353 ;
354 }
355 s/\@br$/\@\*/;
356 }
357 sub gen {
358 print "\@c This file is generated automatically by $'com from $'infile.\n";
359 while (&'getline()) {
360 if (/^\@HEADER/) {
361 ;
362 } elsif (/^\@(NAME)\s+(.*)$/) {
363 local($name) = $2;
364 print "\@unnumberedsubsec $1\n";
365 print "$name\n";
366 } elsif (/^\@(SYNOPSIS)$/) {
367 print "\@unnumberedsubsec $1\n";
368 print "\@quotation\n";
369 while (&'getline()) {
370 if (/^\@/) {
371 &'ungetline();
372 last;
373 } elsif (/^$/) {
374 print;
375 next;
376 }
377 convert();
378 print;
379 print "\@*\n";
380 }
381 print "\@end quotation\n";
382 } elsif (/^\@(.*)$/) {
383 $type = $1;
384 print "\@unnumberedsubsec $type\n";
385 local($itemize) = 0;
386 local($verbatim) = 0;
387 while (&'getline()) {
388 if (/^\s*\@begin_verbatim\s*$/) {
389 $verbatim = 1;
390 print "\@example\n";
391 next;
392 } elsif (/^\s*\@end_verbatim\s*$/) {
393 $verbatim = 0;
394 print "\@end example\n";
395 next;
396 } elsif ($verbatim) {
397 s/\{/@\{/g;
398 s/\}/@\}/g;
399 s/^\s+//;
400 print;
401 next;
402 } elsif (/^\@/) {
403 &'ungetline();
404 last;
405 } elsif (/^$/) {
406 print;
407 next;
408 }
409 convert();
410 if (/^\@begin_itemize$/) {
411 $itemize = 1;
412 print "\@table \@asis\n";
413 } elsif (/^\@end_itemize$/) {
414 $itemize = 0;
415 print "\@end table\n";
416 } elsif ($itemize && /^\@item\{(.*)\}$/) {
417 print "\@item $1\n";
418 } else {
419 print "$_\n";
420 }
421 }
422 }
423 }
424 }
425 #------------------------------------------------------------------
426 #
427 # Menu package.
428 #
429 #------------------------------------------------------------------
430 package menu;
431 sub gen {
432 local(@args) = @_;
433 local($line, $name);
434 foreach $dir (@args) {
435 $infile = "$dir/manual.in";
436 open(INFILE, $infile) || die("cannot open '$infile'\n");
437 while (<INFILE>) {
438 if (/^\@NAME\s+((\S+)\s+\-\s+.*)$/) {
439 $line = $1;
440 $name = $2;
441 last;
442 }
443 }
444 close(INFILE);
445 push(@name, $name);
446 push(@line, $line);
447 }
448 print "\@c This file is generated automatically by $'com from a set of manual.in.\n";
449 print "\@menu\n";
450 for ($i = 0; $i < @name; $i++) {
451 $name = $name[$i];
452 $line = $line[$i];
453 $name .= '::';
454 printf "* %-16s %s\n", $name, $line;
455 }
456 print "\@end menu\n\n";
457 for ($i = 0; $i < @name; $i++) {
458 $name = $name[$i];
459 $line = $line[$i];
460 printf "\@node %s\n", $name;
461 printf "\@section %s\n", $line;
462 printf "\@include $name.ref\n";
463 }
464 }