/[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.9 by sysadm, Wed Jun 11 10:44:33 2025 UTC Revision 1.12 by sysadm, Wed Jun 11 12:56:52 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 169  int editor_data_insert(EDITOR_DATA *p_ed Line 171  int editor_data_insert(EDITOR_DATA *p_ed
171          // Get accurate offset of first character of CJK at offset position          // Get accurate offset of first character of CJK at offset position
172          for (i = 0; i < offset; i++)          for (i = 0; i < offset; i++)
173          {          {
174                  if (p_editor_data->p_display_lines[display_line][i] < 0) // GBK                  if (p_editor_data->p_display_lines[display_line][i] < 0 || p_editor_data->p_display_lines[display_line][i] > 127) // GBK
175                  {                  {
176                          i++;                          i++;
177                  }                  }
# Line 368  int editor_data_delete(EDITOR_DATA *p_ed Line 370  int editor_data_delete(EDITOR_DATA *p_ed
370          // Get accurate offset of first character of CJK at offset position          // Get accurate offset of first character of CJK at offset position
371          for (i = 0; i < offset; i++)          for (i = 0; i < offset; i++)
372          {          {
373                  if (p_editor_data->p_display_lines[display_line][i] < 0) // GBK                  if (p_editor_data->p_display_lines[display_line][i] < 0 || p_editor_data->p_display_lines[display_line][i] > 127) // GBK
374                  {                  {
375                          i++;                          i++;
376                  }                  }
# Line 417  int editor_data_delete(EDITOR_DATA *p_ed Line 419  int editor_data_delete(EDITOR_DATA *p_ed
419          }          }
420          else          else
421          {          {
422                  log_error("Some strange character at display_line %ld, offset %ld\n", display_line, offset);                  log_error("Some strange character at display_line %ld, offset %ld: %d %d %d %d\n",
423                  return -2;                                    display_line, offset, p_data_line[offset_data_line], p_data_line[offset_data_line + 1],
424                                      p_data_line[offset_data_line + 2], p_data_line[offset_data_line + 3]);
425                    str_len = 1;
426          }          }
427    
428          // Current display line is (almost) empty          // Current display line is (almost) empty
# Line 544  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 586  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 607  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 668  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 716  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 855  int editor_display(EDITOR_DATA *p_editor Line 872  int editor_display(EDITOR_DATA *p_editor
872                                          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]));
873                                          clrline(screen_begin_row, SCREEN_ROWS);                                          clrline(screen_begin_row, SCREEN_ROWS);
874                                          break;                                          break;
                                 case KEY_ESC:  
                                         break;  
875                                  case KEY_F1:                                  case KEY_F1:
876                                          if (!show_help) // Not reentrant                                          if (!show_help) // Not reentrant
877                                          {                                          {
# Line 881  int editor_display(EDITOR_DATA *p_editor Line 896  int editor_display(EDITOR_DATA *p_editor
896                                  }                                  }
897    
898                                  BBS_last_access_tm = time(0);                                  BBS_last_access_tm = time(0);
899                                    if (!input_ok)
900                                    {
901                                            ch = igetch_t(MAX_DELAY_TIME);
902                                    }
903                          }                          }
904    
905                          continue;                          continue;
# Line 898  int editor_display(EDITOR_DATA *p_editor Line 917  int editor_display(EDITOR_DATA *p_editor
917                          len = 0;                          len = 0;
918                  }                  }
919    
920                  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);
921                  buffer[len] = '\0';                  // Replace '\033' with '*'
922                    p_str = p_editor_data->p_display_lines[line_current];
923                    for (i = 0, j = 0; i < len; i++)
924                    {
925                            if (p_str[i] == '\033')
926                            {
927                                    memcpy(buffer + j, EDITOR_ESC_DISPLAY_STR, sizeof(EDITOR_ESC_DISPLAY_STR) - 1);
928                                    j += (int)(sizeof(EDITOR_ESC_DISPLAY_STR) - 1);
929                            }
930                            else
931                            {
932                                    buffer[j] = p_str[i];
933                                    j++;
934                            }
935                    }
936                    buffer[j] = '\0';
937    
938                  moveto(screen_current_row, 0);                  moveto(screen_current_row, 0);
939                  clrtoeol();                  clrtoeol();


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

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