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,
|
"editor.tabSize": 2,
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"source_location": "cpp",
|
"source_location": "cpp",
|
||||||
|
"stdio.h": "c",
|
||||||
|
"stddef.h": "c",
|
||||||
|
"errno.h": "c",
|
||||||
|
"ansi_files.h": "c",
|
||||||
|
"types.h": "c"
|
||||||
},
|
},
|
||||||
"files.autoSave": "onFocusChange",
|
"files.autoSave": "onFocusChange",
|
||||||
"files.insertFinalNewline": true,
|
"files.insertFinalNewline": true,
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
.include "macros.inc"
|
.include "macros.inc"
|
||||||
|
|
||||||
.section .sbss
|
#.section .sbss
|
||||||
.balign 8
|
#.balign 8
|
||||||
.global errno
|
#.global errno
|
||||||
errno:
|
#errno:
|
||||||
.skip 0x8
|
# .skip 0x8
|
||||||
|
|
||||||
.section .text, "ax"
|
.section .text, "ax"
|
||||||
|
|
||||||
|
|
|
@ -860,7 +860,8 @@ LIBS = [
|
||||||
["Runtime/locale", True],
|
["Runtime/locale", True],
|
||||||
["Runtime/direct_io", True],
|
["Runtime/direct_io", True],
|
||||||
["Runtime/file_io", True],
|
["Runtime/file_io", True],
|
||||||
"Runtime/FILE_POS",
|
["Runtime/errno", True],
|
||||||
|
["Runtime/FILE_POS", True],
|
||||||
"Runtime/mbstring",
|
"Runtime/mbstring",
|
||||||
["Runtime/mem", True],
|
["Runtime/mem", True],
|
||||||
["Runtime/mem_funcs", True],
|
["Runtime/mem_funcs", True],
|
||||||
|
|
|
@ -35,4 +35,5 @@ SECTIONS
|
||||||
FORCEFILES
|
FORCEFILES
|
||||||
{
|
{
|
||||||
__init_cpp_exceptions.o
|
__init_cpp_exceptions.o
|
||||||
|
errno.o
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ extern int errno;
|
||||||
#define ENOERR 0
|
#define ENOERR 0
|
||||||
#define EDOM 33
|
#define EDOM 33
|
||||||
#define ERANGE 34
|
#define ERANGE 34
|
||||||
#define EFPOS 35
|
#define EFPOS 40
|
||||||
#define ESIGPARM 36
|
#define ESIGPARM 36
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -108,7 +108,9 @@ int printf(const char*, ...);
|
||||||
int sprintf(char* s, const char* format, ...);
|
int sprintf(char* s, const char* format, ...);
|
||||||
int vprintf(const char* format, va_list arg);
|
int vprintf(const char* format, va_list arg);
|
||||||
int vsprintf(char* s, 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*);
|
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*);
|
size_t __fwrite(const void*, size_t, size_t, FILE*);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -735,7 +735,7 @@ MSL_PPCEABI_BARE_H :=\
|
||||||
$(BUILD_DIR)/src/Runtime/locale.o\
|
$(BUILD_DIR)/src/Runtime/locale.o\
|
||||||
$(BUILD_DIR)/src/Runtime/direct_io.o\
|
$(BUILD_DIR)/src/Runtime/direct_io.o\
|
||||||
$(BUILD_DIR)/src/Runtime/file_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)/asm/Runtime/mbstring.o\
|
||||||
$(BUILD_DIR)/src/Runtime/mem.o\
|
$(BUILD_DIR)/src/Runtime/mem.o\
|
||||||
$(BUILD_DIR)/src/Runtime/mem_funcs.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