From 1ef780a10f4a9e463bb0f12740be0d5f45e67a66 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Fri, 4 Jul 2025 18:36:30 -0400 Subject: [PATCH] Link MSL_C/FILE_POS --- configure.py | 2 +- src/static/MSL_C.PPCEABI.bare.H/FILE_POS.c | 118 +++++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 src/static/MSL_C.PPCEABI.bare.H/FILE_POS.c diff --git a/configure.py b/configure.py index 463f52a3..d52b69ab 100644 --- a/configure.py +++ b/configure.py @@ -830,7 +830,7 @@ config.libs = [ Object(Matching, "MSL_C.PPCEABI.bare.H/e_rem_pio2.c"), Object(Matching, "MSL_C.PPCEABI.bare.H/errno.c"), Object(Matching, "MSL_C.PPCEABI.bare.H/file_io.c"), - Object(NonMatching, "MSL_C.PPCEABI.bare.H/FILE_POS.C"), + Object(Matching, "MSL_C.PPCEABI.bare.H/FILE_POS.C"), Object(Matching, "MSL_C.PPCEABI.bare.H/float.c"), Object(Matching, "MSL_C.PPCEABI.bare.H/k_cos.c"), Object(Matching, "MSL_C.PPCEABI.bare.H/k_rem_pio2.c"), diff --git a/src/static/MSL_C.PPCEABI.bare.H/FILE_POS.c b/src/static/MSL_C.PPCEABI.bare.H/FILE_POS.c new file mode 100644 index 00000000..552717f7 --- /dev/null +++ b/src/static/MSL_C.PPCEABI.bare.H/FILE_POS.c @@ -0,0 +1,118 @@ +#include "types.h" + +#ifndef _MSL_WIDE_CHAR +#define _MSL_WIDE_CHAR +#endif + +#include "MSL_C/ansi_files.h" +#include "errno.h" + +// define standard C file pointer location names +#define SEEK_SET (0) +#define SEEK_CUR (1) +#define SEEK_END (2) + +int _ftell(FILE* file) { + int charsInUndoBuffer = 0; + int position; + + u8 tmp_kind = file->file_mode.file_kind; + if (!(tmp_kind == __disk_file || tmp_kind == __console_file) || file->file_state.error) { + errno = 0x28; + return -1; + } + + if (file->file_state.io_state == __neutral) + return (file->position); + + position = file->buffer_position + (file->buffer_ptr - file->buffer); + + if (file->file_state.io_state >= __rereading) { + charsInUndoBuffer = file->file_state.io_state - __rereading + 1; + position -= charsInUndoBuffer; + } + + return (position); +} + +int ftell(FILE* stream) { + int retval; + + retval = (s32)_ftell(stream); + return retval; +} + +int _fseek(FILE* file, u32 offset, int whence) { + int adjust; + u32 state; + int buffLen; + + if (file->file_mode.file_kind != 1 || file->file_state.error != 0) { + errno = 0x28; + return -1; + } + + if (file->file_state.io_state == 1) { + if (__flush_buffer(file, nullptr) != 0) { + file->file_state.error = 1; + file->buffer_length = 0; + errno = 0x28; + return -1; + } + } + + if (whence == SEEK_CUR) { + whence = SEEK_SET; + if ((file->file_mode.file_kind != 1 && file->file_mode.file_kind != 2) || file->file_state.error != 0) { + errno = 0x28; + adjust = -1; + } else { + state = file->file_state.io_state; + if (state == 0) { + adjust = file->position; + } else { + adjust = file->buffer_position + (u32)(file->buffer_ptr - file->buffer); + if ((state >= 3)) { + adjust -= (state - 2); + } + } + } + offset += adjust; + } + + if ((whence != SEEK_END) && + (file->file_mode.io_mode != 3) && + (file->file_state.io_state == 2 || file->file_state.io_state == 3)) { + if ((offset >= file->position) || !(offset >= file->buffer_position)) { + file->file_state.io_state = 0; + } else { + file->buffer_ptr = file->buffer + (offset - file->buffer_position); + file->buffer_length = file->position - offset; + file->file_state.io_state = 2; + } + } else { + file->file_state.io_state = 0; + } + + if (file->file_state.io_state == 0) { + if (file->position_fn != nullptr && (int)file->position_fn(file->handle, &offset, whence, file->idle_fn)) { + file->file_state.error = 1; + file->buffer_length = 0; + errno = 0x28; + return -1; + } else { + file->file_state.eof = 0; + file->position = offset; + file->buffer_length = 0; + } + } + + return 0; +} + +int fseek(FILE* stream, u32 offset, int whence) { + int code; + + code = _fseek(stream, offset, whence); // 0 if successful, -1 if error + return code; +}