/* OS_FPATHNAME -- Map a VFN (virtual filename) into a pathname (filename * specification which is independent of the current directory). */ int os_fpathname ( char *vfn, /* virtual filename */ char *osfn, /* OS filename */ int maxch ) { XCHAR x_vfn[SZ_PATHNAME+1]; XCHAR x_osfn[SZ_PATHNAME+1]; XINT x_maxch = SZ_PATHNAME, x_nchars; if (vfn[0]) os_strupk (vfn2osfn(vfn,0), x_vfn, x_maxch); else x_vfn[0] = 0; if (vfn[0] == '.' && (vfn[1] == EOS || vfn[2] == EOS)) { ZFGCWD (x_osfn, &x_maxch, &x_nchars); os_strupk ((char *)x_osfn, x_osfn, x_maxch); if (vfn[1] == '.') { os_strupk (vfn, x_vfn, x_maxch); ZFSUBD (x_osfn, &x_maxch, x_vfn, &x_nchars); } } else ZFPATH (x_vfn, x_osfn, &x_maxch, &x_nchars); os_strpak (x_osfn, osfn, maxch); return (x_nchars); }
/* ZFPATH -- Return the absolute pathname equivalent of an OSFN. If the null * string is given the OSFN of the current working directory is returned. */ int ZFPATH ( XCHAR *osfn, /* input OS filename [NOT PACKED] */ XCHAR *pathname, /* output pathname [NOT PACKED] */ XINT *maxch, XINT *nchars ) { register char *cp; register XCHAR *ip, *op; register int n = *maxch; PKCHAR cwd[SZ_PATHNAME+1]; extern int ZFGCWD(PKCHAR *outstr, XINT *maxch, XINT *status); op = pathname; for (ip=osfn; *ip == ' '; ip++) ; /* If the OSFN begins with a / it is already an absolute pathname. */ if (*ip != '/') { ZFGCWD (cwd, maxch, nchars); for (cp=(char *)cwd; --n >= 0 && (*op = *cp++); op++) ; } /* Append the filename */ while (--n >= 0 && (*op = *ip++) != XEOS) op++; *op = XEOS; *nchars = (op - pathname); return (XOK); }