Skip to content

Commit

Permalink
restrict group level
Browse files Browse the repository at this point in the history
Signed-off-by: Nico Wagner <[email protected]>
  • Loading branch information
nwagner84 committed Aug 28, 2024
1 parent fca0dab commit cdd9764
Showing 1 changed file with 36 additions and 6 deletions.
42 changes: 36 additions & 6 deletions crates/pica-format/src/parse.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
use std::cell::RefCell;

use bstr::ByteSlice;
use pica_matcher::parser::{
parse_occurrence_matcher, parse_subfield_matcher, parse_tag_matcher,
};
use winnow::ascii::{multispace0, multispace1};
use winnow::combinator::{
alt, delimited, opt, preceded, repeat, separated,
alt, delimited, opt, preceded, repeat, separated, terminated,
};
use winnow::error::{ContextError, ParserError};
use winnow::prelude::*;
Expand Down Expand Up @@ -54,12 +56,40 @@ fn parse_value(i: &mut &[u8]) -> PResult<Value> {
.parse_next(i)
}

thread_local! {
pub static GROUP_LEVEL: RefCell<u32> = const { RefCell::new(0) };
}

fn increment_group_level(i: &mut &[u8]) -> PResult<()> {
GROUP_LEVEL.with(|level| {
*level.borrow_mut() += 1;
if *level.borrow() >= 32 {
Err(winnow::error::ErrMode::from_error_kind(
i,
winnow::error::ErrorKind::Many,
))
} else {
Ok(())
}
})
}

fn decrement_group_level() {
GROUP_LEVEL.with(|level| {
*level.borrow_mut() -= 1;
})
}

fn parse_group(i: &mut &[u8]) -> PResult<Group> {
delimited(ws('('), parse_fragments, ws(')'))
.map(|fragments| Group {
fragments: Box::new(fragments),
})
.parse_next(i)
delimited(
terminated(ws('('), increment_group_level),
parse_fragments,
ws(')').map(|_| decrement_group_level()),
)
.map(|fragments| Group {
fragments: Box::new(fragments),
})
.parse_next(i)
}

fn parse_list(i: &mut &[u8]) -> PResult<List> {
Expand Down

0 comments on commit cdd9764

Please sign in to comment.