Browse Source

Define wctype_t and wctype

Jeremy Soller 3 years ago
parent
commit
9f3aa6d4a8
5 changed files with 44 additions and 5 deletions
  1. 1 0
      include/bits/wctype.h
  2. 2 1
      include/stddef.h
  3. 1 1
      src/header/wctype/cbindgen.toml
  4. 39 2
      src/header/wctype/mod.rs
  5. 1 1
      src/platform/types.rs

+ 1 - 0
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 */

+ 2 - 1
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;

+ 1 - 1
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"

+ 39 - 2
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)

+ 1 - 1
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;