strcpy(ret, cwd);
ret[cwdLen] = '/';
strcpy(&ret[cwdLen+1], Path);
-
- // Pre-fill the slash positions
- read = 1; slashNum = 0;
- while( (pos = strpos( &ret[read], '/' )) != -1 && slashNum < MAX_PATH_SLASHES )
- {
- read += pos+1;
- slashOffsets[slashNum++] = pos;
- }
-
- baseLen = cwdLen+1;
}
// Remove . and ..
- read = write = baseLen; // Cwd has already been parsed
+ read = write = 1; // Cwd has already been parsed
for(; read < baseLen+pathLen; read = pos+1)
{
pos = strpos( &ret[read], '/' );
if(pos == -1) pos = baseLen+pathLen;
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) continue;
+ if(slashNum < 2) continue;
// Reverse write pointer
- write = slashOffsets[ slashNum-- ];
+ write = slashOffsets[ --slashNum - 1 ];
continue;
}
}
// Only copy if the positions differ
if(read != write) {
+ Log("write = %i, read = %i", write, read);
memcpy( &ret[write], &ret[read], pos-read+1 );
}
write = pos+1;
// `ret` should now be the absolute path
LEAVE('s', ret);
+ Log("VFS_GetAbsPath: RETURN '%s'", ret);
return ret;
}