From patchwork Mon Jul 10 12:44:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacek Piasecki X-Patchwork-Id: 26730 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 2D2E87CAB; Mon, 10 Jul 2017 14:59:27 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id B258B5A6A for ; Mon, 10 Jul 2017 14:59:24 +0200 (CEST) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga105.jf.intel.com with ESMTP; 10 Jul 2017 05:59:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.40,340,1496127600"; d="scan'208"; a="1149983505" Received: from gklab-246-073.igk.intel.com (HELO Sent) ([10.217.246.73]) by orsmga001.jf.intel.com with SMTP; 10 Jul 2017 05:59:20 -0700 Received: by Sent (sSMTP sendmail emulation); Mon, 10 Jul 2017 14:57:40 +0200 From: Jacek Piasecki To: dev@dpdk.org Cc: bruce.richardson@intel.com, deepak.k.jain@intel.com, kubax.kozak@intel.com, michalx.k.jastrzebski@intel.com, Jacek Piasecki Date: Mon, 10 Jul 2017 14:44:14 +0200 Message-Id: <1499690657-81150-3-git-send-email-jacekx.piasecki@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1499690657-81150-1-git-send-email-jacekx.piasecki@intel.com> References: <1498560760-104196-2-git-send-email-jacekx.piasecki@intel.com> <1499690657-81150-1-git-send-email-jacekx.piasecki@intel.com> Subject: [dpdk-dev] [PATCH v4 2/5] cfgfile: change existing API functions X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Change to flat arrays in cfgfile struct force slightly diffrent data access for most of cfgfile functions. This patch provides necessary changes in existing API. Signed-off-by: Jacek Piasecki Acked-by: Bruce Richardon --- lib/librte_cfgfile/rte_cfgfile.c | 120 +++++++++++++++++++-------------------- lib/librte_cfgfile/rte_cfgfile.h | 6 +- 2 files changed, 62 insertions(+), 64 deletions(-) diff --git a/lib/librte_cfgfile/rte_cfgfile.c b/lib/librte_cfgfile/rte_cfgfile.c index c6ae3e3..50fe37a 100644 --- a/lib/librte_cfgfile/rte_cfgfile.c +++ b/lib/librte_cfgfile/rte_cfgfile.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "rte_cfgfile.h" @@ -42,13 +43,15 @@ struct rte_cfgfile_section { char name[CFG_NAME_LEN]; int num_entries; - struct rte_cfgfile_entry *entries[0]; + int allocated_entries; + struct rte_cfgfile_entry *entries; }; struct rte_cfgfile { int flags; int num_sections; - struct rte_cfgfile_section *sections[0]; + int allocated_sections; + struct rte_cfgfile_section *sections; }; /** when we resize a file structure, how many extra entries @@ -104,6 +107,19 @@ _strip(char *str, unsigned len) return newlen; } +static struct rte_cfgfile_section * +_get_section(struct rte_cfgfile *cfg, const char *sectionname) +{ + int i; + + for (i = 0; i < cfg->num_sections; i++) { + if (strncmp(cfg->sections[i].name, sectionname, + sizeof(cfg->sections[0].name)) == 0) + return &cfg->sections[i]; + } + return NULL; +} + static int rte_cfgfile_check_params(const struct rte_cfgfile_parameters *params) { @@ -168,17 +184,17 @@ rte_cfgfile_load_with_params(const char *filename, int flags, if (flags & CFG_FLAG_GLOBAL_SECTION) { curr_section = 0; allocated_entries = CFG_ALLOC_ENTRY_BATCH; - cfg->sections[curr_section] = malloc( - sizeof(*cfg->sections[0]) + - sizeof(cfg->sections[0]->entries[0]) * + cfg->sections = malloc( + sizeof(cfg->sections[0]) + + sizeof(cfg->sections[0].entries) * allocated_entries); - if (cfg->sections[curr_section] == NULL) { + 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"); + snprintf(cfg->sections[curr_section].name, + sizeof(cfg->sections[0].name), "GLOBAL"); } while (fgets(buffer, sizeof(buffer), f) != NULL) { @@ -213,7 +229,7 @@ rte_cfgfile_load_with_params(const char *filename, int flags, /* close off old section and add start new one */ if (curr_section >= 0) - cfg->sections[curr_section]->num_entries = + cfg->sections[curr_section].num_entries = curr_entry + 1; curr_section++; @@ -235,17 +251,17 @@ rte_cfgfile_load_with_params(const char *filename, int flags, /* 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]) * + cfg->sections = malloc( + sizeof(cfg->sections[0]) + + sizeof(cfg->sections[0].entries) * allocated_entries); - if (cfg->sections[curr_section] == NULL) { + if (cfg->sections == NULL) { printf("Error - no more memory\n"); goto error1; } - snprintf(cfg->sections[curr_section]->name, - sizeof(cfg->sections[0]->name), + snprintf(cfg->sections[curr_section].name, + sizeof(cfg->sections[0].name), "%s", &buffer[1]); } else { /* value line */ @@ -255,8 +271,7 @@ rte_cfgfile_load_with_params(const char *filename, int flags, goto error1; } - struct rte_cfgfile_section *sect = - cfg->sections[curr_section]; + struct rte_cfgfile_section *sect = cfg->sections; char *split[2] = {NULL}; split[0] = buffer; @@ -292,18 +307,17 @@ rte_cfgfile_load_with_params(const char *filename, int flags, printf("Error - no more memory\n"); goto error1; } - sect = cfg->sections[curr_section] = n_sect; + sect = cfg->sections = n_sect; } - sect->entries[curr_entry] = malloc( - sizeof(*sect->entries[0])); - if (sect->entries[curr_entry] == NULL) { + sect->entries = malloc( + sizeof(sect->entries[0])); + if (sect->entries == NULL) { printf("Error - no more memory\n"); goto error1; } - struct rte_cfgfile_entry *entry = sect->entries[ - curr_entry]; + struct rte_cfgfile_entry *entry = sect->entries; snprintf(entry->name, sizeof(entry->name), "%s", split[0]); snprintf(entry->value, sizeof(entry->value), "%s", @@ -319,42 +333,38 @@ rte_cfgfile_load_with_params(const char *filename, int 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; + cfg->sections[curr_section].num_entries = curr_entry + 1; return cfg; error1: cfg->num_sections = curr_section + 1; if (curr_section >= 0) - cfg->sections[curr_section]->num_entries = curr_entry + 1; + cfg->sections[curr_section].num_entries = curr_entry + 1; rte_cfgfile_close(cfg); error2: fclose(f); return NULL; } - int rte_cfgfile_close(struct rte_cfgfile *cfg) { - int i, j; + int i; if (cfg == NULL) return -1; - for (i = 0; i < cfg->num_sections; i++) { - if (cfg->sections[i] != NULL) { - if (cfg->sections[i]->num_entries) { - for (j = 0; j < cfg->sections[i]->num_entries; - j++) { - if (cfg->sections[i]->entries[j] != - NULL) - free(cfg->sections[i]-> - entries[j]); - } + if (cfg->sections != NULL) { + for (i = 0; i < cfg->allocated_sections; i++) { + if (cfg->sections[i].entries != NULL) { + free(cfg->sections[i].entries); + cfg->sections[i].entries = NULL; } - free(cfg->sections[i]); } + free(cfg->sections); + cfg->sections = NULL; } free(cfg); + cfg = NULL; return 0; } @@ -366,7 +376,7 @@ size_t length) int i; int num_sections = 0; for (i = 0; i < cfg->num_sections; i++) { - if (strncmp(cfg->sections[i]->name, sectionname, length) == 0) + if (strncmp(cfg->sections[i].name, sectionname, length) == 0) num_sections++; } return num_sections; @@ -380,23 +390,11 @@ rte_cfgfile_sections(struct rte_cfgfile *cfg, char *sections[], for (i = 0; i < cfg->num_sections && i < max_sections; i++) snprintf(sections[i], CFG_NAME_LEN, "%s", - cfg->sections[i]->name); + cfg->sections[i].name); return i; } -static const struct rte_cfgfile_section * -_get_section(struct rte_cfgfile *cfg, const char *sectionname) -{ - int i; - for (i = 0; i < cfg->num_sections; i++) { - if (strncmp(cfg->sections[i]->name, sectionname, - sizeof(cfg->sections[0]->name)) == 0) - return cfg->sections[i]; - } - return NULL; -} - int rte_cfgfile_has_section(struct rte_cfgfile *cfg, const char *sectionname) { @@ -409,7 +407,7 @@ rte_cfgfile_section_num_entries(struct rte_cfgfile *cfg, { const struct rte_cfgfile_section *s = _get_section(cfg, sectionname); if (s == NULL) - return -1; + return -EINVAL; return s->num_entries; } @@ -421,9 +419,9 @@ rte_cfgfile_section_entries(struct rte_cfgfile *cfg, const char *sectionname, int i; const struct rte_cfgfile_section *sect = _get_section(cfg, sectionname); if (sect == NULL) - return -1; + return -EINVAL; for (i = 0; i < max_entries && i < sect->num_entries; i++) - entries[i] = *sect->entries[i]; + entries[i] = sect->entries[i]; return i; } @@ -436,12 +434,12 @@ rte_cfgfile_section_entries_by_index(struct rte_cfgfile *cfg, int index, const struct rte_cfgfile_section *sect; if (index < 0 || index >= cfg->num_sections) - return -1; + return -EINVAL; - sect = cfg->sections[index]; + sect = &cfg->sections[index]; snprintf(sectionname, CFG_NAME_LEN, "%s", sect->name); for (i = 0; i < max_entries && i < sect->num_entries; i++) - entries[i] = *sect->entries[i]; + entries[i] = sect->entries[i]; return i; } @@ -454,9 +452,9 @@ rte_cfgfile_get_entry(struct rte_cfgfile *cfg, const char *sectionname, if (sect == NULL) return NULL; for (i = 0; i < sect->num_entries; i++) - if (strncmp(sect->entries[i]->name, entryname, CFG_NAME_LEN) - == 0) - return sect->entries[i]->value; + if (strncmp(sect->entries[i].name, entryname, CFG_NAME_LEN) + == 0) + return sect->entries[i].value; return NULL; } diff --git a/lib/librte_cfgfile/rte_cfgfile.h b/lib/librte_cfgfile/rte_cfgfile.h index fa10d40..4702110 100644 --- a/lib/librte_cfgfile/rte_cfgfile.h +++ b/lib/librte_cfgfile/rte_cfgfile.h @@ -178,7 +178,7 @@ int rte_cfgfile_has_section(struct rte_cfgfile *cfg, const char *sectionname); * @param sectionname * Section name * @return -* Number of entries in section on success, -1 otherwise +* Number of entries in section on success, -EINVAL otherwise */ int rte_cfgfile_section_num_entries(struct rte_cfgfile *cfg, const char *sectionname); @@ -199,7 +199,7 @@ int rte_cfgfile_section_num_entries(struct rte_cfgfile *cfg, * @param max_entries * Maximum number of section entries to be stored in entries array * @return -* Number of entries populated on success, -1 otherwise +* Number of entries populated on success, -EINVAL otherwise */ int rte_cfgfile_section_entries(struct rte_cfgfile *cfg, const char *sectionname, @@ -226,7 +226,7 @@ int rte_cfgfile_section_entries(struct rte_cfgfile *cfg, * @param max_entries * Maximum number of section entries to be stored in entries array * @return -* Number of entries populated on success, -1 otherwise +* Number of entries populated on success, -EINVAL otherwise */ int rte_cfgfile_section_entries_by_index(struct rte_cfgfile *cfg, int index,