You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by rb...@apache.org on 2004/03/05 20:52:06 UTC
cvs commit: apr/test testfnmatch.c Makefile.in Makefile.win test_apr.h testall.c
rbb 2004/03/05 11:52:06
Modified: include apr_fnmatch.h
strings apr_fnmatch.c
test Makefile.in Makefile.win test_apr.h testall.c
Added: test testfnmatch.c
Log:
Add apr_match_glob and two tests to make sure that it is working. There
is a problem that is documented in the code that requires an
apr_filepath_basename. That will be added soon.
Revision Changes Path
1.22 +12 -0 apr/include/apr_fnmatch.h
Index: apr_fnmatch.h
===================================================================
RCS file: /home/cvs/apr/include/apr_fnmatch.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- apr_fnmatch.h 3 Sep 2003 18:37:38 -0000 1.21
+++ apr_fnmatch.h 5 Mar 2004 19:52:06 -0000 1.22
@@ -43,6 +43,7 @@
*/
#include "apr_errno.h"
+#include "apr_tables.h"
#ifdef __cplusplus
extern "C" {
@@ -86,6 +87,17 @@
* @return non-zero if pattern has any glob characters in it
*/
APR_DECLARE(int) apr_fnmatch_test(const char *pattern);
+
+/**
+ * Find all files that match a specified pattern.
+ * @param pattern The pattern to use for finding files.
+ * @param result Array to use when storing the results
+ * @param p The pool to use.
+ * @return non-zero if pattern has any glob characters in it
+ */
+APR_DECLARE(apr_status_t) apr_match_glob(const char *pattern,
+ apr_array_header_t **result,
+ apr_pool_t *p);
/** @} */
1.9 +50 -0 apr/strings/apr_fnmatch.c
Index: apr_fnmatch.c
===================================================================
RCS file: /home/cvs/apr/strings/apr_fnmatch.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- apr_fnmatch.c 3 Sep 2003 18:37:38 -0000 1.8
+++ apr_fnmatch.c 5 Mar 2004 19:52:06 -0000 1.9
@@ -45,8 +45,11 @@
#ifndef WIN32
#include "apr_private.h"
#endif
+#include "apr_file_info.h"
#include "apr_fnmatch.h"
+#include "apr_tables.h"
#include "apr_lib.h"
+#include "apr_strings.h"
#include <string.h>
#if APR_HAVE_CTYPE_H
# include <ctype.h>
@@ -240,4 +243,51 @@
++pattern;
}
return 0;
+}
+
+/* Find all files matching the specified pattern */
+APR_DECLARE(apr_status_t) apr_match_glob(const char *pattern,
+ apr_array_header_t **result,
+ apr_pool_t *p)
+{
+ apr_dir_t *dir;
+ apr_finfo_t finfo;
+ apr_status_t rv;
+ char *path;
+
+ /* XXX So, this is kind of bogus. Basically, I need to strip any leading
+ * directories off the pattern, but there is no portable way to do that.
+ * So, for now we just find the last occurance of '/' and if that doesn't
+ * return anything, then we look for '\'. This means that we could
+ * screw up on unix if the pattern is something like "foo\.*" That '\'
+ * isn't a directory delimiter, it is a part of the filename. To fix this,
+ * we really need apr_filepath_basename, which will be coming as soon as
+ * I get to it. rbb
+ */
+ char *idx = strrchr(pattern, '/');
+
+ if (idx == NULL) {
+ idx = strrchr(pattern, '\\');
+ }
+ if (idx == NULL) {
+ path = ".";
+ }
+ else {
+ path = apr_pstrndup(p, pattern, idx - pattern);
+ pattern = idx + 1;
+ }
+
+ *result = apr_array_make(p, 0, sizeof(char *));
+ rv = apr_dir_open(&dir, path, p);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ while (apr_dir_read(&finfo, APR_FINFO_NAME, dir) == APR_SUCCESS) {
+ if (apr_fnmatch(pattern, finfo.name, 0) == APR_SUCCESS) {
+ *(const char **)apr_array_push(*result) = finfo.name;
+ }
+ }
+ apr_dir_close(dir);
+ return APR_SUCCESS;
}
1.147 +1 -1 apr/test/Makefile.in
Index: Makefile.in
===================================================================
RCS file: /home/cvs/apr/test/Makefile.in,v
retrieving revision 1.146
retrieving revision 1.147
diff -u -r1.146 -r1.147
--- Makefile.in 6 Feb 2004 22:57:47 -0000 1.146
+++ Makefile.in 5 Mar 2004 19:52:06 -0000 1.147
@@ -120,7 +120,7 @@
testdso.lo testoc.lo testdup.lo testsockets.lo testproc.lo \
testpoll.lo testlock.lo testsockopt.lo testpipe.lo testthread.lo \
testhash.lo testargs.lo testnames.lo testuser.lo testpath.lo \
- testenv.lo testprocmutex.lo testrand2.lo
+ testenv.lo testprocmutex.lo testrand2.lo testfnmatch.lo
testall: $(TESTS) mod_test.la libmod_test.la occhild@EXEEXT@ \
readchild@EXEEXT@ CuTest.lo proc_child@EXEEXT@ $(LOCAL_LIBS)
1.12 +1 -1 apr/test/Makefile.win
Index: Makefile.win
===================================================================
RCS file: /home/cvs/apr/test/Makefile.win,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- Makefile.win 16 Nov 2003 23:49:15 -0000 1.11
+++ Makefile.win 5 Mar 2004 19:52:06 -0000 1.12
@@ -99,7 +99,7 @@
testdso.obj testoc.obj testdup.obj testsockets.obj testproc.obj \
testpoll.obj testlock.obj testsockopt.obj testpipe.obj testthread.obj \
testhash.obj testargs.obj testnames.obj testuser.obj testpath.obj \
- testenv.obj testprocmutex.obj testrand2.obj
+ testenv.obj testprocmutex.obj testrand2.obj testfnmatch.obj
testall.exe: $(TESTS) CuTest.obj $(LOCAL_LIBS)
$(LINK) /debug /subsystem:console /machine:I386 $(TESTS) CuTest.obj \
1.45 +1 -0 apr/test/test_apr.h
Index: test_apr.h
===================================================================
RCS file: /home/cvs/apr/test/test_apr.h,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- test_apr.h 13 Feb 2004 09:38:34 -0000 1.44
+++ test_apr.h 5 Mar 2004 19:52:06 -0000 1.45
@@ -59,6 +59,7 @@
CuSuite *testuser(void);
CuSuite *testpath(void);
CuSuite *testenv(void);
+CuSuite *testfnmatch(void);
/* Assert that RV is an APR_SUCCESS value; else fail giving strerror
* for RV and CONTEXT message. */
1.50 +1 -0 apr/test/testall.c
Index: testall.c
===================================================================
RCS file: /home/cvs/apr/test/testall.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- testall.c 13 Feb 2004 09:38:34 -0000 1.49
+++ testall.c 5 Mar 2004 19:52:06 -0000 1.50
@@ -70,6 +70,7 @@
{"testuser", testuser},
{"testpath", testpath},
{"testenv", testenv},
+ {"testfnmatch", testfnmatch},
{"LastTest", NULL}
};
1.1 apr/test/testfnmatch.c
Index: testfnmatch.c
===================================================================
/* Copyright 2000-2004 The Apache Software Foundation
*
* Licensed 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.
*/
#include "test_apr.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "apr_file_info.h"
#include "apr_fnmatch.h"
#include "apr_tables.h"
static void test_glob(CuTest *tc)
{
int i;
char **list;
apr_array_header_t *result;
apr_status_t rv = apr_match_glob("data\\*.txt", &result, p);
CuAssertIntEquals(tc, APR_SUCCESS, rv);
/* XXX If we ever add a file that matches *.txt to data, then we need
* to increase this.
*/
CuAssertIntEquals(tc, 2, result->nelts);
list = (char **)result->elts;
for (i = 0; i < result->nelts; i++) {
char *dot = strrchr(list[i], '.');
CuAssertStrEquals(tc, dot, ".txt");
}
}
static void test_glob_currdir(CuTest *tc)
{
int i;
char **list;
apr_array_header_t *result;
apr_status_t rv;
apr_filepath_set("data", p);
rv = apr_match_glob("*.txt", &result, p);
CuAssertIntEquals(tc, APR_SUCCESS, rv);
/* XXX If we ever add a file that matches *.txt to data, then we need
* to increase this.
*/
CuAssertIntEquals(tc, 2, result->nelts);
list = (char **)result->elts;
for (i = 0; i < result->nelts; i++) {
char *dot = strrchr(list[i], '.');
CuAssertStrEquals(tc, dot, ".txt");
}
}
CuSuite *testfnmatch(void)
{
CuSuite *suite = CuSuiteNew("Fnmatch");
SUITE_ADD_TEST(suite, test_glob);
SUITE_ADD_TEST(suite, test_glob_currdir);
return suite;
}
Re: cvs commit: apr/test testfnmatch.c Makefile.in Makefile.win test_apr.h testall.c
Posted by Joe Orton <jo...@manyfish.co.uk>.
On Fri, Mar 05, 2004 at 07:52:06PM -0000, Ryan Bloom wrote:
> rbb 2004/03/05 11:52:06
>
> Modified: include apr_fnmatch.h
> strings apr_fnmatch.c
> test Makefile.in Makefile.win test_apr.h testall.c
> Added: test testfnmatch.c
> Log:
> Add apr_match_glob and two tests to make sure that it is working. There
> is a problem that is documented in the code that requires an
> apr_filepath_basename. That will be added soon.
Are you planning to extend this into a real glob() implementation (i.e.
handling "*/*" etc)? If not I don't think it should be named _glob(),
apr_fnmatch_expand() or something might be more appropriate.
Regards,
joe