diff options
Diffstat (limited to 'Mac/Compat/nfullpath.c')
-rw-r--r-- | Mac/Compat/nfullpath.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/Mac/Compat/nfullpath.c b/Mac/Compat/nfullpath.c index 94ccc4c..ca027c8 100644 --- a/Mac/Compat/nfullpath.c +++ b/Mac/Compat/nfullpath.c @@ -1,6 +1,5 @@ /* GET FULL PATHNAME OF A FILE. ** Original by Guido, modified by Jack to handle FSSpecs -** (and only tested under MetroWerks, so far) */ #include <string.h> @@ -12,7 +11,6 @@ /* Mac file system parameters */ #define MAXPATH 256 /* Max path name length+1 */ #define SEP ':' /* Separator in path names */ -#define ROOTID 2 /* DirID of a volume's root directory */ /* Macro to find out whether we can do HFS-only calls: */ #define FSFCBLen (* (short *) 0x3f6) @@ -29,45 +27,49 @@ nfullpath(fsp, retbuf) WDPBRec w; VolumeParam v; } pb; - static char cwd[2*MAXPATH]; + char cwd[2*MAXPATH]; unsigned char namebuf[MAXPATH]; short err; int dir; long dirid; - char *next= cwd + sizeof cwd - 1; + char *next = cwd + sizeof cwd - 1; int len; - + int need_sep = 1; if (!hfsrunning()) return -1; - dir = fsp->vRefNum; + dir = fsp->vRefNum; dirid = fsp->parID; /* Stuff the filename into the buffer */ len = fsp->name[0]; *next = '\0'; - next -= len+1; - memcpy(next, &fsp->name[1], len); + next -= len; + memcpy(next, fsp->name+1, len); - for (;;) { - pb.d.ioNamePtr= namebuf; - pb.d.ioVRefNum= dir; - pb.d.ioFDirIndex= -1; - pb.d.ioDrDirID= dirid; + 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) { + if (err != noErr) return err; - } - *--next= SEP; - len= namebuf[0]; + *--next = SEP; + len = namebuf[0]; if ( len + strlen(next) >= MAXPATH ) return -1; next -= len; memcpy(next, (char *)namebuf+1, len); - if (pb.d.ioDrDirID == ROOTID) - break; - dirid= pb.d.ioDrParID; + dirid = pb.d.ioDrParID; + need_sep = 0; } + strcpy(retbuf, next); + if (need_sep) { + next = strchr(retbuf, '\0'); + *next++ = SEP; + *next++ = '\0'; + } return 0; } |