#include <os/os.h>
#include <wchar.h>
#define PATHSEP '/'
#define PATHSEPSTR L"/"
#define fPathChr(ch) ((ch) == PATHSEP)
wchar_t* wcsbscan(const wchar_t* str, const wchar_t* sub)
{
wchar_t* ch;
for (; *sub; sub++)
{
if ((ch = wcschr(str, *sub)) != NULL)
return ch;
}
return (wchar_t*) str + wcslen(str);
}
//! Construct a path from the root to the specified file
/*!
* Handles ., .. and current directory/drive references correctly
*
* \param src source path for input
* \param dst destination buffer
* \return true if successful
*/
bool fsFullPath(const wchar_t* src, wchar_t* dst)
{
wchar_t *beg = dst;
register wchar_t *p, *p1;
wchar_t d;
/*p = src;
if (src[0] && src[1] == ':')
{
*p = (char) tolower (*p);
p += 2;
}*/
if (!fPathChr (src[0]) || !fPathChr (src[1]))
{
/*d = 0;
if (*src && src[1] == ':')
{
d = (char) (toupper (*src) - 'A' + 1);
src += 2;
}
if (curdir (dst, d))
// invalid drive
return TRUE;*/
wcscpy(dst, procCwd());
//curdir(dst);
/* dst = cur dir on drive d, so now bump across d: */
//dst += 2;
if (*src == '.' && (src[1] == '\0' ||
(fPathChr (src[1]) && src[2] == '\0')))
/* src == "." or ".\", i.e cur dir, we are done */
return true;
}
/*else
src = p;*/
if (fPathChr (*src))
wcscpy(dst, src);
else
{
d = dst[wcslen(dst)-1];
if (!fPathChr (d))
wcscat(dst, PATHSEPSTR);
wcscat(dst, src);
}
p1 = src = dst;
while (*src)
{
p = p1;
p1 = wcsbscan(p, L"\\/");
d = *p1;
*p1++ = 0;
if (!wcscmp(p, L"."))
{
do
{
if (--dst < src)
return false;
} while (!fPathChr (*dst));
}
else if (!wcscmp(p, L".."))
{
do {
if (--dst < src)
return false;
} while (!fPathChr (*dst));
do {
if (--dst < src)
return false;
} while (!fPathChr (*dst));
}
else
{
wcscpy(dst, p);
dst += wcslen(dst);
}
if (fPathChr (d))
d = PATHSEP;
if (!(*dst++ = d))
break;
}
// If '..' was passed in one level above the root dir, beg at this point
// will contain '<drive_letter>:' which will not be treated as a valid
// directory - To account for this, add a '\' character.
//
// Note: This case does not occur if '<drive_letter>:' is passed in.
//
if( wcslen( beg ) == 2 )
{
*( beg + 2 ) = PATHSEP;
*( beg + 3 ) = '\0';
}
//pname (beg);
return true;
}