All of lore.kernel.org
 help / color / mirror / Atom feed
From: Allain Legacy <allain.legacy@windriver.com>
To: <cristian.dumitrescu@intel.com>, <bruce.richardson@intel.com>
Cc: <dev@dpdk.org>, <yuanhan.liu@linux.intel.com>,
	<thomas.monjalon@6wind.com>
Subject: [PATCH v3 6/6] cfgfile: add support for empty value string
Date: Tue, 28 Mar 2017 12:44:31 -0400	[thread overview]
Message-ID: <20170328164431.12475-7-allain.legacy@windriver.com> (raw)
In-Reply-To: <20170328164431.12475-1-allain.legacy@windriver.com>

This commit adds support to the cfgfile library for parsing a key=value
line that has no value string specified (e.g., "key=").  This can be used
to override a configuration attribute that has a default value or default
list of values to set it back to an undefined value to disable
functionality.

Signed-off-by: Allain Legacy <allain.legacy@windriver.com>
---
 lib/librte_cfgfile/rte_cfgfile.c                | 23 ++++++++++++------
 lib/librte_cfgfile/rte_cfgfile.h                |  6 +++++
 test/test/test_cfgfile.c                        | 32 +++++++++++++++++++++++++
 test/test/test_cfgfiles/etc/empty_key_value.ini |  2 +-
 4 files changed, 55 insertions(+), 8 deletions(-)

