Files
dusklight/libs/TRK_MINNOW_DOLPHIN/utils/common/CircleBuffer.c
T
Pheenoh f9380b3e05 d_a_obj_carry work, SETUP_ACTOR macro, header cleanup (#1885)
* d_a_obj_carry work, SETUP_ACTOR macro

* rm headers, add script

* progress

* macro rename, consistent spacing
2023-08-16 12:07:52 -07:00

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;
}