(line: &[u8])
| 710 | i |
| 711 | } |
| 712 | |
| 713 | fn alias_line(line: &[u8]) -> Option<&[u8]> { |
| 714 | let mut i = skip_sp_tab(line, 0); |
| 715 | if line.get(i) != Some(&b'#') { |
| 716 | return None; |
| 717 | } |
| 718 | i = skip_sp_tab(line, i + 1); |
| 719 | if line.len() < i + 6 || &line[i..i + 6] != b"define" { |
| 720 | return None; |
| 721 | } |
| 722 | i += 6; |
| 723 | let w = skip_sp_tab(line, i); |
| 724 | if w == i || !is_word_at(line, w) { |
| 725 | return None; |
| 726 | } |
| 727 | let name_end = word_end(line, w); |
| 728 | let name = &line[w..name_end]; |
| 729 | let v0 = skip_sp_tab(line, name_end); |
| 730 | if v0 == name_end { |
| 731 | return None; // [ \t]+ before the value |
| 732 | } |
| 733 | // (?:struct[ \t]+)* greedy, k-descending on value failure. |
| 734 | let mut stack = vec![v0]; |
| 735 | loop { |
| 736 | let cur = *stack.last().unwrap(); |
| 737 | if line.len() >= cur + 6 && &line[cur..cur + 6] == b"struct" { |
| 738 | let e = cur + 6; |
| 739 | let w2 = skip_sp_tab(line, e); |
| 740 | if w2 > e { |
| 741 | stack.push(w2); |
| 742 | continue; |
| 743 | } |
| 744 | } |
| 745 | break; |
| 746 | } |
| 747 | for &vp in stack.iter().rev() { |
| 748 | let Some(&b0) = line.get(vp) else { continue }; |
| 749 | if !(b0.is_ascii_alphabetic() || b0 == b'_') { |
| 750 | continue; // value must start [A-Za-z_] |
| 751 | } |
| 752 | let ve = word_end(line, vp); |
| 753 | // [ \t\r]*$ |
| 754 | let mut t = ve; |
| 755 | while t < line.len() && (line[t] == b' ' || line[t] == b'\t' || line[t] == b'\r') { |
| 756 | t += 1; |
| 757 | } |
| 758 | if t == line.len() { |
| 759 | return Some(name); |
| 760 | } |
| 761 | } |
| 762 | None |
| 763 | } |
| 764 | |
| 765 | /// FIELD_ASSIGN_RE: /(\w+)\s*(?:->|\.)\s*(\w+)\s*=\s*(\w+)\s*(?:->|\.)\s*(\w+)/g |
no test coverage detected