| 731 | |
| 732 | #[inline] |
| 733 | pub fn write_utf16_standard(writer: &mut Writer, utf16: &[u16]) { |
| 734 | #[cfg(target_endian = "little")] |
| 735 | { |
| 736 | let total_bytes = utf16.len() * 2; |
| 737 | let old_len = writer.bf.len(); |
| 738 | writer.bf.reserve(total_bytes); |
| 739 | unsafe { |
| 740 | let dest = writer.bf.as_mut_ptr().add(old_len); |
| 741 | let src = utf16.as_ptr() as *const u8; |
| 742 | std::ptr::copy_nonoverlapping(src, dest, total_bytes); |
| 743 | writer.bf.set_len(old_len + total_bytes); |
| 744 | } |
| 745 | } |
| 746 | #[cfg(target_endian = "big")] |
| 747 | { |
| 748 | let total_bytes = utf16.len() * 2; |
| 749 | let old_len = writer.bf.len(); |
| 750 | writer.bf.reserve(total_bytes); |
| 751 | unsafe { |
| 752 | let dest = writer.bf.as_mut_ptr().add(old_len); |
| 753 | // Need to swap bytes for each u16 to little-endian |
| 754 | for (i, &unit) in utf16.iter().enumerate() { |
| 755 | let swapped = unit.swap_bytes(); |
| 756 | let ptr = dest.add(i * 2) as *mut u16; |
| 757 | std::ptr::write_unaligned(ptr, swapped); |
| 758 | } |
| 759 | writer.bf.set_len(old_len + total_bytes); |
| 760 | } |
| 761 | } |
| 762 | } |
| 763 | |
| 764 | #[inline] |
| 765 | pub fn read_latin1_standard(reader: &mut Reader, len: usize) -> Result<String, Error> { |