wctrans/towctrans implementation proposal.

close #32
This commit is contained in:
David Carlier
2023-03-27 19:13:47 +01:00
parent 2c3561e888
commit ec6243bc5b
3 changed files with 27 additions and 4 deletions
+23
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
}