From e916d24805b4a191bc08d2ee31c9247a30f9bc1e Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Mon, 6 Mar 2000 19:20:35 +0000 Subject: [PATCH] Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a -e) would go into an infinite loop. -Erik --- Changelog | 2 + editors/sed.c | 246 +++++++++++++++++++++++++------------------------- sed.c | 246 +++++++++++++++++++++++++------------------------- 3 files changed, 248 insertions(+), 246 deletions(-) diff --git a/Changelog b/Changelog index 14524410c..f0c5e2f69 100644 --- a/Changelog +++ b/Changelog @@ -35,6 +35,8 @@ - Fixes to the makefile for handling "strip" * An initial telnet implementation was added by Randolph Chung . + * Fixed a bug where "sed 's/foo/bar/g'" would go into an + infinite loop. -Erik Andersen diff --git a/editors/sed.c b/editors/sed.c index 608f86813..2beb2a588 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -184,129 +184,129 @@ extern int sed_main(int argc, char **argv) } while (argc > 1) { - if (**argv == '-') { - argc--; - cp = *argv++; - stopNow = FALSE; - - while (*++cp && stopNow == FALSE) { - switch (*cp) { - case 'n': - quietFlag = TRUE; - break; - case 'e': - if (*(cp + 1) == 0 && --argc < 0) { - usage(sed_usage); - } - if (*++cp != 's') - cp = *argv++; - - /* Read address if present */ - SKIPSPACES(cp); - if (*cp == '$') { - addr_line = LAST_LINE; - cp++; - } else { - if (isdigit(*cp)) { /* LINE ADDRESS */ - line_s = cp; - while (isdigit(*cp)) - cp++; - if (cp > line_s) { - /* numeric line */ - saved = *cp; - *cp = '\0'; - addr_line = atoi(line_s); - *cp = saved; - } - } else if (*cp == '/') { /* PATTERN ADDRESS */ - pos = addr_pattern = cp + 1; - pos = strchr(pos, '/'); - if (!pos) - usage(sed_usage); - *pos = '\0'; - cp = pos + 1; - } - } - - SKIPSPACES(cp); - if (*cp == '!') { - negated++; - cp++; - } - - /* Read command */ - - SKIPSPACES(cp); - switch (*cp) { - case 's': /* REPLACE */ - if (strlen(cp) <= 3 || *(cp + 1) != '/') - break; - sed_f = f_replace; - - pos = needle = cp + 2; - - for (;;) { - pos = strchr(pos, '/'); - if (pos == NULL) { - usage(sed_usage); - } - if (*(pos - 1) == '\\') { - pos++; - continue; - } - break; - } - *pos = 0; - newNeedle = ++pos; - for (;;) { - pos = strchr(pos, '/'); - if (pos == NULL) { - usage(sed_usage); - } - if (*(pos - 1) == '\\') { - pos++; - continue; - } - break; - } - *pos = 0; - if (pos + 2 != 0) { - while (*++pos) { - switch (*pos) { - case 'i': - ignoreCase = TRUE; - break; - case 'p': - printFlag = TRUE; - break; - case 'g': - break; - default: - usage(sed_usage); - } - } - } - cp = pos; - /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */ - break; - - case 'a': /* APPEND */ - if (strlen(cp) < 2) - break; - sed_f = f_append; - appendline = ++cp; - /* fprintf(stderr, "append '%s'\n", appendline); */ - break; - } - - stopNow = TRUE; - break; - - default: - usage(sed_usage); - } - } - } + if (**argv != '-') + usage(sed_usage); + argc--; + cp = *argv++; + stopNow = FALSE; + + while (*++cp && stopNow == FALSE) { + switch (*cp) { + case 'n': + quietFlag = TRUE; + break; + case 'e': + if (*(cp + 1) == 0 && --argc < 0) { + usage(sed_usage); + } + if (*++cp != 's') + cp = *argv++; + + /* Read address if present */ + SKIPSPACES(cp); + if (*cp == '$') { + addr_line = LAST_LINE; + cp++; + } else { + if (isdigit(*cp)) { /* LINE ADDRESS */ + line_s = cp; + while (isdigit(*cp)) + cp++; + if (cp > line_s) { + /* numeric line */ + saved = *cp; + *cp = '\0'; + addr_line = atoi(line_s); + *cp = saved; + } + } else if (*cp == '/') { /* PATTERN ADDRESS */ + pos = addr_pattern = cp + 1; + pos = strchr(pos, '/'); + if (!pos) + usage(sed_usage); + *pos = '\0'; + cp = pos + 1; + } + } + + SKIPSPACES(cp); + if (*cp == '!') { + negated++; + cp++; + } + + /* Read command */ + + SKIPSPACES(cp); + switch (*cp) { + case 's': /* REPLACE */ + if (strlen(cp) <= 3 || *(cp + 1) != '/') + break; + sed_f = f_replace; + + pos = needle = cp + 2; + + for (;;) { + pos = strchr(pos, '/'); + if (pos == NULL) { + usage(sed_usage); + } + if (*(pos - 1) == '\\') { + pos++; + continue; + } + break; + } + *pos = 0; + newNeedle = ++pos; + for (;;) { + pos = strchr(pos, '/'); + if (pos == NULL) { + usage(sed_usage); + } + if (*(pos - 1) == '\\') { + pos++; + continue; + } + break; + } + *pos = 0; + if (pos + 2 != 0) { + while (*++pos) { + switch (*pos) { + case 'i': + ignoreCase = TRUE; + break; + case 'p': + printFlag = TRUE; + break; + case 'g': + break; + default: + usage(sed_usage); + } + } + } + cp = pos; + /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */ + break; + + case 'a': /* APPEND */ + if (strlen(cp) < 2) + break; + sed_f = f_append; + appendline = ++cp; + /* fprintf(stderr, "append '%s'\n", appendline); */ + break; + } + + stopNow = TRUE; + break; + + default: + usage(sed_usage); + } + } } if (argc == 0) { diff --git a/sed.c b/sed.c index 608f86813..2beb2a588 100644 --- a/sed.c +++ b/sed.c @@ -184,129 +184,129 @@ extern int sed_main(int argc, char **argv) } while (argc > 1) { - if (**argv == '-') { - argc--; - cp = *argv++; - stopNow = FALSE; - - while (*++cp && stopNow == FALSE) { - switch (*cp) { - case 'n': - quietFlag = TRUE; - break; - case 'e': - if (*(cp + 1) == 0 && --argc < 0) { - usage(sed_usage); - } - if (*++cp != 's') - cp = *argv++; - - /* Read address if present */ - SKIPSPACES(cp); - if (*cp == '$') { - addr_line = LAST_LINE; - cp++; - } else { - if (isdigit(*cp)) { /* LINE ADDRESS */ - line_s = cp; - while (isdigit(*cp)) - cp++; - if (cp > line_s) { - /* numeric line */ - saved = *cp; - *cp = '\0'; - addr_line = atoi(line_s); - *cp = saved; - } - } else if (*cp == '/') { /* PATTERN ADDRESS */ - pos = addr_pattern = cp + 1; - pos = strchr(pos, '/'); - if (!pos) - usage(sed_usage); - *pos = '\0'; - cp = pos + 1; - } - } - - SKIPSPACES(cp); - if (*cp == '!') { - negated++; - cp++; - } - - /* Read command */ - - SKIPSPACES(cp); - switch (*cp) { - case 's': /* REPLACE */ - if (strlen(cp) <= 3 || *(cp + 1) != '/') - break; - sed_f = f_replace; - - pos = needle = cp + 2; - - for (;;) { - pos = strchr(pos, '/'); - if (pos == NULL) { - usage(sed_usage); - } - if (*(pos - 1) == '\\') { - pos++; - continue; - } - break; - } - *pos = 0; - newNeedle = ++pos; - for (;;) { - pos = strchr(pos, '/'); - if (pos == NULL) { - usage(sed_usage); - } - if (*(pos - 1) == '\\') { - pos++; - continue; - } - break; - } - *pos = 0; - if (pos + 2 != 0) { - while (*++pos) { - switch (*pos) { - case 'i': - ignoreCase = TRUE; - break; - case 'p': - printFlag = TRUE; - break; - case 'g': - break; - default: - usage(sed_usage); - } - } - } - cp = pos; - /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */ - break; - - case 'a': /* APPEND */ - if (strlen(cp) < 2) - break; - sed_f = f_append; - appendline = ++cp; - /* fprintf(stderr, "append '%s'\n", appendline); */ - break; - } - - stopNow = TRUE; - break; - - default: - usage(sed_usage); - } - } - } + if (**argv != '-') + usage(sed_usage); + argc--; + cp = *argv++; + stopNow = FALSE; + + while (*++cp && stopNow == FALSE) { + switch (*cp) { + case 'n': + quietFlag = TRUE; + break; + case 'e': + if (*(cp + 1) == 0 && --argc < 0) { + usage(sed_usage); + } + if (*++cp != 's') + cp = *argv++; + + /* Read address if present */ + SKIPSPACES(cp); + if (*cp == '$') { + addr_line = LAST_LINE; + cp++; + } else { + if (isdigit(*cp)) { /* LINE ADDRESS */ + line_s = cp; + while (isdigit(*cp)) + cp++; + if (cp > line_s) { + /* numeric line */ + saved = *cp; + *cp = '\0'; + addr_line = atoi(line_s); + *cp = saved; + } + } else if (*cp == '/') { /* PATTERN ADDRESS */ + pos = addr_pattern = cp + 1; + pos = strchr(pos, '/'); + if (!pos) + usage(sed_usage); + *pos = '\0'; + cp = pos + 1; + } + } + + SKIPSPACES(cp); + if (*cp == '!') { + negated++; + cp++; + } + + /* Read command */ + + SKIPSPACES(cp); + switch (*cp) { + case 's': /* REPLACE */ + if (strlen(cp) <= 3 || *(cp + 1) != '/') + break; + sed_f = f_replace; + + pos = needle = cp + 2; + + for (;;) { + pos = strchr(pos, '/'); + if (pos == NULL) { + usage(sed_usage); + } + if (*(pos - 1) == '\\') { + pos++; + continue; + } + break; + } + *pos = 0; + newNeedle = ++pos; + for (;;) { + pos = strchr(pos, '/'); + if (pos == NULL) { + usage(sed_usage); + } + if (*(pos - 1) == '\\') { + pos++; + continue; + } + break; + } + *pos = 0; + if (pos + 2 != 0) { + while (*++pos) { + switch (*pos) { + case 'i': + ignoreCase = TRUE; + break; + case 'p': + printFlag = TRUE; + break; + case 'g': + break; + default: + usage(sed_usage); + } + } + } + cp = pos; + /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */ + break; + + case 'a': /* APPEND */ + if (strlen(cp) < 2) + break; + sed_f = f_append; + appendline = ++cp; + /* fprintf(stderr, "append '%s'\n", appendline); */ + break; + } + + stopNow = TRUE; + break; + + default: + usage(sed_usage); + } + } } if (argc == 0) { -- 2.25.1