/src/CMake/Source/cmGeneratorExpressionLexer.cxx
Line | Count | Source |
1 | | /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
2 | | file LICENSE.rst or https://cmake.org/licensing for details. */ |
3 | | #include "cmGeneratorExpressionLexer.h" |
4 | | |
5 | 2.48k | cmGeneratorExpressionLexer::cmGeneratorExpressionLexer() = default; |
6 | | |
7 | | static void InsertText(char const* upto, char const* c, |
8 | | std::vector<cmGeneratorExpressionToken>& result) |
9 | 544k | { |
10 | 544k | if (upto != c) { |
11 | 60.3k | result.emplace_back(cmGeneratorExpressionToken::Text, upto, c - upto); |
12 | 60.3k | } |
13 | 544k | } |
14 | | |
15 | | std::vector<cmGeneratorExpressionToken> cmGeneratorExpressionLexer::Tokenize( |
16 | | std::string const& input) |
17 | 2.48k | { |
18 | 2.48k | std::vector<cmGeneratorExpressionToken> result; |
19 | | |
20 | 2.48k | if (input.find('$') == std::string::npos) { |
21 | 252 | result.emplace_back(cmGeneratorExpressionToken::Text, input.c_str(), |
22 | 252 | input.size()); |
23 | 252 | return result; |
24 | 252 | } |
25 | | |
26 | 2.23k | char const* c = input.c_str(); |
27 | 2.23k | char const* upto = c; |
28 | | |
29 | 852k | for (; *c; ++c) { |
30 | 850k | switch (*c) { |
31 | 333k | case '$': |
32 | 333k | if (c[1] == '<') { |
33 | 322k | InsertText(upto, c, result); |
34 | 322k | result.emplace_back(cmGeneratorExpressionToken::BeginExpression, c, |
35 | 322k | 2); |
36 | 322k | upto = c + 2; |
37 | 322k | ++c; |
38 | 322k | this->SawBeginExpression = true; |
39 | 322k | } |
40 | 333k | break; |
41 | 55.1k | case '>': |
42 | 55.1k | InsertText(upto, c, result); |
43 | 55.1k | result.emplace_back(cmGeneratorExpressionToken::EndExpression, c, 1); |
44 | 55.1k | upto = c + 1; |
45 | 55.1k | this->SawGeneratorExpression = this->SawBeginExpression; |
46 | 55.1k | break; |
47 | 134k | case ':': |
48 | 134k | InsertText(upto, c, result); |
49 | 134k | result.emplace_back(cmGeneratorExpressionToken::ColonSeparator, c, 1); |
50 | 134k | upto = c + 1; |
51 | 134k | break; |
52 | 30.1k | case ',': |
53 | 30.1k | InsertText(upto, c, result); |
54 | 30.1k | result.emplace_back(cmGeneratorExpressionToken::CommaSeparator, c, 1); |
55 | 30.1k | upto = c + 1; |
56 | 30.1k | break; |
57 | 297k | default: |
58 | 297k | break; |
59 | 850k | } |
60 | 850k | } |
61 | 2.23k | InsertText(upto, c, result); |
62 | | |
63 | 2.23k | return result; |
64 | 2.23k | } |