david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[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 <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2013-07-23 14:46:45 +01:00
parent bd6c3a1886
commit 7fc18ea8ab
1 changed files with 29 additions and 4 deletions

View 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;