MCPcopy Create free account
hub / github.com/F-Stack/f-stack / fnmatch

Function fnmatch

tools/compat/fnmatch.c:78–179  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

76static int rangematch(const char *, char, int, char **);
77
78int
79fnmatch(const char *pattern, const char *string, int flags)
80{
81 const char *stringstart;
82 char *newp;
83 char c, test;
84
85 for (stringstart = string;;)
86 switch (c = *pattern++) {
87 case EOS:
88 if ((flags & FNM_LEADING_DIR) && *string == '/')
89 return (0);
90 return (*string == EOS ? 0 : FNM_NOMATCH);
91 case '?':
92 if (*string == EOS)
93 return (FNM_NOMATCH);
94 if (*string == '/' && (flags & FNM_PATHNAME))
95 return (FNM_NOMATCH);
96 if (*string == '.' && (flags & FNM_PERIOD) &&
97 (string == stringstart ||
98 ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
99 return (FNM_NOMATCH);
100 ++string;
101 break;
102 case '*':
103 c = *pattern;
104 /* Collapse multiple stars. */
105 while (c == '*')
106 c = *++pattern;
107
108 if (*string == '.' && (flags & FNM_PERIOD) &&
109 (string == stringstart ||
110 ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
111 return (FNM_NOMATCH);
112
113 /* Optimize for pattern with * at end or before /. */
114 if (c == EOS)
115 if (flags & FNM_PATHNAME)
116 return ((flags & FNM_LEADING_DIR) ||
117 strchr(string, '/') == NULL ?
118 0 : FNM_NOMATCH);
119 else
120 return (0);
121 else if (c == '/' && flags & FNM_PATHNAME) {
122 if ((string = strchr(string, '/')) == NULL)
123 return (FNM_NOMATCH);
124 break;
125 }
126
127 /* General case, use recursion. */
128 while ((test = *string) != EOS) {
129 if (!fnmatch(pattern, string, flags & ~FNM_PERIOD))
130 return (0);
131 if (test == '/' && flags & FNM_PATHNAME)
132 break;
133 ++string;
134 }
135 return (FNM_NOMATCH);

Callers 2

login_strinlistFunction · 0.50
group_memberFunction · 0.50

Calls 3

strchrFunction · 0.85
tolowerFunction · 0.85
rangematchFunction · 0.70

Tested by

no test coverage detected