From 18659e821fe13be2c2d71cf6ac9fcee9e7c903be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Thu, 6 Feb 2025 19:45:54 -0300 Subject: [PATCH 1/8] compiling but not working :) --- src/header/wchar/lookaheadreader.rs | 69 +++++++++++++++++++++++++---- src/header/wchar/mod.rs | 14 ++++-- tests/wchar/wscanf.c | 4 ++ 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/src/header/wchar/lookaheadreader.rs b/src/header/wchar/lookaheadreader.rs index ddf36a63f5..91157d771e 100644 --- a/src/header/wchar/lookaheadreader.rs +++ b/src/header/wchar/lookaheadreader.rs @@ -8,6 +8,7 @@ struct LookAheadBuffer { pos: isize, look_ahead: isize, } + impl LookAheadBuffer { fn look_ahead(&mut self) -> Result, i32> { let wchar = unsafe { *self.buf.offset(self.look_ahead) }; @@ -34,20 +35,72 @@ impl From<*const wint_t> for LookAheadBuffer { } } -pub struct LookAheadReader(LookAheadBuffer); +struct LookAheadFile<'a> { + f: &'a mut FILE, + look_ahead: i64, +} -impl LookAheadReader { +impl<'a> LookAheadFile<'a> { + fn look_ahead(&mut self) -> Result, i32> { + let buf = &mut [0]; + let seek = unsafe { ftell_locked(self.f) }; + unsafe { fseek_locked(self.f, self.look_ahead as off_t, SEEK_SET) }; + let ret = match self.f.read(buf) { + Ok(0) => Ok(None), + Ok(_) => Ok(Some(buf[0])), + Err(_) => Err(-1), + }; + unsafe { fseek_locked(self.f, seek, SEEK_SET) }; + self.look_ahead += 1; + + // TODO: This is a 8 bit char, wee need to read a wchar + ret.map(|c| c.map(wint_t::from)) + } + + fn commit(&mut self) { + unsafe { fseek_locked(self.f, self.look_ahead as off_t, SEEK_SET) }; + } +} + +impl<'a> From<&'a mut FILE> for LookAheadFile<'a> { + fn from(f: &'a mut FILE) -> LookAheadFile<'a> { + let look_ahead = unsafe { ftell_locked(f) } as i64; + LookAheadFile { f, look_ahead } + } +} + +enum LookAheadReaderEnum<'a> { + FILE(LookAheadFile<'a>), + // (buffer, location) + BUFFER(LookAheadBuffer), +} + +// pub struct LookAheadReader(LookAheadBuffer); +pub struct LookAheadReader<'a>(LookAheadReaderEnum<'a>); + +impl LookAheadReader<'_> { pub fn lookahead1(&mut self) -> Result, i32> { - self.0.look_ahead() + match &mut self.0 { + LookAheadReaderEnum::FILE(f) => f.look_ahead(), + LookAheadReaderEnum::BUFFER(b) => b.look_ahead(), + } } - pub fn commit(&mut self) { - self.0.commit() + match &mut self.0 { + LookAheadReaderEnum::FILE(f) => f.commit(), + LookAheadReaderEnum::BUFFER(b) => b.commit(), + } } } -impl From<*const wint_t> for LookAheadReader { - fn from(buff: *const wint_t) -> LookAheadReader { - LookAheadReader(buff.into()) +impl<'a> From<&'a mut FILE> for LookAheadReader<'a> { + fn from(f: &'a mut FILE) -> LookAheadReader { + LookAheadReader(LookAheadReaderEnum::FILE(f.into())) + } +} + +impl<'a> From<*const wint_t> for LookAheadReader<'a> { + fn from(buff: *const wint_t) -> LookAheadReader<'a> { + LookAheadReader(LookAheadReaderEnum::BUFFER(buff.into())) } } diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index ff3102aa25..3d277241ec 100644 --- a/src/header/wchar/mod.rs +++ b/src/header/wchar/mod.rs @@ -10,6 +10,7 @@ use crate::{ stdlib::{malloc, MB_CUR_MAX, MB_LEN_MAX}, string, time::*, + wchar::lookaheadreader::LookAheadReader, wctype::*, }, iter::{NulTerminated, NulTerminatedInclusive}, @@ -1006,9 +1007,16 @@ pub unsafe extern "C" fn wmemset(ws: *mut wchar_t, wc: wchar_t, n: size_t) -> *m ws } -// #[no_mangle] -pub extern "C" fn wscanf(format: *const wchar_t, ap: va_list) -> c_int { - unimplemented!(); +#[no_mangle] +pub unsafe extern "C" fn wscanf(format: *const wchar_t, ap: va_list) -> c_int { + let mut file = (*stdin).lock(); + if let Err(_) = file.try_set_byte_orientation_unlocked() { + return -1; + } + + let f: &mut FILE = &mut *file; + let reader: LookAheadReader = f.into(); + wscanf::scanf(reader, format, ap) } #[no_mangle] diff --git a/tests/wchar/wscanf.c b/tests/wchar/wscanf.c index c74c4ded86..6d362cc472 100644 --- a/tests/wchar/wscanf.c +++ b/tests/wchar/wscanf.c @@ -92,5 +92,9 @@ int main () wprintf(L"%d \"%s\" \"%s\" \"%s\" \"%s\"\n", ret, &protobuf, &slashbuf, &hostbuf, &pathbuf); + // wchar_t str [80]; + // wprintf(L"Enter your family name: "); + // wscanf(L"%ls",str); + return 0; } From 61c31f348c0b627259f7e4e891e923fdddfbe414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Thu, 6 Feb 2025 19:58:54 -0300 Subject: [PATCH 2/8] changed wscanf parameters --- src/header/wchar/mod.rs | 4 ++-- tests/wchar/wscanf.c | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index 3d277241ec..7caf3dd1d2 100644 --- a/src/header/wchar/mod.rs +++ b/src/header/wchar/mod.rs @@ -1008,7 +1008,7 @@ pub unsafe extern "C" fn wmemset(ws: *mut wchar_t, wc: wchar_t, n: size_t) -> *m } #[no_mangle] -pub unsafe extern "C" fn wscanf(format: *const wchar_t, ap: va_list) -> c_int { +pub unsafe extern "C" fn wscanf(format: *const wchar_t, mut __valist: ...) -> c_int { let mut file = (*stdin).lock(); if let Err(_) = file.try_set_byte_orientation_unlocked() { return -1; @@ -1016,7 +1016,7 @@ pub unsafe extern "C" fn wscanf(format: *const wchar_t, ap: va_list) -> c_int { let f: &mut FILE = &mut *file; let reader: LookAheadReader = f.into(); - wscanf::scanf(reader, format, ap) + wscanf::scanf(reader, format, __valist.as_va_list()) } #[no_mangle] diff --git a/tests/wchar/wscanf.c b/tests/wchar/wscanf.c index 6d362cc472..55e2858c35 100644 --- a/tests/wchar/wscanf.c +++ b/tests/wchar/wscanf.c @@ -92,9 +92,11 @@ int main () wprintf(L"%d \"%s\" \"%s\" \"%s\" \"%s\"\n", ret, &protobuf, &slashbuf, &hostbuf, &pathbuf); - // wchar_t str [80]; - // wprintf(L"Enter your family name: "); - // wscanf(L"%ls",str); + // wchar_t str [80]; + wchar_t wstring1[20]; + wprintf(L"Enter your family name: "); + wscanf(L"%ls", wstring1); + wprintf (L"Mr. %ls, %d years old.\n", wstring1); return 0; } From 9d49a2745ffe660e1e357f4b03ebe0159fa708f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Fri, 7 Feb 2025 15:56:21 -0300 Subject: [PATCH 3/8] it is working, but with an unsafe --- src/header/wchar/lookaheadreader.rs | 76 ++++++++++++++++++++++++++++- src/header/wchar/wscanf.rs | 13 +++-- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/src/header/wchar/lookaheadreader.rs b/src/header/wchar/lookaheadreader.rs index 91157d771e..f6828a23fe 100644 --- a/src/header/wchar/lookaheadreader.rs +++ b/src/header/wchar/lookaheadreader.rs @@ -1,8 +1,14 @@ use super::{fseek_locked, ftell_locked, FILE, SEEK_SET}; use crate::{ + header::{ + wchar::{fgetwc, mbrtowc}, + wctype::WEOF, + }, io::Read, - platform::types::{off_t, wint_t}, + platform::types::{c_char, off_t, wchar_t, wint_t}, }; +use core::ptr; + struct LookAheadBuffer { buf: *const wint_t, pos: isize, @@ -12,6 +18,7 @@ struct LookAheadBuffer { impl LookAheadBuffer { fn look_ahead(&mut self) -> Result, i32> { let wchar = unsafe { *self.buf.offset(self.look_ahead) }; + println!("-> {}", wchar as wint_t); if wchar == 0 { Ok(None) } else { @@ -41,6 +48,7 @@ struct LookAheadFile<'a> { } impl<'a> LookAheadFile<'a> { + /* fn look_ahead(&mut self) -> Result, i32> { let buf = &mut [0]; let seek = unsafe { ftell_locked(self.f) }; @@ -48,13 +56,77 @@ impl<'a> LookAheadFile<'a> { let ret = match self.f.read(buf) { Ok(0) => Ok(None), Ok(_) => Ok(Some(buf[0])), - Err(_) => Err(-1), + Err(_) => Err(-2), }; unsafe { fseek_locked(self.f, seek, SEEK_SET) }; self.look_ahead += 1; // TODO: This is a 8 bit char, wee need to read a wchar ret.map(|c| c.map(wint_t::from)) + }*/ + + fn look_ahead(&mut self) -> Result, i32> { + const BUFF_SIZE: usize = core::mem::size_of::(); + let buf = &mut [0; BUFF_SIZE]; + + let seek = unsafe { ftell_locked(self.f) }; + unsafe { fseek_locked(self.f, self.look_ahead as off_t, SEEK_SET) }; + println!("BUF {:?}", buf); + + // let ret = unsafe { fgetwc(self.f) }; + + let mut encoded_length = 0; + + let mut bytes_read = 0; + loop { + match self.f.read(&mut buf[bytes_read..bytes_read + 1]) { + Ok(0) => { + // ERRNO.set(EILSEQ); + return Ok(Some(WEOF)); + } + Ok(_) => {} + Err(_) => return Err(-1), + } + + bytes_read += 1; + + if bytes_read == 1 { + encoded_length = if buf[0] >> 7 == 0 { + 1 + } else if buf[0] >> 5 == 6 { + 2 + } else if buf[0] >> 4 == 0xe { + 3 + } else if buf[0] >> 3 == 0x1e { + 4 + } else { + // ERRNO.set(EILSEQ); + return Ok(Some(WEOF)); + }; + } + + if bytes_read >= encoded_length { + break; + } + } + + let mut wc: wchar_t = 0; + unsafe { + mbrtowc( + &mut wc, + buf.as_ptr() as *const c_char, + encoded_length, + ptr::null_mut(), + ); + } + + println!("BUF {:?}", buf); + // println!("{:?}", ret); + unsafe { fseek_locked(self.f, seek, SEEK_SET) }; + // self.look_ahead += 1; + self.look_ahead += encoded_length as i64; + + Ok(Some(wc as wint_t)) } fn commit(&mut self) { diff --git a/src/header/wchar/wscanf.rs b/src/header/wchar/wscanf.rs index ff61874a5c..0e46153108 100644 --- a/src/header/wchar/wscanf.rs +++ b/src/header/wchar/wscanf.rs @@ -26,7 +26,7 @@ unsafe fn next_char(string: &mut *const wchar_t) -> Result { let c = **string as wint_t; *string = string.offset(1); if c == 0 { - Err(-1) + Err(-2) } else { Ok(c) } @@ -34,7 +34,10 @@ unsafe fn next_char(string: &mut *const wchar_t) -> Result { macro_rules! wc_as_char { ($c:ident) => { - char::try_from($c).map_err(|_| -1)? + char::try_from($c).map_err(|e| { + println!("{:?}", e); + -3 + })? }; } @@ -72,7 +75,7 @@ unsafe fn inner_scanf( (inner $($placeholder:expr)*) => { if !skip_read && !read!() { match matched { - 0 => return Ok(-1), + 0 => return Ok(-4), a => return Ok(a), } } @@ -121,7 +124,7 @@ unsafe fn inner_scanf( } else { match width.parse::() { Ok(n) => Some(n), - Err(_) => return Err(-1), + Err(_) => return Err(-5), } }; @@ -493,7 +496,7 @@ unsafe fn inner_scanf( *ap.arg::<*mut c_int>() = count as c_int; } } - _ => return Err(-1), + _ => return Err(-6), } if eof { From ca9cfde3d6d2f05a4548ae5d0a62a2c26badf251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Fri, 7 Feb 2025 16:04:25 -0300 Subject: [PATCH 4/8] clean up code --- src/header/wchar/lookaheadreader.rs | 40 +++++++---------------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/src/header/wchar/lookaheadreader.rs b/src/header/wchar/lookaheadreader.rs index f6828a23fe..b1e1cfea49 100644 --- a/src/header/wchar/lookaheadreader.rs +++ b/src/header/wchar/lookaheadreader.rs @@ -1,11 +1,15 @@ use super::{fseek_locked, ftell_locked, FILE, SEEK_SET}; use crate::{ header::{ - wchar::{fgetwc, mbrtowc}, + errno::EILSEQ, + wchar::{fgetwc, mbrtowc, MB_CUR_MAX}, wctype::WEOF, }, io::Read, - platform::types::{c_char, off_t, wchar_t, wint_t}, + platform::{ + types::{c_char, off_t, wchar_t, wint_t}, + ERRNO, + }, }; use core::ptr; @@ -48,40 +52,17 @@ struct LookAheadFile<'a> { } impl<'a> LookAheadFile<'a> { - /* fn look_ahead(&mut self) -> Result, i32> { - let buf = &mut [0]; + let buf = &mut [0; MB_CUR_MAX as usize]; let seek = unsafe { ftell_locked(self.f) }; unsafe { fseek_locked(self.f, self.look_ahead as off_t, SEEK_SET) }; - let ret = match self.f.read(buf) { - Ok(0) => Ok(None), - Ok(_) => Ok(Some(buf[0])), - Err(_) => Err(-2), - }; - unsafe { fseek_locked(self.f, seek, SEEK_SET) }; - self.look_ahead += 1; - - // TODO: This is a 8 bit char, wee need to read a wchar - ret.map(|c| c.map(wint_t::from)) - }*/ - - fn look_ahead(&mut self) -> Result, i32> { - const BUFF_SIZE: usize = core::mem::size_of::(); - let buf = &mut [0; BUFF_SIZE]; - - let seek = unsafe { ftell_locked(self.f) }; - unsafe { fseek_locked(self.f, self.look_ahead as off_t, SEEK_SET) }; - println!("BUF {:?}", buf); - - // let ret = unsafe { fgetwc(self.f) }; let mut encoded_length = 0; - let mut bytes_read = 0; loop { match self.f.read(&mut buf[bytes_read..bytes_read + 1]) { Ok(0) => { - // ERRNO.set(EILSEQ); + ERRNO.set(EILSEQ); return Ok(Some(WEOF)); } Ok(_) => {} @@ -100,7 +81,7 @@ impl<'a> LookAheadFile<'a> { } else if buf[0] >> 3 == 0x1e { 4 } else { - // ERRNO.set(EILSEQ); + ERRNO.set(EILSEQ); return Ok(Some(WEOF)); }; } @@ -120,10 +101,7 @@ impl<'a> LookAheadFile<'a> { ); } - println!("BUF {:?}", buf); - // println!("{:?}", ret); unsafe { fseek_locked(self.f, seek, SEEK_SET) }; - // self.look_ahead += 1; self.look_ahead += encoded_length as i64; Ok(Some(wc as wint_t)) From da3e1e94fa33e739e19a90e966dfbccefae42205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Sat, 8 Feb 2025 14:05:37 -0300 Subject: [PATCH 5/8] added get_char_encoded_length function --- src/header/wchar/lookaheadreader.rs | 18 ++++++------------ src/header/wchar/mod.rs | 12 +++--------- src/header/wchar/utf8.rs | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/header/wchar/lookaheadreader.rs b/src/header/wchar/lookaheadreader.rs index b1e1cfea49..516749084b 100644 --- a/src/header/wchar/lookaheadreader.rs +++ b/src/header/wchar/lookaheadreader.rs @@ -2,7 +2,7 @@ use super::{fseek_locked, ftell_locked, FILE, SEEK_SET}; use crate::{ header::{ errno::EILSEQ, - wchar::{fgetwc, mbrtowc, MB_CUR_MAX}, + wchar::{fgetwc, get_char_encoded_length, mbrtowc, MB_CUR_MAX}, wctype::WEOF, }, io::Read, @@ -22,7 +22,6 @@ struct LookAheadBuffer { impl LookAheadBuffer { fn look_ahead(&mut self) -> Result, i32> { let wchar = unsafe { *self.buf.offset(self.look_ahead) }; - println!("-> {}", wchar as wint_t); if wchar == 0 { Ok(None) } else { @@ -72,17 +71,11 @@ impl<'a> LookAheadFile<'a> { bytes_read += 1; if bytes_read == 1 { - encoded_length = if buf[0] >> 7 == 0 { - 1 - } else if buf[0] >> 5 == 6 { - 2 - } else if buf[0] >> 4 == 0xe { - 3 - } else if buf[0] >> 3 == 0x1e { - 4 + encoded_length = if let Some(el) = get_char_encoded_length(buf[0]) { + el } else { ERRNO.set(EILSEQ); - return Ok(Some(WEOF)); + return Ok(WEOF); }; } @@ -99,9 +92,10 @@ impl<'a> LookAheadFile<'a> { encoded_length, ptr::null_mut(), ); + + fseek_locked(self.f, seek, SEEK_SET); } - unsafe { fseek_locked(self.f, seek, SEEK_SET) }; self.look_ahead += encoded_length as i64; Ok(Some(wc as wint_t)) diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index 7caf3dd1d2..88d690253e 100644 --- a/src/header/wchar/mod.rs +++ b/src/header/wchar/mod.rs @@ -10,7 +10,7 @@ use crate::{ stdlib::{malloc, MB_CUR_MAX, MB_LEN_MAX}, string, time::*, - wchar::lookaheadreader::LookAheadReader, + wchar::{lookaheadreader::LookAheadReader, utf8::get_char_encoded_length}, wctype::*, }, iter::{NulTerminated, NulTerminatedInclusive}, @@ -70,14 +70,8 @@ pub unsafe extern "C" fn fgetwc(stream: *mut FILE) -> wint_t { bytes_read += 1; if bytes_read == 1 { - encoded_length = if buf[0] >> 7 == 0 { - 1 - } else if buf[0] >> 5 == 6 { - 2 - } else if buf[0] >> 4 == 0xe { - 3 - } else if buf[0] >> 3 == 0x1e { - 4 + encoded_length = if let Some(el) = get_char_encoded_length(buf[0]) { + el } else { ERRNO.set(EILSEQ); return WEOF; diff --git a/src/header/wchar/utf8.rs b/src/header/wchar/utf8.rs index b1961c1ac8..bb127427e0 100644 --- a/src/header/wchar/utf8.rs +++ b/src/header/wchar/utf8.rs @@ -91,3 +91,18 @@ pub unsafe fn wcrtomb(s: *mut c_char, wc: wchar_t, ps: *mut mbstate_t) -> usize size } + +/// Gets the encoded length of a character. It is used to recognize wide characters +pub fn get_char_encoded_length(first_byte: u8) -> Option { + if first_byte >> 7 == 0 { + Some(1) + } else if first_byte >> 5 == 6 { + Some(2) + } else if first_byte >> 4 == 0xe { + Some(3) + } else if first_byte >> 3 == 0x1e { + Some(4) + } else { + None + } +} From 47ed7a5907a1aef305de9747bef816a6d142b684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Sat, 8 Feb 2025 14:11:25 -0300 Subject: [PATCH 6/8] fixed return value --- src/header/wchar/lookaheadreader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/header/wchar/lookaheadreader.rs b/src/header/wchar/lookaheadreader.rs index 516749084b..742fba372e 100644 --- a/src/header/wchar/lookaheadreader.rs +++ b/src/header/wchar/lookaheadreader.rs @@ -75,7 +75,7 @@ impl<'a> LookAheadFile<'a> { el } else { ERRNO.set(EILSEQ); - return Ok(WEOF); + return Ok(Some(WEOF)); }; } From 230a15046d7c97edd8d323bc7c2d11fc5f36780b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Sat, 8 Feb 2025 14:24:44 -0300 Subject: [PATCH 7/8] cleanup --- src/header/wchar/lookaheadreader.rs | 4 +--- src/header/wchar/wscanf.rs | 13 +++++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/header/wchar/lookaheadreader.rs b/src/header/wchar/lookaheadreader.rs index 742fba372e..7f98c9b4c8 100644 --- a/src/header/wchar/lookaheadreader.rs +++ b/src/header/wchar/lookaheadreader.rs @@ -115,11 +115,9 @@ impl<'a> From<&'a mut FILE> for LookAheadFile<'a> { enum LookAheadReaderEnum<'a> { FILE(LookAheadFile<'a>), - // (buffer, location) BUFFER(LookAheadBuffer), } -// pub struct LookAheadReader(LookAheadBuffer); pub struct LookAheadReader<'a>(LookAheadReaderEnum<'a>); impl LookAheadReader<'_> { @@ -138,7 +136,7 @@ impl LookAheadReader<'_> { } impl<'a> From<&'a mut FILE> for LookAheadReader<'a> { - fn from(f: &'a mut FILE) -> LookAheadReader { + fn from(f: &'a mut FILE) -> LookAheadReader<'a> { LookAheadReader(LookAheadReaderEnum::FILE(f.into())) } } diff --git a/src/header/wchar/wscanf.rs b/src/header/wchar/wscanf.rs index 0e46153108..ff61874a5c 100644 --- a/src/header/wchar/wscanf.rs +++ b/src/header/wchar/wscanf.rs @@ -26,7 +26,7 @@ unsafe fn next_char(string: &mut *const wchar_t) -> Result { let c = **string as wint_t; *string = string.offset(1); if c == 0 { - Err(-2) + Err(-1) } else { Ok(c) } @@ -34,10 +34,7 @@ unsafe fn next_char(string: &mut *const wchar_t) -> Result { macro_rules! wc_as_char { ($c:ident) => { - char::try_from($c).map_err(|e| { - println!("{:?}", e); - -3 - })? + char::try_from($c).map_err(|_| -1)? }; } @@ -75,7 +72,7 @@ unsafe fn inner_scanf( (inner $($placeholder:expr)*) => { if !skip_read && !read!() { match matched { - 0 => return Ok(-4), + 0 => return Ok(-1), a => return Ok(a), } } @@ -124,7 +121,7 @@ unsafe fn inner_scanf( } else { match width.parse::() { Ok(n) => Some(n), - Err(_) => return Err(-5), + Err(_) => return Err(-1), } }; @@ -496,7 +493,7 @@ unsafe fn inner_scanf( *ap.arg::<*mut c_int>() = count as c_int; } } - _ => return Err(-6), + _ => return Err(-1), } if eof { From 28b471300b7ede9ce653fbe1af561dd74d077d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Antinori?= Date: Sun, 9 Feb 2025 02:29:20 -0300 Subject: [PATCH 8/8] added vwscanf --- src/header/wchar/mod.rs | 9 +++++++-- tests/wchar/wscanf.c | 6 ------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index 88d690253e..da86794849 100644 --- a/src/header/wchar/mod.rs +++ b/src/header/wchar/mod.rs @@ -1002,7 +1002,7 @@ pub unsafe extern "C" fn wmemset(ws: *mut wchar_t, wc: wchar_t, n: size_t) -> *m } #[no_mangle] -pub unsafe extern "C" fn wscanf(format: *const wchar_t, mut __valist: ...) -> c_int { +pub unsafe extern "C" fn vwscanf(format: *const wchar_t, __valist: va_list) -> c_int { let mut file = (*stdin).lock(); if let Err(_) = file.try_set_byte_orientation_unlocked() { return -1; @@ -1010,7 +1010,12 @@ pub unsafe extern "C" fn wscanf(format: *const wchar_t, mut __valist: ...) -> c_ let f: &mut FILE = &mut *file; let reader: LookAheadReader = f.into(); - wscanf::scanf(reader, format, __valist.as_va_list()) + wscanf::scanf(reader, format, __valist) +} + +#[no_mangle] +pub unsafe extern "C" fn wscanf(format: *const wchar_t, mut __valist: ...) -> c_int { + vwscanf(format, __valist.as_va_list()) } #[no_mangle] diff --git a/tests/wchar/wscanf.c b/tests/wchar/wscanf.c index 55e2858c35..c74c4ded86 100644 --- a/tests/wchar/wscanf.c +++ b/tests/wchar/wscanf.c @@ -92,11 +92,5 @@ int main () wprintf(L"%d \"%s\" \"%s\" \"%s\" \"%s\"\n", ret, &protobuf, &slashbuf, &hostbuf, &pathbuf); - // wchar_t str [80]; - wchar_t wstring1[20]; - wprintf(L"Enter your family name: "); - wscanf(L"%ls", wstring1); - wprintf (L"Mr. %ls, %d years old.\n", wstring1); - return 0; }