cfgfile: rework load function
New functions added to cfgfile library make it possible to significantly simplify the code of rte_cfgfile_load_with_params() This patch shows the new body of this function. Signed-off-by: Jacek Piasecki <jacekx.piasecki@intel.com> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
parent
d4cb819758
commit
a6a47ac9c2
@ -189,10 +189,6 @@ struct rte_cfgfile *
|
|||||||
rte_cfgfile_load_with_params(const char *filename, int flags,
|
rte_cfgfile_load_with_params(const char *filename, int flags,
|
||||||
const struct rte_cfgfile_parameters *params)
|
const struct rte_cfgfile_parameters *params)
|
||||||
{
|
{
|
||||||
int allocated_sections = CFG_ALLOC_SECTION_BATCH;
|
|
||||||
int allocated_entries = 0;
|
|
||||||
int curr_section = -1;
|
|
||||||
int curr_entry = -1;
|
|
||||||
char buffer[CFG_NAME_LEN + CFG_VALUE_LEN + 4] = {0};
|
char buffer[CFG_NAME_LEN + CFG_VALUE_LEN + 4] = {0};
|
||||||
int lineno = 0;
|
int lineno = 0;
|
||||||
struct rte_cfgfile *cfg = NULL;
|
struct rte_cfgfile *cfg = NULL;
|
||||||
@ -204,28 +200,7 @@ rte_cfgfile_load_with_params(const char *filename, int flags,
|
|||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
cfg = malloc(sizeof(*cfg) + sizeof(cfg->sections[0]) *
|
cfg = rte_cfgfile_create(flags);
|
||||||
allocated_sections);
|
|
||||||
if (cfg == NULL)
|
|
||||||
goto error2;
|
|
||||||
|
|
||||||
memset(cfg->sections, 0, sizeof(cfg->sections[0]) * allocated_sections);
|
|
||||||
|
|
||||||
if (flags & CFG_FLAG_GLOBAL_SECTION) {
|
|
||||||
curr_section = 0;
|
|
||||||
allocated_entries = CFG_ALLOC_ENTRY_BATCH;
|
|
||||||
cfg->sections = malloc(
|
|
||||||
sizeof(cfg->sections[0]) +
|
|
||||||
sizeof(cfg->sections[0].entries) *
|
|
||||||
allocated_entries);
|
|
||||||
if (cfg->sections == NULL) {
|
|
||||||
printf("Error - no memory for global section\n");
|
|
||||||
goto error1;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(cfg->sections[curr_section].name,
|
|
||||||
sizeof(cfg->sections[0].name), "GLOBAL");
|
|
||||||
}
|
|
||||||
|
|
||||||
while (fgets(buffer, sizeof(buffer), f) != NULL) {
|
while (fgets(buffer, sizeof(buffer), f) != NULL) {
|
||||||
char *pos = NULL;
|
char *pos = NULL;
|
||||||
@ -236,13 +211,15 @@ rte_cfgfile_load_with_params(const char *filename, int flags,
|
|||||||
"Check if line too long\n", lineno);
|
"Check if line too long\n", lineno);
|
||||||
goto error1;
|
goto error1;
|
||||||
}
|
}
|
||||||
|
/* skip parsing if comment character found */
|
||||||
pos = memchr(buffer, params->comment_character, len);
|
pos = memchr(buffer, params->comment_character, len);
|
||||||
if (pos != NULL) {
|
if (pos != NULL && (*(pos-1) != '\\')) {
|
||||||
*pos = '\0';
|
*pos = '\0';
|
||||||
len = pos - buffer;
|
len = pos - buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = _strip(buffer, len);
|
len = _strip(buffer, len);
|
||||||
|
/* skip lines without useful content */
|
||||||
if (buffer[0] != '[' && memchr(buffer, '=', len) == NULL)
|
if (buffer[0] != '[' && memchr(buffer, '=', len) == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -250,128 +227,54 @@ rte_cfgfile_load_with_params(const char *filename, int flags,
|
|||||||
/* section heading line */
|
/* section heading line */
|
||||||
char *end = memchr(buffer, ']', len);
|
char *end = memchr(buffer, ']', len);
|
||||||
if (end == NULL) {
|
if (end == NULL) {
|
||||||
printf("Error line %d - no terminating '['"
|
printf("Error line %d - no terminating ']'"
|
||||||
"character found\n", lineno);
|
"character found\n", lineno);
|
||||||
goto error1;
|
goto error1;
|
||||||
}
|
}
|
||||||
*end = '\0';
|
*end = '\0';
|
||||||
_strip(&buffer[1], end - &buffer[1]);
|
_strip(&buffer[1], end - &buffer[1]);
|
||||||
|
|
||||||
/* close off old section and add start new one */
|
rte_cfgfile_add_section(cfg, &buffer[1]);
|
||||||
if (curr_section >= 0)
|
|
||||||
cfg->sections[curr_section].num_entries =
|
|
||||||
curr_entry + 1;
|
|
||||||
curr_section++;
|
|
||||||
|
|
||||||
/* resize overall struct if we don't have room for more
|
|
||||||
sections */
|
|
||||||
if (curr_section == allocated_sections) {
|
|
||||||
allocated_sections += CFG_ALLOC_SECTION_BATCH;
|
|
||||||
struct rte_cfgfile *n_cfg = realloc(cfg,
|
|
||||||
sizeof(*cfg) + sizeof(cfg->sections[0])
|
|
||||||
* allocated_sections);
|
|
||||||
if (n_cfg == NULL) {
|
|
||||||
curr_section--;
|
|
||||||
printf("Error - no more memory\n");
|
|
||||||
goto error1;
|
|
||||||
}
|
|
||||||
cfg = n_cfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate space for new section */
|
|
||||||
allocated_entries = CFG_ALLOC_ENTRY_BATCH;
|
|
||||||
curr_entry = -1;
|
|
||||||
cfg->sections = malloc(
|
|
||||||
sizeof(cfg->sections[0]) +
|
|
||||||
sizeof(cfg->sections[0].entries) *
|
|
||||||
allocated_entries);
|
|
||||||
if (cfg->sections == NULL) {
|
|
||||||
printf("Error - no more memory\n");
|
|
||||||
goto error1;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(cfg->sections[curr_section].name,
|
|
||||||
sizeof(cfg->sections[0].name),
|
|
||||||
"%s", &buffer[1]);
|
|
||||||
} else {
|
} else {
|
||||||
/* value line */
|
/* key and value line */
|
||||||
if (curr_section < 0) {
|
|
||||||
printf("Error line %d - value outside of"
|
|
||||||
"section\n", lineno);
|
|
||||||
goto error1;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct rte_cfgfile_section *sect = cfg->sections;
|
|
||||||
|
|
||||||
char *split[2] = {NULL};
|
char *split[2] = {NULL};
|
||||||
|
|
||||||
split[0] = buffer;
|
split[0] = buffer;
|
||||||
split[1] = memchr(buffer, '=', len);
|
split[1] = memchr(buffer, '=', len);
|
||||||
|
|
||||||
/* when delimeter not found */
|
|
||||||
if (split[1] == NULL) {
|
|
||||||
printf("Error at line %d - cannot "
|
|
||||||
"split string\n", lineno);
|
|
||||||
goto error1;
|
|
||||||
} else {
|
|
||||||
/* when delimeter found */
|
|
||||||
*split[1] = '\0';
|
*split[1] = '\0';
|
||||||
split[1]++;
|
split[1]++;
|
||||||
|
|
||||||
|
_strip(split[0], strlen(split[0]));
|
||||||
|
_strip(split[1], strlen(split[1]));
|
||||||
|
char *end = memchr(split[1], '\\', strlen(split[1]));
|
||||||
|
|
||||||
|
while (end != NULL) {
|
||||||
|
if (*(end+1) == params->comment_character) {
|
||||||
|
*end = '\0';
|
||||||
|
strcat(split[1], end+1);
|
||||||
|
} else
|
||||||
|
end++;
|
||||||
|
end = memchr(end, '\\', strlen(end));
|
||||||
|
}
|
||||||
|
|
||||||
if (!(flags & CFG_FLAG_EMPTY_VALUES) &&
|
if (!(flags & CFG_FLAG_EMPTY_VALUES) &&
|
||||||
(*split[1] == '\0')) {
|
(*split[1] == '\0')) {
|
||||||
printf("Error at line %d - cannot "
|
printf("Error at line %d - cannot use empty "
|
||||||
"split string\n", lineno);
|
"values\n", lineno);
|
||||||
goto error1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
curr_entry++;
|
|
||||||
if (curr_entry == allocated_entries) {
|
|
||||||
allocated_entries += CFG_ALLOC_ENTRY_BATCH;
|
|
||||||
struct rte_cfgfile_section *n_sect = realloc(
|
|
||||||
sect, sizeof(*sect) +
|
|
||||||
sizeof(sect->entries[0]) *
|
|
||||||
allocated_entries);
|
|
||||||
if (n_sect == NULL) {
|
|
||||||
curr_entry--;
|
|
||||||
printf("Error - no more memory\n");
|
|
||||||
goto error1;
|
|
||||||
}
|
|
||||||
sect = cfg->sections = n_sect;
|
|
||||||
}
|
|
||||||
|
|
||||||
sect->entries = malloc(
|
|
||||||
sizeof(sect->entries[0]));
|
|
||||||
if (sect->entries == NULL) {
|
|
||||||
printf("Error - no more memory\n");
|
|
||||||
goto error1;
|
goto error1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct rte_cfgfile_entry *entry = sect->entries;
|
if (cfg->num_sections == 0)
|
||||||
snprintf(entry->name, sizeof(entry->name), "%s",
|
goto error1;
|
||||||
split[0]);
|
|
||||||
snprintf(entry->value, sizeof(entry->value), "%s",
|
_add_entry(&cfg->sections[cfg->num_sections - 1],
|
||||||
split[1] ? split[1] : "");
|
split[0], (split[1] ? split[1] : ""));
|
||||||
_strip(entry->name, strnlen(entry->name,
|
|
||||||
sizeof(entry->name)));
|
|
||||||
_strip(entry->value, strnlen(entry->value,
|
|
||||||
sizeof(entry->value)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
cfg->flags = flags;
|
|
||||||
cfg->num_sections = curr_section + 1;
|
|
||||||
/* curr_section will still be -1 if we have an empty file */
|
|
||||||
if (curr_section >= 0)
|
|
||||||
cfg->sections[curr_section].num_entries = curr_entry + 1;
|
|
||||||
return cfg;
|
return cfg;
|
||||||
|
|
||||||
error1:
|
error1:
|
||||||
cfg->num_sections = curr_section + 1;
|
|
||||||
if (curr_section >= 0)
|
|
||||||
cfg->sections[curr_section].num_entries = curr_entry + 1;
|
|
||||||
rte_cfgfile_close(cfg);
|
rte_cfgfile_close(cfg);
|
||||||
error2:
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user