sed: code shrink
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 21 Jan 2019 12:49:28 +0000 (13:49 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 21 Jan 2019 12:49:28 +0000 (13:49 +0100)
function                                             old     new   delta
parse_file_cmd                                       115      94     -21

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/sed.c

index cddb0c732bb55ea22c78932a2d02e18769968d86..bb39de14906e94e66baafefc7c9cf70d13aabd4e 100644 (file)
@@ -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)