mirror of
https://github.com/Noratrieb/libuwuc.git
synced 2026-01-14 11:45:05 +01:00
more io
This commit is contained in:
parent
5673cf51db
commit
ae189e8b18
3 changed files with 79 additions and 1 deletions
|
|
@ -1,3 +1,5 @@
|
|||
pub mod stream;
|
||||
|
||||
use core::ffi::c_char;
|
||||
|
||||
use crate::sys::syscall;
|
||||
|
|
|
|||
50
libuwuc/src/io/stream.rs
Normal file
50
libuwuc/src/io/stream.rs
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
use core::ffi::c_int;
|
||||
|
||||
use super::EOF;
|
||||
|
||||
/// A `FILE`.
|
||||
#[repr(C)]
|
||||
pub struct FileStream {
|
||||
fd: c_int,
|
||||
}
|
||||
|
||||
impl FileStream {
|
||||
pub const fn from_raw_fd(fd: c_int) -> Self {
|
||||
Self { fd }
|
||||
}
|
||||
|
||||
fn write_byte(&self, c: u8) -> Result<(), i32> {
|
||||
unsafe { super::write_all(self.fd, &[c]).map_err(|e| e as _) }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn fputc(c: u8, stream: &FileStream) -> i32 {
|
||||
match stream.write_byte(c) {
|
||||
Ok(_) => c as _,
|
||||
Err(_) => EOF,
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn fwrite(ptr: *const u8, size: usize, nitems: usize, stream: &FileStream) -> usize {
|
||||
if nitems == 0 {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for i in 0..nitems {
|
||||
unsafe {
|
||||
let ptr = ptr.add(i * size);
|
||||
for j in 0..size {
|
||||
let ptr = ptr.add(j);
|
||||
let result = stream.write_byte(ptr.read());
|
||||
match result {
|
||||
Ok(()) => {}
|
||||
Err(_) => {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nitems
|
||||
}
|
||||
|
|
@ -1,6 +1,32 @@
|
|||
use core::ffi::c_char;
|
||||
use core::ffi::{c_char, c_int};
|
||||
|
||||
use libuwuc::io::{stream::FileStream, STDERR, STDIN, STDOUT};
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn puts(s: *const c_char) -> i32 {
|
||||
libuwuc::io::puts(s)
|
||||
}
|
||||
|
||||
// STREAMS:
|
||||
|
||||
#[no_mangle]
|
||||
pub static stdin: &FileStream = &FileStream::from_raw_fd(STDIN);
|
||||
#[no_mangle]
|
||||
pub static stdout: &FileStream = &FileStream::from_raw_fd(STDOUT);
|
||||
#[no_mangle]
|
||||
pub static stderr: &FileStream = &FileStream::from_raw_fd(STDERR);
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn fputc(c: c_int, stream: *mut FileStream) -> c_int {
|
||||
libuwuc::io::stream::fputc(c as u8, &*stream)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn fwrite(
|
||||
ptr: *const u8,
|
||||
size: usize,
|
||||
nitems: usize,
|
||||
stream: &FileStream,
|
||||
) -> usize {
|
||||
libuwuc::io::stream::fwrite(ptr, size, nitems, stream)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue