| /* 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; | 
 | } |