use crate::MiscCodecError;
use crate::MiscCodecResult;
#[derive(Debug, Clone, Copy)]
pub(crate) struct LiteralComponents<'a> {
pub(crate) radix: u32,
pub(crate) digits: &'a str,
pub(crate) digits_offset: usize,
}
impl<'a> LiteralComponents<'a> {
#[inline]
pub(crate) fn parse(trimmed: &'a str, trim_offset: usize) -> MiscCodecResult<Self> {
if let Some(digits) = trimmed.strip_prefix("0x").or_else(|| trimmed.strip_prefix("0X")) {
if digits.is_empty() {
return Err(MiscCodecError::InvalidInput {
codec: "c-integer-literal",
reason: "hexadecimal literal requires at least one digit".to_owned(),
});
}
return Ok(Self {
radix: 16,
digits,
digits_offset: trim_offset + 2,
});
}
if trimmed.len() > 1
&& let Some(digits) = trimmed.strip_prefix('0')
{
return Ok(Self {
radix: 8,
digits,
digits_offset: trim_offset + 1,
});
}
Ok(Self {
radix: 10,
digits: trimmed,
digits_offset: trim_offset,
})
}
}