17 static size_t HistoryLineSize(
const HistoryLine& line)
20 while (size < MAX_LINE_SIZE && line[size] !=
'\0')
41 const HistoryLine& HistoryFromNewest(
int index_from_newest)
43 ASSERT(index_from_newest >= 0);
44 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');
80 void UpdateDisplayPosition()
82 write_stream_ << ConstRawData(KEY_SAVE) << ConstRawData(CLEAR_BEHIND)
83 << ConstRawData(&input_line_[input_line_.Size() + offset_], -offset_)
84 << ConstRawData(KEY_LOAD);
92 bool CanDisplayChar() {
return input_line_.EmptySize() > 1; }
99 bool CanDeleteChar() {
return input_line_.Size() + offset_ > 0; }
106 void AddCharToInputLine(
char data)
110 input_line_.Push(data);
114 input_line_.Insert(data, input_line_.Size() + offset_);
116 input_line_[input_line_.Size()] =
'\0';
125 void 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();
158 void RemoveCharFromInputLine()
166 input_line_.Delete(input_line_.Size() + offset_ - 1);
168 input_line_[input_line_.Size()] =
'\0';
178 bool use_history =
false;
180 if (history_index_ >= 0)
182 CopyHistoryToInputLine();
188 RemoveCharFromInputLine();
195 write_stream_ << ConstRawData(DELETE_CHAR);
200 UpdateDisplayPosition();
211 write_stream_ << ConstRawData(ramfs_.root_.GetName(), strlen(ramfs_.root_.GetName()));
212 if (current_dir_ == &ramfs_.root_)
214 write_stream_ << ConstRawData(
":/");
218 write_stream_ << ConstRawData(
":") << ConstRawData(current_dir_->GetName());
221 write_stream_ << ConstRawData(
"$ ");
228 void ClearLine() { write_stream_ << ConstRawData(CLEAR_LINE); }
234 void Clear() { write_stream_ << ConstRawData(CLEAR_ALL); }
249 if (history_index_ >= 0)
251 const auto& line = HistoryFromNewest(history_index_);
252 write_stream_ << ConstRawData(line.data(), HistoryLineSize(line));
256 write_stream_ << ConstRawData(&input_line_[0], input_line_.Size());
265 void CopyHistoryToInputLine()
268 const auto& line = HistoryFromNewest(history_index_);
269 for (
size_t i = 0; i < HistoryLineSize(line); i++)
271 input_line_.Push(line[i]);
273 input_line_[input_line_.Size()] =
'\0';
289 const size_t line_size =
290 LibXR::min(
static_cast<size_t>(input_line_.Size()), MAX_LINE_SIZE);
291 input_line_.Push(
'\0');
294 std::memcpy(line.data(), &input_line_[0], line_size);
296 line[line_size] =
'\0';
298 if (history_.EmptySize() == 0)
constexpr auto min(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最小值