Skip to content

Commit 28a2791

Browse files
committed
Merge PR oxibus#15: Deduplicate Value Names
2 parents ea508db + 5e4b82c commit 28a2791

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

src/parser.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//! Module containing nom parser combinators
33
//!
44
5-
use std::str;
5+
use std::{collections::HashMap, str};
66

77
use nom::{
88
branch::{alt, permutation},
@@ -1755,6 +1755,35 @@ fn signal_groups(s: &str) -> IResult<&str, SignalGroups> {
17551755
))
17561756
}
17571757

1758+
fn deduplicate_value_description_names(
1759+
mut value_descriptions: Vec<ValueDescription>,
1760+
) -> Vec<ValueDescription> {
1761+
for desc in &mut value_descriptions {
1762+
if let ValueDescription::Signal {
1763+
message_id: _,
1764+
signal_name: _,
1765+
value_descriptions,
1766+
} = desc
1767+
{
1768+
let mut name_count = HashMap::<String, i32>::new();
1769+
1770+
for val_desc in value_descriptions {
1771+
let count_entry = name_count.entry(val_desc.b.clone()).or_default();
1772+
*count_entry += 1;
1773+
1774+
if *count_entry > 1 {
1775+
let mut old_name = String::new();
1776+
std::mem::swap(&mut val_desc.b, &mut old_name);
1777+
1778+
val_desc.b = format!("{old_name}{count_entry}")
1779+
}
1780+
}
1781+
}
1782+
}
1783+
1784+
value_descriptions
1785+
}
1786+
17581787
pub fn dbc(s: &str) -> IResult<&str, DBC> {
17591788
let (
17601789
s,
@@ -1818,7 +1847,7 @@ pub fn dbc(s: &str) -> IResult<&str, DBC> {
18181847
attribute_definitions,
18191848
attribute_defaults,
18201849
attribute_values,
1821-
value_descriptions,
1850+
value_descriptions: deduplicate_value_description_names(value_descriptions),
18221851
signal_type_refs,
18231852
signal_groups,
18241853
signal_extended_value_type_list,

0 commit comments

Comments
 (0)