Hello tech@, parse_char_class does a really fancy *s != '\n' dance. I say we remove it and let regcomp determine if we have a properly formatted char_class.
This changes our error message for a unbalanced char_class from: unbalanced brackets ([]) to: brackets ([ ]) not balanced OK? martijn@ Index: re.c =================================================================== RCS file: /cvs/src/bin/ed/re.c,v retrieving revision 1.17 diff -u -p -r1.17 re.c --- re.c 22 Mar 2016 17:58:28 -0000 1.17 +++ re.c 18 Jun 2018 16:38:51 -0000 @@ -94,16 +94,10 @@ extract_pattern(int delimiter) char *nd; int len; - for (nd = ibufp; *nd != delimiter && *nd != '\n'; nd++) + for (nd = ibufp; *nd != delimiter && *nd != '\n'; nd++) { switch (*nd) { default: break; - case '[': - if ((nd = parse_char_class(++nd)) == NULL) { - seterrmsg("unbalanced brackets ([])"); - return NULL; - } - break; case '\\': if (*++nd == '\n') { seterrmsg("trailing backslash (\\)"); @@ -111,29 +105,11 @@ extract_pattern(int delimiter) } break; } + } len = nd - ibufp; REALLOC(lhbuf, lhbufsz, len + 1, NULL); memcpy(lhbuf, ibufp, len); lhbuf[len] = '\0'; ibufp = nd; return (isbinary) ? NUL_TO_NEWLINE(lhbuf, len) : lhbuf; -} - - -/* parse_char_class: expand a POSIX character class */ -static char * -parse_char_class(char *s) -{ - int c, d; - - if (*s == '^') - s++; - if (*s == ']') - s++; - for (; *s != ']' && *s != '\n'; s++) - if (*s == '[' && ((d = *(s+1)) == '.' || d == ':' || d == '=')) - for (s++, c = *++s; *s != ']' || c != d; s++) - if ((c = *s) == '\n') - return NULL; - return (*s == ']') ? s : NULL; }