83
82
gs_memory_t *memory;
85
84
gs_private_st_ptrs1(st_file_enum, struct file_enum_s, "file_enum",
86
file_enum_enum_ptrs, file_enum_reloc_ptrs, pattern);
85
file_enum_enum_ptrs, file_enum_reloc_ptrs, pattern);
88
87
/* Initialize an enumeration. may NEED WORK ON HANDLING * ? \. */
101
100
/* pattern could be allocated as a string, */
102
101
/* but it's simpler for GC and freeing to allocate it as bytes. */
104
103
pattern = (char *)gs_alloc_bytes(mem, pat_size,
105
"gp_enumerate_files(pattern)");
104
"gp_enumerate_files(pattern)");
106
105
if (pattern == 0)
108
107
memcpy(pattern, pat, patlen);
109
108
/* find directory name = header */
110
109
for (i = 0; i < patlen; i++) {
113
if (i + 1 < patlen && pat[i + 1] == '\\')
112
if (i + 1 < patlen && pat[i + 1] == '\\')
121
120
pattern[patlen] = 0;
122
121
pfen->pattern = pattern;
137
136
ULONG cFilenames = 1;
140
/* CAN'T DO IT SO JUST RETURN THE PATTERN. */
141
if (pfen->first_time) {
142
char *pattern = pfen->pattern;
143
uint len = strlen(pattern);
139
/* CAN'T DO IT SO JUST RETURN THE PATTERN. */
140
if (pfen->first_time) {
141
char *pattern = pfen->pattern;
142
uint len = strlen(pattern);
145
pfen->first_time = 0;
148
strcpy(ptr, pattern);
144
pfen->first_time = 0;
147
strcpy(ptr, pattern);
154
153
if (pfen->first_time) {
155
rc = DosFindFirst(pfen->pattern, &pfen->hdir, FILE_NORMAL,
156
&pfen->findbuf, sizeof(pfen->findbuf),
157
&cFilenames, FIL_STANDARD);
158
pfen->first_time = 0;
154
rc = DosFindFirst(pfen->pattern, &pfen->hdir, FILE_NORMAL,
155
&pfen->findbuf, sizeof(pfen->findbuf),
156
&cFilenames, FIL_STANDARD);
157
pfen->first_time = 0;
160
rc = DosFindNext(pfen->hdir, &pfen->findbuf, sizeof(pfen->findbuf),
159
rc = DosFindNext(pfen->hdir, &pfen->findbuf, sizeof(pfen->findbuf),
166
165
if (pfen->head_size + pfen->findbuf.cchName < maxlen) {
167
memcpy(ptr, pfen->pattern, pfen->head_size);
168
strcpy(ptr + pfen->head_size, pfen->findbuf.achName);
169
return pfen->head_size + pfen->findbuf.cchName;
166
memcpy(ptr, pfen->pattern, pfen->head_size);
167
strcpy(ptr + pfen->head_size, pfen->findbuf.achName);
168
return pfen->head_size + pfen->findbuf.cchName;
171
170
if (pfen->head_size >= maxlen)
172
return 0; /* no hope at all */
171
return 0; /* no hope at all */
174
173
memcpy(ptr, pfen->pattern, pfen->head_size);
175
174
strncpy(ptr + pfen->head_size, pfen->findbuf.achName,
176
maxlen - pfen->head_size - 1);
175
maxlen - pfen->head_size - 1);
184
183
gs_memory_t *mem = pfen->memory;
187
DosFindClose(pfen->hdir);
186
DosFindClose(pfen->hdir);
188
187
gs_free_object(mem, pfen->pattern,
189
"gp_enumerate_files_close(pattern)");
188
"gp_enumerate_files_close(pattern)");
190
189
gs_free_object(mem, pfen, "gp_enumerate_files_close");
194
192
/* ------ File naming and accessing ------ */
196
194
/* Create and open a scratch file with a given name prefix. */
208
206
int prefix_length = strlen(prefix);
210
208
if (!gp_file_name_is_absolute(prefix, prefix_length)) {
211
temp = getenv("TMPDIR");
213
temp = getenv("TEMP");
209
temp = getenv("TMPDIR");
211
temp = getenv("TEMP");
216
214
tname = _tempnam(temp, (char *)prefix);
218
if (strlen(tname) > gp_file_name_sizeof - 1) {
220
return 0; /* file name too long */
222
strcpy(fname, tname);
216
if (strlen(tname) > gp_file_name_sizeof - 1) {
218
return 0; /* file name too long */
220
strcpy(fname, tname);
226
224
/* The -7 is for XXXXXX plus a possible final \. */
228
226
int len = gp_file_name_sizeof - prefix_length - 7;
230
228
if (gp_file_name_is_absolute(prefix, prefix_length) ||
231
gp_gettmpdir(fname, &len) != 0)
229
gp_gettmpdir(fname, &len) != 0)
237
/* Prevent X's in path from being converted by mktemp. */
238
for (temp = fname; *temp; temp++)
239
*temp = last = tolower(*temp);
235
/* Prevent X's in path from being converted by mktemp. */
236
for (temp = fname; *temp; temp++)
237
*temp = last = tolower(*temp);
248
246
if (strlen(fname) + prefix_length + 7 >= gp_file_name_sizeof)
249
return 0; /* file name too long */
247
return 0; /* file name too long */
250
248
strcat(fname, prefix);
251
249
strcat(fname, "XXXXXX");
267
265
uint gp_file_name_root(const char *fname, uint len)
272
270
if (len > 1 && fname[0] == '\\' && fname[1] == '\\') {
273
/* A network path: "\\server\share\" */
271
/* A network path: "\\server\share\" */
276
for (i = 2; i < len; i++)
277
if (fname[i] == '\\' || fname[i] == '/')
274
for (i = 2; i < len; i++)
275
if (fname[i] == '\\' || fname[i] == '/')
282
280
} else if (fname[0] == '/' || fname[0] == '\\') {
283
/* Absolute with no drive. */
281
/* Absolute with no drive. */
285
283
} else if (len > 1 && fname[1] == ':') {
286
/* Absolute with a drive. */
287
i = (len > 2 && (fname[2] == '/' || fname[2] == '\\') ? 3 : 2);
284
/* Absolute with a drive. */
285
i = (len > 2 && (fname[2] == '/' || fname[2] == '\\') ? 3 : 2);
292
290
uint gs_file_name_check_separator(const char *fname, int len, const char *item)
294
if (fname[0] == '/' || fname[0] == '\\')
292
if (fname[0] == '/' || fname[0] == '\\')
296
294
} else if (len < 0) {
297
if (fname[-1] == '/' || fname[-1] == '\\')
295
if (fname[-1] == '/' || fname[-1] == '\\')
335
333
gp_file_name_combine_result
336
gp_file_name_combine(const char *prefix, uint plen, const char *fname, uint flen,
337
bool no_sibling, char *buffer, uint *blen)
334
gp_file_name_combine(const char *prefix, uint plen, const char *fname, uint flen,
335
bool no_sibling, char *buffer, uint *blen)
339
return gp_file_name_combine_generic(prefix, plen,
340
fname, flen, no_sibling, buffer, blen);
337
return gp_file_name_combine_generic(prefix, plen,
338
fname, flen, no_sibling, buffer, blen);