diff options
author | Bruce Korb <bkorb@gnu.org> | 2000-05-12 16:35:21 +0000 |
---|---|---|
committer | Bruce Korb <korbb@gcc.gnu.org> | 2000-05-12 16:35:21 +0000 |
commit | a92fa6087356629b7810c7e8368645b394aba980 (patch) | |
tree | 8d1215879e43bc3003b79187212ae7ffe2f709b9 /gcc/fixinc/fixfixes.c | |
parent | be1bb652637d5d8785993a4cd197d989dc4b5260 (diff) | |
download | gcc-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.c | 66 |
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"; |