mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-24 10:08:00 -06:00
Read doubled-sign integers like --280 in the COS lexer (#3299)
* Read doubled-sign integers like --280 in the COS lexer Fixes #3111 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * COS lexer: strip the doubled sign without allocating Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
co-authored by
Claude Haiku 5.5
Brandon Thomas
parent
f280ca8e6d
commit
104411dc7a
@@ -337,11 +337,14 @@ impl<'a> Lexer<'a> {
|
||||
}
|
||||
return Ok(Object::Real(0.0));
|
||||
}
|
||||
match s.trim_start_matches('+').parse::<i64>() {
|
||||
// Tolerate a doubled sign ("--280") like the real branch does.
|
||||
let t = s.trim_start_matches('+');
|
||||
let cleaned = t.strip_prefix('-').filter(|r| r.starts_with('-')).unwrap_or(t);
|
||||
match cleaned.parse::<i64>() {
|
||||
Ok(v) => Ok(Object::Int(v)),
|
||||
Err(_) => {
|
||||
// Out-of-range integers are treated as reals (§7.3.3 allows implementation limits).
|
||||
s.parse::<f64>().map(Object::Real).map_err(|_| CosError::Syntax { offset: start, detail: format!("bad number {s:?}") })
|
||||
cleaned.parse::<f64>().map(Object::Real).map_err(|_| CosError::Syntax { offset: start, detail: format!("bad number {s:?}") })
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -475,6 +478,20 @@ mod tests {
|
||||
Lexer::new(s.as_bytes(), 0).object().unwrap_or_else(|e| panic!("{s}: {e}"))
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn doubled_sign_integer_reads_like_the_real_form() {
|
||||
// Some writers emit a TJ kerning as "--280"; the real form "--280.0" is already read.
|
||||
assert_eq!(obj("--280.0"), Object::Real(-280.0));
|
||||
assert_eq!(obj("--280"), Object::Int(-280));
|
||||
match obj("[(Hello) --280 (World)]") {
|
||||
Object::Array(items) => {
|
||||
assert_eq!(items.len(), 3);
|
||||
assert_eq!(items[1], Object::Int(-280));
|
||||
}
|
||||
other => panic!("not an array: {other:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn scalars() {
|
||||
assert_eq!(obj("true"), Object::Bool(true));
|
||||
|
||||
Reference in New Issue
Block a user