diff --git a/lib/librte_cfgfile/rte_cfgfile.c b/lib/librte_cfgfile/rte_cfgfile.c
index 4ef7decb3..b54a523d2 100644
--- a/lib/librte_cfgfile/rte_cfgfile.c
+++ b/lib/librte_cfgfile/rte_cfgfile.c
@@ -258,12 +258,21 @@ rte_cfgfile_load_with_params(const char *filename, int flags,
 
 			struct rte_cfgfile_section *sect =
 				cfg->sections[curr_section];
-			char *split[2];
-			if (rte_strsplit(buffer, sizeof(buffer), split, 2, '=')
-				!= 2) {
-				printf("Error at line %d - cannot split "
-					"string\n", lineno);
-				goto error1;
+			int n;
+			char *split[2] = {NULL};
+			n = rte_strsplit(buffer, sizeof(buffer), split, 2, '=');
+			if (flags & CFG_FLAG_EMPTY_VALUES) {
+				if ((n < 1) || (n > 2)) {
+					printf("Error at line %d - cannot split string, n=%d\n",
+					       lineno, n);
+					goto error1;
+				}
+			} else {
+				if (n != 2) {
+					printf("Error at line %d - cannot split string, n=%d\n",
+					       lineno, n);
+					goto error1;
+				}
 			}
 
 			curr_entry++;
@@ -293,7 +302,7 @@ rte_cfgfile_load_with_params(const char *filename, int flags,
 			snprintf(entry->name, sizeof(entry->name), "%s",
 				split[0]);
 			snprintf(entry->value, sizeof(entry->value), "%s",
-				split[1]);
+				 split[1] ? split[1] : "");
 			_strip(entry->name, strnlen(entry->name,
 				sizeof(entry->name)));
 			_strip(entry->value, strnlen(entry->value,
diff --git a/lib/librte_cfgfile/rte_cfgfile.h b/lib/librte_cfgfile/rte_cfgfile.h
index a7cd3944e..b06f55d56 100644
--- a/lib/librte_cfgfile/rte_cfgfile.h
+++ b/lib/librte_cfgfile/rte_cfgfile.h
@@ -78,6 +78,12 @@ struct rte_cfgfile_parameters {
  * section.  These entries can be accessed in the "GLOBAL" section.
  */
 #define CFG_FLAG_GLOBAL_SECTION (1 << 0)
+
+/**
+ * Indicates that file supports key value entries where the value can be zero
+ * length (e.g., "key=").
+ */
+#define CFG_FLAG_EMPTY_VALUES (1 << 1)
 /**@} */
 
 /** Defines the default comment character used for parsing config files. */
diff --git a/test/test/test_cfgfile.c b/test/test/test_cfgfile.c
index 0478de59e..4559f8688 100644
--- a/test/test/test_cfgfile.c
+++ b/test/test/test_cfgfile.c
@@ -193,6 +193,35 @@ test_cfgfile_invalid_key_value_pair(void)
 }
 
 static int
+test_cfgfile_empty_key_value_pair(void)
+{
+	struct rte_cfgfile *cfgfile;
+	const char *value;
+	int ret;
+
+	cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/empty_key_value.ini",
+				   CFG_FLAG_EMPTY_VALUES);
+	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse empty_key_value.ini");
+
+	ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
+	TEST_ASSERT(ret == 1, "Unexpected number of sections: %d", ret);
+
+	ret = rte_cfgfile_has_section(cfgfile, "section1");
+	TEST_ASSERT(ret, "section1 missing");
+
+	ret = rte_cfgfile_section_num_entries(cfgfile, "section1");
+	TEST_ASSERT(ret == 1, "section1 unexpected number of entries: %d", ret);
+
+	value = rte_cfgfile_get_entry(cfgfile, "section1", "key");
+	TEST_ASSERT(strlen(value) == 0, "key unexpected value: %s", value);
+
+	ret = rte_cfgfile_close(cfgfile);
+	TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
+
+	return 0;
+}
+
+static int
 test_cfgfile_missing_section(void)
 {
 	struct rte_cfgfile *cfgfile;
@@ -272,6 +301,9 @@ test_cfgfile(void)
 	if (test_cfgfile_invalid_key_value_pair())
 		return -1;
 
+	if (test_cfgfile_empty_key_value_pair())
+		return -1;
+
 	if (test_cfgfile_missing_section())
 		return -1;
 
diff --git a/test/test/test_cfgfiles/etc/empty_key_value.ini b/test/test/test_cfgfiles/etc/empty_key_value.ini
index 8f203ce3e..53284467b 100644
--- a/test/test/test_cfgfiles/etc/empty_key_value.ini
+++ b/test/test/test_cfgfiles/etc/empty_key_value.ini
@@ -1,3 +1,3 @@
 [section1]
 ; this is section 1
-invalid=
+key=
-- 
2.12.1

  parent reply	other threads:[~2017-03-28 16:45 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-02 19:29 [PATCH 0/5] librte_cfgfile enhancement Allain Legacy
2017-03-02 19:29 ` [PATCH 1/5] cfgfile: configurable comment character Allain Legacy
2017-03-02 21:10   ` Bruce Richardson
2017-03-02 21:22     ` Legacy, Allain
2017-03-03  0:53     ` Yuanhan Liu
2017-03-03 11:17       ` Dumitrescu, Cristian
2017-03-03 11:31         ` Legacy, Allain
2017-03-03 12:07           ` Dumitrescu, Cristian
2017-03-03 12:14             ` Legacy, Allain
2017-03-03 12:17               ` Dumitrescu, Cristian
2017-03-03 12:18                 ` Legacy, Allain
2017-03-03 12:52                   ` Dumitrescu, Cristian
2017-03-03 12:10           ` Bruce Richardson
2017-03-03 12:17             ` Legacy, Allain
2017-03-03 13:10               ` Bruce Richardson
2017-03-02 19:29 ` [PATCH 2/5] cfgfile: cfg object not initialized after allocation Allain Legacy
2017-03-02 19:29 ` [PATCH 3/5] cfgfile: add support for unamed global section Allain Legacy
2017-03-03 10:53   ` Dumitrescu, Cristian
2017-03-03 11:03     ` Legacy, Allain
2017-03-03 11:06       ` Dumitrescu, Cristian
2017-03-03 11:15         ` Legacy, Allain
2017-03-03 11:18           ` Dumitrescu, Cristian
2017-03-02 19:29 ` [PATCH 4/5] cfgfile: use strnlen to constrain memchr search Allain Legacy
2017-03-02 19:29 ` [PATCH 5/5] cfgfile: increase local buffer size for max name and value Allain Legacy
2017-03-09 13:46   ` Wiles, Keith
2017-03-09 15:16     ` Legacy, Allain
2017-03-09 15:23       ` Wiles, Keith
2017-03-09 13:10 ` [PATCH v2 0/6] librte_cfgfile enhancements Allain Legacy
2017-03-09 13:10   ` [PATCH v2 1/6] test: basic unit tests for cfgfile Allain Legacy
2017-03-09 13:10   ` [PATCH v2 2/6] cfgfile: add support for unamed global section Allain Legacy
2017-03-09 13:10   ` [PATCH v2 3/6] cfgfile: configurable comment character Allain Legacy
2017-03-27 11:19     ` Dumitrescu, Cristian
2017-03-09 13:10   ` [PATCH v2 4/6] cfgfile: use strnlen to constrain memchr search Allain Legacy
2017-03-09 13:10   ` [PATCH v2 5/6] cfgfile: increase local buffer size for max name and value Allain Legacy
2017-03-09 13:11   ` [PATCH v2 6/6] cfgfile: add support for empty value string Allain Legacy
2017-03-27 10:54     ` Dumitrescu, Cristian
2017-03-27 11:12       ` Legacy, Allain
2017-03-27 11:24         ` Dumitrescu, Cristian
2017-03-27 11:15       ` Legacy, Allain
2017-03-28  8:29   ` [PATCH v2 0/6] librte_cfgfile enhancements Thomas Monjalon
2017-03-28  9:18     ` Bruce Richardson
2017-03-28  9:22       ` Bruce Richardson
2017-03-28  9:41         ` Thomas Monjalon
2017-03-28  9:58           ` Dumitrescu, Cristian
2017-03-28 10:12             ` Thomas Monjalon
2017-03-28 10:20               ` Dumitrescu, Cristian
2017-03-28 15:24               ` Bruce Richardson
2017-03-28 15:41                 ` Thomas Monjalon
2017-03-28 15:42                   ` Bruce Richardson
2017-03-28 16:44   ` [PATCH v3 " Allain Legacy
2017-03-28 16:44     ` [PATCH v3 1/6] test: basic unit tests for cfgfile Allain Legacy
2017-03-28 16:44     ` [PATCH v3 3/6] cfgfile: add support for configurable comment character Allain Legacy
2017-03-28 16:44     ` [PATCH v3 4/6] cfgfile: use strnlen to constrain memchr search Allain Legacy
2017-03-28 16:44     ` Allain Legacy [this message]
2017-03-30 18:54     ` [PATCH v4 0/6] librte_cfgfile enhancements Allain Legacy
2017-03-30 18:54       ` [PATCH v4 1/6] test: basic unit tests for cfgfile Allain Legacy
2017-03-30 18:54       ` [PATCH v4 2/6] cfgfile: add support for global properties section Allain Legacy
2017-03-30 18:54       ` [PATCH v4 3/6] cfgfile: add support for configurable comment character Allain Legacy
2017-03-31 10:08         ` Thomas Monjalon
2017-03-31 11:08           ` Legacy, Allain
2017-03-30 18:54       ` [PATCH v4 4/6] cfgfile: use strnlen to constrain memchr search Allain Legacy
2017-03-30 18:54       ` [PATCH v4 5/6] cfgfile: increase local buffer size for max name and value Allain Legacy
2017-03-30 18:54       ` [PATCH v4 6/6] cfgfile: add support for empty value string Allain Legacy
2017-03-31  8:57       ` [PATCH v4 0/6] librte_cfgfile enhancements Dumitrescu, Cristian
2017-03-31 13:51       ` [PATCH v5 " Allain Legacy
2017-03-31 13:51         ` [PATCH v5 1/6] test: basic unit tests for cfgfile Allain Legacy
2017-03-31 13:51         ` [PATCH v5 2/6] cfgfile: add support for global properties section Allain Legacy
2017-03-31 13:52         ` [PATCH v5 3/6] cfgfile: add support for configurable comment character Allain Legacy
2017-03-31 13:52         ` [PATCH v5 4/6] cfgfile: use strnlen to constrain memchr search Allain Legacy
2017-03-31 13:52         ` [PATCH v5 5/6] cfgfile: increase local buffer size for max name and value Allain Legacy
2017-03-31 13:52         ` [PATCH v5 6/6] cfgfile: add support for empty value string Allain Legacy
2017-04-04 14:23         ` [PATCH v5 0/6] librte_cfgfile enhancements Thomas Monjalon
     [not found]   ` <20170329004737.44249-1-allain.legacy@windriver.com>
2017-03-29  0:47     ` [PATCH v3 1/6] test: basic unit tests for cfgfile Allain Legacy
2017-03-29  0:47     ` [PATCH v3 3/6] cfgfile: add support for configurable comment character Allain Legacy
2017-03-29  9:22       ` Dumitrescu, Cristian
2017-03-29 11:31         ` Legacy, Allain
2017-03-29  0:47     ` [PATCH v3 5/6] cfgfile: increase local buffer size for max name and value Allain Legacy
     [not found]     ` <20170329004737.44249-7-allain.legacy@windriver.com>
2017-03-29  9:31       ` [PATCH v3 6/6] cfgfile: add support for empty value string Dumitrescu, Cristian
2017-03-29 11:33         ` Legacy, Allain
     [not found]     ` <20170329004737.44249-3-allain.legacy@windriver.com>
2017-03-29  9:33       ` [PATCH v3 2/6] cfgfile: add support for global properties section Dumitrescu, Cristian
2017-03-29 11:35         ` Legacy, Allain

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170328164431.12475-7-allain.legacy@windriver.com \
    --to=allain.legacy@windriver.com \
    --cc=bruce.richardson@intel.com \
    --cc=cristian.dumitrescu@intel.com \
    --cc=dev@dpdk.org \
    --cc=thomas.monjalon@6wind.com \
    --cc=yuanhan.liu@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.