Files
tww/src/JSystem/JUtility/JUTDirectFile.cpp
T
Jasper St. Pierre 427136bbd6 JUTDirectFile match
2023-09-24 13:29:46 -07:00

141 lines
3.2 KiB
C++

//
// Generated by dtk
// Translation Unit: JUTDirectFile.cpp
//
#include "JSystem/JUtility/JUTDirectFile.h"
#include "dolphin/dvd/dvd.h"
#include "dolphin/os/OS.h"
#include "global.h"
/* 802CBAD8-802CBBA0 .text fetch32byte__13JUTDirectFileFv */
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() {
mLength = 0;
mPos = 0;
mToRead = 0;
mSectorStart = (u8*)ALIGN_NEXT((u32)mBuffer, 0x20);
mIsOpen = false;
}
/* 802CBBC4-802CBC08 .text __dt__13JUTDirectFileFv */
JUTDirectFile::~JUTDirectFile() {
mIsOpen = false;
}
/* 802CBC08-802CBCA4 .text fopen__13JUTDirectFileFPCc */
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() {
if (mIsOpen) {
BOOL interrupt = OSEnableInterrupts();
DVDClose(&mFileInfo);
OSRestoreInterrupts(interrupt);
mIsOpen = false;
}
}
/* 802CBD00-802CBEB0 .text fgets__13JUTDirectFileFPvi */
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;
}