libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
input.hpp
1
18 void Parse(RawData& raw_data)
19 {
20 char* buff = static_cast<char*>(raw_data.addr_);
21 for (size_t i = 0; i < raw_data.size_; i++)
22 {
23 HandleCharacter(buff[i]);
24 }
25 }
26
36 void HandleAnsiCharacter(char data)
37 {
38 if (flag_ansi_ == 1)
39 {
40 if (std::isprint(static_cast<unsigned char>(data)))
41 {
42 flag_ansi_++;
43 }
44 else
45 {
46 flag_ansi_ = 0;
47 }
48 }
49 else if (flag_ansi_ == 2)
50 {
51 switch (data)
52 {
53 case 'A':
54 if (history_index_ < int(history_.Size()) - 1)
55 {
56 history_index_++;
57 ShowHistory();
58 }
59 break;
60 case 'B':
61 if (history_index_ >= 0)
62 {
63 history_index_--;
64 ShowHistory();
65 }
66 break;
67 case 'C':
68 if (history_index_ >= 0)
69 {
70 CopyHistoryToInputLine();
71 ShowHistory();
72 }
73 if (offset_ < 0)
74 {
75 offset_++;
76 write_stream_ << ConstRawData(KEY_RIGHT, sizeof(KEY_RIGHT) - 1);
77 }
78
79 break;
80 case 'D':
81 if (history_index_ >= 0)
82 {
83 CopyHistoryToInputLine();
84 ShowHistory();
85 }
86 if (offset_ + input_line_.Size() > 0)
87 {
88 offset_--;
89 write_stream_ << ConstRawData(KEY_LEFT, sizeof(KEY_LEFT) - 1);
90 }
91 break;
92 default:
93 break;
94 }
95
96 flag_ansi_ = 0;
97 }
98 }
99
110 void HandleControlCharacter(char data)
111 {
112 if (data != '\r' && data != '\n')
113 {
114 linefeed_flag_ = false;
115 linefeed_char_ = '\0';
116 }
117
118 switch (data)
119 {
120 case '\n':
121 case '\r':
122 if (linefeed_flag_ && data != linefeed_char_)
123 {
124 linefeed_flag_ = false;
125 linefeed_char_ = '\0';
126 return;
127 }
128 linefeed_flag_ = true;
129 linefeed_char_ = data;
130 if (history_index_ >= 0)
131 {
132 CopyHistoryToInputLine();
133 }
134 LineFeed();
135 if (input_line_.Size() > 0)
136 {
137 ExecuteCommand();
138 arg_number_ = 0;
139 }
140 ShowHeader();
141 input_line_.Reset();
142 input_line_[0] = '\0';
143 offset_ = 0;
144 break;
145 case 0x7f:
146 case '\b':
147 DeleteChar();
148 break;
149 case '\t':
150 AutoComplete();
151 break;
152 case '\033':
153 flag_ansi_ = 1;
154 break;
155 default:
156 break;
157 }
158 }
159
165 void HandleCharacter(char data)
166 {
167 if (flag_ansi_)
168 {
169 HandleAnsiCharacter(data);
170 }
171 else if (std::isprint(static_cast<unsigned char>(data)))
172 {
173 DisplayChar(data);
174 }
175 else
176 {
177 HandleControlCharacter(data);
178 }
179 }
consteval Error Parse(std::string_view source, size_t &pos, IndexingState &indexing, Conversion &conversion)
在前导 % 之后解析一个完整 printf 转换项 / Parse one complete printf conversion after the leading %