diff --git a/include/bits/wctype.h b/include/bits/wctype.h index fc221353327f9f1f0a62a18cfbcab6d03be7573b..6dc4a0de52070931089004a216aa422aba4c2113 100644 --- a/include/bits/wctype.h +++ b/include/bits/wctype.h @@ -2,6 +2,7 @@ #define _BITS_WCTYPE_H #include <stdint.h> +#define __need_wctype_t #define __need_wint_t #endif /* _BITS_WCTYPE_H */ diff --git a/include/stddef.h b/include/stddef.h index 1ee56ff6f312302930489d2e6d07e653cf97727c..895f5c449066191ec2726655b09e94565822d7be 100644 --- a/include/stddef.h +++ b/include/stddef.h @@ -12,7 +12,8 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t; #ifndef __cplusplus typedef int32_t wchar_t; #endif /* #ifndef __cplusplus */ -typedef int32_t wint_t; +typedef uint32_t wctype_t; +typedef uint32_t wint_t; typedef long unsigned int size_t; diff --git a/src/header/wctype/cbindgen.toml b/src/header/wctype/cbindgen.toml index 032cfcb0ab7866b2b8409ee34c800ebfd935bda7..58fb8271bd09523da7f454356fa232c97a8b097b 100644 --- a/src/header/wctype/cbindgen.toml +++ b/src/header/wctype/cbindgen.toml @@ -1,4 +1,4 @@ -sys_includes = ["stddef.h", "stdint.h", "time.h", "stdio.h" ] +sys_includes = ["wchar.h" ] include_guard = "_RELIBC_WCTYPE_H" header = "#include <bits/wctype.h>" language = "C" diff --git a/src/header/wctype/mod.rs b/src/header/wctype/mod.rs index b4b7b0eaa9e8222099ec3e775b914bea47d9bac6..d571aef16f94db31879560de9b9d4267721344f5 100644 --- a/src/header/wctype/mod.rs +++ b/src/header/wctype/mod.rs @@ -1,11 +1,48 @@ -//! wchar implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/wchar.h.html +//! wchar implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/wctype.h.html -use crate::platform::types::*; +use crate::{ + c_str::CStr, + platform::types::*, +}; mod casecmp; use casecmp::casemap; + pub const WEOF: wint_t = 0xFFFF_FFFFu32; +pub const WCTYPE_ALNUM: wctype_t = 1; +pub const WCTYPE_ALPHA: wctype_t = 2; +pub const WCTYPE_BLANK: wctype_t = 3; +pub const WCTYPE_CNTRL: wctype_t = 4; +pub const WCTYPE_DIGIT: wctype_t = 5; +pub const WCTYPE_GRAPH: wctype_t = 6; +pub const WCTYPE_LOWER: wctype_t = 7; +pub const WCTYPE_PRINT: wctype_t = 8; +pub const WCTYPE_PUNCT: wctype_t = 9; +pub const WCTYPE_SPACE: wctype_t = 10; +pub const WCTYPE_UPPER: wctype_t = 11; +pub const WCTYPE_XDIGIT: wctype_t = 12; + +#[no_mangle] +pub unsafe extern "C" fn wctype(name: *const c_char) -> wctype_t { + let name_cstr = CStr::from_ptr(name); + match name_cstr.to_bytes() { + b"alnum" => WCTYPE_ALNUM, + b"alpha" => WCTYPE_ALPHA, + b"blank" => WCTYPE_BLANK, + b"cntrl" => WCTYPE_CNTRL, + b"digit" => WCTYPE_DIGIT, + b"graph" => WCTYPE_GRAPH, + b"lower" => WCTYPE_LOWER, + b"print" => WCTYPE_PRINT, + b"punct" => WCTYPE_PUNCT, + b"space" => WCTYPE_SPACE, + b"upper" => WCTYPE_UPPER, + b"xdigit" => WCTYPE_XDIGIT, + _ => 0 + } +} + #[no_mangle] pub extern "C" fn towlower(wc: wint_t) -> wint_t { casemap(wc, 0) diff --git a/src/platform/types.rs b/src/platform/types.rs index 5d604d383a0f3e8a995aaad7c7a8f05caab30c7b..f489829399372f54026a6e88d50c59c7554ff6cc 100644 --- a/src/platform/types.rs +++ b/src/platform/types.rs @@ -45,8 +45,8 @@ pub type c_long = i64; pub type c_ulong = u64; pub type wchar_t = i32; +pub type wctype_t = u32; pub type wint_t = u32; -pub type wctype_t = i64; pub type regoff_t = size_t; pub type off_t = c_long;