76 lines
1.4 KiB
C
76 lines
1.4 KiB
C
/* GET FULL PATHNAME OF A FILE.
|
|
** Original by Guido, modified by Jack to handle FSSpecs
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include <Files.h>
|
|
|
|
#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;
|
|
}
|