mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
Initial version of FSSpec and Alias code. Non-functional as of now.
This commit is contained in:
parent
d50e4e1c54
commit
84fa5ecfff
3 changed files with 261 additions and 0 deletions
76
Mac/Compat/nfullpath.c
Normal file
76
Mac/Compat/nfullpath.c
Normal file
|
@ -0,0 +1,76 @@
|
|||
/* GET FULL PATHNAME OF A FILE.
|
||||
** Original by Guido, modified by Jack to handle FSSpecs
|
||||
** (and only tested under MetroWerks, so far)
|
||||
*/
|
||||
|
||||
#if defined(MPW) || defined(__MWERKS__)
|
||||
#include <Files.h>
|
||||
#endif
|
||||
#ifdef THINK_C_PRE_5_0
|
||||
#include <HFS.h>
|
||||
#endif
|
||||
|
||||
#include "nfullpath.h"
|
||||
|
||||
/* 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)
|
||||
#define hfsrunning() (FSFCBLen > 0)
|
||||
|
||||
int
|
||||
nfullpath(fsp, retbuf)
|
||||
FSSpec *fsp;
|
||||
char *retbuf;
|
||||
{
|
||||
union {
|
||||
HFileInfo f;
|
||||
DirInfo d;
|
||||
WDPBRec w;
|
||||
VolumeParam v;
|
||||
} pb;
|
||||
static char cwd[2*MAXPATH];
|
||||
unsigned char namebuf[MAXPATH];
|
||||
short err;
|
||||
int dir;
|
||||
long dirid;
|
||||
char *next= cwd + sizeof cwd - 1;
|
||||
int len;
|
||||
|
||||
|
||||
if (!hfsrunning())
|
||||
return -1;
|
||||
|
||||
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);
|
||||
|
||||
for (;;) {
|
||||
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);
|
||||
if (pb.d.ioDrDirID == ROOTID)
|
||||
break;
|
||||
dirid= pb.d.ioDrParID;
|
||||
}
|
||||
strcpy(retbuf, next);
|
||||
return 0;
|
||||
}
|
1
Mac/Compat/nfullpath.h
Normal file
1
Mac/Compat/nfullpath.h
Normal file
|
@ -0,0 +1 @@
|
|||
int nfullpath(FSSpec *, char *); /* Generate full path from fsspec */
|
Loading…
Add table
Add a link
Reference in a new issue