--- lbbs/src/editor.c 2025/11/09 11:18:07 1.57 +++ lbbs/src/editor.c 2025/12/18 02:56:00 1.62 @@ -6,6 +6,10 @@ * Copyright (C) 2004-2025 Leaflet */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "bbs.h" #include "common.h" #include "editor.h" @@ -268,10 +272,8 @@ int editor_data_insert(EDITOR_DATA *p_ed { if (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", + log_debug("Split line error, display_line_total(%ld) reach limit(%d)\n", p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES); -#endif return -2; } @@ -365,9 +367,7 @@ 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) { -#ifdef _DEBUG - log_error("display_line_total over limit %d >= %d\n", p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES); -#endif + log_debug("display_line_total over limit %d >= %d\n", p_editor_data->display_line_total, MAX_EDITOR_DATA_LINES); // 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) @@ -679,6 +679,7 @@ int editor_display(EDITOR_DATA *p_editor int i, j; char *p_str; int del_line; + int tab_width = 0; clrline(output_current_row, SCREEN_ROWS); @@ -717,6 +718,7 @@ int editor_display(EDITOR_DATA *p_editor moveto((int)row_pos, (int)col_pos); iflush(); + tab_width = 0; str_len = 0; ch = igetch_t(BBS_max_user_idle_time); while (!SYS_server_exit) @@ -732,6 +734,12 @@ int editor_display(EDITOR_DATA *p_editor goto cleanup; } + if (ch == '\t') + { + ch = ' '; + tab_width = TAB_SIZE - ((int)(col_pos - 1) % TAB_SIZE) - 1; + } + if (ch < 256 && (ch & 0x80)) // head of multi-byte character { str_len = 0; @@ -751,9 +759,7 @@ int editor_display(EDITOR_DATA *p_editor ch = igetch(100); // 0.1 second if (ch == KEY_NULL || ch == KEY_TIMEOUT) // Ignore received bytes if no futher input { -#ifdef _DEBUG - log_error("Ignore %d bytes of incomplete UTF8 character\n", str_len); -#endif + log_debug("Ignore %d bytes of incomplete UTF8 character\n", str_len); str_len = 0; break; } @@ -850,10 +856,17 @@ int editor_display(EDITOR_DATA *p_editor break; } - ch = igetch(0); - if (ch == KEY_NULL || ch == KEY_TIMEOUT) // Output if no futher input + if (ch == ' ' && tab_width > 0) { - break; + tab_width--; + } + else + { + ch = igetch(0); + if (ch == KEY_NULL || ch == KEY_TIMEOUT) // Output if no futher input + { + break; + } } str_len = 0; @@ -955,7 +968,7 @@ int editor_display(EDITOR_DATA *p_editor switch (ch) { case KEY_NULL: - log_error("KEY_NULL\n"); + log_debug("KEY_NULL\n"); goto cleanup; case KEY_TIMEOUT: log_error("User input timeout\n");