--- lbbs/src/editor.c 2025/06/21 02:15:18 1.31 +++ lbbs/src/editor.c 2025/06/27 13:26:59 1.34 @@ -213,7 +213,7 @@ int editor_data_insert(EDITOR_DATA *p_ed long last_display_line; // of data line long line_offsets[MAX_EDITOR_DATA_LINE_LENGTH + 1]; long split_line_total; - long i, j; + long i; int len; int eol; int display_len; @@ -389,12 +389,23 @@ int editor_data_insert(EDITOR_DATA *p_ed } break; } - for (j = p_editor_data->display_line_total; j > last_display_line + 1; j--) - { - p_editor_data->p_display_lines[j] = p_editor_data->p_display_lines[j - 1]; - p_editor_data->display_line_lengths[j] = p_editor_data->display_line_lengths[j - 1]; - } + + // for (j = p_editor_data->display_line_total; j > last_display_line + 1; j--) + // { + // p_editor_data->p_display_lines[j] = p_editor_data->p_display_lines[j - 1]; + // p_editor_data->display_line_lengths[j] = p_editor_data->display_line_lengths[j - 1]; + // } + memmove(p_editor_data->p_display_lines + last_display_line + 2, + p_editor_data->p_display_lines + last_display_line + 1, + (size_t)(p_editor_data->display_line_total - last_display_line - 1) * + sizeof(p_editor_data->p_display_lines[last_display_line + 1])); + memmove(p_editor_data->display_line_lengths + last_display_line + 2, + p_editor_data->display_line_lengths + last_display_line + 1, + (size_t)(p_editor_data->display_line_total - last_display_line - 1) * + sizeof(p_editor_data->display_line_lengths[last_display_line + 1])); + last_display_line++; + *p_last_updated_line = p_editor_data->display_line_total; (p_editor_data->display_line_total)++; } @@ -589,11 +600,19 @@ int editor_data_delete(EDITOR_DATA *p_ed if (*p_last_updated_line < last_display_line) { // Remove redundant display line after last_display_line - for (j = last_display_line + 1; j < p_editor_data->display_line_total; j++) - { - p_editor_data->p_display_lines[j - (last_display_line - *p_last_updated_line)] = p_editor_data->p_display_lines[j]; - p_editor_data->display_line_lengths[j - (last_display_line - *p_last_updated_line)] = p_editor_data->display_line_lengths[j]; - } + // for (j = last_display_line + 1; j < p_editor_data->display_line_total; j++) + // { + // p_editor_data->p_display_lines[j - (last_display_line - *p_last_updated_line)] = p_editor_data->p_display_lines[j]; + // p_editor_data->display_line_lengths[j - (last_display_line - *p_last_updated_line)] = p_editor_data->display_line_lengths[j]; + // } + memmove(p_editor_data->p_display_lines + *p_last_updated_line + 1, + p_editor_data->p_display_lines + last_display_line + 1, + (size_t)(p_editor_data->display_line_total - last_display_line - 1) * + sizeof(p_editor_data->p_display_lines[last_display_line + 1])); + memmove(p_editor_data->display_line_lengths + *p_last_updated_line + 1, + p_editor_data->display_line_lengths + last_display_line + 1, + (size_t)(p_editor_data->display_line_total - last_display_line - 1) * + sizeof(p_editor_data->display_line_lengths[last_display_line + 1])); j = p_editor_data->display_line_total; (p_editor_data->display_line_total) -= (last_display_line - *p_last_updated_line); @@ -687,9 +706,8 @@ int editor_display(EDITOR_DATA *p_editor iflush(); str_len = 0; - input_ok = 0; ch = igetch_t(MAX_DELAY_TIME); - while (!SYS_server_exit && !input_ok) + while (!SYS_server_exit) { // extended key handler if (editor_display_key_handler(&ch, &ctx) != 0) @@ -719,12 +737,13 @@ int editor_display(EDITOR_DATA *p_editor str_len = 1; } - last_updated_line = line_current; display_line_in = line_current - output_current_row + row_pos; offset_in = col_pos - 1; display_line_out = display_line_in; offset_out = offset_in; + last_updated_line = display_line_in; + if (!key_insert) // overwrite { if (editor_data_delete(p_editor_data, &display_line_out, &offset_out, @@ -793,8 +812,7 @@ int editor_display(EDITOR_DATA *p_editor { if (line_current - output_current_row + row_pos <= 0 && col_pos <= 1) // Forbidden { - ch = igetch_t(MAX_DELAY_TIME); - continue; + break; // force output prior operation result if any } col_pos--;