]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/testsuite/gas/rx/explode
Update the address of the FSF in the copyright notice of files which were using the...
[thirdparty/binutils-gdb.git] / gas / testsuite / gas / rx / explode
CommitLineData
c7927a3c
NC
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
863f7a5f
NC
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.
c7927a3c
NC
22
23%myfiles = ();
24
25$incdir = ".";
26
27while ($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
44if ($outfile) {
45 open(OUT, ">$outfile");
46} else {
47 open(OUT, ">&STDOUT");
48}
49
50open(I, "$incdir/macros.inc") || die("$incdir/macros.inc: $!");
51&read_file();
52close I;
53open(I, $infile) || die("$infile: $!");
54&read_file();
55close I;
56
57sub 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
72exit ($errors);
73
74# There's no way to quote braces so you can output them :-P
75
76sub 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
102sub 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
121sub 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
130sub 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)
137sub 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
187macro rest c,d
188 foo {a;b},{{rest};e;}
189
190expands 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,