[v10,04/27] kvargs: introduce a more flexible parsing function
Checks
Commit Message
This function permits defining additional terminating characters,
ending the parsing to arbitrary delimiters.
Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
lib/Makefile | 1 +
lib/librte_kvargs/meson.build | 2 ++
lib/librte_kvargs/rte_kvargs.c | 25 ++++++++++++++++++++
lib/librte_kvargs/rte_kvargs.h | 30 ++++++++++++++++++++++++
lib/librte_kvargs/rte_kvargs_version.map | 7 ++++++
5 files changed, 65 insertions(+)
Comments
05/07/2018 13:48, Gaetan Rivet:
> This function permits defining additional terminating characters,
> ending the parsing to arbitrary delimiters.
[...]
> +__rte_experimental
> +struct rte_kvargs *rte_kvargs_parse2(const char *args,
> + const char *const valid_keys[],
> + const char *valid_ends);
The name is not ideal but I don't have a better idea.
Acked-by: Thomas Monjalon <thomas@monjalon.net>
On Friday 06 July 2018 03:30 AM, Thomas Monjalon wrote:
> 05/07/2018 13:48, Gaetan Rivet:
>> This function permits defining additional terminating characters,
>> ending the parsing to arbitrary delimiters.
> [...]
>> +__rte_experimental
>> +struct rte_kvargs *rte_kvargs_parse2(const char *args,
>> + const char *const valid_keys[],
>> + const char *valid_ends);
>
> The name is not ideal but I don't have a better idea.
>
Does 'rte_kvargs_parse_delim()' seem any better?
Or, a more obvious one 'rte_kvargs_parse_with_delim()'.
[...]
As I am already late in commenting on this, I am OK changing this later
as well (using the 'experimental' blanket) when a better suggestion
comes along. So, from me as well:
Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
@@ -5,6 +5,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
DIRS-y += librte_compat
DIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += librte_kvargs
+DEPDIRS-librte_kvargs := librte_compat
DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
DIRS-$(CONFIG_RTE_LIBRTE_PCI) += librte_pci
DEPDIRS-librte_pci := librte_eal
@@ -7,3 +7,5 @@ includes += include_directories('../../../lib/librte_eal/common/include')
version = 1
sources = files('rte_kvargs.c')
headers = files('rte_kvargs.h')
+
+deps += 'compat'
@@ -168,3 +168,28 @@ rte_kvargs_parse(const char *args, const char * const valid_keys[])
return kvlist;
}
+
+__rte_experimental
+struct rte_kvargs *
+rte_kvargs_parse2(const char *args, const char * const valid_keys[],
+ const char *valid_ends)
+{
+ struct rte_kvargs *kvlist = NULL;
+ char *copy;
+ size_t len;
+
+ if (valid_ends == NULL)
+ return rte_kvargs_parse(args, valid_keys);
+
+ copy = strdup(args);
+ if (copy == NULL)
+ return NULL;
+
+ len = strcspn(copy, valid_ends);
+ copy[len] = '\0';
+
+ kvlist = rte_kvargs_parse(copy, valid_keys);
+
+ free(copy);
+ return kvlist;
+}
@@ -71,6 +71,36 @@ struct rte_kvargs {
struct rte_kvargs *rte_kvargs_parse(const char *args,
const char *const valid_keys[]);
+/**
+ * Allocate a rte_kvargs and store key/value associations from a string.
+ * This version will consider any byte from valid_ends as a possible
+ * terminating character, and will not parse beyond any of their occurrence.
+ *
+ * The function allocates and fills an rte_kvargs structure from a given
+ * string whose format is key1=value1,key2=value2,...
+ *
+ * The structure can be freed with rte_kvargs_free().
+ *
+ * @param args
+ * The input string containing the key/value associations
+ *
+ * @param valid_keys
+ * A list of valid keys (table of const char *, the last must be NULL).
+ * This argument is ignored if NULL
+ *
+ * @param valid_ends
+ * Acceptable terminating characters.
+ * If NULL, the behavior is the same as ``rte_kvargs_parse``.
+ *
+ * @return
+ * - A pointer to an allocated rte_kvargs structure on success
+ * - NULL on error
+ */
+__rte_experimental
+struct rte_kvargs *rte_kvargs_parse2(const char *args,
+ const char *const valid_keys[],
+ const char *valid_ends);
+
/**
* Free a rte_kvargs structure
*
@@ -8,3 +8,10 @@ DPDK_2.0 {
local: *;
};
+
+EXPERIMENTAL {
+ global:
+
+ rte_kvargs_parse2;
+
+} DPDK_2.0;