|
1 | 1 | use crate::c_api::engine::{ |
2 | | - rs_gettexstring, CatCode, IntPar, Selector, ACTIVE_BASE, EQTB_SIZE, FROZEN_NULL_FONT, NULL_CS, |
3 | | - PRIM_EQTB_BASE, SCRIPT_SIZE, SINGLE_BASE, TEXT_SIZE, UNDEFINED_CONTROL_SEQUENCE, |
| 2 | + rs_gettexstring, CatCode, IntPar, NativeWordNode, Selector, ACTIVE_BASE, EQTB_SIZE, |
| 3 | + FROZEN_NULL_FONT, NULL_CS, PRIM_EQTB_BASE, SCRIPT_SIZE, SINGLE_BASE, TEXT_SIZE, |
| 4 | + UNDEFINED_CONTROL_SEQUENCE, |
4 | 5 | }; |
5 | 6 | use crate::c_api::globals::Globals; |
6 | 7 | use crate::c_api::hash::HASH_BASE; |
@@ -802,3 +803,59 @@ pub fn rs_print_size(globals: &mut Globals<'_, '_>, s: i32) { |
802 | 803 | pub extern "C" fn print_size(s: i32) { |
803 | 804 | Globals::with(|globals| rs_print_size(globals, s)) |
804 | 805 | } |
| 806 | + |
| 807 | +pub fn rs_print_write_whatsit(globals: &mut Globals<'_, '_>, s: &[u8], p: i32) { |
| 808 | + rs_print_esc_bytes(globals, s); |
| 809 | + let p = p as usize; |
| 810 | + |
| 811 | + let val = globals.engine.mem[p + 1].i32_0(); |
| 812 | + if val < 16 { |
| 813 | + rs_print_int(globals, val) |
| 814 | + } else if val == 16 { |
| 815 | + rs_print_char(globals, '*' as i32); |
| 816 | + } else { |
| 817 | + rs_print_char(globals, '-' as i32); |
| 818 | + } |
| 819 | +} |
| 820 | + |
| 821 | +#[no_mangle] |
| 822 | +pub extern "C" fn print_write_whatsit(s: *const libc::c_char, p: i32) { |
| 823 | + let s = unsafe { CStr::from_ptr(s) }.to_bytes(); |
| 824 | + Globals::with(|globals| rs_print_write_whatsit(globals, s, p)) |
| 825 | +} |
| 826 | + |
| 827 | +pub fn rs_print_native_word(globals: &mut Globals<'_, '_>, p: i32) { |
| 828 | + let p = p as usize; |
| 829 | + let size = globals.engine.node::<NativeWordNode>(p).len(); |
| 830 | + let mut skip = false; |
| 831 | + for i in 0..size { |
| 832 | + if skip { |
| 833 | + skip = false; |
| 834 | + continue; |
| 835 | + } |
| 836 | + |
| 837 | + let node = globals.engine.node::<NativeWordNode>(p); |
| 838 | + let c = node.text()[i]; |
| 839 | + if c >= 0xD800 && c < 0xDC00 { |
| 840 | + if i < size - 1 { |
| 841 | + let cc = node.text()[i + 1]; |
| 842 | + if cc >= 0xDC00 && cc < 0xE000 { |
| 843 | + let c = 0x10000 + (c as i32 - 0xD800) * 1024 + (cc as i32 - 0xDC00); |
| 844 | + rs_print_char(globals, c); |
| 845 | + skip = true; |
| 846 | + } else { |
| 847 | + rs_print(globals, '.' as i32); |
| 848 | + } |
| 849 | + } else { |
| 850 | + rs_print(globals, '.' as i32); |
| 851 | + } |
| 852 | + } else { |
| 853 | + rs_print_char(globals, c as i32); |
| 854 | + } |
| 855 | + } |
| 856 | +} |
| 857 | + |
| 858 | +#[no_mangle] |
| 859 | +pub extern "C" fn print_native_word(p: i32) { |
| 860 | + Globals::with(|globals| rs_print_native_word(globals, p)) |
| 861 | +} |
0 commit comments