annotate glob/glob.c @ 4720:e759d01692db ss-2-1-53

[project @ 2004-01-23 04:13:37 by jwe]
author jwe
date Fri, 23 Jan 2004 04:13:37 +0000
parents 66d7394f5822
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1 /* Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
2
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
3 This library is free software; you can redistribute it and/or
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
4 modify it under the terms of the GNU Library General Public License as
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
5 published by the Free Software Foundation; either version 2 of the
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
6 License, or (at your option) any later version.
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
7
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
8 This library is distributed in the hope that it will be useful,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
11 Library General Public License for more details.
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
12
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
13 You should have received a copy of the GNU Library General Public
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
14 License along with this library; see the file COPYING.LIB. If not,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
15 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
16 Boston, MA 02111-1307, USA. */
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
17
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
18 /* AIX requires this to be the first thing in the file. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
19 #if defined _AIX && !defined __GNUC__
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
20 #pragma alloca
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
21 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
22
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
24 # include <config.h>
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
25 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
26
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
27 /* Enable GNU extensions in glob.h. */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
28 #ifndef _GNU_SOURCE
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
29 # define _GNU_SOURCE 1
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
30 #endif
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
31
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
32 #include <errno.h>
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
33 #include <sys/types.h>
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
34 #include <sys/stat.h>
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
35
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
36 /* Outcomment the following line for production quality code. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
37 /* #define NDEBUG 1 */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
38 #include <assert.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
39
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
40 #include <stdio.h> /* Needed on stupid SunOS for assert. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
41
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
42
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
43 /* Comment out all this code if we are using the GNU C Library, and are not
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
44 actually compiling the library itself. This code is part of the GNU C
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
45 Library, but also included in many other GNU distributions. Compiling
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
46 and linking in this code is a waste when using the GNU C library
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
47 (especially if it is a shared library). Rather than having every GNU
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
48 program understand `configure --with-gnu-libc' and omit the object files,
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
49 it is simpler to just do this in the source for each such file. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
50
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
51 #define GLOB_INTERFACE_VERSION 1
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
52 #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
53 # include <gnu-versions.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
54 # if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
55 # define ELIDE_CODE
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
56 # endif
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
57 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
58
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
59 #ifndef ELIDE_CODE
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
60
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
61 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
62 # include <stddef.h>
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
63 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
64
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
65 #if defined HAVE_UNISTD_H || defined _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
66 # include <unistd.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
67 # ifndef POSIX
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
68 # ifdef _POSIX_VERSION
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
69 # define POSIX
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
70 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
71 # endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
72 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
73
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
74 #if !defined _AMIGA && !defined VMS && !defined WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
75 # include <pwd.h>
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
76 #endif
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
77
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
78 #if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
79 extern int errno;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
80 #endif
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
81 #ifndef __set_errno
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
82 # define __set_errno(val) errno = (val)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
83 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
84
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
85 #ifndef NULL
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
86 # define NULL 0
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
87 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
88
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
89
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
90 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
91 # include <dirent.h>
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
92 # define NAMLEN(dirent) strlen((dirent)->d_name)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
93 #else
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
94 # define dirent direct
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
95 # define NAMLEN(dirent) (dirent)->d_namlen
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
96 # ifdef HAVE_SYS_NDIR_H
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
97 # include <sys/ndir.h>
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
98 # endif
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
99 # ifdef HAVE_SYS_DIR_H
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
100 # include <sys/dir.h>
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
101 # endif
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
102 # ifdef HAVE_NDIR_H
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
103 # include <ndir.h>
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
104 # endif
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
105 # ifdef HAVE_VMSDIR_H
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
106 # include "vmsdir.h"
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
107 # endif /* HAVE_VMSDIR_H */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
108 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
109
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
110
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
111 /* In GNU systems, <dirent.h> defines this macro for us. */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
112 #ifdef _D_NAMLEN
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
113 # undef NAMLEN
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
114 # define NAMLEN(d) _D_NAMLEN(d)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
115 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
116
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
117 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
118 if the `d_type' member for `struct dirent' is available. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
119 #ifdef _DIRENT_HAVE_D_TYPE
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
120 # define HAVE_D_TYPE 1
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
121 #endif
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
122
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
123
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
124 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
125 /* Posix does not require that the d_ino field be present, and some
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
126 systems do not provide it. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
127 # define REAL_DIR_ENTRY(dp) 1
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
128 #else
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
129 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
130 #endif /* POSIX */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
131
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
132 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
133 # include <stdlib.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
134 # include <string.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
135 # define ANSI_STRING
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
136 #else /* No standard headers. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
137
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
138 extern char *getenv ();
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
139
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
140 # ifdef HAVE_STRING_H
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
141 # include <string.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
142 # define ANSI_STRING
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
143 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
144 # include <strings.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
145 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
146 # ifdef HAVE_MEMORY_H
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
147 # include <memory.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
148 # endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
149
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
150 extern char *malloc (), *realloc ();
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
151 extern void free ();
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
152
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
153 extern void qsort ();
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
154 extern void abort (), exit ();
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
155
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
156 #endif /* Standard headers. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
157
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
158 #ifndef ANSI_STRING
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
159
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
160 # ifndef bzero
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
161 extern void bzero ();
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
162 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
163 # ifndef bcopy
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
164 extern void bcopy ();
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
165 # endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
166
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
167 # define memcpy(d, s, n) bcopy ((s), (d), (n))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
168 # define strrchr rindex
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
169 /* memset is only used for zero here, but let's be paranoid. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
170 # define memset(s, better_be_zero, n) \
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
171 ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
172 #endif /* Not ANSI_STRING. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
173
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
174 #if !defined HAVE_STRCOLL && !defined _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
175 # define strcoll strcmp
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
176 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
177
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
178 #if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
179 # define HAVE_MEMPCPY 1
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
180 # undef mempcpy
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
181 # define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
182 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
183
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
184 #ifndef __GNU_LIBRARY__
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
185 # ifdef __GNUC__
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
186 __inline
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
187 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
188 # ifndef __SASC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
189 # ifdef WINDOWS32
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
190 static void *
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
191 # else
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
192 static char *
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
193 # endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
194 my_realloc (p, n)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
195 char *p;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
196 unsigned int n;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
197 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
198 /* These casts are the for sake of the broken Ultrix compiler,
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
199 which warns of illegal pointer combinations otherwise. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
200 if (p == NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
201 return (char *) malloc (n);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
202 return (char *) realloc (p, n);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
203 }
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
204 # define realloc my_realloc
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
205 # endif /* __SASC */
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
206 #endif /* __GNU_LIBRARY__ */
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
207
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
208
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
209 #if !defined __alloca && !defined __GNU_LIBRARY__
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
210
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
211 # ifdef __GNUC__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
212 # undef alloca
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
213 # define alloca(n) __builtin_alloca (n)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
214 # else /* Not GCC. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
215 # ifdef HAVE_ALLOCA_H
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
216 # include <alloca.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
217 # else /* Not HAVE_ALLOCA_H. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
218 # ifndef _AIX
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
219 # ifdef WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
220 # include <malloc.h>
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
221 # else
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
222 extern char *alloca ();
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
223 # endif /* WINDOWS32 */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
224 # endif /* Not _AIX. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
225 # endif /* sparc or HAVE_ALLOCA_H. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
226 # endif /* GCC. */
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
227
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
228 # define __alloca alloca
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
229
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
230 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
231
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
232 #ifndef __GNU_LIBRARY__
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
233 # define __stat stat
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
234 # ifdef STAT_MACROS_BROKEN
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
235 # undef S_ISDIR
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
236 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
237 # ifndef S_ISDIR
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
238 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
239 # endif
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
240 #endif
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
241
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
242 #ifdef _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
243 # undef strdup
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
244 # define strdup(str) __strdup (str)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
245 # define sysconf(id) __sysconf (id)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
246 # define closedir(dir) __closedir (dir)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
247 # define opendir(name) __opendir (name)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
248 # define readdir(str) __readdir (str)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
249 # define getpwnam_r(name, bufp, buf, len, res) \
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
250 __getpwnam_r (name, bufp, buf, len, res)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
251 # ifndef __stat
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
252 # define __stat(fname, buf) __xstat (_STAT_VER, fname, buf)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
253 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
254 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
255
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
256 #if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
257 # undef size_t
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
258 # define size_t unsigned int
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
259 #endif
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
260
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
261 /* Some system header files erroneously define these.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
262 We want our own definitions from <fnmatch.h> to take precedence. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
263 #ifndef __GNU_LIBRARY__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
264 # undef FNM_PATHNAME
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
265 # undef FNM_NOESCAPE
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
266 # undef FNM_PERIOD
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
267 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
268 #include <fnmatch.h>
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
269
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
270 /* Some system header files erroneously define these.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
271 We want our own definitions from <glob.h> to take precedence. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
272 #ifndef __GNU_LIBRARY__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
273 # undef GLOB_ERR
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
274 # undef GLOB_MARK
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
275 # undef GLOB_NOSORT
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
276 # undef GLOB_DOOFFS
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
277 # undef GLOB_NOCHECK
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
278 # undef GLOB_APPEND
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
279 # undef GLOB_NOESCAPE
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
280 # undef GLOB_PERIOD
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
281 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
282 #include <glob.h>
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
283
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
284 #ifdef HAVE_GETLOGIN_R
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
285 extern int getlogin_r __P ((char *, size_t));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
286 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
287 extern char *getlogin __P ((void));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
288 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
289
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
290 static
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
291 #if __GNUC__ - 0 >= 2
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
292 inline
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
293 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
294 const char *next_brace_sub __P ((const char *begin));
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
295 static int glob_in_dir __P ((const char *pattern, const char *directory,
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
296 int flags,
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
297 int (*errfunc) (const char *, int),
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
298 glob_t *pglob));
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
299 static int prefix_array __P ((const char *prefix, char **array, size_t n));
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
300 static int collated_compare __P ((const __ptr_t, const __ptr_t));
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
301
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
302 #ifdef VMS
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
303 /* these compilers like prototypes */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
304 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
305 int __glob_pattern_p (const char *pattern, int quote);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
306 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
307 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
308
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
309 /* Find the end of the sub-pattern in a brace expression. We define
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
310 this as an inline function if the compiler permits. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
311 static
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
312 #if __GNUC__ - 0 >= 2
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
313 inline
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
314 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
315 const char *
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
316 next_brace_sub (begin)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
317 const char *begin;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
318 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
319 unsigned int depth = 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
320 const char *cp = begin;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
321
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
322 while (1)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
323 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
324 if (depth == 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
325 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
326 if (*cp != ',' && *cp != '}' && *cp != '\0')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
327 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
328 if (*cp == '{')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
329 ++depth;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
330 ++cp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
331 continue;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
332 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
333 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
334 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
335 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
336 while (*cp != '\0' && (*cp != '}' || depth > 0))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
337 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
338 if (*cp == '}')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
339 --depth;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
340 ++cp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
341 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
342 if (*cp == '\0')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
343 /* An incorrectly terminated brace expression. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
344 return NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
345
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
346 continue;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
347 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
348 break;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
349 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
350
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
351 return cp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
352 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
353
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
354 /* Do glob searching for PATTERN, placing results in PGLOB.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
355 The bits defined above may be set in FLAGS.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
356 If a directory cannot be opened or read and ERRFUNC is not nil,
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
357 it is called with the pathname that caused the error, and the
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
358 `errno' value from the failing call; if it returns non-zero
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
359 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
360 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
361 Otherwise, `glob' returns zero. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
362 int
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
363 glob (pattern, flags, errfunc, pglob)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
364 const char *pattern;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
365 int flags;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
366 int (*errfunc) __P ((const char *, int));
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
367 glob_t *pglob;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
368 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
369 const char *filename;
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
370 const char *dirname;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
371 size_t dirlen;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
372 int status;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
373 int oldcount;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
374
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
375 if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
376 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
377 __set_errno (EINVAL);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
378 return -1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
379 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
380
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
381 if (flags & GLOB_BRACE)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
382 {
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
383 const char *begin = strchr (pattern, '{');
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
384 if (begin != NULL)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
385 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
386 /* Allocate working buffer large enough for our work. Note that
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
387 we have at least an opening and closing brace. */
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
388 int firstc;
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
389 char *alt_start;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
390 const char *p;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
391 const char *next;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
392 const char *rest;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
393 size_t rest_len;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
394 #ifdef __GNUC__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
395 char onealt[strlen (pattern) - 1];
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
396 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
397 char *onealt = (char *) malloc (strlen (pattern) - 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
398 if (onealt == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
399 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
400 if (!(flags & GLOB_APPEND))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
401 globfree (pglob);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
402 return GLOB_NOSPACE;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
403 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
404 #endif
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
405
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
406 /* We know the prefix for all sub-patterns. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
407 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
408 alt_start = mempcpy (onealt, pattern, begin - pattern);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
409 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
410 memcpy (onealt, pattern, begin - pattern);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
411 alt_start = &onealt[begin - pattern];
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
412 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
413
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
414 /* Find the first sub-pattern and at the same time find the
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
415 rest after the closing brace. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
416 next = next_brace_sub (begin + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
417 if (next == NULL)
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
418 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
419 /* It is an illegal expression. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
420 #ifndef __GNUC__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
421 free (onealt);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
422 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
423 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
424 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
425
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
426 /* Now find the end of the whole brace expression. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
427 rest = next;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
428 while (*rest != '}')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
429 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
430 rest = next_brace_sub (rest + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
431 if (rest == NULL)
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
432 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
433 /* It is an illegal expression. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
434 #ifndef __GNUC__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
435 free (onealt);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
436 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
437 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
438 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
439 }
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
440 /* Please note that we now can be sure the brace expression
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
441 is well-formed. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
442 rest_len = strlen (++rest) + 1;
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
443
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
444 /* We have a brace expression. BEGIN points to the opening {,
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
445 NEXT points past the terminator of the first element, and END
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
446 points past the final }. We will accumulate result names from
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
447 recursive runs for each brace alternative in the buffer using
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
448 GLOB_APPEND. */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
449
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
450 if (!(flags & GLOB_APPEND))
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
451 {
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
452 /* This call is to set a new vector, so clear out the
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
453 vector so we can append to it. */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
454 pglob->gl_pathc = 0;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
455 pglob->gl_pathv = NULL;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
456 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
457 firstc = pglob->gl_pathc;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
458
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
459 p = begin + 1;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
460 while (1)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
461 {
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
462 int result;
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
463
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
464 /* Construct the new glob expression. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
465 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
466 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
467 #else
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
468 memcpy (alt_start, p, next - p);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
469 memcpy (&alt_start[next - p], rest, rest_len);
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
470 #endif
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
471
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
472 result = glob (onealt,
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
473 ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
474 | GLOB_APPEND), errfunc, pglob);
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
475
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
476 /* If we got an error, return it. */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
477 if (result && result != GLOB_NOMATCH)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
478 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
479 #ifndef __GNUC__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
480 free (onealt);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
481 #endif
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
482 if (!(flags & GLOB_APPEND))
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
483 globfree (pglob);
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
484 return result;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
485 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
486
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
487 if (*next == '}')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
488 /* We saw the last entry. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
489 break;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
490
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
491 p = next + 1;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
492 next = next_brace_sub (p);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
493 assert (next != NULL);
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
494 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
495
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
496 #ifndef __GNUC__
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
497 free (onealt);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
498 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
499
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
500 if (pglob->gl_pathc != firstc)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
501 /* We found some entries. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
502 return 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
503 else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
504 return GLOB_NOMATCH;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
505 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
506 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
507
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
508 /* Find the filename. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
509 filename = strrchr (pattern, '/');
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
510 #if defined __MSDOS__ || defined WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
511 /* The case of "d:pattern". Since `:' is not allowed in
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
512 file names, we can safely assume that wherever it
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
513 happens in pattern, it signals the filename part. This
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
514 is so we could some day support patterns like "[a-z]:foo". */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
515 if (filename == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
516 filename = strchr (pattern, ':');
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
517 #endif /* __MSDOS__ || WINDOWS32 */
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
518 if (filename == NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
519 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
520 /* This can mean two things: a simple name or "~name". The later
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
521 case is nothing but a notation for a directory. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
522 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
523 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
524 dirname = pattern;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
525 dirlen = strlen (pattern);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
526
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
527 /* Set FILENAME to NULL as a special flag. This is ugly but
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
528 other solutions would require much more code. We test for
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
529 this special case below. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
530 filename = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
531 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
532 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
533 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
534 filename = pattern;
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
535 #ifdef _AMIGA
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
536 dirname = "";
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
537 #else
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
538 dirname = ".";
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
539 #endif
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
540 dirlen = 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
541 }
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
542 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
543 else if (filename == pattern)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
544 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
545 /* "/pattern". */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
546 dirname = "/";
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
547 dirlen = 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
548 ++filename;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
549 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
550 else
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
551 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
552 char *newp;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
553 dirlen = filename - pattern;
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
554 #if defined __MSDOS__ || defined WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
555 if (*filename == ':'
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
556 || (filename > pattern + 1 && filename[-1] == ':'))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
557 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
558 char *drive_spec;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
559
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
560 ++dirlen;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
561 drive_spec = (char *) __alloca (dirlen + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
562 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
563 *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
564 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
565 memcpy (drive_spec, pattern, dirlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
566 drive_spec[dirlen] = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
567 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
568 /* For now, disallow wildcards in the drive spec, to
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
569 prevent infinite recursion in glob. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
570 if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
571 return GLOB_NOMATCH;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
572 /* If this is "d:pattern", we need to copy `:' to DIRNAME
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
573 as well. If it's "d:/pattern", don't remove the slash
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
574 from "d:/", since "d:" and "d:/" are not the same.*/
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
575 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
576 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
577 newp = (char *) __alloca (dirlen + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
578 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
579 *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
580 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
581 memcpy (newp, pattern, dirlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
582 newp[dirlen] = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
583 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
584 dirname = newp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
585 ++filename;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
586
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
587 if (filename[0] == '\0'
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
588 #if defined __MSDOS__ || defined WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
589 && dirname[dirlen - 1] != ':'
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
590 && (dirlen < 3 || dirname[dirlen - 2] != ':'
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
591 || dirname[dirlen - 1] != '/')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
592 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
593 && dirlen > 1)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
594 /* "pattern/". Expand "pattern", appending slashes. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
595 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
596 int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
597 if (val == 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
598 pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
599 | (flags & GLOB_MARK));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
600 return val;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
601 }
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
602 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
603
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
604 if (!(flags & GLOB_APPEND))
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
605 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
606 pglob->gl_pathc = 0;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
607 pglob->gl_pathv = NULL;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
608 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
609
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
610 oldcount = pglob->gl_pathc;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
611
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
612 #ifndef VMS
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
613 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
614 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
615 if (dirname[1] == '\0' || dirname[1] == '/')
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
616 {
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
617 /* Look up home directory. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
618 #ifdef VMS
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
619 /* This isn't obvious, RTLs of DECC and VAXC know about "HOME" */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
620 const char *home_dir = getenv ("SYS$LOGIN");
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
621 #else
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
622 const char *home_dir = getenv ("HOME");
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
623 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
624 # ifdef _AMIGA
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
625 if (home_dir == NULL || home_dir[0] == '\0')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
626 home_dir = "SYS:";
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
627 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
628 # ifdef WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
629 if (home_dir == NULL || home_dir[0] == '\0')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
630 home_dir = "c:/users/default"; /* poor default */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
631 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
632 # ifdef VMS
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
633 /* Again, this isn't obvious, if "HOME" isn't known "SYS$LOGIN" should be set */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
634 if (home_dir == NULL || home_dir[0] == '\0')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
635 home_dir = "SYS$DISK:[]";
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
636 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
637 if (home_dir == NULL || home_dir[0] == '\0')
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
638 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
639 int success;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
640 char *name;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
641 # if defined HAVE_GETLOGIN_R || defined _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
642 size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
643
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
644 if (buflen == 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
645 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
646 a moderate value. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
647 buflen = 20;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
648 name = (char *) __alloca (buflen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
649
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
650 success = getlogin_r (name, buflen) >= 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
651 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
652 success = (name = getlogin ()) != NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
653 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
654 if (success)
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
655 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
656 struct passwd *p;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
657 # if defined HAVE_GETPWNAM_R || defined _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
658 size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
659 char *pwtmpbuf;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
660 struct passwd pwbuf;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
661 int save = errno;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
662
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
663 if (pwbuflen == -1)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
664 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
665 Try a moderate value. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
666 pwbuflen = 1024;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
667 pwtmpbuf = (char *) __alloca (pwbuflen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
668
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
669 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
670 != 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
671 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
672 if (errno != ERANGE)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
673 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
674 p = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
675 break;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
676 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
677 pwbuflen *= 2;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
678 pwtmpbuf = (char *) __alloca (pwbuflen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
679 __set_errno (save);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
680 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
681 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
682 p = getpwnam (name);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
683 # endif
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
684 if (p != NULL)
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
685 home_dir = p->pw_dir;
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
686 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
687 }
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
688 if (home_dir == NULL || home_dir[0] == '\0')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
689 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
690 if (flags & GLOB_TILDE_CHECK)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
691 return GLOB_NOMATCH;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
692 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
693 home_dir = "~"; /* No luck. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
694 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
695 # endif /* VMS */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
696 # endif /* WINDOWS32 */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
697 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
698 /* Now construct the full directory. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
699 if (dirname[1] == '\0')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
700 dirname = home_dir;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
701 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
702 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
703 char *newp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
704 size_t home_len = strlen (home_dir);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
705 newp = (char *) __alloca (home_len + dirlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
706 # ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
707 mempcpy (mempcpy (newp, home_dir, home_len),
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
708 &dirname[1], dirlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
709 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
710 memcpy (newp, home_dir, home_len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
711 memcpy (&newp[home_len], &dirname[1], dirlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
712 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
713 dirname = newp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
714 }
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
715 }
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
716 # if !defined _AMIGA && !defined WINDOWS32 && !defined VMS
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
717 else
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
718 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
719 char *end_name = strchr (dirname, '/');
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
720 const char *user_name;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
721 const char *home_dir;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
722
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
723 if (end_name == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
724 user_name = dirname + 1;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
725 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
726 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
727 char *newp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
728 newp = (char *) __alloca (end_name - dirname);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
729 # ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
730 *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
731 = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
732 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
733 memcpy (newp, dirname + 1, end_name - dirname);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
734 newp[end_name - dirname - 1] = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
735 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
736 user_name = newp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
737 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
738
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
739 /* Look up specific user's home directory. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
740 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
741 struct passwd *p;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
742 # if defined HAVE_GETPWNAM_R || defined _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
743 size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
744 char *pwtmpbuf;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
745 struct passwd pwbuf;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
746 int save = errno;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
747
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
748 if (buflen == -1)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
749 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
750 moderate value. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
751 buflen = 1024;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
752 pwtmpbuf = (char *) __alloca (buflen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
753
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
754 while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
755 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
756 if (errno != ERANGE)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
757 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
758 p = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
759 break;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
760 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
761 buflen *= 2;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
762 pwtmpbuf = __alloca (buflen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
763 __set_errno (save);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
764 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
765 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
766 p = getpwnam (user_name);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
767 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
768 if (p != NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
769 home_dir = p->pw_dir;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
770 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
771 home_dir = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
772 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
773 /* If we found a home directory use this. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
774 if (home_dir != NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
775 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
776 char *newp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
777 size_t home_len = strlen (home_dir);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
778 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
779 newp = (char *) __alloca (home_len + rest_len + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
780 # ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
781 *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
782 end_name, rest_len)) = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
783 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
784 memcpy (newp, home_dir, home_len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
785 memcpy (&newp[home_len], end_name, rest_len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
786 newp[home_len + rest_len] = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
787 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
788 dirname = newp;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
789 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
790 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
791 if (flags & GLOB_TILDE_CHECK)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
792 /* We have to regard it as an error if we cannot find the
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
793 home directory. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
794 return GLOB_NOMATCH;
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
795 }
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
796 # endif /* Not Amiga && not WINDOWS32 && not VMS. */
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
797 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
798 #endif /* Not VMS. */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
799
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
800 /* Now test whether we looked for "~" or "~NAME". In this case we
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
801 can give the answer now. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
802 if (filename == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
803 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
804 struct stat st;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
805
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
806 /* Return the directory if we don't check for error or if it exists. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
807 if ((flags & GLOB_NOCHECK)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
808 || (((flags & GLOB_ALTDIRFUNC)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
809 ? (*pglob->gl_stat) (dirname, &st)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
810 : __stat (dirname, &st)) == 0
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
811 && S_ISDIR (st.st_mode)))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
812 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
813 pglob->gl_pathv
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
814 = (char **) realloc (pglob->gl_pathv,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
815 (pglob->gl_pathc +
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
816 ((flags & GLOB_DOOFFS) ?
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
817 pglob->gl_offs : 0) +
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
818 1 + 1) *
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
819 sizeof (char *));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
820 if (pglob->gl_pathv == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
821 return GLOB_NOSPACE;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
822
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
823 if (flags & GLOB_DOOFFS)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
824 while (pglob->gl_pathc < pglob->gl_offs)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
825 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
826
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
827 #if defined HAVE_STRDUP || defined _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
828 pglob->gl_pathv[pglob->gl_pathc] = strdup (dirname);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
829 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
830 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
831 size_t len = strlen (dirname) + 1;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
832 char *dircopy = malloc (len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
833 if (dircopy != NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
834 pglob->gl_pathv[pglob->gl_pathc] = memcpy (dircopy, dirname,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
835 len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
836 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
837 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
838 if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
839 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
840 free (pglob->gl_pathv);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
841 return GLOB_NOSPACE;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
842 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
843 pglob->gl_pathv[++pglob->gl_pathc] = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
844 pglob->gl_flags = flags;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
845
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
846 return 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
847 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
848
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
849 /* Not found. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
850 return GLOB_NOMATCH;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
851 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
852
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
853 if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
854 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
855 /* The directory name contains metacharacters, so we
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
856 have to glob for the directory, and then glob for
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
857 the pattern in each directory found. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
858 glob_t dirs;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
859 register int i;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
860
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
861 status = glob (dirname,
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
862 ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
863 | GLOB_NOSORT | GLOB_ONLYDIR),
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
864 errfunc, &dirs);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
865 if (status != 0)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
866 return status;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
867
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
868 /* We have successfully globbed the preceding directory name.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
869 For each name we found, call glob_in_dir on it and FILENAME,
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
870 appending the results to PGLOB. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
871 for (i = 0; i < dirs.gl_pathc; ++i)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
872 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
873 int old_pathc;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
874
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
875 #ifdef SHELL
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
876 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
877 /* Make globbing interruptible in the bash shell. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
878 extern int interrupt_state;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
879
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
880 if (interrupt_state)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
881 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
882 globfree (&dirs);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
883 globfree (&files);
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
884 return GLOB_ABORTED;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
885 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
886 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
887 #endif /* SHELL. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
888
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
889 old_pathc = pglob->gl_pathc;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
890 status = glob_in_dir (filename, dirs.gl_pathv[i],
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
891 ((flags | GLOB_APPEND)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
892 & ~(GLOB_NOCHECK | GLOB_ERR)),
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
893 errfunc, pglob);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
894 if (status == GLOB_NOMATCH)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
895 /* No matches in this directory. Try the next. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
896 continue;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
897
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
898 if (status != 0)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
899 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
900 globfree (&dirs);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
901 globfree (pglob);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
902 return status;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
903 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
904
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
905 /* Stick the directory on the front of each name. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
906 if (prefix_array (dirs.gl_pathv[i],
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
907 &pglob->gl_pathv[old_pathc],
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
908 pglob->gl_pathc - old_pathc))
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
909 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
910 globfree (&dirs);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
911 globfree (pglob);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
912 return GLOB_NOSPACE;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
913 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
914 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
915
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
916 flags |= GLOB_MAGCHAR;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
917
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
918 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
919 But if we have not found any matching entry and thie GLOB_NOCHECK
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
920 flag was set we must return the list consisting of the disrectory
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
921 names followed by the filename. */
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
922 if (pglob->gl_pathc == oldcount)
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
923 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
924 /* No matches. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
925 if (flags & GLOB_NOCHECK)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
926 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
927 size_t filename_len = strlen (filename) + 1;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
928 char **new_pathv;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
929 struct stat st;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
930
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
931 /* This is an pessimistic guess about the size. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
932 pglob->gl_pathv
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
933 = (char **) realloc (pglob->gl_pathv,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
934 (pglob->gl_pathc +
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
935 ((flags & GLOB_DOOFFS) ?
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
936 pglob->gl_offs : 0) +
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
937 dirs.gl_pathc + 1) *
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
938 sizeof (char *));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
939 if (pglob->gl_pathv == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
940 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
941 globfree (&dirs);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
942 return GLOB_NOSPACE;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
943 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
944
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
945 if (flags & GLOB_DOOFFS)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
946 while (pglob->gl_pathc < pglob->gl_offs)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
947 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
948
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
949 for (i = 0; i < dirs.gl_pathc; ++i)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
950 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
951 const char *dir = dirs.gl_pathv[i];
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
952 size_t dir_len = strlen (dir);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
953
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
954 /* First check whether this really is a directory. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
955 if (((flags & GLOB_ALTDIRFUNC)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
956 ? (*pglob->gl_stat) (dir, &st) : __stat (dir, &st)) != 0
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
957 || !S_ISDIR (st.st_mode))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
958 /* No directory, ignore this entry. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
959 continue;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
960
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
961 pglob->gl_pathv[pglob->gl_pathc] = malloc (dir_len + 1
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
962 + filename_len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
963 if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
964 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
965 globfree (&dirs);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
966 globfree (pglob);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
967 return GLOB_NOSPACE;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
968 }
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
969
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
970 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
971 mempcpy (mempcpy (mempcpy (pglob->gl_pathv[pglob->gl_pathc],
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
972 dir, dir_len),
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
973 "/", 1),
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
974 filename, filename_len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
975 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
976 memcpy (pglob->gl_pathv[pglob->gl_pathc], dir, dir_len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
977 pglob->gl_pathv[pglob->gl_pathc][dir_len] = '/';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
978 memcpy (&pglob->gl_pathv[pglob->gl_pathc][dir_len + 1],
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
979 filename, filename_len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
980 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
981 ++pglob->gl_pathc;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
982 }
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
983
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
984 pglob->gl_pathv[pglob->gl_pathc] = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
985 pglob->gl_flags = flags;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
986
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
987 /* Now we know how large the gl_pathv vector must be. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
988 new_pathv = (char **) realloc (pglob->gl_pathv,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
989 ((pglob->gl_pathc + 1)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
990 * sizeof (char *)));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
991 if (new_pathv != NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
992 pglob->gl_pathv = new_pathv;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
993 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
994 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
995 return GLOB_NOMATCH;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
996 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
997
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
998 globfree (&dirs);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
999 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1000 else
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1001 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1002 status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1003 if (status != 0)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1004 return status;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1005
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1006 if (dirlen > 0)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1007 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1008 /* Stick the directory on the front of each name. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1009 int ignore = oldcount;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1010
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1011 if ((flags & GLOB_DOOFFS) && ignore < pglob->gl_offs)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1012 ignore = pglob->gl_offs;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1013
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1014 if (prefix_array (dirname,
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1015 &pglob->gl_pathv[ignore],
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1016 pglob->gl_pathc - ignore))
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1017 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1018 globfree (pglob);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1019 return GLOB_NOSPACE;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1020 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1021 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1022 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1023
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1024 if (flags & GLOB_MARK)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1025 {
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1026 /* Append slashes to directory names. */
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1027 int i;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1028 struct stat st;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1029 for (i = oldcount; i < pglob->gl_pathc; ++i)
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1030 if (((flags & GLOB_ALTDIRFUNC)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1031 ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1032 : __stat (pglob->gl_pathv[i], &st)) == 0
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1033 && S_ISDIR (st.st_mode))
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1034 {
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1035 size_t len = strlen (pglob->gl_pathv[i]) + 2;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1036 char *new = realloc (pglob->gl_pathv[i], len);
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1037 if (new == NULL)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1038 {
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1039 globfree (pglob);
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1040 return GLOB_NOSPACE;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1041 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1042 strcpy (&new[len - 2], "/");
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1043 pglob->gl_pathv[i] = new;
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1044 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1045 }
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1046
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1047 if (!(flags & GLOB_NOSORT))
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1048 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1049 /* Sort the vector. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1050 int non_sort = oldcount;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1051
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1052 if ((flags & GLOB_DOOFFS) && pglob->gl_offs > oldcount)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1053 non_sort = pglob->gl_offs;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1054
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1055 qsort ((__ptr_t) &pglob->gl_pathv[non_sort],
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1056 pglob->gl_pathc - non_sort,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1057 sizeof (char *), collated_compare);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1058 }
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1059
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1060 return 0;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1061 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1062
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1063
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1064 /* Free storage allocated in PGLOB by a previous `glob' call. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1065 void
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1066 globfree (pglob)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1067 register glob_t *pglob;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1068 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1069 if (pglob->gl_pathv != NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1070 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1071 register int i;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1072 for (i = 0; i < pglob->gl_pathc; ++i)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1073 if (pglob->gl_pathv[i] != NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1074 free ((__ptr_t) pglob->gl_pathv[i]);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1075 free ((__ptr_t) pglob->gl_pathv);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1076 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1077 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1078
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1079
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1080 /* Do a collated comparison of A and B. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1081 static int
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1082 collated_compare (a, b)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1083 const __ptr_t a;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1084 const __ptr_t b;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1085 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1086 const char *const s1 = *(const char *const * const) a;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1087 const char *const s2 = *(const char *const * const) b;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1088
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1089 if (s1 == s2)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1090 return 0;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1091 if (s1 == NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1092 return 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1093 if (s2 == NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1094 return -1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1095 return strcoll (s1, s2);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1096 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1097
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1098
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1099 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1100 elements in place. Return nonzero if out of memory, zero if successful.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1101 A slash is inserted between DIRNAME and each elt of ARRAY,
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1102 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1103 static int
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1104 prefix_array (dirname, array, n)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1105 const char *dirname;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1106 char **array;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1107 size_t n;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1108 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1109 register size_t i;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1110 size_t dirlen = strlen (dirname);
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1111 #if defined __MSDOS__ || defined WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1112 int sep_char = '/';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1113 # define DIRSEP_CHAR sep_char
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1114 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1115 # define DIRSEP_CHAR '/'
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1116 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1117
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1118 if (dirlen == 1 && dirname[0] == '/')
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1119 /* DIRNAME is just "/", so normal prepending would get us "//foo".
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1120 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1121 dirlen = 0;
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1122 #if defined __MSDOS__ || defined WINDOWS32
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1123 else if (dirlen > 1)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1124 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1125 if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1126 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1127 --dirlen;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1128 else if (dirname[dirlen - 1] == ':')
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1129 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1130 /* DIRNAME is "d:". Use `:' instead of `/'. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1131 --dirlen;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1132 sep_char = ':';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1133 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1134 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1135 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1136
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1137 for (i = 0; i < n; ++i)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1138 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1139 size_t eltlen = strlen (array[i]) + 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1140 char *new = (char *) malloc (dirlen + 1 + eltlen);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1141 if (new == NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1142 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1143 while (i > 0)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1144 free ((__ptr_t) array[--i]);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1145 return 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1146 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1147
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1148 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1149 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1150 char *endp = (char *) mempcpy (new, dirname, dirlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1151 *endp++ = DIRSEP_CHAR;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1152 mempcpy (endp, array[i], eltlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1153 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1154 #else
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1155 memcpy (new, dirname, dirlen);
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1156 new[dirlen] = DIRSEP_CHAR;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1157 memcpy (&new[dirlen + 1], array[i], eltlen);
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1158 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1159 free ((__ptr_t) array[i]);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1160 array[i] = new;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1161 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1162
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1163 return 0;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1164 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1165
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1166
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1167 /* We must not compile this function twice. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1168 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1169 /* Return nonzero if PATTERN contains any metacharacters.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1170 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1171 int
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1172 __glob_pattern_p (pattern, quote)
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1173 const char *pattern;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1174 int quote;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1175 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1176 register const char *p;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1177 int open = 0;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1178
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1179 for (p = pattern; *p != '\0'; ++p)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1180 switch (*p)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1181 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1182 case '?':
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1183 case '*':
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1184 return 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1185
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1186 case '\\':
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1187 if (quote && p[1] != '\0')
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1188 ++p;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1189 break;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1190
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1191 case '[':
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1192 open = 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1193 break;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1194
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1195 case ']':
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1196 if (open)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1197 return 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1198 break;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1199 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1200
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1201 return 0;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1202 }
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1203 # ifdef _LIBC
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1204 weak_alias (__glob_pattern_p, glob_pattern_p)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1205 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1206 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1207
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1208
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1209 /* Like `glob', but PATTERN is a final pathname component,
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1210 and matches are searched for in DIRECTORY.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1211 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1212 The GLOB_APPEND flag is assumed to be set (always appends). */
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1213 static int
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1214 glob_in_dir (pattern, directory, flags, errfunc, pglob)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1215 const char *pattern;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1216 const char *directory;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1217 int flags;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1218 int (*errfunc) __P ((const char *, int));
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1219 glob_t *pglob;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1220 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1221 __ptr_t stream = NULL;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1222
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1223 struct globlink
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1224 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1225 struct globlink *next;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1226 char *name;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1227 };
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1228 struct globlink *names = NULL;
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1229 size_t nfound;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1230 int meta;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1231 int save;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1232
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1233 #ifdef VMS
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1234 if (*directory == 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1235 directory = "[]";
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1236 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1237 meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1238 if (meta == 0)
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1239 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1240 if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1241 /* We need not do any tests. The PATTERN contains no meta
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1242 characters and we must not return an error therefore the
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1243 result will always contain exactly one name. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1244 flags |= GLOB_NOCHECK;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1245 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1246 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1247 /* Since we use the normal file functions we can also use stat()
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1248 to verify the file is there. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1249 struct stat st;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1250 size_t patlen = strlen (pattern);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1251 size_t dirlen = strlen (directory);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1252 char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1253
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1254 # ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1255 mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1256 "/", 1),
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1257 pattern, patlen + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1258 # else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1259 memcpy (fullname, directory, dirlen);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1260 fullname[dirlen] = '/';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1261 memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1262 # endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1263 if (((flags & GLOB_ALTDIRFUNC)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1264 ? (*pglob->gl_stat) (fullname, &st)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1265 : __stat (fullname, &st)) == 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1266 /* We found this file to be existing. Now tell the rest
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1267 of the function to copy this name into the result. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1268 flags |= GLOB_NOCHECK;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1269 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1270
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1271 nfound = 0;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1272 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1273 else
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1274 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1275 if (pattern[0] == '\0')
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1276 {
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1277 /* This is a special case for matching directories like in
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1278 "*a/". */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1279 names = (struct globlink *) __alloca (sizeof (struct globlink));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1280 names->name = (char *) malloc (1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1281 if (names->name == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1282 goto memory_error;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1283 names->name[0] = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1284 names->next = NULL;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1285 nfound = 1;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1286 meta = 0;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1287 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1288 else
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1289 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1290 stream = ((flags & GLOB_ALTDIRFUNC)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1291 ? (*pglob->gl_opendir) (directory)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1292 : (__ptr_t) opendir (directory));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1293 if (stream == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1294 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1295 if (errno != ENOTDIR
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1296 && ((errfunc != NULL && (*errfunc) (directory, errno))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1297 || (flags & GLOB_ERR)))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1298 return GLOB_ABORTED;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1299 nfound = 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1300 meta = 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1301 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1302 else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1303 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1304 int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1305 | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1306 #if defined _AMIGA || defined VMS
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1307 | FNM_CASEFOLD
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1308 #endif
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1309 );
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1310 nfound = 0;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1311 flags |= GLOB_MAGCHAR;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1312
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1313 while (1)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1314 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1315 const char *name;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1316 size_t len;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1317 struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1318 ? (*pglob->gl_readdir) (stream)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1319 : readdir ((DIR *) stream));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1320 if (d == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1321 break;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1322 if (! REAL_DIR_ENTRY (d))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1323 continue;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1324
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1325 #ifdef HAVE_D_TYPE
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1326 /* If we shall match only directories use the information
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1327 provided by the dirent call if possible. */
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1328 if ((flags & GLOB_ONLYDIR)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1329 && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1330 continue;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1331 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1332
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1333 name = d->d_name;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1334
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1335 if (fnmatch (pattern, name, fnm_flags) == 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1336 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1337 struct globlink *new = (struct globlink *)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1338 __alloca (sizeof (struct globlink));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1339 len = NAMLEN (d);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1340 new->name = (char *) malloc (len + 1);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1341 if (new->name == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1342 goto memory_error;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1343 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1344 *((char *) mempcpy ((__ptr_t) new->name, name, len))
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1345 = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1346 #else
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1347 memcpy ((__ptr_t) new->name, name, len);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1348 new->name[len] = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1349 #endif
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1350 new->next = names;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1351 names = new;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1352 ++nfound;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1353 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1354 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1355 }
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1356 }
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1357 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1358
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1359 if (nfound == 0 && (flags & GLOB_NOCHECK))
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1360 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1361 size_t len = strlen (pattern);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1362 nfound = 1;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1363 names = (struct globlink *) __alloca (sizeof (struct globlink));
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1364 names->next = NULL;
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1365 names->name = (char *) malloc (len + 1);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1366 if (names->name == NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1367 goto memory_error;
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1368 #ifdef HAVE_MEMPCPY
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1369 *((char *) mempcpy (names->name, pattern, len)) = '\0';
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1370 #else
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1371 memcpy (names->name, pattern, len);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1372 names->name[len] = '\0';
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1373 #endif
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1374 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1375
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1376 if (nfound != 0)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1377 {
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1378 pglob->gl_pathv
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1379 = (char **) realloc (pglob->gl_pathv,
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1380 (pglob->gl_pathc +
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1381 ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1382 nfound + 1) *
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1383 sizeof (char *));
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1384 if (pglob->gl_pathv == NULL)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1385 goto memory_error;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1386
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1387 if (flags & GLOB_DOOFFS)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1388 while (pglob->gl_pathc < pglob->gl_offs)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1389 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1390
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1391 for (; names != NULL; names = names->next)
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1392 pglob->gl_pathv[pglob->gl_pathc++] = names->name;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1393 pglob->gl_pathv[pglob->gl_pathc] = NULL;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1394
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1395 pglob->gl_flags = flags;
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1396 }
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1397
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1398 save = errno;
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1399 if (stream != NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1400 {
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1401 if (flags & GLOB_ALTDIRFUNC)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1402 (*pglob->gl_closedir) (stream);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1403 else
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1404 closedir ((DIR *) stream);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1405 }
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1406 __set_errno (save);
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1407
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1408 return nfound == 0 ? GLOB_NOMATCH : 0;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1409
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1410 memory_error:
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1411 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1412 int save = errno;
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1413 if (flags & GLOB_ALTDIRFUNC)
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1414 (*pglob->gl_closedir) (stream);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1415 else
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1416 closedir ((DIR *) stream);
4096
66d7394f5822 [project @ 2002-10-09 18:47:16 by jwe]
jwe
parents: 2755
diff changeset
1417 __set_errno (save);
1313
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1418 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1419 while (names != NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1420 {
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1421 if (names->name != NULL)
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1422 free ((__ptr_t) names->name);
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1423 names = names->next;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1424 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1425 return GLOB_NOSPACE;
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1426 }
f0dcdcc9a780 [project @ 1995-06-25 18:42:38 by jwe]
jwe
parents:
diff changeset
1427
2755
655b1615eb54 [project @ 1997-02-26 19:21:14 by jwe]
jwe
parents: 1315
diff changeset
1428 #endif /* Not ELIDE_CODE. */