/[LeafOK_CVS]/lbbs/src/editor.c
ViewVC logotype

Diff of /lbbs/src/editor.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.10 by sysadm, Wed Jun 11 11:01:07 2025 UTC Revision 1.13 by sysadm, Wed Jun 11 13:04:43 2025 UTC
# Line 27  Line 27 
27  #define _POSIX_C_SOURCE 200809L  #define _POSIX_C_SOURCE 200809L
28  #include <string.h>  #include <string.h>
29    
30    #define EDITOR_ESC_DISPLAY_STR "\033[32m*\033[m"
31    
32  EDITOR_DATA *editor_data_load(const char *p_data)  EDITOR_DATA *editor_data_load(const char *p_data)
33  {  {
34          EDITOR_DATA *p_editor_data;          EDITOR_DATA *p_editor_data;
# Line 546  int editor_display(EDITOR_DATA *p_editor Line 548  int editor_display(EDITOR_DATA *p_editor
548          int scroll_rows;          int scroll_rows;
549          long last_updated_line = 0;          long last_updated_line = 0;
550          int key_insert = 1;          int key_insert = 1;
551          int i;          int i, j;
552            char *p_str;
553    
554          screen_current_row = screen_begin_row;          screen_current_row = screen_begin_row;
555          clrline(screen_begin_row, SCREEN_ROWS);          clrline(screen_begin_row, SCREEN_ROWS);
# Line 588  int editor_display(EDITOR_DATA *p_editor Line 591  int editor_display(EDITOR_DATA *p_editor
591                          iflush();                          iflush();
592    
593                          input_ok = 0;                          input_ok = 0;
594                            ch = igetch_t(MAX_DELAY_TIME);
595                          while (!SYS_server_exit && !input_ok)                          while (!SYS_server_exit && !input_ok)
596                          {                          {
                                 ch = igetch_t(MAX_DELAY_TIME);  
                                 input_ok = 1;  
   
597                                  // extended key handler                                  // extended key handler
598                                  if (editor_display_key_handler(&ch, &ctx) != 0)                                  if (editor_display_key_handler(&ch, &ctx) != 0)
599                                  {                                  {
# Line 609  int editor_display(EDITOR_DATA *p_editor Line 610  int editor_display(EDITOR_DATA *p_editor
610                                          str_len = 0;                                          str_len = 0;
611                                  }                                  }
612    
613                                  if ((ch >= 32 && ch < 127) || (ch > 127 && ch <= 255 && str_len == 2) || ch == CR) // printable character or GBK                                  if ((ch >= 32 && ch < 127) || (ch > 127 && ch <= 255 && str_len == 2) || // Printable character or GBK
614                                            ch == CR || ch == KEY_ESC)                                                                                       // Special character
615                                  {                                  {
616                                          if (str_len == 0)                                          if (str_len == 0)
617                                          {                                          {
# Line 670  int editor_display(EDITOR_DATA *p_editor Line 672  int editor_display(EDITOR_DATA *p_editor
672                                                          row_pos += (display_line_out - display_line_in);                                                          row_pos += (display_line_out - display_line_in);
673                                                  }                                                  }
674                                                  col_pos = offset_out + 1;                                                  col_pos = offset_out + 1;
675                                            }
676    
677                                                  continue;                                          // Check whether there is additional input
678                                            ch = igetch(0);
679                                            if (ch == KEY_TIMEOUT)
680                                            {
681                                                    input_ok = 1;
682                                          }                                          }
683                                            continue;
684                                  }                                  }
685                                  else if (ch == KEY_DEL || ch == BACKSPACE) // Del                                  else if (ch == KEY_DEL || ch == BACKSPACE) // Del
686                                  {                                  {
# Line 718  int editor_display(EDITOR_DATA *p_editor Line 726  int editor_display(EDITOR_DATA *p_editor
726                                                  }                                                  }
727                                          }                                          }
728    
729                                            // Check whether there is additional input
730                                            ch = igetch(0);
731                                            if (ch == KEY_TIMEOUT)
732                                            {
733                                                    input_ok = 1;
734                                            }
735                                          continue;                                          continue;
736                                  }                                  }
737    
738                                    input_ok = 1;
739                                  switch (ch)                                  switch (ch)
740                                  {                                  {
741                                  case KEY_NULL:                                  case KEY_NULL:
# Line 729  int editor_display(EDITOR_DATA *p_editor Line 744  int editor_display(EDITOR_DATA *p_editor
744                                  case Ctrl('C'):                                  case Ctrl('C'):
745                                          loop = 0;                                          loop = 0;
746                                          break;                                          break;
747                                    case Ctrl('S'): // Start of line
748                                  case KEY_CTRL_LEFT:                                  case KEY_CTRL_LEFT:
749                                          col_pos = 1;                                          col_pos = 1;
750                                          break;                                          break;
751                                    case Ctrl('E'): // End of line
752                                  case KEY_CTRL_RIGHT:                                  case KEY_CTRL_RIGHT:
753                                          col_pos = MAX(1, p_editor_data->display_line_lengths[line_current - screen_current_row + row_pos]);                                          col_pos = MAX(1, p_editor_data->display_line_lengths[line_current - screen_current_row + row_pos]);
754                                          break;                                          break;
755                                    case Ctrl('T'): // Top of screen
756                                  case KEY_CTRL_UP:                                  case KEY_CTRL_UP:
757                                          row_pos = screen_begin_row;                                          row_pos = screen_begin_row;
758                                          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]));
759                                          break;                                          break;
760                                    case Ctrl('B'): // Bottom of screen
761                                  case KEY_CTRL_DOWN:                                  case KEY_CTRL_DOWN:
762                                          row_pos = SCREEN_ROWS - 1;                                          row_pos = SCREEN_ROWS - 1;
763                                          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]));
# Line 857  int editor_display(EDITOR_DATA *p_editor Line 876  int editor_display(EDITOR_DATA *p_editor
876                                          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]));
877                                          clrline(screen_begin_row, SCREEN_ROWS);                                          clrline(screen_begin_row, SCREEN_ROWS);
878                                          break;                                          break;
                                 case KEY_ESC:  
                                         break;  
