use skip_whitespace where appropriate
This commit is contained in:
parent
c8400a2162
commit
d18a3a20db
@ -1470,7 +1470,7 @@ static int awk_split(char *s, node *spl, char **slist)
|
||||
}
|
||||
} else { /* space split */
|
||||
while (*s) {
|
||||
while (isspace(*s)) s++;
|
||||
s = skip_whitespace(s);
|
||||
if (! *s) break;
|
||||
n++;
|
||||
while (*s && !isspace(*s))
|
||||
|
167
editors/sed.c
167
editors/sed.c
@ -63,29 +63,29 @@
|
||||
|
||||
/* Each sed command turns into one of these structures. */
|
||||
typedef struct sed_cmd_s {
|
||||
/* Ordered by alignment requirements: currently 36 bytes on x86 */
|
||||
/* Ordered by alignment requirements: currently 36 bytes on x86 */
|
||||
|
||||
/* address storage */
|
||||
regex_t *beg_match; /* sed -e '/match/cmd' */
|
||||
regex_t *end_match; /* sed -e '/match/,/end_match/cmd' */
|
||||
regex_t *sub_match; /* For 's/sub_match/string/' */
|
||||
int beg_line; /* 'sed 1p' 0 == apply commands to all lines */
|
||||
int end_line; /* 'sed 1,3p' 0 == one line only. -1 = last line ($) */
|
||||
/* address storage */
|
||||
regex_t *beg_match; /* sed -e '/match/cmd' */
|
||||
regex_t *end_match; /* sed -e '/match/,/end_match/cmd' */
|
||||
regex_t *sub_match; /* For 's/sub_match/string/' */
|
||||
int beg_line; /* 'sed 1p' 0 == apply commands to all lines */
|
||||
int end_line; /* 'sed 1,3p' 0 == one line only. -1 = last line ($) */
|
||||
|
||||
FILE *file; /* File (sw) command writes to, -1 for none. */
|
||||
char *string; /* Data string for (saicytb) commands. */
|
||||
FILE *file; /* File (sw) command writes to, -1 for none. */
|
||||
char *string; /* Data string for (saicytb) commands. */
|
||||
|
||||
unsigned short which_match; /* (s) Which match to replace (0 for all) */
|
||||
unsigned short which_match; /* (s) Which match to replace (0 for all) */
|
||||
|
||||
/* Bitfields (gcc won't group them if we don't) */
|
||||
unsigned int invert:1; /* the '!' after the address */
|
||||
unsigned int in_match:1; /* Next line also included in match? */
|
||||
unsigned int no_newline:1; /* Last line written by (sw) had no '\n' */
|
||||
unsigned int sub_p:1; /* (s) print option */
|
||||
/* Bitfields (gcc won't group them if we don't) */
|
||||
unsigned int invert:1; /* the '!' after the address */
|
||||
unsigned int in_match:1; /* Next line also included in match? */
|
||||
unsigned int no_newline:1; /* Last line written by (sw) had no '\n' */
|
||||
unsigned int sub_p:1; /* (s) print option */
|
||||
|
||||
/* GENERAL FIELDS */
|
||||
char cmd; /* The command char: abcdDgGhHilnNpPqrstwxy:={} */
|
||||
struct sed_cmd_s *next; /* Next command (linked list, NULL terminated) */
|
||||
/* GENERAL FIELDS */
|
||||
char cmd; /* The command char: abcdDgGhHilnNpPqrstwxy:={} */
|
||||
struct sed_cmd_s *next; /* Next command (linked list, NULL terminated) */
|
||||
} sed_cmd_t;
|
||||
|
||||
static const char *const semicolon_whitespace = "; \n\r\t\v";
|
||||
@ -162,7 +162,7 @@ void sed_free_and_close_stuff(void)
|
||||
|
||||
static void cleanup_outname(void)
|
||||
{
|
||||
if(bbg.outname) unlink(bbg.outname);
|
||||
if(bbg.outname) unlink(bbg.outname);
|
||||
}
|
||||
|
||||
/* strdup, replacing "\n" with '\n', and "\delimiter" with 'delimiter' */
|
||||
@ -343,36 +343,36 @@ static int parse_subst_cmd(sed_cmd_t *sed_cmd, char *substr)
|
||||
if(isspace(substr[idx])) continue;
|
||||
|
||||
switch (substr[idx]) {
|
||||
/* Replace all occurrences */
|
||||
case 'g':
|
||||
if (match[0] != '^') sed_cmd->which_match = 0;
|
||||
break;
|
||||
/* Print pattern space */
|
||||
case 'p':
|
||||
sed_cmd->sub_p = 1;
|
||||
break;
|
||||
/* Write to file */
|
||||
case 'w':
|
||||
{
|
||||
char *temp;
|
||||
idx+=parse_file_cmd(sed_cmd,substr+idx,&temp);
|
||||
/* Replace all occurrences */
|
||||
case 'g':
|
||||
if (match[0] != '^') sed_cmd->which_match = 0;
|
||||
break;
|
||||
/* Print pattern space */
|
||||
case 'p':
|
||||
sed_cmd->sub_p = 1;
|
||||
break;
|
||||
/* Write to file */
|
||||
case 'w':
|
||||
{
|
||||
char *temp;
|
||||
idx+=parse_file_cmd(sed_cmd,substr+idx,&temp);
|
||||
|
||||
break;
|
||||
}
|
||||
/* Ignore case (gnu exension) */
|
||||
case 'I':
|
||||
cflags |= REG_ICASE;
|
||||
break;
|
||||
/* Comment */
|
||||
case '#':
|
||||
while(substr[++idx]);
|
||||
/* Fall through */
|
||||
/* End of command */
|
||||
case ';':
|
||||
case '}':
|
||||
goto out;
|
||||
default:
|
||||
bb_error_msg_and_die("bad option in substitution expression");
|
||||
break;
|
||||
}
|
||||
/* Ignore case (gnu exension) */
|
||||
case 'I':
|
||||
cflags |= REG_ICASE;
|
||||
break;
|
||||
/* Comment */
|
||||
case '#':
|
||||
while(substr[++idx]);
|
||||
/* Fall through */
|
||||
/* End of command */
|
||||
case ';':
|
||||
case '}':
|
||||
goto out;
|
||||
default:
|
||||
bb_error_msg_and_die("bad option in substitution expression");
|
||||
}
|
||||
}
|
||||
out:
|
||||
@ -420,7 +420,7 @@ static char *parse_cmd_args(sed_cmd_t *sed_cmd, char *cmdstr)
|
||||
} else if (strchr(":btT", sed_cmd->cmd)) {
|
||||
int length;
|
||||
|
||||
while(isspace(*cmdstr)) cmdstr++;
|
||||
cmdstr = skip_whitespace(cmdstr);
|
||||
length = strcspn(cmdstr, semicolon_whitespace);
|
||||
if (length) {
|
||||
sed_cmd->string = xstrndup(cmdstr, length);
|
||||
@ -517,7 +517,7 @@ static void add_cmd(char *cmdstr)
|
||||
}
|
||||
|
||||
/* skip whitespace before the command */
|
||||
while (isspace(*cmdstr)) cmdstr++;
|
||||
cmdstr = skip_whitespace(cmdstr);
|
||||
|
||||
/* Check for inversion flag */
|
||||
if (*cmdstr == '!') {
|
||||
@ -525,7 +525,7 @@ static void add_cmd(char *cmdstr)
|
||||
cmdstr++;
|
||||
|
||||
/* skip whitespace before the command */
|
||||
while (isspace(*cmdstr)) cmdstr++;
|
||||
cmdstr = skip_whitespace(cmdstr);
|
||||
}
|
||||
|
||||
/* last part (mandatory) will be a command */
|
||||
@ -724,7 +724,7 @@ static int puts_maybe_newline(char *s, FILE *file, int missing_newline, int no_n
|
||||
fputs(s,file);
|
||||
if(!no_newline) fputc('\n',file);
|
||||
|
||||
if(ferror(file)) {
|
||||
if(ferror(file)) {
|
||||
xfunc_error_retval = 4; /* It's what gnu sed exits with... */
|
||||
bb_error_msg_and_die(bb_msg_write_error);
|
||||
}
|
||||
@ -1167,40 +1167,43 @@ int sed_main(int argc, char **argv)
|
||||
FILE *file;
|
||||
|
||||
for (i = optind; i < argc; i++) {
|
||||
struct stat statbuf;
|
||||
int nonstdoutfd;
|
||||
|
||||
if(!strcmp(argv[i], "-") && !bbg.in_place) {
|
||||
add_input_file(stdin);
|
||||
process_files();
|
||||
} else {
|
||||
file = bb_wfopen(argv[i], "r");
|
||||
if (file) {
|
||||
if(bbg.in_place) {
|
||||
struct stat statbuf;
|
||||
int nonstdoutfd;
|
||||
|
||||
bbg.outname=xstrndup(argv[i],strlen(argv[i])+6);
|
||||
strcat(bbg.outname,"XXXXXX");
|
||||
if(-1==(nonstdoutfd=mkstemp(bbg.outname)))
|
||||
bb_error_msg_and_die("no temp file");
|
||||
bbg.nonstdout=fdopen(nonstdoutfd,"w");
|
||||
|
||||
/* Set permissions of output file */
|
||||
|
||||
fstat(fileno(file),&statbuf);
|
||||
fchmod(nonstdoutfd,statbuf.st_mode);
|
||||
add_input_file(file);
|
||||
process_files();
|
||||
fclose(bbg.nonstdout);
|
||||
|
||||
bbg.nonstdout=stdout;
|
||||
unlink(argv[i]);
|
||||
rename(bbg.outname,argv[i]);
|
||||
free(bbg.outname);
|
||||
bbg.outname=0;
|
||||
} else add_input_file(file);
|
||||
} else {
|
||||
status = EXIT_FAILURE;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
file = bb_wfopen(argv[i], "r");
|
||||
if (!file) {
|
||||
status = EXIT_FAILURE;
|
||||
continue;
|
||||
}
|
||||
if(!bbg.in_place) {
|
||||
add_input_file(file);
|
||||
continue;
|
||||
}
|
||||
|
||||
bbg.outname=xstrndup(argv[i],strlen(argv[i])+6);
|
||||
strcat(bbg.outname,"XXXXXX");
|
||||
if(-1==(nonstdoutfd=mkstemp(bbg.outname)))
|
||||
bb_error_msg_and_die("no temp file");
|
||||
bbg.nonstdout=fdopen(nonstdoutfd,"w");
|
||||
|
||||
/* Set permissions of output file */
|
||||
|
||||
fstat(fileno(file),&statbuf);
|
||||
fchmod(nonstdoutfd,statbuf.st_mode);
|
||||
add_input_file(file);
|
||||
process_files();
|
||||
fclose(bbg.nonstdout);
|
||||
|
||||
bbg.nonstdout=stdout;
|
||||
unlink(argv[i]);
|
||||
rename(bbg.outname,argv[i]);
|
||||
free(bbg.outname);
|
||||
bbg.outname=0;
|
||||
}
|
||||
if(bbg.input_file_count>bbg.current_input_file) process_files();
|
||||
}
|
||||
|
@ -179,10 +179,10 @@ static void stack_machine(const char *argument)
|
||||
*/
|
||||
static char *get_token(char **buffer)
|
||||
{
|
||||
char *start = NULL;
|
||||
char *current = *buffer;
|
||||
char *start = NULL;
|
||||
char *current;
|
||||
|
||||
while (isspace(*current)) { current++; }
|
||||
current = skip_whitespace(*buffer);
|
||||
if (*current != 0) {
|
||||
start = current;
|
||||
while (!isspace(*current) && *current != 0) { current++; }
|
||||
|
@ -76,15 +76,13 @@ static int parse_tag_value ( char *buffer, char **ptag, char **pvalue )
|
||||
{
|
||||
char *tag, *value;
|
||||
|
||||
while ( isspace ( *buffer ))
|
||||
buffer++;
|
||||
buffer = skip_whitespace ( buffer );
|
||||
tag = value = buffer;
|
||||
while ( !isspace ( *value ))
|
||||
if (!*value) return 0;
|
||||
else value++;
|
||||
*value++ = 0;
|
||||
while ( isspace ( *value ))
|
||||
value++;
|
||||
value = skip_whitespace ( value );
|
||||
if (!*value) return 0;
|
||||
|
||||
*ptag = tag;
|
||||
@ -311,11 +309,9 @@ static void include_conf ( struct dep_t **first, struct dep_t **current, char *b
|
||||
}
|
||||
}
|
||||
else if (( strncmp ( buffer, "include", 7 ) == 0 ) && isspace ( buffer [7] )) {
|
||||
int fdi; char *filename;
|
||||
|
||||
int fdi; char *filename = buffer + 8;
|
||||
|
||||
while ( isspace ( *filename ))
|
||||
filename++;
|
||||
filename = skip_whitespace ( buffer + 8 );
|
||||
|
||||
if (( fdi = open ( filename, O_RDONLY )) >= 0 ) {
|
||||
include_conf(first, current, buffer, buflen, fdi);
|
||||
|
@ -572,10 +572,7 @@ static char *next_word(char **buf)
|
||||
}
|
||||
|
||||
/* Skip over leading whitespace */
|
||||
word = *buf;
|
||||
while (isspace(*word)) {
|
||||
++word;
|
||||
}
|
||||
word = skip_whitespace(*buf);
|
||||
|
||||
/* Skip over comments */
|
||||
if (*word == '#') {
|
||||
@ -712,9 +709,7 @@ static struct interfaces_file_t *read_interfaces(const char *filename)
|
||||
}
|
||||
|
||||
/* ship any trailing whitespace */
|
||||
while (isspace(*buf_ptr)) {
|
||||
++buf_ptr;
|
||||
}
|
||||
buf_ptr = skip_whitespace(buf_ptr);
|
||||
|
||||
if (buf_ptr[0] != '\0') {
|
||||
bb_error_msg("too many parameters \"%s\"", buf);
|
||||
|
@ -302,7 +302,7 @@ int wget_main(int argc, char **argv)
|
||||
|
||||
s = buf;
|
||||
while (*s != '\0' && !isspace(*s)) ++s;
|
||||
while (isspace(*s)) ++s;
|
||||
s = skip_whitespace(s);
|
||||
// FIXME: no error check
|
||||
// xatou wouldn't work: "200 OK"
|
||||
status = atoi(s);
|
||||
|
@ -119,7 +119,7 @@ static char *parse_pipeline(char *cmdline, struct pipeline *line)
|
||||
char *end;
|
||||
|
||||
// Skip leading whitespace and detect end of line.
|
||||
while (isspace(*start)) start++;
|
||||
start = skip_whitespace(start);
|
||||
if (!*start || *start=='#') {
|
||||
if (ENABLE_BBSH_JOBCTL) line->cmdlinelen = start-cmdline;
|
||||
return 0;
|
||||
|
@ -203,8 +203,7 @@ static llist_t *get_block_backed_filesystems(void)
|
||||
while ((buf = xmalloc_getline(f)) != 0) {
|
||||
if (!strncmp(buf, "nodev", 5) && isspace(buf[5]))
|
||||
continue;
|
||||
fs = buf;
|
||||
while (isspace(*fs)) fs++;
|
||||
fs = skip_whitespace(buf);
|
||||
if (*fs=='#' || *fs=='*' || !*fs) continue;
|
||||
|
||||
llist_add_to_end(&list, xstrdup(fs));
|
||||
|
Loading…
Reference in New Issue
Block a user