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