/* GET FULL PATHNAME OF A FILE. ** Original by Guido, modified by Jack to handle FSSpecs */ #include #include #include "nfullpath.h" /* Mac file system parameters */ #define MAXPATH 256 /* Max path name length+1 */ #define SEP ':' /* Separator in path names */ /* Macro to find out whether we can do HFS-only calls: */ #define FSFCBLen (* (short *) 0x3f6) #define hfsrunning() (FSFCBLen > 0) int nfullpath(fsp, retbuf) FSSpec *fsp; char *retbuf; { union { HFileInfo f; DirInfo d; WDPBRec w; VolumeParam v; } pb; char cwd[2*MAXPATH]; unsigned char namebuf[MAXPATH]; short err; int dir; long dirid; char *next = cwd + sizeof cwd - 1; int len; int need_sep = 1; if (!hfsrunning()) return -1; dir = fsp->vRefNum; dirid = fsp->parID; /* Stuff the filename into the buffer */ len = fsp->name[0]; *next = '\0'; next -= len; memcpy(next, fsp->name+1, len); while (dirid != fsRtParID) { pb.d.ioNamePtr = namebuf; pb.d.ioVRefNum = dir; pb.d.ioFDirIndex = -1; pb.d.ioDrDirID = dirid; err= PBGetCatInfo((CInfoPBPtr)&pb.d, 0); if (err != noErr) return err; *--next = SEP; len = namebuf[0]; if ( len + strlen(next) >= MAXPATH ) return -1; next -= len; memcpy(next, (char *)namebuf+1, len); dirid = pb.d.ioDrParID; need_sep = 0; } strcpy(retbuf, next); if (need_sep) { next = strchr(retbuf, '\0'); *next++ = SEP; *next++ = '\0'; } return 0; }