Match and link FILE_POS

This commit is contained in:
Phillip Stephens 2022-10-13 08:19:18 -07:00
parent 8b0c414ae0
commit a1ea985b7c
9 changed files with 122 additions and 8 deletions

View File

@ -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,

View File

@ -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"

View File

@ -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],

View File

@ -35,4 +35,5 @@ SECTIONS
FORCEFILES FORCEFILES
{ {
__init_cpp_exceptions.o __init_cpp_exceptions.o
errno.o
} }

View File

@ -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

View File

@ -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

View File

@ -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\

102
src/Runtime/FILE_POS.c Normal file
View File

@ -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);
}

3
src/Runtime/errno.c Normal file
View File

@ -0,0 +1,3 @@
#include <errno.h>
int errno;