summaryrefslogtreecommitdiffstats
path: root/Mac/Compat
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Compat')
-rw-r--r--Mac/Compat/nfullpath.c42
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;
}