home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / BBS / MISC / HSRC_117.ZIP / HEADEDIT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-27  |  19.2 KB  |  740 lines

  1. /* XBBS Message Base Reader (C BASES ONLY) for SYSOPS (HeadEdit) */
  2.  
  3. #include <msgg.h>
  4. #include <twindow.h>
  5. #include <keys.h>
  6. #include "headid.h"
  7.  
  8. char msk78[]="______________________________________________________________________________";
  9. #define msk35 msk78+43
  10. #define mskst msk35+33
  11. #define mskzip msk35+30
  12. #define mskcit msk35+11
  13. #define msk1 msk78+77
  14. #define msk3 msk35+32
  15. #define msk5 msk35+30
  16. #define msk6 msk35+29
  17. #define msk47 msk78+31
  18. #define msk51 msk78+28
  19. #define msk65 msk78+13
  20. #define msk19 msk78+59
  21. #define msk58 msk78+20
  22. #define msk10 msk78+68
  23.  
  24. #define QUOTE    1
  25. #define TEXTFILE 0
  26. #define EDITIT   2
  27. #define PRINTIT  4
  28. #define ECHO2NET 8
  29. #define NOQUOTE  16
  30. #define NOINFO     64
  31. #define INFOONLY 128
  32.  
  33. #define nopause nopause_msg
  34. #define pause pause_msg
  35.  
  36. extern void   pascal CLEAROVERLAY(void);
  37. extern char * pascal get_string (char *text,char len,char *deflt,char type);
  38. extern void   pascal show_header (char quick);
  39. extern void   pascal do_spawn (char *dostring);
  40. extern void      pascal notepad(void);
  41. extern int    pascal bomb_who (struct _bomb_addr *bomb_addr);
  42. extern int    pascal fill_in_carbon (struct _carbon *carbon);
  43. extern int    pascal exec (void);
  44. extern word   pascal get_abunch (word messno,char type,int direction,char *str);
  45. extern int    cdecl  ffprintf(int,char *,...);
  46. extern char * pascal fgetsx(char *,int,int);
  47. extern word   pascal list_areas(void);
  48. extern void   pascal killjunk(void);
  49. extern char   pascal isitme (char);
  50. extern void   pascal import_mail(void);
  51. extern void   pascal export_mail(void);
  52. extern void   pascal node_lister (void);
  53. extern int    pascal nodelist (struct nodeidx *,char);
  54. extern void   pascal make_file (void);
  55. extern char * pascal rstrip (char *);
  56. extern word   pascal list_mess(void);
  57. extern char * pascal lstrip (char *);
  58. extern char * pascal convertstring (char *a);
  59. extern char * pascal saydate (struct date*);
  60. extern char * pascal saytime (struct time*);
  61. extern char * pascal getdttm (void);
  62. extern void   pascal right (char *,char *,int);
  63. extern void   pascal mid (char *,char *,int,int);
  64. extern void   pascal info (void);
  65. extern char * pascal fidodate (void);
  66. extern char * pascal stripcr (char *);
  67. extern void   pascal left (char *,char *,int);
  68. extern int    pascal export (char *,char,char,char *,char *,void *);
  69. extern char   pascal spawnit (char *);
  70. extern int    cdecl  break_handler (void);
  71. extern int    pascal edit_mess (char);
  72. extern word   pascal check_area (word);
  73. extern void   pascal get_mess (char);
  74. extern void   pascal put_mess (void);
  75. extern word   pascal select_mess (void);
  76. extern word   pascal select_area (void);
  77. extern void   pascal read_control (char *,char *);
  78. extern char * pascal get_qstring (char *);
  79. extern word   pascal find_filearea (void);
  80. extern void   pascal select_name (void);
  81. extern char * pascal mci (char *);
  82. extern void   pascal printer (void);
  83. extern int    pascal doswap (char far *, char far *);
  84. extern void   pascal load_lastread(void);
  85. extern void   pascal save_lastread(void);
  86. extern void   pascal switch_dirs(void);
  87. extern void   pascal strip_seenbys (char *);
  88.  
  89. extern void   pascal print_clock(void);
  90. extern void   pascal get_rid(void);
  91. extern void   pascal strip_blanklines(char *);
  92. extern char * pascal write_line (char **text,word linelen,char ctla);
  93. extern void   pascal check_pos (void);
  94. extern void   pascal bell (void);
  95. extern void   pascal clrr (void);
  96. extern char * pascal area_attr (void);
  97. extern char * pascal quick_attr (void);
  98. extern word   pascal put_text(char far*,char *,char *,struct ffblk *,char *);
  99. extern word   pascal search (char,char);
  100. extern void   pascal update_read (void);
  101. extern void   pascal move_mess (void);
  102. extern void   pascal post_mess (char *);
  103. extern void   pascal edit_text (void);
  104. extern void   pascal scan_mess (void);
  105. extern word   pascal thread (char,char *);
  106. extern char far *    pascal get_text (void);
  107. extern int    pascal display (word *,char);
  108. extern void   pascal read_mess (char,char);
  109. extern void   pascal cls(int,int,int,int,int);
  110. extern void   pascal select_address (void);
  111. extern void   pascal get_origin (void);
  112. extern char * pascal unpack_msg (char **hold);
  113. extern char * pascal pack_msg (char *hold);
  114. extern void   pascal load_areas (void);
  115. extern int    pascal set_header (char,char *,char *,char *);
  116.  
  117. /* In this module */
  118.  
  119. void   pascal menu (void);
  120. void   cdecl  deinit(void);
  121. int    pascal find_area (void);
  122.  
  123. extern unsigned _Cdecl _stklen = 20480;    /* Stack length */
  124.  
  125. char dest[6];        /* Destination node                              */
  126. char orig[6];        /* Origination node number                       */
  127. char cost[6];        /* Unit cost charged to send the message         */
  128. char orig_net[6];    /* Origination network number                    */
  129. char dest_net[6];    /* Destination network number                    */
  130. char d_zone[6];      /* Destination zone                              */
  131. char o_zone[6];      /* Origination zone                              */
  132. char d_point[6];     /* Destination point                             */
  133. char o_point[6];     /* Origination point                             */
  134.  
  135. /* References to window library */
  136.  
  137. extern int helpkey;
  138. extern WINDOW *ewnd;
  139.  
  140. /* Structures */
  141.  
  142. struct _carbon {
  143.     char name[36];
  144.     word zone;
  145.     word net;
  146.     word node;
  147.     word point;
  148.     int  cost;
  149. };
  150. struct _bomb_addr {
  151.     word zone;
  152.     word net;
  153. };
  154. struct _address {
  155.     word zone;
  156.     word net;
  157.     word node;
  158.     word point;
  159.     char domain[37];
  160. };
  161.  
  162. struct _marea {
  163.     char *name;
  164.     word attr;
  165.     word max;
  166.     word number;
  167.     char thisaddr;
  168.     char thisname;
  169. };
  170.  
  171. char nobell=1;
  172. char lastmsgid[80]="";
  173. char lastreply[80]="";
  174. char replyid[80]="";
  175. char urgent_text[79]="";
  176. char wrapit=0;
  177. char usedefault=0;
  178. struct _address *address[50];
  179. signed char noaddress;
  180. struct _address curaddress;
  181. char origin[60]="";
  182. char path[99]="";
  183. char autocheck=1;
  184. WINDOW *wnd1=NULL;
  185. WINDOW *wnd4=NULL;
  186. WINDOW *wnd6=NULL;
  187. char buffer[514];
  188. struct _xmsg msg;
  189. struct _xmsg msg2;
  190. char ctla=0;
  191. long nidxsize;
  192. struct nodeidx huge *nidx=NULL;
  193. char huge **line;
  194. word higharea=0;
  195. word areano=0;
  196. word messno=0;
  197. word nomess=0;
  198. word userno=0;
  199. char notrack=0;
  200. struct _marea huge *marea;
  201. struct _marea huge *currarea;
  202. struct _marea nullarea;
  203. word maxareas=0;
  204. word totalareas=0;
  205. word netboard=0;
  206. word altboard=0;
  207. char to_domain[37]="";
  208. char *ansieditor=NULL;
  209. char *template=NULL;
  210. char *wrapcall=NULL;
  211. char *editor=NULL;
  212. char *texteditor=NULL;
  213. char filename[127];
  214. char textname[127];
  215. char *flsearch=NULL;
  216. char filepath[79]="";
  217. char *alias[50];
  218. char *nodepath=NULL;
  219. signed char noalias=0;
  220. char name[36];
  221. word defaultattr=MSGLOCAL+MSGPRIVATE+MSGKILL;
  222. word *lastread;
  223. word posts=0;
  224. char nodirs=0;
  225. char *dirs[50];
  226. char *fkey[10];
  227. char makeinfo=0;
  228. char readtextcolor=11;
  229. char readtextback=0;
  230. char readheadcolor=3;
  231. char readheadback=0;
  232. char readstatcolor=0;
  233. char readstatback=3;
  234. word maxlines=10240;
  235. char filenamer[66]="TEMP";
  236. char quotestring[12]=">";
  237. char pagelength=66;
  238. char topmargin=6;
  239. char bottommargin=6;
  240. char leftmargin=6;
  241. char textwidth=68;
  242. char beforeheader[12]="";
  243. char afterheader[12]="";
  244. char aftertext[48]="";
  245. char afterprinting[12]="\xc";
  246. char *spawnview=NULL;
  247. char swapname[64]="HeadSwap.$#$";
  248. char useswapdisk='C';
  249. char LIMEMS=0;
  250. char swap=0;
  251. char screenwidth=80;
  252. char wasdisplay=0;
  253. char *before_quote=NULL;
  254. char *after_before=NULL;
  255. char *after_quote=NULL;
  256. unsigned int textsize,codesize;
  257. unsigned int packsize=2048;
  258. char hilite=0;
  259. char assocfile[133]="";
  260. char notefile[133]="MSGTMP";
  261. char nopt=0;
  262. char nointl=0;
  263. char noclock=0;
  264. char slowprint;
  265. char inbound[80]="";
  266. char outbound[80]="";
  267. char ismail=0;
  268. char msgareas[98]="MSGAREAS.XBS";
  269. char domail=0;
  270.  
  271. extern char usemouse;
  272. extern word vbase;
  273. extern word maxx;
  274. extern word maxy;
  275. extern char current_color;
  276. extern word videomethod;
  277.  
  278. char kludge_fore=2;
  279. char kludge_back=0;
  280. char quote_fore=9;
  281. char quote_back=0;
  282. char tear_fore=1;
  283. char tear_back=0;
  284. char orig_fore=6;
  285. char orig_back=0;
  286. char skipdeleted=0;
  287.  
  288.  
  289.  
  290. void cdecl main (int argc,char *argv[]) {
  291.  
  292.     union REGS r;
  293.  
  294.     vbase=(vmode()==7 ? 0xb000: 0xb800);
  295.     fputs("\x1b[2J\x1b[0mLoading help...\n",stderr);
  296.     ctrlbrk(break_handler);
  297.     load_help(searchpath("headedit.hlp"));
  298. #ifdef __80X86__
  299.     fputs("80x86 version  ",stdout);
  300. #endif
  301.     printf("Version %s",PID_ID);
  302.  
  303.     curaddress.zone=0;
  304.     curaddress.net=0;
  305.     curaddress.node=0;
  306.     curaddress.point=0;
  307.     *curaddress.domain=0;
  308.  
  309.     atexit(deinit);
  310.     if (argc==2) read_control(argv[1],"");
  311.     else if(argc>=3) read_control(argv[1],argv[2]);
  312.     else read_control(searchpath("HeadEdit.CFG"),"");
  313.  
  314.     r.h.ah = 0x0f;
  315.     int86(0x10,&r,&r);
  316.     if (maxx == 0)
  317.         maxx = (int) r.h.ah;
  318.     if (maxy == 0) {
  319.         r.x.ax = 0x1130;
  320.         r.x.dx = maxy;
  321.         int86(0x10,&r,&r);
  322.         maxy = (r.x.dx == 0) ? 25 : (r.x.dx + 1);
  323.     }
  324.  
  325.     if(!noalias || !userno) {
  326.         printf("\nName and/or user # missing in config file!\n");
  327.         exit(1);
  328.     }
  329.  
  330.     if(*inbound) {
  331.         int x=0;
  332.         struct ffblk f;
  333.         char temp[133];
  334.  
  335.         sprintf(temp,"%s*.PKT",inbound);
  336.         if(!findfirst(temp,&f,0))x++;
  337.         sprintf(temp,"%s*.MO?",inbound);
  338.         if(!findfirst(temp,&f,0))x++;
  339.         sprintf(temp,"%s*.TU?",inbound);
  340.         if(!findfirst(temp,&f,0))x++;
  341.         sprintf(temp,"%s*.WE?",inbound);
  342.         if(!findfirst(temp,&f,0))x++;
  343.         sprintf(temp,"%s*.TH?",inbound);
  344.         if(!findfirst(temp,&f,0))x++;
  345.         sprintf(temp,"%s*.FR?",inbound);
  346.         if(!findfirst(temp,&f,0))x++;
  347.         sprintf(temp,"%s*.SA?",inbound);
  348.         if(!findfirst(temp,&f,0))x++;
  349.         sprintf(temp,"%s*.SU?",inbound);
  350.         if(!findfirst(temp,&f,0))x++;
  351.         if(x) {
  352.             printf("\n   \x1b[0;1;5;31m   Mail present in inbound directory.\x1b[0m\n");
  353.             sleep(1);
  354.             ismail=1;
  355.         }
  356.     }
  357.  
  358.     if (noaddress) {
  359.         curaddress.zone=address[0]->zone;
  360.         curaddress.net=address[0]->net;
  361.         curaddress.node=address[0]->node;
  362.         curaddress.point=address[0]->point;
  363.         strcpy(curaddress.domain,address[0]->domain);
  364.     }
  365.     strcpy(to_domain,curaddress.domain);
  366.     if (!*origin) strcpy(origin,"UNKNOWN XBBS");
  367.     if(nodirs)strcpy(path,dirs[0]);
  368.     else *path=0;
  369.     strcpy(name,alias[0]);
  370.     nomess=check_area(areano);
  371.     if(usemouse) fputs("\nMouse detected.",stderr);
  372.     load_lastread();
  373.     fputs("\nLoading areas...",stderr);
  374.     load_areas();
  375.     strcpy(nullarea.name,"Unknown");
  376.     nullarea.attr=0;
  377.     nullarea.max=0;
  378.     nullarea.number=0;
  379.     currarea=&nullarea;
  380.     find_area();
  381.  
  382.     if(domail) {
  383.         switch ((int)domail) {
  384.             case 1:    import_mail();
  385.                     break;
  386.             case 2:    import_mail();
  387.                     goto DoEnd;
  388.             case 3:    export_mail();
  389.                     break;
  390.             case 4:    export_mail();
  391.                     goto DoEnd;
  392.             case 5: import_mail();
  393.                     export_mail();
  394.                     break;
  395.             case 6: import_mail();
  396.                     export_mail();
  397.                     goto DoEnd;
  398.         }
  399.     }
  400.  
  401.     nomess=check_area(areano);
  402.     while (line==NULL && maxlines>256) {
  403.         line=(char huge **)farmalloc((long)sizeof(char *)*(long)(maxlines+1));
  404.         if (line==NULL) {
  405.             maxlines/=2;
  406.             fprintf(stderr,"Cutting # of line pointers to %u     \r",maxlines);
  407.         }
  408.     }
  409.     if (line==NULL) {
  410.         fputs("\nScrew it, not enough memory.\n",stderr);
  411.         get_char();
  412.         exit (1);
  413.     }
  414.  
  415. DoEnd:
  416.  
  417.     fputs("\n",stderr);
  418.     clear_message();
  419.  
  420.     clrr();
  421.     menu();
  422.     clrr();
  423. }
  424.  
  425.  
  426. void cdecl deinit (void) {
  427.  
  428.     int register x;
  429.  
  430.     for(x=5;x<21;x++) _close(x);
  431.     CLEAROVERLAY();
  432. }
  433.  
  434.  
  435.  
  436. void pascal menu (void) {   /* Main menu */
  437.  
  438.     int s=1;
  439.     int returncode;
  440.     char keys[]="ACEGINOPRSTWQDL+K! MX#J";
  441.     char middle[133];
  442.     char *p;
  443.     char temppath[43];
  444.     word temp;
  445.     word tempmess;
  446.     word temparea;
  447.     struct ffblk f;
  448.     WINDOW *prime;
  449.  
  450.     #define LEFTT 6
  451.     #define TOP  1
  452.     #define RIGHTT 67
  453.     #define BOTTOM 25
  454.  
  455. AllOver:
  456.  
  457.     clear_message();
  458.     prime=establish_window(LEFTT,TOP,BOTTOM,RIGHTT);
  459.     set_border(prime,1);
  460.     sprintf(middle,"%s"," XBBS Reader copyright (c) 1989/90 by M. Kimes ");
  461.     if(ismail) strcat(middle," * ");
  462.     set_title(prime,middle);
  463.     set_colors(prime,ALL,BLACK,WHITE,BRIGHT);
  464.     set_colors(prime,ACCENT,WHITE,BLACK,BRIGHT);
  465.     set_colors(prime,BORDER,BLACK,GREEN,DIM);
  466.     set_colors(prime,TITLE,BLACK,YELLOW,BRIGHT);
  467.     display_window(prime);
  468. ReStart:
  469.     clear_message();
  470.     strncpy(temppath,path,42);
  471.     temppath[42]=0;
  472.     if(!*temppath) strcpy(temppath,"DEFAULT DIR");
  473.     wcursor(prime,0,0);
  474.     sprintf(middle,"[A]rea change (#%u/%1.12s) (%u-%u) %s",areano,currarea->name,(nomess>0),nomess,area_attr());
  475.     wprintf(prime,"%-65.65s\n",middle);
  476.     sprintf(middle,"[C]hange address (%u:%u/%01u.%01u@%-1.24s)",curaddress.zone,curaddress.net,curaddress.node,curaddress.point,curaddress.domain);
  477.     wprintf(prime,"%-65.65s\n",middle);
  478.     wprintf(prime,"[E]dit headers\n");
  479.     wprintf(prime,"[G]lobally read new messages\n");
  480.     wprintf(prime,"[I]nformation\n");
  481.     wprintf(prime,"[N]odelist review\n");
  482.     wprintf(prime,"[O]rigin line edit\n");
  483.     wprintf(prime,"[P]ersonal message check\n");
  484.     wprintf(prime,"[R]ead messages\n");
  485.     wprintf(prime,"[S]can messages\n");
  486.     sprintf(middle,"[T]oggle current name (%s)",name);
  487.     wprintf(prime,"%-65.65s\n",middle);
  488.     wprintf(prime,"[W]rite message\n");
  489.     wprintf(prime,"[Q]uit/Save LMR pointers (or ESC)\n");
  490.     wprintf(prime,"Quit/[D]on't save LMR pointers\n");
  491.     wprintf(prime,"[L]MR Reload\n");
  492.     wprintf(prime,"[+]Print messages\n");
  493.     wprintf(prime,"[K]ill Junk\n");
  494.     sprintf(middle,"[!]Change msg path (%s)",temppath);
  495.     wprintf(prime,"%-65.65s\n",middle);
  496.     wprintf(prime,"Text Editor [SpaceBar]\n");
  497.     wprintf(prime,"I[M]port mail\n");
  498.     wprintf(prime,"E[X]port mail\n");
  499.     wprintf(prime,"[#]Msg Area Maintenance\n");
  500.     wprintf(prime,"[J]ump to DOS");
  501.  
  502.   while (1) {
  503.     *assocfile=0;
  504.     set_help("mainmenu  ",18,0);
  505.     cursor(0,maxy-1);
  506.     if(s<0 || s>strlen(keys)) s=1;
  507.  
  508.     s=get_selection(prime,s,keys);
  509.     switch (s) {
  510.         case 0:     save_lastread();
  511.                     delete_window(prime);
  512.                     return;
  513.         case 1:     temp=areano;
  514.                     areano=list_areas();
  515.                     if(temp!=areano && areano) {
  516.                         find_area();
  517.                         nomess=check_area(areano);
  518.                         if(areano<=totalareas) {
  519.                             if(lastread[areano-1]<nomess) messno=lastread[areano-1]+1;
  520.                             else messno=1;
  521.                         }
  522.                         else messno=1;
  523.                         get_mess(0);
  524.                     }
  525.                     else {
  526.                         find_area();
  527.                         nomess=check_area(areano);
  528.                     }
  529.                     delete_window(prime);
  530.                     goto AllOver;        /* ???? */
  531.         case 2:     select_address();
  532.                     goto ReStart;
  533.         case 3:     if (!areano) {
  534.                         goto SelectAnAreaFirst;
  535.                     }
  536.                     if (!nomess) {
  537.                         goto NoneHere;
  538.                     }
  539.                     edit_mess(0);
  540.                     break;
  541.         case 8:
  542.         case 4:     temparea=areano;
  543.                     tempmess=messno;
  544.                     delete_window(prime);
  545.                     for (areano=1;areano<(totalareas+1);areano++) {
  546.                          if (!ewnd) any_message(" Scanning:             ");
  547.                          wcursor(ewnd,11,0);
  548.                          wprintf(ewnd,"%-5u       ",areano);
  549.                          if (kbhit()) {
  550.                              returncode=(int)get_char();
  551.                              if (returncode==32 || returncode==ESC) goto BreakOut;
  552.                          }
  553.                          sprintf(middle,"%sXDATA.%03x",path,areano);
  554.                          if (findfirst(middle,&f,0)) f.ff_fsize=0;
  555.                          nomess=(word)(f.ff_fsize/(long)sizeof(struct _xmsg));
  556.                          if (lastread[areano-1]>nomess) lastread[areano-1]=nomess;
  557.                          if (!nomess) continue;
  558.                          messno=lastread[areano-1]+1;
  559.                          if (nomess>=messno) {
  560.                             if (s==8) {
  561.                                 messno=get_abunch (messno-1,0,1,"");
  562.                                 if(!messno) continue;
  563.                             }
  564.                             find_area();
  565.                             sprintf(middle," %u/%1.12s (%u/%u)--[R]ead [S]kip [I]gnore [A]bort: [R] ",areano,currarea->name,messno,nomess);
  566.                             any_message(middle);
  567. Again:
  568.                             returncode=(int)toupper(generic_mouse_input(ewnd));
  569.                             switch (returncode) {
  570.                                 case '\r':
  571.                                 case 'R':   get_mess(0);
  572.                                             read_mess((char)(s==8),1);
  573.                                             break;
  574.                                 case ESC:
  575.                                 case 'S':   break;
  576.                                 case 'Q':
  577.                                 case 'A':   goto BreakOut;
  578.                                 case 'I':    lastread[areano-1]=nomess;
  579.                                             break;
  580.                                 default:    bell();
  581.                                             goto Again;
  582.                             }
  583.                             clear_message();
  584.                          }
  585. NotMe:
  586. ;
  587.                     }
  588. BreakOut:
  589.                     clear_message();
  590.                     areano=temparea;
  591.                     messno=tempmess;
  592.                     find_area();
  593.                     nomess=check_area(areano);
  594.                     get_mess(0);
  595.                     goto AllOver;
  596.         case 5:        info();
  597.                     break;
  598.         case 6:        node_lister();
  599.                     break;
  600.         case 7:     get_origin();
  601.                     break;
  602.         case 9:     if (!areano) {
  603. SelectAnAreaFirst:
  604.                         any_message(" Select an area first ");
  605.                         nopause();
  606.                         break;
  607.                     }
  608.                     if (!nomess) {
  609. NoneHere:
  610.                         any_message(" None here ");
  611.                         nopause();
  612.                         break;
  613.                     }
  614.                     get_mess(0);
  615.                     clear_message();
  616.                     read_mess(0,0);
  617.                     clear_message();
  618.                     get_mess(0);
  619.                     goto AllOver;
  620.         case 10:    if (!areano) {
  621.                         goto SelectAnAreaFirst;
  622.                     }
  623.                     if (!nomess) {
  624.                         goto NoneHere;
  625.                     }
  626.                     scan_mess();
  627.                     break;
  628.         case 11:    select_name();
  629.                     goto ReStart;
  630.         case 12:    if (!areano) {
  631.                         goto SelectAnAreaFirst;
  632.                     }
  633.                     get_rid();
  634.                     if (set_header(INFOONLY,"","","")==ESC) {
  635.                         get_mess(0);
  636.                         break;
  637.                     }
  638.                     delete_window(prime);
  639.                     if(!editor) {
  640.                         show_header(0);
  641.                     }
  642.                     post_mess("");
  643.                     clrr();
  644.                     get_mess(0);
  645.                     goto AllOver;
  646.         case 13:    save_lastread();
  647.         case 14:    delete_window(prime);
  648.                     return;
  649.         case 15:    load_lastread();
  650.                     break;
  651.         case 16:    if(!nomess) {
  652.                         goto NoneHere;
  653.                     }
  654.                     delete_window(prime);
  655.                     printer();
  656.                     goto AllOver;
  657.         case 17:    killjunk();
  658.                     nomess=check_area(areano);
  659.                     break;
  660.         case 18:    switch_dirs();
  661.                     goto ReStart;
  662.         case 19:    p=get_string("File to edit:",78,NULL,'A');
  663.                     if(!*p) break;
  664.                     if(!texteditor) {
  665.                         strcpy(notefile,p);
  666.                         notepad();
  667.                     }
  668.                     else {
  669.                         sprintf(middle,"%s ",texteditor);
  670.                         strncat(middle,p,133-strlen(middle));
  671.                         middle[132]=0;
  672.                         do_spawn(middle);
  673.                     }
  674.                     break;
  675.         case 20:    delete_window(prime);
  676.                     import_mail();
  677.                     goto AllOver;
  678.         case 21:    delete_window(prime);
  679.                     export_mail();
  680.                     goto AllOver;
  681.         case 22:    _anymsg(" Select function "," [X]Edit or X[M]sg? (X/M) ");
  682.                     returncode=toupper(generic_mouse_input(ewnd));
  683.                     clear_message();
  684.                     if(returncode!='X' && returncode!='M') break;
  685.                     save_lastread();
  686.                     if(returncode== 'M') {
  687.                         char s[133];
  688.  
  689.                         sprintf(s,"%s /c RUNXMSG.BAT",getenv("COMSPEC"));
  690.                         do_spawn(s);
  691.                     }
  692.                     else do_spawn("XEDIT.EXE");
  693.                     load_lastread();
  694.                     if(marea){
  695.  
  696.                         register int x;
  697.  
  698.                         for(x=0;x<maxareas;x++) {
  699.                             if(marea[x].name) free(marea[x].name);
  700.                         }
  701.                         farfree((void far *)marea);
  702.                     }
  703.                     load_areas();
  704.                     currarea=&nullarea;
  705.                     find_area();
  706.                     nomess=check_area(areano);
  707.                     if(messno>nomess)messno=nomess;
  708.                     goto ReStart;
  709.         case 23:    do_spawn("");
  710.                     break;
  711.         case HOME:    areano=2;
  712.         case FWD:
  713.         case PGUP:    areano--;
  714.                     if (areano<1) areano=4095;
  715.                     find_area();
  716.                     nomess=check_area(areano);
  717.                     goto ReStart;
  718.         case END:    areano=4094;
  719.         case BS:
  720.         case PGDN:    areano++;
  721.                     if (areano>4095) areano=1;
  722.                     find_area();
  723.                     nomess=check_area(areano);
  724.                     goto ReStart;
  725.         case ALT_F1:
  726.         case ALT_F2:
  727.         case ALT_F3:
  728.         case ALT_F4:
  729.         case ALT_F5:
  730.         case ALT_F6:
  731.         case ALT_F7:
  732.         case ALT_F8:
  733.         case ALT_F9:
  734.         case ALT_F10:   do_spawn(convertstring(fkey[s-ALT_F1]));
  735.                         break;
  736.         default:    bell();
  737.     }
  738.   }
  739. }
  740.