[scripting] Added parse.h, '' and "" now give empty string
authorLynus Vaz <lynus@Arch.localdomain>
Tue, 23 Jun 2009 11:11:12 +0000 (16:41 +0530)
committerLynus Vaz <lynus@Arch.localdomain>
Tue, 23 Jun 2009 11:11:12 +0000 (16:41 +0530)
src/core/exec.c
src/hci/arith.c
src/include/gpxe/parse.h [new file with mode: 0644]

index b162aa8..1402ae5 100644 (file)
@@ -29,15 +29,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <gpxe/tables.h>
 #include <gpxe/command.h>
 #include <gpxe/settings.h>
+#include <gpxe/parse.h>
 
 #include <lib.h>
 
-
-#define                        ENDQUOTES       0
-#define                        TABLE           1
-#define                        FUNC            2
-#define                        ENDTOK          3
-
 /** @file
  *
  * Command execution
@@ -88,7 +83,7 @@ int execv ( const char *command, char * const argv[] ) {
        /* Hand off to command implementation */
        for_each_table_entry ( cmd, COMMANDS ) {
                if ( strcmp ( command, cmd->name ) == 0 ) {
-                       if ( branch_stack[branch_tos] || !strcmp ( cmd -> name, "if" ) || !strcmp ( cmd -> name, "fi" ) || !strcmp ( cmd -> name, "else" ) )
+                       if ( branch_stack[branch_tos] || !strcmp ( cmd->name, "if" ) || !strcmp ( cmd->name, "fi" ) || !strcmp ( cmd->name, "else" ) )
                                return cmd->exec ( argc, ( char ** ) argv );
                        else
                                return 0;
@@ -104,8 +99,6 @@ struct argument {
        struct argument *next;
 };
 
-int parse_arith(char *inp_string, char **end, char **buffer);
-
 char * dollar_expand ( char *inp, char **end ) {
        char *expdollar;
        char *name;
@@ -172,19 +165,6 @@ char * parse_escape ( char *input, char **end ) {
        return exp;
 }
 
-
-struct char_table {
-       char token;
-       int type;
-       union {
-               struct {
-                       struct char_table *ntable;
-                       int len;
-               } next_table;
-               char * ( *parse_func ) ( char *, char ** );
-       }next;
-};
-
 struct char_table dquote_table[3] = {
        { .token = '"', .type = ENDQUOTES },
        { .token = '$', .type = FUNC, .next.parse_func = dollar_expand },
@@ -203,13 +183,14 @@ static struct char_table table[6] = {
        { .token = '\t', .type = ENDTOK }
 };
 
-char * expand_string ( char * input, char **end, const struct char_table *table, int tlen, int in_quotes ) {
+char * expand_string ( char * input, char **end, const struct char_table *table, int tlen, int in_quotes, int *success ) {
        char *expstr;
        char *head;
        char *nstr, *tmp;
        int i;
        int new_len;
        
+       *success = 0;
        expstr = strdup ( input );
        head = expstr;
        
@@ -224,10 +205,12 @@ char * expand_string ( char * input, char **end, const struct char_table *table,
                }
                
                if ( ! tline ) {
+                       *success = 1;
                        head++;
                } else {
-                       switch ( tline -> type ) {
+                       switch ( tline->type ) {
                                case ENDQUOTES: /* 0 for end of input, where next char is to be discarded. Used for ending ' or " */
+                                       *success = 1;
                                        *head = 0;
                                        *end = head + 1;
                                        //printf ( "return value: [%s]\n", expstr );
@@ -236,16 +219,15 @@ char * expand_string ( char * input, char **end, const struct char_table *table,
                                case TABLE: /* 1 for recursive call. Probably found quotes */
                                case FUNC: /* Call another function */
                                        {
+                                               *success = 1;
                                                *head = 0;
-                                               nstr = ( tline -> type == TABLE ) ? ( expand_string ( head + 1, &head, tline->next.next_table.ntable, tline->next.next_table.len, 1 ) ) 
-                                                                                                       : ( tline -> next.parse_func ( head, &head ) );
+                                               nstr = ( tline->type == TABLE ) ? ( expand_string ( head + 1, &head, tline->next.next_table.ntable, tline->next.next_table.len, 1, success ) ) 
+                                                                                                       : ( tline->next.parse_func ( head, &head ) );
                                                tmp = expstr;
                                                
                                                new_len = asprintf ( &expstr, "%s%s%s", expstr, nstr, head );
-                                               if ( in_quotes || tline -> type == TABLE )
-                                                       head = expstr + strlen ( tmp ) + strlen ( nstr );
-                                               else
-                                                       head = expstr + strlen ( tmp );
+                                               head = expstr + strlen ( tmp ) + strlen ( nstr );
+                                               
                                                free ( tmp );
                                                free ( nstr );
                                                if ( !nstr || new_len < 0 ) { /* if new_len < 0, expstr = NULL */
@@ -287,6 +269,7 @@ int expand_command ( const char *command, struct argument **argv_start ) {
        char *nstring;
        struct argument *cur_arg = NULL;
        int argc = 0;
+       int success;
        
        /* Obtain temporary modifiable copy of command line */
        expcmd = strdup ( command );    
@@ -301,36 +284,39 @@ int expand_command ( const char *command, struct argument **argv_start ) {
                if ( *head == '#' && !*argv_start ) { /* Comment starts with # */
                        return 0;
                }
-               nstring = expand_string ( head, &end, table, 6, 0 );
+               nstring = expand_string ( head, &end, table, 6, 0, &success );
                if ( !nstring ) {
                        while ( *argv_start ) {
                                cur_arg = *argv_start;
-                               *argv_start = ( *argv_start ) -> next;
+                               *argv_start = ( *argv_start )->next;
                                free ( cur_arg );
                        }
+                       free ( expcmd );
                        return -ENOMEM;
                }
-               if ( nstring != end ) {
+               if ( success ) {
                        argc++;
                        if ( !*argv_start ) {
                                *argv_start = calloc ( sizeof ( struct argument ), 1 );
                                cur_arg = *argv_start;
                        } else {
-                               cur_arg -> next = calloc ( sizeof ( struct argument ), 1 );
-                               cur_arg = cur_arg -> next;
+                               cur_arg->next = calloc ( sizeof ( struct argument ), 1 );
+                               cur_arg = cur_arg->next;
                        }
                
                        if ( !cur_arg ) {
                                while ( *argv_start ) {
                                        cur_arg = *argv_start;
-                                       *argv_start = ( *argv_start ) -> next;
+                                       *argv_start = ( *argv_start )->next;
                                        free ( cur_arg );
                                }
+                               free ( expcmd );
+                               free ( nstring );
                                return -ENOMEM;
                        }
                
-                       cur_arg -> word = calloc ( end - nstring + 1, 1);
-                       strncpy ( cur_arg -> word, nstring, end - nstring );
+                       cur_arg->word = calloc ( end - nstring + 1, 1);
+                       strncpy ( cur_arg->word, nstring, end - nstring );
                }
                free ( expcmd );
                expcmd = nstring;
@@ -365,8 +351,8 @@ int system ( const char *command ) {
                for ( i = 0; i < argc; i++ ) {
                        struct argument *tmp;
                        tmp = arg;
-                       argv[i] = arg -> word;
-                       arg = arg -> next;
+                       argv[i] = arg->word;
+                       arg = arg->next;
                        free ( tmp );
                        
                        //printf ( "[%s] ", argv[i] );
index 06ef5d5..5c77308 100644 (file)
@@ -19,9 +19,8 @@
 #include <stdio.h>
 #include <errno.h>
 
-#ifndef __ARITH_TEST__
 #include <lib.h>
-#endif
+#include <gpxe/parse.h>
 
 #define NUM_OPS                20
 #define MAX_PRIO               11
@@ -55,42 +54,17 @@ static union {
        char *str_value;
 }tok_value;
 
-struct char_table {
-       char token;
-       int type;
-       union {
-               struct {
-                       struct char_table *ntable;
-                       int len;
-               } next_table;
-               char * ( *parse_func ) ( char *, char ** );
-       }next;
-};
-
-
 /* Here is a table of the operators */
 static const char op_table[NUM_OPS * 3 + 1] = {        '!', SEP2 ,  '~', SEP2, '*', SEP2, '/', SEP2, '%', SEP2, '+', SEP2, '-', SEP2,
                                                '<', SEP2, '<', '=', SEP1, '<', '<', SEP1, '>', SEP2, '>', '=', SEP1, '>', '>', SEP1,  '&', SEP2,
                                                '|', SEP2, '^', SEP2, '&', '&', SEP1, '|', '|', SEP1, '!', '=', SEP1, '=', '=', SEP1, '\0'
 };
 
-//static const char *keyword_table = " \t\v()'\"$!~*/%+-<=>&|^";                       /* Characters that cannot appear in a string */
 static signed const char op_prio[NUM_OPS]      = { 10, 10, 9, 9, 9, 8, 8, 6, 6, 7, 6, 6, 7, 4, 3, 2, 1, 0, 5, 5 };
 
 static void ignore_whitespace ( void );
 static int parse_expr ( char **buffer );
-char * expand_string ( char * input, char **end, const struct char_table *table, int tlen, int in_quotes );
-char * dollar_expand ( char *inp, char **end );
-char * parse_escape ( char *input, char **end );
-int isnum ( char *string, long *num );
-
-#define                        ENDQUOTES       0
-#define                        TABLE           1
-#define                        FUNC            2
-#define                        ENDTOK          3
 
-extern struct char_table dquote_table[3];
-extern struct char_table squote_table[1];
 struct char_table table[21] = {
        { .token = '\\', .type = FUNC, .next.parse_func = parse_escape },
        { .token = '"', .type = TABLE, .next = { .next_table = { .ntable = dquote_table, .len = 3 } } },
@@ -120,6 +94,7 @@ static void input ( void ) {
        char *p1, *p2;
        char *strtmp = NULL, *tmp;
        char *end;
+       int success;
        
        if ( tok == -1 )
                return;
@@ -133,12 +108,18 @@ static void input ( void ) {
        }
        tok = 0;
        
-       tmp = expand_string ( inp, &end, table, 21, 1 );
+       tmp = expand_string ( inp, &end, table, 21, 1, &success );
        inp = end;
        free ( orig );
-       orig = tmp;
        
-       if ( tmp != end ) {
+       if ( !tmp ) {
+               tok = -1;
+               err_val = -ENOMEM;
+               return;
+       }
+       
+       orig = tmp;
+       if ( success ) {
                strtmp = calloc ( end - tmp + 1, 1 );
                strncpy ( strtmp, tmp, end - tmp );
                if ( isnum ( strtmp, &tok_value.num_value ) ) {
@@ -272,8 +253,6 @@ static int eval(int op, char *op1, char *op2, char **buffer) {
        int bothints = 1;
        long lhs, rhs;
        
-       printf ( "lhs = %s, rhs = %s\n", op1, op2 );
-       
        if ( op1 ) {
                if ( ! isnum ( op1, &lhs ) ) 
                        bothints = 0;
diff --git a/src/include/gpxe/parse.h b/src/include/gpxe/parse.h
new file mode 100644 (file)
index 0000000..5af2106
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef _GPXE_PARSE_H_
+#define _GPXE_PARSE_H_
+
+#define                        ENDQUOTES       0
+#define                        TABLE           1
+#define                        FUNC            2
+#define                        ENDTOK          3
+
+struct char_table {
+       char token;
+       int type;
+       union {
+               struct {
+                       struct char_table *ntable;
+                       int len;
+               } next_table;
+               char * ( *parse_func ) ( char *, char ** );
+       }next;
+};
+
+int parse_arith ( char *inp_string, char **end, char **buffer );
+
+char * expand_string ( char * input, char **end, const struct char_table *table, int tlen, int in_quotes, int *success );
+char * dollar_expand ( char *inp, char **end );
+char * parse_escape ( char *input, char **end );
+int isnum ( char *string, long *num );
+
+extern struct char_table dquote_table[3];
+extern struct char_table squote_table[1];
+
+#endif
\ No newline at end of file