summaryrefslogtreecommitdiff
path: root/util/amdfwtool/data_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/amdfwtool/data_parse.c')
-rw-r--r--util/amdfwtool/data_parse.c71
1 files changed, 30 insertions, 41 deletions
diff --git a/util/amdfwtool/data_parse.c b/util/amdfwtool/data_parse.c
index 50f844fa67..b94e46f06a 100644
--- a/util/amdfwtool/data_parse.c
+++ b/util/amdfwtool/data_parse.c
@@ -29,22 +29,7 @@ static const char entries_line_regex[] =
"[[:space:]]+"
/* followed by a chunk of nonwhitespace for filename field */
"([^[:space:]]+)"
- /* followed by optional whitespace */
- "[[:space:]]*$";
-static regex_t entries_line_expr;
-
-static const char entries_lvl_line_regex[] =
- /* optional whitespace */
- "^[[:space:]]*"
- /* followed by a chunk of nonwhitespace for macro field */
- "([^[:space:]]+)"
- /* followed by one or more whitespace characters */
- "[[:space:]]+"
- /* followed by a chunk of nonwhitespace for filename field */
- "([^[:space:]]+)"
- /* followed by one or more whitespace characters */
- "[[:space:]]+"
- /* followed by a chunk of nonwhitespace for level field
+ /* followed by an optional whitespace + chunk of nonwhitespace for level field
1st char L: Indicator of field "level"
2nd char:
Directory level to be dropped in.
@@ -60,10 +45,18 @@ static const char entries_lvl_line_regex[] =
L12: Level 1 for normal mode, level 2 for A/B mode
Lx1: Use default value for normal mode, level 1 for A/B mode
*/
- "([Ll][12bxBX]{1,2})"
+ "([[:space:]]+([Ll][12bxBX]{1,2}))?"
/* followed by optional whitespace */
"[[:space:]]*$";
-static regex_t entries_lvl_line_expr;
+static regex_t entries_line_expr;
+
+enum match_id {
+ FW_TYPE = 1,
+ FW_FILE,
+ OPT_SPACE1,
+ OPT_LEVEL,
+ N_MATCHES,
+};
void compile_reg_expr(int cflags, const char *expr, regex_t *reg)
{
@@ -579,7 +572,6 @@ int get_input_file_line(FILE *f, char line[], int line_buf_size)
return OK;
}
-#define N_MATCHES 4
static int is_valid_entry(char *oneline, regmatch_t match[N_MATCHES])
{
int retval, index;
@@ -588,18 +580,14 @@ static int is_valid_entry(char *oneline, regmatch_t match[N_MATCHES])
match[index].rm_so = -1;
match[index].rm_eo = -1;
}
- if (regexec(&entries_line_expr, oneline, 3, match, 0) == 0) {
- oneline[match[1].rm_eo] = '\0';
- oneline[match[2].rm_eo] = '\0';
- retval = 1;
- } else if (regexec(&entries_lvl_line_expr, oneline, 4, match, 0) == 0) {
+ if (regexec(&entries_line_expr, oneline, N_MATCHES, match, 0) == 0) {
/* match[1]: FW type
match[2]: FW filename
- match[3]: Directory level to be dropped
+ match[4]: Optional directory level to be dropped
*/
- oneline[match[1].rm_eo] = '\0';
- oneline[match[2].rm_eo] = '\0';
- oneline[match[3].rm_eo] = '\0';
+ oneline[match[FW_TYPE].rm_eo] = '\0';
+ oneline[match[FW_FILE].rm_eo] = '\0';
+ oneline[match[OPT_LEVEL].rm_eo] = '\0';
retval = 1;
} else {
retval = 0;
@@ -645,10 +633,11 @@ char get_level_from_config(char *line, regoff_t level_index, amd_cb_config *cb_c
static uint8_t process_one_line(char *oneline, regmatch_t *match, char *dir,
amd_cb_config *cb_config)
{
- char *path_filename, *fn = &(oneline[match[2].rm_so]);
- char *fw_type_str = &(oneline[match[1].rm_so]);
+ char *path_filename, *fn = &(oneline[match[FW_FILE].rm_so]);
+ char *fw_type_str = &(oneline[match[FW_TYPE].rm_so]);
char ch_lvl = 'x';
- regoff_t ch_lvl_index = match[3].rm_so;
+ regoff_t ch_lvl_index = match[OPT_LEVEL].rm_so == match[OPT_LEVEL].rm_eo ?
+ -1 : match[OPT_LEVEL].rm_so;
/* If the optional level field is present,
extract the level char. */
@@ -703,6 +692,8 @@ static bool is_second_gen(enum platform platform_type)
}
}
+#define FW_LOCATION "FIRMWARE_LOCATION"
+#define SOC_NAME "SOC_NAME"
/*
return value:
0: The config file can not be parsed correctly.
@@ -725,8 +716,6 @@ uint8_t process_config(FILE *config, amd_cb_config *cb_config)
blank_or_comment_regex, &blank_or_comment_expr);
compile_reg_expr(REG_EXTENDED | REG_NEWLINE,
entries_line_regex, &entries_line_expr);
- compile_reg_expr(REG_EXTENDED | REG_NEWLINE,
- entries_lvl_line_regex, &entries_lvl_line_expr);
/* Get a line */
/* Get FIRMWARE_LOCATION in the first loop */
@@ -735,14 +724,14 @@ uint8_t process_config(FILE *config, amd_cb_config *cb_config)
if (skip_comment_blank_line(oneline))
continue;
if (is_valid_entry(oneline, match)) {
- if (strcmp(&(oneline[match[1].rm_so]), "FIRMWARE_LOCATION") == 0) {
- dir_len = match[2].rm_eo - match[2].rm_so;
+ if (strcmp(&(oneline[match[FW_TYPE].rm_so]), FW_LOCATION) == 0) {
+ dir_len = match[FW_FILE].rm_eo - match[FW_FILE].rm_so;
assert(dir_len < MAX_LINE_SIZE);
snprintf(dir, MAX_LINE_SIZE, "%.*s", dir_len,
- &(oneline[match[2].rm_so]));
- } else if (strcmp(&(oneline[match[1].rm_so]), "SOC_NAME") == 0) {
- cb_config->soc_id =
- identify_platform(&(oneline[match[2].rm_so]));
+ &(oneline[match[FW_FILE].rm_so]));
+ } else if (strcmp(&(oneline[match[FW_TYPE].rm_so]), SOC_NAME) == 0) {
+ cb_config->soc_id = identify_platform(
+ &(oneline[match[FW_FILE].rm_so]));
}
}
}
@@ -770,8 +759,8 @@ uint8_t process_config(FILE *config, amd_cb_config *cb_config)
if (skip_comment_blank_line(oneline))
continue;
if (is_valid_entry(oneline, match)) {
- if (strcmp(&(oneline[match[1].rm_so]), "FIRMWARE_LOCATION") == 0 ||
- strcmp(&(oneline[match[1].rm_so]), "SOC_NAME") == 0) {
+ if (strcmp(&(oneline[match[FW_TYPE].rm_so]), FW_LOCATION) == 0 ||
+ strcmp(&(oneline[match[FW_TYPE].rm_so]), SOC_NAME) == 0) {
continue;
} else {
if (process_one_line(oneline, match, dir,