mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-30 02:58:57 -04:00
141 lines
3.2 KiB
C++
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;
|
|
}
|