Add basic branching support, sed ':' and 'b' commands

This commit is contained in:
Glenn L McGrath 2003-03-28 04:43:39 +00:00
parent 56c633c139
commit 961c6c19da

View File

@ -55,6 +55,9 @@
#include <stdlib.h> #include <stdlib.h>
#include "busybox.h" #include "busybox.h"
/* the spec says label must be at least 8 chars, behavious is unspecified if more than 8 chars */
#define SED_LABEL_LENGTH 8
/* externs */ /* externs */
extern void xregcomp(regex_t *preg, const char *regex, int cflags); extern void xregcomp(regex_t *preg, const char *regex, int cflags);
extern int optind; /* in unistd.h */ extern int optind; /* in unistd.h */
@ -103,6 +106,9 @@ typedef struct sed_cmd_s {
/* inversion flag */ /* inversion flag */
int invert; /* the '!' after the address */ int invert; /* the '!' after the address */
/* Branch commands */
char label[SED_LABEL_LENGTH + 1];
/* next command in list (sequential list of specified commands) */ /* next command in list (sequential list of specified commands) */
struct sed_cmd_s *linear; struct sed_cmd_s *linear;
@ -399,6 +405,18 @@ static char *parse_cmd_str(sed_cmd_t * const sed_cmd, char *cmdstr)
bb_error_msg_and_die("Command only uses one address"); bb_error_msg_and_die("Command only uses one address");
cmdstr += parse_file_cmd(sed_cmd, cmdstr); cmdstr += parse_file_cmd(sed_cmd, cmdstr);
} }
/* handle branch commands */
else if (strchr(":b", sed_cmd->cmd)) {
int length;
cmdstr += strspn(cmdstr, " ");
length = strcspn(cmdstr, "; ");
if (length > SED_LABEL_LENGTH) {
length = SED_LABEL_LENGTH;
}
strncpy(sed_cmd->label, cmdstr, length);
cmdstr += length;
}
/* if it wasnt a single-letter command that takes no arguments /* if it wasnt a single-letter command that takes no arguments
* then it must be an invalid command. * then it must be an invalid command.
*/ */
@ -677,6 +695,18 @@ static int do_subst_command(const sed_cmd_t *sed_cmd, char **line)
return altered; return altered;
} }
static sed_cmd_t *branch_to(const char *label)
{
sed_cmd_t *sed_cmd;
for(sed_cmd = sed_cmd_head.linear; sed_cmd; sed_cmd = sed_cmd->linear) {
if (strcmp(sed_cmd->label, label) == 0) {
break;
}
}
/* If no match returns last command */
return(sed_cmd);
}
static void process_file(FILE *file) static void process_file(FILE *file)
{ {
@ -832,6 +862,12 @@ static void process_file(FILE *file)
strcat(line, next_line); strcat(line, next_line);
next_line = bb_get_chomped_line_from_file(file); next_line = bb_get_chomped_line_from_file(file);
linenum++; linenum++;
break;
case 'b':
sed_cmd = branch_to(sed_cmd->label);
break;
// case ':':
// break;
} }
} }