Преглед на файлове

Merge branch 'wctrans_api' into 'master'

wctrans/towctrans implementation proposal.

Closes #32

See merge request redox-os/relibc!356
Jeremy Soller преди 2 години
родител
ревизия
dafa716c53
променени са 3 файла, в които са добавени 27 реда и са изтрити 4 реда
  1. 23 0
      src/header/wctype/mod.rs
  2. 2 2
      tests/wctype/towlower.c
  3. 2 2
      tests/wctype/towupper.c

+ 23 - 0
src/header/wctype/mod.rs

@@ -8,6 +8,7 @@ mod casecmp;
 mod punct;
 
 pub type wctype_t = u32;
+pub type wctrans_t = *const i32;
 
 pub const WEOF: wint_t = 0xFFFF_FFFFu32;
 
@@ -24,6 +25,9 @@ pub const WCTYPE_SPACE: wctype_t = 10;
 pub const WCTYPE_UPPER: wctype_t = 11;
 pub const WCTYPE_XDIGIT: wctype_t = 12;
 
+const WCTRANSUP: wctrans_t = 1 as wctrans_t;
+const WCTRANSLW: wctrans_t = 2 as wctrans_t;
+
 #[no_mangle]
 pub extern "C" fn iswctype(wc: wint_t, desc: wctype_t) -> c_int {
     match desc {
@@ -173,3 +177,22 @@ pub extern "C" fn towlower(wc: wint_t) -> wint_t {
 pub extern "C" fn towupper(wc: wint_t) -> wint_t {
     casemap(wc, 1)
 }
+
+#[no_mangle]
+pub extern "C" fn wctrans(class: *const c_char) -> wctrans_t {
+    let class_cstr = unsafe { CStr::from_ptr(class) };
+    match class_cstr.to_bytes() {
+        b"toupper" => WCTRANSUP,
+        b"tolower" => WCTRANSLW,
+        _ => 0 as wctrans_t,
+    }
+}
+
+#[no_mangle]
+pub extern "C" fn towctrans(wc: wint_t, trans: wctrans_t) -> wint_t {
+    match trans {
+        WCTRANSUP => towupper(wc),
+        WCTRANSLW => towlower(wc),
+        _ => wc,
+    }
+}

+ 2 - 2
tests/wctype/towlower.c

@@ -6,7 +6,7 @@ int main() {
     wchar_t *str = L"HaLf WiDe ChAr StRiNg!\n";
     fputws(str, stdout);
     for (int i = 0; i < wcslen(str); i++) {
-        putwchar(towlower(str[i]));
+        putwchar(towctrans(str[i], wctrans("tolower")));
     }
     return 0;
-}
+}

+ 2 - 2
tests/wctype/towupper.c

@@ -6,7 +6,7 @@ int main() {
     wchar_t *str = L"HaLf WiDe ChAr StRiNg!\n";
     fputws(str, stdout);
     for (int i = 0; i < wcslen(str); i++) {
-        putwchar(towupper(str[i]));
+        putwchar(towctrans(str[i], wctrans("toupper")));
     }
     return 0;
-}
+}