17static size_t HistoryLineSize(
const HistoryLine& line)
20 while (size < MAX_LINE_SIZE && line[size] !=
'\0')
41const HistoryLine& HistoryFromNewest(
int index_from_newest)
43 DEV_ASSERT(index_from_newest >= 0);
44 DEV_ASSERT(index_from_newest <
static_cast<int>(history_.Size()));
45 return history_[-index_from_newest - 1];
58 if (MODE == Mode::CRLF)
60 write_stream_ << ConstRawData(
"\r\n");
62 else if (MODE == Mode::LF)
64 write_stream_ << ConstRawData(
'\n');
66 else if (MODE == Mode::CR)
68 write_stream_ << ConstRawData(
'\r');
80void UpdateDisplayPosition()
82 write_stream_ << ConstRawData(KEY_SAVE) << ConstRawData(CLEAR_BEHIND)
83 << ConstRawData(&input_line_[input_line_.Size() + offset_], -offset_)
84 << ConstRawData(KEY_LOAD);
92bool CanDisplayChar() {
return input_line_.EmptySize() > 1; }
99bool CanDeleteChar() {
return input_line_.Size() + offset_ > 0; }
106void AddCharToInputLine(
char data)
110 input_line_.Push(data);
114 input_line_.Insert(data, input_line_.Size() + offset_);
116 input_line_[input_line_.Size()] =
'\0';
125void DisplayChar(
char data)
127 bool use_history =
false;
129 if (history_index_ >= 0)
131 CopyHistoryToInputLine();
135 if (CanDisplayChar())
137 AddCharToInputLine(data);
144 write_stream_ << ConstRawData(input_line_[input_line_.Size() - 1 + offset_]);
148 UpdateDisplayPosition();
153 line_truncated_ =
true;
162void RemoveCharFromInputLine()
170 input_line_.Delete(input_line_.Size() + offset_ - 1);
172 input_line_[input_line_.Size()] =
'\0';
182 bool use_history =
false;
184 if (history_index_ >= 0)
186 CopyHistoryToInputLine();
192 RemoveCharFromInputLine();
199 write_stream_ << ConstRawData(DELETE_CHAR);
204 UpdateDisplayPosition();
215 write_stream_ << ConstRawData(ramfs_.root_.GetName(), strlen(ramfs_.root_.GetName()));
216 if (current_dir_ == &ramfs_.root_)
218 write_stream_ << ConstRawData(
":/");
222 write_stream_ << ConstRawData(
":") << ConstRawData(current_dir_->GetName());
225 write_stream_ << ConstRawData(
"$ ");
236void ShowTruncatedLineNotice()
239 size_t pos =
sizeof(digits);
240 size_t value = MAX_LINE_SIZE;
243 digits[--pos] =
static_cast<char>(
'0' + value % 10);
245 }
while (value != 0);
247 write_stream_ << ConstRawData(
"Line truncated to ")
248 << ConstRawData(&digits[pos],
sizeof(digits) - pos)
249 << ConstRawData(
" characters (MAX_LINE_SIZE).");
257void ClearLine() { write_stream_ << ConstRawData(CLEAR_LINE); }
263void Clear() { write_stream_ << ConstRawData(CLEAR_ALL); }
278 if (history_index_ >= 0)
280 const auto& line = HistoryFromNewest(history_index_);
281 write_stream_ << ConstRawData(line.data(), HistoryLineSize(line));
285 write_stream_ << ConstRawData(&input_line_[0], input_line_.Size());
294void CopyHistoryToInputLine()
297 const auto& line = HistoryFromNewest(history_index_);
298 for (
size_t i = 0; i < HistoryLineSize(line); i++)
300 input_line_.Push(line[i]);
302 input_line_[input_line_.Size()] =
'\0';
305 line_truncated_ =
false;
319 const size_t line_size =
320 LibXR::min(
static_cast<size_t>(input_line_.Size()), MAX_LINE_SIZE);
321 input_line_.Push(
'\0');
324 std::memcpy(line.data(), &input_line_[0], line_size);
326 line[line_size] =
'\0';
328 if (history_.EmptySize() == 0)
constexpr auto min(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最小值 / Computes the minimum of two numbers