annotate zlib/zlib2ansi @ 144:8f4e72ab4e11

fix segmentation fault caused by nothing next cur_op to end
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 21:23:56 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 #!/usr/bin/perl
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 # Transform K&R C function definitions into ANSI equivalent.
kono
parents:
diff changeset
4 #
kono
parents:
diff changeset
5 # Author: Paul Marquess
kono
parents:
diff changeset
6 # Version: 1.0
kono
parents:
diff changeset
7 # Date: 3 October 2006
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 # TODO
kono
parents:
diff changeset
10 #
kono
parents:
diff changeset
11 # Asumes no function pointer parameters. unless they are typedefed.
kono
parents:
diff changeset
12 # Assumes no literal strings that look like function definitions
kono
parents:
diff changeset
13 # Assumes functions start at the beginning of a line
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 use strict;
kono
parents:
diff changeset
16 use warnings;
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 local $/;
kono
parents:
diff changeset
19 $_ = <>;
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 my $d1 = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ;
kono
parents:
diff changeset
24 my $decl = qr{ $sp (?: \w+ $sp )+ $d1 }xo ;
kono
parents:
diff changeset
25 my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ;
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 while (s/^
kono
parents:
diff changeset
29 ( # Start $1
kono
parents:
diff changeset
30 ( # Start $2
kono
parents:
diff changeset
31 .*? # Minimal eat content
kono
parents:
diff changeset
32 ( ^ \w [\w\s\*]+ ) # $3 -- function name
kono
parents:
diff changeset
33 \s* # optional whitespace
kono
parents:
diff changeset
34 ) # $2 - Matched up to before parameter list
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 \( \s* # Literal "(" + optional whitespace
kono
parents:
diff changeset
37 ( [^\)]+ ) # $4 - one or more anythings except ")"
kono
parents:
diff changeset
38 \s* \) # optional whitespace surrounding a Literal ")"
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 ( (?: $dList )+ ) # $5
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 $sp ^ { # literal "{" at start of line
kono
parents:
diff changeset
43 ) # Remember to $1
kono
parents:
diff changeset
44 //xsom
kono
parents:
diff changeset
45 )
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 my $all = $1 ;
kono
parents:
diff changeset
48 my $prefix = $2;
kono
parents:
diff changeset
49 my $param_list = $4 ;
kono
parents:
diff changeset
50 my $params = $5;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 StripComments($params);
kono
parents:
diff changeset
53 StripComments($param_list);
kono
parents:
diff changeset
54 $param_list =~ s/^\s+//;
kono
parents:
diff changeset
55 $param_list =~ s/\s+$//;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 my $i = 0 ;
kono
parents:
diff changeset
58 my %pList = map { $_ => $i++ }
kono
parents:
diff changeset
59 split /\s*,\s*/, $param_list;
kono
parents:
diff changeset
60 my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ;
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 my @params = split /\s*;\s*/, $params;
kono
parents:
diff changeset
63 my @outParams = ();
kono
parents:
diff changeset
64 foreach my $p (@params)
kono
parents:
diff changeset
65 {
kono
parents:
diff changeset
66 if ($p =~ /,/)
kono
parents:
diff changeset
67 {
kono
parents:
diff changeset
68 my @bits = split /\s*,\s*/, $p;
kono
parents:
diff changeset
69 my $first = shift @bits;
kono
parents:
diff changeset
70 $first =~ s/^\s*//;
kono
parents:
diff changeset
71 push @outParams, $first;
kono
parents:
diff changeset
72 $first =~ /^(\w+\s*)/;
kono
parents:
diff changeset
73 my $type = $1 ;
kono
parents:
diff changeset
74 push @outParams, map { $type . $_ } @bits;
kono
parents:
diff changeset
75 }
kono
parents:
diff changeset
76 else
kono
parents:
diff changeset
77 {
kono
parents:
diff changeset
78 $p =~ s/^\s+//;
kono
parents:
diff changeset
79 push @outParams, $p;
kono
parents:
diff changeset
80 }
kono
parents:
diff changeset
81 }
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 my %tmp = map { /$pMatch/; $_ => $pList{$1} }
kono
parents:
diff changeset
85 @outParams ;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 @outParams = map { " $_" }
kono
parents:
diff changeset
88 sort { $tmp{$a} <=> $tmp{$b} }
kono
parents:
diff changeset
89 @outParams ;
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 print $prefix ;
kono
parents:
diff changeset
92 print "(\n" . join(",\n", @outParams) . ")\n";
kono
parents:
diff changeset
93 print "{" ;
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 # Output any trailing code.
kono
parents:
diff changeset
98 print ;
kono
parents:
diff changeset
99 exit 0;
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 sub StripComments
kono
parents:
diff changeset
103 {
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 no warnings;
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 # Strip C & C++ coments
kono
parents:
diff changeset
108 # From the perlfaq
kono
parents:
diff changeset
109 $_[0] =~
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 s{
kono
parents:
diff changeset
112 /\* ## Start of /* ... */ comment
kono
parents:
diff changeset
113 [^*]*\*+ ## Non-* followed by 1-or-more *'s
kono
parents:
diff changeset
114 (
kono
parents:
diff changeset
115 [^/*][^*]*\*+
kono
parents:
diff changeset
116 )* ## 0-or-more things which don't start with /
kono
parents:
diff changeset
117 ## but do end with '*'
kono
parents:
diff changeset
118 / ## End of /* ... */ comment
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 | ## OR C++ Comment
kono
parents:
diff changeset
121 // ## Start of C++ comment //
kono
parents:
diff changeset
122 [^\n]* ## followed by 0-or-more non end of line characters
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 | ## OR various things which aren't comments:
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 (
kono
parents:
diff changeset
127 " ## Start of " ... " string
kono
parents:
diff changeset
128 (
kono
parents:
diff changeset
129 \\. ## Escaped char
kono
parents:
diff changeset
130 | ## OR
kono
parents:
diff changeset
131 [^"\\] ## Non "\
kono
parents:
diff changeset
132 )*
kono
parents:
diff changeset
133 " ## End of " ... " string
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 | ## OR
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 ' ## Start of ' ... ' string
kono
parents:
diff changeset
138 (
kono
parents:
diff changeset
139 \\. ## Escaped char
kono
parents:
diff changeset
140 | ## OR
kono
parents:
diff changeset
141 [^'\\] ## Non '\
kono
parents:
diff changeset
142 )*
kono
parents:
diff changeset
143 ' ## End of ' ... ' string
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 | ## OR
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 . ## Anything other char
kono
parents:
diff changeset
148 [^/"'\\]* ## Chars which doesn't start a comment, string or escape
kono
parents:
diff changeset
149 )
kono
parents:
diff changeset
150 }{$2}gxs;
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 }