From 745f32f3bdf1581fcc8325cb311bf1d0d7b8fbb3 Mon Sep 17 00:00:00 2001 From: Marrub Date: Tue, 12 Mar 2019 03:38:06 -0400 Subject: [PATCH] fix mac_roman_cstr API (should never fail) --- Cargo.toml | 1 + source/durandal/text.rs | 15 ++++++++------- source/marathon/map.rs | 4 ++-- source/marathon/trm.rs | 2 +- source/marathon/wad.rs | 2 +- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b4b96a2..606ca45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ members = ["source/leela", "source/tycho"] bitflags = "1.0" failure = {version = "0.1", features = ["std"]} serde = {version = "1.0", features = ["derive"]} +memchr = "2.0" [profile.dev] opt-level = 1 diff --git a/source/durandal/text.rs b/source/durandal/text.rs index 82553a0..375b193 100644 --- a/source/durandal/text.rs +++ b/source/durandal/text.rs @@ -1,7 +1,5 @@ //! Text conversion utilities. -use crate::durandal::err::*; - /// Formats a binary size string for any given number. /// /// # Examples @@ -103,14 +101,17 @@ pub fn mac_roman_conv(s: &[u8]) -> String /// ``` /// use maraiah::durandal::text::mac_roman_cstr; /// -/// assert_eq!(mac_roman_cstr(b"I\xd5ve awaken\0ed").unwrap(), "I’ve awaken"); +/// assert_eq!(mac_roman_cstr(b"I\xd5ve awaken\0ed"), "I’ve awaken"); +/// assert_eq!(mac_roman_cstr(b"I\xd5ve awaken\0"), "I’ve awaken"); +/// assert_eq!(mac_roman_cstr(b"I\xd5ve awaken"), "I’ve awaken"); /// ``` -pub fn mac_roman_cstr(s: &[u8]) -> ResultS +#[inline] +pub fn mac_roman_cstr(s: &[u8]) -> String { - if let Some(s) = s.split(|&n| n == 0).nth(0) { - Ok(mac_roman_conv(s)) + if let Some(n) = memchr::memchr(0, s) { + mac_roman_conv(&s[..n]) } else { - bail!("no null in C string"); + mac_roman_conv(s) } } diff --git a/source/marathon/map.rs b/source/marathon/map.rs index 81f4724..9a03300 100644 --- a/source/marathon/map.rs +++ b/source/marathon/map.rs @@ -55,7 +55,7 @@ pub fn read_minf(b: &[u8]) -> ResultS skypict_id = u16[4]; miss_flags = u16[6]; envi_flags = u16[8]; - level_name = mac_roman_cstr[18..84]; + level_name = mac_roman_cstr[18..84] no_try; entr_flags = u32[84]; } @@ -425,7 +425,7 @@ pub fn read_note(b: &[u8]) -> ResultS<(Note, usize)> 72, BE in b => pos = read_point[2..6]; poly = u16[6]; - text = mac_roman_cstr[8..72]; + text = mac_roman_cstr[8..72] no_try; } Ok((Note{pos, poly, text}, 72)) diff --git a/source/marathon/trm.rs b/source/marathon/trm.rs index 3fd0666..0b50921 100644 --- a/source/marathon/trm.rs +++ b/source/marathon/trm.rs @@ -83,7 +83,7 @@ pub fn read_term(b: &[u8]) -> ResultS<(Terminal, usize)> let beg = grp.beg; let len = grp.len; let text = ok!(text.get(beg..beg + len), "bad offset")?; - let text = mac_roman_cstr(text)?; + let text = mac_roman_cstr(text); groups.push(Group{flags, ttype, lines, text}); } diff --git a/source/marathon/wad.rs b/source/marathon/wad.rs index eed5b61..9c55d88 100644 --- a/source/marathon/wad.rs +++ b/source/marathon/wad.rs @@ -105,7 +105,7 @@ pub fn read_wad(b: &[u8]) -> ResultS 128, BE in b => ver_wad = u16[0]; ver_dat = u16[2]; - name = mac_roman_cstr[4..68]; + name = mac_roman_cstr[4..68] no_try; siz_app = u16[78] usize; siz_wcnk = u16[80] usize; siz_went = u16[82] usize;