* RTE Argument parsing
*
* This module can be used to parse arguments whose format is
- * key1=value1;key2=value2;key3=value3;...
+ * key1=value1,key2=value2,key3=value3,...
+ *
+ * The same key can appear several times with the same or a different
+ * value. Indeed, the arguments are stored as a list of key/values
+ * associations and not as a dictionary.
*
* This file provides some helpers that are especially used by virtual
* ethernet devices at initialization for arguments parsing.
#define RTE_KVARGS_MAX 32
/** separator character used between each pair */
-#define RTE_KVARGS_PAIRS_DELIM ';'
+#define RTE_KVARGS_PAIRS_DELIM ","
/** separator character used between key and value */
-#define RTE_KVARGS_KV_DELIM '='
+#define RTE_KVARGS_KV_DELIM "="
/** Type of callback function used by rte_kvargs_process() */
-typedef int (*arg_handler_t)(char *value, void *opaque);
+typedef int (*arg_handler_t)(const char *key, const char *value, void *opaque);
/** A key/value association */
struct rte_kvargs_pair {
/** Store a list of key/value associations */
struct rte_kvargs {
+ char *str; /**< copy of the argument string */
unsigned count; /**< number of entries in the list */
- size_t size; /**< maximum number of entries */
struct rte_kvargs_pair pairs[RTE_KVARGS_MAX]; /**< list of key/values */
};
/**
- * Initialize an empty rte_kvargs structure
+ * Allocate a rte_kvargs and store key/value associations from a string
*
- * Set the content of the rte_kvargs structure given as a parameter
- * to an empty list of key/value.
+ * The function allocates and fills a rte_kvargs structure from a given
+ * string whose format is key1=value1,key2=value2,...
*
- * @param kvlist
- * The rte_kvargs structure
+ * 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
*
* @return
- * - 0 on success
- * - Negative on error
+ * - A pointer to an allocated rte_kvargs structure on success
+ * - NULL on error
*/
-int rte_kvargs_init(struct rte_kvargs *kvlist);
+struct rte_kvargs *rte_kvargs_parse(const char *args,
+ const char *const valid_keys[]);
/**
- * Append key/value associations in a rte_kvargs structure from a string
+ * Free a rte_kvargs structure
*
- * The function fills a rte_kvargs structure from a string whose format
- * is key1=value1;key2=value2;...
- * The key/value associations are appended to those which are already
- * present in the rte_kvargs structure.
+ * Free a rte_kvargs structure previously allocated with
+ * rte_kvargs_parse().
*
* @param kvlist
* The rte_kvargs structure
- * @param name
- * The name of the driver
- * @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
- *
- * @return
- * - 0 on success
- * - Negative on error
*/
-int rte_kvargs_parse(struct rte_kvargs *kvlist, const char *name,
- const char *args, const char *valid_keys[]);
+void rte_kvargs_free(struct rte_kvargs *kvlist);
/**
* Call a handler function for each key/value matching the key
*
* For each key/value association that matches the given key, calls the
* handler function with the for a given arg_name passing the value on the
- * dictionary for that key and a given extra argument.
+ * dictionary for that key and a given extra argument. If *kvlist* is NULL
+ * function does nothing.
*
* @param kvlist
* The rte_kvargs structure
* @param key_match
- * The key on which the handler should be called
+ * The key on which the handler should be called, or NULL to process handler
+ * on all associations
* @param handler
* The function to call for each matching key
* @param opaque_arg
* @param kvlist
* The rte_kvargs structure
* @param key_match
- * The key that should match
+ * The key that should match, or NULL to count all associations
* @return
* The number of entries