renamed code_C3B20.c to file.c
This commit is contained in:
275
src/core2/file.c
Normal file
275
src/core2/file.c
Normal file
@@ -0,0 +1,275 @@
|
||||
#include <ultra64.h>
|
||||
#include "functions.h"
|
||||
#include "variables.h"
|
||||
|
||||
#define FILE_DEFAULT_SIZE 0x20
|
||||
|
||||
|
||||
|
||||
void file_read(File *file, void *arg1, s32 arg2);
|
||||
|
||||
void file_close(File *file) {
|
||||
if (file->mode == FILE_MODE_2_FROM_ASSET){
|
||||
assetcache_release(file->asset_base_ptr);
|
||||
}
|
||||
|
||||
free(file);
|
||||
}
|
||||
|
||||
File *file_open(enum asset_e asset_id) {
|
||||
File * this;
|
||||
|
||||
this = (File *) malloc(sizeof(File));
|
||||
|
||||
if (this == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
this->mode = FILE_MODE_2_FROM_ASSET;
|
||||
this->last_expected = -1;
|
||||
this->unk80 = -1;
|
||||
this->asset_base_ptr = assetcache_get(asset_id);
|
||||
this->asset_current_ptr = this->asset_base_ptr;
|
||||
|
||||
if (this->asset_current_ptr != NULL) {
|
||||
return this;
|
||||
}
|
||||
|
||||
free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
File *file_openMap(enum map_e map_id) {
|
||||
return file_open(map_id + 0x71C);
|
||||
}
|
||||
|
||||
File *file_openWithBaseIndex(s32 indx, enum asset_e base_indx) {
|
||||
indx += base_indx;
|
||||
return file_open(indx);
|
||||
}
|
||||
|
||||
File *file_openFromMem(void *ptr, s32 size) {
|
||||
File * this;
|
||||
|
||||
this = (File *) malloc(sizeof(File));
|
||||
this->mode = FILE_MODE_3_FROM_MEMORY;
|
||||
this->last_expected = -1;
|
||||
this->unk80 = -1;
|
||||
this->base_ptr = ptr;
|
||||
this->current_ptr = this->base_ptr;
|
||||
this->end_ptr = (u8 *) this->base_ptr + size;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
File *file_allocNew() {
|
||||
File *this;
|
||||
|
||||
this = (File *) malloc(sizeof(File));
|
||||
this->mode = FILE_MODE_4_ALLOCATED;
|
||||
this->last_expected = -1;
|
||||
this->unk80 = -1;
|
||||
this->base_ptr = malloc(FILE_DEFAULT_SIZE);
|
||||
this->current_ptr = this->base_ptr;
|
||||
this->end_ptr = (u8 *) this->base_ptr + FILE_DEFAULT_SIZE;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
void file_realloc(File *file, void **arg1, s32 *size) {
|
||||
*size = ((u32)file->current_ptr - (u32)file->base_ptr);
|
||||
*arg1 = realloc(file->base_ptr, *size);
|
||||
file->base_ptr = NULL;
|
||||
file_close(file);
|
||||
}
|
||||
|
||||
void file_getByte(File *file, u8 *dst) {
|
||||
file_read(file, dst, sizeof(u8));
|
||||
}
|
||||
|
||||
void file_getNBytes(File *file, u8 *dst, s32 cnt) {
|
||||
while (cnt > 0) {
|
||||
file_getByte(file, dst);
|
||||
cnt--;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
void file_getFloat(File *file, f32 *dst) {
|
||||
file_read(file, dst, sizeof(f32));
|
||||
}
|
||||
|
||||
void file_getNFloat(File *file, f32 *dst, s32 cnt) {
|
||||
while (cnt > 0) {
|
||||
file_getFloat(file, dst);
|
||||
cnt--;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
void file_getWord(File *file, s32 *dst) {
|
||||
file_read(file, dst, sizeof(s32));
|
||||
}
|
||||
|
||||
void file_getNWords(File *file, s32 *dst, s32 cnt) {
|
||||
while (cnt > 0) {
|
||||
file_getWord(file, dst);
|
||||
cnt--;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
void file_read(File *file, void *dst, s32 len) {
|
||||
u32 curr_offset;
|
||||
u32 capacity;
|
||||
void *new_base_ptr;
|
||||
|
||||
if (file->mode == FILE_MODE_2_FROM_ASSET) {
|
||||
memcpy(dst, file->asset_current_ptr, len);
|
||||
file->asset_current_ptr = (void *) ((u32)file->asset_current_ptr + len);
|
||||
}
|
||||
else if (file->mode == FILE_MODE_3_FROM_MEMORY) {
|
||||
memcpy(dst, file->current_ptr, len);
|
||||
file->current_ptr = (void *) ((u32)file->current_ptr + len);
|
||||
}
|
||||
else if (file->mode == FILE_MODE_4_ALLOCATED) { // why does it write in read function?
|
||||
if ((u8 *) file->end_ptr < (u8 *) file->current_ptr + len) {
|
||||
curr_offset = (u8 *) file->current_ptr - (u8 *) file->base_ptr;
|
||||
capacity = ((u8 *) file->end_ptr - (u8 *) file->base_ptr) * 2;
|
||||
|
||||
while (((u8 *) file->base_ptr + capacity) < ((u8*) file->current_ptr + len)) {
|
||||
capacity *= 2;
|
||||
}
|
||||
|
||||
new_base_ptr = realloc(file->base_ptr, capacity);
|
||||
file->base_ptr = new_base_ptr;
|
||||
file->current_ptr = (u8 *) new_base_ptr + curr_offset;
|
||||
file->end_ptr = (u8 *) new_base_ptr + capacity;
|
||||
}
|
||||
|
||||
memcpy(file->current_ptr, dst, len);
|
||||
file->current_ptr = (u8 *) file->current_ptr + len;
|
||||
}
|
||||
}
|
||||
|
||||
void file_getShort(File *file, s16 *dst) {
|
||||
file_read(file, dst, sizeof(s16));
|
||||
}
|
||||
|
||||
void file_getNShorts(File *file, s16 *dst, s32 cnt) {
|
||||
while (cnt > 0) {
|
||||
file_getShort(file, dst);
|
||||
cnt--;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_isNextByteExpected(File *file, s32 expected) {
|
||||
u8 saved_expected;
|
||||
|
||||
saved_expected = expected;
|
||||
|
||||
if ((file->mode == FILE_MODE_1_UNKNOWN) || (file->mode == FILE_MODE_4_ALLOCATED)) {
|
||||
file_getByte(file, &saved_expected);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (file->last_expected == -1) {
|
||||
file_getByte(file, &saved_expected);
|
||||
|
||||
if (expected == saved_expected) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
file->last_expected = saved_expected;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (expected == file->last_expected) {
|
||||
file->last_expected = -1;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool file_getByte_ifExpected(File *file, s32 expected, u8 *dst) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getByte(file, dst);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_getNBytes_ifExpected(File *file, s32 expected, u8 *dst, s32 cnt) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getNBytes(file, dst, cnt);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_getFloat_ifExpected(File *file, s32 expected, f32 *dst) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getFloat(file, dst);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_getNFloats_ifExpected(File *file, s32 expected, f32 *dst, s32 cnt) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getNFloat(file, dst, cnt);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_getWord_ifExpected(File *file, s32 expected, s32 *dst) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getWord(file, dst);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_getNWords_ifExpected(File *file, s32 expected, s32 *dst, s32 cnt) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getNWords(file, dst, cnt);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_get_ifExpected(File *file, s32 expected, void *dst, s32 len) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else{
|
||||
file_read(file, dst, len);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_getShort_ifExpected(File *file, s32 expected, s16 *dst) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getShort(file, dst);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool file_getNShorts_ifExpected(File *file, s32 expected, s16 *dst, s32 cnt) {
|
||||
if (!file_isNextByteExpected(file, expected)) {
|
||||
return FALSE;
|
||||
} else {
|
||||
file_getNShorts(file, dst, cnt);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user