summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath2003-03-28 04:43:39 +0000
committerGlenn L McGrath2003-03-28 04:43:39 +0000
commit961c6c19da488d0b69cd2e7d4098acaaaa5b1179 (patch)
tree65516cdaea81c7cbf67ea404d01a87a6615e6950
parent56c633c1396aa8c11b92702041439fa1041fe7bb (diff)
downloadbusybox-961c6c19da488d0b69cd2e7d4098acaaaa5b1179.zip
busybox-961c6c19da488d0b69cd2e7d4098acaaaa5b1179.tar.gz
Add basic branching support, sed ':' and 'b' commands
-rw-r--r--editors/sed.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/editors/sed.c b/editors/sed.c
index 037d2a8..5fe4356 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -55,6 +55,9 @@
#include <stdlib.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 */
extern void xregcomp(regex_t *preg, const char *regex, int cflags);
extern int optind; /* in unistd.h */
@@ -103,6 +106,9 @@ typedef struct sed_cmd_s {
/* inversion flag */
int invert; /* the '!' after the address */
+ /* Branch commands */
+ char label[SED_LABEL_LENGTH + 1];
+
/* next command in list (sequential list of specified commands) */
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");
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
* 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;
}
+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)
{
@@ -832,6 +862,12 @@ static void process_file(FILE *file)
strcat(line, next_line);
next_line = bb_get_chomped_line_from_file(file);
linenum++;
+ break;
+ case 'b':
+ sed_cmd = branch_to(sed_cmd->label);
+ break;
+// case ':':
+// break;
}
}