From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <gaetan.rivet@6wind.com>
Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50])
 by dpdk.org (Postfix) with ESMTP id 8A0361B232
 for <dev@dpdk.org>; Thu, 12 Oct 2017 12:46:18 +0200 (CEST)
Received: by mail-wm0-f50.google.com with SMTP id u138so12190446wmu.4
 for <dev@dpdk.org>; Thu, 12 Oct 2017 03:46:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=6wind-com.20150623.gappssmtp.com; s=20150623;
 h=from:to:cc:subject:date:message-id:in-reply-to:references
 :in-reply-to:references;
 bh=6ec+uCBCg6bB59/P2XJrvX/j5Zq1ZlDpR3r4K26woBU=;
 b=bMOAtHKsK5swJRBFaXXuD36pNKOTZrosKUhT4wTmd+s44xGW382ESVhCkQy8rfP5K6
 sjv1SsCrDh1zK513Uw2XWMaRMixbJa/sp5wBT6eC5wPg0jwR5sFMEE6dAEaPd2qOOI21
 donM5lZm0dKNn7MsYZ2aiyUkYJxfbAUjEZzEpZFBv8Pswq7WnIHZ8Xwg3XyHKhoPZF85
 wJo5fSaYrekJgzkILvRjBzVyEGSamEqkLG93rBeqeyrbKjGNBhJlJSd65BOBeLq+l7sa
 cu+vNN16WL9TYgxzCDfkQGPO4RgSo49eQhgqAhrBnN7oWSYjAbVaGIkH1Lxzno4LC83C
 THOw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
 :references:in-reply-to:references;
 bh=6ec+uCBCg6bB59/P2XJrvX/j5Zq1ZlDpR3r4K26woBU=;
 b=TOLMQfy3yaq0gjwg6tMBwORfAejNK7pbJOa752tdgktuh0zQnBQ0nuXXWJWSj07fkQ
 Ae3Byg/T3DsHbLUpBHu0cw+5XMc6vajFudxZsrSTwMFuvGk9AeEWSpina2v8eagFIc9u
 gId/2i7Yi9fyXKvfDOUSB9cZNFTYVOr1oXTS5VrDYItLtw5hp775zcNmREHHhvKA7BZg
 gBogw2LJl+0guRQ7eQDDocGJvrpkGkXTJTpmoArEaavIU1L9usK5ykbFVt/mw+vmzk6n
 OAjxJbkPjdZO2fzr+XyXTlHEdeqsikE/9jNm/YEEpdIWDJb3nq9O8WNlkcHL37VJSfPl
 zilA==
X-Gm-Message-State: AMCzsaU6/X5GkIi2kbcgR6rJdFz8tW1YC3Qr/PIv1SRPz87KtaOOg66T
 VSacRdEPSqCzQHJc9E2Gw5VYzwll
X-Google-Smtp-Source: AOwi7QBYYF+Rv9b/+dQCtu+buAo0zVsY4P67FECxmBB6+Tj8vilGQOAPE63mE8pa439h1uuz4Y7kkA==
X-Received: by 10.223.157.30 with SMTP id k30mr1560846wre.159.1507805177467;
 Thu, 12 Oct 2017 03:46:17 -0700 (PDT)
Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com.
 [62.23.145.78])
 by smtp.gmail.com with ESMTPSA id z192sm16481146wmz.28.2017.10.12.03.46.16
 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
 Thu, 12 Oct 2017 03:46:16 -0700 (PDT)
From: Gaetan Rivet <gaetan.rivet@6wind.com>
To: dev@dpdk.org
Cc: Gaetan Rivet <gaetan.rivet@6wind.com>
Date: Thu, 12 Oct 2017 12:45:38 +0200
Message-Id: <cab5b1a37c7b87da9519aa053834517a8cf6c3fa.1507804944.git.gaetan.rivet@6wind.com>
X-Mailer: git-send-email 2.1.4
In-Reply-To: <cover.1507804944.git.gaetan.rivet@6wind.com>
References: <cover.1507795823.git.gaetan.rivet@6wind.com>
 <cover.1507804944.git.gaetan.rivet@6wind.com>
In-Reply-To: <cover.1507804944.git.gaetan.rivet@6wind.com>
References: <cover.1507804944.git.gaetan.rivet@6wind.com>
Subject: [dpdk-dev] [PATCH v5 11/20] pci: avoid over-complicated macro
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Thu, 12 Oct 2017 10:46:19 -0000

Using a macro helps writing the code to the detriment of the reader in
this case. This is backward. Write once, read many.

The few LOCs gained is not worth the opacity of the implementation.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
 lib/librte_pci/rte_pci.c | 65 ++++++++++++++++++++++++++++++++++--------------
 1 file changed, 46 insertions(+), 19 deletions(-)

diff --git a/lib/librte_pci/rte_pci.c b/lib/librte_pci/rte_pci.c
index 8584b55..cbb5359 100644
--- a/lib/librte_pci/rte_pci.c
+++ b/lib/librte_pci/rte_pci.c
@@ -53,36 +53,63 @@
 
 #include "rte_pci.h"
 
-/* Macro used by pci addr parsing functions. **/
-#define GET_PCIADDR_FIELD(in, fd, lim, dlm)                     \
-do {                                                            \
-	unsigned long val;                                      \
-	char *end;                                              \
-	errno = 0;                                              \
-	val = strtoul((in), &end, 16);                          \
-	if (errno != 0 || end[0] != (dlm) || val > (lim))       \
-		return -EINVAL;                                 \
-	(fd) = (typeof (fd))val;                                \
-	(in) = end + 1;                                         \
-} while(0)
+static inline const char *
+get_u8_pciaddr_field(const char *in, void *_u8, char dlm)
+{
+	unsigned long val;
+	uint8_t *u8 = _u8;
+	char *end;
+
+	errno = 0;
+	val = strtoul(in, &end, 16);
+	if (errno != 0 || end[0] != dlm || val > UINT8_MAX) {
+		errno = errno ? errno : EINVAL;
+		return NULL;
+	}
+	*u8 = (uint8_t)val;
+	return end + 1;
+}
 
 int
 eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr)
 {
+	const char *in = input;
+
 	dev_addr->domain = 0;
-	GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
-	GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
-	GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
+	in = get_u8_pciaddr_field(in, &dev_addr->bus, ':');
+	if (in == NULL)
+		return -EINVAL;
+	in = get_u8_pciaddr_field(in, &dev_addr->devid, '.');
+	if (in == NULL)
+		return -EINVAL;
+	in = get_u8_pciaddr_field(in, &dev_addr->function, '\0');
+	if (in == NULL)
+		return -EINVAL;
 	return 0;
 }
 
 int
 eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr)
 {
-	GET_PCIADDR_FIELD(input, dev_addr->domain, UINT16_MAX, ':');
-	GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
-	GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
-	GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
+	const char *in = input;
+	unsigned long val;
+	char *end;
+
+	errno = 0;
+	val = strtoul(in, &end, 16);
+	if (errno != 0 || end[0] != ':' || val > UINT16_MAX)
+		return -EINVAL;
+	dev_addr->domain = (uint16_t)val;
+	in = end + 1;
+	in = get_u8_pciaddr_field(in, &dev_addr->bus, ':');
+	if (in == NULL)
+		return -EINVAL;
+	in = get_u8_pciaddr_field(in, &dev_addr->devid, '.');
+	if (in == NULL)
+		return -EINVAL;
+	in = get_u8_pciaddr_field(in, &dev_addr->function, '\0');
+	if (in == NULL)
+		return -EINVAL;
 	return 0;
 }
 
-- 
2.1.4