From f2eabdb6257c09cf2890dac5e9737912728542af Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Thu, 2 Feb 2023 17:29:19 -0400 Subject: global: Add rest of Dolphin SDK proper, add MSL, and MetroTRK Finally, it links properly. --- src/MSL_C.PPCEABI.bare.H/direct_io.c | 114 +++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/MSL_C.PPCEABI.bare.H/direct_io.c (limited to 'src/MSL_C.PPCEABI.bare.H/direct_io.c') diff --git a/src/MSL_C.PPCEABI.bare.H/direct_io.c b/src/MSL_C.PPCEABI.bare.H/direct_io.c new file mode 100644 index 0000000..a98d19c --- /dev/null +++ b/src/MSL_C.PPCEABI.bare.H/direct_io.c @@ -0,0 +1,114 @@ +#include +#include + +size_t fwrite(const void* ptr, size_t memb_size, size_t num_memb, FILE* file) { + size_t retval; + retval = __fwrite(ptr, memb_size, num_memb, file); + return (retval); +} + +size_t __fwrite(const void* ptr, size_t memb_size, size_t num_memb, FILE* file) { + unsigned char* write_ptr; + size_t num_bytes, bytes_to_go, bytes_written; + int ioresult, always_buffer; + +#ifndef __NO_WIDE_CHAR + if (fwide(file, 0) == 0) + fwide(file, -1); +#endif + + bytes_to_go = memb_size * num_memb; + + if (!bytes_to_go || file->state.error || file->mode.file_kind == __closed_file) + return 0; + + if (file->mode.file_kind == __console_file) + __stdio_atexit(); + + always_buffer = + !file->mode.binary_io || file->mode.buffer_mode == _IOFBF || file->mode.buffer_mode == _IOLBF; + + if (file->state.io_state == __neutral) { + if (file->mode.io_mode & __write) { + if (file->mode.io_mode & __append) { + if (fseek(file, 0, SEEK_END)) + return 0; + } + file->state.io_state = __writing; + + __prep_buffer(file); + } + } + + if (file->state.io_state != __writing) { + set_error(file); + return 0; + } + + write_ptr = (unsigned char*)ptr; + bytes_written = 0; + + if (bytes_to_go && (file->buffer_ptr != file->buffer || always_buffer)) { + file->buffer_len = file->buffer_size - (file->buffer_ptr - file->buffer); + + do { + unsigned char* newline = NULL; + + num_bytes = file->buffer_len; + + if (num_bytes > bytes_to_go) + num_bytes = bytes_to_go; + if (file->mode.buffer_mode == _IOLBF && num_bytes) + if ((newline = (unsigned char*)__memrchr(write_ptr, '\n', num_bytes)) != NULL) + num_bytes = newline + 1 - write_ptr; + + if (num_bytes) { + memcpy(file->buffer_ptr, write_ptr, num_bytes); + + write_ptr += num_bytes; + bytes_written += num_bytes; + bytes_to_go -= num_bytes; + + file->buffer_ptr += num_bytes; + file->buffer_len -= num_bytes; + } + if (!file->buffer_len || newline != NULL || + (file->mode.buffer_mode == _IONBF)) + { + ioresult = __flush_buffer(file, NULL); + + if (ioresult) { + set_error(file); + bytes_to_go = 0; + break; + } + } + } while (bytes_to_go && always_buffer); + } + + if (bytes_to_go && !always_buffer) { + unsigned char* save_buffer = file->buffer; + size_t save_size = file->buffer_size; + + file->buffer = write_ptr; + file->buffer_size = bytes_to_go; + file->buffer_ptr = write_ptr + bytes_to_go; + + if (__flush_buffer(file, &num_bytes) != __no_io_error) + set_error(file); + + bytes_written += num_bytes; + + file->buffer = save_buffer; + file->buffer_size = save_size; + + __prep_buffer(file); + + file->buffer_len = 0; + } + + if (file->mode.buffer_mode != _IOFBF) + file->buffer_len = 0; + + return ((bytes_written + memb_size - 1) / memb_size); +} -- cgit v1.2.3-13-gbd6f