- int allocated_sections = CFG_ALLOC_SECTION_BATCH;
- int allocated_entries = 0;
- int curr_section = -1;
- int curr_entry = -1;
- char buffer[256];
- int lineno = 0;
- struct cfg_file *cfg = NULL;
-
- FILE *f = fopen(filename, "r");
- if (f == NULL)
- return NULL;
-
- cfg = malloc(sizeof(*cfg) + sizeof(cfg->sections[0]) * allocated_sections);
- if (cfg == NULL)
- goto error2;
-
- memset(cfg->sections, 0, sizeof(cfg->sections[0]) * allocated_sections);
-
- while (fgets(buffer, sizeof(buffer), f) != NULL) {
- char *pos = NULL;
- size_t len = strnlen(buffer, sizeof(buffer));
- lineno++;
- if (len >=sizeof(buffer) - 1 && buffer[len-1] != '\n'){
- printf("Error line %d - no \\n found on string. "
- "Check if line too long\n", lineno);
- goto error1;
- }
- if ((pos = memchr(buffer, ';', sizeof(buffer))) != NULL) {
- *pos = '\0';
- len = pos - buffer;
- }
-
- len = _strip(buffer, len);
- if (buffer[0] != '[' && memchr(buffer, '=', len) == NULL)
- continue;
-
- if (buffer[0] == '[') {
- /* section heading line */
- char *end = memchr(buffer, ']', len);
- if (end == NULL) {
- printf("Error line %d - no terminating '[' found\n", lineno);
- goto error1;
- }
- *end = '\0';
- _strip(&buffer[1], end - &buffer[1]);
-
- /* close off old section and add start new one */
- 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 cfg_file *n_cfg = realloc(cfg, sizeof(*cfg) +
- sizeof(cfg->sections[0]) * allocated_sections);
- if (n_cfg == NULL) {
- 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[curr_section] = malloc(sizeof(*cfg->sections[0]) +
- sizeof(cfg->sections[0]->entries[0]) * allocated_entries);
- if (cfg->sections[curr_section] == NULL) {
- printf("Error - no more memory\n");
- goto error1;
- }
-
- rte_snprintf(cfg->sections[curr_section]->name,
- sizeof(cfg->sections[0]->name),
- "%s", &buffer[1]);
- }
- else {
- /* value line */
- if (curr_section < 0) {
- printf("Error line %d - value outside of section\n", lineno);
- goto error1;
- }