From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wg0-f49.google.com (mail-wg0-f49.google.com [74.125.82.49]) by dpdk.org (Postfix) with ESMTP id D0E7968FC for ; Tue, 28 Jan 2014 17:05:57 +0100 (CET) Received: by mail-wg0-f49.google.com with SMTP id a1so1154382wgh.4 for ; Tue, 28 Jan 2014 08:07:16 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EaGTANHPQHaibvKkr4+5cVVKPCbM2cYn3EHUmBqOe9k=; b=S9VCVr8GTc8jbPwIP4pTh8xHjlAIY9O5lKpSjP7HSvycb6ZnVXu8Ncoasit+C0NnuL v7ds8JTrRtHmCSnq0Bnx8qiITu33HNYHoeFqu928EfNQdj0xVgx4sIvLegzno1cm3WtZ MvIEaS+wEjVFoa/5W0VySmsNV3owE+yyKyY0PpePmjQgu+bdbTctMH6/MURraDRGwCCw +1TfU5S9UaO2/cW8uJ2txsQhHeEmjXx8qM1ZL4TIgpxOJVbeNC53SVtrw63PiBofgapW v4tEHJLd4LF78zlhgp7BPGy9xihe1nXqBRqwEjABt0/+TKHYbk+v3kfacttin9LEd6E1 7kRQ== X-Gm-Message-State: ALoCoQn+8StoT1IbYQQqNdfrignNuv9bbDKOsJnC5jfVZoj6vcE9yk/6rniGlvjD6SNX83e2rv49 X-Received: by 10.194.185.165 with SMTP id fd5mr69562wjc.95.1390925236328; Tue, 28 Jan 2014 08:07:16 -0800 (PST) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id d6sm36407821wic.9.2014.01.28.08.07.14 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Jan 2014 08:07:15 -0800 (PST) From: Olivier Matz To: dev@dpdk.org Date: Tue, 28 Jan 2014 17:06:39 +0100 Message-Id: <1390925204-10800-7-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 1.8.4.rc3 In-Reply-To: <1390925204-10800-1-git-send-email-olivier.matz@6wind.com> References: <1390925204-10800-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH 06/11] kvargs: simpler parsing and allow duplicated keys X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Jan 2014 16:05:58 -0000 Remove the rte_kvargs_add_pair() function whose only role was to check if a key is duplicated. Having duplicated keys is now allowed by kvargs API. Also replace rte_strsplit() by more a standard function strtok_r() that is easier to understand for people already knowing the libc. It also avoids useless calls to strnlen(). The delimiters macros become strings instead of chars due to the strtok_r() API. Signed-off-by: Olivier Matz --- lib/librte_kvargs/rte_kvargs.c | 71 ++++++++++-------------------------------- lib/librte_kvargs/rte_kvargs.h | 8 +++-- 2 files changed, 22 insertions(+), 57 deletions(-) diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index 9c52ce4..6aaa316 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 @@ -42,38 +40,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. * strtok() is used so the params string will be copied to be modified. @@ -81,15 +47,8 @@ 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, *ctx1, *ctx2; /* Copy the const char *params to a modifiable string * to pass to rte_strsplit @@ -100,27 +59,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); - - for (i = 0; i < count; i++) { - pair[0] = NULL; - pair[1] = NULL; + /* browse each key/value pair and add it in kvlist */ + str = kvlist->str; + while ((str = strtok_r(str, RTE_KVARGS_PAIRS_DELIM, &ctx1)) != 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; } diff --git a/lib/librte_kvargs/rte_kvargs.h b/lib/librte_kvargs/rte_kvargs.h index 47d78af..352ae9a 100644 --- a/lib/librte_kvargs/rte_kvargs.h +++ b/lib/librte_kvargs/rte_kvargs.h @@ -42,6 +42,10 @@ * This module can be used to parse arguments whose format is * 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. */ @@ -54,10 +58,10 @@ extern "C" { #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); -- 1.8.4.rc3