Backport sed fix for s/[/]// handling from Matt Kraai
authorEric Andersen <andersen@codepoet.org>
Mon, 3 Sep 2001 19:16:23 +0000 (19:16 -0000)
committerEric Andersen <andersen@codepoet.org>
Mon, 3 Sep 2001 19:16:23 +0000 (19:16 -0000)
busybox/editors/sed.c
busybox/sed.c

index 4fe882d20366fa8765aff25e4b33e3b441cbf548..989df7cb4be609fa173e7e770db13bd26d8c7c25 100644 (file)
@@ -144,8 +144,21 @@ static void destroy_cmd_strs()
  */
 static int index_of_next_unescaped_regexp_delim(struct sed_cmd *sed_cmd, const char *str, int idx)
 {
+       int bracket = -1;
+       int escaped = 0;
+
        for ( ; str[idx]; idx++) {
-               if (str[idx] == sed_cmd->delimiter && str[idx-1] != '\\')
+               if (bracket != -1) {
+                       if (str[idx] == ']' && !(bracket == idx - 1 ||
+                                                                        (bracket == idx - 2 && str[idx-1] == '^')))
+                               bracket = -1;
+               } else if (escaped)
+                       escaped = 0;
+               else if (str[idx] == '\\')
+                       escaped = 1;
+               else if (str[idx] == '[')
+                       bracket = idx;
+               else if (str[idx] == sed_cmd->delimiter)
                        return idx;
        }
 
index 4fe882d20366fa8765aff25e4b33e3b441cbf548..989df7cb4be609fa173e7e770db13bd26d8c7c25 100644 (file)
@@ -144,8 +144,21 @@ static void destroy_cmd_strs()
  */
 static int index_of_next_unescaped_regexp_delim(struct sed_cmd *sed_cmd, const char *str, int idx)
 {
+       int bracket = -1;
+       int escaped = 0;
+
        for ( ; str[idx]; idx++) {
-               if (str[idx] == sed_cmd->delimiter && str[idx-1] != '\\')
+               if (bracket != -1) {
+                       if (str[idx] == ']' && !(bracket == idx - 1 ||
+                                                                        (bracket == idx - 2 && str[idx-1] == '^')))
+                               bracket = -1;
+               } else if (escaped)
+                       escaped = 0;
+               else if (str[idx] == '\\')
+                       escaped = 1;
+               else if (str[idx] == '[')
+                       bracket = idx;
+               else if (str[idx] == sed_cmd->delimiter)
                        return idx;
        }