From patchwork Mon Jul 31 10:17:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 129737 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 413B842FA3; Mon, 31 Jul 2023 12:17:23 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1381743252; Mon, 31 Jul 2023 12:17:19 +0200 (CEST) Received: from mgamail.intel.com (unknown [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id 5F58C40150 for ; Mon, 31 Jul 2023 12:17:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1690798637; x=1722334637; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2J4s+IIoSLpy3yfrtLwrW9WcalDfNGq/PhBZljP+R94=; b=FNLIYO0HuZLxK8EtIWZuhvhKESzcUdHuJ/OIkdFfEFlwBEqL+LhwOm2T ejlCuSyQw0tZpRbnCOalUVT2GSflj2Vuvg0982jGJDF3CoF1mPoV8M0Gr SR7W7DDPNL944dj2v4LJI7ao9ermI/C61hwpu5LUD+AACKGDiL6a8UDcv jRNjvEJZgi1IbjY0uIJ9GfuYRyWiBIhPJwujzGFsyXhua9/+3lbCO6B/6 UYvNLpXPnl0ndYFEsFMnks+h8xs2E18Yyg18unaTqn8TXGi2XQjXM81Gi ip45jciAqq9c+chWIie2ZINClhYfPRnlLtMXv0jZywPMzt/W4T+addnIJ A==; X-IronPort-AV: E=McAfee;i="6600,9927,10787"; a="455351295" X-IronPort-AV: E=Sophos;i="6.01,244,1684825200"; d="scan'208";a="455351295" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Jul 2023 03:17:16 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10787"; a="798203009" X-IronPort-AV: E=Sophos;i="6.01,244,1684825200"; d="scan'208";a="798203009" Received: from silpixa00401385.ir.intel.com ([10.237.214.14]) by fmsmga004.fm.intel.com with ESMTP; 31 Jul 2023 03:17:15 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson , =?utf-8?q?Morten_Br=C3=B8?= =?utf-8?q?rup?= , Tyler Retzlaff Subject: [PATCH v6 1/3] eal/windows: move fnmatch function to header file Date: Mon, 31 Jul 2023 11:17:01 +0100 Message-Id: <20230731101703.1178204-2-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230731101703.1178204-1-bruce.richardson@intel.com> References: <20220829151901.376754-1-bruce.richardson@intel.com> <20230731101703.1178204-1-bruce.richardson@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org To allow the fnmatch function to be shared between libraries, without having to export it into the public namespace (since it's not prefixed with "rte"), we can convert fnmatch.c to replace fnmatch.h. This allows fnmatch function to be static and limited in scope to the current file, preventing duplicate definitions if it is used by two libraries, while also not requiring export for sharing. Signed-off-by: Bruce Richardson Acked-by: Morten Brørup Acked-by: Tyler Retzlaff --- lib/eal/windows/fnmatch.c | 172 ----------------------------- lib/eal/windows/include/fnmatch.h | 175 +++++++++++++++++++++++++++--- lib/eal/windows/meson.build | 1 - 3 files changed, 162 insertions(+), 186 deletions(-) delete mode 100644 lib/eal/windows/fnmatch.c diff --git a/lib/eal/windows/fnmatch.c b/lib/eal/windows/fnmatch.c deleted file mode 100644 index f622bf54c5..0000000000 --- a/lib/eal/windows/fnmatch.c +++ /dev/null @@ -1,172 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright (c) 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; -#endif /* LIBC_SCCS and not lint */ - -/* - * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. - * Compares a filename or pathname to a pattern. - */ - -#include -#include -#include - -#include "fnmatch.h" - -#define EOS '\0' - -static const char *rangematch(const char *, char, int); - -int -fnmatch(const char *pattern, const char *string, int flags) -{ - const char *stringstart; - char c, test; - - for (stringstart = string;;) - switch (c = *pattern++) { - case EOS: - if ((flags & FNM_LEADING_DIR) && *string == '/') - return (0); - return (*string == EOS ? 0 : FNM_NOMATCH); - case '?': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - ++string; - break; - case '*': - c = *pattern; - /* Collapse multiple stars. */ - while (c == '*') - c = *++pattern; - - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - /* Optimize for pattern with * at end or before /. */ - if (c == EOS) - if (flags & FNM_PATHNAME) - return ((flags & FNM_LEADING_DIR) || - strchr(string, '/') == NULL ? - 0 : FNM_NOMATCH); - else - return (0); - else if (c == '/' && flags & FNM_PATHNAME) { - string = strchr(string, '/'); - if (string == NULL) - return (FNM_NOMATCH); - break; - } - - /* General case, use recursion. */ - while ((test = *string) != EOS) { - if (!fnmatch(pattern, string, - flags & ~FNM_PERIOD)) - return (0); - if (test == '/' && flags & FNM_PATHNAME) - break; - ++string; - } - return (FNM_NOMATCH); - case '[': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && flags & FNM_PATHNAME) - return (FNM_NOMATCH); - pattern = rangematch(pattern, *string, flags); - if (pattern == NULL) - return (FNM_NOMATCH); - ++string; - break; - case '\\': - if (!(flags & FNM_NOESCAPE)) { - c = *pattern++; - if (c == EOS) { - c = '\\'; - --pattern; - } - } - /* FALLTHROUGH */ - default: - if (c == *string) - ; - else if ((flags & FNM_CASEFOLD) && - (tolower((unsigned char)c) == - tolower((unsigned char)*string))) - ; - else if ((flags & FNM_PREFIX_DIRS) && *string == EOS && - ((c == '/' && string != stringstart) || - (string == stringstart+1 && *stringstart == '/'))) - return (0); - else - return (FNM_NOMATCH); - string++; - break; - } - /* NOTREACHED */ -} - -static const char * -rangematch(const char *pattern, char test, int flags) -{ - int negate, ok; - char c, c2; - - /* - * A bracket expression starting with an unquoted circumflex - * character produces unspecified results (IEEE 1003.2-1992, - * 3.13.2). This implementation treats it like '!', for - * consistency with the regular expression syntax. - * J.T. Conklin (conklin@ngai.kaleida.com) - */ - negate = (*pattern == '!' || *pattern == '^'); - if (negate) - ++pattern; - - if (flags & FNM_CASEFOLD) - test = tolower((unsigned char)test); - - for (ok = 0; (c = *pattern++) != ']';) { - if (c == '\\' && !(flags & FNM_NOESCAPE)) - c = *pattern++; - if (c == EOS) - return (NULL); - - if (flags & FNM_CASEFOLD) - c = tolower((unsigned char)c); - - c2 = *(pattern + 1); - if (*pattern == '-' && c2 != EOS && c2 != ']') { - pattern += 2; - if (c2 == '\\' && !(flags & FNM_NOESCAPE)) - c2 = *pattern++; - if (c2 == EOS) - return (NULL); - - if (flags & FNM_CASEFOLD) - c2 = tolower((unsigned char)c2); - - if ((unsigned char)c <= (unsigned char)test && - (unsigned char)test <= (unsigned char)c2) - ok = 1; - } else if (c == test) - ok = 1; - } - return (ok == negate ? NULL : pattern); -} diff --git a/lib/eal/windows/include/fnmatch.h b/lib/eal/windows/include/fnmatch.h index c6b226bd5d..fbf1eef21c 100644 --- a/lib/eal/windows/include/fnmatch.h +++ b/lib/eal/windows/include/fnmatch.h @@ -1,20 +1,25 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2019 Intel Corporation + * Copyright (c) 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. */ - #ifndef _FNMATCH_H_ #define _FNMATCH_H_ -/** - * This file is required to support the common code in eal_common_log.c - * as Microsoft libc does not contain fnmatch.h. This may be removed in - * future releases. +#if defined(LIBC_SCCS) && !defined(lint) +static const char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; +#endif /* LIBC_SCCS and not lint */ + +/* + * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. + * Compares a filename or pathname to a pattern. */ -#ifdef __cplusplus -extern "C" { -#endif -#include +#include +#include +#include #define FNM_NOMATCH 1 @@ -25,6 +30,10 @@ extern "C" { #define FNM_CASEFOLD 0x10 #define FNM_PREFIX_DIRS 0x20 +#define FNM_EOS '\0' + +static const char *fnm_rangematch(const char *, char, int); + /** * This function is used for searching a given string source * with the given regular expression pattern. @@ -41,10 +50,150 @@ extern "C" { * @return * if the pattern is found then return 0 or else FNM_NOMATCH */ -int fnmatch(const char *pattern, const char *string, int flags); +static int +fnmatch(const char *pattern, const char *string, int flags) +{ + const char *stringstart; + char c, test; + + for (stringstart = string;;) + switch (c = *pattern++) { + case FNM_EOS: + if ((flags & FNM_LEADING_DIR) && *string == '/') + return (0); + return (*string == FNM_EOS ? 0 : FNM_NOMATCH); + case '?': + if (*string == FNM_EOS) + return (FNM_NOMATCH); + if (*string == '/' && (flags & FNM_PATHNAME)) + return (FNM_NOMATCH); + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + ++string; + break; + case '*': + c = *pattern; + /* Collapse multiple stars. */ + while (c == '*') + c = *++pattern; + + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + + /* Optimize for pattern with * at end or before /. */ + if (c == FNM_EOS) + if (flags & FNM_PATHNAME) + return ((flags & FNM_LEADING_DIR) || + strchr(string, '/') == NULL ? + 0 : FNM_NOMATCH); + else + return (0); + else if (c == '/' && flags & FNM_PATHNAME) { + string = strchr(string, '/'); + if (string == NULL) + return (FNM_NOMATCH); + break; + } + + /* General case, use recursion. */ + while ((test = *string) != FNM_EOS) { + if (!fnmatch(pattern, string, + flags & ~FNM_PERIOD)) + return (0); + if (test == '/' && flags & FNM_PATHNAME) + break; + ++string; + } + return (FNM_NOMATCH); + case '[': + if (*string == FNM_EOS) + return (FNM_NOMATCH); + if (*string == '/' && flags & FNM_PATHNAME) + return (FNM_NOMATCH); + pattern = fnm_rangematch(pattern, *string, flags); + if (pattern == NULL) + return (FNM_NOMATCH); + ++string; + break; + case '\\': + if (!(flags & FNM_NOESCAPE)) { + c = *pattern++; + if (c == FNM_EOS) { + c = '\\'; + --pattern; + } + } + /* FALLTHROUGH */ + default: + if (c == *string) + ; + else if ((flags & FNM_CASEFOLD) && + (tolower((unsigned char)c) == + tolower((unsigned char)*string))) + ; + else if ((flags & FNM_PREFIX_DIRS) && *string == FNM_EOS && + ((c == '/' && string != stringstart) || + (string == stringstart+1 && *stringstart == '/'))) + return (0); + else + return (FNM_NOMATCH); + string++; + break; + } + /* NOTREACHED */ +} + +static const char * +fnm_rangematch(const char *pattern, char test, int flags) +{ + int negate, ok; + char c, c2; + + /* + * A bracket expression starting with an unquoted circumflex + * character produces unspecified results (IEEE 1003.2-1992, + * 3.13.2). This implementation treats it like '!', for + * consistency with the regular expression syntax. + * J.T. Conklin (conklin@ngai.kaleida.com) + */ + negate = (*pattern == '!' || *pattern == '^'); + if (negate) + ++pattern; + + if (flags & FNM_CASEFOLD) + test = tolower((unsigned char)test); + + for (ok = 0; (c = *pattern++) != ']';) { + if (c == '\\' && !(flags & FNM_NOESCAPE)) + c = *pattern++; + if (c == FNM_EOS) + return (NULL); + + if (flags & FNM_CASEFOLD) + c = tolower((unsigned char)c); + + c2 = *(pattern + 1); + if (*pattern == '-' && c2 != FNM_EOS && c2 != ']') { + pattern += 2; + if (c2 == '\\' && !(flags & FNM_NOESCAPE)) + c2 = *pattern++; + if (c2 == FNM_EOS) + return (NULL); + + if (flags & FNM_CASEFOLD) + c2 = tolower((unsigned char)c2); -#ifdef __cplusplus + if ((unsigned char)c <= (unsigned char)test && + (unsigned char)test <= (unsigned char)c2) + ok = 1; + } else if (c == test) + ok = 1; + } + return (ok == negate ? NULL : pattern); } -#endif #endif /* _FNMATCH_H_ */ diff --git a/lib/eal/windows/meson.build b/lib/eal/windows/meson.build index 845e406ca1..e4b2427610 100644 --- a/lib/eal/windows/meson.build +++ b/lib/eal/windows/meson.build @@ -18,7 +18,6 @@ sources += files( 'eal_mp.c', 'eal_thread.c', 'eal_timer.c', - 'fnmatch.c', 'getopt.c', 'rte_thread.c', )