Return TypeFunction nameArguments
hzEcodeGetAbsPath(hzString&,const char*,)

Declared in file: hzDirectory.h
Defined in file : hzDirectory.cpp

Function Logic:

0:START 1:rel[0]==(char)47 2:abs 3:Return E_OK 4:rel[0]==(char)126&&rel[1]==(char)47 5:getenv abs abs abs 6:Return E_OK 7:hzString::Clear get_current_dir_name cpDir 8:!cpDir 9:errno==EACCES 10:Return hzwarn(E_NOTFOUND,The current working directory has access issues) 11:errno==ENOENT 12:Return hzwarn(E_NOTFOUND,The current working directory has been unlinked) 13:Return hzwarn(E_NOTFOUND,Unspecified error) 14:!rel||!rel[0] 15:abs free 16:Return E_OK 17:rel[0]==(char)46&&rel[1]==(char)46&&rel[2]==(char)47 18:*i; 19:*i==(char)47 20:j items 21:rel[oset]==(char)46&&rel[oset+1]==(char)46&&rel[oset+2]==(char)47; 22:step>lev 23:free 24:Return E_BADVALUE 25:step; 26:i!=cpDir&&*j!=(char)47; 27:* 28:abs abs abs free 29:Return E_OK

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