update and add spec links

This commit is contained in:
auronandace
2025-12-16 16:42:08 +00:00
parent f2ff75606e
commit 887a53c1b2
+157 -1
View File
@@ -1,4 +1,6 @@
//! stdio implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/stdio.h.html
//! `stdio.h` implementation.
//!
//! See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>.
use alloc::{
borrow::{Borrow, BorrowMut},
@@ -52,6 +54,7 @@ enum Buffer<'a> {
Borrowed(&'a mut [u8]),
Owned(Vec<u8>),
}
impl<'a> Deref for Buffer<'a> {
type Target = [u8];
@@ -62,6 +65,7 @@ impl<'a> Deref for Buffer<'a> {
}
}
}
impl<'a> DerefMut for Buffer<'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
match self {
@@ -96,6 +100,7 @@ impl<W: crate::io::Write> Writer for BufWriter<W> {
self.buf.clear();
}
}
impl<W: crate::io::Write> Writer for LineWriter<W> {
fn purge(&mut self) {
self.inner.buf.clear();
@@ -149,6 +154,7 @@ impl Read for FILE {
Ok(len)
}
}
impl BufRead for FILE {
fn fill_buf(&mut self) -> io::Result<&[u8]> {
if self.read_pos == self.read_size {
@@ -171,6 +177,7 @@ impl BufRead for FILE {
self.read_pos = (self.read_pos + i).min(self.read_size);
}
}
impl Write for FILE {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
match self.writer.write(buf) {
@@ -191,6 +198,7 @@ impl Write for FILE {
}
}
}
impl WriteFmt for FILE {
fn write_str(&mut self, s: &str) -> fmt::Result {
self.write_all(s.as_bytes())
@@ -198,11 +206,13 @@ impl WriteFmt for FILE {
.map_err(|_| fmt::Error)
}
}
impl WriteByte for FILE {
fn write_u8(&mut self, c: u8) -> fmt::Result {
self.write_all(&[c]).map(|_| ()).map_err(|_| fmt::Error)
}
}
impl FILE {
pub fn lock(&mut self) -> LockGuard {
unsafe {
@@ -253,6 +263,7 @@ impl FILE {
}
pub struct LockGuard<'a>(&'a mut FILE);
impl<'a> Deref for LockGuard<'a> {
type Target = FILE;
@@ -260,11 +271,13 @@ impl<'a> Deref for LockGuard<'a> {
&self.0
}
}
impl<'a> DerefMut for LockGuard<'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.0
}
}
impl<'a> Drop for LockGuard<'a> {
fn drop(&mut self) {
unsafe {
@@ -273,6 +286,8 @@ impl<'a> Drop for LockGuard<'a> {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/clearerr.html>.
///
/// Clears EOF and ERR indicators on a stream
#[unsafe(no_mangle)]
pub unsafe extern "C" fn clearerr(stream: *mut FILE) {
@@ -280,6 +295,7 @@ pub unsafe extern "C" fn clearerr(stream: *mut FILE) {
stream.flags &= !(F_EOF | F_ERR);
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ctermid.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ctermid(s: *mut c_char) -> *mut c_char {
static mut TERMID: [u8; L_ctermid] = *b"/dev/tty\0";
@@ -291,6 +307,9 @@ pub unsafe extern "C" fn ctermid(s: *mut c_char) -> *mut c_char {
strncpy(s, &raw mut TERMID as *mut c_char, L_ctermid)
}
/// See <https://pubs.opengroup.org/onlinepubs/7908799/xsh/cuserid.html>
///
/// Marked legacy in SUS Version 2.
// #[unsafe(no_mangle)]
pub unsafe extern "C" fn cuserid(s: *mut c_char) -> *mut c_char {
let mut buf: Vec<c_char> = vec![0; 256];
@@ -318,6 +337,8 @@ pub unsafe extern "C" fn cuserid(s: *mut c_char) -> *mut c_char {
(*pwdbuf).pw_name
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fclose.html>.
///
/// Close a file
/// This function does not guarentee that the file buffer will be flushed or that the file
/// descriptor will be closed, so if it is important that the file be written to, use `fflush()`
@@ -344,6 +365,8 @@ pub unsafe extern "C" fn fclose(stream: *mut FILE) -> c_int {
r as c_int
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fdopen.html>.
///
/// Open a file from a file descriptor
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fdopen(fildes: c_int, mode: *const c_char) -> *mut FILE {
@@ -352,6 +375,8 @@ pub unsafe extern "C" fn fdopen(fildes: c_int, mode: *const c_char) -> *mut FILE
.or_errno_null_mut()
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/feof.html>.
///
/// Check for EOF
#[unsafe(no_mangle)]
pub unsafe extern "C" fn feof(stream: *mut FILE) -> c_int {
@@ -359,6 +384,8 @@ pub unsafe extern "C" fn feof(stream: *mut FILE) -> c_int {
stream.flags & F_EOF
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ferror.html>.
///
/// Check for ERR
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ferror(stream: *mut FILE) -> c_int {
@@ -366,6 +393,8 @@ pub unsafe extern "C" fn ferror(stream: *mut FILE) -> c_int {
stream.flags & F_ERR
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fflush.html>.
///
/// Flush output to stream, or sync read position
/// Ensure the file is unlocked before calling this function, as it will attempt to lock the file
/// itself.
@@ -391,6 +420,8 @@ pub unsafe extern "C" fn fflush(stream: *mut FILE) -> c_int {
0
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fgetc.html>.
///
/// Get a single char from a stream
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fgetc(stream: *mut FILE) -> c_int {
@@ -402,6 +433,8 @@ pub unsafe extern "C" fn fgetc(stream: *mut FILE) -> c_int {
getc_unlocked(&mut *stream)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fgetpos.html>.
///
/// Get the position of the stream and store it in pos
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fgetpos(stream: *mut FILE, pos: *mut fpos_t) -> c_int {
@@ -413,6 +446,8 @@ pub unsafe extern "C" fn fgetpos(stream: *mut FILE, pos: *mut fpos_t) -> c_int {
0
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fgets.html>.
///
/// Get a string from the stream
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fgets(
@@ -481,6 +516,8 @@ pub unsafe extern "C" fn fgets(
if wrote { original } else { ptr::null_mut() }
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fileno.html>.
///
/// Get the underlying file descriptor
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fileno(stream: *mut FILE) -> c_int {
@@ -488,6 +525,8 @@ pub unsafe extern "C" fn fileno(stream: *mut FILE) -> c_int {
*stream.file
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/flockfile.html>.
///
/// Lock the file
/// Do not call any functions other than those with the `_unlocked` postfix while the file is
/// locked
@@ -496,6 +535,8 @@ pub unsafe extern "C" fn flockfile(file: *mut FILE) {
(*file).lock.manual_lock();
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fopen.html>.
///
/// Open the file in mode `mode`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE {
@@ -535,6 +576,10 @@ pub unsafe extern "C" fn fopen(filename: *const c_char, mode: *const c_char) ->
.or_errno_null_mut()
}
/// See <https://www.man7.org/linux/man-pages/man3/fpurge.3.html>.
///
/// Non-POSIX. From Solaris.
///
/// Clear the buffers of a stream
/// Ensure the file is unlocked before calling this function, as it will attempt to lock the file
/// itself.
@@ -546,6 +591,8 @@ pub unsafe extern "C" fn __fpurge(stream: *mut FILE) {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fputc.html>.
///
/// Insert a character into the stream
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fputc(c: c_int, stream: *mut FILE) -> c_int {
@@ -557,6 +604,8 @@ pub unsafe extern "C" fn fputc(c: c_int, stream: *mut FILE) -> c_int {
putc_unlocked(c, &mut *stream)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fputs.html>.
///
/// Insert a string into a stream
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fputs(s: *const c_char, stream: *mut FILE) -> c_int {
@@ -574,6 +623,8 @@ pub unsafe extern "C" fn fputs(s: *const c_char, stream: *mut FILE) -> c_int {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fread.html>.
///
/// Read `nitems` of size `size` into `ptr` from `stream`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fread(
@@ -602,6 +653,7 @@ pub unsafe extern "C" fn fread(
(read / size as usize) as size_t
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/freopen.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn freopen(
filename: *const c_char,
@@ -657,12 +709,16 @@ pub unsafe extern "C" fn freopen(
stream
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fseek.html>.
///
/// Seek to an offset `offset` from `whence`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int {
fseeko(stream, offset as off_t, whence)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fseek.html>.
///
/// Seek to an offset `offset` from `whence`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fseeko(stream: *mut FILE, off: off_t, whence: c_int) -> c_int {
@@ -694,24 +750,31 @@ pub unsafe fn fseek_locked(stream: &mut FILE, mut off: off_t, whence: c_int) ->
0
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fsetpos.html>.
///
/// Seek to a position `pos` in the file from the beginning of the file
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fsetpos(stream: *mut FILE, pos: *const fpos_t) -> c_int {
fseeko(stream, *pos, SEEK_SET)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ftell.html>.
///
/// Get the current position of the cursor in the file
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ftell(stream: *mut FILE) -> c_long {
ftello(stream) as c_long
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ftell.html>.
///
/// Get the current position of the cursor in the file
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ftello(stream: *mut FILE) -> off_t {
let mut stream = (*stream).lock();
ftell_locked(&mut *stream)
}
pub unsafe extern "C" fn ftell_locked(stream: &mut FILE) -> off_t {
let pos = Sys::lseek(*stream.file, 0, SEEK_CUR).or_minus_one_errno();
if pos < 0 {
@@ -721,6 +784,8 @@ pub unsafe extern "C" fn ftell_locked(stream: &mut FILE) -> off_t {
pos - (stream.read_size - stream.read_pos) as off_t - stream.unget.len() as off_t
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/flockfile.html>.
///
/// Try to lock the file. Returns 0 for success, 1 for failure
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ftrylockfile(file: *mut FILE) -> c_int {
@@ -731,12 +796,16 @@ pub unsafe extern "C" fn ftrylockfile(file: *mut FILE) -> c_int {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/flockfile.html>.
///
/// Unlock the file
#[unsafe(no_mangle)]
pub unsafe extern "C" fn funlockfile(file: *mut FILE) {
(*file).lock.manual_unlock();
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fwrite.html>.
///
/// Write `nitems` of size `size` from `ptr` to `stream`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fwrite(
@@ -764,6 +833,8 @@ pub unsafe extern "C" fn fwrite(
(written / size as usize) as size_t
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getc.html>.
///
/// Get a single char from a stream
#[unsafe(no_mangle)]
pub unsafe extern "C" fn getc(stream: *mut FILE) -> c_int {
@@ -771,12 +842,16 @@ pub unsafe extern "C" fn getc(stream: *mut FILE) -> c_int {
getc_unlocked(&mut *stream)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getchar.html>.
///
/// Get a single char from `stdin`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn getchar() -> c_int {
fgetc(&mut *stdin)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getc_unlocked.html>.
///
/// Get a char from a stream without locking the stream
#[unsafe(no_mangle)]
pub unsafe extern "C" fn getc_unlocked(stream: *mut FILE) -> c_int {
@@ -792,18 +867,29 @@ pub unsafe extern "C" fn getc_unlocked(stream: *mut FILE) -> c_int {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getc_unlocked.html>.
///
/// Get a char from `stdin` without locking `stdin`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn getchar_unlocked() -> c_int {
getc_unlocked(&mut *stdin)
}
/// See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gets.html>.
///
/// Marked obsolescent in issue 7.
/// `fgets` is recommended instead, which is what this implementation calls.
///
/// Get a string from `stdin`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn gets(s: *mut c_char) -> *mut c_char {
fgets(s, c_int::max_value(), &mut *stdin)
}
/// See <https://pubs.opengroup.org/onlinepubs/7908799/xsh/getw.html>.
///
/// Was marked legacy and removed in issue 6.
///
/// Get an integer from `stream`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn getw(stream: *mut FILE) -> c_int {
@@ -821,6 +907,7 @@ pub unsafe extern "C" fn getw(stream: *mut FILE) -> c_int {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/pclose.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pclose(stream: *mut FILE) -> c_int {
// TODO: rusty error handling?
@@ -845,6 +932,7 @@ pub unsafe extern "C" fn pclose(stream: *mut FILE) -> c_int {
wstatus
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/perror.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn perror(s: *const c_char) {
let err = ERRNO.get();
@@ -864,6 +952,7 @@ pub unsafe extern "C" fn perror(s: *const c_char) {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/popen.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn popen(command: *const c_char, mode: *const c_char) -> *mut FILE {
//TODO: share code with system
@@ -958,6 +1047,8 @@ pub unsafe extern "C" fn popen(command: *const c_char, mode: *const c_char) -> *
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/putc.html>.
///
/// Put a character `c` into `stream`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn putc(c: c_int, stream: *mut FILE) -> c_int {
@@ -965,12 +1056,16 @@ pub unsafe extern "C" fn putc(c: c_int, stream: *mut FILE) -> c_int {
putc_unlocked(c, &mut *stream)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/putchar.html>.
///
/// Put a character `c` into `stdout`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn putchar(c: c_int) -> c_int {
fputc(c, &mut *stdout)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getc_unlocked.html>.
///
/// Put a character `c` into `stream` without locking `stream`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn putc_unlocked(c: c_int, stream: *mut FILE) -> c_int {
@@ -984,12 +1079,16 @@ pub unsafe extern "C" fn putc_unlocked(c: c_int, stream: *mut FILE) -> c_int {
}
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getc_unlocked.html>.
///
/// Put a character `c` into `stdout` without locking `stdout`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn putchar_unlocked(c: c_int) -> c_int {
putc_unlocked(c, stdout)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/puts.html>.
///
/// Put a string `s` into `stdout`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn puts(s: *const c_char) -> c_int {
@@ -1009,12 +1108,18 @@ pub unsafe extern "C" fn puts(s: *const c_char) -> c_int {
0
}
/// See <https://pubs.opengroup.org/onlinepubs/7908799/xsh/putw.html>.
///
/// Marked legacy in SUS Version 2.
///
/// Put an integer `w` into `stream`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn putw(w: c_int, stream: *mut FILE) -> c_int {
fwrite(&w as *const c_int as _, mem::size_of_val(&w), 1, stream) as i32 - 1
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/remove.html>.
///
/// Delete file or directory `path`
#[unsafe(no_mangle)]
pub unsafe extern "C" fn remove(path: *const c_char) -> c_int {
@@ -1025,6 +1130,7 @@ pub unsafe extern "C" fn remove(path: *const c_char) -> c_int {
.or_minus_one_errno()
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rename(oldpath: *const c_char, newpath: *const c_char) -> c_int {
let oldpath = CStr::from_ptr(oldpath);
@@ -1034,6 +1140,7 @@ pub unsafe extern "C" fn rename(oldpath: *const c_char, newpath: *const c_char)
.or_minus_one_errno()
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/renameat.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn renameat(
old_dir: c_int,
@@ -1048,6 +1155,9 @@ pub unsafe extern "C" fn renameat(
.or_minus_one_errno()
}
/// See <https://www.man7.org/linux/man-pages/man2/rename.2.html>.
///
/// Non-POSIX. Seems to be a GNU extension.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn renameat2(
old_dir: c_int,
@@ -1063,12 +1173,16 @@ pub unsafe extern "C" fn renameat2(
.or_minus_one_errno()
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rewind.html>.
///
/// Rewind `stream` back to the beginning of it
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rewind(stream: *mut FILE) {
fseeko(stream, 0, SEEK_SET);
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setbuf.html>.
///
/// Reset `stream` to use buffer `buf`. Buffer must be `BUFSIZ` in length
#[unsafe(no_mangle)]
pub unsafe extern "C" fn setbuf(stream: *mut FILE, buf: *mut c_char) {
@@ -1080,12 +1194,18 @@ pub unsafe extern "C" fn setbuf(stream: *mut FILE, buf: *mut c_char) {
);
}
/// See <https://www.man7.org/linux/man-pages/man3/setlinebuf.3.html>.
///
/// Non-POSIX.
///
/// Set buffering of `stream` to line buffered
#[unsafe(no_mangle)]
pub unsafe extern "C" fn setlinebuf(stream: *mut FILE) {
setvbuf(stream, ptr::null_mut(), _IOLBF, 0);
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setvbuf.html>.
///
/// Reset `stream` to use buffer `buf` of size `size`
/// If this isn't the meaning of unsafe, idk what is
#[unsafe(no_mangle)]
@@ -1113,6 +1233,9 @@ pub unsafe extern "C" fn setvbuf(
0
}
/// See <https://pubs.opengroup.org/onlinepubs/009604599/functions/tempnam.html>.
///
/// Marked obsolescent in issue 7.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn tempnam(dir: *const c_char, pfx: *const c_char) -> *mut c_char {
unsafe fn is_appropriate(pos_dir: *const c_char) -> bool {
@@ -1156,6 +1279,7 @@ pub unsafe extern "C" fn tempnam(dir: *const c_char, pfx: *const c_char) -> *mut
out_buf
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tmpfile.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn tmpfile() -> *mut FILE {
let mut file_name = *b"/tmp/tmpfileXXXXXX\0";
@@ -1179,6 +1303,9 @@ pub unsafe extern "C" fn tmpfile() -> *mut FILE {
fp
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tmpnam.html>.
///
/// Marked obsolescent in issue 7.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn tmpnam(s: *mut c_char) -> *mut c_char {
let buf = if s.is_null() {
@@ -1204,6 +1331,8 @@ unsafe extern "C" fn tmpnam_inner(buf: *mut c_char, offset: usize) -> *mut c_cha
if *buf == 0 { ptr::null_mut() } else { buf }
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ungetc.html>.
///
/// Push character `c` back onto `stream` so it'll be read next
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ungetc(c: c_int, stream: *mut FILE) -> c_int {
@@ -1216,6 +1345,7 @@ pub unsafe extern "C" fn ungetc(c: c_int, stream: *mut FILE) -> c_int {
c
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vfprintf(file: *mut FILE, format: *const c_char, ap: va_list) -> c_int {
let mut file = (*file).lock();
@@ -1225,6 +1355,8 @@ pub unsafe extern "C" fn vfprintf(file: *mut FILE, format: *const c_char, ap: va
printf::printf(&mut *file, CStr::from_ptr(format), ap)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fprintf(
file: *mut FILE,
@@ -1234,6 +1366,7 @@ pub unsafe extern "C" fn fprintf(
vfprintf(file, format, __valist.as_va_list())
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vdprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vdprintf(fd: c_int, format: *const c_char, ap: va_list) -> c_int {
let mut f = File::new(fd);
@@ -1244,20 +1377,26 @@ pub unsafe extern "C" fn vdprintf(fd: c_int, format: *const c_char, ap: va_list)
printf::printf(f, CStr::from_ptr(format), ap)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/dprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dprintf(fd: c_int, format: *const c_char, mut __valist: ...) -> c_int {
vdprintf(fd, format, __valist.as_va_list())
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vprintf(format: *const c_char, ap: va_list) -> c_int {
vfprintf(&mut *stdout, format, ap)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn printf(format: *const c_char, mut __valist: ...) -> c_int {
vfprintf(&mut *stdout, format, __valist.as_va_list())
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vasprintf(
strp: *mut *mut c_char,
@@ -1271,6 +1410,8 @@ pub unsafe extern "C" fn vasprintf(
*strp = alloc_writer.leak() as *mut c_char;
ret
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn asprintf(
strp: *mut *mut c_char,
@@ -1280,6 +1421,7 @@ pub unsafe extern "C" fn asprintf(
vasprintf(strp, format, __valist.as_va_list())
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vsnprintf(
s: *mut c_char,
@@ -1293,6 +1435,8 @@ pub unsafe extern "C" fn vsnprintf(
ap,
)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn snprintf(
s: *mut c_char,
@@ -1307,6 +1451,7 @@ pub unsafe extern "C" fn snprintf(
)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vsprintf(s: *mut c_char, format: *const c_char, ap: va_list) -> c_int {
printf::printf(
@@ -1315,6 +1460,8 @@ pub unsafe extern "C" fn vsprintf(s: *mut c_char, format: *const c_char, ap: va_
ap,
)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fprintf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn sprintf(
s: *mut c_char,
@@ -1328,6 +1475,7 @@ pub unsafe extern "C" fn sprintf(
)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfscanf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vfscanf(file: *mut FILE, format: *const c_char, ap: va_list) -> c_int {
let ret = {
@@ -1342,6 +1490,8 @@ pub unsafe extern "C" fn vfscanf(file: *mut FILE, format: *const c_char, ap: va_
};
ret
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fscanf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn fscanf(
file: *mut FILE,
@@ -1351,20 +1501,26 @@ pub unsafe extern "C" fn fscanf(
vfscanf(file, format, __valist.as_va_list())
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfscanf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vscanf(format: *const c_char, ap: va_list) -> c_int {
vfscanf(&mut *stdin, format, ap)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fscanf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn scanf(format: *const c_char, mut __valist: ...) -> c_int {
vfscanf(&mut *stdin, format, __valist.as_va_list())
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfscanf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn vsscanf(s: *const c_char, format: *const c_char, ap: va_list) -> c_int {
let reader = (s as *const u8).into();
scanf::scanf(reader, format, ap)
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fscanf.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn sscanf(
s: *const c_char,