The R Project SVN R

Rev

Rev 59110 | Rev 83820 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 59110 Rev 77337
Line 89... Line 89...
89
#define	BG_QUESTION	L'?'
89
#define	BG_QUESTION	L'?'
90
#define	BG_QUOTE	L'\\'
90
#define	BG_QUOTE	L'\\'
91
#define	BG_RANGE	L'-'
91
#define	BG_RANGE	L'-'
92
#define	BG_RBRACKET	L']'
92
#define	BG_RBRACKET	L']'
93
#define	BG_SEP		L'/'
93
#define	BG_SEP		L'/'
94
#ifdef DOSISH /* true */
94
#ifdef DOSISH /* true, cannot be set to false anymore */
95
#define BG_SEP2		L'\\'
95
#define BG_SEP2		L'\\'
96
#endif
96
#endif
97
#define	BG_STAR		L'*'
97
#define	BG_STAR		L'*'
98
#define	BG_TILDE	L'~'
98
#define	BG_TILDE	L'~'
99
#define	BG_UNDERSCORE	L'_'
99
#define	BG_UNDERSCORE	L'_'
100
#define	BG_LBRACE	L'{'
100
#define	BG_LBRACE	L'{'
101
#define	BG_RBRACE	L'}'
101
#define	BG_RBRACE	L'}'
102
#define	BG_SLASH	L'/'
102
#define	BG_SLASH	L'/'
103
#define	BG_COMMA	L','
103
#define	BG_COMMA	L','
104
 
104
 
105
/* 
-
 
106
   The DOS version set the upper bit of bytes for meta characters.
-
 
107
   Here we set the top bit of a wchar_t, which is safer (but not safe). 
-
 
108
 */
-
 
109
#define	M_QUOTE		0x8000
-
 
110
#define	M_ASCII		0x3fff
-
 
111
#define	M_PROTECT	0x4000
-
 
112
#define	M_MASK		0xffff /* pointless in current setup */
-
 
113
 
105
 
114
#include <stdlib.h>
106
#include <stdlib.h>
115
#include <dirent.h>
107
#include <dirent.h>
116
#include <sys/types.h>
108
#include <sys/types.h>
117
#include <sys/stat.h>
109
#include <sys/stat.h>
Line 122... Line 114...
122
typedef size_t STRLEN;
114
typedef size_t STRLEN;
123
typedef struct _stat Stat_t;
115
typedef struct _stat Stat_t;
124
typedef struct _wdirent Direntry_t;
116
typedef struct _wdirent Direntry_t;
125
 
117
 
126
 
118
 
127
#define	CHAR(c)		((wchar_t)((c) & M_ASCII))
-
 
128
#define	META(c)		((wchar_t)((c) | M_QUOTE))
-
 
129
#define	M_ALL		META(L'*')
-
 
130
#define	M_END		META(L']')
-
 
131
#define	M_NOT		META(L'!')
-
 
132
#define	M_ONE		META(L'?')
-
 
133
#define	M_RNG		META(L'-')
-
 
134
#define	M_SET		META(L'[')
-
 
135
#define	ismeta(c)	(((c) & M_QUOTE) != 0)
-
 
136
 
-
 
137
 
-
 
138
static int	 compare(const void *, const void *);
119
static int	 compare(const void *, const void *);
139
static int	 ci_compare(const void *, const void *);
120
static int	 ci_compare(const void *, const void *);
140
static int	 g_Ctoc(const wchar_t *, wchar_t *, STRLEN);
121
static int	 g_Ctoc(const wchar_t *, wchar_t *, STRLEN);
141
static int	 g_lstat(wchar_t *, Stat_t *, wglob_t *);
122
static int	 g_lstat(wchar_t *, Stat_t *, wglob_t *);
142
static _WDIR	*g_opendir(wchar_t *, wglob_t *);
123
static _WDIR	*g_opendir(wchar_t *, wglob_t *);
Line 156... Line 137...
156
static int	 match(wchar_t *, wchar_t *, wchar_t *, int);
137
static int	 match(wchar_t *, wchar_t *, wchar_t *, int);
157
#ifdef GLOB_DEBUG
138
#ifdef GLOB_DEBUG
158
static void	 qprintf(const char *, wchar_t *);
139
static void	 qprintf(const char *, wchar_t *);
159
#endif /* GLOB_DEBUG */
140
#endif /* GLOB_DEBUG */
160
 
141
 
-
 
142
/* 
-
 
143
   Protected and meta characters are from Unicode Private Use Area.
-
 
144
   The DOS version set the upper bit of bytes for meta characters.
-
 
145
   An earlier wchar_t version set the top bits of wchar_t.
-
 
146
*/
-
 
147
 
-
 
148
#define	M_MASK		0xffff /* pointless in current setup */
-
 
149
 
-
 
150
#define P_LBRACKET  (wchar_t)	0xfdd0
-
 
151
#define P_RBRACKET  (wchar_t)	0xfdd1
-
 
152
#define P_RANGE	    (wchar_t)	0xfdd2
-
 
