--- lbbs/src/editor.c 2025/06/16 05:35:05 1.25 +++ lbbs/src/editor.c 2025/06/29 01:57:15 1.36 @@ -14,19 +14,16 @@ * * ***************************************************************************/ -#include "editor.h" #include "bbs.h" +#include "common.h" +#include "editor.h" #include "io.h" #include "log.h" -#include "common.h" -#include "str_process.h" #include "memory_pool.h" +#include "str_process.h" #include -#include -#include - -#define _POSIX_C_SOURCE 200809L #include +#include #define EDITOR_ESC_DISPLAY_STR "\033[32m*\033[m" #define EDITOR_MEM_POOL_LINE_PER_CHUNK 1000 @@ -138,7 +135,7 @@ EDITOR_DATA *editor_data_load(const char p_data_line[current_data_line_length] = '\0'; } - bzero(p_editor_data->p_display_lines + p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES - (size_t)p_editor_data->display_line_total); + memset(p_editor_data->p_display_lines + p_editor_data->display_line_total, 0, MAX_EDITOR_DATA_LINES - (size_t)p_editor_data->display_line_total); return p_editor_data; } @@ -216,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; @@ -281,8 +278,11 @@ int editor_data_insert(EDITOR_DATA *p_ed { if (p_editor_data->display_line_total >= MAX_EDITOR_DATA_LINES) { - // log_error("Split line error, display_line_total(%ld) reach limit(%d)\n", - // p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES); +#ifdef _DEBUG + log_error("Split line error, display_line_total(%ld) reach limit(%d)\n", + p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES); +#endif + return -2; } @@ -371,7 +371,10 @@ int editor_data_insert(EDITOR_DATA *p_ed // Insert blank display line after last_display_line if (p_editor_data->display_line_total >= MAX_EDITOR_DATA_LINES) { - // log_error("display_line_total over limit %d >= %d\n", p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES); +#ifdef _DEBUG + log_error("display_line_total over limit %d >= %d\n", p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES); +#endif + // Terminate prior display line with \n, to avoid error on cleanup if (display_line + i - 1 >= 0 && p_editor_data->display_line_lengths[display_line + i - 1] > 0) { @@ -386,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)++; } @@ -586,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); @@ -653,8 +675,7 @@ int editor_display(EDITOR_DATA *p_editor return ch; } - loop = 1; - while (!SYS_server_exit && loop) + for (loop = 1; !SYS_server_exit && loop;) { if (line_current >= p_editor_data->display_line_total || output_current_row > output_end_row) { @@ -684,9 +705,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) @@ -708,7 +728,7 @@ int editor_display(EDITOR_DATA *p_editor if ((ch >= 32 && ch < 127) || (ch > 127 && ch <= 255 && str_len == 2) || // Printable character or GBK ch == CR || ch == KEY_ESC) // Special character { - BBS_last_access_tm = time(0); + BBS_last_access_tm = time(NULL); if (str_len == 0) // ch >= 32 && ch < 127 { @@ -716,12 +736,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, @@ -750,7 +771,8 @@ int editor_display(EDITOR_DATA *p_editor clrtoeol(); for (i = 0; i < scroll_rows; i++) { - prints("\033[S"); // Scroll up 1 line + // prints("\033[S"); // Scroll up 1 line + prints("\n"); // Legacy Cterm only works with this line } output_current_row -= scroll_rows; @@ -784,14 +806,13 @@ int editor_display(EDITOR_DATA *p_editor } else if (ch == KEY_DEL || ch == BACKSPACE) // Del { - BBS_last_access_tm = time(0); + BBS_last_access_tm = time(NULL); if (ch == BACKSPACE) { 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--; @@ -1006,7 +1027,8 @@ int editor_display(EDITOR_DATA *p_editor col_pos = MIN(col_pos, MAX(1, p_editor_data->display_line_lengths[line_current - output_current_row + row_pos])); moveto(SCREEN_ROWS, 0); clrtoeol(); - prints("\033[S"); // Scroll up 1 line + // prints("\033[S"); // Scroll up 1 line + prints("\n"); // Legacy Cterm only works with this line break; case KEY_PGUP: if (line_current - output_current_row < 0) // Reach begin @@ -1061,7 +1083,7 @@ int editor_display(EDITOR_DATA *p_editor break; } - BBS_last_access_tm = time(0); + BBS_last_access_tm = time(NULL); if (input_ok) {