diff options
author | Matt Kraai | 2002-01-03 21:12:34 +0000 |
---|---|---|
committer | Matt Kraai | 2002-01-03 21:12:34 +0000 |
commit | 5ed78adca590ba9991c55b71f0a9b7f1b31e7934 (patch) | |
tree | 12dc218905c2a50d32897b6a5478ad049cfe53f2 /editors/sed.c | |
parent | d2995632570567fc3a77587175d32fc97e4d552a (diff) | |
download | busybox-5ed78adca590ba9991c55b71f0a9b7f1b31e7934.zip busybox-5ed78adca590ba9991c55b71f0a9b7f1b31e7934.tar.gz |
* editors/sed.c (parse_edit_cmd): Rewrite.
* testsuite/sed/sed-splits-edit-commands-on-command-line: New.
Diffstat (limited to 'editors/sed.c')
-rw-r--r-- | editors/sed.c | 47 |
1 files changed, 13 insertions, 34 deletions
diff --git a/editors/sed.c b/editors/sed.c index 1c026d3..e766b3c 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -3,6 +3,7 @@ * * Copyright (C) 1999,2000,2001 by Lineo, inc. and Mark Whitley * Copyright (C) 1999,2000,2001 by Mark Whitley <markw@codepoet.org> + * Copyright (C) 2002 Matt Kraai * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -296,9 +297,7 @@ static void move_back(char *str, int offset) static int parse_edit_cmd(struct sed_cmd *sed_cmd, const char *editstr) { - int idx = 0; - int slashes_eaten = 0; - char *ptr; /* shorthand */ + int i, j; /* * the string that gets passed to this function should look like this: @@ -326,44 +325,24 @@ static int parse_edit_cmd(struct sed_cmd *sed_cmd, const char *editstr) error_msg_and_die("bad format in edit expression"); /* store the edit line text */ - /* make editline big enough to accomodate the extra '\n' we will tack on - * to the end */ sed_cmd->editline = xmalloc(strlen(&editstr[3]) + 2); - strcpy(sed_cmd->editline, &editstr[3]); - ptr = sed_cmd->editline; - - /* now we need to go through * and: s/\\[\r\n]$/\n/g on the edit line */ - while (ptr[idx]) { - while (ptr[idx] != '\\' || (ptr[idx+1] != '\n' && ptr[idx+1] != '\r')) { - idx++; - if (!ptr[idx]) { - goto out; - } - } - /* move the newline over the '\' before it (effectively eats the '\') */ - move_back(&ptr[idx], 1); - slashes_eaten++; - /* substitue \r for \n if needed */ - if (ptr[idx] == '\r') - ptr[idx] = '\n'; + for (i = 3, j = 0; editstr[i] != '\0' && strchr("\r\n", editstr[i]) == NULL; + i++, j++) { + if (editstr[i] == '\\' && strchr("\n\r", editstr[i+1]) != NULL) { + sed_cmd->editline[j] = '\n'; + i++; + } else + sed_cmd->editline[j] = editstr[i]; } -out: /* figure out if we need to add a newline */ - if (ptr[idx-1] != '\n') { - ptr[idx] = '\n'; - idx++; - } + if (sed_cmd->editline[j-1] != '\n') + sed_cmd->editline[j++] = '\n'; /* terminate string */ - ptr[idx]= 0; - - /* this accounts for discrepancies between the modified string and the - * original string passed in to this function */ - - /* adjust for opening 2 chars [aic]\ */ + sed_cmd->editline[j] = '\0'; - return idx + slashes_eaten + 2; + return i; } |