This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new a262eeb libc: Rename match to fnmatch
a262eeb is described below
commit a262eebe347ffce798ea86684226b4ef2a4c6701
Author: Xiang Xiao <[email protected]>
AuthorDate: Sun Aug 1 16:54:08 2021 +0800
libc: Rename match to fnmatch
specified here:
https://pubs.opengroup.org/onlinepubs/007904875/functions/fnmatch.html
Signed-off-by: Xiang Xiao <[email protected]>
---
fs/procfs/fs_procfs.c | 8 +-
include/fnmatch.h | 110 +++++++++++++++++++++++
libs/libc/libc.csv | 1 +
libs/libc/misc/Make.defs | 2 +-
libs/libc/misc/lib_fnmatch.c | 210 +++++++++++++++++++++++++++++++++++++++++++
net/procfs/net_procfs.c | 7 +-
6 files changed, 330 insertions(+), 8 deletions(-)
diff --git a/fs/procfs/fs_procfs.c b/fs/procfs/fs_procfs.c
index 3c5dace..e0a41c7 100644
--- a/fs/procfs/fs_procfs.c
+++ b/fs/procfs/fs_procfs.c
@@ -34,6 +34,7 @@
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
+#include <fnmatch.h>
#include <assert.h>
#include <errno.h>
#include <debug.h>
@@ -45,7 +46,6 @@
#include <nuttx/fs/fs.h>
#include <nuttx/fs/procfs.h>
#include <nuttx/fs/dirent.h>
-#include <nuttx/lib/regex.h>
#include "mount/mount.h"
@@ -351,7 +351,7 @@ static int procfs_open(FAR struct file *filep, FAR const
char *relpath,
{
/* Test if the path matches this entry's specification */
- if (match(g_procfs_entries[x].pathpattern, relpath))
+ if (fnmatch(g_procfs_entries[x].pathpattern, relpath, 0) == 0)
{
/* Match found! Stat using this procfs entry */
@@ -594,7 +594,7 @@ static int procfs_opendir(FAR struct inode *mountpt, FAR
const char *relpath,
{
/* Test if the path matches this entry's specification */
- if (match(g_procfs_entries[x].pathpattern, relpath))
+ if (fnmatch(g_procfs_entries[x].pathpattern, relpath, 0) == 0)
{
/* Match found! Call the handler's opendir routine. If
* successful, this opendir routine will create an entry
@@ -1041,7 +1041,7 @@ static int procfs_stat(struct inode *mountpt, const char
*relpath,
{
/* Test if the path matches this entry's specification */
- if (match(g_procfs_entries[x].pathpattern, relpath))
+ if (fnmatch(g_procfs_entries[x].pathpattern, relpath, 0) == 0)
{
/* Match found! Stat using this procfs entry */
diff --git a/include/fnmatch.h b/include/fnmatch.h
new file mode 100644
index 0000000..bac89d6
--- /dev/null
+++ b/include/fnmatch.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+ * include/fnmatch.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __INCLUDE_FNMATCH_H
+#define __INCLUDE_FNMATCH_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/compiler.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define FNM_PATHNAME 0x01
+#define FNM_PERIOD 0x02
+#define FNM_NOESCAPE 0x04
+
+#define FNM_NOMATCH 1
+#define FNM_NOSYS -1
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Name: fnmatch
+ *
+ * Description:
+ * The fnmatch() function shall match patterns as described in the Shell
+ * and Utilities volume of IEEE Std 1003.1-2001, Section 2.13.1, Patterns
+ * Matching a Single Character, and Section 2.13.2, Patterns Matching
+ * Multiple Characters. It checks the string specified by the string
+ * argument to see if it matches the pattern specified by the pattern
+ * argument.
+ *
+ * The flags argument shall modify the interpretation of pattern and
+ * string. It is the bitwise-inclusive OR of zero or more of the flags
+ * defined in <fnmatch.h>. If the FNM_PATHNAME flag is set in flags,
+ * then a slash character ( '/' ) in string shall be explicitly matched
+ * by a slash in pattern; it shall not be matched by either the asterisk
+ * or question-mark special characters, nor by a bracket expression. If
+ * the FNM_PATHNAME flag is not set, the slash character shall be treated
+ * as an ordinary character.
+ *
+ * If FNM_NOESCAPE is not set in flags, a backslash character ( '\' ) in
+ * pattern followed by any other character shall match that second
+ * character in string. In particular, "\\" shall match a backslash in
+ * string. If FNM_NOESCAPE is set, a backslash character shall be treated
+ * as an ordinary character.
+ *
+ * If FNM_PERIOD is set in flags, then a leading period ( '.' ) in string
+ * shall match a period in pattern; as described by rule 2 in the Shell and
+ * Utilities volume of IEEE Std 1003.1-2001, Section 2.13.3, Patterns Used
+ * for Filename Expansion where the location of "leading" is indicated by
+ * the value of FNM_PATHNAME:
+ *
+ * If FNM_PATHNAME is set, a period is "leading" if it is the first
+ * character in string or if it immediately follows a slash.
+ *
+ * If FNM_PATHNAME is not set, a period is "leading" only if it is the
+ * first character of string.
+ *
+ * If FNM_PERIOD is not set, then no special restrictions are placed on
+ * matching a period.
+ *
+ * Returned Value:
+ * If string matches the pattern specified by pattern, then fnmatch()
+ * shall return 0. If there is no match, fnmatch() shall return
+ * FNM_NOMATCH, which is defined in <fnmatch.h>. If an error occurs,
+ * fnmatch() shall return another non-zero value.
+ *
+ ****************************************************************************/
+
+int fnmatch(FAR const char *pattern, const char *string, int flags);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_FNMATCH_H */
diff --git a/libs/libc/libc.csv b/libs/libc/libc.csv
index f0bd9c8..b505164 100644
--- a/libs/libc/libc.csv
+++ b/libs/libc/libc.csv
@@ -42,6 +42,7 @@
"fgetpos","stdio.h","defined(CONFIG_FILE_STREAM)","int","FAR FILE *","FAR
fpos_t *"
"fgets","stdio.h","defined(CONFIG_FILE_STREAM)","FAR char *","FAR char
*","int","FAR FILE *"
"fileno","stdio.h","","int","FAR FILE *"
+"fnmatch","fnmatch.h","","int","FAR const char *","FAR const char *","int"
"fopen","stdio.h","defined(CONFIG_FILE_STREAM)","FAR FILE *","FAR const char
*","FAR const char *"
"fprintf","stdio.h","defined(CONFIG_FILE_STREAM)","int","FAR FILE *","FAR
const IPTR char *","..."
"fputc","stdio.h","defined(CONFIG_FILE_STREAM)","int","int","FAR FILE *"
diff --git a/libs/libc/misc/Make.defs b/libs/libc/misc/Make.defs
index 2168826..af94784 100644
--- a/libs/libc/misc/Make.defs
+++ b/libs/libc/misc/Make.defs
@@ -44,7 +44,7 @@ endif
# Add the miscellaneous C files to the build
-CSRCS += lib_dumpbuffer.c lib_dumpvbuffer.c lib_match.c lib_debug.c
+CSRCS += lib_dumpbuffer.c lib_dumpvbuffer.c lib_fnmatch.c lib_match.c
lib_debug.c
CSRCS += lib_crc64.c lib_crc32.c lib_crc16.c lib_crc8.c lib_crc8ccitt.c
CSRCS += lib_crc8table.c
diff --git a/libs/libc/misc/lib_fnmatch.c b/libs/libc/misc/lib_fnmatch.c
new file mode 100644
index 0000000..7e2e894
--- /dev/null
+++ b/libs/libc/misc/lib_fnmatch.c
@@ -0,0 +1,210 @@
+/****************************************************************************
+ * libs/libc/misc/lib_fnmatch.c
+ *
+ * Simple shell-style filename pattern matcher written by Jef Poskanzer
+ * This pattern matcher only handles '?', '*' and '**', and multiple
+ * patterns separated by '|'.
+ *
+ * Copyright 1995, 2000 by Jef Poskanzer <[email protected]>.
+ * All rights reserved.
+ *
+ * With extensions by Ken Pettit.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <fnmatch.h>
+#include <string.h>
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: fnmatch_one
+ *
+ * Description:
+ * Does all of the work for one '|' delimited pattern
+ *
+ * Returned Value:
+ * Returns 0 (match) or 1 (no-match).
+ *
+ ****************************************************************************/
+
+static int fnmatch_one(FAR const char *pattern, int patlen,
+ FAR const char *string, int flags)
+{
+ FAR const char *p;
+ char first;
+ int pl;
+ int i;
+
+ for (p = pattern; p - pattern < patlen; p++, string++)
+ {
+ if (*p == '?' && *string != '\0')
+ {
+ continue;
+ }
+
+ /* Match single character from a set: "[a-zA-Z]" for instance */
+
+ if (*p == '[' && *string != '\0')
+ {
+ i = 0;
+ while (*p != ']' && *p != '\0')
+ {
+ p++;
+
+ if (*string == *p)
+ {
+ /* Match found. Advance to the ']' */
+
+ i = 1;
+ while (*p != ']' && *p != '\0')
+ {
+ p++;
+ }
+
+ break;
+ }
+
+ /* Prepare to test for range */
+
+ if (*p != '\0')
+ {
+ first = *p++;
+ if (*p == '-')
+ {
+ p++;
+ if (*string >= first && *string <= *p)
+ {
+ /* Match found. Advance to the ']' */
+
+ i = 1;
+ while (*p != ']' && *p != '\0')
+ {
+ p++;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ /* We reuse 'i' above to indicate match found */
+
+ if (i)
+ {
+ continue;
+ }
+
+ return FNM_NOMATCH;
+ }
+
+ if (*p == '*')
+ {
+ p++;
+ if (*p == '*')
+ {
+ /* Double-wildcard matches anything. */
+
+ p++;
+ i = strlen(string);
+ }
+ else
+ {
+ /* Single-wildcard matches anything but slash. */
+
+ i = strcspn(string, "/");
+ }
+
+ pl = patlen - (p - pattern);
+ for (; i >= 0; i--)
+ {
+ if (fnmatch_one(p, pl, &string[i], flags) == 0)
+ {
+ return 0;
+ }
+ }
+
+ return FNM_NOMATCH;
+ }
+
+ if (*p != *string)
+ {
+ return FNM_NOMATCH;
+ }
+ }
+
+ if (*string == '\0')
+ {
+ return 0;
+ }
+
+ return FNM_NOMATCH;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: fnmatch
+ *
+ * Description:
+ * Simple shell-style filename pattern matcher originally written by
+ * Jef Poskanzer and extended by Ken Pettit. This pattern matcher handles
+ * '?', '*', '**', sets like [a-zA-z], and multiple patterns separated
+ * by '|'.
+ *
+ * Returned Value:
+ * Returns 0 (match) or 1 (no-match).
+ *
+ ****************************************************************************/
+
+int fnmatch(FAR const char *pattern, const char *string, int flags)
+{
+ FAR const char *or;
+
+ for (; ; )
+ {
+ or = strchr(pattern, '|');
+ if (or == NULL)
+ {
+ return fnmatch_one(pattern, strlen(pattern), string, flags);
+ }
+
+ if (fnmatch_one(pattern, or - pattern, string, flags) == 0)
+ {
+ return 0;
+ }
+
+ pattern = or + 1;
+ }
+}
diff --git a/net/procfs/net_procfs.c b/net/procfs/net_procfs.c
index 421b41d..39e68e6 100644
--- a/net/procfs/net_procfs.c
+++ b/net/procfs/net_procfs.c
@@ -31,6 +31,7 @@
#include <stdbool.h>
#include <string.h>
#include <fcntl.h>
+#include <fnmatch.h>
#include <libgen.h>
#include <assert.h>
#include <errno.h>
@@ -40,7 +41,6 @@
#include <nuttx/fs/fs.h>
#include <nuttx/fs/procfs.h>
#include <nuttx/fs/dirent.h>
-#include <nuttx/lib/regex.h>
#include <nuttx/net/netdev.h>
#include "netdev/netdev.h"
@@ -185,7 +185,7 @@ static int netprocfs_open(FAR struct file *filep, FAR const
char *relpath,
* table support is initialized.
*/
- if (match("net/route/**", relpath))
+ if (fnmatch("net/route/**", relpath, 0) == 0)
{
/* Use the /net/route directory */
@@ -393,7 +393,8 @@ static int netprocfs_opendir(FAR const char *relpath,
*/
#ifdef CONFIG_NET_ROUTE
- if (match("net/route", relpath) || match("net/route/**", relpath))
+ if (fnmatch("net/route", relpath, 0) == 0 ||
+ fnmatch("net/route/**", relpath, 0) == 0)
{
/* Use the /net/route directory */