mirror of https://github.com/PrimeDecomp/prime.git
Match and link FILE_POS
This commit is contained in:
parent
8b0c414ae0
commit
a1ea985b7c
|
@ -10,6 +10,11 @@
|
|||
"editor.tabSize": 2,
|
||||
"files.associations": {
|
||||
"source_location": "cpp",
|
||||
"stdio.h": "c",
|
||||
"stddef.h": "c",
|
||||
"errno.h": "c",
|
||||
"ansi_files.h": "c",
|
||||
"types.h": "c"
|
||||
},
|
||||
"files.autoSave": "onFocusChange",
|
||||
"files.insertFinalNewline": true,
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
.include "macros.inc"
|
||||
|
||||
.section .sbss
|
||||
.balign 8
|
||||
.global errno
|
||||
errno:
|
||||
.skip 0x8
|
||||
#.section .sbss
|
||||
#.balign 8
|
||||
#.global errno
|
||||
#errno:
|
||||
# .skip 0x8
|
||||
|
||||
.section .text, "ax"
|
||||
|
||||
|
|
|
@ -860,7 +860,8 @@ LIBS = [
|
|||
["Runtime/locale", True],
|
||||
["Runtime/direct_io", True],
|
||||
["Runtime/file_io", True],
|
||||
"Runtime/FILE_POS",
|
||||
["Runtime/errno", True],
|
||||
["Runtime/FILE_POS", True],
|
||||
"Runtime/mbstring",
|
||||
["Runtime/mem", True],
|
||||
["Runtime/mem_funcs", True],
|
||||
|
|
|
@ -35,4 +35,5 @@ SECTIONS
|
|||
FORCEFILES
|
||||
{
|
||||
__init_cpp_exceptions.o
|
||||
errno.o
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ extern int errno;
|
|||
#define ENOERR 0
|
||||
#define EDOM 33
|
||||
#define ERANGE 34
|
||||
#define EFPOS 35
|
||||
#define EFPOS 40
|
||||
#define ESIGPARM 36
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -108,7 +108,9 @@ int printf(const char*, ...);
|
|||
int sprintf(char* s, const char* format, ...);
|
||||
int vprintf(const char* format, va_list arg);
|
||||
int vsprintf(char* s, const char* format, va_list arg);
|
||||
size_t fread(const void*, size_t memb_size, size_t num_memb, FILE*);
|
||||
size_t fwrite(const void*, size_t memb_size, size_t num_memb, FILE*);
|
||||
int fseek(FILE * file, long offset, int mode);
|
||||
size_t __fwrite(const void*, size_t, size_t, FILE*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -735,7 +735,7 @@ MSL_PPCEABI_BARE_H :=\
|
|||
$(BUILD_DIR)/src/Runtime/locale.o\
|
||||
$(BUILD_DIR)/src/Runtime/direct_io.o\
|
||||
$(BUILD_DIR)/src/Runtime/file_io.o\
|
||||
$(BUILD_DIR)/asm/Runtime/FILE_POS.o\
|
||||
$(BUILD_DIR)/src/Runtime/FILE_POS.o\
|
||||
$(BUILD_DIR)/asm/Runtime/mbstring.o\
|
||||
$(BUILD_DIR)/src/Runtime/mem.o\
|
||||
$(BUILD_DIR)/src/Runtime/mem_funcs.o\
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
#include <ansi_files.h>
|
||||
#include <errno.h>
|
||||
|
||||
inline fpos_t _ftell(FILE* file) {
|
||||
int charsInUndoBuffer = 0;
|
||||
fpos_t position;
|
||||
|
||||
unsigned char tmp_kind = file->mode.file_kind;
|
||||
if (!(tmp_kind == __disk_file || tmp_kind == __console_file) || file->state.error) {
|
||||
errno = EFPOS;
|
||||
return (-1L);
|
||||
}
|
||||
|
||||
if (file->state.io_state == __neutral)
|
||||
return (file->position);
|
||||
|
||||
position = file->buffer_pos + (file->buffer_ptr - file->buffer);
|
||||
|
||||
if (file->state.io_state >= __rereading) {
|
||||
charsInUndoBuffer = file->state.io_state - __rereading + 1;
|
||||
position -= charsInUndoBuffer;
|
||||
}
|
||||
|
||||
return (position);
|
||||
}
|
||||
|
||||
long ftell(FILE* file) {
|
||||
long retval;
|
||||
|
||||
retval = (long)_ftell(file);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int _fseek(FILE* file, fpos_t offset, int mode) {
|
||||
fpos_t position;
|
||||
__pos_proc pos_proc;
|
||||
|
||||
unsigned char tmp_kind = file->mode.file_kind;
|
||||
if (!(tmp_kind == __disk_file) || file->state.error) {
|
||||
errno = EFPOS;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (file->state.io_state == __writing) {
|
||||
if (__flush_buffer(file, NULL) != __no_io_error) {
|
||||
set_error(file);
|
||||
errno = EFPOS;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == SEEK_CUR) {
|
||||
|
||||
mode = SEEK_SET;
|
||||
|
||||
if ((position = _ftell(file)) < 0)
|
||||
position = 0;
|
||||
|
||||
offset += position;
|
||||
}
|
||||
|
||||
if ((mode != SEEK_END) && (file->mode.io_mode != __read_write) &&
|
||||
((file->state.io_state == __reading) || (file->state.io_state == __rereading))) {
|
||||
if ((offset >= file->position) || offset < file->buffer_pos) {
|
||||
file->state.io_state = __neutral;
|
||||
} else {
|
||||
file->buffer_ptr = file->buffer + (offset - file->buffer_pos);
|
||||
file->buffer_len = file->position - offset;
|
||||
file->state.io_state = __reading;
|
||||
}
|
||||
} else {
|
||||
file->state.io_state = __neutral;
|
||||
}
|
||||
|
||||
if (file->state.io_state == __neutral) {
|
||||
if ((pos_proc = file->position_proc) != 0 &&
|
||||
(*pos_proc)(file->handle, &offset, mode, file->idle_proc)) {
|
||||
set_error(file);
|
||||
errno = EFPOS;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
file->state.eof = 0;
|
||||
file->position = offset;
|
||||
file->buffer_len = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fseek(FILE * file, long offset, int mode)
|
||||
{
|
||||
fpos_t real_offset = (fpos_t)offset;
|
||||
int retval;
|
||||
|
||||
|
||||
retval = _fseek(file, real_offset, mode);
|
||||
|
||||
|
||||
return(retval);
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
#include <errno.h>
|
||||
|
||||
int errno;
|
Loading…
Reference in New Issue