From 3f62b69af3f0f61299ac7bcbc7c3b35cbd16cf4a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 27 Jul 1998 17:55:05 +0000 Subject: Update. 1998-07-27 17:42 Ulrich Drepper * nss/nss_files/files-parse.c (INT_FIELD): Use strtoul instead of strtol. (INT_FIELD_MAYBE_NULL): Likewise. * posix/globtest.c: Rewrite for extended test suite. * posix/globtest.sh: More tests. Patch by Brian Wellington . * stdlib/strtol.c: Don't redefine LONG_MAX, LONG_MIN, and ULONG_MAX. Use new macro. * sysdeps/generic/readv.c: Correct return type. * sysdeps/generic/writev.c: Likewise. 1998-07-24 Gordon Matzigkeit * argp/argp-help.c (_GNU_SOURCE): Define, to suck in program_invocation_name when compiling outside of glibc. 1998-07-26 Philip Blundell * sysdeps/unix/sysv/linux/arm/siglist.c: New file; ARM tools don't like `@' in .type directives. * sysdeps/libm-ieee754/e_expf.c (__ieee754_expf): Check whether FE_TONEAREST exists for this platform before using it. * sysdeps/libm-ieee754/e_exp.c (__ieee754_exp): Likewise. * sysdeps/arm/dl-machine.h (elf_machine_rel): Delete redundant debugging code. Correct handling of PC24 relocs. * elf/Makefile (ld-map): Only define if versioning is in use. * sysdeps/arm/fpu_control.h: Move to ... * sysdeps/arm/fpu/fpu_control.h: ... here. * sysdeps/generic/fpu_control.h: Made usable as a dummy implementation. * sysdeps/unix/sysv/linux/arm/brk.c: New file. * sysdeps/arm/machine-gmon.h: Improved profiling for ARM. * sysdeps/arm/sysdep.h (CALL_MCOUNT): Replace stub with real implementation. * sysdeps/unix/sysv/linux/arm/clone.S: Likewise. Based on patch from Scott Bambrough and Pat Beirne. * shlib-versions: Add appropriate definitions for ARM machines. * README.template: Mention that Linux/ARM with ELF works now. 1998-07-18 Andreas Schwab * Makerules: Generate compilation rules for all object suffixes, not only those currently selected, for sources in the current or object directory. 1998-07-24 Andreas Schwab * posix/fnmatch.c (fnmatch): Allow `/' in character class. Don't match `/' in filename by a character class if requested. * posix/testfnm.c: Rewritten. * posix/testfnm.args: Removed. 1998-07-25 Andreas Schwab * posix/annexc.c (limits_syms): Add missing symbols. (stdarg_syms): Move va_list to `maybe' list. (stdio_syms): Add FOPEN_MAX. --- posix/annexc.c | 15 ++-- posix/fnmatch.c | 7 +- posix/globtest.c | 87 +++++++++++++++++++---- posix/globtest.sh | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++--- posix/testfnm.args | 1 - posix/testfnm.c | 37 ++++++++-- 6 files changed, 308 insertions(+), 38 deletions(-) delete mode 100644 posix/testfnm.args (limited to 'posix') diff --git a/posix/annexc.c b/posix/annexc.c index cd387fe..56af0a5 100644 --- a/posix/annexc.c +++ b/posix/annexc.c @@ -160,8 +160,10 @@ static const char *const limits_syms[] = "_POSIX_THREAD_DESTRUCTOR_ITERATIONS", "_POSIX_THREAD_KEYS_MAX", "_POSIX_THREAD_THREADS_MAX", "_POSIX_TIMER_MAX", "_POSIX_TTY_NAME_MAX", "_POSIX_TZNAME_MAX", "_POSIX_THREAD_DESTRUCTOR_ITERATIONS", - "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "INT_MAX", "INT_MIN", "MB_LEN_MAX", - "NGROUPS_MAX", "PAGESIZE", "SCHAR_MIN", "SCHAR_MAX" + "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "INT_MAX", "INT_MIN", "LONG_MAX", + "LONG_MIN", "MB_LEN_MAX", "NGROUPS_MAX", "PAGESIZE", "SCHAR_MAX", + "SCHAR_MIN", "SHRT_MAX", "SHRT_MIN", "UCHAR_MAX", "UINT_MAX", + "ULONG_MAX", "USHRT_MAX" }; static const char *const limits_maybe[] = { @@ -333,10 +335,11 @@ static const char *const signal_maybe[] = /* . */ static const char *const stdarg_syms[] = { - "va_arg", "va_end", "va_list", "va_start" + "va_arg", "va_end", "va_start" }; static const char *const stdarg_maybe[] = { + "va_list" }; /* . */ @@ -351,9 +354,9 @@ static const char *const stddef_maybe[] = /* . */ static const char *const stdio_syms[] = { - "BUFSIZ", "EOF", "FILENAME_MAX", "L_ctermid", "L_cuserid", "L_tmpnam", - "NULL", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STREAM_MAX", "TMP_MAX", - "stderr", "stdin", "stdout", "_IOFBF", "_IOLBF", "_IONBF" + "BUFSIZ", "EOF", "FILENAME_MAX", "FOPEN_MAX", "L_ctermid", "L_cuserid", + "L_tmpnam", "NULL", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STREAM_MAX", + "TMP_MAX", "stderr", "stdin", "stdout", "_IOFBF", "_IOLBF", "_IONBF" }; static const char *const stdio_maybe[] = { diff --git a/posix/fnmatch.c b/posix/fnmatch.c index e4677cb..2d6f6af 100644 --- a/posix/fnmatch.c +++ b/posix/fnmatch.c @@ -228,6 +228,10 @@ fnmatch (pattern, string, flags) (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) return FNM_NOMATCH; + if (*n == '/' && (flags & FNM_FILE_NAME)) + /* `/' cannot be matched. */ + return FNM_NOMATCH; + not = (*p == '!' || (posixly_correct < 0 && *p == '^')); if (not) ++p; @@ -246,9 +250,6 @@ fnmatch (pattern, string, flags) if (c == fn) goto matched; } - else if ((flags & FNM_FILE_NAME) && c == '/') - /* [/] can never match. */ - return FNM_NOMATCH; else if (c == '[' && *p == ':') { /* Leave room for the null. */ diff --git a/posix/globtest.c b/posix/globtest.c index 7008a8b..37b1fd0 100644 --- a/posix/globtest.c +++ b/posix/globtest.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,36 +16,93 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include -#include #include +#include int main (int argc, char *argv[]) { - int i; - int glob_flags = GLOB_NOSORT; - glob_t filenames; + int i, j; + int glob_flags = 0; + glob_t g; + int quotes = 1; - if (argc != 3) - exit (1); - if (chdir (argv[1])) + while ((i = getopt (argc, argv, "bcdegmopqst")) != -1) + switch(i) + { + case 'b': + glob_flags |= GLOB_BRACE; + break; + case 'c': + glob_flags |= GLOB_NOCHECK; + break; + case 'd': + glob_flags |= GLOB_ONLYDIR; + break; + case 'e': + glob_flags |= GLOB_NOESCAPE; + break; + case 'g': + glob_flags |= GLOB_NOMAGIC; + break; + case 'm': + glob_flags |= GLOB_MARK; + break; + case 'o': + glob_flags |= GLOB_DOOFFS; + g.gl_offs = 1; + break; + case 'p': + glob_flags |= GLOB_PERIOD; + break; + case 'q': + quotes = 0; + break; + case 's': + glob_flags |= GLOB_NOSORT; + break; + case 't': + glob_flags |= GLOB_TILDE; + break; + default: + exit (-1); + } + + if (optind >= argc || chdir (argv[optind])) + exit(1); + + j = optind + 1; + if (optind + 1 >= argc) exit (1); - i = glob (argv[2], glob_flags, NULL, &filenames); + /* Do a glob on each remaining argument. */ + for (j = optind + 1; j < argc; j++) { + i = glob (argv[j], glob_flags, NULL, &g); + if (i != 0) + break; + glob_flags |= GLOB_APPEND; + } + + /* Was there an error? */ if (i == GLOB_NOSPACE) puts ("GLOB_NOSPACE"); - else if (i == GLOB_ABEND) - puts ("GLOB_ABEND"); + else if (i == GLOB_ABORTED) + puts ("GLOB_ABORTED"); else if (i == GLOB_NOMATCH) puts ("GLOB_NOMATCH"); - printf ("%sNULL\n", filenames.gl_pathv ? "not " : ""); + /* If we set an offset, fill in the first field. */ + if (glob_flags & GLOB_DOOFFS) + g.gl_pathv[0] = (char *) "abc"; - if (filenames.gl_pathv) + /* Print out the names. Unless otherwise specified, qoute them. */ + if (g.gl_pathv) { - for (i = 0; i < filenames.gl_pathc; ++i) - printf ("`%s'\n", filenames.gl_pathv[i]); + for (i = 0; i < g.gl_pathc; ++i) + printf ("%s%s%s\n", quotes ? "`" : "", g.gl_pathv[i], + quotes ? "'" : ""); } return 0; } diff --git a/posix/globtest.sh b/posix/globtest.sh index d0b78b2..1a417aa 100755 --- a/posix/globtest.sh +++ b/posix/globtest.sh @@ -4,17 +4,28 @@ common_objpfx=$1; shift elf_objpfx=$1; shift rtld_installed_name=$1; shift +# Since we use `osrt' we must make sure to use the same locale everywhere. +LC_ALL=C +export LC_ALL +LANG=C +export LANG + # Create the arena : ${TMPDIR=/tmp} testdir=$TMPDIR/globtest-dir testout=$TMPDIR/globtest-out +testout2=$TMPDIR/globtest-out2 -trap 'rm -fr $testdir $testout' 1 2 3 15 +trap 'rm -fr $testdir $testout $testout2' 1 2 3 15 rm -fr $testdir mkdir $testdir echo 1 > $testdir/file1 echo 2 > $testdir/file2 +echo 3 > $testdir/-file3 +echo 4 > $testdir/~file4 +echo 5 > $testdir/.file5 +echo 6 > $testdir/'*file6' mkdir $testdir/dir1 mkdir $testdir/dir2 echo 1_1 > $testdir/dir1/file1_1 @@ -23,40 +34,130 @@ echo 1_2 > $testdir/dir1/file1_2 # Run some tests. result=0 +# Normal test ${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ ${common_objpfx}posix/globtest "$testdir" "*" | sort > $testout cat <<"EOF" | cmp - $testout || result=1 +`*file6' +`-file3' +`dir1' +`dir2' +`file1' +`file2' +`~file4' +EOF + +# Don't let glob sort it +${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ +${common_objpfx}posix/globtest -s "$testdir" "*" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`*file6' +`-file3' +`dir1' +`dir2' +`file1' +`file2' +`~file4' +EOF + +# Mark directories +${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ +${common_objpfx}posix/globtest -m "$testdir" "*" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`*file6' +`-file3' +`dir1/' +`dir2/' +`file1' +`file2' +`~file4' +EOF + +# Find files starting with . +${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ +${common_objpfx}posix/globtest -p "$testdir" "*" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`*file6' +`-file3' +`.' +`..' +`.file5' `dir1' `dir2' `file1' `file2' -not NULL +`~file4' +EOF + +# Test braces +${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ +${common_objpfx}posix/globtest -b "$testdir" "file{1,2}" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`file1' +`file2' +EOF + +# Test NOCHECK +${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ +${common_objpfx}posix/globtest -c "$testdir" "abc" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`abc' EOF +# Test NOMAGIC without magic characters +${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ +${common_objpfx}posix/globtest -g "$testdir" "abc" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`abc' +EOF + +# Test NOMAGIC with magic characters +${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ +${common_objpfx}posix/globtest -g "$testdir" "abc*" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +GLOB_NOMATCH +EOF + +# Test subdirs correctly ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${common_objpfx}posix/globtest "$testdir" "*/*" | sort > $testout cat <<"EOF" | cmp - $testout || result=1 `dir1/file1_1' `dir1/file1_2' -not NULL EOF +# Test subdirs for invalid names ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${common_objpfx}posix/globtest "$testdir" "*/1" | sort > $testout cat <<"EOF" | cmp - $testout || result=1 GLOB_NOMATCH -NULL EOF +# Test subdirs with wildcard ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${common_objpfx}posix/globtest "$testdir" "*/*1_1" | sort > $testout cat <<"EOF" | cmp - $testout || result=1 `dir1/file1_1' -not NULL +EOF + +# Test subdirs with ? +${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +${common_objpfx}posix/globtest "$testdir" "*/*?_?" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`dir1/file1_1' +`dir1/file1_2' EOF ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ @@ -64,7 +165,6 @@ ${common_objpfx}posix/globtest "$testdir" "*/file1_1" | sort > $testout cat <<"EOF" | cmp - $testout || result=1 `dir1/file1_1' -not NULL EOF ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ @@ -72,7 +172,6 @@ ${common_objpfx}posix/globtest "$testdir" "*-/*" | sort > $testout cat <<"EOF" | cmp - $testout || result=1 GLOB_NOMATCH -NULL EOF ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ @@ -80,11 +179,93 @@ ${common_objpfx}posix/globtest "$testdir" "*-" | sort > $testout cat <<"EOF" | cmp - $testout || result=1 GLOB_NOMATCH -NULL +EOF + +# Test subdirs with ? +${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +${common_objpfx}posix/globtest "$testdir" "*/*?_?" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`dir1/file1_1' +`dir1/file1_2' +EOF + +# Test tilde expansion +#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +#${common_objpfx}posix/globtest -q -t "$testdir" "~" | +#sort >$testout +#echo ~ > $testout2 +#cmp $testout2 $testout || result=1 + +# Test tilde expansion with trailing slash +#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +#${common_objpfx}posix/globtest -q -t "$testdir" "~/" | +#sort > $testout +#echo ~/ > $testout2 +#cmp $testout2 $testout || result=1 + +# Test tilde expansion with username +#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +#${common_objpfx}posix/globtest -q -t "$testdir" "~"$USER | +#sort > $testout +#eval echo ~$USER > $testout2 +#cmp $testout2 $testout || result=1 + +# Tilde expansion shouldn't match a file +#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +#${common_objpfx}posix/globtest -t "$testdir" "~file4" | +#sort > $testout +#cat <<"EOF" | cmp - $testout || result=1 +#GLOB_NOMATCH +#EOF + +# Matching \** should only find *file6 +${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +${common_objpfx}posix/globtest "$testdir" "\**" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`*file6' +EOF + +# ... unless NOESCAPE is used, in which case it shouldn't match anything. +${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +${common_objpfx}posix/globtest -e "$testdir" "\**" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +GLOB_NOMATCH +EOF + +# Try a recursive failed search +${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +${common_objpfx}posix/globtest -e "$testdir" "a*/*" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +GLOB_NOMATCH +EOF + +# Try multiple patterns (GLOB_APPEND) +${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +${common_objpfx}posix/globtest "$testdir" "file1" "*/*" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`dir1/file1_1' +`dir1/file1_2' +`file1' +EOF + +# Try multiple patterns (GLOB_APPEND) with offset (GLOB_DOOFFS) +${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ +${common_objpfx}posix/globtest -o "$testdir" "file1" "*/*" | +sort > $testout +cat <<"EOF" | cmp - $testout || result=1 +`abc' +`dir1/file1_1' +`dir1/file1_2' +`file1' EOF if test $result -eq 0; then - rm -fr $testdir $testout + rm -fr $testdir $testout fi exit $result diff --git a/posix/testfnm.args b/posix/testfnm.args deleted file mode 100644 index 4a52662..0000000 --- a/posix/testfnm.args +++ /dev/null @@ -1 +0,0 @@ -*LIB* lib diff --git a/posix/testfnm.c b/posix/testfnm.c index 3b3aa97..5ab761b 100644 --- a/posix/testfnm.c +++ b/posix/testfnm.c @@ -1,10 +1,39 @@ +#include #include #include "fnmatch.h" +struct { + const char *name; + const char *pattern; + int flags; + int expected; +} tests[] = { + { "lib", "*LIB*", FNM_PERIOD, FNM_NOMATCH }, + { "lib", "*LIB*", FNM_CASEFOLD|FNM_PERIOD, 0 }, + { "a/b", "a[/]b", 0, 0 }, + { "a/b", "a[/]b", FNM_PATHNAME, FNM_NOMATCH }, + { "a/b", "[a-z]/[a-z]", 0, 0 }, +}; + int -main (int c, char *v[]) +main (void) { - printf ("%d\n", fnmatch (v[1], v[2], FNM_PERIOD)); - printf ("%d\n", fnmatch (v[1], v[2], FNM_CASEFOLD|FNM_PERIOD)); - exit (0); + size_t i; + int errors = 0; + + for (i = 0; i < sizeof (tests) / sizeof (*tests); i++) + { + int match; + + match = fnmatch (tests[i].pattern, tests[i].name, tests[i].flags); + if (match != tests[i].expected) + { + printf ("%s %s %s\n", tests[i].pattern, + match == 0 ? "matches" : "does not match", + tests[i].name); + errors++; + } + } + + exit (errors != 0); } -- cgit v1.1