Coverage Report

Created: 2026-10-10 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/html5ever/xml5ever/src/tokenizer/qname.rs
Line
Count
Source
1
// Copyright 2014-2017 The html5ever Project Developers. See the
2
// COPYRIGHT file at the top-level directory of this distribution.
3
//
4
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7
// option. This file may not be copied, modified, or distributed
8
// except according to those terms.
9
10
enum QualNameState {
11
    BeforeName,
12
    InName,
13
    AfterColon,
14
}
15
16
pub struct QualNameTokenizer<'a> {
17
    state: QualNameState,
18
    slice: &'a [u8],
19
    valid_index: Option<u32>,
20
    curr_ind: usize,
21
}
22
23
impl QualNameTokenizer<'_> {
24
2.91M
    pub fn new(tag: &[u8]) -> QualNameTokenizer<'_> {
25
2.91M
        QualNameTokenizer {
26
2.91M
            state: QualNameState::BeforeName,
27
2.91M
            slice: tag,
28
2.91M
            valid_index: None,
29
2.91M
            curr_ind: 0,
30
2.91M
        }
31
2.91M
    }
32
33
2.91M
    pub fn run(&mut self) -> Option<u32> {
34
2.91M
        if !self.slice.is_empty() {
35
            loop {
36
78.6M
                if !self.step() {
37
2.91M
                    break;
38
75.6M
                }
39
            }
40
0
        }
41
2.91M
        self.valid_index
42
2.91M
    }
43
44
78.5M
    fn incr(&mut self) -> bool {
45
78.5M
        if self.curr_ind + 1 < self.slice.len() {
46
75.6M
            self.curr_ind += 1;
47
75.6M
            return true;
48
2.83M
        }
49
2.83M
        false
50
78.5M
    }
51
52
78.6M
    fn step(&mut self) -> bool {
53
78.6M
        match self.state {
54
2.91M
            QualNameState::BeforeName => self.do_before_name(),
55
38.5M
            QualNameState::InName => self.do_in_name(),
56
37.1M
            QualNameState::AfterColon => self.do_after_colon(),
57
        }
58
78.6M
    }
59
60
2.91M
    fn do_before_name(&mut self) -> bool {
61
2.91M
        if self.slice[self.curr_ind] == b':' {
62
16.3k
            false
63
        } else {
64
2.89M
            self.state = QualNameState::InName;
65
2.89M
            self.incr()
66
        }
67
2.91M
    }
68
69
38.5M
    fn do_in_name(&mut self) -> bool {
70
38.5M
        if self.slice[self.curr_ind] == b':' && self.curr_ind + 1 < self.slice.len() {
71
2.00M
            self.valid_index = Some(self.curr_ind as u32);
72
2.00M
            self.state = QualNameState::AfterColon;
73
36.5M
        }
74
38.5M
        self.incr()
75
38.5M
    }
76
77
37.1M
    fn do_after_colon(&mut self) -> bool {
78
37.1M
        if self.slice[self.curr_ind] == b':' {
79
62.2k
            self.valid_index = None;
80
62.2k
            return false;
81
37.0M
        }
82
37.0M
        self.incr()
83
37.1M
    }
84
}