From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 ; Thu, 12 Oct 2017 12:46:18 +0200 (CEST) Received: by mail-wm0-f50.google.com with SMTP id u138so12190446wmu.4 for ; 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 To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 12 Oct 2017 12:45:38 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 --- 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