@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user