tim@hoptoad.uucp (Tim Maroney) (12/12/87)
You're quite correct, Justin. The disadvantage of modular source code is
that, six months later, you forget how the function works. Here is my
source code for getting a full path name. fullname is a return parameter
which receives the full name of the (file, volume, dirID) triplet.
void
GetFullName(fullname, file, volume, dirID)
char *fullname, *file;
word volume;
longword dirID;
{
char buffer[256], buf2[256], *name, *accum, *tmp;
HVolumeParam hvp;
DirInfo di;
hvp.ioNamePtr = (StringPtr)fullname;
hvp.ioVRefNum = volume;
hvp.ioVolIndex = 0;
PBHGetVInfo(&hvp, false);
fullname[++fullname[0]] = ':';
p2cstr(fullname);
if (FSFCBLen > 0) {
/* runnning HFS */
if (hvp.ioVSigWord != 0xd2d7) {
/* HFS volume, use CurDirStore and GetCatInfo */
name = buffer;
accum = buf2;
accum[0] = '\0';
while (dirID != 2) {
di.ioNamePtr = name;
di.ioVRefNum = volume;
di.ioFDirIndex = -1;
di.ioDrDirID = dirID;
PBGetCatInfo(&di, false);
name[++name[0]] = ':';
p2cstr(name);
strcat(name, accum);
tmp = accum;
accum = name;
name = tmp;
dirID = di.ioDrParID;
}
strcat(fullname, accum);
}
}
/* concatenate the volume and file names */
strcat(fullname, file);
}
and as an extra, this-week-only bonus, here's what I call on Standard File's
vRefNum to get a (volume, directory) pair:
void
GetVolDir(invol, volume, directory)
word invol, *volume;
longword *directory;
{
WDPBRec wdpb;
String(70) name;
if (FSFCBLen < 0) {
*volume = invol;
*directory = 2;
return;
}
/* in HFS, it's a working directory */
wdpb.ioNamePtr = &name;
wdpb.ioVRefNum = invol;
wdpb.ioWDIndex = 0;
wdpb.ioWDProcID = 0;
wdpb.ioWDVRefNum = 0;
PBGetWDInfo(&wdpb, false);
*volume = wdpb.ioWDVRefNum;
*directory = wdpb.ioWDDirID;
}
Sorry for the earlier misinformation.
--
Tim Maroney, {ihnp4,sun,well,ptsfa,lll-crg}!hoptoad!tim; hoptoad!tim@lll-crg
"What's bad? What's the use of turning?
In Hell I'll be there a-burning!
Meanwhile, think of what I'm earning
All on account of my name." - Bill Sykes, "Oliver"