/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 | | } |