]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[script] Allow initial whitespace on lines containing labels
authorMichael Brown <mcb30@ipxe.org>
Tue, 23 Jul 2013 13:46:45 +0000 (14:46 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 25 Jul 2013 12:03:42 +0000 (13:03 +0100)
Initial whitespace is already accepted on lines containing commands,
since it gets ignored by the system() call.  Minimise surprise and
allow for neater indentation of scripts by also allowing whitespace on
lines containing labels.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/image/script.c

index ceccd90183b7532dfaa1f779c8a742199a022780..d30f2613d5ea2c8f5d1ee61caf35cc595a316b15 100644 (file)
@@ -136,6 +136,26 @@ static int terminate_on_exit_or_failure ( int rc ) {
                 ( rc != 0 ) );
 }
 
+/**
+ * Find label within script line
+ *
+ * @v line             Line of script
+ * @ret label          Start of label name, or NULL if not found
+ */
+static const char * find_label ( const char *line ) {
+
+       /* Skip any leading whitespace */
+       while ( isspace ( *line ) )
+               line++;
+
+       /* If first non-whitespace character is a ':', then we have a label */
+       if ( *line == ':' ) {
+               return ( line + 1 );
+       } else {
+               return NULL;
+       }
+}
+
 /**
  * Execute script line
  *
@@ -146,7 +166,7 @@ static int script_exec_line ( const char *line ) {
        int rc;
 
        /* Skip label lines */
-       if ( line[0] == ':' )
+       if ( find_label ( line ) != NULL )
                return 0;
 
        /* Execute command */
@@ -252,14 +272,19 @@ static const char *goto_label;
  */
 static int goto_find_label ( const char *line ) {
        size_t len = strlen ( goto_label );
+       const char *label;
 
-       if ( line[0] != ':' )
+       /* Find label */
+       label = find_label ( line );
+       if ( ! label )
                return -ENOENT;
 
-       if ( strncmp ( goto_label, &line[1], len ) != 0 )
+       /* Check if label matches */
+       if ( strncmp ( goto_label, label, len ) != 0 )
                return -ENOENT;
 
-       if ( line[ 1 + len ] && ! isspace ( line[ 1 + len ] ) )
+       /* Check label is terminated by a NUL or whitespace */
+       if ( label[len] && ! isspace ( label[len] ) )
                return -ENOENT;
 
        return 0;