From fda2e0a378775983d34f4497e66daaf3da1c7c4c Mon Sep 17 00:00:00 2001 From: Charles Lehner Date: Fri, 26 Sep 2014 00:47:12 -0400 Subject: [PATCH 1/4] Add some Files Manager glue functions (#4) --- libretro/glue.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/libretro/glue.c b/libretro/glue.c index 91bc1a836b..f5d1ac9a24 100644 --- a/libretro/glue.c +++ b/libretro/glue.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include pascal Size GetPtrSize(Ptr ptr) { @@ -61,3 +63,60 @@ pascal OSErr Eject (ConstStr63Param volName, short vRefNum) pb.volumeParam.ioVRefNum = vRefNum; return PBEject(&pb); } + +pascal OSErr FSOpen (ConstStr255Param fileName, short vRefNum, short *refNum) +{ + OSErr err; + ParamBlockRec pb; + memset(&pb, 0, sizeof(pb)); + pb.ioParam.ioNamePtr = (StringPtr)fileName; + pb.ioParam.ioVRefNum = vRefNum; + + // Try newer OpenDF first, because it does not open drivers + err = PBOpenDFSync(&pb); + if (err == paramErr) { + // OpenDF not implemented, so use regular Open. + err = PBOpenSync(&pb); + } + + *refNum = pb.ioParam.ioRefNum; + return err; +} + +pascal OSErr OpenDF (ConstStr255Param fileName, short vRefNum, short *refNum) +{ + return FSOpen(fileName, vRefNum, refNum); +} + +pascal OSErr FSClose (short refNum) +{ + ParamBlockRec pb; + memset(&pb, 0, sizeof(pb)); + pb.ioParam.ioRefNum = refNum; + return PBCloseSync(&pb); +} + +pascal OSErr FSRead (short refNum, long *count, void *buffPtr) +{ + OSErr err; + ParamBlockRec pb; + memset(&pb, 0, sizeof(pb)); + pb.ioParam.ioRefNum = refNum; + pb.ioParam.ioBuffer = buffPtr; + pb.ioParam.ioReqCount = *count; + + err = PBReadSync(&pb); + *count = pb.ioParam.ioActCount; + return err; +} + +pascal OSErr GetEOF (short refNum, long *logEOF) +{ + OSErr err; + ParamBlockRec pb; + memset(&pb, 0, sizeof(pb)); + pb.ioParam.ioRefNum = refNum; + err = PBGetEOFSync(&pb); + *logEOF = (long)pb.ioParam.ioMisc; + return err; +} From c6b5221803f11d7ddd01ea6c05338aead96dcfc5 Mon Sep 17 00:00:00 2001 From: Charles Lehner Date: Fri, 26 Sep 2014 01:05:40 -0400 Subject: [PATCH 2/4] Add FSWrite, GetFPos, SetFPos --- libretro/glue.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/libretro/glue.c b/libretro/glue.c index f5d1ac9a24..c9b13a1a12 100644 --- a/libretro/glue.c +++ b/libretro/glue.c @@ -110,6 +110,20 @@ pascal OSErr FSRead (short refNum, long *count, void *buffPtr) return err; } +pascal OSErr FSWrite (short refNum, long *count, const void *buffPtr) +{ + OSErr err; + ParamBlockRec pb; + memset(&pb, 0, sizeof(pb)); + pb.ioParam.ioRefNum = refNum; + pb.ioParam.ioBuffer = (void *)buffPtr; + pb.ioParam.ioReqCount = *count; + + err = PBWriteSync(&pb); + *count = pb.ioParam.ioActCount; + return err; +} + pascal OSErr GetEOF (short refNum, long *logEOF) { OSErr err; @@ -120,3 +134,23 @@ pascal OSErr GetEOF (short refNum, long *logEOF) *logEOF = (long)pb.ioParam.ioMisc; return err; } + +pascal OSErr GetFPos (short refNum, long *filePos) +{ + OSErr err; + ParamBlockRec pb; + pb.ioParam.ioRefNum = refNum; + err = PBGetFPosSync(&pb); + *filePos = pb.ioParam.ioPosOffset; + return err; +} + +pascal OSErr SetFPos (short refNum, short posMode, long posOff) +{ + ParamBlockRec pb; + memset(&pb, 0, sizeof(pb)); + pb.ioParam.ioRefNum = refNum; + pb.ioParam.ioPosMode = posMode; + pb.ioParam.ioPosOffset = posOff; + return PBSetFPosSync(&pb); +} From 3bd859aaa3e3d59fb4c636d5b92cc379c7dc2641 Mon Sep 17 00:00:00 2001 From: Charles Lehner Date: Fri, 26 Sep 2014 01:37:18 -0400 Subject: [PATCH 3/4] Add file Create function --- libretro/glue.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/libretro/glue.c b/libretro/glue.c index c9b13a1a12..0965985b21 100644 --- a/libretro/glue.c +++ b/libretro/glue.c @@ -154,3 +154,26 @@ pascal OSErr SetFPos (short refNum, short posMode, long posOff) pb.ioParam.ioPosOffset = posOff; return PBSetFPosSync(&pb); } + +pascal OSErr Create (ConstStr255Param fileName, short vRefNum, OSType creator, + OSType fileType) +{ + ParamBlockRec pb; + OSErr err; + memset(&pb, 0, sizeof(pb)); + pb.fileParam.ioVRefNum = vRefNum; + pb.fileParam.ioNamePtr = (StringPtr)fileName; + // create the file + err = PBCreateSync(&pb); + if (err != noErr) return err; + // get previous finder info + err = PBGetFInfoSync(&pb); + if (err != noErr) return err; + // clear directory index + pb.fileParam.ioFDirIndex = 0; + // copy finder info words + pb.fileParam.ioFlFndrInfo.fdType = fileType; + pb.fileParam.ioFlFndrInfo.fdCreator = creator; + // save finder info + return PBSetFInfoSync(&pb); +} From 5ec06b06052b57559459fcfb70997f6a8139e683 Mon Sep 17 00:00:00 2001 From: Charles Lehner Date: Fri, 26 Sep 2014 09:53:08 -0400 Subject: [PATCH 4/4] Add SetEOF --- libretro/glue.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libretro/glue.c b/libretro/glue.c index 0965985b21..aa3963faf6 100644 --- a/libretro/glue.c +++ b/libretro/glue.c @@ -135,6 +135,16 @@ pascal OSErr GetEOF (short refNum, long *logEOF) return err; } +pascal OSErr SetEOF (short refNum, long logEOF) +{ + OSErr err; + ParamBlockRec pb; + memset(&pb, 0, sizeof(pb)); + pb.ioParam.ioRefNum = refNum; + pb.ioParam.ioMisc = (Ptr)logEOF; + return PBGetEOFSync(&pb); +} + pascal OSErr GetFPos (short refNum, long *filePos) { OSErr err;