mirror of
https://github.com/ksherlock/mpw.git
synced 2024-11-22 00:32:44 +00:00
improve PBGetCatInfo
This commit is contained in:
parent
3ef7de4b8a
commit
58f4ca4ac6
@ -301,11 +301,18 @@ namespace OS {
|
|||||||
//uint16_t ioVRefNum = memoryReadWord(parm + _ioVRefNum);
|
//uint16_t ioVRefNum = memoryReadWord(parm + _ioVRefNum);
|
||||||
//uint8_t ioFVersNum = memoryReadByte(parm + _ioFVersNum);
|
//uint8_t ioFVersNum = memoryReadByte(parm + _ioFVersNum);
|
||||||
int16_t ioFDirIndex = memoryReadWord(parm + _ioFDirIndex);
|
int16_t ioFDirIndex = memoryReadWord(parm + _ioFDirIndex);
|
||||||
|
uint32_t ioDirID = memoryReadLong(parm + _ioDirID);
|
||||||
|
|
||||||
if (ioFDirIndex <= 0)
|
if (ioFDirIndex == 0)
|
||||||
{
|
{
|
||||||
// based name
|
/*
|
||||||
std::string sname;
|
* If this field contains 0, PBGetCatInfo returns
|
||||||
|
* information about the file or directory whose name is
|
||||||
|
* specified in the ioNamePtr field and that is located in the
|
||||||
|
* directory specified by the ioVRefNum field. (Once again, if
|
||||||
|
* ioVRefNum contains a volume reference number, the specified
|
||||||
|
* directory is that volume's root directory.)
|
||||||
|
*/
|
||||||
|
|
||||||
if (!ioNamePtr)
|
if (!ioNamePtr)
|
||||||
{
|
{
|
||||||
@ -313,23 +320,59 @@ namespace OS {
|
|||||||
return MacOS::bdNamErr;
|
return MacOS::bdNamErr;
|
||||||
}
|
}
|
||||||
|
|
||||||
sname = ToolBox::ReadPString(ioNamePtr, true);
|
std::string sname = ToolBox::ReadPString(ioNamePtr, true);
|
||||||
{
|
|
||||||
uint32_t ioDirID = memoryReadLong(parm + _ioDirID);
|
|
||||||
sname = FSSpecManager::ExpandPath(sname, ioDirID);
|
sname = FSSpecManager::ExpandPath(sname, ioDirID);
|
||||||
}
|
|
||||||
|
|
||||||
Log(" PBGetCatInfo(%s)\n", sname.c_str());
|
Log(" PBGetCatInfo(%s)\n", sname.c_str());
|
||||||
d0 = CatInfoByName(sname, parm);
|
d0 = CatInfoByName(sname, parm);
|
||||||
|
|
||||||
memoryWriteWord(d0, parm + _ioResult);
|
|
||||||
return d0;
|
}
|
||||||
|
|
||||||
|
else if (ioFDirIndex < 0) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this field contains a negative number, PBGetCatInfo ignores the
|
||||||
|
* ioNamePtr field and returns information about the directory specified
|
||||||
|
* in the ioDirID field. If both ioDirID and ioVRefNum are set to 0,
|
||||||
|
* PBGetCatInfo returns information about the current default directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
Log(" PBGetCatInfo(%04x)\n", ioDirID);
|
||||||
|
|
||||||
|
std::string sname = FSSpecManager::PathForID(ioDirID);
|
||||||
|
if (sname.empty()) {
|
||||||
|
|
||||||
|
char buffer[MAXPATHLEN];
|
||||||
|
char *cp;
|
||||||
|
|
||||||
|
cp = getcwd(buffer, sizeof(buffer));
|
||||||
|
sname = cp ? cp : ".";
|
||||||
|
}
|
||||||
|
d0 = CatInfoByName(sname, parm);
|
||||||
|
|
||||||
|
if (ioNamePtr) {
|
||||||
|
std::string basename;
|
||||||
|
auto pos = sname.rfind('/');
|
||||||
|
if (pos == sname.npos) basename = std::move(sname);
|
||||||
|
else basename = sname.substr(pos+1);
|
||||||
|
ToolBox::WritePString(ioNamePtr, basename);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// dirent ish. ioFDirIndex is the 1-based entry.
|
|
||||||
uint32_t ioDirID = memoryReadLong(parm + _ioDirID);
|
/*
|
||||||
|
* If this field contains a positive number, PBGetCatInfo returns
|
||||||
|
* information about the file or directory having that directory index in
|
||||||
|
* the directory specified by the ioVRefNum field. (If ioVRefNum contains a
|
||||||
|
* volume reference number, the specified directory is that volume's root
|
||||||
|
* directory.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
Log(" PBGetCatInfo(%04x, %04x)\n", ioDirID, ioFDirIndex);
|
Log(" PBGetCatInfo(%04x, %04x)\n", ioDirID, ioFDirIndex);
|
||||||
|
|
||||||
@ -375,10 +418,10 @@ namespace OS {
|
|||||||
|
|
||||||
|
|
||||||
d0 = CatInfoByName(sname, parm);
|
d0 = CatInfoByName(sname, parm);
|
||||||
|
}
|
||||||
|
|
||||||
memoryWriteWord(d0, parm + _ioResult);
|
memoryWriteWord(d0, parm + _ioResult);
|
||||||
return d0;
|
return d0;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user