diff --git a/src/parser.c b/src/parser.c index b332e31b536158d7aedb55ce7018abb6d127693d..84356f42f9c11701ba7d13fda3bf46169b67b8a2 100644 --- a/src/parser.c +++ b/src/parser.c @@ -94,13 +94,16 @@ static void parse_line(FILE *fp, struct swift_params *params) { char line [PARSER_MAX_LINE_SIZE]; char trim_line [PARSER_MAX_LINE_SIZE]; + char tmp_str [PARSER_MAX_LINE_SIZE]; + char param_name [PARSER_MAX_LINE_SIZE]; + static char section [PARSER_MAX_LINE_SIZE]; - /* Read a line of the file */ - if(fgets(line,PARSER_MAX_LINE_SIZE,fp) != NULL) { + /* Read a line of the file if it doesn't begin with a comment*/ + if(fgets(line,PARSER_MAX_LINE_SIZE,fp) != NULL && (*line != PARSER_COMMENT_CHAR) ) { char *token; /* Remove comments */ - token = strtok(line,PARSER_COMMENT_CHAR); + token = strtok(line,PARSER_COMMENT_STRING); strcpy(trim_line,token); /* Check if the line contains a value */ @@ -110,13 +113,27 @@ static void parse_line(FILE *fp, struct swift_params *params) { error("Found more than one parameter in '%s', only one allowed.",line); } else { - /* Take first token as the parameter name. */ - token = strtok(trim_line,PARSER_VALUE_STRING); - strcpy(params->data[params->count].name,token); + /* Take first token as the parameter name and trim leading white space. */ + token = strtok(trim_line," :\t"); + strcpy(tmp_str,token); /* Take second token as the parameter value. */ - token = strtok (NULL, " #\n"); - strcpy(params->data[params->count++].value,token); + token = strtok(NULL, " #\n"); + + /* If second token is NULL then the line must be a section heading. */ + if(token == NULL) { + strcat(tmp_str,PARSER_VALUE_STRING); + strcpy(section,tmp_str); + } + else { + /* Prefix the parameter name with its section name and + * copy it into the parameter structure. */ + strcpy(param_name,section); + strcat(param_name,tmp_str); + strcpy(params->data[params->count].name,param_name); + strcpy(params->data[params->count++].value,token); + } + } } } @@ -133,7 +150,7 @@ static void parse_line(FILE *fp, struct swift_params *params) { void parser_get_param_int(struct swift_params *params, char * name, int * retParam) { - char str [128]; + char str [PARSER_MAX_LINE_SIZE]; for(int i=0; i<params->count; i++) { @@ -163,7 +180,7 @@ void parser_get_param_int(struct swift_params *params, char * name, int * retPar void parser_get_param_float(struct swift_params *params, char * name, float * retParam) { - char str [128]; + char str [PARSER_MAX_LINE_SIZE]; for(int i=0; i<params->count; i++) { @@ -194,7 +211,7 @@ void parser_get_param_float(struct swift_params *params, char * name, float * re void parser_get_param_double(struct swift_params *params, char * name, double * retParam) { - char str [128]; + char str [PARSER_MAX_LINE_SIZE]; for(int i=0; i<params->count; i++) { @@ -265,12 +282,35 @@ void parser_print_params(struct swift_params *params) { void parser_write_params_to_file(struct swift_params *params, const char *file_name) { FILE *file = fopen(file_name, "w"); - + char section [PARSER_MAX_LINE_SIZE]; + char param_name [PARSER_MAX_LINE_SIZE]; + char *token; + /* Start of file identifier in YAML. */ fprintf(file,"%s\n",PARSER_START_OF_FILE); for(int i=0; i<params->count; i++) { - fprintf(file,"%s%c %s\n",params->data[i].name,PARSER_VALUE_CHAR,params->data[i].value); + + /* Check that the parameter name contains a section name. */ + if(strchr(params->data[i].name,PARSER_VALUE_CHAR)) { + /* Copy the parameter name into a temporary string and find the section name. */ + strcpy(param_name,params->data[i].name); + token = strtok(param_name,PARSER_VALUE_STRING); + + /* If a new section name is found print it to the file. */ + if(strcmp(token,section)) { + strcpy(section,token); + fprintf(file,"\n%s%c\n",section,PARSER_VALUE_CHAR); + } + + /* Remove white space from parameter name and write it to the file. */ + token = strtok(NULL, " #\n"); + + fprintf(file,"\t%s%c %s\n",token,PARSER_VALUE_CHAR,params->data[i].value); + } + else { + fprintf(file,"%s%c %s\n",params->data[i].name,PARSER_VALUE_CHAR,params->data[i].value); + } } /* End of file identifier in YAML. */ diff --git a/src/parser.h b/src/parser.h index 2246a8913d8fa428a0f5b00294197420af79ed99..2ec6331a7d612685c3f3c936be8bdaf5b4b96c5e 100644 --- a/src/parser.h +++ b/src/parser.h @@ -24,7 +24,8 @@ #define PARSER_MAX_LINE_SIZE 128 #define PARSER_MAX_NO_OF_PARAMS 512 -#define PARSER_COMMENT_CHAR "#" +#define PARSER_COMMENT_STRING "#" +#define PARSER_COMMENT_CHAR '#' #define PARSER_VALUE_CHAR ':' #define PARSER_VALUE_STRING ":" #define PARSER_START_OF_FILE "---"