summaryrefslogtreecommitdiff
path: root/src/JSystem/JUtility/JUTDirectFile.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2023-09-24 13:29:46 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2023-09-24 13:29:46 -0700
commit427136bbd6cc68f7d24599f8ed3bafe276c7a459 (patch)
tree52fed64429eccae37b9cfb90e8b04a6b7bc7d8fa /src/JSystem/JUtility/JUTDirectFile.cpp
parent3994791ee389b53a62358bf30fda4b1aa5fdf1ac (diff)
JUTDirectFile match
Diffstat (limited to 'src/JSystem/JUtility/JUTDirectFile.cpp')
-rw-r--r--src/JSystem/JUtility/JUTDirectFile.cpp123
1 files changed, 113 insertions, 10 deletions
diff --git a/src/JSystem/JUtility/JUTDirectFile.cpp b/src/JSystem/JUtility/JUTDirectFile.cpp
index 7e120f6a..f1966e8c 100644
--- a/src/JSystem/JUtility/JUTDirectFile.cpp
+++ b/src/JSystem/JUtility/JUTDirectFile.cpp
@@ -4,34 +4,137 @@
//
#include "JSystem/JUtility/JUTDirectFile.h"
-#include "dolphin/types.h"
+#include "dolphin/dvd/dvd.h"
+#include "dolphin/os/OS.h"
+#include "global.h"
/* 802CBAD8-802CBBA0 .text fetch32byte__13JUTDirectFileFv */
-void JUTDirectFile::fetch32byte() {
- /* Nonmatching */
+int JUTDirectFile::fetch32byte() {
+ mToRead = mLength - ALIGN_PREV(mPos, 0x20);
+ if (mToRead > 0x800)
+ mToRead = 0x800;
+
+ BOOL interrupt = OSEnableInterrupts();
+ BOOL ret = DVDReadAsyncPrio(&mFileInfo, mSectorStart, ALIGN_NEXT(mToRead, 0x20), ALIGN_PREV(mPos, 0x20), NULL, 2);
+ OSRestoreInterrupts(interrupt);
+
+ if (!ret)
+ return -1;
+
+ interrupt = OSEnableInterrupts();
+ while (true) {
+ if (!DVDGetFileInfoStatus(&mFileInfo))
+ break;
+ }
+ OSRestoreInterrupts(interrupt);
+ return mToRead;
}
/* 802CBBA0-802CBBC4 .text __ct__13JUTDirectFileFv */
JUTDirectFile::JUTDirectFile() {
- /* Nonmatching */
+ mLength = 0;
+ mPos = 0;
+ mToRead = 0;
+ mSectorStart = (u8*)ALIGN_NEXT((u32)mBuffer, 0x20);
+ mIsOpen = false;
}
/* 802CBBC4-802CBC08 .text __dt__13JUTDirectFileFv */
JUTDirectFile::~JUTDirectFile() {
- /* Nonmatching */
+ mIsOpen = false;
}
/* 802CBC08-802CBCA4 .text fopen__13JUTDirectFileFPCc */
-void JUTDirectFile::fopen(const char*) {
- /* Nonmatching */
+bool JUTDirectFile::fopen(const char* pFilename) {
+ if (pFilename == NULL)
+ return false;
+
+ BOOL interrupt = OSEnableInterrupts();
+ BOOL ret = DVDOpen(pFilename, &mFileInfo);
+ OSRestoreInterrupts(interrupt);
+
+ if (!ret) {
+ mIsOpen = false;
+ return false;
+ }
+
+ interrupt = OSEnableInterrupts();
+ mLength = DVDGetLength(&mFileInfo);
+ OSRestoreInterrupts(interrupt);
+ mPos = 0;
+ mIsOpen = true;
+ return true;
}
/* 802CBCA4-802CBD00 .text fclose__13JUTDirectFileFv */
void JUTDirectFile::fclose() {
- /* Nonmatching */
+ if (mIsOpen) {
+ BOOL interrupt = OSEnableInterrupts();
+ DVDClose(&mFileInfo);
+ OSRestoreInterrupts(interrupt);
+ mIsOpen = false;
+ }
}
/* 802CBD00-802CBEB0 .text fgets__13JUTDirectFileFPvi */
-void JUTDirectFile::fgets(void*, int) {
- /* Nonmatching */
+int JUTDirectFile::fgets(void* pBuf, int n) {
+ if (!mIsOpen)
+ return -1;
+
+ if (n == 0)
+ return 0;
+ if (n == 1)
+ return 1;
+ if (pBuf == NULL)
+ return -1;
+ if (mPos >= mLength)
+ return -1;
+
+ u8* pDst = (u8*)pBuf;
+ s32 size = 0;
+
+ while (mPos < mLength) {
+ if (mToRead == 0 && fetch32byte() < 0)
+ return -1;
+
+ u32 readPos = mPos & 0x7FF;
+ u32 bufLeft = mToRead - readPos;
+ if ((size + bufLeft) > (n - 1))
+ bufLeft = n - size - 1;
+
+ BOOL endLine = FALSE;
+ for (u32 i = 0; i < bufLeft; i++) {
+ u8 c = mSectorStart[readPos++];
+ *pDst++ = c;
+
+ if (c == '\n') {
+ endLine = true;
+ bufLeft = i + 1;
+ break;
+ }
+ }
+
+ if (readPos >= 0x800)
+ mToRead = 0;
+
+ if (endLine == TRUE) {
+ *pDst = '\0';
+ mPos += bufLeft;
+ size += bufLeft;
+ break;
+ }
+
+ mPos += bufLeft;
+ size += bufLeft;
+
+ if (size >= (n - 1)) {
+ *pDst = '\0';
+ break;
+ }
+ }
+
+ if (mPos >= mLength)
+ *pDst = '\0';
+
+ return size;
}