mmd_anim_format/
normalize.rs1use crate::sjis::decode_sjis;
2
3pub fn normalize_vmd_name(bytes: &[u8]) -> Vec<u8> {
4 let end = bytes.iter().position(|&b| b == 0).unwrap_or(bytes.len());
5 decode_sjis(&bytes[..end]).into_bytes()
6}
7
8#[cfg(test)]
9mod tests {
10 use super::*;
11
12 #[test]
13 fn ascii_name_preserved() {
14 assert_eq!(normalize_vmd_name(b"BoneA"), b"BoneA".to_vec());
15 }
16
17 #[test]
18 fn japanese_name_decoded_to_utf8() {
19 let sjis: &[u8] = &[0x83, 0x65, 0x83, 0x58, 0x83, 0x67];
20 let utf8: &[u8] = &[0xE3, 0x83, 0x86, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88];
21 assert_eq!(normalize_vmd_name(sjis), utf8.to_vec());
22 }
23
24 #[test]
25 fn empty_name_stays_empty() {
26 assert_eq!(normalize_vmd_name(b""), b"".to_vec());
27 }
28
29 #[test]
30 fn trailing_nul_is_trimmed() {
31 assert_eq!(normalize_vmd_name(b"BoneA\0\0"), b"BoneA".to_vec());
32 }
33}