Making some MSL_C progress (#549)
This commit is contained in:
parent
32fdc38925
commit
2309176a5c
23 changed files with 1456 additions and 263 deletions
97
src/MSL_C.PPCEABI.bare.H/FILE_POS.c
Executable file
97
src/MSL_C.PPCEABI.bare.H/FILE_POS.c
Executable file
|
|
@ -0,0 +1,97 @@
|
|||
#include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/ansi_files.h"
|
||||
#include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/errno.h"
|
||||
|
||||
inline fpos_t _ftell(FILE* file) {
|
||||
int charsInUndoBuffer = 0;
|
||||
fpos_t position;
|
||||
unsigned char tmp_kind = file->file_mode.file_kind;
|
||||
|
||||
if (!(tmp_kind == __disk_file || tmp_kind == __console_file) || file->file_state.error) {
|
||||
errno = EFPOS;
|
||||
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);
|
||||
}
|
||||
|
||||
long ftell(FILE* file) {
|
||||
long retval;
|
||||
|
||||
retval = (long)_ftell(file);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int _fseek(FILE* file, fpos_t offset, int file_mode) {
|
||||
fpos_t position;
|
||||
__pos_proc pos_proc;
|
||||
unsigned char tmp_kind = file->file_mode.file_kind;
|
||||
|
||||
if (!(tmp_kind == __disk_file) || file->file_state.error) {
|
||||
errno = EFPOS;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (file->file_state.io_state == __writing) {
|
||||
if (__flush_buffer(file, NULL) != __no_io_error) {
|
||||
set_error(file);
|
||||
errno = EFPOS;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (file_mode == SEEK_CUR) {
|
||||
file_mode = SEEK_SET;
|
||||
if ((position = _ftell(file)) < 0)
|
||||
position = 0;
|
||||
offset += position;
|
||||
}
|
||||
|
||||
if ((file_mode != SEEK_END) && (file->file_mode.io_mode != __read_write) &&
|
||||
((file->file_state.io_state == __reading) || (file->file_state.io_state == __rereading)))
|
||||
{
|
||||
if (offset >= file->position || offset < file->buffer_position) {
|
||||
file->file_state.io_state = __neutral;
|
||||
} else {
|
||||
file->buffer_ptr = file->buffer + (offset - file->buffer_position);
|
||||
file->buffer_length = file->position - offset;
|
||||
file->file_state.io_state = __reading;
|
||||
}
|
||||
} else {
|
||||
file->file_state.io_state = __neutral;
|
||||
}
|
||||
|
||||
if (file->file_state.io_state == __neutral) {
|
||||
if ((pos_proc = file->position_fn) != NULL && pos_proc(file->handle, &offset, file_mode, file->idle_fn)) {
|
||||
set_error(file);
|
||||
errno = EFPOS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
file->file_state.eof = 0;
|
||||
file->position = offset;
|
||||
file->buffer_length = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fseek(FILE * file, long offset, int file_mode)
|
||||
{
|
||||
fpos_t real_offset = (fpos_t)offset;
|
||||
int retval;
|
||||
|
||||
retval = _fseek(file, real_offset, file_mode);
|
||||
|
||||
return(retval);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue