• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <string_view>
17 #include "assembly-parser.h"
18 #include "utils/number-utils.h"
19 
20 namespace panda::pandasm {
21 
Make(const std::vector<panda::pandasm::Token> & t)22 void Context::Make(const std::vector<panda::pandasm::Token> &t)
23 {
24     err = {};
25 
26     ins_number = 0;
27 
28     tokens = t;
29 
30     number = 1;
31 
32     end = false;
33 
34     token = std::string_view(&*(tokens[number - 1].whole_line.begin() + tokens[number - 1].bound_left),
35                              tokens[number - 1].bound_right - tokens[number - 1].bound_left);
36 
37     id = this->tokens[number - 1].type;
38 }
39 
Len() const40 size_t Context::Len() const
41 {
42     return token.size();
43 }
44 
ValidateRegisterName(char c,size_t n) const45 bool Context::ValidateRegisterName(char c, size_t n) const
46 {
47     if (token[0] == c) {
48         std::string_view p = token;
49 
50         p.remove_prefix(1);
51 
52         if (p.empty() || (p.size() > 1 && p[0] == '0')) {
53             return false;
54         }
55 
56         if (c != 'a') {
57             for (const auto &ch : p) {
58                 if (std::isdigit(ch) == 0) {
59                     return false;
60                 }
61             }
62         } else {
63             if (ToNumber(p) > n) {
64                 return false;
65             }
66         }
67 
68         return true;
69     }
70 
71     return false;
72 }
73 
ValidateParameterName(size_t number_of_params_already_is) const74 bool Context::ValidateParameterName(size_t number_of_params_already_is) const
75 {
76     if (number_of_params_already_is >= MAX_DWORD) {
77         return false;
78     }
79 
80     if (token[0] == 'a') {
81         std::string_view p = token;
82 
83         p.remove_prefix(1);
84 
85         if (ToNumber(p) == number_of_params_already_is) {
86             return true;
87         }
88     }
89 
90     return false;
91 }
92 
GiveToken()93 std::string_view Context::GiveToken()
94 {
95     return token;
96 }
97 
Next()98 Token::Type Context::Next()
99 {
100     if (this->tokens.size() > number) {
101         return this->tokens[number].type;
102     }
103 
104     return this->tokens[number - 1].type;
105 }
106 
UpSignOperation()107 void Context::UpSignOperation()
108 {
109     signop = id;
110 }
111 
WaitFor()112 Token::Type Context::WaitFor()
113 {
114     return signop;
115 }
116 
Mask()117 bool Context::Mask()
118 {
119     return end;
120 }
121 
NextMask()122 bool Context::NextMask()
123 {
124     if (end) {
125         return true;
126     }
127 
128     return this->tokens.size() < number + 1;
129 }
130 
131 // NOLINTNEXTLINE(cert-dcl21-cpp)
operator ++(int)132 Token::Type Context::operator++(int)
133 {
134     Token::Type last_id = id;
135 
136     if (this->tokens.size() > number) {
137         ++number;
138 
139         id = this->tokens[number - 1].type;
140 
141         token = std::string_view(&*(tokens[number - 1].whole_line.begin() + tokens[number - 1].bound_left),
142                                  tokens[number - 1].bound_right - tokens[number - 1].bound_left);
143     } else {
144         end = true;
145     }
146 
147     return last_id;
148 }
149 
operator ++()150 Token::Type Context::operator++()
151 {
152     if (this->tokens.size() > number) {
153         ++number;
154 
155         id = this->tokens[number - 1].type;
156 
157         token = std::string_view(&*(tokens[number - 1].whole_line.begin() + tokens[number - 1].bound_left),
158                                  tokens[number - 1].bound_right - tokens[number - 1].bound_left);
159     } else {
160         end = true;
161     }
162 
163     return id;
164 }
165 
166 // NOLINTNEXTLINE(cert-dcl21-cpp)
operator --(int)167 Token::Type Context::operator--(int)
168 {
169     Token::Type last_id = id;
170 
171     if (1 < number) {
172         end = false;
173 
174         --number;
175 
176         id = this->tokens[number - 1].type;
177 
178         token = std::string_view(&*(tokens[number - 1].whole_line.begin() + tokens[number - 1].bound_left),
179                                  tokens[number - 1].bound_right - tokens[number - 1].bound_left);
180     } else {
181         end = false;
182     }
183 
184     return last_id;
185 }
186 
operator --()187 Token::Type Context::operator--()
188 {
189     if (1 < number) {
190         end = false;
191 
192         --number;
193 
194         id = this->tokens[number - 1].type;
195 
196         token = std::string_view(&*(tokens[number - 1].whole_line.begin() + tokens[number - 1].bound_left),
197                                  tokens[number - 1].bound_right - tokens[number - 1].bound_left);
198     } else {
199         end = false;
200     }
201 
202     return id;
203 }
204 
operator *()205 Token::Type Context::operator*()
206 {
207     return id;
208 }
209 
210 }  // namespace panda::pandasm
211