X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_kvargs%2Frte_kvargs.c;h=854ac83f513543dc1d191b7c41a32ed1063c2d2b;hb=21f6411c893111507b0b8a1cc86aa15f9fb3da3d;hp=f3689564d82aa73b2540bae598ea237c6a5da289;hpb=ef8e5447e3a63dd2a0fc025a143aa7bd83d0e602;p=dpdk.git diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index f3689564d8..854ac83f51 100644 --- a/lib/librte_kvargs/rte_kvargs.c +++ b/lib/librte_kvargs/rte_kvargs.c @@ -32,8 +32,6 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include -#include -#include #include #include @@ -41,38 +39,6 @@ #include "rte_kvargs.h" -/* - * Add a key-value pair at the end of a given key/value list. - * Return an error if the list is full or if the key is duplicated. - */ -static int -rte_kvargs_add_pair(struct rte_kvargs *kvlist, char *key, char *val) -{ - unsigned i; - struct rte_kvargs_pair* entry; - - /* is the list full? */ - if (kvlist->count >= RTE_KVARGS_MAX) { - RTE_LOG(ERR, PMD, "Couldn't add %s, key/value list is full\n", key); - return -1; - } - - /* Check if the key is duplicated */ - for (i = 0; i < kvlist->count; i++) { - entry = &kvlist->pairs[i]; - if (strcmp(entry->key, key) == 0) { - RTE_LOG(ERR, PMD, "Couldn't add %s, duplicated key\n", key); - return -1; - } - } - - entry = &kvlist->pairs[kvlist->count]; - entry->key = key; - entry->value = val; - kvlist->count++; - return 0; -} - /* * Receive a string with a list of arguments following the pattern * key=value;key=value;... and insert them into the list. @@ -81,15 +47,10 @@ rte_kvargs_add_pair(struct rte_kvargs *kvlist, char *key, char *val) static int rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *params) { - unsigned i, count; - char *pairs[RTE_KVARGS_MAX]; - char *pair[2]; - - /* If params are empty, nothing to do */ - if (params == NULL || params[0] == 0) { - RTE_LOG(ERR, PMD, "Cannot parse empty arguments\n"); - return -1; - } + unsigned i; + char *str; + char *ctx1 = NULL; + char *ctx2 = NULL; /* Copy the const char *params to a modifiable string * to pass to rte_strsplit @@ -100,27 +61,29 @@ rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *params) return -1; } - count = rte_strsplit(kvlist->str, strnlen(kvlist->str, MAX_ARG_STRLEN), pairs, - RTE_KVARGS_MAX, RTE_KVARGS_PAIRS_DELIM); + /* browse each key/value pair and add it in kvlist */ + str = kvlist->str; + while ((str = strtok_r(str, RTE_KVARGS_PAIRS_DELIM, &ctx1)) != NULL) { - for (i = 0; i < count; i++) { - pair[0] = NULL; - pair[1] = NULL; - - rte_strsplit(pairs[i], strnlen(pairs[i], MAX_ARG_STRLEN), pair, 2, - RTE_KVARGS_KV_DELIM); + i = kvlist->count; + if (i >= RTE_KVARGS_MAX) { + RTE_LOG(ERR, PMD, "Cannot parse arguments: list full\n"); + return -1; + } - if (pair[0] == NULL || pair[1] == NULL || pair[0][0] == 0 - || pair[1][0] == 0) { + kvlist->pairs[i].key = strtok_r(str, RTE_KVARGS_KV_DELIM, &ctx2); + kvlist->pairs[i].value = strtok_r(NULL, RTE_KVARGS_KV_DELIM, &ctx2); + if (kvlist->pairs[i].key == NULL || kvlist->pairs[i].value == NULL) { RTE_LOG(ERR, PMD, "Cannot parse arguments: wrong key or value\n" "params=<%s>\n", params); return -1; } - if (rte_kvargs_add_pair(kvlist, pair[0], pair[1]) < 0) - return -1; + kvlist->count++; + str = NULL; } + return 0; } @@ -129,13 +92,14 @@ rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *params) * into a list of valid keys. */ static int -is_valid_key(const char *valid[], const char *key_match) +is_valid_key(const char * const valid[], const char *key_match) { - const char **valid_ptr; + const char * const *valid_ptr; - for (valid_ptr = valid; *valid_ptr != NULL; valid_ptr++) - if (strstr(key_match, *valid_ptr) != NULL) + for (valid_ptr = valid; *valid_ptr != NULL; valid_ptr++) { + if (strcmp(key_match, *valid_ptr) == 0) return 1; + } return 0; } @@ -145,7 +109,7 @@ is_valid_key(const char *valid[], const char *key_match) */ static int check_for_valid_keys(struct rte_kvargs *kvlist, - const char *valid[]) + const char * const valid[]) { unsigned i, ret; struct rte_kvargs_pair *pair; @@ -177,7 +141,7 @@ rte_kvargs_count(const struct rte_kvargs *kvlist, const char *key_match) ret = 0; for (i = 0; i < kvlist->count; i++) { pair = &kvlist->pairs[i]; - if (strcmp(pair->key, key_match) == 0) + if (key_match == NULL || strcmp(pair->key, key_match) == 0) ret++; } @@ -198,8 +162,8 @@ rte_kvargs_process(const struct rte_kvargs *kvlist, for (i = 0; i < kvlist->count; i++) { pair = &kvlist->pairs[i]; - if (strstr(pair->key, key_match) != NULL) { - if ((*handler)(pair->value, opaque_arg) < 0) + if (key_match == NULL || strcmp(pair->key, key_match) == 0) { + if ((*handler)(pair->key, pair->value, opaque_arg) < 0) return -1; } } @@ -210,8 +174,10 @@ rte_kvargs_process(const struct rte_kvargs *kvlist, void rte_kvargs_free(struct rte_kvargs *kvlist) { - if (kvlist->str != NULL) - free(kvlist->str); + if (!kvlist) + return; + + free(kvlist->str); free(kvlist); } @@ -221,7 +187,7 @@ rte_kvargs_free(struct rte_kvargs *kvlist) * check if only valid keys were used. */ struct rte_kvargs * -rte_kvargs_parse(const char *args, const char *valid_keys[]) +rte_kvargs_parse(const char *args, const char * const valid_keys[]) { struct rte_kvargs *kvlist;