|
1 |
| -use crate::{FunctionArgument, SectionMangler, Type}; |
| 1 | +use crate::{FunctionArgument, SectionMangler, StringEncoding, Type}; |
2 | 2 |
|
3 | 3 | use std::str;
|
4 | 4 |
|
@@ -75,8 +75,29 @@ fn type_enum(input: &str) -> ParseResult<Type> {
|
75 | 75 | .parse(input)
|
76 | 76 | }
|
77 | 77 |
|
| 78 | +fn string_encoding(input: &str) -> ParseResult<StringEncoding> { |
| 79 | + let utf8 = tag("8u").map(|_| StringEncoding::Utf8); |
| 80 | + let utf16 = tag("16u").map(|_| StringEncoding::Utf16); |
| 81 | + |
| 82 | + alt((utf8, utf16))(input) |
| 83 | +} |
| 84 | + |
| 85 | +fn type_string(input: &str) -> ParseResult<Type> { |
| 86 | + char('s') |
| 87 | + .and(string_encoding) |
| 88 | + .and(number::<usize>) |
| 89 | + .map(|((_, encoding), size)| Type::String { size, encoding }) |
| 90 | + .parse(input) |
| 91 | +} |
| 92 | + |
| 93 | +fn type_array(input: &str) -> ParseResult<Type> { |
| 94 | + char('a').and(parse_type).map(|(_, inner_ty)| Type::Array { inner: Box::new(inner_ty) }).parse(input) |
| 95 | +} |
| 96 | + |
78 | 97 | fn parse_type(input: &str) -> ParseResult<Type> {
|
79 |
| - alt((type_void, type_integer, type_float, type_pointer, type_struct, type_enum))(input) |
| 98 | + alt((type_void, type_integer, type_float, type_pointer, type_struct, type_enum, type_string, type_array))( |
| 99 | + input, |
| 100 | + ) |
80 | 101 | }
|
81 | 102 |
|
82 | 103 | fn parse_var_content<'i>(input: &'i str, name: &str) -> ParseResult<'i, SectionMangler> {
|
@@ -188,6 +209,7 @@ mod tests {
|
188 | 209 | // this needs to be handled by the toplevel parse function
|
189 | 210 | assert!(type_struct("r0u8u8").is_ok());
|
190 | 211 | assert!(type_struct("r1u8u8").is_ok());
|
| 212 | + assert!(type_struct("r5s8u1025s8u2049s8u3u64s8u3").is_ok()); |
191 | 213 |
|
192 | 214 | // invalid number of elements
|
193 | 215 | assert!(type_struct("r15u8").is_err());
|
@@ -235,4 +257,67 @@ mod tests {
|
235 | 257 |
|
236 | 258 | assert_eq!(mangled.name(), "Color.red");
|
237 | 259 | }
|
| 260 | + |
| 261 | + #[test] |
| 262 | + fn parse_complex1() { |
| 263 | + let mangled = SectionMangler::from("$RUSTY$var-__File__init:r5s8u1025s8u2049s8u3u64s8u3"); |
| 264 | + |
| 265 | + assert_eq!(mangled.name(), "__File__init"); |
| 266 | + } |
| 267 | + |
| 268 | + #[test] |
| 269 | + fn parse_complex2() { |
| 270 | + let inputs = [ |
| 271 | + "$RUSTY$var-__CosineSignal__init:r4f64i32f64f64", |
| 272 | + "$RUSTY$var-__File__init:r5s8u1025s8u2049s8u3u64s8u3", |
| 273 | + "$RUSTY$var-__SineSignal__init:r4f64i32f64f64", |
| 274 | + "$RUSTY$var-__mainProg_state.Init:e3i32", |
| 275 | + "$RUSTY$var-__mainProg_state.Running:e3i32", |
| 276 | + "$RUSTY$var-__mainProg_state.Stopped:e3i32", |
| 277 | + "$RUSTY$var-__SR__init:r3u8u8u8", |
| 278 | + "$RUSTY$var-__RS__init:r3u8u8u8", |
| 279 | + "$RUSTY$var-__CTU__init:r6u8u8i16u8i16u8", |
| 280 | + "$RUSTY$var-__CTU_INT__init:r6u8u8i16u8i16u8", |
| 281 | + "$RUSTY$var-__CTU_DINT__init:r6u8u8i32u8i32u8", |
| 282 | + "$RUSTY$var-__CTU_UDINT__init:r6u8u8u32u8u32u8", |
| 283 | + "$RUSTY$var-__CTU_LINT__init:r6u8u8i64u8i64u8", |
| 284 | + "$RUSTY$var-__CTU_ULINT__init:r6u8u8u64u8u64u8", |
| 285 | + "$RUSTY$var-__CTD__init:r6u8u8i16u8i16u8", |
| 286 | + "$RUSTY$var-__CTD_INT__init:r6u8u8i16u8i16u8", |
| 287 | + "$RUSTY$var-__CTD_DINT__init:r6u8u8i32u8i32u8", |
| 288 | + "$RUSTY$var-__CTD_UDINT__init:r6u8u8u32u8u32u8", |
| 289 | + "$RUSTY$var-__CTD_LINT__init:r6u8u8i64u8i64u8", |
| 290 | + "$RUSTY$var-__CTD_ULINT__init:r6u8u8u64u8u64u8", |
| 291 | + "$RUSTY$var-__CTUD__init:r10u8u8u8u8i16u8u8i16u8u8", |
| 292 | + "$RUSTY$var-__CTUD_INT__init:r10u8u8u8u8i16u8u8i16u8u8", |
| 293 | + "$RUSTY$var-__CTUD_DINT__init:r10u8u8u8u8i32u8u8i32u8u8", |
| 294 | + "$RUSTY$var-__CTUD_UDINT__init:r10u8u8u8u8u32u8u8u32u8u8", |
| 295 | + "$RUSTY$var-__CTUD_LINT__init:r10u8u8u8u8i64u8u8i64u8u8", |
| 296 | + "$RUSTY$var-__CTUD_ULINT__init:r10u8u8u8u8u64u8u8u64u8u8", |
| 297 | + "$RUSTY$var-__R_TRIG__init:r3u8u8u8", |
| 298 | + "$RUSTY$var-__F_TRIG__init:r3u8u8u8", |
| 299 | + "$RUSTY$var-__TP__init:r7u8i64u8i64u8u8au8", |
| 300 | + "$RUSTY$var-__TP_TIME__init:r7u8i64u8i64u8u8au8", |
| 301 | + "$RUSTY$var-__TP_LTIME__init:r7u8i64u8i64u8u8au8", |
| 302 | + "$RUSTY$var-__TON__init:r7u8i64u8i64u8u8au8", |
| 303 | + "$RUSTY$var-__TON_TIME__init:r7u8i64u8i64u8u8au8", |
| 304 | + "$RUSTY$var-__TON_LTIME__init:r7u8i64u8i64u8u8au8", |
| 305 | + "$RUSTY$var-__TOF__init:r7u8i64u8i64u8u8au8", |
| 306 | + "$RUSTY$var-__TOF_TIME__init:r7u8i64u8i64u8u8au8", |
| 307 | + "$RUSTY$var-__TOF_LTIME__init:r7u8i64u8i64u8u8au8", |
| 308 | + "$RUSTY$fn-CosineSignal:v[f64][i32][f64]", |
| 309 | + "$RUSTY$fn-File:v[s8u1025][s8u2049][s8u3]", |
| 310 | + "$RUSTY$fn-File.Open:v", |
| 311 | + "$RUSTY$fn-File.Write:v", |
| 312 | + "$RUSTY$fn-File.Close:v", |
| 313 | + "$RUSTY$fn-File.Clear:v", |
| 314 | + "$RUSTY$fn-SineSignal:v[f64][i32][f64]", |
| 315 | + "$RUSTY$fn-mainProg:v", |
| 316 | + "$RUSTY$var-mainProg:r7i32r4f64i32f64f64r4f64i32f64f64e3i32r5s8u1025s8u2049s8u3u64s8u3r5s8u1025s8u2049s8u3u64s8u3r5s8u1025s8u2049s8u3u64s8u3" |
| 317 | + ]; |
| 318 | + |
| 319 | + inputs.into_iter().for_each(|input| { |
| 320 | + let _ = SectionMangler::from(dbg!(input)); |
| 321 | + }); |
| 322 | + } |
238 | 323 | }
|
0 commit comments