aboutsummaryrefslogtreecommitdiff
path: root/gcc/fixinc/fixfixes.c
diff options
context:
space:
mode:
authorBruce Korb <bkorb@gnu.org>2000-05-12 16:35:21 +0000
committerBruce Korb <korbb@gcc.gnu.org>2000-05-12 16:35:21 +0000
commita92fa6087356629b7810c7e8368645b394aba980 (patch)
tree8d1215879e43bc3003b79187212ae7ffe2f709b9 /gcc/fixinc/fixfixes.c
parentbe1bb652637d5d8785993a4cd197d989dc4b5260 (diff)
downloadgcc-a92fa6087356629b7810c7e8368645b394aba980.zip
gcc-a92fa6087356629b7810c7e8368645b394aba980.tar.gz
gcc-a92fa6087356629b7810c7e8368645b394aba980.tar.bz2
buglet & relaxed rules
From-SVN: r33877
Diffstat (limited to 'gcc/fixinc/fixfixes.c')
-rw-r--r--gcc/fixinc/fixfixes.c66
1 files changed, 44 insertions, 22 deletions
diff --git a/gcc/fixinc/fixfixes.c b/gcc/fixinc/fixfixes.c
index 1dfa5a7..90b8fd8 100644
--- a/gcc/fixinc/fixfixes.c
+++ b/gcc/fixinc/fixfixes.c
@@ -127,32 +127,54 @@ format_write (format, text, av)
tCC* text;
regmatch_t av[];
{
- tCC *p, *str;
int c;
- size_t len;
-
- for (p = 0; *p; p++) {
- c = *p;
- if (c != '%') {
- putchar(c);
- continue;
- }
-
- c = *++p;
- if (c == '%') {
- putchar(c);
- continue;
- } else if (c < '0' || c > '9') {
- abort();
- }
-
- c -= '0';
- str = text + av[c].rm_so;
- len = av[c].rm_eo - av[c].rm_so;
- fwrite(str, len, 1, stdout);
+
+ while ((c = (unsigned)*(format++)) != NUL) {
+
+ if (c != '%') {
+ putchar(c);
+ continue;
+ }
+
+ c = (unsigned)*(format++);
+
+ /*
+ * IF the character following a '%' is not a digit,
+ * THEN we will always emit a '%' and we may or may
+ * not emit the following character. We will end on
+ * a NUL and we will emit only one of a pair of '%'.
+ */
+ if (! isdigit( c )) {
+ putchar( '%' );
+ switch (c) {
+ case NUL:
+ return;
+ case '%':
+ break;
+ default:
+ putchar(c);
+ }
+ }
+
+ /*
+ * Emit the matched subexpression numbered 'c'.
+ * IF, of course, there was such a match...
+ */
+ else {
+ regmatch_t* pRM = av + (c - (unsigned)'0');
+ size_t len;
+
+ if (pRM->rm_so < 0)
+ continue;
+
+ len = pRM->rm_eo - pRM->rm_so;
+ if (len > 0)
+ fwrite(text + pRM->rm_so, len, 1, stdout);
+ }
}
}
+
FIX_PROC_HEAD( format_fix )
{
tSCC zBad[] = "fixincl error: `%s' needs %s c_fix_arg\n";