home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / BBS / NETMAIL / MSGD2SRC.ZIP / SETTINGS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-08-07  |  34.2 KB  |  1,497 lines

  1. /*
  2.  
  3. Title:    MsgEd
  4.  
  5. File:    settings.c
  6.  
  7. Author: Jim Nutt
  8.  
  9. Copr:    released into the PUBLIC DOMAIN 30 jul 1990 by jim nutt
  10.  
  11. Description:
  12.  
  13.     handles configuration setup from within msged
  14.  
  15. Support Files:
  16.  
  17.     msged.h
  18.     menu.h
  19.  
  20. */
  21.  
  22. #define NOSPELL
  23. #include "msged.h"
  24. #include "menu.h"
  25.  
  26. void    _pascal e_assignkey(unsigned int key, char *label);
  27. char *    _pascal e_getlabels(int i);
  28. char *    _pascal e_getbind(unsigned int key);
  29. void    _pascal r_assignkey(unsigned int key, char *label);
  30. char *    _pascal r_getbind(unsigned int key);
  31. char *    _pascal r_getlabels(int i);
  32.  
  33. static void _pascal set_colors(void);
  34. static void _pascal set_switch(void);
  35. static void _pascal set_margins(void);
  36. static void _pascal set_files(void);
  37. static void _pascal set_areas(void);
  38. static void _pascal set_gates(void);
  39. static void _pascal set_quotes(void);
  40. static void _pascal set_macro(void);
  41. static void _pascal set_address(void);
  42. static void _pascal set_video(void);
  43. static void _pascal set_misc(void);
  44. static void _pascal save_set(void);
  45. static void _pascal set_attrib(int x1, int y1, int x2, int y2, AREA *a);
  46. static void _pascal edit_area(AREA *a);
  47. static void _pascal set_key(int i);
  48. static unsigned int * _pascal build_macro(void);
  49.  
  50. void _pascal settings()
  51.  
  52. {
  53.     static char *s_items[] = {
  54.         "Switches ",
  55.         "Margins  ",
  56.         "Files    ",
  57.         "Attribute",
  58.         "Areas    ",
  59.         "Gates    ",
  60.         "Quoting  ",
  61.         "Macros   ",
  62.         "Addresses",
  63.         "Video    ",
  64.         "Misc     ",
  65.         "Save     ",
  66.         NULL
  67.     };
  68.  
  69.     int i = 0;
  70.  
  71.     cls();
  72.  
  73.     set_color(co_info);
  74.     gotoxy(2,2); bputs("msged version " VERSION " setup.");
  75.  
  76.     for (;;) switch (i = menu(5,5,15,16,s_items,co_hilite,co_normal,i)) {
  77.         case -1:set_color(co_normal);
  78.             return;
  79.         case  0:
  80.             set_switch();
  81.             break;
  82.         case  1:
  83.             set_margins();
  84.             break;
  85.         case  2:
  86.             set_files();
  87.             break;
  88.         case  3:
  89.             gotoxy(20,7);
  90.             bprintf("Default message attributes for %s",arealist[area].description);
  91.             set_attrib(20,9,35,14,&arealist[area]);
  92.             break;
  93.         case  4:
  94.             set_areas();
  95.             break;
  96.         case  5:
  97.             set_gates();
  98.             break;
  99.         case  6:
  100.             set_quotes();
  101.             break;
  102.         case  7:
  103.             set_macro();
  104.             break;
  105.         case  8:
  106.             set_address();
  107.             break;
  108.         case  9:
  109.             set_video();
  110.             break;
  111.         case 10:
  112.             set_misc();
  113.             break;
  114.         case 11:
  115.             save_set();
  116.             break;
  117.         default:
  118.             break;
  119.     }
  120. }
  121.  
  122. static void _pascal set_switch()
  123.  
  124. {
  125.     static char *switches[] = {
  126.         "Soft Returns off",
  127.         "Seen-Bys off",
  128.         "Tearlines off",
  129.         "Kludge line display off",
  130.         "Confirm Deletes off",
  131.         "MSGIDs off",
  132.         "Strip Kludges off",
  133.         "Opus Dates off",
  134. #ifndef NOSPELL
  135.         "Spell Check off",
  136. #endif
  137.         NULL
  138.     };
  139.  
  140.     int i = 0;
  141.  
  142.     for (;;) {
  143.  
  144.         strcpy(switches[0]+13,softcr?"on ":"off");
  145.         strcpy(switches[1]+9,seenbys?"on ":"off");
  146.         strcpy(switches[2]+10,tearline?"on ":"off");
  147.         strcpy(switches[3]+20,shownotes?"on ":"off");
  148.         strcpy(switches[4]+16,confirmations?"on ":"off");
  149.         strcpy(switches[5]+7,msgids?"on ":"off");
  150.         strcpy(switches[6]+14,stripnotes?"on ":"off");
  151.         strcpy(switches[7]+11,opusdate?"on ":"off");
  152. #ifndef NOSPELL
  153.         strcpy(switches[8]+12,spell?"on ":"off");
  154. #endif
  155.  
  156.         switch (i = menu(20,6,45,16,switches,co_hilite,co_normal,i)) {
  157.             case -1:set_color(co_normal);
  158.                 clrwnd(20,6,45,16);
  159.                 return;
  160.             case 0: softcr = !softcr;
  161.                 break;
  162.             case 1: seenbys = !seenbys;
  163.                 break;
  164.             case 2: tearline = !tearline;
  165.                 break;
  166.             case 3: shownotes = !shownotes;
  167.                 break;
  168.             case 4: confirmations = !confirmations;
  169.                 break;
  170.             case 5: msgids = !msgids;
  171.                 break;
  172.             case 6: stripnotes = !stripnotes;
  173.                 break;
  174.             case 7: opusdate = !opusdate;
  175.                 break;
  176. #ifndef NOSPELL
  177.             case 8: spell = !spell;
  178.                 break;
  179. #endif
  180.             default: break;
  181.         }
  182.     }
  183.  
  184. }
  185.  
  186. static void _pascal set_margins()
  187.  
  188. {
  189.     static char *items[] = {
  190.         "Right margin is xxx",
  191.         "Quote margin is xxx",
  192.         "Tab size is xx",
  193.         NULL
  194.     };
  195.  
  196.     int i = 0;
  197.  
  198.     for (;;) {
  199.         sprintf(items[0]+16,"%-3d",rm);
  200.         sprintf(items[1]+16,"%-3d",qm);
  201.         sprintf(items[2]+12,"%-2d",tabsize);
  202.  
  203.         switch(i = menu(20,7,40,10,items,co_hilite,co_normal,i)) {
  204.             case -1:
  205.                 set_color(co_normal);
  206.                 clrwnd(20,7,40,10);
  207.                 return;
  208.             case  0:
  209.                 set_color(co_hilite);
  210.                 gotoxy(36,wherey());
  211.                 rm = getnum(5,maxx,rm);
  212.                 break;
  213.             case  1:
  214.                 set_color(co_hilite);
  215.                 gotoxy(36,wherey());
  216.                 qm = getnum(5,rm,qm);
  217.                 break;
  218.             case  2:
  219.                 set_color(co_hilite);
  220.                 gotoxy(32,wherey());
  221.                 tabsize = getnum(1,rm,tabsize);
  222.                 break;
  223.         }
  224.     }
  225. }
  226.  
  227. static void _pascal set_files()
  228.  
  229. {
  230.     char *item[9];
  231.     int i,f=0, j = 0;
  232.  
  233.  
  234.     while (f != ABORT) {
  235.         memset(item,0,sizeof item);
  236.         for (i = 0; i < 8; i++)
  237.             item[i] = calloc(1,128);
  238.         item[8] = NULL;
  239.  
  240.         sprintf(item[0],"Outfile is %s",outfile);
  241.         sprintf(item[1],"Lastread file is %s",lastread);
  242.         sprintf(item[2],"Echomail toss log is %s",confmail);
  243.         sprintf(item[3],"Quickbbs directory is %s",quickbbs);
  244.         sprintf(item[4],"Primary userlist is %s",fidolist);
  245.         sprintf(item[5],"Secondary userlist is %s",userlist);
  246.         sprintf(item[6],
  247. #ifndef NOSPELL
  248.             "Spell Checker is %s",speller);
  249.         sprintf(item[7],
  250. #endif
  251.             "Config file is %s",cfgfile);
  252. #ifdef NOSPELL
  253.         free(item[7]); item[7] = NULL;
  254. #endif
  255.  
  256.         switch(j = menu(20,8,maxx,15,item,co_hilite,co_normal,j)) {
  257.             case -1:
  258.                 f = ABORT;
  259.                 break;
  260.             case  0:
  261.                 if (outfile) free(outfile);
  262.                 gotoxy(31,wherey()); set_color(co_hilite);
  263.                 f = bgets(item[0]+11,64,maxx-31);
  264.                 outfile = strdup(item[0]+11);
  265.                 break;
  266.             case 1:
  267.                 if (lastread) free(lastread);
  268.                 gotoxy(37,wherey()); set_color(co_hilite);
  269.                 f = bgets(item[1]+17,64,maxx-37);
  270.                 lastread = strdup(item[1]+17);
  271.                 break;
  272.             case 2:
  273.                 if (confmail) free(confmail);
  274.                 gotoxy(41,wherey()); set_color(co_hilite);
  275.                 f = bgets(item[2]+21,64,maxx-41);
  276.                 confmail = strdup(item[2]+21);
  277.                 break;
  278.             case 3:
  279.                 if (quickbbs) free(quickbbs);
  280.                 gotoxy(42,wherey()); set_color(co_hilite);
  281.                 f = bgets(item[3]+22,64,maxx-42);
  282.                 quickbbs = strdup(item[3]+22);
  283.                 break;
  284.             case 4:
  285.                 if (fidolist) free(fidolist);
  286.                 gotoxy(40,wherey()); set_color(co_hilite);
  287.                 f = bgets(item[4]+20,64,maxx-40);
  288.                 fidolist = strdup(item[4]+20);
  289.                 break;
  290.             case 5:
  291.                 if (userlist) free(userlist);
  292.                 gotoxy(42,wherey()); set_color(co_hilite);
  293.                 f = bgets(item[5]+22,64,maxx-42);
  294.                 userlist = strdup(item[5]+22);
  295.                 break;
  296.             case 6:
  297. #ifndef NOSPELL
  298.                 if (speller) free(speller);
  299.                 gotoxy(37,wherey()); set_color(co_hilite);
  300.                 f = bgets(item[6]+17,64,maxx-37);
  301.                 speller = strdup(item[6]+17);
  302.                 break;
  303.             case 7:
  304. #endif
  305.                 if (cfgfile) free(cfgfile);
  306.                 gotoxy(35,wherey()); set_color(co_hilite);
  307. #ifndef NOSPELL
  308.                 f = bgets(item[7]+15,64,maxx-35);
  309.                 cfgfile = strdup(item[7]+15);
  310. #else
  311.                 f = bgets(item[6]+15,64,maxx-35);
  312.                 cfgfile = strdup(item[6]+15);
  313. #endif
  314.                 break;
  315.         }
  316.     }
  317.  
  318.     for (i = 0; 
  319. #ifndef NOSPELL
  320.         i < 8; 
  321. #else 
  322.         i < 7;
  323. #endif
  324.             i++) {
  325.         free(item[i]);
  326.     }
  327.  
  328.     set_color(co_normal);
  329.     clrwnd(20,8,maxx,15);
  330. }
  331.  
  332. static void _pascal set_attrib(int x1, int y1, int x2, int y2, AREA *a)
  333.  
  334. {
  335.     static char *items[] = {
  336.         "Privileged o",
  337.         "Hold       o",
  338.         "Direct     o",
  339.         "Crash      o",
  340.         "Kill/Sent  o",
  341.         NULL
  342.     };
  343.  
  344.     int i = 0;
  345.  
  346.     for (;;) {
  347.  
  348.         *(items[0]+11) = (char) ((a->priv)?0xfb:0x20);
  349.         *(items[1]+11) = (char) ((a->hold)?0xfb:0x20);
  350.         *(items[2]+11) = (char) ((a->direct)?0xfb:0x20);
  351.         *(items[3]+11) = (char) ((a->crash)?0xfb:0x20);
  352.         *(items[4]+11)    = (char) ((a->killsent)?0xfb:0x20);
  353.  
  354.         switch(i = menu(x1,y1,x2,y2,items,co_hilite,co_normal,i)) {
  355.             case -1:
  356.                 set_color(co_normal);
  357.                 clrwnd(x1,y1,x2,y2);
  358.                 return;
  359.             case  0:
  360.                 arealist[area].priv = !arealist[area].priv;
  361.                 break;
  362.             case  1:
  363.                 arealist[area].hold = !arealist[area].hold;
  364.                 break;
  365.             case  2:
  366.                 arealist[area].direct = !arealist[area].direct;
  367.                 break;
  368.             case  3:
  369.                 arealist[area].crash = !arealist[area].crash;
  370.                 break;
  371.             case  4:
  372.                 arealist[area].killsent = !arealist[area].killsent;
  373.                 break;
  374.         }
  375.     }
  376. }
  377.  
  378. static void _pascal set_areas()
  379.  
  380. {
  381.     AREA __handle *a;
  382.  
  383.     static char *flist[] = {
  384.         "Add an area",
  385.         "Edit an area",
  386.         "Delete an area",
  387.         NULL
  388.     };
  389.  
  390.     char **list = NULL;
  391.     int i1 = 0, i2 = 0, j = 0, i;
  392.  
  393.     for (;;) {
  394.         switch (j = menu(20,5,33,7,flist,co_hilite,co_normal,j)) {
  395.             case -1:
  396.                 set_color(co_normal);
  397.                 clrwnd(20,5,33,7);
  398.                 return;
  399.  
  400.             case  0:
  401.                 set_color(co_normal);
  402.                 clrwnd(20,5,33,7);
  403.                 areas++;
  404.                 a = arealist;
  405.                 arealist = handle_realloc(arealist,sizeof(AREA) * areas);
  406.                 if (arealist == NULL)
  407.                     arealist = a;
  408.                 a = arealist+areas-1;
  409.                 memset(a,0,sizeof(AREA));
  410.                 edit_area(a);
  411.                 break;
  412.  
  413.             case  1:
  414.                 set_color(co_normal);
  415.                 clrwnd(20,5,33,7);
  416.                 list = calloc(areas+1,sizeof(char *));
  417.                 for (i = 0; i < areas; i++)
  418.                     list[i] = arealist[i].description;
  419.                 i1 = i = menu(20,5,maxx,min(maxy,areas+5),list,co_hilite,co_normal,i1);
  420.                 set_color(co_normal); clrwnd(20,5,maxx,min(maxy,areas+5));
  421.                 if (i == -1)
  422.                     break;
  423.                 a = arealist+i;
  424.                 edit_area(a);
  425.                 free(list);
  426.                 break;
  427.             case  2:
  428.                 set_color(co_normal);
  429.                 clrwnd(20,5,33,7);
  430.                 list = calloc(areas+1,sizeof(char *));
  431.                 for (i = 0; i < areas; i++)
  432.                     list[i] = arealist[i].description;
  433.                 i2 = menu(20,5,maxx,min(maxy,areas+5),list,co_hilite,co_normal,i2);
  434.                 set_color(co_normal); clrwnd(20,5,maxx,min(maxy,areas+5));
  435.                 if (i == -1)
  436.                     break;
  437.                 free(list);
  438.                 if (arealist[i].msgtype == FIDO)
  439.                     free(arealist[i].path);
  440.                 free(arealist[i].description);
  441.                 if (arealist[i].echomail)
  442.                     free(arealist[i].tag);
  443.                 while ((i+1) < areas) {
  444.                     arealist[i] = arealist[i+1];
  445.                     i++;
  446.                 }
  447.                 areas--;
  448.                 a = handle_realloc(arealist,sizeof(AREA) * areas);
  449.                 if (a)
  450.                     arealist = a;
  451.                 break;
  452.         }
  453.     }
  454. }
  455.  
  456. static void _pascal set_gates()
  457.  
  458. {
  459.     static char *list[] = {
  460.         "UUCP gateway",
  461.         "Add a domain gate",
  462.         "Delete a domain gate",
  463.         "Change a domain gate",
  464.         "Set gating method",
  465.         NULL
  466.     };
  467.  
  468.     static char *glist[] = {
  469.         "Neither",
  470.         "Domains",
  471.         "Zones",
  472.         "Both",
  473.         NULL
  474.     };
  475.  
  476.     char buffer[128];
  477.     int i, j = 0, k = 0, l = 0, m = 0;
  478.     char **alist;
  479.     ADDRESS *a;
  480.     int f = 0;
  481.  
  482.     while (f != ABORT) {
  483.  
  484.         alist = calloc(domains+1,sizeof (char *));
  485.         for (i = 0; i < domains; i++)
  486.             alist[i] = strdup(show_address(domain_list[i]));
  487.         alist[i] = NULL;
  488.  
  489.         switch(j = menu(20,11,40,15,list,co_hilite,co_normal,j)) {
  490.             case -1:
  491.                 f = ABORT;
  492.                     break;
  493.             case 0:
  494.                 if (uucp_gate.notfound)
  495.                     memset(buffer,0,sizeof buffer);
  496.                 else
  497.                     strcpy(buffer,show_address(uucp_gate));
  498.  
  499.                 gotoxy(20,17);
  500.                 f = bgets(buffer,sizeof buffer - 1, maxx - 20);
  501.                 set_color(co_normal); clrwnd(20,17,maxx,17);
  502.                 if (uucp_gate.domain)
  503.                     free(uucp_gate.domain);
  504.                 uucp_gate = parsenode(buffer);
  505.                 break;
  506.             case 1:
  507.                 domains++;
  508.                 a = realloc(domain_list,sizeof(ADDRESS) * domains);
  509.                 if (a != NULL)
  510.                     domain_list = a;
  511.                 else
  512.                     break;
  513.                 gotoxy(20,19);
  514.                 bputs("Gate to be added:");
  515.                 gotoxy(20,20); memset(buffer,0,sizeof buffer);
  516.                 f = bgets(buffer,sizeof(buffer)-1,maxx-20);
  517.                 domain_list[domains-1] = parsenode(buffer);
  518.                 set_color(co_normal); clrwnd(20,19,maxx,20);
  519.                 break;
  520.             case 2:
  521.                 if ((domain_list == NULL) || (domains < 1))
  522.                     break;
  523.                 k = i = menu(40,15,70,20,alist,co_hilite,co_normal,k);
  524.                 set_color(co_normal); clrwnd(40,15,70,20);
  525.                 if (i < 0)
  526.                     break;
  527.                 if (domain_list[i].domain)
  528.                     free(domain_list[i].domain);
  529.                 while (i+1 < domains) {
  530.                     domain_list[i] = domain_list[i+1];
  531.                     i++;
  532.                 }
  533.                 domains--;
  534.                 free(alist[domains]);
  535.                 break;
  536.             case 3:
  537.                 if ((domain_list == NULL) || (domains < 1))
  538.                     break;
  539.                 l = i = menu(40,15,70,20,alist,co_hilite,co_normal,l);
  540.                 set_color(co_normal); clrwnd(40,15,70,20);
  541.                 if (i < 0)
  542.                     break;
  543.                 strcpy(buffer,show_address(domain_list[i]));
  544.                 if (domain_list[i].domain)
  545.                     free(domain_list[i].domain);
  546.                 gotoxy(20,19);
  547.                 bputs("Gate to change:");
  548.                 gotoxy(20,20);
  549.                 f = bgets(buffer,sizeof buffer - 1, maxx-20);
  550.                 domain_list[i] = parsenode(buffer);
  551.                 set_color(co_normal); clrwnd(20,19,maxx,20);
  552.                 break;
  553.             case 4:
  554.                 m = i = menu(45,16,60,19,glist,co_hilite,co_normal,m);
  555.                 set_color(co_normal); clrwnd(45,16,60,19);
  556.                 if (i > -1)
  557.                     gate = i;
  558.                 break;
  559.         }
  560.         for (i = 0; i < domains; i++)
  561.             free(alist[i]);
  562.         free(alist);
  563.     }
  564.  
  565.     set_color(co_normal);
  566.     clrwnd(20,11,40,15);
  567. }
  568.  
  569. static void _pascal set_quotes()
  570.  
  571. {
  572.     char *list[3];
  573.     int f = 0;
  574.     int i = 0;
  575.  
  576.     list[0] = (char *) malloc(128);
  577.     list[1] = (char *) malloc(256);
  578.     list[2] = NULL;
  579.  
  580.     while (f != ABORT) {
  581.         sprintf(list[0],"Quote string is %s",quotestr);
  582.         sprintf(list[1],"Attribution line is %s",attribline);
  583.  
  584.         switch (i = menu(20,12,maxx,13,list,co_hilite,co_normal,i)) {
  585.             case -1:
  586.                 f = ABORT;
  587.                 break;
  588.             case  0:
  589.                 if (quotestr) free(quotestr);
  590.                 gotoxy(36,wherey()); set_color(co_hilite);
  591.                 f = bgets(list[0]+16,30,maxx-36);
  592.                 quotestr = strdup(list[0]+16);
  593.                 break;
  594.  
  595.             case  1:
  596.                 if (attribline) free(attribline);
  597.                 gotoxy(40,wherey()); set_color(co_hilite);
  598.                 f = bgets(list[1]+20,128,maxx-40);
  599.                 attribline = strdup(list[1]+20);
  600.                 break;
  601.  
  602.         }
  603.     }
  604.     free(list[0]);
  605.     free(list[1]);
  606.  
  607.     set_color(co_normal);
  608.     clrwnd(20,12,maxx,13);
  609. }
  610.  
  611. static void _pascal set_macro()
  612.  
  613. {
  614.     static char *list[] = {
  615.         "Macro key definition",
  616.         "Command redefinition",
  617.         NULL
  618.     };
  619.  
  620.     static char *items[] = {
  621.         "Message reader",
  622.         "Editor",
  623.         NULL
  624.     };
  625.  
  626.     int i= 0,j = 0, i1 = 0;
  627.  
  628.     for (;;) {
  629.         switch(j = menu(20,13,40,14,list,co_hilite,co_normal,j)) {
  630.             case -1:
  631.                 set_color(co_normal);
  632.                 clrwnd(20,13,40,14);
  633.                 return;
  634.             case  0:
  635.                 gotoxy(45,14);
  636.                 bputs("Function to program: ");
  637.                 i = getnum(0,40,0);
  638.                 if (macros[i])
  639.                     free(macros[i]);
  640.                 macros[i] = build_macro();
  641.                 set_color(co_normal);
  642.                 clrwnd(45,14,maxx,14);
  643.                 clrwnd(5,18,maxx,20);
  644.                 break;
  645.  
  646.             case  1:
  647.                 while ((i1 = menu(45,14,60,15,items,co_hilite,co_normal,i1)) != -1)
  648.                     set_key(i1);
  649.                 set_color(co_normal);
  650.                 clrwnd(45,14,60,15);
  651.                 break;
  652.         }
  653.     }
  654. }
  655.  
  656. static unsigned int * _pascal build_macro()
  657.  
  658. {
  659.     unsigned int key = 0;
  660.     int stat = 0;
  661.     unsigned int mac[80];
  662.     unsigned int *t;
  663.     int c=0;
  664.  
  665.     gotoxy(5,18); bputs("Enter macro, press <ESC> twice to finish");
  666.     gotoxy(5,19);
  667.  
  668.     for (;;) {
  669.         video_update();
  670.         key = getkey();
  671.         if (key == ABORT) {
  672.             if (stat) {
  673.                 c--;
  674.                 t = calloc(c+1,sizeof (int));
  675.                 memcpy(t,mac,c * sizeof (int));
  676.                 return(t);
  677.             }
  678.             else
  679.                 stat = 1;
  680.         }
  681.         else
  682.             stat = 0;
  683.  
  684.         mac[c++] = key;
  685.  
  686.         if (key < 32) {
  687.             bputc('^');
  688.             bputc(key+96);
  689.         }
  690.         else if (key & 0xff00)
  691.             bprintf("\\0x%02x",key>>8);
  692.         else
  693.             bputc(key);
  694.  
  695.         if (c == 40)
  696.             gotoxy(5,20);
  697.  
  698.         if (c > 78) {
  699.             t = calloc(c+1,sizeof (int));
  700.             memcpy(t,mac,c * sizeof (int));
  701.             return(t);
  702.         }
  703.     }
  704. }
  705.  
  706. static void _pascal set_key(int t)
  707.  
  708. {
  709.     char **clist;
  710.     int i,j,k = 0;
  711.     unsigned int key;
  712.  
  713.     i = 0;
  714.     while ((t?e_getlabels(i):r_getlabels(i)) != NULL)
  715.         i++;
  716.  
  717.     clist = (char **) calloc(i+1,sizeof(char *));
  718.     for (j = 0; j <= i; j++)                                  /*WRA*/
  719.         clist[j] = t?e_getlabels(j):r_getlabels(j);
  720.  
  721.  
  722.     for (;;) {
  723.         k = menu(62,15,75,20,clist,co_hilite,co_normal,k);
  724.         set_color(co_normal); clrwnd(62,15,75,20);
  725.         if (k > -1) {
  726.             gotoxy(62,15); bputs("Assign "); bputs(clist[k]);
  727.                        bputs(" to: (press the key)");
  728.             gotoxy(62,16);
  729.             video_update();
  730.  
  731.             key = getkey();
  732.             bprintf("0x%4x",key);
  733.  
  734.             if (t)
  735.                 e_assignkey(key,clist[k]);
  736.             else
  737.                 r_assignkey(key,clist[k]);
  738.  
  739.             set_color(co_normal);
  740.             clrwnd(62,15,maxx,16);
  741.         }
  742.         else
  743.             break;
  744.     }
  745.  
  746.     free(clist);
  747. }
  748.  
  749. static void _pascal set_address()
  750.  
  751. {
  752.     static char *list[] = {
  753.         "Delete an alias",
  754.         "Add an alias",
  755.         "Change an alias",
  756.         "Set private net",
  757.         NULL
  758.     };
  759.  
  760.     char buffer[128];
  761.     char **alist;
  762.     int i, i1 = 0, j = 0;
  763.     ADDRESS *a;
  764.     int f = 0;
  765.  
  766.     while (f != ABORT) {
  767.  
  768.         alist = calloc(aliascount+1,sizeof (char *));
  769.         for (i = 0; i < aliascount; i++)
  770.             alist[i] = strdup(show_address(alias[i]));
  771.         alist[i] = NULL;
  772.  
  773.         switch(j = menu(20,14,40,17,list,co_hilite,co_normal,j)) {
  774.             case -1:
  775.                 f = ABORT;
  776.                 break;
  777.             case  0:
  778.                 if (aliascount == 1) {
  779.                     set_color(co_warn);
  780.                     gotoxy(40,10);
  781.                     bputs("Can't delete only alias!");
  782.                     gotoxy(40,11);
  783.                     bputs("press any key to continue");
  784.                     getkey();
  785.                     set_color(co_normal);
  786.                     clrwnd(40,10,80,11);
  787.                     break;
  788.                 }
  789.                 i1 = i = menu(40,15,70,20,alist,co_hilite,co_normal,i1);
  790.                 set_color(co_normal); clrwnd(40,15,70,20);
  791.                 if (i < 0)
  792.                     break;
  793.                 if (alias[i].domain)
  794.                     free(alias[i].domain);
  795.                 while (i+1 < aliascount) {
  796.                     alias[i] = alias[i+1];
  797.                     i++;
  798.                 }
  799.                 aliascount--;
  800.                 free(alist[aliascount]);
  801.                 break;
  802.             case  1:
  803.                 aliascount++;
  804.                 a = realloc(alias,sizeof(ADDRESS) * aliascount);
  805.                 if (a != NULL)
  806.                     alias = a;
  807.                 else
  808.                     break;
  809.                 gotoxy(20,19);
  810.                 bputs("Alias to be added:");
  811.                 gotoxy(20,20); memset(buffer,0,sizeof buffer);
  812.                 f = bgets(buffer,sizeof(buffer)-1,maxx-20);
  813.                 alias[aliascount-1] = parsenode(buffer);
  814.                 set_color(co_normal); clrwnd(20,19,maxx,20);
  815.                 break;
  816.             case  2:
  817.                 j = i = menu(40,15,70,20,alist,co_hilite,co_normal,j);
  818.                 set_color(co_normal); clrwnd(40,15,70,20);
  819.                 if (i < 0)
  820.                     break;
  821.                 strcpy(buffer,show_address(alias[i]));
  822.                 if (alias[i].domain)
  823.                     free(alias[i].domain);
  824.                 gotoxy(20,19);
  825.                 bputs("Alias to change:");
  826.                 gotoxy(20,20);
  827.                 f = bgets(buffer,sizeof buffer - 1, maxx-20);
  828.                 alias[i] = parsenode(buffer);
  829.                 set_color(co_normal); clrwnd(20,19,maxx,20);
  830.                 break;
  831.             case  3:
  832.                 gotoxy(40,15); bputs("Privatenet number: ");
  833.                 pointnet = getnum(0,32767,pointnet);
  834.                 set_color(co_normal); clrwnd(40,15,maxx,15);
  835.                 break;
  836.         }
  837.         for (i = 0; i < aliascount; i++)
  838.             free(alist[i]);
  839.         free(alist);
  840.     }
  841.     clrwnd(20,14,40,17);
  842. }
  843.  
  844. static void _pascal set_video()
  845.  
  846. {
  847.     char *list[5];
  848.     int i, j = 0, k = 0;
  849.  
  850.     static char *vlist[] = {
  851.         "Direct",
  852.         "BIOS",
  853.         "FOSSIL",
  854.         NULL
  855.     };
  856.  
  857.     for (i = 0; i < 4; i++)
  858.         list[i] = (char *) malloc(32);
  859.     list[4] = NULL;
  860.  
  861.     for (;;) {
  862.  
  863.         sprintf(list[0],"Screen width is %d",maxx);
  864.         sprintf(list[1],"Height is %d",maxy);
  865.         strcpy(list[2],"Colors");
  866.         sprintf(list[3],"Video %s",(videomethod==DIRECT)?"direct":(videomethod==BIOS)?"bios":(videomethod==ANSI)?"ERROR":"fossil");
  867.  
  868.         switch (j = menu(20,15,40,18,list,co_hilite,co_normal,j)) {
  869.             case -1:
  870.                 for (i = 0; i < 4; i++)
  871.                     free(list[i]);
  872.                 set_color(co_normal);
  873.                 clrwnd(20,15,40,18);
  874.                 return;
  875.             case 0:
  876.                 gotoxy(36,wherey()); set_color(co_hilite);
  877.                 maxx = getnum(0,1000,maxx);
  878.                 break;
  879.             case 1:
  880.                 gotoxy(30,wherey()); set_color(co_hilite);
  881.                 maxy = getnum(0,1000,maxy);
  882.                 break;
  883.             case 2:
  884.                 set_colors();
  885.                 break;
  886.             case 3:
  887.                 k = i = menu(45,15,55,19,vlist,co_hilite,co_normal,k);
  888.                 set_color(co_normal); clrwnd(45,15,55,18);
  889.                 if (i == -1)
  890.                     return;
  891.                 videomethod = i;
  892.                 video_init();
  893.                 break;
  894.         }
  895.     }
  896.  
  897. }
  898.  
  899. static void _pascal set_colors()
  900.  
  901. {
  902.     static char *clist[] = {
  903.         "Black", "Blue", "Green", "Cyan",
  904.         "Red", "Magenta", "Brown", "White",
  905.         "Dark Grey", "Lt Blue", "Lt Green", "Lt Cyan",
  906.         "Lt Red", "Lt Magenta", "Yellow", "White", NULL
  907.     };
  908.  
  909.     static char *fblist[] = {
  910.         "Foreground", "Background", NULL
  911.     };
  912.  
  913.     static char *tlist[] = {
  914.         "Normal", "Warnings", "Quotes",
  915.         "Block Anchor", "Information",
  916.         "Highlight", NULL
  917.     };
  918.  
  919.     int which = 0;
  920.     int fb = 0;
  921.     int co = 0;
  922.     int mask = 0;
  923.  
  924.  
  925.     for (;;) {
  926.         gotoxy(40,5); set_color(co_normal);
  927.         bputs("Normal text");
  928.         gotoxy(40,6); set_color(co_warn);
  929.         bputs("Warning messages");
  930.         gotoxy(40,7); set_color(co_quote);
  931.         bputs("Quoted text");
  932.         gotoxy(40,8); set_color(co_block);
  933.         bputs("Block anchor");
  934.         gotoxy(40,9); set_color(co_info);
  935.         bputs("Information");
  936.         gotoxy(40,10); set_color(co_hilite);
  937.         bputs("Highlighted text");
  938.         set_color(co_normal);
  939.  
  940.         which = menu(40,17,52,22,tlist,co_hilite,co_normal,which);
  941.         if (which == -1) {
  942.             set_color(co_normal);
  943.             clrwnd(40,5,60,10);
  944.             clrwnd(40,17,52,22);
  945.             return;
  946.         }
  947.  
  948.         do {
  949.             fb = menu(55,18,65,19,fblist,co_hilite,co_normal,fb);
  950.             if (fb != -1) {
  951.                 co = menu(67,19,77,24,clist,co_hilite,co_normal,co);
  952.                 if (co != -1) {
  953.                     if (fb) {
  954.                         co <<= 4;
  955.                         mask = 0x0f;
  956.                     }
  957.                     else
  958.                         mask = 0xf0;
  959.  
  960.                     switch (which) {
  961.                         case 0: co_normal &= mask;
  962.                             co_normal |= co;
  963.                             break;
  964.                         case 1: co_warn &= mask;
  965.                             co_warn |= co;
  966.                             break;
  967.                         case 2: co_quote &= mask;
  968.                             co_quote |= co;
  969.                             break;
  970.                         case 3: co_block &= mask;
  971.                             co_block |= co;
  972.                             break;
  973.                         case 4: co_info &= mask;
  974.                             co_info |= co;
  975.                             break;
  976.                         case 5: co_hilite &= mask;
  977.                             co_hilite |= co;
  978.                             break;
  979.                     }
  980.                 }
  981.                 set_color(co_normal);
  982.                 clrwnd(55,18,77,24);
  983.             }
  984.             else {
  985.                 set_color(co_normal);
  986.                 clrwnd(55,18,65,19);
  987.             }
  988.  
  989.             gotoxy(40,5); set_color(co_normal);
  990.             bputs("Normal text");
  991.             gotoxy(40,6); set_color(co_warn);
  992.             bputs("Warning messages");
  993.             gotoxy(40,7); set_color(co_quote);
  994.             bputs("Quoted text");
  995.             gotoxy(40,8); set_color(co_block);
  996.             bputs("Block anchor");
  997.             gotoxy(40,9); set_color(co_info);
  998.             bputs("Information");
  999.             gotoxy(40,10); set_color(co_hilite);
  1000.             bputs("Highlighted text");
  1001.             set_color(co_normal);
  1002.  
  1003.         } while (fb != -1);
  1004.     }
  1005. }
  1006.  
  1007. static void _pascal set_misc()
  1008.  
  1009. {
  1010.     char *list[3];
  1011.     int i;
  1012.     int f = 0;
  1013.     int j = 0;
  1014.  
  1015.     for (i = 0; i < 2; i++)
  1016.         list[i] = (char *) malloc(128);
  1017.     list[2] = NULL;
  1018.  
  1019.     while (f != ABORT) {
  1020.         sprintf(list[0],"Your name is %s",username);
  1021.         sprintf(list[1],"Origin line is %s",origin);
  1022.  
  1023.         switch (j = menu(20,16,maxx,17,list,co_hilite,co_normal,j)) {
  1024.             case -1:
  1025.                 f = ABORT;
  1026.                 break;
  1027.             case  0:
  1028.                 if (username) free(username);
  1029.                 gotoxy(33,wherey()); set_color(co_hilite);
  1030.                 f = bgets(list[0]+13,80,maxx-33);
  1031.                 username = strdup(list[0]+13);
  1032.                 break;
  1033.             case  1:
  1034.                 if (origin) free(origin);
  1035.                 gotoxy(35,wherey()); set_color(co_hilite);
  1036.                 f = bgets(list[1]+15,65,maxx-35);
  1037.                 origin = strdup(list[1]+15);
  1038.                 break;
  1039.  
  1040.         }
  1041.     }
  1042.  
  1043.     for (i = 0; i < 3; i++)
  1044.         free(list[i]);
  1045.  
  1046.     set_color(co_normal);
  1047.     clrwnd(20,16,maxx,17);
  1048. }
  1049.  
  1050. static void _pascal save_set()
  1051.  
  1052. {
  1053.     FILE *fp;
  1054.     int i;
  1055.     char *s;
  1056.     time_t ntime;
  1057.     unsigned int key;
  1058.     unsigned int *keys;
  1059.  
  1060.     static char *colors[] = {
  1061.         "bla", "blu", "gre", "cya",
  1062.         "red", "mag", "yel", "whi"
  1063.     };
  1064.  
  1065.     if (*cfgfile == '+')
  1066.         fp = fopen(cfgfile+1,"a");
  1067.     else
  1068.         fp = fopen(cfgfile,"w");
  1069.  
  1070.     time(&ntime);
  1071.  
  1072.     fputs("\n; msged " VERSION " config file\n",fp);
  1073.     fputs("; generated ",fp);
  1074.     fputs(ctime(&ntime),fp);
  1075.  
  1076.     fputs("\n; who you are\n\n",fp);
  1077.  
  1078.     fprintf(fp,"name %s\n\n", username);
  1079.  
  1080.     fputs("; where you are\n\n",fp);
  1081.  
  1082.     for (i = 0; i < aliascount; i++)
  1083.         fprintf(fp,"address %s\n",show_address(alias[i]));
  1084.  
  1085.     if (pointnet)
  1086.         fprintf(fp,"privatenet %d\n",pointnet);
  1087.  
  1088.     fputs("\n; default file names\n\n",fp);
  1089.  
  1090.     if (quickbbs) {
  1091.         if (*(quickbbs+strlen(quickbbs)-1) == '\\')
  1092.             *(quickbbs+strlen(quickbbs)-1) = '\0';
  1093.         fprintf(fp,"quickbbs %s\n",quickbbs);
  1094.         strcat(quickbbs,"\\");
  1095.     }
  1096.  
  1097.     fprintf(fp,"outfile %s\n",outfile);
  1098.     fprintf(fp,"lastread %s\n",lastread);
  1099.     fprintf(fp,"tosslog %s\n",confmail);
  1100.     fprintf(fp,"userlist %s,%s\n\n",fidolist,userlist);
  1101.  
  1102.     fputs("; how you like your quotes\n\n",fp);
  1103.  
  1104.     fprintf(fp,"attribution %s\n",attribline?attribline:"");
  1105.     fputs("quote ",fp);
  1106.     s = quotestr;
  1107.     while (*s) {
  1108.         if (*s == ' ')
  1109.             fputc('_',fp);
  1110.         else
  1111.             fputc(*s,fp);
  1112.         s++;
  1113.     }
  1114.  
  1115.     fputs("\n\n; switch settings\n\n",fp);
  1116.  
  1117.     if (!softcr) fputs("no softcr\n",fp);
  1118.     if (!seenbys) fputs("no seen-bys\n",fp);
  1119.     if (!tearline) fputs("no tearline\n",fp);
  1120.     if (!shownotes) fputs("no shownotes\n",fp);
  1121.     if (!confirmations) fputs("no confirm\n",fp);
  1122.     if (!msgids) fputs("no msgids\n",fp);
  1123.     if (!stripnotes) fputs("no strip\n",fp);
  1124.     if (!opusdate) fputs("no opusdate\n",fp);
  1125.  
  1126.     fputs("\n; video settings\n\n",fp);
  1127.  
  1128.     fprintf(fp,"video %s\n",(videomethod==DIRECT)?"direct":(videomethod==BIOS)?"bios":(videomethod==ANSI)?"ansi":"fossil");
  1129.  
  1130.     fprintf(fp,"color normal %s%c/%s%c\n",
  1131.         colors[co_normal & 0x07],
  1132.         (co_normal & 0x08)?'+':' ',
  1133.         colors[(co_normal >> 4) & 0x07],
  1134.         (co_normal & 0x80)?'+':' ');
  1135.  
  1136.     fprintf(fp,"color warn %s%c/%s%c\n",
  1137.         colors[co_warn & 0x07],
  1138.         (co_warn & 0x08)?'+':' ',
  1139.         colors[(co_warn >> 4) & 0x07],
  1140.         (co_warn & 0x80)?'+':' ');
  1141.  
  1142.     fprintf(fp,"color quote %s%c/%s%c\n",
  1143.         colors[co_quote & 0x07],
  1144.         (co_quote & 0x08)?'+':' ',
  1145.         colors[(co_quote >> 4) & 0x07],
  1146.         (co_quote & 0x80)?'+':' ');
  1147.  
  1148.     fprintf(fp,"color block %s%c/%s%c\n",
  1149.         colors[co_block & 0x07],
  1150.         (co_block & 0x08)?'+':' ',
  1151.         colors[(co_block >> 4) & 0x07],
  1152.         (co_block & 0x80)?'+':' ');
  1153.  
  1154.     fprintf(fp,"color info %s%c/%s%c\n",
  1155.         colors[co_info & 0x07],
  1156.         (co_info & 0x08)?'+':' ',
  1157.         colors[(co_info >> 4) & 0x07],
  1158.         (co_info & 0x80)?'+':' ');
  1159.  
  1160.     fprintf(fp,"color hilite %s%c/%s%c\n",
  1161.         colors[co_hilite & 0x07],
  1162.         (co_hilite & 0x08)?'+':' ',
  1163.         colors[(co_hilite >> 4) & 0x07],
  1164.         (co_hilite & 0x80)?'+':' ');
  1165.  
  1166.     fputs("\n; margins and tabs\n\n",fp);
  1167.  
  1168.     fprintf(fp,"right %d\nquoteright %d\ntabsize %d\n",
  1169.         rm,qm,tabsize);
  1170.  
  1171.     fputs("\n; all about your areas\n\n",fp);
  1172.  
  1173.     for (i = 0; i < areas; i++) {
  1174.         if (arealist[i].msgtype == FIDO) {
  1175.             if (arealist[i].local) {
  1176.                 fputs("fido local ",fp);
  1177.                 if (arealist[i].priv) fputc('p',fp);
  1178.                 if (arealist[i].hold) fputc('h',fp);
  1179.                  if (arealist[i].direct) fputc('d',fp);
  1180.                 if (arealist[i].crash) fputc('c',fp);
  1181.                 if (arealist[i].killsent) fputc('k',fp);
  1182.                 fprintf(fp," \"%s\" %s\n",arealist[i].description,arealist[i].path);
  1183.             }
  1184.  
  1185.             if (arealist[i].netmail) {
  1186.                 fputs("fido mail ",fp);
  1187.                 if (arealist[i].priv) fputc('p',fp);
  1188.                 if (arealist[i].hold) fputc('h',fp);
  1189.                 if (arealist[i].direct) fputc('d',fp);
  1190.                 if (arealist[i].crash) fputc('c',fp);
  1191.                 if (arealist[i].killsent) fputc('k',fp);
  1192.                 fprintf(fp," \"%s\" %s\n",arealist[i].description,arealist[i].path);
  1193.             }
  1194.  
  1195.             if (arealist[i].echomail) {
  1196.                 fputs("fido echo ",fp);
  1197.                 if (arealist[i].priv) fputc('p',fp);
  1198.                 if (arealist[i].hold) fputc('h',fp);
  1199.                 if (arealist[i].direct) fputc('d',fp);
  1200.                 if (arealist[i].crash) fputc('c',fp);
  1201.                 if (arealist[i].killsent) fputc('k',fp);
  1202.                 fprintf(fp," \"%s\" %s %s\n",arealist[i].description,arealist[i].path, arealist[i].tag);
  1203.             }
  1204.  
  1205.             if (arealist[i].news) {
  1206.                 fputs("fido news ",fp);
  1207.                 if (arealist[i].priv) fputc('p',fp);
  1208.                 if (arealist[i].hold) fputc('h',fp);
  1209.                 if (arealist[i].direct) fputc('d',fp);
  1210.                 if (arealist[i].crash) fputc('c',fp);
  1211.                 if (arealist[i].killsent) fputc('k',fp);
  1212.                 fprintf(fp," \"%s\" %s\n",arealist[i].description,arealist[i].path);
  1213.             }
  1214.  
  1215.             if (arealist[i].uucp) {
  1216.                 fputs("fido uucp ",fp);
  1217.                 if (arealist[i].priv) fputc('p',fp);
  1218.                 if (arealist[i].hold) fputc('h',fp);
  1219.                 if (arealist[i].direct) fputc('d',fp);
  1220.                 if (arealist[i].crash) fputc('c',fp);
  1221.                 if (arealist[i].killsent) fputc('k',fp);
  1222.                 fprintf(fp," \"%s\" %s\n",arealist[i].description,arealist[i].path);
  1223.             }
  1224.         }
  1225.         if (arealist[i].msgtype == QUICK) {
  1226.             if (arealist[i].local) {
  1227.                 fputs("quick local ",fp);
  1228.                 if (arealist[i].priv) fputc('p',fp);
  1229.                 if (arealist[i].hold) fputc('h',fp);
  1230.                 if (arealist[i].direct) fputc('d',fp);
  1231.                 if (arealist[i].crash) fputc('c',fp);
  1232.                 if (arealist[i].killsent) fputc('k',fp);
  1233.                 fprintf(fp," \"%s\" %d\n",arealist[i].description,arealist[i].board);
  1234.             }
  1235.  
  1236.             if (arealist[i].netmail) {
  1237.                 fputs("quick mail ",fp);
  1238.                 if (arealist[i].priv) fputc('p',fp);
  1239.                 if (arealist[i].hold) fputc('h',fp);
  1240.                 if (arealist[i].direct) fputc('d',fp);
  1241.                 if (arealist[i].crash) fputc('c',fp);
  1242.                 if (arealist[i].killsent) fputc('k',fp);
  1243.                 fprintf(fp," \"%s\" %d\n",arealist[i].description,arealist[i].board);
  1244.             }
  1245.  
  1246.             if (arealist[i].echomail) {
  1247.                 fputs("quick echo ",fp);
  1248.                 if (arealist[i].priv) fputc('p',fp);
  1249.                 if (arealist[i].hold) fputc('h',fp);
  1250.                 if (arealist[i].direct) fputc('d',fp);
  1251.                 if (arealist[i].crash) fputc('c',fp);
  1252.                 if (arealist[i].killsent) fputc('k',fp);
  1253.                 fprintf(fp," \"%s\" %d %s\n",arealist[i].description,arealist[i].board, arealist[i].tag);
  1254.             }
  1255.  
  1256.             if (arealist[i].news) {
  1257.                 fputs("quick news ",fp);
  1258.                 if (arealist[i].priv) fputc('p',fp);
  1259.                 if (arealist[i].hold) fputc('h',fp);
  1260.                 if (arealist[i].direct) fputc('d',fp);
  1261.                 if (arealist[i].crash) fputc('c',fp);
  1262.                 if (arealist[i].killsent) fputc('k',fp);
  1263.                 fprintf(fp," \"%s\" %d\n",arealist[i].description,arealist[i].board);
  1264.             }
  1265.  
  1266.             if (arealist[i].uucp) {
  1267.                 fputs("quick uucp ",fp);
  1268.                 if (arealist[i].priv) fputc('p',fp);
  1269.                 if (arealist[i].hold) fputc('h',fp);
  1270.                 if (arealist[i].direct) fputc('d',fp);
  1271.                 if (arealist[i].crash) fputc('c',fp);
  1272.                 if (arealist[i].killsent) fputc('k',fp);
  1273.                 fprintf(fp," \"%s\" %d\n",arealist[i].description,arealist[i].board);
  1274.             }
  1275.         }
  1276.     }
  1277.  
  1278.     fputs("\n; uucp and domain gates\n\n",fp);
  1279.  
  1280.     if (!uucp_gate.notfound)
  1281.         fprintf(fp,"uucp %s\n\n",show_address(uucp_gate));
  1282.  
  1283.     for (i = 0; i < domains; i++)
  1284.         fprintf(fp,"domain %s\n\n",show_address(domain_list[i]));
  1285.  
  1286.     switch (gate) {
  1287.         case GDOMAINS:    fputs("gate domains\n",fp);
  1288.                 break;
  1289.         case GZONES:    fputs("gate zones\n",fp);
  1290.                 break;
  1291.         case BOTH:        fputs("gate both\n",fp);
  1292.                 break;
  1293.         case 0:         fputs("gate none\n",fp);
  1294.                 break;
  1295.     }
  1296.  
  1297.     fputs("\n; your origin line\n\n",fp);
  1298.  
  1299.     fprintf(fp,"origin %s\n",origin);
  1300.  
  1301.     fputs("\n; message reader key definitions\n\n",fp);
  1302.  
  1303.     for (key = 0; key < 256; key++)
  1304.         if (r_getbind(key) != NULL)
  1305.             fprintf(fp,"readkey 0x%04x %s\n",key,r_getbind(key));
  1306.  
  1307.     for (key = 0; key < 256; key++)
  1308.         if (r_getbind(key<<8) != NULL)
  1309.             fprintf(fp,"readkey 0x%02x00 %s\n",key,r_getbind(key<<8));
  1310.  
  1311.     fputs("\n; editor key definitions\n\n",fp);
  1312.  
  1313.     for (key = 0; key < 256; key++)
  1314.         if (e_getbind(key) != NULL)
  1315.             fprintf(fp,"editkey 0x%04x %s\n",key,e_getbind(key));
  1316.  
  1317.     for (key = 0; key < 256; key++)
  1318.         if (e_getbind(key<<8) != NULL)
  1319.             fprintf(fp,"editkey 0x%02x00 %s\n",key,e_getbind(key<<8));
  1320.  
  1321.     fputs("\n; function key definitions\n\n",fp);
  1322.  
  1323.     for (i = 0; i < 40; i++) {
  1324.         if (macros[i] != NULL) {
  1325.             fprintf(fp,"function %d ",i);
  1326.             keys = macros[i];
  1327.             while (*keys) {
  1328.                 if (*keys < 32) {
  1329.                     fputc('^',fp);
  1330.                     fputc(*keys+96,fp);
  1331.                 }
  1332.                 else if (*keys & 0xff00)
  1333.                     fprintf(fp,"\\0x%02x",*keys>>8);
  1334.                 else
  1335.                     fputc(*keys,fp);
  1336.                 keys++;
  1337.             }
  1338.             fputc('\n',fp);
  1339.         }
  1340.     }
  1341.  
  1342.     fclose(fp);
  1343. }
  1344.  
  1345.  
  1346. static void _pascal edit_area(AREA *a)
  1347.  
  1348. {
  1349.     char *fields[7];
  1350.  
  1351.     static char *slist[] = {
  1352.         "Fido (.msg)", "QuickBBS   ", NULL
  1353.     };
  1354.  
  1355.     static char *tlist[] = {
  1356.         "local  ",
  1357.         "net    ",
  1358.         "echo   ",
  1359.         "news   ",
  1360.         "uucp   ",
  1361.         NULL
  1362.     };
  1363.  
  1364.     int i = 0,j;
  1365.     int f2 = 0;
  1366.  
  1367.     fields[6] = NULL;
  1368.  
  1369.     for (;;) {
  1370.         fields[0] = calloc(256,sizeof(char));
  1371.         sprintf(fields[0],"Description:     %s",a->description?a->description:"");
  1372.         fields[1] = calloc(128,sizeof(char));
  1373.  
  1374.         if (a->msgtype == FIDO) {
  1375.             sprintf(fields[1],"Path:            %s",a->path?a->path:"");
  1376.             fields[3] = strdup("Message Base:    Fido (.msg)");
  1377.         }
  1378.         else {
  1379.             sprintf(fields[1],"Board Number:    %d",a->board);
  1380.             fields[3] = strdup("Message Base:    QuickBBS");
  1381.         }
  1382.  
  1383.         fields[2] = strdup("Attributes:              ");
  1384.         *(fields[2] + 17) = '\0';
  1385.         if (a->priv) strcat(fields[2],"p");
  1386.         if (a->hold) strcat(fields[2],"h");
  1387.         if (a->direct) strcat(fields[2],"d");
  1388.         if (a->crash) strcat(fields[2],"c");
  1389.         if (a->killsent) strcat(fields[2],"k");
  1390.  
  1391.         fields[4] = calloc(128,sizeof(char));
  1392.         strcpy(fields[4],  "Type of Message: ");
  1393.         if (a->local) {
  1394.             strcat(fields[4],"local ");
  1395.             *(tlist[0] + 6) = 0xfb;
  1396.         }
  1397.         else
  1398.             *(tlist[0] + 6) = ' ';
  1399.  
  1400.         if (a->netmail) {
  1401.             strcat(fields[4],"net ");
  1402.             *(tlist[1] + 6) = 0xfb;
  1403.         }
  1404.         else
  1405.             *(tlist[1] + 6) = ' ';
  1406.  
  1407.  
  1408.         if (a->echomail) {
  1409.             *(tlist[2] + 6) = 0xfb;
  1410.             fields[5] = calloc(128,sizeof(char));
  1411.             sprintf(fields[5],"Echomail Tag:    %s",a->tag?a->tag:"");
  1412.             strcat(fields[4],"echo ");
  1413.         }
  1414.         else {
  1415.             *(tlist[2] + 6) = ' ';
  1416.             fields[5] = NULL;
  1417.         }
  1418.  
  1419.         if (a->news) {
  1420.             strcat(fields[4],"news ");
  1421.             *(tlist[3] + 6) = 0xfb;
  1422.         }
  1423.         else
  1424.             *(tlist[3] + 6) = ' ';
  1425.  
  1426.         if (a->uucp) {
  1427.             strcat(fields[4],"uucp");
  1428.             *(tlist[4] + 6) = 0xfb;
  1429.         }
  1430.         else
  1431.             *(tlist[4] + 6) = ' ';
  1432.  
  1433.         i = menu(5,18,maxx,maxy,fields,co_hilite,co_normal,i);
  1434.  
  1435.         switch (i) {
  1436.             case 0: if (a->description) free(a->description);
  1437.                 gotoxy(22,wherey()); set_color(co_hilite);
  1438.                 bgets(fields[0]+17,80,min(80,maxx-22));
  1439.                 a->description = strdup(fields[0]+17);
  1440.                 break;
  1441.  
  1442.             case 1: if (a->msgtype == FIDO) {
  1443.                     if (a->path) free(a->path);
  1444.                     gotoxy(22,wherey()); set_color(co_hilite);
  1445.                     bgets(fields[1]+17,80,min(80,maxx-22));
  1446.                     a->path = strdup(fields[1]+17);
  1447.                 }
  1448.                 else if (a->msgtype == QUICK) {
  1449.                     gotoxy(22,wherey()); set_color(co_hilite);
  1450.                     a->board = getnum(1,200,a->board);
  1451.                 }
  1452.                 break;
  1453.  
  1454.             case 2: box(14,14,27,20,1);
  1455.                 set_attrib(15,15,26,19,a);
  1456.                 clrwnd(14,14,27,20);
  1457.                 break;
  1458.  
  1459.             case 3: box(15,15,27,18,1);
  1460.                 a->msgtype = menu(16,16,26,17,slist,co_hilite,co_normal,a->msgtype);
  1461.                 clrwnd(15,15,27,18);
  1462.                 break;
  1463.  
  1464.             case 4: box(14,14,22,20,1);
  1465.                 while ((f2 = menu(15,15,21,19,tlist,co_hilite,co_normal,f2)) != -1) {
  1466.                     switch (f2) {
  1467.                         case 0: *(tlist[0]+6) = (char) (((a->local = !a->local) != 0)?0xfb:0x20); break;
  1468.                         case 1: *(tlist[1]+6) = (char) (((a->netmail = !a->netmail) != 0)?0xfb:0x20); break;
  1469.                         case 2: *(tlist[2]+6) = (char) (((a->echomail = !a->echomail) != 0)?0xfb:0x20); break;
  1470.                         case 4: *(tlist[4]+6) = (char) (((a->uucp = !a->uucp) != 0)?0xfb:0x20); break;
  1471.                         case 3: *(tlist[3]+6) = (char) (((a->news = !a->news) != 0)?0xfb:0x20); break;
  1472.                     }
  1473.                 }
  1474.                 clrwnd(14,14,22,20);
  1475.                 break;
  1476.  
  1477.             case 5: if (a->echomail) {
  1478.                     if (a->tag) free(a->tag);
  1479.                     gotoxy(22,wherey()); set_color(co_hilite);
  1480.                     bgets(fields[5]+17,64,min(64,maxx-22));
  1481.                     a->tag = strdup(fields[5]+17);
  1482.                 }
  1483.                 break;
  1484.         }
  1485.  
  1486.         for (j = 0; j < 6; j++)
  1487.             if (fields[j]) free(fields[j]);
  1488.  
  1489.         if (i == -1) {
  1490.             set_color(co_normal);
  1491.             clrwnd(5,18,maxx,maxy);
  1492.             return;
  1493.         }
  1494.     }
  1495. }
  1496. 
  1497.