From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f169.google.com (mail-wr0-f169.google.com [209.85.128.169]) by dpdk.org (Postfix) with ESMTP id A2B2E1B1B6 for ; Mon, 25 Sep 2017 17:24:40 +0200 (CEST) Received: by mail-wr0-f169.google.com with SMTP id a43so8456745wrc.0 for ; Mon, 25 Sep 2017 08:24:40 -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=HaMY0CanzKJ6UvnuHpP/IjbqD2cnWwtjoDZaTPbTeNeUonABbGIXEFi/edZPtNP3yq ZiIkM4KkfKFEYWwzYaplVdXJduFIvbJpkt3Jx4NBJsA1Ku2tIGQMqnT9hHs011ppyzbS +smPR1SIuMALjKNJSr2p1SepYs6Xqwjvk0Pw+V16QDZaZwbMU/lXYHjrNp1CTLf6iaTC U8u2tQKOgdhjks7075/LryGiSMdVdojCkQG5HprISTQL0QgZuY+i3vrXtEgdC35Mzcs7 3A9kBrHi9SCJK6+UZrQOOwabK91R6zwSVzj8//Yyejki338s2XyH21J6GltdB+uh0ojx h7sw== 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=sySXMy6cPb4qBpTXqdWaYGYKC4xoZLIx5AI0EtlzrSFp8KAJd/c1P+DvhZYAUIyOH8 4WVNrpcIeH0whzyESVPuB52XANXB7Ws4Ihzncar8NK1ZhefXxm7cuMEkARIShRh74eQG Ry3ogriCQz9PiFkoZR72r84d9I54Tr6FIIeY5EgDG/9VKa9emueZzgHEZ/Vzxw57065R daxwMr2bjrkIK3swO+OgENa3zRPnHmC0LzH6sg+AuAsgT2rGmGU7P5TfSu6YEt4cX2dx UbAQc1sdCBeE4VHsomfEOzGXLbwSqc0ma9SuDXihcWWPOML/wo2Fw7PShVALa82T7P5p c5LA== X-Gm-Message-State: AHPjjUjix/pTkb9Qd0K7hU/F1BPpIta56ooSLaS2jRPqKcvZ8sHSH2BE P8AzIpQ9RGVBOl/DlHF0mlza92c9 X-Google-Smtp-Source: AOwi7QBRi7s9TCKFl+mZSs0SsAtfjS7xS5SdAnqScE2oG5tAgz8qeFihpe10UleectsMdKDGKTDsaA== X-Received: by 10.223.187.80 with SMTP id x16mr6875042wrg.33.1506353079866; Mon, 25 Sep 2017 08:24:39 -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 o3sm1058933wmg.3.2017.09.25.08.24.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 25 Sep 2017 08:24:39 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Mon, 25 Sep 2017 17:24:08 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v3 11/13] pci: avoid over-complicated macro X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Sep 2017 15:24:41 -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 --- 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