home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / LO241SRV.ZIP / LSETUP3.C < prev    next >
C/C++ Source or Header  |  1998-05-17  |  91KB  |  2,489 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 <stdlib.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <io.h>
  24. #include <fcntl.h>
  25. #include <sys\stat.h>
  26.  
  27. #include "lsetup.h"
  28. #include "lprot.h"
  29.  
  30. #include <cxl\cxlvid.h>
  31. #include <cxl\cxlwin.h>
  32. #include <cxl\cxlstr.h>
  33. #include <cxl\cxlkey.h>
  34.  
  35. extern struct _configuration config;
  36.  
  37. char *get_priv_text (int);
  38. void create_path (char *);
  39. int sh_open (char *file, int shmode, int omode, int fmode);
  40. void update_message (void);
  41. void clear_window (void);
  42. int winputs (int wy, int wx, char *stri, char *fmt, int mode, char pad, int fieldattr, int textattr);
  43. long window_get_flags (int y, int x, int type, long f);
  44.  
  45. static void file_select_area_list (int, struct _sys *);
  46. static void file_edit_single_area (struct _sys *);
  47.  
  48. void modem_hardware ()
  49. {
  50.    int wh, i = 1;
  51.    char string[128];
  52.  
  53.     wh = wopen (5, 22, 19, 65, 3, LCYAN|_BLACK, CYAN|_BLACK);
  54.     wactiv (wh);
  55.     wshadow (DGREY|_BLACK);
  56.     wtitle (" Hardware ", TRIGHT, YELLOW|_BLUE);
  57.  
  58.     do {
  59.         stop_update ();
  60.         wclear ();
  61.  
  62.         wmenubegc ();
  63.         wmenuitem ( 1,  1, " Modem port        ", 0,  1, 0, NULL, 0, 0);
  64.         wmenuitem ( 2,  1, " Maximum baud rate ", 0,  2, 0, NULL, 0, 0);
  65.         wmenuitem ( 3,  1, " Lock port         ", 0,  3, 0, NULL, 0, 0);
  66.         wmenuitem ( 4,  1, " Terminal          ", 0,  4, 0, NULL, 0, 0);
  67.         wmenuitem ( 5,  1, " FAX Message       ", 0,  5, 0, NULL, 0, 0);
  68.         wmenuitem ( 6,  1, " └ FAX Errorlevel  ", 0,  6, 0, NULL, 0, 0);
  69.         wmenuitem ( 7,  1, " Strip dashes      ", 0,  7, 0, NULL, 0, 0);
  70.         wmenuitem ( 8,  1, " Dialing timeout   ", 0,  8, 0, NULL, 0, 0);
  71.         wmenuitem ( 9,  1, " Carrier mask      ", 0,  9, 0, NULL, 0, 0);
  72.         wmenuitem (10,  1, " DCD drop timeout  ", 0, 10, 0, NULL, 0, 0);
  73.         wmenuitem (11,  1, " No init answer    ", 0, 11, 0, NULL, 0, 0);
  74.         wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  75.  
  76.         sprintf (string, "%d", config.com_port + 1);
  77.         wprints (1, 21, CYAN|_BLACK, string);
  78.         sprintf (string, "%lu", config.speed);
  79.         wprints (2, 21, CYAN|_BLACK, string);
  80.         wprints (3, 21, CYAN|_BLACK, config.lock_baud ? "Yes" : "No");
  81.         wprints (4, 21, CYAN|_BLACK, config.terminal ? "Yes" : "No");
  82.         wprints (5, 21, CYAN|_BLACK, config.fax_response);
  83.         sprintf (string, "%d", config.fax_errorlevel);
  84.         wprints (6, 21, CYAN|_BLACK, string);
  85.         wprints (7, 21, CYAN|_BLACK, config.stripdash ? "Yes" : "No");
  86.         sprintf (string, "%d", config.modem_timeout);
  87.         wprints (8, 21, CYAN|_BLACK, string);
  88.         sprintf (string, "%d", config.carrier_mask);
  89.         wprints (9, 21, CYAN|_BLACK, string);
  90.         sprintf (string, "%d", config.dcd_timeout);
  91.         wprints (10, 21, CYAN|_BLACK, string);
  92.         sprintf (string, "%d", config.modem_OK_errorlevel);
  93.         wprints (11, 21, CYAN|_BLACK, string);
  94.  
  95.         start_update ();
  96.         i = wmenuget ();
  97.  
  98.         switch (i) {
  99.             case 1:
  100.                 sprintf (string, "%d", config.com_port + 1);
  101.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  102.                 winpdef (1, 21, string, "??", 0, 2, NULL, 0);
  103.                 if (winpread () != W_ESCPRESS)
  104.                     config.com_port = atoi (string) - 1;
  105.                 hidecur ();
  106.                 break;
  107.  
  108.             case 2:
  109.                 switch (config.speed) {
  110.                     case 300L:
  111.                         config.speed = 1200L;
  112.                         break;
  113.                     case 1200L:
  114.                         config.speed = 2400L;
  115.                         break;
  116.                     case 2400L:
  117.                         config.speed = 4800L;
  118.                         break;
  119.                case 4800L:
  120.                   config.speed = 9600L;
  121.                   break;
  122.                case 9600L:
  123.                   config.speed = 19200L;
  124.                   break;
  125.                case 19200L:
  126.                   config.speed = 38400L;
  127.                   break;
  128.                     case 38400L:
  129.                   config.speed = 57600L;
  130.                   break;
  131.                case 57600L:
  132.                   config.speed = 115200L;
  133.                   break;
  134.                case 115200L:
  135.                   config.speed = 300L;
  136.                   break;
  137.                default:
  138.                   config.speed = 300L;
  139.                   break;
  140.             }
  141.             break;
  142.  
  143.          case 3:
  144.             config.lock_baud ^= 1;
  145.             break;
  146.  
  147.          case 4:
  148.             config.terminal ^= 1;
  149.             break;
  150.  
  151.             case 5:
  152.             strcpy (string, config.fax_response);
  153.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  154.                 winpdef (5, 21, string, "???????????????????", 0, 2, NULL, 0);
  155.                 if (winpread () != W_ESCPRESS)
  156.                     strcpy (config.fax_response, strbtrim (string));
  157.                 break;
  158.  
  159.             case 6:
  160.                 sprintf (string, "%d", config.fax_errorlevel);
  161.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  162.                 winpdef (6, 21, string, "???", 0, 2, NULL, 0);
  163.                 if (winpread () != W_ESCPRESS)
  164.                     config.fax_errorlevel = atoi (strbtrim (string));
  165.                 break;
  166.  
  167.             case 7:
  168.                 config.stripdash ^= 1;
  169.                 break;
  170.  
  171.             case 8:
  172.                 sprintf (string, "%d", config.modem_timeout);
  173.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  174.                 winpdef (8, 21, string, "???", 0, 2, NULL, 0);
  175.                 if (winpread () != W_ESCPRESS)
  176.                     config.modem_timeout = atoi (strbtrim (string));
  177.                 break;
  178.  
  179.             case 9:
  180.                 sprintf (string, "%d", config.carrier_mask);
  181.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  182.                 winpdef (9, 21, string, "???", 0, 2, NULL, 0);
  183.                 if (winpread () != W_ESCPRESS)
  184.                     config.carrier_mask = atoi (strbtrim (string));
  185.                 break;
  186.  
  187.             case 10:
  188.                 sprintf (string, "%d", config.dcd_timeout);
  189.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  190.                 winpdef (10, 21, string, "???", 0, 2, NULL, 0);
  191.                 if (winpread () != W_ESCPRESS)
  192.                     config.dcd_timeout = atoi (strbtrim (string));
  193.                 break;
  194.  
  195.             case 11:
  196.                 sprintf (string, "%d", config.modem_OK_errorlevel);
  197.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  198.                 winpdef (11, 21, string, "???", 0, 2, NULL, 0);
  199.                 if (winpread () != W_ESCPRESS)
  200.                     config.modem_OK_errorlevel = atoi (strbtrim (string));
  201.                 break;
  202.         }
  203.  
  204.         hidecur ();
  205.  
  206.     } while (i != -1);
  207.  
  208.     wclose ();
  209. }
  210.  
  211. void modem_answer_control ()
  212. {
  213.     int wh, i = 1;
  214.     char string[128], *p;
  215.  
  216.     wh = wopen (5, 10, 13, 71, 3, LCYAN|_BLACK, CYAN|_BLACK);
  217.     wactiv (wh);
  218.     wshadow (DGREY|_BLACK);
  219.     wtitle (" Answer control ", TRIGHT, YELLOW|_BLUE);
  220.  
  221.     do {
  222.         stop_update ();
  223.         wclear ();
  224.  
  225.         wmenubegc ();
  226.       wmenuitem ( 1,  1, " Manual answer   ", 0, 1, 0, NULL, 0, 0);
  227.       wmenuitem ( 2,  1, " Answer command  ", 0, 2, 0, NULL, 0, 0);
  228.       wmenuitem ( 3,  1, " Limited hours   ", 0, 3, 0, NULL, 0, 0);
  229.       wmenuitem ( 4,  1, " ├ Starting time ", 0, 4, 0, NULL, 0, 0);
  230.       wmenuitem ( 5,  1, " └ Ending time   ", 0, 5, 0, NULL, 0, 0);
  231.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  232.  
  233.       wprints (1, 19, CYAN|_BLACK, config.manual_answer ? "Yes" : "No");
  234.       wprints (2, 19, CYAN|_BLACK, config.answer);
  235.       wprints (3, 19, CYAN|_BLACK, config.limited_hours ? "Yes" : "No");
  236.       sprintf (string, "%02d:%02d", config.start_time / 60, config.start_time % 60);
  237.       wprints (4, 19, CYAN|_BLACK, string);
  238.       sprintf (string, "%02d:%02d", config.end_time / 60, config.end_time % 60);
  239.         wprints (5, 19, CYAN|_BLACK, string);
  240.  
  241.       start_update ();
  242.       i = wmenuget ();
  243.  
  244.       switch (i) {
  245.          case 1:
  246.             config.manual_answer ^= 1;
  247.             break;
  248.  
  249.          case 2:
  250.             strcpy (string, config.answer);
  251.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  252.             winpdef (2, 19, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  253.             if (winpread () != W_ESCPRESS)
  254.                strcpy (config.answer, strbtrim (string));
  255.             break;
  256.  
  257.          case 3:
  258.             config.limited_hours ^= 1;
  259.             break;
  260.  
  261.          case 4:
  262.             sprintf (string, "%02d:%02d", config.start_time / 60, config.start_time % 60);
  263.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  264.             winpdef (4, 19, string, "?????", 0, 2, NULL, 0);
  265.             if (winpread () != W_ESCPRESS) {
  266.                p = strtok (string, ":");
  267.                if (p == NULL)
  268.                   config.start_time = atoi (string) % 1440;
  269.                else {
  270.                   config.start_time = atoi (p) * 60;
  271.                   p = strtok (NULL, "");
  272.                   config.start_time += atoi (p);
  273.                }
  274.             }
  275.             break;
  276.  
  277.          case 5:
  278.             sprintf (string, "%02d:%02d", config.end_time / 60, config.end_time % 60);
  279.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  280.             winpdef (5, 19, string, "?????", 0, 2, NULL, 0);
  281.             if (winpread () != W_ESCPRESS) {
  282.                p = strtok (string, ":");
  283.                if (p == NULL)
  284.                   config.end_time = atoi (p) % 1440;
  285.                else {
  286.                   config.end_time = atoi (p) * 60;
  287.                   p = strtok (NULL, "");
  288.                   config.end_time += atoi (p);
  289.                }
  290.             }
  291.             break;
  292.       }
  293.  
  294.       hidecur ();
  295.  
  296.    } while (i != -1);
  297.  
  298.    wclose ();
  299. }
  300.  
  301. void modem_command_strings ()
  302. {
  303.    int wh, i = 1;
  304.    char string[128];
  305.  
  306.    wh = wopen (6, 10, 16, 67, 3, LCYAN|_BLACK, CYAN|_BLACK);
  307.    wactiv (wh);
  308.    wshadow (DGREY|_BLACK);
  309.    wtitle (" Command strings ", TRIGHT, YELLOW|_BLUE);
  310.  
  311.    do {
  312.       stop_update ();
  313.       wclear ();
  314.  
  315.       wmenubegc ();
  316.       wmenuitem ( 1,  1, " Init 1      ", 0,  1, 0, NULL, 0, 0);
  317.       wmenuitem ( 2,  1, " Init 2      ", 0,  5, 0, NULL, 0, 0);
  318.       wmenuitem ( 3,  1, " Init 3      ", 0,  6, 0, NULL, 0, 0);
  319.       wmenuitem ( 4,  1, " Dial prefix ", 0,  2, 0, NULL, 0, 0);
  320.       wmenuitem ( 5,  1, " Dial suffix ", 0,  3, 0, NULL, 0, 0);
  321.       wmenuitem ( 6,  1, " Offhook     ", 0,  4, 0, NULL, 0, 0);
  322.       wmenuitem ( 7,  1, " Hangup      ", 0,  7, 0, NULL, 0, 0);
  323.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  324.  
  325.       wprints (1, 15, CYAN|_BLACK, config.init);
  326.       wprints (2, 15, CYAN|_BLACK, config.init2);
  327.       wprints (3, 15, CYAN|_BLACK, config.init3);
  328.       wprints (4, 15, CYAN|_BLACK, config.dial);
  329.       wprints (5, 15, CYAN|_BLACK, config.dial_suffix);
  330.       wprints (6, 15, CYAN|_BLACK, config.modem_busy);
  331.       wprints (7, 15, CYAN|_BLACK, config.hangup_string);
  332.  
  333.       start_update ();
  334.       i = wmenuget ();
  335.  
  336.       switch (i) {
  337.          case 1:
  338.             strcpy (string, config.init);
  339.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  340.             winpdef (1, 15, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  341.             if (winpread () != W_ESCPRESS)
  342.                strcpy (config.init, strbtrim (string));
  343.             hidecur ();
  344.             break;
  345.  
  346.          case 5:
  347.             strcpy (string, config.init2);
  348.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  349.             winpdef (2, 15, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  350.             if (winpread () != W_ESCPRESS)
  351.                strcpy (config.init2, strbtrim (string));
  352.             hidecur ();
  353.             break;
  354.  
  355.          case 6:
  356.             strcpy (string, config.init3);
  357.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  358.             winpdef (3, 15, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  359.             if (winpread () != W_ESCPRESS)
  360.                strcpy (config.init3, strbtrim (string));
  361.             hidecur ();
  362.             break;
  363.  
  364.          case 2:
  365.             strcpy (string, config.dial);
  366.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  367.             winpdef (4, 15, string, "???????????????????", 0, 2, NULL, 0);
  368.             if (winpread () != W_ESCPRESS)
  369.                strcpy (config.dial, strbtrim (string));
  370.             hidecur ();
  371.             break;
  372.  
  373.          case 3:
  374.             strcpy (string, config.dial_suffix);
  375.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  376.             winpdef (5, 15, string, "???????????????????", 0, 2, NULL, 0);
  377.             if (winpread () != W_ESCPRESS);
  378.                strcpy (config.dial_suffix, strbtrim (string));
  379.             hidecur ();
  380.             break;
  381.  
  382.          case 4:
  383.             strcpy (string, config.modem_busy);
  384.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  385.             winpdef (6, 15, string, "???????????????????", 0, 2, NULL, 0);
  386.             if (winpread () != W_ESCPRESS)
  387.                strcpy (config.modem_busy, strbtrim (string));
  388.             hidecur ();
  389.             break;
  390.  
  391.          case 7:
  392.             strcpy (string, config.hangup_string);
  393.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  394.             winpdef (7, 15, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  395.             if (winpread () != W_ESCPRESS)
  396.                strcpy (config.hangup_string, strbtrim (string));
  397.             hidecur ();
  398.             break;
  399.       }
  400.  
  401.       hidecur ();
  402.  
  403.    } while (i != -1);
  404.  
  405.    wclose ();
  406. }
  407.  
  408. void modem_dialing_strings ()
  409. {
  410.    int wh, i = 6;
  411.    char string[128];
  412.  
  413.    wh = wopen (4, 10, 19, 67, 3, LCYAN|_BLACK, CYAN|_BLACK);
  414.    wactiv (wh);
  415.    wshadow (DGREY|_BLACK);
  416.    wtitle (" Dialing strings ", TRIGHT, YELLOW|_BLUE);
  417.  
  418.    do {
  419.       stop_update ();
  420.       wclear ();
  421.  
  422.       wmenubegc ();
  423.       wprints (2, 11, LGREY|BLACK, "┌─Prefix────────────┐");
  424.       wprints (2, 33, LGREY|BLACK, "┌─Suffix────────────┐");
  425.       wmenuitem ( 3,  1, " Dial 1  ", 0,  6, 0, NULL, 0, 0);
  426.       wmenuitem ( 4,  1, " Dial 2  ", 0,  7, 0, NULL, 0, 0);
  427.       wmenuitem ( 5,  1, " Dial 3  ", 0,  8, 0, NULL, 0, 0);
  428.       wmenuitem ( 6,  1, " Dial 4  ", 0,  9, 0, NULL, 0, 0);
  429.       wmenuitem ( 7,  1, " Dial 5  ", 0, 10, 0, NULL, 0, 0);
  430.       wmenuitem ( 8,  1, " Dial 6  ", 0, 11, 0, NULL, 0, 0);
  431.       wmenuitem ( 9,  1, " Dial 7  ", 0, 12, 0, NULL, 0, 0);
  432.       wmenuitem (10,  1, " Dial 8  ", 0, 13, 0, NULL, 0, 0);
  433.       wmenuitem (11,  1, " Dial 9  ", 0, 14, 0, NULL, 0, 0);
  434.       wmenuitem (11,  1, " Dial 10 ", 0, 15, 0, NULL, 0, 0);
  435.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  436.  
  437.       wprints (3, 12, CYAN|_BLACK, config.altdial[0].prefix);
  438.       wprints (3, 34, CYAN|_BLACK, config.altdial[0].suffix);
  439.       wprints (4, 12, CYAN|_BLACK, config.altdial[1].prefix);
  440.       wprints (4, 34, CYAN|_BLACK, config.altdial[1].suffix);
  441.       wprints (5, 12, CYAN|_BLACK, config.altdial[2].prefix);
  442.       wprints (5, 34, CYAN|_BLACK, config.altdial[2].suffix);
  443.       wprints (6, 12, CYAN|_BLACK, config.altdial[3].prefix);
  444.       wprints (6, 34, CYAN|_BLACK, config.altdial[3].suffix);
  445.       wprints (7, 12, CYAN|_BLACK, config.altdial[4].prefix);
  446.       wprints (7, 34, CYAN|_BLACK, config.altdial[4].suffix);
  447.       wprints (8, 12, CYAN|_BLACK, config.altdial[5].prefix);
  448.       wprints (8, 34, CYAN|_BLACK, config.altdial[5].suffix);
  449.       wprints (9, 12, CYAN|_BLACK, config.altdial[6].prefix);
  450.       wprints (9, 34, CYAN|_BLACK, config.altdial[6].suffix);
  451.       wprints (10, 12, CYAN|_BLACK, config.altdial[7].prefix);
  452.       wprints (10, 34, CYAN|_BLACK, config.altdial[7].suffix);
  453.       wprints (11, 12, CYAN|_BLACK, config.altdial[8].prefix);
  454.       wprints (11, 34, CYAN|_BLACK, config.altdial[8].suffix);
  455.       wprints (12, 12, CYAN|_BLACK, config.altdial[9].prefix);
  456.       wprints (12, 34, CYAN|_BLACK, config.altdial[9].suffix);
  457.  
  458.       start_update ();
  459.       i = wmenuget ();
  460.  
  461.       switch (i) {
  462.          case 6:
  463.          case 7:
  464.          case 8:
  465.          case 9:
  466.          case 10:
  467.          case 11:
  468.          case 12:
  469.          case 13:
  470.          case 14:
  471.          case 15:
  472.             strcpy (string, config.altdial[i - 6].prefix);
  473.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  474.             winpdef (i - 3, 12, string, "???????????????????", 0, 2, NULL, 0);
  475.             if (winpread () != W_ESCPRESS) {
  476.                wprints (i - 3, 12, LGREY|_BLACK, string);
  477.                strcpy (config.altdial[i - 6].prefix, strbtrim (string));
  478.                strcpy (string, config.altdial[i - 6].suffix);
  479.                winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  480.                winpdef (i - 3, 34, string, "???????????????????", 0, 2, NULL, 0);
  481.                if (winpread () != W_ESCPRESS) {
  482.                   wprints (i - 3, 34, LGREY|_BLACK, string);
  483.                   strcpy (config.altdial[i - 6].suffix, strbtrim (string));
  484.                }
  485.             }
  486.             hidecur ();
  487.             break;
  488.       }
  489.  
  490.       hidecur ();
  491.  
  492.    } while (i != -1);
  493.  
  494.    wclose ();
  495. }
  496.  
  497. void modem_flag_strings ()
  498. {
  499.    int wh, i = 1;
  500.    char string[128];
  501.  
  502.    wh = wopen (4, 13, 18, 56, 3, LCYAN|_BLACK, CYAN|_BLACK);
  503.    wactiv (wh);
  504.    wshadow (DGREY|_BLACK);
  505.    wtitle (" Nodelist flags ", TRIGHT, YELLOW|_BLUE);
  506.  
  507.    do {
  508.       stop_update ();
  509.       wclear ();
  510.  
  511.       wmenubegc ();
  512.       wprints (1, 11, LGREY|BLACK, "┌─Flag─┐");
  513.       wprints (1, 19, LGREY|BLACK, "┌─Prefix────────────┐");
  514.       wmenuitem ( 2,  1, " Dial 1  ", 0,  1, 0, NULL, 0, 0);
  515.       wmenuitem ( 3,  1, " Dial 2  ", 0,  2, 0, NULL, 0, 0);
  516.       wmenuitem ( 4,  1, " Dial 3  ", 0,  3, 0, NULL, 0, 0);
  517.       wmenuitem ( 5,  1, " Dial 4  ", 0,  4, 0, NULL, 0, 0);
  518.       wmenuitem ( 6,  1, " Dial 5  ", 0,  5, 0, NULL, 0, 0);
  519.       wmenuitem ( 7,  1, " Dial 6  ", 0,  6, 0, NULL, 0, 0);
  520.       wmenuitem ( 8,  1, " Dial 7  ", 0,  7, 0, NULL, 0, 0);
  521.       wmenuitem ( 9,  1, " Dial 8  ", 0,  8, 0, NULL, 0, 0);
  522.       wmenuitem (10,  1, " Dial 9  ", 0,  9, 0, NULL, 0, 0);
  523.       wmenuitem (11,  1, " Dial 10 ", 0, 10, 0, NULL, 0, 0);
  524.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  525.  
  526.       wprints (2, 12, CYAN|_BLACK, config.prefixdial[0].flag);
  527.       wprints (2, 20, CYAN|_BLACK, config.prefixdial[0].prefix);
  528.       wprints (3, 12, CYAN|_BLACK, config.prefixdial[1].flag);
  529.       wprints (3, 20, CYAN|_BLACK, config.prefixdial[1].prefix);
  530.       wprints (4, 12, CYAN|_BLACK, config.prefixdial[2].flag);
  531.       wprints (4, 20, CYAN|_BLACK, config.prefixdial[2].prefix);
  532.       wprints (5, 12, CYAN|_BLACK, config.prefixdial[3].flag);
  533.       wprints (5, 20, CYAN|_BLACK, config.prefixdial[3].prefix);
  534.       wprints (6, 12, CYAN|_BLACK, config.prefixdial[4].flag);
  535.       wprints (6, 20, CYAN|_BLACK, config.prefixdial[4].prefix);
  536.       wprints (7, 12, CYAN|_BLACK, config.prefixdial[5].flag);
  537.       wprints (7, 20, CYAN|_BLACK, config.prefixdial[5].prefix);
  538.       wprints (8, 12, CYAN|_BLACK, config.prefixdial[6].flag);
  539.       wprints (8, 20, CYAN|_BLACK, config.prefixdial[6].prefix);
  540.       wprints (9, 12, CYAN|_BLACK, config.prefixdial[7].flag);
  541.       wprints (9, 20, CYAN|_BLACK, config.prefixdial[7].prefix);
  542.       wprints (10, 12, CYAN|_BLACK, config.prefixdial[8].flag);
  543.       wprints (10, 20, CYAN|_BLACK, config.prefixdial[8].prefix);
  544.       wprints (11, 12, CYAN|_BLACK, config.prefixdial[9].flag);
  545.       wprints (11, 20, CYAN|_BLACK, config.prefixdial[9].prefix);
  546.  
  547.       start_update ();
  548.       i = wmenuget ();
  549.  
  550.       switch (i) {
  551.          case 1:
  552.          case 2:
  553.          case 3:
  554.          case 4:
  555.          case 5:
  556.          case 6:
  557.          case 7:
  558.          case 8:
  559.          case 9:
  560.          case 10:
  561.             strcpy (string, config.prefixdial[i - 1].flag);
  562.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  563.             winpdef (i + 1, 12, string, "?????", 0, 2, NULL, 0);
  564.             if (winpread () != W_ESCPRESS) {
  565.                wprints (i + 1, 12, LGREY|_BLACK, string);
  566.                strcpy (config.prefixdial[i - 1].flag, strbtrim (string));
  567.                strcpy (string, config.prefixdial[i - 1].prefix);
  568.                winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  569.                winpdef (i + 1, 20, string, "???????????????????", 0, 2, NULL, 0);
  570.                if (winpread () != W_ESCPRESS) {
  571.                   wprints (i + 1, 20, LGREY|_BLACK, string);
  572.                   strcpy (config.prefixdial[i - 1].prefix, strbtrim (string));
  573.                }
  574.             }
  575.             break;
  576.       }
  577.  
  578.       hidecur ();
  579.  
  580.    } while (i != -1);
  581.  
  582.    wclose ();
  583. }
  584.  
  585. void general_time ()
  586. {
  587.    int wh, i = 1;
  588.    char string[128];
  589.  
  590.    wh = wopen (6, 7, 15, 74, 3, LCYAN|_BLACK, CYAN|_BLACK);
  591.    wactiv (wh);
  592.    wshadow (DGREY|_BLACK);
  593.    wtitle (" Time adjustment ", TRIGHT, YELLOW|_BLUE);
  594.  
  595.    do {
  596.       stop_update ();
  597.       wclear ();
  598.  
  599.       wmenubegc ();
  600.       wmenuitem ( 1,  1, " Init        ", 0,  1, 0, NULL, 0, 0);
  601.       wmenuitem ( 2,  1, " Dial prefix ", 0,  2, 0, NULL, 0, 0);
  602.       wmenuitem ( 3,  1, " Dial suffix ", 0,  3, 0, NULL, 0, 0);
  603.       wmenuitem ( 4,  1, " Number      ", 0,  4, 0, NULL, 0, 0);
  604.       wmenuitem ( 5,  1, " └─ Use DST  ", 0,  6, 0, NULL, 0, 0);
  605.       wmenuitem ( 6,  1, " Nodes       ", 0,  5, 0, NULL, 0, 0);
  606.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  607.  
  608.       wprints (1, 15, CYAN|_BLACK, config.galileo_init);
  609.       wprints (2, 15, CYAN|_BLACK, config.galileo_dial);
  610.       wprints (3, 15, CYAN|_BLACK, config.galileo_suffix);
  611.       wprints (4, 15, CYAN|_BLACK, config.galileo);
  612.       wprints (5, 15, CYAN|_BLACK, config.solar ? "No" : "Yes");
  613.       wprints (6, 15, CYAN|_BLACK, config.resync_nodes);
  614.  
  615.       start_update ();
  616.       i = wmenuget ();
  617.  
  618.       switch (i) {
  619.          case 1:
  620.             strcpy (string, config.galileo_init);
  621.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  622.             winpdef (1, 15, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  623.             if (winpread () != W_ESCPRESS)
  624.                strcpy (config.galileo_init, strbtrim (string));
  625.             break;
  626.  
  627.          case 2:
  628.             strcpy (string, config.galileo_dial);
  629.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  630.             winpdef (2, 15, string, "???????????????????", 0, 2, NULL, 0);
  631.             if (winpread () != W_ESCPRESS)
  632.                strcpy (config.galileo_dial, strbtrim (string));
  633.             break;
  634.  
  635.          case 3:
  636.             strcpy (string, config.galileo_suffix);
  637.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  638.             winpdef (3, 15, string, "???????????????????", 0, 2, NULL, 0);
  639.             if (winpread () != W_ESCPRESS);
  640.                strcpy (config.galileo_suffix, strbtrim (string));
  641.             break;
  642.  
  643.          case 4:
  644.             strcpy (string, config.galileo);
  645.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  646.             winpdef (4, 15, string, "???????????????????", 0, 2, NULL, 0);
  647.             if (winpread () != W_ESCPRESS)
  648.                strcpy (config.galileo, strbtrim (string));
  649.             break;
  650.  
  651.          case 5:
  652.             strcpy (string, config.resync_nodes);
  653.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  654.             winpdef (6, 15, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  655.             if (winpread () != W_ESCPRESS)
  656.                strcpy (config.resync_nodes, strbtrim (string));
  657.             break;
  658.  
  659.          case 6:
  660.             config.solar ^= 1;
  661.             break;
  662.       }
  663.  
  664.       hidecur ();
  665.  
  666.    } while (i != -1);
  667.  
  668.    wclose ();
  669. }
  670.  
  671. void mailer_log ()
  672. {
  673.    int wh, i = 1;
  674.    char string[128];
  675.  
  676.    wh = wopen (7, 15, 14, 72, 3, LCYAN|_BLACK, CYAN|_BLACK);
  677.    wactiv (wh);
  678.    wshadow (DGREY|_BLACK);
  679.    wtitle (" Log ", TRIGHT, YELLOW|_BLUE);
  680.  
  681.    do {
  682.       hidecur ();
  683.       stop_update ();
  684.       wclear ();
  685.  
  686.       wmenubegc ();
  687.       wmenuitem ( 1,  1, " Name        ", 0,  1, 0, NULL, 0, 0);
  688.       wmenuitem ( 2,  1, " Style       ", 0,  2, 0, NULL, 0, 0);
  689.       wmenuitem ( 3,  1, " Log flags   ", 0,  3, 0, NULL, 0, 0);
  690.       wmenuitem ( 4,  1, " Buffer size ", 0,  4, 0, NULL, 0, 0);
  691.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  692.  
  693.       wprints (1, 15, CYAN|_BLACK, config.log_name);
  694.       wprints (2, 15, CYAN|_BLACK, config.log_style ? "Terse" : "Verbose");
  695.       wprints (3, 15, CYAN|_BLACK, config.doflagfile ? "Yes" : "No");
  696.       sprintf (string, "%d", (int)config.logbuffer);
  697.       wprints (4, 15, CYAN|_BLACK, string);
  698.  
  699.       start_update ();
  700.       i = wmenuget ();
  701.  
  702.       switch (i) {
  703.          case 1:
  704.             strcpy (string, config.log_name);
  705.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  706.             winpdef (1, 15, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  707.             if (winpread () != W_ESCPRESS)
  708.                strcpy (config.log_name, strbtrim (string));
  709.             break;
  710.  
  711.          case 2:
  712.             config.log_style = config.log_style ? 0 : 1;
  713.             break;
  714.  
  715.          case 3:
  716.             config.doflagfile = config.doflagfile ? 0 : 1;
  717.             break;
  718.  
  719.          case 4:
  720.             sprintf (string, "%d", (int)config.logbuffer);
  721.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  722.             winpdef (4, 15, string, "??", 0, 2, NULL, 0);
  723.             if (winpread () != W_ESCPRESS) {
  724.                if (atoi (string) > 64)
  725.                   config.logbuffer = 64;
  726.                else if (atoi (string) < 0)
  727.                   config.logbuffer = 0;
  728.                else
  729.                   config.logbuffer = (char )atoi (string);
  730.             }
  731.             break;
  732.       }
  733.  
  734.       hidecur ();
  735.  
  736.    } while (i != -1);
  737.  
  738.    wclose ();
  739. }
  740.  
  741. void mailer_local_editor ()
  742. {
  743.    int wh, i = 1;
  744.    char string[128];
  745.  
  746.    wh = wopen (8, 13, 12, 70, 3, LCYAN|_BLACK, CYAN|_BLACK);
  747.    wactiv (wh);
  748.    wshadow (DGREY|_BLACK);
  749.    wtitle (" Message editor ", TRIGHT, YELLOW|_BLUE);
  750.  
  751.    do {
  752.       stop_update ();
  753.       wclear ();
  754.  
  755.       wmenubegc ();
  756.       wmenuitem ( 1,  1, " DOS command ", 0,  1, 0, NULL, 0, 0);
  757.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  758.  
  759.       wprints (1, 15, CYAN|_BLACK, config.local_editor);
  760.  
  761.       start_update ();
  762.       i = wmenuget ();
  763.  
  764.       switch (i) {
  765.          case 1:
  766.             strcpy (string, config.local_editor);
  767.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  768.             winpdef (1, 15, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  769.             if (winpread () != W_ESCPRESS)
  770.                strcpy (config.local_editor, strbtrim (string));
  771.             hidecur ();
  772.             break;
  773.       }
  774.  
  775.       hidecur ();
  776.  
  777.    } while (i != -1);
  778.  
  779.    wclose ();
  780. }
  781.  
  782. void mailer_filerequest ()
  783. {
  784.    int wh, i = 1;
  785.    char string[128];
  786.  
  787.    wh = wopen (6, 8, 20, 76, 3, LCYAN|_BLACK, CYAN|_BLACK);
  788.    wactiv (wh);
  789.    wshadow (DGREY|_BLACK);
  790.    wtitle (" File request ", TRIGHT, YELLOW|_BLUE);
  791.  
  792.    do {
  793.       stop_update ();
  794.       wclear ();
  795.  
  796.       wmenubegc ();
  797.       wmenuitem ( 1,  1, " Request list          ", 0,  1, 0, NULL, 0, 0);
  798.       wmenuitem ( 2,  1, " Request list (Secure) ", 0,  2, 0, NULL, 0, 0);
  799.       wmenuitem ( 3,  1, " Request list (Know)   ", 0,  3, 0, NULL, 0, 0);
  800.       wmenuitem ( 4,  1, " About                 ", 0,  4, 0, NULL, 0, 0);
  801.       wmenuitem ( 5,  1, " File list             ", 0,  5, 0, NULL, 0, 0);
  802.       wmenuitem ( 6,  1, " Max size              ", 0,  6, 0, NULL, 0, 0);
  803.       wmenuitem ( 7,  1, " Max size (Secure)     ", 0,  7, 0, NULL, 0, 0);
  804.       wmenuitem ( 8,  1, " Max size (Know)       ", 0,  8, 0, NULL, 0, 0);
  805.       wmenuitem ( 9,  1, " Max match             ", 0,  9, 0, NULL, 0, 0);
  806.       wmenuitem (10,  1, " Max match (Secure)    ", 0, 10, 0, NULL, 0, 0);
  807.       wmenuitem (11,  1, " Max match (Know)      ", 0, 11, 0, NULL, 0, 0);
  808.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  809.  
  810.       wprints (1, 25, CYAN|_BLACK, config.norm_okfile);
  811.       wprints (2, 25, CYAN|_BLACK, config.prot_okfile);
  812.       wprints (3, 25, CYAN|_BLACK, config.know_okfile);
  813.       wprints (4, 25, CYAN|_BLACK, config.about);
  814.       wprints (5, 25, CYAN|_BLACK, config.files);
  815.       sprintf (string, "%d", config.norm_max_kbytes);
  816.       wprints (6, 25, CYAN|_BLACK, string);
  817.       sprintf (string, "%d", config.prot_max_kbytes);
  818.       wprints (7, 25, CYAN|_BLACK, string);
  819.       sprintf (string, "%d", config.know_max_kbytes);
  820.       wprints (8, 25, CYAN|_BLACK, string);
  821.       sprintf (string, "%d", config.norm_max_requests);
  822.       wprints (9, 25, CYAN|_BLACK, string);
  823.       sprintf (string, "%d", config.prot_max_requests);
  824.       wprints (10, 25, CYAN|_BLACK, string);
  825.       sprintf (string, "%d", config.know_max_requests);
  826.       wprints (11, 25, CYAN|_BLACK, string);
  827.  
  828.       start_update ();
  829.       i = wmenuget ();
  830.  
  831.       switch (i) {
  832.          case 1:
  833.             strcpy (string, config.norm_okfile);
  834.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  835.             winpdef (1, 25, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  836.             if (winpread () != W_ESCPRESS)
  837.                strcpy (config.norm_okfile, strbtrim (string));
  838.             hidecur ();
  839.             break;
  840.  
  841.          case 2:
  842.             strcpy (string, config.prot_okfile);
  843.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  844.             winpdef (2, 25, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  845.             if (winpread () != W_ESCPRESS)
  846.                strcpy (config.prot_okfile, strbtrim (string));
  847.             hidecur ();
  848.             break;
  849.  
  850.          case 3:
  851.             strcpy (string, config.know_okfile);
  852.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  853.             winpdef (3, 25, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  854.             if (winpread () != W_ESCPRESS)
  855.                strcpy (config.know_okfile, strbtrim (string));
  856.             hidecur ();
  857.             break;
  858.  
  859.          case 4:
  860.             strcpy (string, config.about);
  861.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  862.             winpdef (4, 25, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  863.             if (winpread () != W_ESCPRESS)
  864.                strcpy (config.about, strbtrim (string));
  865.             hidecur ();
  866.             break;
  867.  
  868.          case 5:
  869.             strcpy (string, config.files);
  870.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  871.             winpdef (5, 25, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  872.             if (winpread () != W_ESCPRESS)
  873.                strcpy (config.files, strbtrim (string));
  874.             hidecur ();
  875.             break;
  876.  
  877.          case 6:
  878.             sprintf (string, "%d", config.norm_max_kbytes);
  879.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  880.             winpdef (6, 25, string, "?????", 0, 2, NULL, 0);
  881.             if (winpread () != W_ESCPRESS)
  882.                config.norm_max_kbytes = atoi (string);
  883.             hidecur ();
  884.             break;
  885.  
  886.          case 7:
  887.             sprintf (string, "%d", config.prot_max_kbytes);
  888.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  889.             winpdef (7, 25, string, "?????", 0, 2, NULL, 0);
  890.             if (winpread () != W_ESCPRESS)
  891.                config.prot_max_kbytes = atoi (string);
  892.             hidecur ();
  893.             break;
  894.  
  895.          case 8:
  896.             sprintf (string, "%d", config.know_max_kbytes);
  897.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  898.             winpdef (8, 25, string, "?????", 0, 2, NULL, 0);
  899.             if (winpread () != W_ESCPRESS)
  900.                config.know_max_kbytes = atoi (string);
  901.             hidecur ();
  902.             break;
  903.  
  904.          case 9:
  905.             sprintf (string, "%d", config.norm_max_requests);
  906.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  907.             winpdef (9, 25, string, "?????", 0, 2, NULL, 0);
  908.             if (winpread () != W_ESCPRESS)
  909.                config.norm_max_requests = atoi (string);
  910.             hidecur ();
  911.             break;
  912.  
  913.          case 10:
  914.             sprintf (string, "%d", config.prot_max_requests);
  915.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  916.             winpdef (10, 25, string, "?????", 0, 2, NULL, 0);
  917.             if (winpread () != W_ESCPRESS)
  918.                config.prot_max_requests = atoi (string);
  919.             hidecur ();
  920.             break;
  921.  
  922.          case 11:
  923.             sprintf (string, "%d", config.know_max_requests);
  924.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  925.             winpdef (11, 25, string, "?????", 0, 2, NULL, 0);
  926.             if (winpread () != W_ESCPRESS)
  927.                config.know_max_requests = atoi (string);
  928.             hidecur ();
  929.             break;
  930.       }
  931.  
  932.       hidecur ();
  933.  
  934.    } while (i != -1);
  935.  
  936.    wclose ();
  937. }
  938.  
  939. void qwk_setup ()
  940. {
  941.    int wh, i = 1;
  942.    char string[128];
  943.  
  944.    wh = wopen (7, 13, 13, 72, 3, LCYAN|_BLACK, CYAN|_BLACK);
  945.    wactiv (wh);
  946.    wshadow (DGREY|_BLACK);
  947.    wtitle (" QWK setup ", TRIGHT, YELLOW|_BLUE);
  948.  
  949.    do {
  950.       stop_update ();
  951.       wclear ();
  952.  
  953.       wmenubegc ();
  954.       wmenuitem ( 1,  1, " Work dir      ", 0,  1, 0, NULL, 0, 0);
  955.       wmenuitem ( 2,  1, " Packet name   ", 0,  2, 0, NULL, 0, 0);
  956.       wmenuitem ( 3,  1, " Max. messages ", 0,  3, 0, NULL, 0, 0);
  957.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  958.  
  959.       wprints (1, 17, CYAN|_BLACK, config.QWKDir);
  960.       wprints (2, 17, CYAN|_BLACK, config.BBSid);
  961.       sprintf (string, "%u", config.qwk_maxmsgs);
  962.       wprints (3, 17, CYAN|_BLACK, string);
  963.  
  964.       start_update ();
  965.       i = wmenuget ();
  966.  
  967.       switch (i) {
  968.          case 1:
  969.             strcpy (string, config.QWKDir);
  970.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  971.             winpdef (1, 17, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  972.             if (winpread () != W_ESCPRESS) {
  973.                strcpy (config.QWKDir, strbtrim (string));
  974.                if (config.QWKDir[0] && config.QWKDir[strlen (config.QWKDir) - 1] != '\\')
  975.                   strcat (config.QWKDir, "\\");
  976.                create_path (config.QWKDir);
  977.             }
  978.             hidecur ();
  979.             break;
  980.  
  981.          case 2:
  982.             strcpy (string, config.BBSid);
  983.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  984.             winpdef (2, 17, string, "????????", 0, 2, NULL, 0);
  985.             if (winpread () != W_ESCPRESS)
  986.                strcpy (config.BBSid, strbtrim (string));
  987.             hidecur ();
  988.             break;
  989.  
  990.          case 3:
  991.             sprintf (string, "%u", config.qwk_maxmsgs);
  992.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  993.             winpdef (3, 17, string, "?????", 0, 2, NULL, 0);
  994.             if (winpread () != W_ESCPRESS)
  995.                config.qwk_maxmsgs = atoi (string);
  996.             hidecur ();
  997.             break;
  998.       }
  999.  
  1000.       hidecur ();
  1001.  
  1002.    } while (i != -1);
  1003.  
  1004.    wclose ();
  1005. }
  1006.  
  1007. void areafix_linehelp (void)
  1008. {
  1009.    char *str = "";
  1010.    struct _menu_t *mt;
  1011.  
  1012.    mt = wmenumcurr ();
  1013.    if (mt == NULL)
  1014.       return;
  1015.  
  1016.    switch (mt->citem->tagid) {
  1017.       case 1:
  1018.          str = "Activate or deactivate the internal areafix processor.";
  1019.          break;
  1020.       case 2:
  1021.          str = "File to send in response to a %HELP request.";
  1022.          break;
  1023.       case 3:
  1024.          str = "Net/Nodes that are allowed to create new echomail areas.";
  1025.          break;
  1026.       case 4:
  1027.          str = "Net/Nodes that will be linked automatically to the new areas.";
  1028.          break;
  1029.       case 5:
  1030.          str = "Net/Nodes that receives a copy of the areafix response message.";
  1031.          break;
  1032.       case 6:
  1033.          str = "AREAS.BBS-type file name to use.";
  1034.          break;
  1035.       case 7:
  1036.          str = "Use the AREAS.BBS file if found.";
  1037.          break;
  1038.       case 8:
  1039.          str = "Update the AREAS.BBS file after any change made by Areafix.";
  1040.          break;
  1041.       case 9:
  1042.          str = "Allow the users to rescan any new linked areas.";
  1043.          break;
  1044.       case 10:
  1045.          str = "Level to allow the users to change an echomail tag name.";
  1046.          break;
  1047.       case 11:
  1048.          str = "Level to allow the users to make Areafix's requests as another node.";
  1049.          break;
  1050.       case 15:
  1051.          str = "Names to check for the Areafix processor, separate with spaces.";
  1052.          break;
  1053.    }
  1054.  
  1055.    clear_window ();
  1056.    prints (24, 1, LGREY|_BLACK, str);
  1057. }
  1058.  
  1059. void mailer_areafix ()
  1060. {
  1061.    int wh, i = 1;
  1062.    char string[128];
  1063.  
  1064.    wh = wopen (3, 3, 21, 76, 3, LCYAN|_BLACK, CYAN|_BLACK);
  1065.    wactiv (wh);
  1066.    wshadow (DGREY|_BLACK);
  1067.    wtitle (" Areafix ", TRIGHT, YELLOW|_BLUE);
  1068.  
  1069.    do {
  1070.       stop_update ();
  1071.       wclear ();
  1072.  
  1073.       wmenubegc ();
  1074.       wmenuitem ( 1,  1, " Areafix active    ", 0,  1, 0, NULL, 0, 0);
  1075.       wmenuiba (areafix_linehelp, clear_window);
  1076.       wmenuitem ( 2,  1, " AREAS.BBS         ", 0,  6, 0, NULL, 0, 0);
  1077.       wmenuiba (areafix_linehelp, clear_window);
  1078.       wmenuitem ( 3,  1, " Help file name    ", 0,  2, 0, NULL, 0, 0);
  1079.       wmenuiba (areafix_linehelp, clear_window);
  1080.       wmenuitem ( 4,  1, " Creating nodes    ", 0,  3, 0, NULL, 0, 0);
  1081.       wmenuiba (areafix_linehelp, clear_window);
  1082.       wmenuitem ( 5,  1, " Auto link nodes   ", 0,  4, 0, NULL, 0, 0);
  1083.       wmenuiba (areafix_linehelp, clear_window);
  1084.       wmenuitem ( 6,  1, " Alert nodes       ", 0,  5, 0, NULL, 0, 0);
  1085.       wmenuiba (areafix_linehelp, clear_window);
  1086.       wmenuitem ( 7,  1, " Use AREAS.BBS     ", 0,  7, 0, NULL, 0, 0);
  1087.       wmenuiba (areafix_linehelp, clear_window);
  1088.       wmenuitem ( 8,  1, " Update AREAS.BBS  ", 0,  8, 0, NULL, 0, 0);
  1089.       wmenuiba (areafix_linehelp, clear_window);
  1090.       wmenuitem ( 9,  1, " Allow rescan      ", 0,  9, 0, NULL, 0, 0);
  1091.       wmenuiba (areafix_linehelp, clear_window);
  1092.       wmenuitem (10,  1, " Change TAG level  ", 0, 10, 0, NULL, 0, 0);
  1093.       wmenuiba (areafix_linehelp, clear_window);
  1094.       wmenuitem (11,  1, " Remote maint.     ", 0, 11, 0, NULL, 0, 0);
  1095.       wmenuiba (areafix_linehelp, clear_window);
  1096.       wmenuitem (12,  1, " Check zones       ", 0, 12, 0, NULL, 0, 0);
  1097.       wmenuiba (areafix_linehelp, clear_window);
  1098.       wmenuitem (13,  1, " New areas base    ", 0, 13, 0, NULL, 0, 0);
  1099.       wmenuiba (areafix_linehelp, clear_window);
  1100.       wmenuitem (14,  1, " └─ New areas path ", 0, 14, 0, NULL, 0, 0);
  1101.       wmenuiba (areafix_linehelp, clear_window);
  1102.       wmenuitem (15,  1, " Names to check    ", 0, 15, 0, NULL, 0, 0);
  1103.       wmenuiba (areafix_linehelp, clear_window);
  1104.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  1105.  
  1106.       wprints (1, 21, CYAN|_BLACK, config.areafix ? "Yes" : "No");
  1107.       wprints (2, 21, CYAN|_BLACK, config.areas_bbs);
  1108.       wprints (3, 21, CYAN|_BLACK, config.areafix_help);
  1109.       wprints (4, 21, CYAN|_BLACK, config.newareas_create);
  1110.       wprints (5, 21, CYAN|_BLACK, config.newareas_link);
  1111.       wprints (6, 21, CYAN|_BLACK, config.alert_nodes);
  1112.       wprints (7, 21, CYAN|_BLACK, config.use_areasbbs ? "Yes" : "No");
  1113.       wprints (8, 21, CYAN|_BLACK, config.write_areasbbs ? "Yes" : "No");
  1114.       wprints (9, 21, CYAN|_BLACK, config.allow_rescan ? "Yes" : "No");
  1115.       sprintf (string, "%d", config.afx_change_tag);
  1116.       wprints (10, 21, CYAN|_BLACK, string);
  1117.       sprintf (string, "%d", config.afx_remote_maint);
  1118.       wprints (11, 21, CYAN|_BLACK, string);
  1119.       wprints (12, 21, CYAN|_BLACK, config.check_echo_zone ? "Yes" : "No");
  1120.  
  1121.       if (config.newareas_base == 0)
  1122.          wprints (13, 21, CYAN|_BLACK, "Fido *.MSG");
  1123.       else if (config.newareas_base == 1)
  1124.          wprints (13, 21, CYAN|_BLACK, "QuickBBS");
  1125.       else if (config.newareas_base == 2)
  1126.          wprints (13, 21, CYAN|_BLACK, "GoldBase");
  1127.       else if (config.newareas_base == 3)
  1128.          wprints (13, 21, CYAN|_BLACK, "Squish");
  1129.       else if (config.newareas_base == 4)
  1130.          wprints (13, 21, CYAN|_BLACK, "Pip-base");
  1131.       else if (config.newareas_base == 5)
  1132.          wprints (13, 21, CYAN|_BLACK, "Passthrough");
  1133.       wprints (14, 21, CYAN|_BLACK, config.newareas_path);
  1134.       wprints (15, 21, CYAN|_BLACK, config.areafix_watch);
  1135.  
  1136.       start_update ();
  1137.       i = wmenuget ();
  1138.  
  1139.       switch (i) {
  1140.          case 1:
  1141.             config.areafix ^= 1;
  1142.             break;
  1143.  
  1144.          case 7:
  1145.             config.use_areasbbs ^= 1;
  1146.             break;
  1147.  
  1148.          case 8:
  1149.             config.write_areasbbs ^= 1;
  1150.             break;
  1151.  
  1152.          case 9:
  1153.             config.allow_rescan ^= 1;
  1154.             break;
  1155.  
  1156.          case 12:
  1157.             config.check_echo_zone ^= 1;
  1158.             break;
  1159.  
  1160.          case 6:
  1161.             strcpy (string, config.areas_bbs);
  1162.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1163.             winpdef (2, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1164.             if (winpread () != W_ESCPRESS)
  1165.                strcpy (config.areas_bbs, strbtrim (string));
  1166.             break;
  1167.  
  1168.          case 2:
  1169.             strcpy (string, config.areafix_help);
  1170.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1171.             winpdef (3, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1172.             if (winpread () != W_ESCPRESS)
  1173.                strcpy (config.areafix_help, strbtrim (string));
  1174.             break;
  1175.  
  1176.          case 3:
  1177.             strcpy (string, config.newareas_create);
  1178.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1179.             winpdef (4, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1180.             if (winpread () != W_ESCPRESS)
  1181.                strcpy (config.newareas_create, strbtrim (string));
  1182.             break;
  1183.  
  1184.          case 4:
  1185.             strcpy (string, config.newareas_link);
  1186.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1187.             winpdef (5, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1188.             if (winpread () != W_ESCPRESS)
  1189.                strcpy (config.newareas_link, strbtrim (string));
  1190.             break;
  1191.  
  1192.          case 5:
  1193.             strcpy (string, config.alert_nodes);
  1194.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1195.             winpdef (6, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1196.             if (winpread () != W_ESCPRESS)
  1197.                strcpy (config.alert_nodes, strbtrim (string));
  1198.             break;
  1199.  
  1200.          case 10:
  1201.             sprintf (string, "%d", config.afx_change_tag);
  1202.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1203.             winpdef (10, 21, string, "???", 0, 2, NULL, 0);
  1204.             if (winpread () != W_ESCPRESS)
  1205.                config.afx_change_tag = atoi (string) % 256;
  1206.             break;
  1207.  
  1208.          case 11:
  1209.             sprintf (string, "%d", config.afx_remote_maint);
  1210.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1211.             winpdef (11, 21, string, "???", 0, 2, NULL, 0);
  1212.             if (winpread () != W_ESCPRESS)
  1213.                config.afx_remote_maint = atoi (string) % 256;
  1214.             break;
  1215.  
  1216.          case 13:
  1217.             if (config.newareas_base++ == 5)
  1218.                config.newareas_base = 0;
  1219.             break;
  1220.  
  1221.          case 14:
  1222.             strcpy (string, config.newareas_path);
  1223.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1224.             winpdef (14, 21, string, "??????????????????????????????????????", 0, 2, NULL, 0);
  1225.             if (winpread () != W_ESCPRESS) {
  1226.                strcpy (config.newareas_path, strbtrim (string));
  1227.                if (config.newareas_path[0] && config.newareas_path[strlen (config.newareas_path) - 1] != '\\')
  1228.                   strcat (config.newareas_path, "\\");
  1229.                create_path (config.newareas_path);
  1230.             }
  1231.             break;
  1232.  
  1233.          case 15:
  1234.             strcpy (string, config.areafix_watch);
  1235.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1236.             winpdef (15, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1237.             if (winpread () != W_ESCPRESS)
  1238.                strcpy (config.areafix_watch, strbtrim (string));
  1239.             break;
  1240.       }
  1241.  
  1242.       hidecur ();
  1243.  
  1244.    } while (i != -1);
  1245.  
  1246.    wclose ();
  1247. }
  1248.  
  1249. void mailer_tic ()
  1250. {
  1251.    int wh, i = 1;
  1252.    char string[128];
  1253.  
  1254.    wh = wopen (6, 3, 18, 76, 3, LCYAN|_BLACK, CYAN|_BLACK);
  1255.    wactiv (wh);
  1256.    wshadow (DGREY|_BLACK);
  1257.    wtitle (" TIC ", TRIGHT, YELLOW|_BLUE);
  1258.  
  1259.    do {
  1260.       stop_update ();
  1261.       wclear ();
  1262.  
  1263.       wmenubegc ();
  1264.       wmenuitem ( 1,  1, " TIC active        ", 0,  1, 0, NULL, 0, 0);
  1265.       wmenuitem ( 2,  1, " Help file name    ", 0,  2, 0, NULL, 0, 0);
  1266.       wmenuitem ( 3,  1, " Creating nodes    ", 0,  3, 0, NULL, 0, 0);
  1267.       wmenuitem ( 4,  1, " Auto link nodes   ", 0,  4, 0, NULL, 0, 0);
  1268.       wmenuitem ( 5,  1, " Alert nodes       ", 0,  5, 0, NULL, 0, 0);
  1269.       wmenuitem ( 6,  1, " Change TAG level  ", 0,  6, 0, NULL, 0, 0);
  1270.       wmenuitem ( 7,  1, " Remote maint.     ", 0,  7, 0, NULL, 0, 0);
  1271.       wmenuitem ( 8,  1, " Check zones       ", 0,  8, 0, NULL, 0, 0);
  1272.       wmenuitem ( 9,  1, " Names to check    ", 0,  9, 0, NULL, 0, 0);
  1273.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  1274.  
  1275.       wprints (1, 21, CYAN|_BLACK, config.tic_active ? "Yes" : "No");
  1276.       wprints (2, 21, CYAN|_BLACK, config.tic_help);
  1277.       wprints (3, 21, CYAN|_BLACK, config.tic_newareas_create);
  1278.       wprints (4, 21, CYAN|_BLACK, config.tic_newareas_link);
  1279.       wprints (5, 21, CYAN|_BLACK, config.tic_alert_nodes);
  1280.       sprintf (string, "%d", config.tic_change_tag);
  1281.       wprints (6, 21, CYAN|_BLACK, string);
  1282.       sprintf (string, "%d", config.tic_remote_maint);
  1283.       wprints (7, 21, CYAN|_BLACK, string);
  1284.       wprints (8, 21, CYAN|_BLACK, config.tic_check_zone ? "Yes" : "No");
  1285.       wprints (9, 21, CYAN|_BLACK, config.tic_watch);
  1286.  
  1287.       start_update ();
  1288.       i = wmenuget ();
  1289.  
  1290.       switch (i) {
  1291.          case 1:
  1292.             config.tic_active ^= 1;
  1293.             break;
  1294.  
  1295.          case 2:
  1296.             strcpy (string, config.tic_help);
  1297.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1298.             winpdef (2, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1299.             if (winpread () != W_ESCPRESS)
  1300.                strcpy (config.tic_help, strbtrim (string));
  1301.             break;
  1302.  
  1303.          case 3:
  1304.             strcpy (string, config.tic_newareas_create);
  1305.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1306.             winpdef (3, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1307.             if (winpread () != W_ESCPRESS)
  1308.                strcpy (config.tic_newareas_create, strbtrim (string));
  1309.             break;
  1310.  
  1311.          case 4:
  1312.             strcpy (string, config.tic_newareas_link);
  1313.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1314.             winpdef (4, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1315.             if (winpread () != W_ESCPRESS)
  1316.                strcpy (config.tic_newareas_link, strbtrim (string));
  1317.             break;
  1318.  
  1319.          case 5:
  1320.             strcpy (string, config.tic_alert_nodes);
  1321.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1322.             winpdef (5, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1323.             if (winpread () != W_ESCPRESS)
  1324.                strcpy (config.tic_alert_nodes, strbtrim (string));
  1325.             break;
  1326.  
  1327.          case 6:
  1328.             sprintf (string, "%d", config.tic_change_tag);
  1329.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1330.             winpdef (6, 21, string, "???", 0, 2, NULL, 0);
  1331.             if (winpread () != W_ESCPRESS)
  1332.                config.tic_change_tag = atoi (string) % 256;
  1333.             break;
  1334.  
  1335.          case 7:
  1336.             sprintf (string, "%d", config.tic_remote_maint);
  1337.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1338.             winpdef (7, 21, string, "???", 0, 2, NULL, 0);
  1339.             if (winpread () != W_ESCPRESS)
  1340.                config.tic_remote_maint = atoi (string) % 256;
  1341.             break;
  1342.  
  1343.          case 8:
  1344.             config.tic_check_zone ^= 1;
  1345.             break;
  1346.  
  1347.          case 9:
  1348.             strcpy (string, config.tic_watch);
  1349.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1350.             winpdef (9, 21, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1351.             if (winpread () != W_ESCPRESS)
  1352.                strcpy (config.tic_watch, strbtrim (string));
  1353.             break;
  1354.       }
  1355.  
  1356.       hidecur ();
  1357.  
  1358.    } while (i != -1);
  1359.  
  1360.    wclose ();
  1361. }
  1362.  
  1363. void mailer_ext_processing ()
  1364. {
  1365.    int wh, i = 1;
  1366.    char string[128];
  1367.  
  1368.    wh = wopen (8, 5, 19, 74, 3, LCYAN|_BLACK, CYAN|_BLACK);
  1369.    wactiv (wh);
  1370.    wshadow (DGREY|_BLACK);
  1371.    wtitle (" External processing ", TRIGHT, YELLOW|_BLUE);
  1372.  
  1373.    do {
  1374.       stop_update ();
  1375.       wclear ();
  1376.  
  1377.       wmenubegc ();
  1378.       wmenuitem ( 1,  1, " Before import ", 0,  1, 0, NULL, 0, 0);
  1379.       wmenuitem ( 2,  1, " After import  ", 0,  2, 0, NULL, 0, 0);
  1380.       wmenuitem ( 3,  1, " Before export ", 0,  3, 0, NULL, 0, 0);
  1381.       wmenuitem ( 4,  1, " After export  ", 0,  4, 0, NULL, 0, 0);
  1382.       wmenuitem ( 5,  1, " Before pack   ", 0,  7, 0, NULL, 0, 0);
  1383.       wmenuitem ( 6,  1, " After pack    ", 0,  8, 0, NULL, 0, 0);
  1384.       wmenuitem ( 7,  1, " Automaint     ", 0,  5, 0, NULL, 0, 0);
  1385.       wmenuitem ( 8,  1, " BBS batch     ", 0,  6, 0, NULL, 0, 0);
  1386.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  1387.  
  1388.       wprints (1, 17, CYAN|_BLACK, config.pre_import);
  1389.       wprints (2, 17, CYAN|_BLACK, config.after_import);
  1390.       wprints (3, 17, CYAN|_BLACK, config.pre_export);
  1391.       wprints (4, 17, CYAN|_BLACK, config.after_export);
  1392.       wprints (5, 17, CYAN|_BLACK, config.pre_pack);
  1393.       wprints (6, 17, CYAN|_BLACK, config.after_pack);
  1394.       wprints (7, 17, CYAN|_BLACK, config.automaint);
  1395.       wprints (8, 17, CYAN|_BLACK, config.bbs_batch);
  1396.  
  1397.       start_update ();
  1398.       i = wmenuget ();
  1399.  
  1400.       switch (i) {
  1401.          case 1:
  1402.             strcpy (string, config.pre_import);
  1403.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1404.             winpdef (1, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1405.             if (winpread () != W_ESCPRESS)
  1406.                strcpy (config.pre_import, strbtrim (string));
  1407.             break;
  1408.  
  1409.          case 2:
  1410.             strcpy (string, config.after_import);
  1411.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1412.             winpdef (2, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1413.             if (winpread () != W_ESCPRESS)
  1414.                strcpy (config.after_import, strbtrim (string));
  1415.             break;
  1416.  
  1417.          case 3:
  1418.             strcpy (string, config.pre_export);
  1419.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1420.             winpdef (3, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1421.             if (winpread () != W_ESCPRESS)
  1422.                strcpy (config.pre_export, strbtrim (string));
  1423.             break;
  1424.  
  1425.          case 4:
  1426.             strcpy (string, config.after_export);
  1427.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1428.             winpdef (4, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1429.             if (winpread () != W_ESCPRESS)
  1430.                strcpy (config.after_export, strbtrim (string));
  1431.             break;
  1432.  
  1433.          case 5:
  1434.             strcpy (string, config.automaint);
  1435.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1436.             winpdef (7, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1437.             if (winpread () != W_ESCPRESS)
  1438.                strcpy (config.automaint, strbtrim (string));
  1439.             break;
  1440.  
  1441.          case 6:
  1442.             strcpy (string, config.bbs_batch);
  1443.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1444.             winpdef (8, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1445.             if (winpread () != W_ESCPRESS)
  1446.                strcpy (config.bbs_batch, strbtrim (string));
  1447.             break;
  1448.  
  1449.          case 7:
  1450.             strcpy (string, config.pre_pack);
  1451.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1452.             winpdef (5, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1453.             if (winpread () != W_ESCPRESS)
  1454.                strcpy (config.pre_pack, strbtrim (string));
  1455.             break;
  1456.  
  1457.          case 8:
  1458.             strcpy (string, config.after_pack);
  1459.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1460.             winpdef (6, 17, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  1461.             if (winpread () != W_ESCPRESS)
  1462.                strcpy (config.after_pack, strbtrim (string));
  1463.             break;
  1464.       }
  1465.       
  1466.       hidecur ();
  1467.  
  1468.    } while (i != -1);
  1469.  
  1470.    wclose ();
  1471. }
  1472.  
  1473. void bbs_language ()
  1474. {
  1475.    int wh, i;
  1476.    char string[80];
  1477.  
  1478.    wh = wopen (2, 1, 21, 77, 1, LCYAN|_BLACK, CYAN|_BLACK);
  1479.    wactiv (wh);
  1480.     wshadow (DGREY|_BLACK);
  1481.    wtitle (" Language ", TRIGHT, YELLOW|_BLUE);
  1482.    i = 80;
  1483.  
  1484.    do {
  1485.       stop_update ();
  1486.       wclear ();
  1487.  
  1488.       wprints (1, 12, LGREY|BLACK, "┌Filename┐┌──────Description──────┐┌─────Textfiles path──────┐");
  1489.  
  1490.       wmenubegc ();
  1491.       wmenuitem ( 2, 1," Lang. 1  ", 'L', 80, 0, NULL, 0, 0);
  1492.       wmenuitem ( 3, 1," Lang. 2  ", 'L', 81, 0, NULL, 0, 0);
  1493.       wmenuitem ( 4, 1," Lang. 3  ", 'L', 82, 0, NULL, 0, 0);
  1494.       wmenuitem ( 5, 1," Lang. 4  ", 'L', 83, 0, NULL, 0, 0);
  1495.       wmenuitem ( 6, 1," Lang. 5  ", 'L', 84, 0, NULL, 0, 0);
  1496.       wmenuitem ( 7, 1," Lang. 6  ", 'L', 85, 0, NULL, 0, 0);
  1497.       wmenuitem ( 8, 1," Lang. 7  ", 'L', 86, 0, NULL, 0, 0);
  1498.       wmenuitem ( 9, 1," Lang. 8  ", 'L', 87, 0, NULL, 0, 0);
  1499.       wmenuitem (10, 1," Lang. 9  ", 'L', 88, 0, NULL, 0, 0);
  1500.       wmenuitem (11, 1," Lang. 10 ", 'L', 89, 0, NULL, 0, 0);
  1501.       wmenuitem (12, 1," Lang. 11 ", 'L', 90, 0, NULL, 0, 0);
  1502.       wmenuitem (13, 1," Lang. 12 ", 'L', 91, 0, NULL, 0, 0);
  1503.         wmenuitem (14, 1," Lang. 13 ", 'L', 92, 0, NULL, 0, 0);
  1504.         wmenuitem (15, 1," Lang. 14 ", 'L', 93, 0, NULL, 0, 0);
  1505.         wmenuitem (16, 1," Lang. 15 ", 'L', 94, 0, NULL, 0, 0);
  1506.         wmenuend (i, M_VERT, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  1507.  
  1508.         for (i = 0; i < 15; i++) {
  1509.             wprints (i + 2, 13, CYAN|_BLACK, config.language[i].basename);
  1510.             wprints (i + 2, 23, CYAN|_BLACK, config.language[i].descr);
  1511.             wprints (i + 2, 48, CYAN|_BLACK, config.language[i].txt_path);
  1512.         }
  1513.  
  1514.         start_update ();
  1515.       i = wmenuget ();
  1516.       if (i != -1) {
  1517.          i -= 80;
  1518.          strcpy (string, config.language[i].basename);
  1519.          winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1520.          winpdef (i + 2, 13, string, "????????", 0, 2, NULL, 0);
  1521.          if (winpread () != W_ESCPRESS) {
  1522.             strcpy (config.language[i].basename, strbtrim (string));
  1523.             wprints (i + 2, 13, CYAN|_BLACK, "        ");
  1524.             wprints (i + 2, 13, CYAN|_BLACK, config.language[i].basename);
  1525.  
  1526.             strcpy (string, config.language[i].descr);
  1527. //            winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1528. //            winpdef (i + 2, 23, string, "???????????????????????", 0, 2, NULL, 0);
  1529. //            if (winpread () != W_ESCPRESS) {
  1530.             if (winputs (i + 2, 23, string, "???????????????????????", 1, '▒', BLUE|_GREEN, BLUE|_GREEN) != W_ESCPRESS) {
  1531.                strcpy (config.language[i].descr, string);
  1532.                wprints (i + 2, 23, CYAN|_BLACK, "                       ");
  1533.                wprints (i + 2, 23, CYAN|_BLACK, config.language[i].descr);
  1534.  
  1535.                strcpy (string, config.language[i].txt_path);
  1536.                winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  1537.                     winpdef (i + 2, 48, string, "?????????????????????????", 0, 2, NULL, 0);
  1538.                if (winpread () != W_ESCPRESS) {
  1539.                   strcpy (config.language[i].txt_path, strbtrim (string));
  1540.                   strcpy (config.language[i].txt_path, strbtrim (string));
  1541.                   if (config.language[i].txt_path[0] && config.language[i].txt_path[strlen (config.language[i].txt_path) - 1] != '\\')
  1542.                      strcat (config.language[i].txt_path, "\\");
  1543.                   create_path (config.language[i].txt_path);
  1544.                   wprints (i + 2, 48, CYAN|_BLACK, "            ");
  1545.                   wprints (i + 2, 48, CYAN|_BLACK, config.language[i].txt_path);
  1546.                }
  1547.             }
  1548.             }
  1549.  
  1550.          i += 80;
  1551.          hidecur ();
  1552.       }
  1553.  
  1554.    } while (i != -1);
  1555.  
  1556.    wclose ();
  1557. }
  1558.  
  1559. void bbs_files ()
  1560. {
  1561.    int fd, fdi, fdx, wh, wh1, i = 1, saved;
  1562.    char string[128], filename[80];
  1563.    long pos;
  1564.    struct _sys sys, bsys;
  1565.    struct _sys_idx sysidx;
  1566.  
  1567.    sprintf (string, "%sSYSFILE.DAT", config.sys_path);
  1568.    fd = sh_open (string, SH_DENYNONE, O_RDWR|O_CREAT|O_BINARY, S_IREAD|S_IWRITE);
  1569.    if (fd == -1)
  1570.       return;
  1571.     memset ((char *)&sys.file_name, 0, SIZEOF_FILEAREA);
  1572.    read (fd, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1573.  
  1574.    gotoxy_ (24, 1);
  1575.    clreol_ ();
  1576.    prints (24, 1, LGREY|_BLACK, "PgUp/PgDn-Next/Previous  E-Edit  A-Add New Area  C-Copy  L-List  D-Delete");
  1577.    prints (24, 1, YELLOW|_BLACK, "PgUp/PgDn");
  1578.    prints (24, 26, YELLOW|_BLACK, "E");
  1579.    prints (24, 34, YELLOW|_BLACK, "A");
  1580.    prints (24, 50, YELLOW|_BLACK, "C");
  1581.     prints (24, 58, YELLOW|_BLACK, "L");
  1582.     prints (24, 66, YELLOW|_BLACK, "D");
  1583.  
  1584.    wh = wopen (1, 2, 22, 76, 1, LCYAN|_BLACK, CYAN|_BLACK);
  1585.    wactiv (wh);
  1586.    wshadow (DGREY|_BLACK);
  1587.    wtitle (" File areas ", TRIGHT, YELLOW|_BLUE);
  1588.  
  1589.    do {
  1590.       stop_update ();
  1591.       wclear ();
  1592.  
  1593.       wprints ( 1,  1, LGREY|_BLACK, " Number       ");
  1594.       wprints ( 1, 28, LGREY|_BLACK, " Short name ");
  1595.       wprints ( 2,  1, LGREY|_BLACK, " Name         ");
  1596.       wprints ( 3,  1, LGREY|_BLACK, " Download     ");
  1597.       wprints ( 4,  1, LGREY|_BLACK, " Upload       ");
  1598.       wprints ( 5,  1, LGREY|_BLACK, " File List    ");
  1599.       wprints ( 6,  1, LGREY|_BLACK, " Access priv. ");
  1600.       wprints ( 7,  1, LGREY|_BLACK, " A Flag       ");
  1601.       wprints ( 8,  1, LGREY|_BLACK, " B Flag       ");
  1602.       wprints ( 9,  1, LGREY|_BLACK, " C Flag       ");
  1603.       wprints (10,  1, LGREY|_BLACK, " D Flag       ");
  1604.       wprints ( 6, 28, LGREY|_BLACK, " Download ");
  1605.         wprints ( 7, 28, LGREY|_BLACK, " A Flag   ");
  1606.       wprints ( 8, 28, LGREY|_BLACK, " B Flag   ");
  1607.       wprints ( 9, 28, LGREY|_BLACK, " C Flag   ");
  1608.       wprints (10, 28, LGREY|_BLACK, " D Flag   ");
  1609.       wprints ( 6, 51, LGREY|_BLACK, " Upload ");
  1610.       wprints ( 7, 51, LGREY|_BLACK, " A Flag ");
  1611.         wprints ( 8, 51, LGREY|_BLACK, " B Flag ");
  1612.         wprints ( 9, 51, LGREY|_BLACK, " C Flag ");
  1613.       wprints (10, 51, LGREY|_BLACK, " D Flag ");
  1614.         wprints (11,  1, LGREY|_BLACK, " TIC Level    ");
  1615.       wprints (12,  1, LGREY|_BLACK, " A Flag       ");
  1616.         wprints (13,  1, LGREY|_BLACK, " B Flag       ");
  1617.         wprints (14,  1, LGREY|_BLACK, " C Flag       ");
  1618.         wprints (15,  1, LGREY|_BLACK, " D Flag       ");
  1619.         wprints (12, 28, LGREY|_BLACK, " Group    ");
  1620.         wprints (13, 28, LGREY|_BLACK, " Flags    ");
  1621.         wprints (14, 28, LGREY|_BLACK, " TIC Tag  ");
  1622.         wprints (16,  1, LGREY|_BLACK, " Forward to:");
  1623.         wprints (17,  1, LGREY|_BLACK, " 1 ");
  1624.         wprints (18,  1, LGREY|_BLACK, " 2 ");
  1625.         wprints (19,  1, LGREY|_BLACK, " 3 ");
  1626.  
  1627.         sprintf (string, "%d", sys.file_num);
  1628.         wprints (1, 16, CYAN|_BLACK, string);
  1629.  
  1630.         wprints (1, 41, CYAN|_BLACK, sys.short_name);
  1631.  
  1632.         sys.file_name[55] = '\0';
  1633.         wprints (2, 16, CYAN|_BLACK, sys.file_name);
  1634.  
  1635.         wprints (3, 16, CYAN|_BLACK, sys.filepath);
  1636.  
  1637.         wprints (4, 16, CYAN|_BLACK, sys.uppath);
  1638.  
  1639.         wprints (5, 16, CYAN|_BLACK, sys.filelist);
  1640.  
  1641.         wprints (6, 15, CYAN|_BLACK, get_priv_text (sys.file_priv));
  1642.         wprints (7, 16, CYAN|_BLACK, get_flagA_text ((sys.file_flags >> 24) & 0xFF));
  1643.         wprints (8, 16, CYAN|_BLACK, get_flagB_text ((sys.file_flags >> 16) & 0xFF));
  1644.         wprints (9, 16, CYAN|_BLACK, get_flagC_text ((sys.file_flags >> 8) & 0xFF));
  1645.         wprints (10, 16, CYAN|_BLACK, get_flagD_text (sys.file_flags & 0xFF));
  1646.  
  1647.         wprints (6, 38, CYAN|_BLACK, get_priv_text (sys.download_priv));
  1648.         wprints (7, 39, CYAN|_BLACK, get_flagA_text ((sys.download_flags >> 24) & 0xFF));
  1649.         wprints (8, 39, CYAN|_BLACK, get_flagB_text ((sys.download_flags >> 16) & 0xFF));
  1650.         wprints (9, 39, CYAN|_BLACK, get_flagC_text ((sys.download_flags >> 8) & 0xFF));
  1651.         wprints (10, 39, CYAN|_BLACK, get_flagD_text (sys.download_flags & 0xFF));
  1652.  
  1653.         wprints (6, 59, CYAN|_BLACK, get_priv_text (sys.upload_priv));
  1654.         wprints (7, 60, CYAN|_BLACK, get_flagA_text ((sys.upload_flags >> 24) & 0xFF));
  1655.         wprints (8, 60, CYAN|_BLACK, get_flagB_text ((sys.upload_flags >> 16) & 0xFF));
  1656.         wprints (9, 60, CYAN|_BLACK, get_flagC_text ((sys.upload_flags >> 8) & 0xFF));
  1657.         wprints (10, 60, CYAN|_BLACK, get_flagD_text (sys.upload_flags & 0xFF));
  1658.  
  1659.         wprints (14, 39, CYAN|_BLACK, sys.tic_tag);
  1660.  
  1661.         sprintf (string, "%d", sys.tic_level);
  1662.         wprints (11, 16, CYAN|_BLACK, string);
  1663.  
  1664.         wprints (12, 16, CYAN|_BLACK, get_flagA_text ((sys.tic_flags >> 24) & 0xFF));
  1665.         wprints (13, 16, CYAN|_BLACK, get_flagB_text ((sys.tic_flags >> 16) & 0xFF));
  1666.         wprints (14, 16, CYAN|_BLACK, get_flagC_text ((sys.tic_flags >> 8) & 0xFF));
  1667.         wprints (15, 16, CYAN|_BLACK, get_flagD_text (sys.tic_flags & 0xFF));
  1668.  
  1669.         sprintf (string, "%d", sys.file_sig);
  1670.         wprints (12, 39, CYAN|_BLACK, string);
  1671.  
  1672.         strcpy (string, "........");
  1673.         if (sys.freearea)
  1674.             string[0] = 'F';
  1675.         if (sys.file_restricted)
  1676.             string[1] = 'G';
  1677.         if (sys.no_global_search)
  1678.             string[2] = 'S';
  1679.         if (sys.no_filedate)
  1680.             string[3] = 'D';
  1681.         if (sys.norm_req)
  1682.             string[4] = 'N';
  1683.         if (sys.know_req)
  1684.             string[5] = 'K';
  1685.         if (sys.prot_req)
  1686.             string[6] = 'P';
  1687.         if (sys.cdrom)
  1688.             string[7] = 'C';
  1689.         wprints (13, 39, CYAN|_BLACK, string);
  1690.  
  1691.         wprints (17, 4, CYAN|_BLACK, sys.tic_forward1);
  1692.         wprints (18, 4, CYAN|_BLACK, sys.tic_forward2);
  1693.         wprints (19, 4, CYAN|_BLACK, sys.tic_forward3);
  1694.  
  1695.         start_update ();
  1696.  
  1697.         i = getxch ();
  1698.         if ( (i & 0xFF) != 0 )
  1699.             i &= 0xFF;
  1700.  
  1701.         switch (i) {
  1702.             // PgDn
  1703.             case 0x5100:
  1704.                 read (fd, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1705.                 break;
  1706.  
  1707.             // PgUp
  1708.             case 0x4900:
  1709.                 if (tell (fd) > SIZEOF_FILEAREA) {
  1710.                     lseek (fd, -2L * SIZEOF_FILEAREA, SEEK_CUR);
  1711.                     read (fd, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1712.                 }
  1713.                 break;
  1714.  
  1715.             // E Edit
  1716.             case 'E':
  1717.             case 'e':
  1718.                 saved = sys.file_num;
  1719.  
  1720.                 file_edit_single_area (&sys);
  1721.  
  1722.                 lseek (fd, -1L * SIZEOF_FILEAREA, SEEK_CUR);
  1723.                 write (fd, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1724.  
  1725.                 if (saved != sys.file_num) {
  1726.                     pos = tell (fd) - (long)SIZEOF_FILEAREA;
  1727.                     close (fd);
  1728.  
  1729.                     update_message ();
  1730.  
  1731.                     sprintf (string, "%sSYSFILE.IDX", config.sys_path);
  1732.                     while ((fdx = sh_open (string, SH_DENYRD, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1733.                         ;
  1734.                     sprintf (filename, "%sSYSFILE.BAK", config.sys_path);
  1735.                     while ((fdi = sh_open (filename, SH_DENYRW, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1736.                         ;
  1737.                     sprintf (string, "%sSYSFILE.DAT", config.sys_path);
  1738.                     while ((fd = sh_open (string, SH_DENYRD, O_RDWR|O_CREAT|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1739.                         ;
  1740.                saved = 0;
  1741.  
  1742.                while (read (fd, (char *)&bsys.file_name, SIZEOF_FILEAREA) == SIZEOF_FILEAREA) {
  1743.                   if (!saved && bsys.file_num > sys.file_num) {
  1744.                      pos = tell (fdi);
  1745.                      write (fdi, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1746.                      memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1747.                             sysidx.priv = sys.file_priv;
  1748.                      sysidx.flags = sys.file_flags;
  1749.                      sysidx.sig = sys.file_sig;
  1750.                      sysidx.area = sys.file_num;
  1751.                      strcpy (sysidx.key, sys.short_name);
  1752.                      write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1753.                      saved = 1;
  1754.                   }
  1755.                         if (bsys.file_num != sys.file_num) {
  1756.                      write (fdi, (char *)&bsys.file_name, SIZEOF_FILEAREA);
  1757.                      memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1758.                             sysidx.priv = bsys.file_priv;
  1759.                      sysidx.flags = bsys.file_flags;
  1760.                             sysidx.area = bsys.file_num;
  1761.                      sysidx.sig = sys.file_sig;
  1762.                      strcpy (sysidx.key, bsys.short_name);
  1763.                      write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1764.                   }
  1765.                }
  1766.  
  1767.                if (!saved) {
  1768.                   pos = tell (fdi);
  1769.                   write (fdi, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1770.                   memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1771.                   sysidx.priv = sys.file_priv;
  1772.                   sysidx.flags = sys.file_flags;
  1773.                         sysidx.area = sys.file_num;
  1774.                   sysidx.sig = sys.file_sig;
  1775.                   strcpy (sysidx.key, sys.short_name);
  1776.                   write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1777.                }
  1778.  
  1779.                lseek (fd, 0L, SEEK_SET);
  1780.                chsize (fd, 0L);
  1781.                     lseek (fdi, 0L, SEEK_SET);
  1782.  
  1783.                while (read (fdi, (char *)&bsys.file_name, SIZEOF_FILEAREA) == SIZEOF_FILEAREA)
  1784.                   write (fd, (char *)&bsys.file_name, SIZEOF_FILEAREA);
  1785.  
  1786.                close (fdx);
  1787.                close (fd);
  1788.                close (fdi);
  1789.  
  1790.                unlink (filename);
  1791.  
  1792.                     sprintf (string, "%sSYSFILE.DAT", config.sys_path);
  1793.                while ((fd = sh_open (string, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1794.                         ;
  1795.                lseek (fd, pos, SEEK_SET);
  1796.                read (fd, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1797.  
  1798.                wclose ();
  1799.             }
  1800.             else {
  1801.                pos = tell (fd) - (long)SIZEOF_FILEAREA;
  1802.                i = (int)(pos / (long)SIZEOF_FILEAREA);
  1803.  
  1804.                sprintf (string, "%sSYSFILE.IDX", config.sys_path);
  1805.                while ((fdx = sh_open (string, SH_DENYNONE, O_RDWR|O_CREAT|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1806.                   ;
  1807.                lseek (fdx, (long)i * sizeof (struct _sys_idx), SEEK_SET);
  1808.                memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1809.                sysidx.priv = sys.file_priv;
  1810.                sysidx.flags = sys.file_flags;
  1811.                sysidx.area = sys.file_num;
  1812.                sysidx.sig = sys.file_sig;
  1813.                strcpy (sysidx.key, sys.short_name);
  1814.                write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1815.                     close (fdx);
  1816.             }
  1817.  
  1818.             break;
  1819.  
  1820.          // A Add
  1821.          case 'A':
  1822.          case 'a':
  1823.                 memcpy ((char *)&bsys, (char *)&sys, sizeof (struct _sys));
  1824.             memset ((char *)&sys, 0, sizeof (struct _sys));
  1825.             sys.file_priv = sys.download_priv = sys.upload_priv = TWIT;
  1826.  
  1827.          // Copy
  1828.             case 'C':
  1829.          case 'c':
  1830.             if (i == 'C' || i == 'c')
  1831.                memcpy ((char *)&bsys, (char *)&sys, sizeof (struct _sys));
  1832.  
  1833.             sys.file_num = 0;
  1834.             file_edit_single_area (&sys);
  1835.  
  1836.             if (sys.file_num && strcmp (sys.file_name, "")) {
  1837.                pos = tell (fd) - (long)SIZEOF_FILEAREA;
  1838.                close (fd);
  1839.  
  1840.                update_message ();
  1841.  
  1842.                sprintf (string, "%sSYSFILE.IDX", config.sys_path);
  1843.                while ((fdx = sh_open (string, SH_DENYRD, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1844.                   ;
  1845.                sprintf (filename, "%sSYSFILE.BAK", config.sys_path);
  1846.                while ((fdi = sh_open (filename, SH_DENYRW, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1847.                   ;
  1848.                sprintf (string, "%sSYSFILE.DAT", config.sys_path);
  1849.                     while ((fd = sh_open (string, SH_DENYRD, O_RDWR|O_CREAT|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1850.                   ;
  1851.                saved = 0;
  1852.  
  1853.                while (read (fd, (char *)&bsys.file_name, SIZEOF_FILEAREA) == SIZEOF_FILEAREA) {
  1854.                   if (!saved && bsys.file_num > sys.file_num) {
  1855.                      pos = tell (fdi);
  1856.                      write (fdi, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1857.                             memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1858.                      sysidx.priv = sys.file_priv;
  1859.                      sysidx.flags = sys.file_flags;
  1860.                             sysidx.area = sys.file_num;
  1861.                      sysidx.sig = sys.file_sig;
  1862.                      strcpy (sysidx.key, sys.short_name);
  1863.                      write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1864.                      saved = 1;
  1865.                   }
  1866.                   if (bsys.file_num != sys.file_num) {
  1867.                      write (fdi, (char *)&bsys.file_name, SIZEOF_FILEAREA);
  1868.                      memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1869.                      sysidx.priv = bsys.file_priv;
  1870.                      sysidx.flags = bsys.file_flags;
  1871.                      sysidx.area = bsys.file_num;
  1872.                      sysidx.sig = bsys.file_sig;
  1873.                      strcpy (sysidx.key, bsys.short_name);
  1874.                      write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1875.                   }
  1876.                }
  1877.  
  1878.                if (!saved) {
  1879.                   pos = tell (fdi);
  1880.                   write (fdi, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1881.                   memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1882.                   sysidx.priv = sys.file_priv;
  1883.                         sysidx.flags = sys.file_flags;
  1884.                   sysidx.area = sys.file_num;
  1885.                   sysidx.sig = sys.file_sig;
  1886.                   strcpy (sysidx.key, sys.short_name);
  1887.                   write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1888.                }
  1889.  
  1890.                lseek (fd, 0L, SEEK_SET);
  1891.                     chsize (fd, 0L);
  1892.                lseek (fdi, 0L, SEEK_SET);
  1893.  
  1894.                     while (read (fdi, (char *)&bsys.file_name, SIZEOF_FILEAREA) == SIZEOF_FILEAREA)
  1895.                   write (fd, (char *)&bsys.file_name, SIZEOF_FILEAREA);
  1896.  
  1897.                close (fdx);
  1898.                close (fd);
  1899.                close (fdi);
  1900.  
  1901.                unlink (filename);
  1902.  
  1903.                sprintf (string, "%sSYSFILE.DAT", config.sys_path);
  1904.                while ((fd = sh_open (string, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1905.                   ;
  1906.                lseek (fd, pos, SEEK_SET);
  1907.                read (fd, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1908.  
  1909.                wclose ();
  1910.             }
  1911.             else
  1912.                memcpy ((char *)&sys, (char *)&bsys, sizeof (struct _sys));
  1913.             break;
  1914.  
  1915.          // D Delete
  1916.          case 'D':
  1917.             case 'd':
  1918.             wh1 = wopen (10, 25, 14, 54, 0, BLACK|_LGREY, BLACK|_LGREY);
  1919.             wactiv (wh1);
  1920.             wshadow (DGREY|_BLACK);
  1921.  
  1922.             wcenters (1, BLACK|_LGREY, "Are you sure (Y/n) ?  ");
  1923.  
  1924.             strcpy (string, "Y");
  1925.                 winpbeg (BLACK|_LGREY, BLACK|_LGREY);
  1926.             winpdef (1, 24, string, "?", 0, 2, NULL, 0);
  1927.  
  1928.                 i = winpread ();
  1929.             wclose ();
  1930.             hidecur ();
  1931.  
  1932.             if (i == W_ESCPRESS)
  1933.                break;
  1934.  
  1935.             if (toupper (string[0]) == 'Y') {
  1936.                pos = tell (fd) - (long)SIZEOF_FILEAREA;
  1937.                close (fd);
  1938.  
  1939.                update_message ();
  1940.  
  1941.                sprintf (string, "%sSYSFILE.IDX", config.sys_path);
  1942.                while ((fdx = sh_open (string, SH_DENYRD, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1943.                   ;
  1944.                sprintf (filename, "%sSYSFILE.BAK", config.sys_path);
  1945.                while ((fdi = sh_open (filename, SH_DENYRW, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1946.                   ;
  1947.                sprintf (string, "%sSYSFILE.DAT", config.sys_path);
  1948.                while ((fd = sh_open (string, SH_DENYRD, O_RDWR|O_CREAT|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1949.                   ;
  1950.  
  1951.                     while (read (fd, (char *)&bsys.file_name, SIZEOF_FILEAREA) == SIZEOF_FILEAREA) {
  1952.                   if (bsys.file_num != sys.file_num) {
  1953.                      write (fdi, (char *)&bsys.file_name, SIZEOF_FILEAREA);
  1954.                      memset ((char *)&sysidx, 0, sizeof (struct _sys_idx));
  1955.                      sysidx.priv = bsys.file_priv;
  1956.                      sysidx.flags = bsys.file_flags;
  1957.                      sysidx.area = bsys.file_num;
  1958.                      sysidx.sig = bsys.file_sig;
  1959.                             strcpy (sysidx.key, bsys.short_name);
  1960.                      write (fdx, (char *)&sysidx, sizeof (struct _sys_idx));
  1961.                   }
  1962.                     }
  1963.  
  1964.                lseek (fd, 0L, SEEK_SET);
  1965.                chsize (fd, 0L);
  1966.                lseek (fdi, 0L, SEEK_SET);
  1967.  
  1968.                while (read (fdi, (char *)&bsys.file_name, SIZEOF_FILEAREA) == SIZEOF_FILEAREA)
  1969.                   write (fd, (char *)&bsys.file_name, SIZEOF_FILEAREA);
  1970.  
  1971.                close (fdx);
  1972.                close (fd);
  1973.                close (fdi);
  1974.  
  1975.                unlink (filename);
  1976.  
  1977.                sprintf (string, "%sSYSFILE.DAT", config.sys_path);
  1978.                while ((fd = sh_open (string, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  1979.                   ;
  1980.                if (lseek (fd, pos, SEEK_SET) == -1 || pos == filelength (fd)) {
  1981.                   lseek (fd, -1L * SIZEOF_FILEAREA, SEEK_END);
  1982.                   pos = tell (fd);
  1983.                }
  1984.                read (fd, (char *)&sys.file_name, SIZEOF_FILEAREA);
  1985.  
  1986.                wclose ();
  1987.             }
  1988.             break;
  1989.  
  1990.          // L List
  1991.          case 'L':
  1992.          case 'l':
  1993.                 file_select_area_list (fd, &sys);
  1994.             break;
  1995.  
  1996.             // ESC Exit
  1997.          case 0x1B:
  1998.             i = -1;
  1999.             break;
  2000.       }
  2001.  
  2002.    } while (i != -1);
  2003.  
  2004.    close (fd);
  2005.  
  2006.    wclose ();
  2007.    gotoxy_ (24, 1);
  2008.    clreol_ ();
  2009. }
  2010.  
  2011. static void file_edit_single_area (sys)
  2012. struct _sys *sys;
  2013. {
  2014.    int i = 1, wh1, m;
  2015.    char string[128];
  2016.    struct _sys nsys;
  2017.  
  2018.    memcpy ((char *)&nsys.file_name, (char *)sys->file_name, SIZEOF_FILEAREA);
  2019.  
  2020.     gotoxy_ (24, 1);
  2021.     clreol_ ();
  2022.     prints (24, 1, LGREY|_BLACK, "ESC-Exit/Save  ENTER-Edit");
  2023.     prints (24, 1, YELLOW|_BLACK, "ESC");
  2024.     prints (24, 16, YELLOW|_BLACK, "ENTER");
  2025.  
  2026. continue_editing:
  2027.     do {
  2028.         stop_update ();
  2029.         wclear ();
  2030.  
  2031.         wmenubegc ();
  2032.         wmenuitem ( 1,  1, " Number       ", 0,  1, 0, NULL, 0, 0);
  2033.         wmenuitem ( 1, 28, " Short name ", 0, 23, 0, NULL, 0, 0);
  2034.         wmenuitem ( 2,  1, " Name         ", 0,  2, 0, NULL, 0, 0);
  2035.         wmenuitem ( 3,  1, " Download     ", 0,  5, 0, NULL, 0, 0);
  2036.         wmenuitem ( 4,  1, " Upload       ", 0,  6, 0, NULL, 0, 0);
  2037.         wmenuitem ( 5,  1, " File List    ", 0,  7, 0, NULL, 0, 0);
  2038.         wmenuitem ( 6,  1, " Access priv. ", 0,  8, 0, NULL, 0, 0);
  2039.         wmenuitem ( 7,  1, " A Flag       ", 0,  9, 0, NULL, 0, 0);
  2040.         wmenuitem ( 8,  1, " B Flag       ", 0, 10, 0, NULL, 0, 0);
  2041.         wmenuitem ( 9,  1, " C Flag       ", 0, 11, 0, NULL, 0, 0);
  2042.         wmenuitem (10,  1, " D Flag       ", 0, 12, 0, NULL, 0, 0);
  2043.         wmenuitem ( 6, 28, " Download ", 0, 13, 0, NULL, 0, 0);
  2044.         wmenuitem ( 7, 28, " A Flag   ", 0, 14, 0, NULL, 0, 0);
  2045.         wmenuitem ( 8, 28, " B Flag   ", 0, 15, 0, NULL, 0, 0);
  2046.         wmenuitem ( 9, 28, " C Flag   ", 0, 16, 0, NULL, 0, 0);
  2047.         wmenuitem (10, 28, " D Flag   ", 0, 17, 0, NULL, 0, 0);
  2048.         wmenuitem ( 6, 51, " Upload ", 0, 18, 0, NULL, 0, 0);
  2049.         wmenuitem ( 7, 51, " A Flag ", 0, 19, 0, NULL, 0, 0);
  2050.         wmenuitem ( 8, 51, " B Flag ", 0, 20, 0, NULL, 0, 0);
  2051.         wmenuitem ( 9, 51, " C Flag ", 0, 21, 0, NULL, 0, 0);
  2052.         wmenuitem (10, 51, " D Flag ", 0, 22, 0, NULL, 0, 0);
  2053.         wmenuitem (11,  1, " TIC Level    ", 0, 28, 0, NULL, 0, 0);
  2054.         wmenuitem (12,  1, " A Flag       ", 0, 29, 0, NULL, 0, 0);
  2055.         wmenuitem (13,  1, " B Flag       ", 0, 30, 0, NULL, 0, 0);
  2056.         wmenuitem (14,  1, " C Flag       ", 0, 31, 0, NULL, 0, 0);
  2057.         wmenuitem (15,  1, " D Flag       ", 0, 32, 0, NULL, 0, 0);
  2058.         wmenuitem (12, 28, " Group    ", 0,  4, 0, NULL, 0, 0);
  2059.         wmenuitem (13, 28, " Flags    ", 0,  3, 0, NULL, 0, 0);
  2060.         wmenuitem (14, 28, " TIC Tag  ", 0, 24, 0, NULL, 0, 0);
  2061.         wprints (16,  1, LGREY|_BLACK, " Forward to:");
  2062.         wmenuitem (17,  1, " 1 ", 0, 25, 0, NULL, 0, 0);
  2063.         wmenuitem (18,  1, " 2 ", 0, 26, 0, NULL, 0, 0);
  2064.         wmenuitem (19,  1, " 3 ", 0, 27, 0, NULL, 0, 0);
  2065.         wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  2066.  
  2067.         sprintf (string, "%d", nsys.file_num);
  2068.         wprints (1, 16, CYAN|_BLACK, string);
  2069.  
  2070.         wprints (1, 41, CYAN|_BLACK, nsys.short_name);
  2071.  
  2072.         nsys.file_name[55] = '\0';
  2073.         wprints (2, 16, CYAN|_BLACK, nsys.file_name);
  2074.  
  2075.         wprints (3, 16, CYAN|_BLACK, nsys.filepath);
  2076.  
  2077.         wprints (4, 16, CYAN|_BLACK, nsys.uppath);
  2078.  
  2079.         wprints (5, 16, CYAN|_BLACK, nsys.filelist);
  2080.  
  2081.         wprints (6, 15, CYAN|_BLACK, get_priv_text (nsys.file_priv));
  2082.         wprints (7, 16, CYAN|_BLACK, get_flagA_text ((nsys.file_flags >> 24) & 0xFF));
  2083.         wprints (8, 16, CYAN|_BLACK, get_flagB_text ((nsys.file_flags >> 16) & 0xFF));
  2084.         wprints (9, 16, CYAN|_BLACK, get_flagC_text ((nsys.file_flags >> 8) & 0xFF));
  2085.         wprints (10, 16, CYAN|_BLACK, get_flagD_text (nsys.file_flags & 0xFF));
  2086.  
  2087.         wprints (6, 38, CYAN|_BLACK, get_priv_text (nsys.download_priv));
  2088.         wprints (7, 39, CYAN|_BLACK, get_flagA_text ((nsys.download_flags >> 24) & 0xFF));
  2089.         wprints (8, 39, CYAN|_BLACK, get_flagB_text ((nsys.download_flags >> 16) & 0xFF));
  2090.         wprints (9, 39, CYAN|_BLACK, get_flagC_text ((nsys.download_flags >> 8) & 0xFF));
  2091.         wprints (10, 39, CYAN|_BLACK, get_flagD_text (nsys.download_flags & 0xFF));
  2092.  
  2093.         wprints (6, 59, CYAN|_BLACK, get_priv_text (nsys.upload_priv));
  2094.         wprints (7, 60, CYAN|_BLACK, get_flagA_text ((nsys.upload_flags >> 24) & 0xFF));
  2095.         wprints (8, 60, CYAN|_BLACK, get_flagB_text ((nsys.upload_flags >> 16) & 0xFF));
  2096.         wprints (9, 60, CYAN|_BLACK, get_flagC_text ((nsys.upload_flags >> 8) & 0xFF));
  2097.         wprints (10, 60, CYAN|_BLACK, get_flagD_text (nsys.upload_flags & 0xFF));
  2098.  
  2099.         wprints (14, 39, CYAN|_BLACK, nsys.tic_tag);
  2100.  
  2101.         sprintf (string, "%d", nsys.tic_level);
  2102.         wprints (11, 16, CYAN|_BLACK, string);
  2103.  
  2104.         wprints (12, 16, CYAN|_BLACK, get_flagA_text ((nsys.tic_flags >> 24) & 0xFF));
  2105.         wprints (13, 16, CYAN|_BLACK, get_flagB_text ((nsys.tic_flags >> 16) & 0xFF));
  2106.         wprints (14, 16, CYAN|_BLACK, get_flagC_text ((nsys.tic_flags >> 8) & 0xFF));
  2107.         wprints (15, 16, CYAN|_BLACK, get_flagD_text (nsys.tic_flags & 0xFF));
  2108.  
  2109.         sprintf (string, "%d", nsys.file_sig);
  2110.         wprints (12, 39, CYAN|_BLACK, string);
  2111.  
  2112.         strcpy (string, "........");
  2113.         if (nsys.freearea)
  2114.             string[0] = 'F';
  2115.         if (nsys.file_restricted)
  2116.             string[1] = 'G';
  2117.         if (nsys.no_global_search)
  2118.             string[2] = 'S';
  2119.         if (nsys.no_filedate)
  2120.             string[3] = 'D';
  2121.         if (nsys.norm_req)
  2122.             string[4] = 'N';
  2123.         if (nsys.know_req)
  2124.             string[5] = 'K';
  2125.         if (nsys.prot_req)
  2126.             string[6] = 'P';
  2127.         if (nsys.cdrom)
  2128.             string[7] = 'C';
  2129.         wprints (13, 39, CYAN|_BLACK, string);
  2130.  
  2131.         wprints (17, 4, CYAN|_BLACK, nsys.tic_forward1);
  2132.         wprints (18, 4, CYAN|_BLACK, nsys.tic_forward2);
  2133.         wprints (19, 4, CYAN|_BLACK, nsys.tic_forward3);
  2134.  
  2135.         start_update ();
  2136.         i = wmenuget ();
  2137.  
  2138.         switch (i) {
  2139.             case 1:
  2140.                 sprintf (string, "%d", nsys.file_num);
  2141.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2142.                 winpdef (1, 16, string, "?????", 0, 2, NULL, 0);
  2143.                 if (winpread () != W_ESCPRESS)
  2144.                     nsys.file_num = atoi (strbtrim (string));
  2145.                 break;
  2146.  
  2147.             case 2:
  2148.                 strcpy (string, nsys.file_name);
  2149.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2150.                 winpdef (2, 16, string, "???????????????????????????????????????????????????????", 0, 2, NULL, 0);
  2151.                 if (winpread () != W_ESCPRESS)
  2152.                     strcpy (nsys.file_name, strbtrim (string));
  2153.                 break;
  2154.  
  2155.             case 3:
  2156.                 wh1 = wopen (6, 42, 17, 70, 1, LCYAN|_BLACK, CYAN|_BLACK);
  2157.                 wactiv (wh1);
  2158.                 wshadow (DGREY|_BLACK);
  2159.                 wtitle (" Flags ", TRIGHT, YELLOW|_BLUE);
  2160.                 m = 1;
  2161.  
  2162.                 do {
  2163.                     wmenubegc ();
  2164.                     wmenuitem (1, 1, " No download limits ", 0, 1, 0, NULL, 0, 0);
  2165.                     wmenuitem (2, 1, " Group restricted   ", 0, 5, 0, NULL, 0, 0);
  2166.                     wmenuitem (3, 1, " No global search   ", 0, 6, 0, NULL, 0, 0);
  2167.                     wmenuitem (4, 1, " No file date       ", 0, 7, 0, NULL, 0, 0);
  2168.                     wmenuitem (5, 1, " Unknow can request ", 0, 2, 0, NULL, 0, 0);
  2169.                     wmenuitem (6, 1, " Know can request   ", 0, 3, 0, NULL, 0, 0);
  2170.                     wmenuitem (7, 1, " Prot can request   ", 0, 4, 0, NULL, 0, 0);
  2171.                     wmenuitem (8, 1, " CD-ROM             ", 0, 8, 0, NULL, 0, 0);
  2172.                     wmenuend (m, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  2173.  
  2174.                     wprints (1, 22, CYAN|_BLACK, nsys.freearea ? "Yes" : "No ");
  2175.                     wprints (2, 22, CYAN|_BLACK, nsys.file_restricted ? "Yes" : "No ");
  2176.                     wprints (3, 22, CYAN|_BLACK, nsys.no_global_search ? "Yes" : "No ");
  2177.                     wprints (4, 22, CYAN|_BLACK, nsys.no_filedate ? "Yes" : "No ");
  2178.                     wprints (5, 22, CYAN|_BLACK, nsys.norm_req ? "Yes" : "No ");
  2179.                     wprints (6, 22, CYAN|_BLACK, nsys.know_req ? "Yes" : "No ");
  2180.                     wprints (7, 22, CYAN|_BLACK, nsys.prot_req ? "Yes" : "No ");
  2181.                     wprints (8, 22, CYAN|_BLACK, nsys.cdrom ? "Yes" : "No ");
  2182.  
  2183.                     start_update ();
  2184.                     m = wmenuget ();
  2185.  
  2186.                     switch (m) {
  2187.                         case 1:
  2188.                             nsys.freearea = nsys.freearea ? 0 : 1;
  2189.                             break;
  2190.                         case 2:
  2191.                             nsys.norm_req = nsys.norm_req ? 0 : 1;
  2192.                             break;
  2193.                         case 3:
  2194.                             nsys.know_req = nsys.know_req ? 0 : 1;
  2195.                             break;
  2196.                         case 4:
  2197.                             nsys.prot_req = nsys.prot_req ? 0 : 1;
  2198.                             break;
  2199.                         case 5:
  2200.                             nsys.file_restricted = nsys.file_restricted ? 0 : 1;
  2201.                             break;
  2202.                         case 6:
  2203.                             nsys.no_global_search = nsys.no_global_search ? 0 : 1;
  2204.                             break;
  2205.                         case 7:
  2206.                             nsys.no_filedate = nsys.no_filedate ? 0 : 1;
  2207.                             break;
  2208.                         case 8:
  2209.                             nsys.cdrom = nsys.cdrom ? 0 : 1;
  2210.                             break;
  2211.                     }
  2212.  
  2213.                 } while (m != -1);
  2214.  
  2215.                 wclose ();
  2216.                 break;
  2217.  
  2218.             case 4:
  2219.                 sprintf (string, "%d", nsys.file_sig);
  2220.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2221.                 winpdef (12, 39, string, "???", 0, 2, NULL, 0);
  2222.                 if (winpread () != W_ESCPRESS)
  2223.                     nsys.file_sig = atoi (strbtrim (string));
  2224.          break;
  2225.  
  2226.             case 5:
  2227.                 strcpy (string, nsys.filepath);
  2228.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2229.                 winpdef (3, 16, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  2230.                 if (winpread () != W_ESCPRESS) {
  2231.                     strcpy (nsys.filepath, strbtrim (string));
  2232.                     if (nsys.filepath[0] && nsys.filepath[strlen (nsys.filepath) - 1] != '\\')
  2233.                         strcat (nsys.filepath, "\\");
  2234.                     create_path (nsys.filepath);
  2235.                 }
  2236.                 break;
  2237.  
  2238.             case 6:
  2239.                 strcpy (string, nsys.uppath);
  2240.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2241.                 winpdef (4, 16, string, "???????????????????????????????????????", 0, 2, NULL, 0);
  2242.                 if (winpread () != W_ESCPRESS) {
  2243.                     strcpy (nsys.uppath, strbtrim (string));
  2244.                     if (nsys.uppath[0] && nsys.uppath[strlen (nsys.uppath) - 1] != '\\')
  2245.                         strcat (nsys.uppath, "\\");
  2246.                     create_path (nsys.uppath);
  2247.                 }
  2248.                 break;
  2249.  
  2250.             case 7:
  2251.                 strcpy (string, nsys.filelist);
  2252.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2253.                 winpdef (5, 16, string, "?????????????????????????????????????????????????", 0, 2, NULL, 0);
  2254.                 if (winpread () != W_ESCPRESS)
  2255.                     strcpy (nsys.filelist, strbtrim (string));
  2256.                 break;
  2257.  
  2258.             case 8:
  2259.                 nsys.file_priv = select_level (nsys.file_priv, 25, 6);
  2260.                 break;
  2261.  
  2262.             case 9:
  2263.                 nsys.file_flags = window_get_flags (4, 26, 1, nsys.file_flags);
  2264.                 break;
  2265.  
  2266.             case 10:
  2267.                 nsys.file_flags = window_get_flags (4, 26, 2, nsys.file_flags);
  2268.                 break;
  2269.  
  2270.             case 11:
  2271.                 nsys.file_flags = window_get_flags (4, 26, 3, nsys.file_flags);
  2272.                 break;
  2273.  
  2274.             case 12:
  2275.                 nsys.file_flags = window_get_flags (4, 26, 4, nsys.file_flags);
  2276.                 break;
  2277.  
  2278.             case 13:
  2279.                 nsys.download_priv = select_level (nsys.download_priv, 45, 6);
  2280.                 break;
  2281.  
  2282.             case 14:
  2283.                 nsys.download_flags = window_get_flags (4, 50, 1, nsys.download_flags);
  2284.                 break;
  2285.  
  2286.             case 15:
  2287.                 nsys.download_flags = window_get_flags (4, 50, 2, nsys.download_flags);
  2288.                 break;
  2289.  
  2290.             case 16:
  2291.                 nsys.download_flags = window_get_flags (4, 50, 3, nsys.download_flags);
  2292.                 break;
  2293.  
  2294.             case 17:
  2295.                 nsys.download_flags = window_get_flags (4, 50, 4, nsys.download_flags);
  2296.                 break;
  2297.  
  2298.             case 18:
  2299.                 nsys.upload_priv = select_level (nsys.upload_priv, 47, 6);
  2300.                 break;
  2301.  
  2302.          case 19:
  2303.             nsys.upload_flags = window_get_flags (4, 66, 1, nsys.upload_flags);
  2304.             break;
  2305.  
  2306.          case 20:
  2307.             nsys.upload_flags = window_get_flags (4, 66, 2, nsys.upload_flags);
  2308.             break;
  2309.  
  2310.          case 21:
  2311.             nsys.upload_flags = window_get_flags (4, 66, 3, nsys.upload_flags);
  2312.             break;
  2313.  
  2314.          case 22:
  2315.             nsys.upload_flags = window_get_flags (4, 66, 4, nsys.upload_flags);
  2316.             break;
  2317.  
  2318.          case 23:
  2319.             strcpy (string, nsys.short_name);
  2320.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2321.             winpdef (1, 41, string, "????????????", 0, 1, NULL, 0);
  2322.             if (winpread () != W_ESCPRESS)
  2323.                strcpy (nsys.short_name, string);
  2324.             break;
  2325.  
  2326.          case 24:
  2327.             strcpy (string, nsys.tic_tag);
  2328.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2329.             winpdef (14, 39, string, "????????????????????", 0, 2, NULL, 0);
  2330.             if (winpread () != W_ESCPRESS)
  2331.                strcpy (nsys.tic_tag, strbtrim (string));
  2332.             break;
  2333.  
  2334.             case 25:
  2335.                 strcpy (string, nsys.tic_forward1);
  2336.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2337.                 winpdef (17, 4, string, "????????????????????????????????????????????????????????????????????", 0, 2, NULL, 0);
  2338.                 if (winpread () != W_ESCPRESS)
  2339.                     strcpy (nsys.tic_forward1, strbtrim (string));
  2340.                 break;
  2341.  
  2342.             case 26:
  2343.                 strcpy (string, nsys.tic_forward2);
  2344.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2345.                 winpdef (18, 4, string, "????????????????????????????????????????????????????????????????????", 0, 2, NULL, 0);
  2346.                 if (winpread () != W_ESCPRESS)
  2347.                     strcpy (nsys.tic_forward2, strbtrim (string));
  2348.                 break;
  2349.  
  2350.             case 27:
  2351.                 strcpy (string, nsys.tic_forward3);
  2352.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2353.                 winpdef (19, 4, string, "????????????????????????????????????????????????????????????????????", 0, 2, NULL, 0);
  2354.                 if (winpread () != W_ESCPRESS)
  2355.                     strcpy (nsys.tic_forward3, strbtrim (string));
  2356.                 break;
  2357.  
  2358.             case 28:
  2359.                 sprintf (string, "%d", nsys.tic_level);
  2360.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  2361.                 winpdef (11, 16, string, "???", 0, 2, NULL, 0);
  2362.                 if (winpread () != W_ESCPRESS)
  2363.                     nsys.tic_level = atoi (strbtrim (string));
  2364.                 break;
  2365.  
  2366.             case 29:
  2367.                 nsys.tic_flags = window_get_flags (9, 26, 1, nsys.tic_flags);
  2368.                 break;
  2369.  
  2370.             case 30:
  2371.                 nsys.tic_flags = window_get_flags (9, 26, 2, nsys.tic_flags);
  2372.                 break;
  2373.  
  2374.             case 31:
  2375.                 nsys.tic_flags = window_get_flags (9, 26, 3, nsys.tic_flags);
  2376.                 break;
  2377.  
  2378.             case 32:
  2379.                 nsys.tic_flags = window_get_flags (9, 26, 4, nsys.tic_flags);
  2380.                 break;
  2381.         }
  2382.  
  2383.         hidecur ();
  2384.     } while (i != -1);
  2385.  
  2386.     if (memcmp ((char *)&nsys.file_name, (char *)sys->file_name, SIZEOF_FILEAREA)) {
  2387.         wh1 = wopen (10, 25, 14, 54, 0, BLACK|_LGREY, BLACK|_LGREY);
  2388.         wactiv (wh1);
  2389.         wshadow (DGREY|_BLACK);
  2390.  
  2391.       wcenters (1, BLACK|_LGREY, "Save changes (Y/n) ?  ");
  2392.  
  2393.       strcpy (string, "Y");
  2394.       winpbeg (BLACK|_LGREY, BLACK|_LGREY);
  2395.       winpdef (1, 24, string, "?", 0, 2, NULL, 0);
  2396.  
  2397.       i = winpread ();
  2398.       wclose ();
  2399.       hidecur ();
  2400.  
  2401.       if (i == W_ESCPRESS)
  2402.          goto continue_editing;
  2403.  
  2404.       if (toupper (string[0]) == 'Y')
  2405.          memcpy ((char *)sys->file_name, (char *)&nsys.file_name, SIZEOF_FILEAREA);
  2406.    }
  2407.  
  2408.    gotoxy_ (24, 1);
  2409.    clreol_ ();
  2410.    prints (24, 1, LGREY|_BLACK, "PgUp/PgDn-Next/Previous  E-Edit  A-Add New Area  C-Copy  L-List  D-Delete");
  2411.    prints (24, 1, YELLOW|_BLACK, "PgUp/PgDn");
  2412.    prints (24, 26, YELLOW|_BLACK, "E");
  2413.    prints (24, 34, YELLOW|_BLACK, "A");
  2414.    prints (24, 50, YELLOW|_BLACK, "C");
  2415.    prints (24, 58, YELLOW|_BLACK, "L");
  2416.    prints (24, 66, YELLOW|_BLACK, "D");
  2417. }
  2418.  
  2419. static void file_select_area_list (fd, osys)
  2420. int fd;
  2421. struct _sys *osys;
  2422. {
  2423.    int wh, i, x, start;
  2424.    char string[80], **array;
  2425.    struct _sys sys;
  2426.    long pos;
  2427.  
  2428.    wh = wopen (4, 0, 20, 77, 1, LCYAN|_BLACK, CYAN|_BLACK);
  2429.    wactiv (wh);
  2430.    wshadow (DGREY|_BLACK);
  2431.    wtitle (" Select area ", TRIGHT, YELLOW|_BLUE);
  2432.  
  2433.    wprints (0, 1, LGREY|_BLACK, "Area# Name                                                   Level");
  2434.    whline (1, 0, 76, 0, BLUE|_BLACK);
  2435.  
  2436.    gotoxy_ (24, 1);
  2437.    clreol_ ();
  2438.    prints (24, 1, LGREY|_BLACK, "-Move bar  ENTER-Select");
  2439.    prints (24, 1, YELLOW|_BLACK, "");
  2440.    prints (24, 14, YELLOW|_BLACK, "ENTER");
  2441.  
  2442.    i = (int)(filelength (fd) / SIZEOF_FILEAREA);
  2443.    i += 2;
  2444.    if ((array = (char **)malloc (i * sizeof (char *))) == NULL)
  2445.       return;
  2446.  
  2447.    pos = tell (fd) - SIZEOF_FILEAREA;
  2448.    lseek (fd, 0L, SEEK_SET);
  2449.    i = 0;
  2450.    start = 0;
  2451.  
  2452.    while (read (fd, (char *)&sys.file_name, SIZEOF_FILEAREA) == SIZEOF_FILEAREA) {
  2453.       sprintf (string, " %-4d %-54.54s%-13s ", sys.file_num, sys.file_name, get_priv_text (sys.file_priv));
  2454.       array[i] = (char *)malloc (strlen (string) + 1);
  2455.       if (array[i] == NULL)
  2456.          break;
  2457.       if (sys.file_num == osys->file_num)
  2458.          start = i;
  2459.       strcpy (array[i++], string);
  2460.    }
  2461.    array[i] = NULL;
  2462.  
  2463.    x = wpickstr (7, 2, 19, 75, 5, LGREY|_BLACK, CYAN|_BLACK, BLUE|_LGREY, array, start, NULL);
  2464.  
  2465.    if (x == -1)
  2466.       lseek (fd, pos, SEEK_SET);
  2467.    else
  2468.       lseek (fd, (long)x * SIZEOF_FILEAREA, SEEK_SET);
  2469.    read (fd, (char *)osys->file_name, SIZEOF_FILEAREA);
  2470.  
  2471.    wclose ();
  2472.  
  2473.    i = 0;
  2474.    while (array[i] != NULL)
  2475.       free (array[i++]);
  2476.    free (array);
  2477.  
  2478.    gotoxy_ (24, 1);
  2479.    clreol_ ();
  2480.    prints (24, 1, LGREY|_BLACK, "PgUp/PgDn-Next/Previous  E-Edit  A-Add New Area  C-Copy  L-List  D-Delete");
  2481.    prints (24, 1, YELLOW|_BLACK, "PgUp/PgDn");
  2482.    prints (24, 26, YELLOW|_BLACK, "E");
  2483.    prints (24, 34, YELLOW|_BLACK, "A");
  2484.    prints (24, 50, YELLOW|_BLACK, "C");
  2485.    prints (24, 58, YELLOW|_BLACK, "L");
  2486.    prints (24, 66, YELLOW|_BLACK, "D");
  2487. }
  2488.  
  2489.