Fix numerous bugs in the Win32 path splitter

This commit is contained in:
Richard Levitte
2005-11-01 07:49:47 +00:00
parent f59463aad3
commit 35a97b4b7b

View File

@@ -307,6 +307,7 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
struct file_st *result = NULL; struct file_st *result = NULL;
enum { IN_NODE, IN_DEVICE, IN_FILE } position; enum { IN_NODE, IN_DEVICE, IN_FILE } position;
const char *start = filename; const char *start = filename;
char last;
if (!filename) if (!filename)
{ {
@@ -337,7 +338,8 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
do do
{ {
switch(filename[0]) last = filename[0];
switch(last)
{ {
case ':': case ':':
if(position != IN_DEVICE) if(position != IN_DEVICE)
@@ -362,10 +364,19 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
start = ++filename; start = ++filename;
result->dir = start; result->dir = start;
} }
else if(position == IN_DEVICE)
{
position = IN_FILE;
filename++;
result->dir = start;
result->dirlen = filename - start;
start = filename;
}
else else
{ {
filename++; filename++;
result->dirlen += filename - start; result->dirlen += filename - start;
start = filename;
} }
break; break;
case '\0': case '\0':
@@ -379,12 +390,19 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
{ {
if (assume_last_is_dir) if (assume_last_is_dir)
{ {
result->devicelen += filename - start; if (position == IN_DEVICE)
{
result->dir = start;
result->dirlen = 0;
}
result->dirlen +=
filename - start;
} }
else else
{ {
result->file = start; result->file = start;
result->filelen = filename - start; result->filelen =
filename - start;
} }
} }
} }
@@ -394,7 +412,7 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
break; break;
} }
} }
while(*filename); while(last);
if(!result->nodelen) result->node = NULL; if(!result->nodelen) result->node = NULL;
if(!result->devicelen) result->device = NULL; if(!result->devicelen) result->device = NULL;
@@ -482,10 +500,13 @@ static char *win32_joiner(DSO *dso, const struct file_st *file_split)
result[offset] = '\\'; offset++; result[offset] = '\\'; offset++;
start = end + 1; start = end + 1;
} }
#if 0 /* Not needed, since the directory converter above already appeneded
a backslash */
if(file_split->predir && (file_split->dir || file_split->file)) if(file_split->predir && (file_split->dir || file_split->file))
{ {
result[offset] = '\\'; offset++; result[offset] = '\\'; offset++;
} }
#endif
start = file_split->dir; start = file_split->dir;
while(file_split->dirlen > (start - file_split->dir)) while(file_split->dirlen > (start - file_split->dir))
{ {
@@ -500,10 +521,13 @@ static char *win32_joiner(DSO *dso, const struct file_st *file_split)
result[offset] = '\\'; offset++; result[offset] = '\\'; offset++;
start = end + 1; start = end + 1;
} }
#if 0 /* Not needed, since the directory converter above already appeneded
a backslash */
if(file_split->dir && file_split->file) if(file_split->dir && file_split->file)
{ {
result[offset] = '\\'; offset++; result[offset] = '\\'; offset++;
} }
#endif
strncpy(&result[offset], file_split->file, strncpy(&result[offset], file_split->file,
file_split->filelen); offset += file_split->filelen; file_split->filelen); offset += file_split->filelen;
result[offset] = '\0'; result[offset] = '\0';
@@ -554,7 +578,7 @@ static char *win32_merger(DSO *dso, const char *filespec1, const char *filespec2
return(NULL); return(NULL);
} }
filespec2_split = win32_splitter(dso, filespec2, 0); filespec2_split = win32_splitter(dso, filespec2, 0);
if (!filespec1_split) if (!filespec2_split)
{ {
DSOerr(DSO_F_WIN32_MERGER, DSOerr(DSO_F_WIN32_MERGER,
ERR_R_MALLOC_FAILURE); ERR_R_MALLOC_FAILURE);