summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Sharp <ken.sharp@artifex.com>2013-08-19 15:06:12 +0100
committerChris Liddell <chris.liddell@artifex.com>2013-08-20 10:26:15 +0100
commit167ca10abb0a90c4a28a381223afd6fb80347282 (patch)
treeb41c2685283297d10bd41076f01415f1f3dd3888
parent36c5b40dd44d7ef8de4aeba40c5d6c817882b594 (diff)
downloadghostpdl-167ca10abb0a90c4a28a381223afd6fb80347282.tar.gz
Allow use of '\\' for filenameforall and friends on Windows
The commit to allow recursive directory enumeration f13bfba removed the code which translated '\\' into '\', which could lead to incorrect filenames being returned. This fix restores that functionality, but we still think everyone would be better advised to use the PostScript '/' separator instead, which works as well as '\' does. CLUSTER_UNTESTED
-rw-r--r--gs/base/gp_ntfs.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/gs/base/gp_ntfs.c b/gs/base/gp_ntfs.c
index d0609a874..db028928e 100644
--- a/gs/base/gp_ntfs.c
+++ b/gs/base/gp_ntfs.c
@@ -105,10 +105,11 @@ gs_private_st_ptrs2(st_directory_enum, struct directory_enum_s, "directory_enum"
typedef struct directory_enum_s directory_enum;
struct file_enum_s {
+ char *pattern;
struct directory_enum_s *current;
};
-gs_private_st_ptrs1(st_file_enum, struct file_enum_s, "directory_enum",
- file_enum_enum_ptrs, file_enum_reloc_ptrs, current);
+gs_private_st_ptrs2(st_file_enum, struct file_enum_s, "directory_enum",
+ file_enum_enum_ptrs, file_enum_reloc_ptrs, pattern, current);
static int enumerate_directory_init(gs_memory_t *mem, directory_enum *pden, const char *directory, int dir_size, char *filename, const char *pattern, int pat_size)
{
@@ -173,13 +174,35 @@ gp_enumerate_files_init(const char *pat, uint patlen, gs_memory_t * mem)
}
pfen->current = pden;
+ /* pattern could be allocated as a string, */
+ /* but it's simpler for GC and freeing to allocate it as bytes. */
+ pattern = (char *)gs_alloc_bytes(mem, pat_size,
+ "gp_enumerate_files(pattern)");
+ if (pattern == 0)
+ return 0;
+
+ /* translate the template into a pattern discarding the escape */
+ /* char '\' (not needed by the OS Find...File logic). Note that */
+ /* a final '\' in the string is also discarded. */
+ for (i = 0, j=0; i < patlen; i++) {
+ if (pat[i] == '\\') {
+ i++;
+ if (i == patlen)
+ break; /* '\' at end ignored */
+ }
+ pattern[j++]=pat[i];
+ }
+ pfen->pattern = pattern;
+ pat = pfen->pattern;
+ patlen = j;
+
/* Scan for last path separator to determine 'head_size' (directory part) */
for (i = 0; i < patlen; i++) {
if(pat[i] == '/' || pat[i] == '\\' || pat[i] == ':')
hsize = i + 1;
}
- if (enumerate_directory_init(mem, pden, pat, hsize, NULL, &pat[hsize], patlen - hsize) < 0)
+ if (enumerate_directory_init(mem, pden, pfen->pattern, hsize, NULL, &pat[hsize], patlen - hsize) < 0)
{
gs_free_object(mem, pden, "free directory enumerator on error");
gs_free_object(mem, pfen, "free file enumerator on error");
@@ -347,6 +370,8 @@ gp_enumerate_files_close(file_enum * pfen)
pden = ptenum;
};
gs_free_object(mem, pfen, "gp_enumerate_files_close");
+/* gs_free_object(mem, pfen->pattern,
+ "gp_enumerate_files_close(pattern)");*/
}
/* -------------- Helpers for gp_file_name_combine_generic ------------- */