home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / LO241SRV.ZIP / fulled.c < prev    next >
Text File  |  1998-08-01  |  17KB  |  732 lines

  1.  
  2. // LoraBBS Version 2.41 Free Edition
  3. // Copyright (C) 1987-98 Marco Maccaferri
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #include <stdio.h>
  20. #include <conio.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <alloc.h>
  24. #include <io.h>
  25. #include <fcntl.h>
  26. #include <sys\stat.h>
  27.  
  28. #include <cxl\cxlvid.h>
  29. #include <cxl\cxlwin.h>
  30. #include <cxl\cxlstr.h>
  31.  
  32. #include "lsetup.h"
  33. #include "msgapi.h"
  34. #include "sched.h"
  35. #include "externs.h"
  36. #include "prototyp.h"
  37.  
  38. void VioUpdate (void);
  39.  
  40. #define MAX_COLS  128
  41. #define MAX_SIZE  16384
  42.  
  43. char fulleditor = 0;
  44.  
  45. void m_print2(char *format, ...);
  46. FILE *get_system_file (char *);
  47.  
  48. static int cx, cy;
  49. static char *txtptr, *ptr, *screenrow[26], *oldrow[26], editrow[128];
  50.  
  51. void gotoxy_s (int x, int y)
  52. {
  53.    cpos (y + 5, x);
  54. }
  55.  
  56. void clrscr_s (void)
  57. {
  58.    int i;
  59.  
  60.    for (i = 0; i < (usr.len - 5); i++) {
  61.       gotoxy_s (1, i + 1);
  62.       del_line ();
  63.    }
  64.  
  65.    gotoxy_s (1, 1);
  66. }
  67.  
  68. void display_screen (int toprow, int width, int len)
  69. {
  70.    int i, crow, m;
  71.    char *p, linea[128], adjusted[26], *a;
  72.  
  73.     p = txtptr;
  74.     crow = 0;
  75.  
  76. //    strcat(txtptr,"\n");// fix volante :-))
  77.  
  78.     for (i = 0; i < 26; i++) {
  79.         oldrow[i] = screenrow[i];
  80.         screenrow[i] = NULL;
  81.         adjusted[i] = 0;
  82.     }
  83.  
  84.     do {
  85.         if (crow && *p == '\n')
  86.             p++;
  87.         if (crow >= toprow)
  88.             screenrow[crow - toprow] = p;
  89.  
  90.         i = 0;
  91.         while (i < width && *p != '\0' && *p != '\n')
  92.             linea[i++] = *p++;
  93.         linea[i] = '\0';
  94.  
  95.         if (i >= width && strchr (linea, ' ') != NULL) {
  96.             while (*p != ' ') {
  97.                 p--;
  98.                 i--;
  99.             }
  100.             linea[i] = '\0';
  101.             while (*p == ' ')
  102.                 p++;
  103.         }
  104.  
  105.         if (crow >= toprow) {
  106.             if ((crow - toprow + 1) >= 26)
  107.                 break;
  108.         }
  109.  
  110.         crow++;
  111.     } while (*p != '\0');
  112.  
  113.     crow = -1;
  114.  
  115.     for (i = 0; i < len; i++) {
  116.         if (screenrow[i] == NULL)
  117.             break;
  118.         if (ptr >= screenrow[i] && (ptr < screenrow[i + 1] || screenrow[i + 1] == NULL))
  119.             crow = i + 1;
  120.  
  121.         if (screenrow[i] != oldrow[i]) {
  122.             if (i && !adjusted[i - 1]) {
  123.                 i--;
  124.                 m = (int)(screenrow[i + 1] - screenrow[i]);
  125.                 strncpy (linea, screenrow[i], m);
  126.                 if (linea[m - 1] == '\n')
  127.                     m--;
  128.                 linea[m] = '\0';
  129.                 gotoxy_s (1, i + 1);
  130.                 del_line ();
  131.  
  132.                 if ((a = strchr (linea, '>')) == NULL)
  133.                     change_attr (CYAN|_BLACK);
  134.                 else if ((int)(linea - a) <= 5)
  135.                     change_attr (YELLOW|_BLACK);
  136.  
  137.                 m_print ("%s", linea);
  138.                 i++;
  139.             }
  140.  
  141.             if (screenrow[i + 1] == NULL)
  142.                 m = strlen (screenrow[i]);
  143.             else
  144.                 m = (int)(screenrow[i + 1] - screenrow[i]);
  145.             strncpy (linea, screenrow[i], m);
  146.             if (linea[m - 1] == '\n')
  147.                 m--;
  148.             linea[m] = '\0';
  149.             gotoxy_s (1, i + 1);
  150.             del_line ();
  151.  
  152.             if ((a = strchr (linea, '>')) == NULL)
  153.                 change_attr (CYAN|_BLACK);
  154.             else if ((int)(linea - a) <= 5)
  155.                 change_attr (YELLOW|_BLACK);
  156.  
  157.             m_print ("%s", linea);
  158.             adjusted[i] = 1;
  159.         }
  160.     }
  161.     if (crow == -1)
  162.         crow = i + 1;
  163.  
  164.     if (crow <= len) {
  165.         crow--;
  166.  
  167.         if (screenrow[crow + 1] == NULL)
  168.             m = strlen (screenrow[crow]);
  169.         else
  170.             m = (int)(screenrow[crow + 1] - screenrow[crow]);
  171.         strncpy (linea, screenrow[crow], m);
  172.         if (linea[m - 1] == '\n')
  173.             m--;
  174.         linea[m] = '\0';
  175.  
  176.         if (cy != crow)
  177.             strcpy (editrow, linea);
  178.  
  179.         m = (int)(ptr - screenrow[crow]);
  180.  
  181.         if (!adjusted[crow] && strcmp (editrow, linea)) {
  182.             if ((a = strchr (linea, '>')) == NULL)
  183.                 change_attr (CYAN|_BLACK);
  184.             else if ((int)(linea - a) <= 5)
  185.                 change_attr (YELLOW|_BLACK);
  186.  
  187.             if (m) {
  188.                 if (m < cx)
  189.                     gotoxy_s (m, crow + 1);
  190.                 m_print ("%s", &linea[m - 1]);
  191.             }
  192.             else {
  193.                 gotoxy_s (m + 1, crow + 1);
  194.                 m_print ("%s", &linea[m]);
  195.             }
  196.  
  197.             del_line ();
  198.             strcpy (editrow, linea);
  199.  
  200.             if (linea[m] || m < cx)
  201.                 gotoxy_s (m + 1, crow + 1);
  202.         }
  203.         else {
  204.             strcpy (editrow, linea);
  205.             gotoxy_s (m + 1, crow + 1);
  206.         }
  207.     }
  208.  
  209. //    txtptr[strlen(txtptr)-1]='\0';  // fix volante per eliminare piccolo bachetto..
  210.  
  211.     UNBUFFER_BYTES ();
  212.     VioUpdate ();
  213.  
  214.     cx = m;
  215.     cy = crow;
  216. }
  217.  
  218. int readkey (void)
  219. {
  220.    int c = -1;
  221.  
  222.    if (!local_mode) {
  223.       while (!CHAR_AVAIL ()) {
  224.          if (!CARRIER)
  225.             return (-1);
  226.  
  227.          if (local_kbd != -1)
  228.             break;
  229.  
  230.          time_release ();
  231.          release_timeslice ();
  232.       }
  233.  
  234.       if (local_kbd == -1) {
  235.          c = (unsigned char)TIMED_READ(1);
  236.          if (c == 0x1B) {
  237.  
  238. reread:
  239.             switch (TIMED_READ (5)) {
  240.                // Freccia in su'
  241.                case 'A':
  242.                   return (0x4800);
  243.  
  244.                // Freccia in giu'
  245.                case 'B':
  246.                   return (0x5000);
  247.  
  248.                // Freccia a destra
  249.                case 'C':
  250.                   return (0x4D00);
  251.  
  252.                // Freccia a sinistra
  253.                case 'D':
  254.                   return (0x4B00);
  255.  
  256.                // Home
  257.                case 'H':
  258.                   return (0x4700);
  259.  
  260.                // End
  261.                case 'K':
  262.                   return (0x4F00);
  263.  
  264.                case '[':
  265.                case 'O':
  266.                case '0':
  267.                case '1':
  268.                case '2':
  269.                case '3':
  270.                case '4':
  271.                case '5':
  272.                case '6':
  273.                case '7':
  274.                case '8':
  275.                case '9':
  276.                   goto reread;
  277.  
  278.                default:
  279.                   return (-1);
  280.             }
  281.          }
  282.       }
  283.       else {
  284.          c = local_kbd;
  285.          local_kbd = -1;
  286.       }
  287.    }
  288.    else {
  289.       while (local_kbd == -1) {
  290.          if (!CARRIER)
  291.             return (-1);
  292.  
  293.          time_release ();
  294.          release_timeslice ();
  295.       }
  296.  
  297.       c = local_kbd;
  298.       local_kbd = -1;
  299.    }
  300.  
  301.    return (c);
  302. }
  303.  
  304. int read_editor_help (void)
  305. {
  306.    FILE *fp;
  307.    int i;
  308.    char linea[128];
  309.  
  310.    strcpy (linea, text_path);
  311.    strcat (linea, "FSHELP");
  312.  
  313.    if ((fp = get_system_file (linea)) == NULL) {
  314.       strcpy (linea, config->glob_text_path);
  315.       strcat (linea, "FSHELP");
  316.  
  317.       if ((fp = get_system_file (linea)) == NULL)
  318.          return (0);
  319.    }
  320.  
  321.    i = 6;
  322.  
  323.    while (fgets (linea, 120, fp) != NULL) {
  324.       while (strlen (linea) > 0 && (linea[strlen (linea) - 1] == 0x0D || linea[strlen (linea) - 1] == 0x0A))
  325.          linea[strlen (linea) -1] = '\0';
  326.  
  327.       cpos (i++, (usr.width ? (usr.width - 1) : 79) - strlen (linea));
  328.       m_print ("%s", linea);
  329.    }
  330.  
  331.    fclose (fp);
  332.    input (linea, 0);
  333.  
  334.    return (-1);
  335. }
  336.  
  337. void edit_file (char *name, int len, int width)
  338. {
  339.    int fd, i, startrow, m;
  340.    char insert, *p, savefile = 0, endrun = 0;
  341.  
  342.    if ((txtptr = malloc (MAX_SIZE)) == NULL)
  343.       return;
  344.  
  345.    memset (txtptr, 0, MAX_SIZE);
  346.  
  347.    for (i = 0; i < 26; i++) {
  348.       oldrow[i] = NULL;
  349.       screenrow[i] = NULL;
  350.    }
  351.  
  352.    if ((fd = sh_open (name, SH_DENYRW, O_RDONLY|O_TEXT, S_IREAD|S_IWRITE)) != -1) {
  353.       i = read (fd, txtptr, MAX_SIZE - 1);
  354.       txtptr[i] = '\0';
  355.       close (fd);
  356.  
  357.       unlink (name);
  358.  
  359.       ptr = txtptr;
  360.       while (*ptr) {
  361.          if (*ptr == 0x01)
  362.             *ptr = '@';
  363.          ptr++;
  364.       }
  365.    }
  366.  
  367.    clrscr_s ();
  368.    ptr = txtptr;
  369.    startrow = 0;
  370.    width--;
  371.    insert = 1;
  372.  
  373.    editrow[0] = '\0';
  374.    display_screen (startrow, width, len);
  375.  
  376.    while (!endrun && CARRIER) {
  377.       if ((i = readkey ()) == -1)
  378.          continue;
  379.  
  380.       if (i == 0x1A || i == 0x2C1A) {
  381.          savefile = 1;
  382.          break;
  383.       }
  384.  
  385.       switch (i) {
  386.          // Home
  387.          case 0x4700:
  388.             if (ptr != screenrow[cy]) {
  389.                ptr = screenrow[cy];
  390.                display_screen (startrow, width, len);
  391.             }
  392.             break;
  393.  
  394.          // End
  395.          case 0x4F00:
  396.             if (screenrow[cy + 1] == NULL) {
  397.                p = strchr (screenrow[cy], '\0');
  398.                if (ptr != p) {
  399.                   ptr = p;
  400.                   display_screen (startrow, width, len);
  401.                }
  402.             }
  403.             else if (ptr != screenrow[cy + 1] - 1) {
  404.                ptr = screenrow[cy + 1] - 1;
  405.                display_screen (startrow, width, len);
  406.             }
  407.             break;
  408.  
  409.          // Freccia su'
  410.          case CTRLE:
  411.          case 0x4800:
  412.             if (cy <= 0) {
  413.                if (startrow <= 0)
  414.                   break;
  415.                if (startrow >= 10)
  416.                   startrow -= 10;
  417.                else
  418.                   startrow = 0;
  419.             }
  420.             else
  421.                cy--;
  422.  
  423.             if (screenrow[cy + 1] == NULL)
  424.                m = strlen (screenrow[cy]);
  425.             else
  426.                m = (int)(screenrow[cy + 1] - screenrow[cy]);
  427.             if (m && screenrow[cy][m - 1] == '\n')
  428.                m--;
  429.  
  430.             if (cx > m)
  431.                cx = m;
  432.             ptr = screenrow[cy] + cx;
  433.             cy++;
  434.             display_screen (startrow, width, len);
  435.             break;
  436.  
  437.          // Freccia giu'
  438.          case CTRLX:
  439.          case 0x5000:
  440.             if (screenrow[cy + 1] == NULL)
  441.                break;
  442.  
  443.             if (cy >= (len - 1)) {
  444.                startrow += 10;
  445.                clrscr_s ();
  446.             }
  447.             cy++;
  448.  
  449.             if (screenrow[cy + 1] == NULL)
  450.                m = strlen (screenrow[cy]);
  451.             else
  452.                m = (int)(screenrow[cy + 1] - screenrow[cy]);
  453.             if (m && screenrow[cy][m - 1] == '\n')
  454.                m--;
  455.  
  456.             if (cx > m)
  457.                cx = m;
  458.             ptr = screenrow[cy] + cx;
  459.             cy--;
  460.             display_screen (startrow, width, len);
  461.             break;
  462.  
  463.          // Freccia sinistra
  464.          case CTRLS:
  465.          case 0x4B00:
  466.             if (cx && ptr > txtptr) {
  467.                ptr--;
  468.                display_screen (startrow, width, len);
  469.             }
  470.             break;
  471.  
  472.          // Freccia destra
  473.          case CTRLD:
  474.          case 0x4D00:
  475.             if (ptr + 1 < screenrow[cy + 1]) {
  476.                ptr++;
  477.                display_screen (startrow, width, len);
  478.             }
  479.             break;
  480.  
  481.          // CTRL-Y
  482.          case 0x19:
  483.          case 0x1519:
  484.             if (screenrow[cy + 1] == NULL) {
  485.                if (*ptr != '\0') {
  486.                   *ptr = '\0';
  487.                   display_screen (startrow, width, len);
  488.                }
  489.             }
  490.             else {
  491.                strcpy (screenrow[cy], screenrow[cy + 1]);
  492.                for (i=cy;i<26;i++)
  493.                 screenrow[i]=NULL;
  494.                display_screen (startrow, width, len);
  495.             }
  496.             break;
  497.  
  498.          // Delete
  499.          case 0x5300:
  500.          case 0x7f:
  501.             if (ptr >= txtptr) {
  502.                strcpy (ptr, &ptr[1]);
  503.                for (i = 0; i < 26; i++)
  504.                   screenrow[i] = NULL;
  505.                display_screen (startrow, width, len);
  506.             }
  507.             break;
  508.  
  509.          // Backspace
  510.          case 0x08:
  511.          case 0x0E08:
  512.             if (ptr > txtptr) {
  513.                ptr--;
  514.                strcpy (ptr, &ptr[1]);
  515.                for (i = cy + 1; i < 26; i++) {
  516.                   if (screenrow[i] == NULL)
  517.                      break;
  518.                   screenrow[i]--;
  519.                }
  520.                if (cy <= 0 && cx <= 0) {
  521.                   if (startrow >= 10)
  522.                      startrow -= 10;
  523.                   else
  524.                      startrow = 0;
  525.                   clrscr_s ();
  526.                   display_screen (startrow, width, len);
  527.                }
  528.                else
  529.                   display_screen (startrow, width, len);
  530.             }
  531.             break;
  532.  
  533.          // Caratteri speciali (^K)
  534.          case CTRLK:
  535.             cpos (5, 2);
  536.             m_print2 ("£^K");
  537.  
  538.             while ((i = readkey ()) == -1) {
  539.                if (!CARRIER)
  540.                   break;
  541.             }
  542.  
  543.             i &= 0xFF;
  544.             i = toupper (i);
  545.  
  546.             if (i != 0x1B) {
  547.                if (i < 32)
  548.                   m_print2 ("^%c", i + 0x40);
  549.                else
  550.                   m_print2 ("%c", i);
  551.             }
  552.  
  553.             switch (i) {
  554.                case CTRLS:
  555.                case 'S':
  556.                   endrun = 1;
  557.                   savefile = 1;
  558.                   break;
  559.  
  560.                case CTRLQ:
  561.                case 'Q':
  562.                   endrun = 1;
  563.                   savefile = 0;
  564.                   break;
  565.  
  566.                case '?':
  567.                   if (!read_editor_help ())
  568.                      break;
  569.                   clrscr_s ();
  570.                   for (i = 0; i < 26; i++)
  571.                      screenrow[i] = NULL;
  572.                   break;
  573.             }
  574.  
  575.             cpos (5, 2);
  576.             m_print2 ("£    ");
  577.  
  578.             display_screen (startrow, width, len);
  579.             break;
  580.  
  581.          // Redraw dello schermo
  582.          case 0x0C:
  583.             cls ();
  584.  
  585.             change_attr (BLUE|_LGREY);
  586.             del_line ();
  587.             m_print (" * %s\n", sys.msg_name);
  588.  
  589.             msg_attrib (&msg, last_msg + 1, 0, 0);
  590.  
  591.             change_attr (RED|_BLUE);
  592.             del_line ();
  593.             cpos (5, (usr.width ? usr.width : 80) - 18);
  594.             m_print ("£^Z=Save  ^K?=Help");
  595.  
  596.             change_attr (CYAN|_BLACK);
  597.             m_print (bbstxt[B_ONE_CR]);
  598.  
  599.             for (i = 0; i < 26; i++)
  600.                screenrow[i] = NULL;
  601.             display_screen (startrow, width, len);
  602.             break;
  603.  
  604.          // Caratteri speciali (^Q)
  605.          case CTRLQ:
  606.             cpos (5, 2);
  607.             m_print2 ("£^Q");
  608.  
  609.             while ((i = readkey ()) == -1) {
  610.                if (!CARRIER)
  611.                   break;
  612.             }
  613.  
  614.             i &= 0xFF;
  615.             i = toupper (i);
  616.  
  617.             if (i != 0x1B) {
  618.                if (i < 32)
  619.                   m_print2 ("^%c", i + 0x40);
  620.                else
  621.                   m_print2 ("%c", i);
  622.             }
  623.  
  624.             switch (i) {
  625.                case CTRLS:
  626.                case 'S':
  627.                   if (ptr != screenrow[cy])
  628.                      ptr = screenrow[cy];
  629.                   break;
  630.  
  631.                case CTRLD:
  632.                case 'D':
  633.                   if (ptr != screenrow[cy + 1] - 1)
  634.                      ptr = screenrow[cy + 1] - 1;
  635.                   break;
  636.             }
  637.  
  638.             cpos (5, 2);
  639.             m_print2 ("£    ");
  640.  
  641.             display_screen (startrow, width, len);
  642.             break;
  643.  
  644.          // Enter
  645.          case 0x0D:
  646.          case 0x1C0D:
  647.             i = '\n';
  648.             // Fall through
  649.  
  650.          // Carattere normale
  651.          default:
  652.             if ((i &= 0xFF) < 32 && i != '\n')
  653.                break;
  654.  
  655.             if (insert) {
  656.                p = &ptr[strlen (ptr)];
  657.                while (p >= ptr) {
  658.                   *(p + 1) = *p;
  659.                   p--;
  660.                }
  661.  
  662.                *ptr++ = i;
  663.  
  664.                for (i = cy + 1; i < 26; i++) {
  665.                   if (screenrow[i] == NULL)
  666.                      break;
  667.                   screenrow[i]++;
  668.                }
  669.             }
  670.             else {
  671.                if (*ptr == '\0') {
  672.                   *ptr++ = i;
  673.                   *ptr = '\0';
  674.                }
  675.                else
  676.                   *ptr++ = i;
  677.             }
  678.             display_screen (startrow, width, len);
  679.             if (cy >= (len)) {
  680.                startrow += 10;
  681.                clrscr_s ();
  682.                display_screen (startrow, width, len);
  683.             }
  684.             break;
  685.       }
  686.    }
  687.  
  688.    cls ();
  689.  
  690.    if (savefile) {
  691.       if ((fd = sh_open (name, SH_DENYRW, O_WRONLY|O_TEXT|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE)) != -1) {
  692.          write (fd, txtptr, strlen (txtptr));
  693.          close (fd);
  694.       }
  695.    }
  696.  
  697.    free (txtptr);
  698. }
  699.  
  700. void fullscreen_editor (void)
  701. {
  702.    char *p = "£^X=Down  ^E=Up  ^S=Left  ^D=Right  ^Z=Save  ^K?=Help";
  703.  
  704.    cls();
  705.  
  706.    change_attr (BLUE|_LGREY);
  707.    del_line ();
  708.    m_print (" * %s\n", sys.msg_name);
  709.  
  710.    msg_attrib (&msg, last_msg + 1, 0, 0);
  711.  
  712.    change_attr (RED|_BLUE);
  713.    del_line ();
  714.    cpos (5, (usr.width ? usr.width : 80) - strlen (p) - 1 + 4);
  715.    m_print (p);
  716.  
  717.    change_attr (CYAN|_BLACK);
  718.    m_print (bbstxt[B_ONE_CR]);
  719.  
  720.    fulleditor = 1;
  721.    XON_DISABLE ();
  722.    _BRK_DISABLE ();
  723.  
  724.    edit_file ("MSGTMP", usr.len - 5, usr.width ? (usr.width - 1) : 79);
  725.  
  726.    fulleditor = 0;
  727.    XON_ENABLE ();
  728.    _BRK_ENABLE ();
  729. }
  730.  
  731.  
  732.