libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
input.hpp
1
18void 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
36void 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
110void 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 (line_truncated_)
136 {
137 ShowTruncatedLineNotice();
138 line_truncated_ = false;
139 }
140 if (input_line_.Size() > 0)
141 {
142 ExecuteCommand();
143 arg_number_ = 0;
144 }
145 ShowHeader();
146 input_line_.Reset();
147 input_line_[0] = '\0';
148 offset_ = 0;
149 break;
150 case 0x7f:
151 case '\b':
152 DeleteChar();
153 break;
154 case '\t':
155 AutoComplete();
156 break;
157 case '\033':
158 flag_ansi_ = 1;
159 break;
160 default:
161 break;
162 }
163}
164
170void HandleCharacter(char data)
171{
172 if (flag_ansi_)
173 {
174 HandleAnsiCharacter(data);
175 }
176 else if (std::isprint(static_cast<unsigned char>(data)))
177 {
178 DisplayChar(data);
179 }
180 else
181 {
182 HandleControlCharacter(data);
183 }
184}
consteval Error Parse(std::string_view source, size_t &pos, IndexingState &indexing, Conversion &conversion)
在前导 % 之后解析一个完整 printf 转换项 / Parse one complete printf conversion after the leading %