879                                  case KEY_F1:                                  case KEY_F1:
880                                          if (!show_help) // Not reentrant                                          if (!show_help) // Not reentrant
881                                          {                                          {
# Line 883  int editor_display(EDITOR_DATA *p_editor Line 900  int editor_display(EDITOR_DATA *p_editor
900                                  }                                  }
901    
902                                  BBS_last_access_tm = time(0);                                  BBS_last_access_tm = time(0);
903                                    if (!input_ok)
904                                    {
905                                            ch = igetch_t(MAX_DELAY_TIME);
906                                    }
907                          }                          }
908    
909                          continue;                          continue;
# Line 900  int editor_display(EDITOR_DATA *p_editor Line 921  int editor_display(EDITOR_DATA *p_editor
921                          len = 0;                          len = 0;
922                  }                  }
923    
924                  memcpy(buffer, (const char *)p_editor_data->p_display_lines[line_current], (size_t)len);                  // memcpy(buffer, p_editor_data->p_display_lines[line_current], (size_t)len);
925                  buffer[len] = '\0';                  // Replace '\033' with '*'
926                    p_str = p_editor_data->p_display_lines[line_current];
927                    for (i = 0, j = 0; i < len; i++)
928                    {
929                            if (p_str[i] == '\033')
930                            {
931                                    memcpy(buffer + j, EDITOR_ESC_DISPLAY_STR, sizeof(EDITOR_ESC_DISPLAY_STR) - 1);
932                                    j += (int)(sizeof(EDITOR_ESC_DISPLAY_STR) - 1);
933                            }
934                            else
935                            {
936                                    buffer[j] = p_str[i];
937                                    j++;
938                            }
939                    }
940                    buffer[j] = '\0';
941    
942                  moveto(screen_current_row, 0);                  moveto(screen_current_row, 0);
943                  clrtoeol();                  clrtoeol();


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1