Update the address of the FSF in the copyright notice of files which were using the...
[deliverable/binutils-gdb.git] / gas / testsuite / gas / rx / explode
1 #!/usr/bin/perl
2 # -*- perl -*-
3
4 # Copyright (C) 2006 Red Hat Inc.
5 #
6 # This file is part of GAS, the GNU Assembler.
7 #
8 # GAS is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2, or (at your option)
11 # any later version.
12 #
13 # GAS is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 # MA 02110-1301, USA.
22
23 %myfiles = ();
24
25 $incdir = ".";
26
27 while ($ARGV[0] =~ /^-/) {
28 $opt = shift;
29 if ($opt eq "-I") {
30 $incdir = shift;
31 }
32 }
33
34 $infile = shift;
35 $outfile = shift;
36
37 $inbase = $infile;
38 $inbase =~ s@.*/@@;
39 $inbase =~ s@[^a-zA-Z0-9].*@@;
40
41 $t = 0;
42 $errors = 0;
43
44 if ($outfile) {
45 open(OUT, ">$outfile");
46 } else {
47 open(OUT, ">&STDOUT");
48 }
49
50 open(I, "$incdir/macros.inc") || die("$incdir/macros.inc: $!");
51 &read_file();
52 close I;
53 open(I, $infile) || die("$infile: $!");
54 &read_file();
55 close I;
56
57 sub read_file {
58 while (<I>) {
59 $line ++;
60 next if /^;/;
61 s/[\r\n]+$//;
62 if (/^macro\s+(\S+)\s+(.*)/) {
63 ($name, $val) = ($1,$2);
64 print "set macro \"$name\" to \"$val\"\n" if $t;
65 $macro{$name} = $val;
66 } elsif (/\S/) {
67 &explode($_);
68 }
69 }
70 }
71
72 exit ($errors);
73
74 # There's no way to quote braces so you can output them :-P
75
76 sub explode {
77 my ($s) = @_;
78 my ($a, $b, $p, $e, @params);
79
80 print "explode($s)\n" if $t;
81
82 ($b, $a, @params) = &split_braces($s);
83 @params = explode_params (@params);
84 if (! $a && ! @params) {
85 if ($t) {
86 print "\033[33m$s\033[0m\n";
87 } else {
88 print OUT "$s\n";
89 }
90 return;
91 }
92 if (@params == 1 && defined $macro{$params[0]}) {
93 $p = $macro{$params[0]};
94 &explode ("$b$p$a");
95 } else {
96 for $p (@params) {
97 &explode ("$b$p$a");
98 }
99 }
100 }
101
102 sub explode_params {
103 my (@p) = @_;
104 my ($p,@r);
105
106 @r = ();
107 while (@p) {
108 $p = shift @p;
109 ($b,$a,@e) = split_braces ($p);
110 if (defined $a) {
111 for $e (reverse @e) {
112 unshift (@p, "$b$e$a");
113 }
114 } else {
115 push (@r, $p);
116 }
117 }
118 return @r;
119 }
120
121 sub getmacro {
122 my ($v) = $macro{$_[0]};
123 if (! defined $v) {
124 print STDERR "$line: Error: macro $_[0] not defined\n";
125 $errors ++;
126 }
127 return $v;
128 }
129
130 sub expand_macros {
131 my ($l) = @_;
132 0 while $l =~ s/{([^{};]+)}/&getmacro($1)/ge;
133 return $l;
134 }
135
136 # returns (before, after, list of variances)
137 sub split_braces {
138 my ($l) = @_;
139 my (@l, $i, $a, @parms, $b, $n,$p);
140
141 print "split_braces($l) = (" if $t;
142
143 $l = &expand_macros ($l);
144
145 if ($l !~ /\{.*\}/) {
146 print "nothing)\n" if $t;
147 return ($l);
148 }
149 if ($l =~ /^{([^{};]+)}/) {
150 print "macro:", $macro{$1}, ")\n" if $t;
151 return (&getmacro($1), "");
152 }
153
154 $n = 0;
155 @parms = ('');
156 $p = 0;
157
158 ($a, $l) = $l =~ m@^([^\{]*)\{(.*)@;
159 @l = split(//, $l);
160
161 while (defined ($i = shift @l)) {
162 if ($n == 0) {
163 print "\033[32m$i" if $t;
164 if ($i eq '}') {
165 print "\033[0m$a, ", join('', @l), ", (", join("\033[31m;\033[0m", @parms), ")\n" if $t;
166 return ($a, join('',@l), @parms);
167 } elsif ($i eq ';') {
168 $p ++;
169 $parms[$p] = '';
170 } else {
171 $parms[$p] .= $i;
172 $n ++ if $i eq '{';
173 }
174 } else {
175 print "\033[34m$i" if $t;
176 $n ++ if $i eq '{';
177 $n -- if $i eq '}';
178 $parms[$p] .= $i;
179 }
180 }
181 print "$a, <null>, (", join(';', @parms), ")\n" if $t;
182 return ($a, "", @parms);
183 }
184
185 __END__;
186
187 macro rest c,d
188 foo {a;b},{{rest};e;}
189
190 expands to:
191
192 foo a,c
193 foo a,d
194 foo a,e
195 foo a,
196 foo b,c
197 foo b,d
198 foo b,e
199 foo b,
This page took 0.049868 seconds and 4 git commands to generate.