diff options
-rw-r--r-- | editors/sed.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/editors/sed.c b/editors/sed.c index cddb0c732..bb39de149 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -371,25 +371,25 @@ static int get_address(const char *my_str, int *linenum, regex_t ** regex) /* Grab a filename. Whitespace at start is skipped, then goes to EOL. */ static int parse_file_cmd(/*sed_cmd_t *sed_cmd,*/ const char *filecmdstr, char **retval) { - int start = 0, idx, hack = 0; + const char *start; + const char *eol; /* Skip whitespace, then grab filename to end of line */ - while (isspace(filecmdstr[start])) - start++; - idx = start; - while (filecmdstr[idx] && filecmdstr[idx] != '\n') - idx++; - - /* If lines glued together, put backslash back. */ - if (filecmdstr[idx] == '\n') - hack = 1; - if (idx == start) + start = skip_whitespace(filecmdstr); + eol = strchrnul(start, '\n'); + if (eol == start) bb_error_msg_and_die("empty filename"); - *retval = xstrndup(filecmdstr+start, idx-start+hack+1); - if (hack) - (*retval)[idx-start] = '\\'; - return idx; + if (*eol) { + /* If lines glued together, put backslash back. */ + *retval = xstrndup(start, eol-start + 1); + (*retval)[eol-start] = '\\'; + } else { + /* eol is NUL */ + *retval = xstrdup(start); + } + + return eol - filecmdstr; } static int parse_subst_cmd(sed_cmd_t *sed_cmd, const char *substr) |