mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-06-13 13:16:23 -04:00
f9380b3e05
* d_a_obj_carry work, SETUP_ACTOR macro * rm headers, add script * progress * macro rename, consistent spacing
77 lines
2.3 KiB
C
77 lines
2.3 KiB
C
// Translation Unit: utils/common/CircleBuffer
|
|
|
|
#include "TRK_MINNOW_DOLPHIN/utils/common/CircleBuffer.h"
|
|
#include "dolphin/types.h"
|
|
|
|
/* 803726A0-803727A8 36CFE0 0108+00 0/0 2/2 0/0 .text CircleBufferReadBytes */
|
|
s32 CircleBufferReadBytes(CircleBuffer* cb, u8* buf, u32 size) {
|
|
int temp;
|
|
|
|
if (size > cb->mBytesToRead) {
|
|
return -1;
|
|
}
|
|
MWEnterCriticalSection(&cb->mCriticalSection);
|
|
temp = cb->field_0xc - (cb->field_0x0 - cb->field_0x8);
|
|
if (size < temp) {
|
|
memcpy(buf, cb->field_0x0, size);
|
|
cb->field_0x0 += size;
|
|
} else {
|
|
memcpy(buf, cb->field_0x0, temp);
|
|
memcpy(buf + temp, cb->field_0x8, size - temp);
|
|
cb->field_0x0 = cb->field_0x8 + size - temp;
|
|
}
|
|
|
|
if (cb->field_0xc == (cb->field_0x0 - cb->field_0x8)) {
|
|
cb->field_0x0 = cb->field_0x8;
|
|
}
|
|
|
|
cb->mBytesToWrite += size;
|
|
cb->mBytesToRead -= size;
|
|
MWExitCriticalSection(&cb->mCriticalSection);
|
|
return 0;
|
|
}
|
|
|
|
/* 803727A8-803728B0 36D0E8 0108+00 0/0 4/4 0/0 .text CircleBufferWriteBytes */
|
|
s32 CircleBufferWriteBytes(CircleBuffer* cb, u8* buf, u32 size) {
|
|
s32 temp;
|
|
|
|
if (size > cb->mBytesToWrite) {
|
|
return -1;
|
|
}
|
|
MWEnterCriticalSection(&cb->mCriticalSection);
|
|
temp = cb->field_0xc - (cb->field_0x4 - cb->field_0x8);
|
|
if (temp >= size) {
|
|
memcpy(cb->field_0x4, buf, size);
|
|
cb->field_0x4 += size;
|
|
} else {
|
|
memcpy(cb->field_0x4, buf, temp);
|
|
memcpy(cb->field_0x8, buf + temp, size - temp);
|
|
cb->field_0x4 = cb->field_0x8 + size - temp;
|
|
}
|
|
|
|
if (cb->field_0xc == (cb->field_0x4 - cb->field_0x8)) {
|
|
cb->field_0x4 = cb->field_0x8;
|
|
}
|
|
|
|
cb->mBytesToWrite -= size;
|
|
cb->mBytesToRead += size;
|
|
MWExitCriticalSection(&cb->mCriticalSection);
|
|
return 0;
|
|
}
|
|
|
|
/* 803728B0-80372900 36D1F0 0050+00 0/0 2/2 0/0 .text CircleBufferInitialize */
|
|
void CircleBufferInitialize(CircleBuffer* cb, u8* buf, s32 size) {
|
|
cb->field_0x8 = buf;
|
|
cb->field_0xc = size;
|
|
cb->field_0x0 = cb->field_0x8;
|
|
cb->field_0x4 = cb->field_0x8;
|
|
cb->mBytesToRead = 0;
|
|
cb->mBytesToWrite = cb->field_0xc;
|
|
MWInitializeCriticalSection(&cb->mCriticalSection);
|
|
}
|
|
|
|
/* 80372900-80372908 36D240 0008+00 0/0 2/2 0/0 .text CBGetBytesAvailableForRead */
|
|
s32 CBGetBytesAvailableForRead(CircleBuffer* cb) {
|
|
return cb->mBytesToRead;
|
|
}
|