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 ; }