153
#define P_LBRACE    (wchar_t)	0xfdd3
-
 
154
#define P_RBRACE    (wchar_t)	0xfdd4
-
 
155
#define P_TILDE	    (wchar_t)	0xfdd5
-
 
156
#define P_QUOTE	    (wchar_t)	0xfdd6
-
 
157
#define	M_ALL	    (wchar_t)	0xfdd7
-
 
158
#define	M_END	    (wchar_t)	0xfdd8
-
 
159
#define	M_NOT	    (wchar_t)	0xfdd9
-
 
160
#define	M_ONE	    (wchar_t)	0xfdda
-
 
161
#define	M_RNG	    (wchar_t)	0xfddb
-
 
162
#define	M_SET	    (wchar_t)	0xfddc
-
 
163
 
-
 
164
static wchar_t WC_PROTECT(wchar_t c)
-
 
165
{
-
 
166
    /* []-{}~\ */
-
 
167
 
-
 
168
    switch(c) {
-
 
169
	case BG_LBRACKET: return P_LBRACKET;
-
 
170
	case BG_RBRACKET: return P_RBRACKET;
-
 
171
	case BG_RANGE: return P_RANGE;
-
 
172
	case BG_LBRACE: return P_LBRACE;
-
 
173
	case BG_RBRACE: return P_RBRACE;
-
 
174
	case BG_TILDE: return P_TILDE;
-
 
175
	case BG_QUOTE: return P_QUOTE;
-
 
176
	default:
-
 
177
	    /* not reachable */
-
 
178
	    return c;
-
 
179
    }
-
 
180
}
-
 
181
 
-
 
182
static int ismeta(wchar_t c)
-
 
183
{
-
 
184
    switch(c) {
-
 
185
	case M_ALL:
-
 
186
	case M_END:
-
 
187
	case M_NOT:
-
 
188
	case M_ONE:
-
 
189
	case M_RNG:
-
 
190
	case M_SET:
-
 
191
	    return 1;
-
 
192
	default:
-
 
193
	    return 0;
-
 
194
    }
-
 
195
}
-
 
196
 
-
 
197
static wchar_t CHAR(wchar_t c)
-
 
198
{
-
 
199
    switch(c) {
-
 
200
	case P_LBRACKET: return BG_LBRACKET;
-
 
201
	case P_RBRACKET: return BG_RBRACKET;
-
 
202
	case P_RANGE: return BG_RANGE;
-
 
203
	case P_LBRACE: return BG_LBRACE;
-
 
204
	case P_RBRACE: return BG_RBRACE;
-
 
205
	case P_TILDE: return BG_TILDE;
-
 
206
	case P_QUOTE: return BG_QUOTE;
-
 
207
	case M_ALL: return BG_STAR;
-
 
208
	case M_END: return BG_RBRACKET;
-
 
209
	case M_NOT: return BG_NOT;
-
 
210
	case M_ONE: return BG_QUESTION;
-
 
211
	case M_RNG: return BG_RANGE;
-
 
212
	case M_SET: return BG_LBRACKET;
-
 
213
	default:
-
 
214
	    return c;
-
 
215
    }
-
 
216
}
-
 
217
 
161
int
218
int
162
dos_wglob(const wchar_t *pattern, int flags,
219
dos_wglob(const wchar_t *pattern, int flags,
163
	  int (*errfunc)(const wchar_t *, int), wglob_t *pglob)
220
	  int (*errfunc)(const wchar_t *, int), wglob_t *pglob)
164
{
221
{
165
    const wchar_t *patnext;
222
    const wchar_t *patnext;
Line 231... Line 288...
231
		 * metacharacters []-{}~\
288
		 * metacharacters []-{}~\
232
		 */
289
		 */
233
		if ((c = *patnext++) != L'[' && c != L']' &&
290
		if ((c = *patnext++) != L'[' && c != L']' &&
234
		    c != L'-' && c != L'{' && c != L'}' &&
291
		    c != L'-' && c != L'{' && c != L'}' &&
235
		    c != L'~' && c != L'\\') {
292
		    c != L'~' && c != L'\\') {
-
 
293
		    /* WC_PROTECT has to support all characters above */
236
#else
294
#else
-
 
295
# error DOSISH must be true
237
		if ((c = *patnext++) == BG_EOS) {
296
		if ((c = *patnext++) == BG_EOS) {
238
#endif
297
#endif
239
		    c = BG_QUOTE;
298
		    c = BG_QUOTE;
240
		    --patnext;
299
		    --patnext;
241
		}
300
		}
242
		*bufnext++ = c | M_PROTECT;
301
		*bufnext++ = WC_PROTECT(c);
243
	    } else
302
	    } else
244
		*bufnext++ = c;
303
		*bufnext++ = c;
245
	} else
304
	} else
246
	    while (bufnext < bufend && (c = *patnext++) != BG_EOS)
305
	    while (bufnext < bufend && (c = *patnext++) != BG_EOS)
247
		*bufnext++ = c;
306
		*bufnext++ = c;