mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			75 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;
 | 
						|
}
 |