Making some MSL_C progress (#549)
This commit is contained in:
parent
32fdc38925
commit
2309176a5c
23 changed files with 1456 additions and 263 deletions
|
|
@ -1,114 +1,114 @@
|
|||
#include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/direct_io.h"
|
||||
#include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/buffer_io.h"
|
||||
#include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/misc_io.h"
|
||||
#include "string.h"
|
||||
#include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/wchar_io.h"
|
||||
#include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/ansi_files.h"
|
||||
|
||||
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream)
|
||||
{
|
||||
unsigned char* write_ptr;
|
||||
size_t num_bytes, bytes_to_go, bytes_written;
|
||||
int ioresult, always_buffer;
|
||||
|
||||
if (fwide(stream, 0) == 0)
|
||||
fwide(stream, -1);
|
||||
|
||||
bytes_to_go = size * count;
|
||||
|
||||
if (!bytes_to_go || stream->file_state.error
|
||||
|| stream->file_mode.file_kind == __closed_file)
|
||||
return 0;
|
||||
|
||||
if ((int)stream->file_mode.file_kind == __console_file)
|
||||
__stdio_atexit();
|
||||
|
||||
always_buffer = !stream->file_mode.binary_io
|
||||
|| (int)stream->file_mode.file_kind == __string_file
|
||||
|| stream->file_mode.buffer_mode == _IOFBF
|
||||
|| stream->file_mode.buffer_mode == _IOLBF;
|
||||
|
||||
if (stream->file_state.io_state == __neutral) {
|
||||
if (stream->file_mode.io_mode & __write) {
|
||||
stream->file_state.io_state = __writing;
|
||||
|
||||
__prep_buffer(stream);
|
||||
}
|
||||
}
|
||||
|
||||
if (stream->file_state.io_state != __writing) {
|
||||
set_error(stream);
|
||||
return 0;
|
||||
}
|
||||
|
||||
write_ptr = (unsigned char*)buffer;
|
||||
bytes_written = 0;
|
||||
|
||||
if (bytes_to_go
|
||||
&& (stream->buffer_ptr != stream->buffer || always_buffer)) {
|
||||
stream->buffer_length
|
||||
= stream->buffer_size - (stream->buffer_ptr - stream->buffer);
|
||||
|
||||
do {
|
||||
unsigned char* newline = NULL;
|
||||
|
||||
num_bytes = stream->buffer_length;
|
||||
|
||||
if (num_bytes > bytes_to_go)
|
||||
num_bytes = bytes_to_go;
|
||||
|
||||
if (num_bytes) {
|
||||
memcpy(stream->buffer_ptr, write_ptr, num_bytes);
|
||||
|
||||
write_ptr += num_bytes;
|
||||
bytes_written += num_bytes;
|
||||
bytes_to_go -= num_bytes;
|
||||
|
||||
stream->buffer_ptr += num_bytes;
|
||||
stream->buffer_length -= num_bytes;
|
||||
}
|
||||
|
||||
if (!stream->buffer_length
|
||||
&& (int)stream->file_mode.file_kind == __string_file) {
|
||||
bytes_written += bytes_to_go;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!stream->buffer_length || newline != NULL
|
||||
|| (stream->file_mode.buffer_mode == _IONBF)) {
|
||||
ioresult = __flush_buffer(stream, NULL);
|
||||
|
||||
if (ioresult) {
|
||||
set_error(stream);
|
||||
bytes_to_go = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (bytes_to_go && always_buffer);
|
||||
}
|
||||
|
||||
if (bytes_to_go && !always_buffer) {
|
||||
unsigned char* save_buffer = stream->buffer;
|
||||
size_t save_size = stream->buffer_size;
|
||||
|
||||
stream->buffer = write_ptr;
|
||||
stream->buffer_size = bytes_to_go;
|
||||
stream->buffer_ptr = write_ptr + bytes_to_go;
|
||||
|
||||
if (__flush_buffer(stream, &num_bytes) != __no_io_error)
|
||||
set_error(stream);
|
||||
|
||||
bytes_written += num_bytes;
|
||||
|
||||
stream->buffer = save_buffer;
|
||||
stream->buffer_size = save_size;
|
||||
|
||||
__prep_buffer(stream);
|
||||
|
||||
stream->buffer_length = 0;
|
||||
}
|
||||
|
||||
if (stream->file_mode.buffer_mode != _IOFBF)
|
||||
stream->buffer_length = 0;
|
||||
|
||||
return ((bytes_written + size - 1) / size);
|
||||
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->file_state.error || file->file_mode.file_kind == __closed_file)
|
||||
return 0;
|
||||
|
||||
if (file->file_mode.file_kind == __console_file)
|
||||
__stdio_atexit();
|
||||
|
||||
always_buffer =
|
||||
!file->file_mode.binary_io || file->file_mode.buffer_mode == _IOFBF || file->file_mode.buffer_mode == _IOLBF;
|
||||
|
||||
if (file->file_state.io_state == __neutral) {
|
||||
if (file->file_mode.io_mode & __write) {
|
||||
if (file->file_mode.io_mode & __append) {
|
||||
if (fseek(file, 0, SEEK_END))
|
||||
return 0;
|
||||
}
|
||||
file->file_state.io_state = __writing;
|
||||
|
||||
__prep_buffer(file);
|
||||
}
|
||||
}
|
||||
|
||||
if (file->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_length = file->buffer_size - (file->buffer_ptr - file->buffer);
|
||||
|
||||
do {
|
||||
unsigned char* newline = NULL;
|
||||
|
||||
num_bytes = file->buffer_length;
|
||||
|
||||
if (num_bytes > bytes_to_go)
|
||||
num_bytes = bytes_to_go;
|
||||
if (file->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_length -= num_bytes;
|
||||
}
|
||||
if (!file->buffer_length || newline != NULL ||
|
||||
(file->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_length = 0;
|
||||
}
|
||||
|
||||
if (file->file_mode.buffer_mode != _IOFBF)
|
||||
file->buffer_length = 0;
|
||||
|
||||
return ((bytes_written + memb_size - 1) / memb_size);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue