char *ret;
int pathLen = strlen(Path);
int read, write;
- int pos, slashNum=0, baseLen;
+ int pos, endLen;
+ int slashNum = 0;
Uint slashOffsets[MAX_PATH_SLASHES];
char *cwd = CFGPTR(CFG_VFS_CWD);
int cwdLen;
// Check if the path is already absolute
if(Path[0] == '/') {
+ endLen = pathLen + 1;
ret = malloc(pathLen + 1);
if(!ret) {
Warning("VFS_GetAbsPath - malloc() returned NULL");
return NULL;
}
strcpy(ret, Path);
- baseLen = 1;
} else {
cwdLen = strlen(cwd);
+ endLen = cwdLen + pathLen + 2;
// Prepend the current directory
- ret = malloc(cwdLen+pathLen+2);
+ ret = malloc(endLen);
strcpy(ret, cwd);
ret[cwdLen] = '/';
strcpy(&ret[cwdLen+1], Path);
// Remove . and ..
read = write = 1; // Cwd has already been parsed
- for(; read < baseLen+pathLen; read = pos+1)
+ for(; read < endLen; read = pos+1)
{
pos = strpos( &ret[read], '/' );
// If we are in the last section, force a break at the end of the itteration
- if(pos == -1) pos = baseLen+pathLen;
+ if(pos == -1) pos = endLen;
else pos += read; // Else, Adjust to absolute
- //Log("pos-read = %i", pos-read);
-
// Check Length
if(pos - read <= 2)
{
- //Log("&ret[read] = '%s'", &ret[read]);
// Current Dir "."
if(strncmp(&ret[read], ".", pos-read) == 0) continue;
// Parent ".."
if(strncmp(&ret[read], "..", pos-read) == 0)
{
// If there is no higher, silently ignore
- if(slashNum < 2) continue;
+ if(slashNum < 1) {
+ write = 1;
+ continue;
+ }
// Reverse write pointer
- write = slashOffsets[ --slashNum - 1 ];
+ write = slashOffsets[ --slashNum ];
continue;
}
}
// Only copy if the positions differ
if(read != write) {
- Log("write = %i, read = %i", write, read);
+ //Log("write = %i, read = %i, pos-read+1 = %i", write, read, pos-read+1);
memcpy( &ret[write], &ret[read], pos-read+1 );
+ //Log("ret = '%s'", ret);
}
- write = pos+1;
+
if(slashNum < MAX_PATH_SLASHES)
- slashOffsets[ slashNum++ ] = pos;
+ slashOffsets[ slashNum++ ] = write;
else {
LOG("Path '%s' has too many elements", Path);
free(ret);
LEAVE('n');
return NULL;
}
+
+ // Increment write pointer
+ write += (pos-read)+1;
}
// `ret` should now be the absolute path
LEAVE('s', ret);
- Log("VFS_GetAbsPath: RETURN '%s'", ret);
+ //Log("VFS_GetAbsPath: RETURN '%s'", ret);
return ret;
}