| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | GetAbsPath | (hzString&,const char*,) |
Declared in file: hzDirectory.h
Defined in file : hzDirectory.cpp
Function Logic:
Function body:
hzEcode GetAbsPath (hzString& abs, const char* rel)
{
_hzfunc("GetCurrDir") ;
char* cpDir ;
if (rel[0]== CHAR_FWSLASH)
{ abs = rel ; return E_OK ; }
if (rel[0]== CHAR_TILDA && rel[1]== CHAR_FWSLASH)
{
abs = getenv("HOME") ;
abs += "/" ;
abs += (rel + 2);
return E_OK ;
}
abs.Clear() ;
cpDir = get_current_dir_name() ;
if (!cpDir)
{
if (errno == EACCES) return hzwarn(E_NOTFOUND, "The current working directory has access issues") ;
if (errno == ENOENT) return hzwarn(E_NOTFOUND, "The current working directory has been unlinked") ;
return hzwarn(E_NOTFOUND, "Unspecified error") ;
}
if (!rel || !rel[0])
{
abs = cpDir ;
free(cpDir) ;
return E_OK ;
}
char* i ;
char* j ;
uint32_t lev ;
uint32_t oset ;
uint32_t step ;
if (rel[0]== CHAR_PERIOD && rel[1]== CHAR_PERIOD && rel[2]== CHAR_FWSLASH)
{
for (lev = 0,i = cpDir ; *i ; i++)
{
if (*i == CHAR_FWSLASH)
{ j = i ; lev++ ; }
}
for (step = 1,oset = 3; rel[oset] == CHAR_PERIOD && rel[oset+1]== CHAR_PERIOD && rel[oset+2]== CHAR_FWSLASH ; step++, oset += 3);
if (step > lev)
{ free(cpDir) ; return E_BADVALUE ; }
for (; step ; step--)
{
for (j-- ; i != cpDir && *j != CHAR_FWSLASH ; j--) ;
}
*j = 0;
}
abs = cpDir ;
abs += "/" ;
abs += rel ;
free(cpDir) ;
return E_OK ;
}