/[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.5 by sysadm, Wed Jun 11 04:57:19 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 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 208  int editor_data_insert(EDITOR_DATA *p_ed Line 210  int editor_data_insert(EDITOR_DATA *p_ed
210          }          }
211    
212          // Split current data line if over-length          // Split current data line if over-length
213          if (len_data_line + str_len + 1 > MAX_EDITOR_DATA_LINE_LENGTH)          if (len_data_line + str_len + 1 > MAX_EDITOR_DATA_LINE_LENGTH || str[0] == CR)
214          {          {
215                  if (p_editor_data->display_line_total >= MAX_EDITOR_DATA_LINES || p_editor_data->data_line_total >= MAX_EDITOR_DATA_LINES)                  if (p_editor_data->display_line_total >= MAX_EDITOR_DATA_LINES || p_editor_data->data_line_total >= MAX_EDITOR_DATA_LINES)
216                  {                  {
# Line 227  int editor_data_insert(EDITOR_DATA *p_ed Line 229  int editor_data_insert(EDITOR_DATA *p_ed
229                  p_editor_data->p_data_lines[p_editor_data->data_line_total] = p_data_line;                  p_editor_data->p_data_lines[p_editor_data->data_line_total] = p_data_line;
230                  (p_editor_data->data_line_total)++;                  (p_editor_data->data_line_total)++;
231    
232                  if (offset_data_line + str_len + 1 < MAX_EDITOR_DATA_LINE_LENGTH)                  if (offset_data_line + str_len + 1 >= MAX_EDITOR_DATA_LINE_LENGTH || str[0] == CR)
233                  {                  {
234                          // Copy rest part of current data line to new data line                          if (str[0] == CR)
235                          memcpy(p_data_line,                          {
236                                     p_editor_data->p_display_lines[display_line] + offset,                                  str_len = 0;
237                                     (size_t)(len_data_line - offset_data_line));                          }
   
                         p_data_line[len_data_line - offset_data_line] = '\0';  
   
                         // Append str to current display line  
                         memcpy(p_editor_data->p_display_lines[display_line] + offset, str, (size_t)str_len);  
   
                         // Add line ending to current display line (data line)  
                         p_editor_data->p_display_lines[display_line][offset + str_len] = '\n';  
                         p_editor_data->p_display_lines[display_line][offset + str_len + 1] = '\0';  
                         p_editor_data->display_line_lengths[display_line] = offset + str_len + 1;  
238    
                         *p_display_line = display_line;  
                         *p_offset = offset + str_len;  
                 }  
                 else  
                 {  
239                          // Copy str to new data line                          // Copy str to new data line
240                          memcpy(p_data_line, str, (size_t)str_len);                          memcpy(p_data_line, str, (size_t)str_len);
241    
# Line 267  int editor_data_insert(EDITOR_DATA *p_ed Line 254  int editor_data_insert(EDITOR_DATA *p_ed
254                          *p_display_line = display_line + 1;                          *p_display_line = display_line + 1;
255                          *p_offset = str_len;                          *p_offset = str_len;
256                  }                  }
257                    else
258                    {
259                            // Copy rest part of current data line to new data line
260                            memcpy(p_data_line,
261                                       p_editor_data->p_display_lines[display_line] + offset,
262                                       (size_t)(len_data_line - offset_data_line));
263    
264                            p_data_line[len_data_line - offset_data_line] = '\0';
265    
266                            // Append str to current display line
267                            memcpy(p_editor_data->p_display_lines[display_line] + offset, str, (size_t)str_len);
268    
269                            // Add line ending to current display line (data line)
270                            p_editor_data->p_display_lines[display_line][offset + str_len] = '\n';
271                            p_editor_data->p_display_lines[display_line][offset + str_len + 1] = '\0';
272                            p_editor_data->display_line_lengths[display_line] = offset + str_len + 1;
273    
274                            *p_display_line = display_line;
275                            *p_offset = offset + str_len;
276                    }
277    
278                  split_line_total = last_display_line - display_line + 3;                  split_line_total = last_display_line - display_line + 3;
279    
# Line 277  int editor_data_insert(EDITOR_DATA *p_ed Line 284  int editor_data_insert(EDITOR_DATA *p_ed
284          }          }
285          else // insert str into current data line at offset_data_line          else // insert str into current data line at offset_data_line
286          {          {
                 log_error("Insert %d chars into display_line = %d, offset = %d\n", str_len, display_line, offset);  
   
287                  memmove(p_data_line + offset_data_line + str_len, p_data_line + offset_data_line, (size_t)(len_data_line - offset_data_line));                  memmove(p_data_line + offset_data_line + str_len, p_data_line + offset_data_line, (size_t)(len_data_line - offset_data_line));
288                  memcpy(p_data_line + offset_data_line, str, (size_t)str_len);                  memcpy(p_data_line + offset_data_line, str, (size_t)str_len);
289                  p_data_line[len_data_line + str_len] = '\0';                  p_data_line[len_data_line + str_len] = '\0';
# Line 293  int editor_data_insert(EDITOR_DATA *p_ed Line 298  int editor_data_insert(EDITOR_DATA *p_ed
298    
299          // Split current data line since beginning of current display line          // Split current data line since beginning of current display line
300          split_line_total = split_data_lines(p_data_line, SCREEN_COLS, line_offsets, split_line_total);          split_line_total = split_data_lines(p_data_line, SCREEN_COLS, line_offsets, split_line_total);
         log_error("Debug: split data line, display_line = %ld, j = %ld\n", display_line, split_line_total);  
301    
302          for (i = 0; i < split_line_total; i++)          for (i = 0; i < split_line_total; i++)
303          {          {
# Line 323  int editor_data_insert(EDITOR_DATA *p_ed Line 327  int editor_data_insert(EDITOR_DATA *p_ed
327                  if (p_editor_data->display_line_lengths[display_line + i] > 0 &&                  if (p_editor_data->display_line_lengths[display_line + i] > 0 &&
328                          p_editor_data->p_display_lines[display_line + i][p_editor_data->display_line_lengths[display_line + i] - 1] == '\n')                          p_editor_data->p_display_lines[display_line + i][p_editor_data->display_line_lengths[display_line + i] - 1] == '\n')
329                  {                  {
                         log_error("Debug: reach end of data line, i = %ld, j = %ld\n", i, split_line_total);  
330                          break;                          break;
331                  }                  }
332          }          }
333    
334          *p_last_updated_line = MAX(display_line + split_line_total - 1, *p_last_updated_line);          *p_last_updated_line = MAX(display_line + MIN(i, split_line_total - 1), *p_last_updated_line);
335    
336          if (*p_offset > p_editor_data->display_line_lengths[*p_display_line] ||          if (*p_offset > p_editor_data->display_line_lengths[*p_display_line] ||
337                  (*p_offset > 0 && *p_offset == p_editor_data->display_line_lengths[*p_display_line] &&                  (*p_offset > 0 && *p_offset == p_editor_data->display_line_lengths[*p_display_line] &&
# Line 349  int editor_data_insert(EDITOR_DATA *p_ed Line 352  int editor_data_insert(EDITOR_DATA *p_ed
352  int editor_data_delete(EDITOR_DATA *p_editor_data, long display_line, long offset,  int editor_data_delete(EDITOR_DATA *p_editor_data, long display_line, long offset,
353                                             long *p_last_updated_line)                                             long *p_last_updated_line)
354  {  {
355          return 0;          char *p_data_line = NULL;
356            long len_data_line;
357            long offset_data_line;
358            long last_display_line; // of data line
359            long line_offsets[MAX_EDITOR_DATA_LINE_LENGTH + 1];
360            long split_line_total;
361            long i, j;
362            int str_len = 0;
363    
364            if (p_editor_data == NULL || p_last_updated_line == NULL)
365            {
366                    log_error("editor_data_op() error: NULL pointer\n");
367                    return -1;
368            }
369    
370            // Get accurate offset of first character of CJK at offset position
371            for (i = 0; i < offset; i++)
372            {
373                    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++;
376                    }
377            }
378            if (i > offset) // offset was skipped
379            {
380                    offset--;
381            }
382    
383            // Get length of current data line
384            len_data_line = 0;
385            p_data_line = p_editor_data->p_display_lines[display_line];
386            for (i = display_line - 1; i >= 0; i--)
387            {
388                    if (p_editor_data->display_line_lengths[i] > 0 &&
389                            p_editor_data->p_display_lines[i][p_editor_data->display_line_lengths[i] - 1] == '\n') // reach end of prior data line
390                    {
391                            break;
392                    }
393    
394                    len_data_line += p_editor_data->display_line_lengths[i];
395                    p_data_line = p_editor_data->p_display_lines[i];
396            }
397            offset_data_line = len_data_line + offset;
398            last_display_line = p_editor_data->display_line_total - 1;
399            for (i = display_line; i < p_editor_data->display_line_total; i++)
400            {
401                    len_data_line += p_editor_data->display_line_lengths[i];
402    
403                    if (p_editor_data->display_line_lengths[i] > 0 &&
404                            p_editor_data->p_display_lines[i][p_editor_data->display_line_lengths[i] - 1] == '\n') // reach end of current data line
405                    {
406                            last_display_line = i;
407                            break;
408                    }
409            }
410    
411            // Check str to be deleted
412            if (p_data_line[offset_data_line] > 0 && p_data_line[offset_data_line] < 127)
413            {
414                    str_len = 1;
415            }
416            else if (p_data_line[offset_data_line + 1] < 0 || p_data_line[offset_data_line] > 127) // GBK
417            {
418                    str_len = 2;
419            }
420            else
421            {
422                    log_error("Some strange character at display_line %ld, offset %ld: %d %d %d %d\n",
423                                      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
429            if (offset_data_line + str_len > len_data_line ||
430                    (offset_data_line + str_len == len_data_line && p_data_line[offset_data_line] == '\n'))
431            {
432                    if (display_line + 1 >= p_editor_data->display_line_total) // No additional display line (data line)
433                    {
434                            log_common("Debug: No additional display line: %ld + 1 >= %ld\n", display_line, p_editor_data->display_line_total);
435                            return 0;
436                    }
437    
438                    len_data_line = 0; // Next data line
439                    last_display_line = p_editor_data->display_line_total - 1;
440                    for (i = display_line + 1; i < p_editor_data->display_line_total; i++)
441                    {
442                            len_data_line += p_editor_data->display_line_lengths[i];
443    
444                            if (p_editor_data->display_line_lengths[i] > 0 &&
445                                    p_editor_data->p_display_lines[i][p_editor_data->display_line_lengths[i] - 1] == '\n') // reach end of current data line
446                            {
447                                    last_display_line = i;
448                                    break;
449                            }
450                    }
451    
452                    if (offset_data_line + len_data_line + 1 > MAX_EDITOR_DATA_LINE_LENGTH) // No enough buffer to merge current data line with next data line
453                    {
454                            log_common("Debug: No enough buffer to merge with next data line: %ld > %ld\n",
455                                               offset_data_line + len_data_line + 1, MAX_EDITOR_DATA_LINE_LENGTH);
456                            return 0;
457                    }
458    
459                    // Append next data line to current one
460                    memcpy(p_data_line + offset_data_line, p_editor_data->p_display_lines[display_line + 1], (size_t)len_data_line);
461                    p_data_line[offset_data_line + len_data_line] = '\0';
462    
463                    // Recycle next data line
464                    // TODO: free(p_editor_data->p_display_lines[display_line + 1]);
465            }
466            else
467            {
468                    memmove(p_data_line + offset_data_line, p_data_line + offset_data_line + str_len, (size_t)(len_data_line - offset_data_line - str_len));
469                    p_data_line[len_data_line - str_len] = '\0';
470                    len_data_line -= str_len;
471            }
472    
473            // Set p_data_line to head of current display line
474            p_data_line = p_editor_data->p_display_lines[display_line];
475            split_line_total = last_display_line - display_line + 2;
476    
477            // Split current data line since beginning of current display line
478            split_line_total = split_data_lines(p_data_line, SCREEN_COLS, line_offsets, split_line_total);
479    
480            for (i = 0; i < split_line_total; i++)
481            {
482                    p_editor_data->display_line_lengths[display_line + i] = line_offsets[i + 1] - line_offsets[i];
483                    p_editor_data->p_display_lines[display_line + i] =
484                            (i == 0
485                                     ? p_data_line
486                                     : (p_editor_data->p_display_lines[display_line + i - 1] + p_editor_data->display_line_lengths[display_line + i - 1]));
487    
488                    if (p_editor_data->display_line_lengths[display_line + i] > 0 &&
489                            p_editor_data->p_display_lines[display_line + i][p_editor_data->display_line_lengths[display_line + i] - 1] == '\n')
490                    {
491                            break;
492                    }
493            }
494    
495            *p_last_updated_line = display_line + MIN(i, split_line_total - 1);
496    
497            if (display_line + i < last_display_line)
498            {
499                    // Remove redundant display line after last_display_line
500                    for (j = last_display_line + 1; j < p_editor_data->display_line_total; j++)
501                    {
502                            p_editor_data->p_display_lines[j - (last_display_line - (display_line + i))] = p_editor_data->p_display_lines[j];
503                            p_editor_data->display_line_lengths[j - (last_display_line - (display_line + i))] = p_editor_data->display_line_lengths[j];
504                    }
505    
506                    (p_editor_data->display_line_total) -= (last_display_line - (display_line + i));
507                    last_display_line = display_line + i;
508    
509                    *p_last_updated_line = p_editor_data->display_line_total - 1;
510            }
511    
512            return str_len;
513  }  }
514    
515  static int editor_display_key_handler(int *p_key, EDITOR_CTX *p_ctx)  static int editor_display_key_handler(int *p_key, EDITOR_CTX *p_ctx)
# Line 387  int editor_display(EDITOR_DATA *p_editor Line 547  int editor_display(EDITOR_DATA *p_editor
547          long display_line_out, offset_out;          long display_line_out, offset_out;
548          int scroll_rows;          int scroll_rows;
549          long last_updated_line = 0;          long last_updated_line = 0;
550          int 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 408  int editor_display(EDITOR_DATA *p_editor Line 569  int editor_display(EDITOR_DATA *p_editor
569    
570                          snprintf(buffer, sizeof(buffer),                          snprintf(buffer, sizeof(buffer),
571                                           "\033[1;44;33m[\033[32m%ld\033[33m;\033[32m%ld\033[33m] "                                           "\033[1;44;33m[\033[32m%ld\033[33m;\033[32m%ld\033[33m] "
572                                           "µÚ\033[32m%ld\033[33m/\033[32m%ld\033[33mÐÐ "                                           "µÚ\033[32m%ld\033[33m/\033[32m%ld\033[33mÐÐ [\033[32m%s\033[33m] "
573                                           "%s",                                           "%s",
574                                           row_pos, col_pos,                                           row_pos, col_pos,
575                                           ctx.line_cursor, p_editor_data->display_line_total,                                           ctx.line_cursor, p_editor_data->display_line_total,
576                                             key_insert ? "²åÈë" : "¸Äд",
577                                           ctx.msg);                                           ctx.msg);
578    
579                          len = split_line(buffer, SCREEN_COLS, &eol, &display_len);                          len = split_line(buffer, SCREEN_COLS, &eol, &display_len);
# Line 429  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 450  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)) // 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 464  int editor_display(EDITOR_DATA *p_editor Line 625  int editor_display(EDITOR_DATA *p_editor
625                                          display_line_out = display_line_in;                                          display_line_out = display_line_in;
626                                          offset_out = offset_in;                                          offset_out = offset_in;
627    
628                                            if (!key_insert) // overwrite
629                                            {
630                                                    if (editor_data_delete(p_editor_data, display_line_in, offset_in,
631                                                                                               &last_updated_line) < 0)
632                                                    {
633                                                            log_error("editor_data_delete() error\n");
634                                                    }
635                                            }
636    
637                                          if (editor_data_insert(p_editor_data, &display_line_out, &offset_out,                                          if (editor_data_insert(p_editor_data, &display_line_out, &offset_out,
638                                                                                     input_str, str_len, &last_updated_line) < 0)                                                                                     input_str, str_len, &last_updated_line) < 0)
639                                          {                                          {
# Line 502  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) // Del                                  else if (ch == KEY_DEL || ch == BACKSPACE) // Del
686                                  {                                  {
687                                          last_updated_line = line_current;                                          if (ch == BACKSPACE)
688                                            {
689                                                    col_pos--;
690                                                    if (col_pos < 1 && line_current - screen_current_row + row_pos >= 0)
691                                                    {
692                                                            row_pos--;
693                                                            col_pos = MAX(1, p_editor_data->display_line_lengths[line_current - screen_current_row + row_pos]);
694                                                    }
695                                            }
696    
697                                          if (editor_data_delete(p_editor_data, line_current - screen_current_row + row_pos, col_pos - 1,                                          if ((str_len = editor_data_delete(p_editor_data, line_current - screen_current_row + row_pos, col_pos - 1,
698                                                                                     &last_updated_line) < 0)                                                                                                            &last_updated_line)) < 0)
699                                          {                                          {
700                                                  log_error("editor_data_delete() error\n");                                                  log_error("editor_data_delete() error\n");
701                                          }                                          }
702                                          else                                          else
703                                          {                                          {
704                                                    if (ch == BACKSPACE)
705                                                    {
706                                                            for (i = 1; i < str_len; i++)
707                                                            {
708                                                                    col_pos--;
709                                                                    if (col_pos < 1 && line_current - screen_current_row + row_pos >= 0)
710                                                                    {
711                                                                            row_pos--;
712                                                                            col_pos = MAX(1, p_editor_data->display_line_lengths[line_current - screen_current_row + row_pos]);
713                                                                    }
714                                                            }
715                                                    }
716    
717                                                  screen_end_row = MIN(SCREEN_ROWS - 1, screen_current_row + (int)(last_updated_line - line_current));                                                  screen_end_row = MIN(SCREEN_ROWS - 1, screen_current_row + (int)(last_updated_line - line_current));
718                                                    line_current -= (screen_current_row - row_pos);
719                                                    screen_current_row = (int)row_pos;
720    
721                                                    if (screen_current_row < screen_begin_row) // row_pos <= 0
722                                                    {
723                                                            screen_current_row = screen_begin_row;
724                                                            row_pos = screen_begin_row;
725                                                            screen_end_row = SCREEN_ROWS - 1;
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 531  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]));
764                                          break;                                          break;
765                                  case KEY_INS:                                  case KEY_INS:
766                                          insert = !insert;                                          key_insert = !key_insert;
767                                          break;                                          break;
768                                  case KEY_HOME:                                  case KEY_HOME:
769                                          row_pos = 1;                                          row_pos = 1;
# Line 600  int editor_display(EDITOR_DATA *p_editor Line 817  int editor_display(EDITOR_DATA *p_editor
817                                          screen_end_row = SCREEN_ROWS - 1; // Legacy Fterm only works with this line                                          screen_end_row = SCREEN_ROWS - 1; // Legacy Fterm only works with this line
818                                          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]));
819                                          break;                                          break;
                                 case CR:  
                                         break;  
820                                  case KEY_SPACE:                                  case KEY_SPACE:
821                                          break;                                          break;
822                                  case KEY_RIGHT:                                  case KEY_RIGHT:
# Line 661  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 687  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 704  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