From 7fc18ea8ab845da3e252abb7d78060182b0342a3 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 23 Jul 2013 14:46:45 +0100 Subject: [PATCH] [script] Allow initial whitespace on lines containing labels 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 --- src/image/script.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/image/script.c b/src/image/script.c index ceccd901..d30f2613 100644 --- a/src/image/script.c +++ b/src/image/script.c @@ -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;