Hi
$ sed -e "{ y/o/u/ }"
sed: 1: "{ y/o/u/ }": extra text at the end of a transform command
but this is allowed according to the manual:
Functions can be combined to form a function list, a list of sed
functions separated by newlines, as follows:
{ function
function
...
function
}
The `{' can be preceded or followed by whitespace. The function can be
preceded by whitespace as well. The terminating `}' must be preceded by
a newline or optional whitespace.
I tried to fix it by adding special cases for '}' to the relevant parts
of the compile_stream() function. Is this correct? OK?
Christopher
Index: compile.c
===================================================================
RCS file: /cvs/src/usr.bin/sed/compile.c,v
retrieving revision 1.36
diff -u -p -r1.36 compile.c
--- compile.c 8 Oct 2014 04:19:08 -0000 1.36
+++ compile.c 22 Oct 2014 15:32:55 -0000
@@ -234,14 +234,19 @@ nonsel: /* Now parse the command */
case EMPTY: /* d D g G h H l n N p P q x = \0 */
p++;
EATSPACE();
- if (*p == ';') {
+ switch (*p) {
+ case ';':
p++;
link = &cmd->next;
+ /* FALLTHROUGH */
+ case '}':
goto semicolon;
+ case '\0':
+ break;
+ default:
+ err(COMPILE, "extra characters at the end of "
+ "%c command", cmd->code);
}
- if (*p)
- err(COMPILE,
-"extra characters at the end of %c command", cmd->code);
break;
case TEXT: /* a c i */
p++;
@@ -323,14 +328,19 @@ nonsel: /* Now parse the command */
p++;
p = compile_tr(p, (char **)&cmd->u.y);
EATSPACE();
- if (*p == ';') {
+ switch (*p) {
+ case ';':
p++;
link = &cmd->next;
+ /* FALLTHROUGH */
+ case '}':
goto semicolon;
- }
- if (*p)
+ case '\0':
+ break;
+ default:
err(COMPILE, "extra text at the end of a"
" transform command");
+ }
break;
}
}
--
http://gmerlin.de
OpenPGP: http://gmerlin.de/christopher.pub
F190 D013 8F01 AA53 E080 3F3C F17F B0A1 D44E 4FEE
signature.asc
Description: PGP signature
