| 208 |
} |
} |
| 209 |
|
|
| 210 |
// Split current data line if over-length |
// Split current data line if over-length |
| 211 |
if (len_data_line + str_len + 1 > MAX_EDITOR_DATA_LINE_LENGTH) |
if (len_data_line + str_len + 1 > MAX_EDITOR_DATA_LINE_LENGTH || str[0] == CR) |
| 212 |
{ |
{ |
| 213 |
if (p_editor_data->display_line_total >= MAX_EDITOR_DATA_LINES || p_editor_data->data_line_total >= MAX_EDITOR_DATA_LINES) |
if (p_editor_data->display_line_total >= MAX_EDITOR_DATA_LINES || p_editor_data->data_line_total >= MAX_EDITOR_DATA_LINES) |
| 214 |
{ |
{ |
| 227 |
p_editor_data->p_data_lines[p_editor_data->data_line_total] = p_data_line; |
p_editor_data->p_data_lines[p_editor_data->data_line_total] = p_data_line; |
| 228 |
(p_editor_data->data_line_total)++; |
(p_editor_data->data_line_total)++; |
| 229 |
|
|
| 230 |
if (offset_data_line + str_len + 1 < MAX_EDITOR_DATA_LINE_LENGTH) |
if (offset_data_line + str_len + 1 >= MAX_EDITOR_DATA_LINE_LENGTH || str[0] == CR) |
| 231 |
{ |
{ |
| 232 |
// Copy rest part of current data line to new data line |
if (str[0] == CR) |
| 233 |
memcpy(p_data_line, |
{ |
| 234 |
p_editor_data->p_display_lines[display_line] + offset, |
str_len = 0; |
| 235 |
(size_t)(len_data_line - offset_data_line)); |
} |
|
|
|
|
p_data_line[len_data_line - offset_data_line] = '\0'; |
|
|
|
|
|
// Append str to current display line |
|
|
memcpy(p_editor_data->p_display_lines[display_line] + offset, str, (size_t)str_len); |
|
|
|
|
|
// Add line ending to current display line (data line) |
|
|
p_editor_data->p_display_lines[display_line][offset + str_len] = '\n'; |
|
|
p_editor_data->p_display_lines[display_line][offset + str_len + 1] = '\0'; |
|
|
p_editor_data->display_line_lengths[display_line] = offset + str_len + 1; |
|
| 236 |
|
|
|
*p_display_line = display_line; |
|
|
*p_offset = offset + str_len; |
|
|
} |
|
|
else |
|
|
{ |
|
| 237 |
// Copy str to new data line |
// Copy str to new data line |
| 238 |
memcpy(p_data_line, str, (size_t)str_len); |
memcpy(p_data_line, str, (size_t)str_len); |
| 239 |
|
|
| 252 |
*p_display_line = display_line + 1; |
*p_display_line = display_line + 1; |
| 253 |
*p_offset = str_len; |
*p_offset = str_len; |
| 254 |
} |
} |
| 255 |
|
else |
| 256 |
|
{ |
| 257 |
|
// Copy rest part of current data line to new data line |
| 258 |
|
memcpy(p_data_line, |
| 259 |
|
p_editor_data->p_display_lines[display_line] + offset, |
| 260 |
|
(size_t)(len_data_line - offset_data_line)); |
| 261 |
|
|
| 262 |
|
p_data_line[len_data_line - offset_data_line] = '\0'; |
| 263 |
|
|
| 264 |
|
// Append str to current display line |
| 265 |
|
memcpy(p_editor_data->p_display_lines[display_line] + offset, str, (size_t)str_len); |
| 266 |
|
|
| 267 |
|
// Add line ending to current display line (data line) |
| 268 |
|
p_editor_data->p_display_lines[display_line][offset + str_len] = '\n'; |
| 269 |
|
p_editor_data->p_display_lines[display_line][offset + str_len + 1] = '\0'; |
| 270 |
|
p_editor_data->display_line_lengths[display_line] = offset + str_len + 1; |
| 271 |
|
|
| 272 |
|
*p_display_line = display_line; |
| 273 |
|
*p_offset = offset + str_len; |
| 274 |
|
} |
| 275 |
|
|
| 276 |
split_line_total = last_display_line - display_line + 3; |
split_line_total = last_display_line - display_line + 3; |
| 277 |
|
|
| 282 |
} |
} |
| 283 |
else // insert str into current data line at offset_data_line |
else // insert str into current data line at offset_data_line |
| 284 |
{ |
{ |
|
log_error("Insert %d chars into display_line = %d, offset = %d\n", str_len, display_line, offset); |
|
|
|
|
| 285 |
memmove(p_data_line + offset_data_line + str_len, p_data_line + offset_data_line, (size_t)(len_data_line - offset_data_line)); |
memmove(p_data_line + offset_data_line + str_len, p_data_line + offset_data_line, (size_t)(len_data_line - offset_data_line)); |
| 286 |
memcpy(p_data_line + offset_data_line, str, (size_t)str_len); |
memcpy(p_data_line + offset_data_line, str, (size_t)str_len); |
| 287 |
p_data_line[len_data_line + str_len] = '\0'; |
p_data_line[len_data_line + str_len] = '\0'; |
| 296 |
|
|
| 297 |
// Split current data line since beginning of current display line |
// Split current data line since beginning of current display line |
| 298 |
split_line_total = split_data_lines(p_data_line, SCREEN_COLS, line_offsets, split_line_total); |
split_line_total = split_data_lines(p_data_line, SCREEN_COLS, line_offsets, split_line_total); |
|
log_error("Debug: split data line, display_line = %ld, j = %ld\n", display_line, split_line_total); |
|
| 299 |
|
|
| 300 |
for (i = 0; i < split_line_total; i++) |
for (i = 0; i < split_line_total; i++) |
| 301 |
{ |
{ |
| 325 |
if (p_editor_data->display_line_lengths[display_line + i] > 0 && |
if (p_editor_data->display_line_lengths[display_line + i] > 0 && |
| 326 |
p_editor_data->p_display_lines[display_line + i][p_editor_data->display_line_lengths[display_line + i] - 1] == '\n') |
p_editor_data->p_display_lines[display_line + i][p_editor_data->display_line_lengths[display_line + i] - 1] == '\n') |
| 327 |
{ |
{ |
|
log_error("Debug: reach end of data line, i = %ld, j = %ld\n", i, split_line_total); |
|
| 328 |
break; |
break; |
| 329 |
} |
} |
| 330 |
} |
} |
| 451 |
str_len = 0; |
str_len = 0; |
| 452 |
} |
} |
| 453 |
|
|
| 454 |
if ((ch >= 32 && ch < 127) || (ch > 127 && ch <= 255 && str_len == 2)) // printable character or GBK |
if ((ch >= 32 && ch < 127) || (ch > 127 && ch <= 255 && str_len == 2) || ch == CR) // printable character or GBK |
| 455 |
{ |
{ |
| 456 |
if (str_len == 0) |
if (str_len == 0) |
| 457 |
{ |
{ |
| 601 |
screen_end_row = SCREEN_ROWS - 1; // Legacy Fterm only works with this line |
screen_end_row = SCREEN_ROWS - 1; // Legacy Fterm only works with this line |
| 602 |
col_pos = MIN(col_pos, MAX(1, p_editor_data->display_line_lengths[line_current - screen_current_row + row_pos])); |
col_pos = MIN(col_pos, MAX(1, p_editor_data->display_line_lengths[line_current - screen_current_row + row_pos])); |
| 603 |
break; |
break; |
|
case CR: |
|
|
break; |
|
| 604 |
case KEY_SPACE: |
case KEY_SPACE: |
| 605 |
break; |
break; |
| 606 |
case KEY_RIGHT: |
case KEY_RIGHT: |