home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / WWIVSOR.ZIP / CONIO.BAK < prev    next >
Text File  |  1996-05-21  |  24KB  |  1,117 lines

  1. /*****************************************************************************
  2.  
  3.                               WWIV Version 4
  4.                     Copyright (C) 1988-1995 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. #include <mem.h>
  22. #include <conio.h>
  23.  
  24. #include "ripint.h"
  25.  
  26. #ifndef __OS2__
  27. #define SCROLL_UP(t,b,l) \
  28.   _CH=t;\
  29.   _DH=b;\
  30.   _BH=curatr;\
  31.   _AL=l;\
  32.   _CL=0;\
  33.   _DL=79;\
  34.   _AH=6;\
  35.   my_video_int();
  36. #endif
  37.  
  38.  
  39. #define GLOBAL_SIZE 4096
  40.  
  41. static char *global_buf;
  42. static int global_ptr;
  43. static int wx=0;
  44.  
  45.  
  46. #ifdef __OS2__
  47. static unsigned char CellStr[3] = { ' ', 0, 0 };
  48. #endif
  49.  
  50.  
  51. void my_video_int(void)
  52. {
  53. #ifndef __OS2__
  54. #if __TURBOC__ >= 0x0200
  55.   /* TC 2.0 or TC++ here */
  56.   static unsigned short sav_bp;
  57.  
  58.   __emit__(0x56, 0x57); /* push si, push di */
  59.   sav_bp = _BP;
  60.   geninterrupt(0x10);
  61.   _BP = sav_bp;
  62.   __emit__(0x5f, 0x5e); /* pop di, pop si */
  63. #else
  64.   /* TC 1.5 here */
  65.   _VideoInt();
  66. #endif
  67. #endif
  68. }
  69.  
  70.  
  71. void set_global_handle(int i)
  72. {
  73.   char s[81];
  74.  
  75.   if (x_only)
  76.     return;
  77.  
  78.   if (i) {
  79.     if (!global_handle) {
  80.       sprintf(s,"%sGLOBAL.TXT",syscfg.gfilesdir);
  81.       global_handle=sh_open(s,O_RDWR | O_APPEND | O_BINARY | O_CREAT,
  82.                            S_IREAD | S_IWRITE);
  83.       global_ptr=0;
  84.       global_buf=malloca(GLOBAL_SIZE);
  85.       if ((global_handle<0) || (!global_buf)) {
  86.         global_handle=0;
  87.         if (global_buf) {
  88.           bbsfree(global_buf);
  89.           global_buf=NULL;
  90.         }
  91.       }
  92.  
  93.     }
  94.   } else {
  95.     if (global_handle) {
  96.       sh_write(global_handle,global_buf,global_ptr);
  97.       sh_close(global_handle);
  98.       global_handle=0;
  99.       if (global_buf) {
  100.         bbsfree(global_buf);
  101.         global_buf=NULL;
  102.       }
  103.     }
  104.   }
  105. }
  106.  
  107.  
  108. void global_char(char ch)
  109. {
  110.  
  111.   if (global_buf && global_handle) {
  112.     global_buf[global_ptr++]=ch;
  113.     if (global_ptr==GLOBAL_SIZE) {
  114.       sh_write(global_handle,global_buf,global_ptr);
  115.       global_ptr=0;
  116.     }
  117.   }
  118. }
  119.  
  120. void set_x_only(int tf, char *fn, int ovwr)
  121. {
  122.   static int gh;
  123.   char s[81];
  124.  
  125.   if (x_only) {
  126.     if (!tf) {
  127.       if (global_handle) {
  128.         sh_write(global_handle,global_buf,global_ptr);
  129.         sh_close(global_handle);
  130.         global_handle=0;
  131.         if (global_buf) {
  132.           bbsfree(global_buf);
  133.           global_buf=NULL;
  134.         }
  135.       }
  136.       x_only=0;
  137.       set_global_handle(gh);
  138.       gh=0;
  139.       express=expressabort=0;
  140.     }
  141.   } else {
  142.     if (tf) {
  143.       gh=global_handle;
  144.       set_global_handle(0);
  145.       x_only=1;
  146.       wx=0;
  147.       sprintf(s,"%s%s",syscfgovr.tempdir,fn);
  148.       if (ovwr)
  149.         global_handle=sh_open(s,O_RDWR | O_TRUNC | O_BINARY | O_CREAT,
  150.                              S_IREAD | S_IWRITE);
  151.       else
  152.         global_handle=sh_open(s,O_RDWR | O_APPEND | O_BINARY | O_CREAT,
  153.                              S_IREAD | S_IWRITE);
  154.       global_ptr=0;
  155.       express=1;
  156.       expressabort=0;
  157.       global_buf=malloca(GLOBAL_SIZE);
  158.       if ((global_handle<0) || (!global_buf)) {
  159.         global_handle=0;
  160.         if (global_buf) {
  161.           bbsfree(global_buf);
  162.           global_buf=NULL;
  163.         }
  164.         set_x_only(0, NULL, 0);
  165.       }
  166.     }
  167.   }
  168.   timelastchar1=timer1();
  169. }
  170.  
  171.  
  172. void movecsr(int x,int y)
  173. /* This, obviously, moves the cursor to the location specified, offset from
  174.  * the protected dispaly at the top of the screen
  175.  */
  176. {
  177.   if (x<0)
  178.     x=0;
  179.   if (x>79)
  180.     x=79;
  181.   if (y<0)
  182.     y=0;
  183.   y+=topline;
  184.   if (y>screenbottom)
  185.     y=screenbottom;
  186.  
  187.   if (x_only) {
  188.     wx=x;
  189.     return;
  190.   }
  191.  
  192. #ifdef __OS2__
  193.   VioSetCurPos((USHORT)y, (USHORT)x, 0);
  194. #else
  195.   _BH=0x00;
  196.   _DH=y;
  197.   _DL=x;
  198.   _AH=0x02;
  199.   my_video_int();
  200. #endif
  201. }
  202.  
  203.  
  204.  
  205. int WhereX(void)
  206. /* This function returns the current X cursor position, as the number of
  207.  * characters from the left hand side of the screen.  An X position of zero
  208.  * means the cursor is at the left-most position
  209.  */
  210. {
  211. #ifdef __OS2__
  212.   USHORT CurX, CurY;
  213. #endif
  214.  
  215.   if (x_only)
  216.     return(wx);
  217.  
  218.  
  219. #ifdef __OS2__
  220.   VioGetCurPos(&CurY, &CurX, 0);
  221.   return CurX;
  222. #else
  223.   _BH=0x00;
  224.   _AH=0x03;
  225.   my_video_int();
  226.   tempio=_DL;
  227.   return(tempio);
  228. #endif
  229. }
  230.  
  231.  
  232.  
  233. int WhereY(void)
  234. /* This function returns the Y cursor position, as the line number from
  235.  * the top of the logical window.  The offset due to the protected top
  236.  * of the screen display is taken into account.  A WhereY() of zero means
  237.  * the cursor is at the top-most position it can be at.
  238.  */
  239. {
  240. #ifdef __OS2__
  241.   USHORT CurX, CurY;
  242.  
  243.   VioGetCurPos(&CurY, &CurX, 0);
  244.   return CurY - topline;
  245. #else
  246.   _BH=0x00;
  247.   _AH=0x03;
  248.   my_video_int();
  249.   tempio=_DH;
  250.   return(tempio-topline);
  251. #endif
  252. }
  253.  
  254.  
  255.  
  256. void lf(void)
  257. /* This function performs a linefeed to the screen (but not remotely) by
  258.  * either moving the cursor down one line, or scrolling the logical screen
  259.  * up one line.
  260.  */
  261. {
  262. #ifdef __OS2__
  263.   USHORT CurX, CurY;
  264.  
  265.   VioGetCurPos(&CurY, &CurX, 0);
  266.   if (CurY >= screenbottom)
  267.     {
  268.       CellStr[1] = (unsigned char) curatr;
  269.       VioScrollUp(topline, 0, screenbottom, 79, 1, CellStr, 0);
  270.     }
  271.   else
  272.     VioSetCurPos(CurY + 1, CurX, 0);
  273. #else
  274.   _BH=0x00;
  275.   _AH=0x03;
  276.   my_video_int();
  277.   tempio=_DL;
  278.   if (_DH>=screenbottom) {
  279.     SCROLL_UP(topline,screenbottom,1);
  280.     _DL=tempio;
  281.     _DH=screenbottom;
  282.     _BH=0;
  283.     _AH=0x02;
  284.     my_video_int();
  285.   } else {
  286.     tempio=_DH+1;
  287.     _DH=tempio;
  288.     _AH=0x02;
  289.     my_video_int();
  290.   }
  291. #endif
  292. }
  293.  
  294.  
  295.  
  296. void cr(void)
  297. /* This short function returns the local cursor to the left-most position
  298.  * on the screen.
  299.  */
  300. {
  301. #ifdef __OS2__
  302.   USHORT CurX, CurY;
  303.  
  304.   VioGetCurPos(&CurY, &CurX, 0);
  305.   VioSetCurPos(CurY, 0, 0);
  306. #else
  307.   _BH=0x00;
  308.   _AH=0x03;
  309.   my_video_int();
  310.   _DL=0x00;
  311.   _AH=2;
  312.   my_video_int();
  313. #endif
  314. }
  315.  
  316. void clrscrb(void)
  317. /* This clears the local logical screen */
  318. {
  319. #ifdef __OS2__
  320.   CellStr[1] = (unsigned char) curatr;
  321.   VioScrollUp(topline, 0, screenbottom, 79, 65535, CellStr, 0);
  322. #else
  323.   SCROLL_UP(topline,screenbottom,0);
  324. #endif
  325.   movecsr(0,0);
  326.   lines_listed=0;
  327. }
  328.  
  329.  
  330.  
  331. void bs(void)
  332. /* This function moves the cursor one position to the left, or if the cursor
  333.  * is currently at its left-most position, the cursor is moved to the end of
  334.  * the previous line, except if it is on the top line, in which case nothing
  335.  * happens.
  336.  */
  337. {
  338. #ifdef __OS2__
  339.   USHORT CurX, CurY;
  340.  
  341.   VioGetCurPos(&CurY, &CurX, 0);
  342.   if (CurX != 0)
  343.     VioSetCurPos(CurY, CurX - 1, 0);
  344.   else
  345.     if (CurY != topline)
  346.       VioSetCurPos(CurY - 1, 79, 0);
  347. #else
  348.   _BH=0;
  349.   _AH=3;
  350.   my_video_int();
  351.   if (_DL==0) {
  352.     if (_DH != topline) {
  353.       _DL=79;
  354.       tempio=_DH-1;
  355.       _DH=tempio;
  356.       _AH=2;
  357.       my_video_int();
  358.     }
  359.   } else {
  360.     _DL--;
  361.     _AH=2;
  362.     my_video_int();
  363.   }
  364. #endif
  365. }
  366.  
  367.  
  368.  
  369. void out1chx(unsigned char ch)
  370. /* This function outputs one character to the screen, then updates the
  371.  * cursor position accordingly, scolling the screen if necessary.  Not that
  372.  * this function performs no commands such as a C/R or L/F.  If a value of
  373.  * 8, 7, 13, 10, 12 (backspace, beep, C/R, L/F, TOF), or any other command-
  374.  * type characters are passed, the appropriate corresponding "graphics"
  375.  * symbol will be output to the screen as a normal character.
  376.  */
  377. {
  378. #ifdef __OS2__
  379.   USHORT CurX, CurY;
  380.   BYTE CharAttribute = curatr;
  381.  
  382.   VioGetCurPos(&CurY, &CurX, 0);
  383.   VioWrtCharStrAtt(&ch, 1, CurY, CurX, &CharAttribute, 0);
  384.   if (CurX != 79)
  385.     VioSetCurPos(CurY, CurX + 1, 0);
  386.   else
  387.     if (CurY != screenbottom)
  388.       VioSetCurPos(CurY + 1, 0, 0);
  389.     else
  390.       {
  391.       CellStr[1] = (unsigned char) curatr;
  392.       VioScrollUp(topline, 0, screenbottom, 79, 1, CellStr, 0);
  393.       VioSetCurPos(CurY, 0, 0);
  394.       }
  395. #else
  396.   _BL=curatr;
  397.   _BH=0x00;
  398.   _CX=0x01;
  399.   _AL=ch;
  400.   _AH=0x09;
  401.   my_video_int();
  402.   _BH=0x00;
  403.   _AH=0x03;
  404.   my_video_int();
  405.   ++_DL;
  406.   if (_DL==80) {
  407.     _DL=0;
  408.     if (_DH==screenbottom) {
  409.       SCROLL_UP(topline,screenbottom,1);
  410.       _DH=screenbottom;
  411.       _DL=0;
  412.       _BH=0;
  413.       _AH=0x02;
  414.       my_video_int();
  415.     } else {
  416.       tempio=_DH+1;
  417.       _DH=tempio;
  418.       _AH=0x02;
  419.       my_video_int();
  420.     }
  421.   } else {
  422.     _AH=0x02;
  423.     my_video_int();
  424.   }
  425. #endif
  426. }
  427.  
  428.  
  429.  
  430.  
  431. void out1ch(unsigned char ch)
  432. /* This function outputs one character to the local screen.  C/R, L/F, TOF,
  433.  * BS, and BELL are interpreted as commands instead of characters.
  434.  */
  435. {
  436.   if (x_only) {
  437.     if (ch>31) {
  438.       wx=(wx+1)%80;
  439.     } else if ((ch==13) || (ch==12)) {
  440.       wx=0;
  441.     } else if (ch==8) {
  442.       if (wx)
  443.         wx--;
  444.     }
  445.     return;
  446.   }
  447.  
  448.   if (ch>31)
  449.     out1chx(ch);
  450.   else
  451.     if (ch==13)
  452.       cr();
  453.     else
  454.       if (ch==10)
  455.         lf();
  456.       else
  457.         if (ch==12)
  458.           clrscrb();
  459.         else
  460.           if (ch==8)
  461.             bs();
  462.           else
  463.             if (ch==7)
  464.               if (outcom==0) {
  465.                 setbeep(1);
  466.                 wait1(4);
  467.                 setbeep(0);
  468.               }
  469. }
  470.  
  471.  
  472. void outs(unsigned char *s)
  473. /* This (obviously) outputs a string TO THE SCREEN ONLY */
  474. {
  475. #ifdef __OS2__
  476.   /* more efficient, but will it work with DOS segmented pointers? */
  477.   while (*s)
  478.     {
  479.       out1ch(*s);
  480.       s++;
  481.     }
  482. #else
  483.   int i;
  484.   unsigned char ch;
  485.  
  486.   for (i=0; s[i]!=0; i++) {
  487.     ch=s[i];
  488.     out1ch(ch);
  489.   }
  490. #endif
  491. }
  492.  
  493. void outfast(char *s)
  494. /* This RAPIDLY outputs ONE LINE to the screen only*/
  495. {
  496. #ifdef __OS2__
  497.   USHORT CurX, CurY;
  498.   BYTE CharAttribute = curatr;
  499.  
  500.   VioGetCurPos(&CurY, &CurX, 0);
  501.   VioWrtCharStrAtt(s, strlen(s), CurY, CurX, &CharAttribute, 0);
  502. #else
  503.   int i,i1;
  504.  
  505.   i1 = (WhereY() * 80 + WhereX()) *2 ;
  506.   for (i=0;s[i]!=0;i++) {
  507.     scrn[i*2+i1+1]=curatr;
  508.     scrn[i*2+i1]=s[i];
  509.   }
  510.   movecsr(WhereX()+strlen(s),WhereY());
  511. #endif
  512. }
  513.  
  514.  
  515.  
  516. void pr_Wait(int i1)
  517. {
  518.   int i, i2, i3;
  519.   char *ss;
  520.  
  521.   ss=get_string(925);
  522.   i2=i3=strlen(ss);
  523.   for (i=0; i<i3; i++)
  524.     if ((ss[i]==3) && (i2>1))
  525.       i2-=2;
  526.  
  527.   if (i1) {
  528.     if (okansi()) {
  529.       i=curatr;
  530.       setc((thisuser.sysstatus & sysstatus_color) ? thisuser.colors[3] :
  531.             thisuser.bwcolors[3]);
  532.       outstr(ss);
  533.       npr("\x1b[%dD",i2);
  534.       setc(i);
  535.     } else {
  536.       outstr(ss);
  537.     }
  538.   } else {
  539.     if (okansi()) {
  540.       for (i=0; i<i2; i++)
  541.         outchr(' ');
  542.       npr("\x1b[%dD",i2);
  543.     } else {
  544.       for (i=0; i<i2; i++)
  545.         backspace();
  546.     }
  547.   }
  548. }
  549.  
  550.  
  551.  
  552. void set_protect(int l)
  553. /* set_protect sets the number of lines protected at the top of the screen. */
  554. {
  555.   int sa;
  556.  
  557.   if (l!=topline) {
  558.     if (l>topline) {
  559.       if ((WhereY()+topline-l) < 0) {
  560. #ifdef __OS2__
  561.         CellStr[1] = (unsigned char) curatr;
  562.         VioScrollDn(topline, 0, screenbottom+1, 79, l - topline, CellStr, 0);
  563. #else
  564.         _CH=topline;
  565.         _DH=screenbottom+1;
  566.         _AL=l-topline;
  567.         _CL=0;
  568.         _DL=79;
  569.         _BH=0x07;
  570.         _AH=7;
  571.         my_video_int();
  572. #endif
  573.         movecsr(WhereX(),WhereY()+l-topline);
  574.       } else {
  575.         oldy += (topline-l);
  576.       }
  577.     } else {
  578.       sa=curatr;
  579.       curatr= ((thisuser.sysstatus & sysstatus_color) ? thisuser.colors[0] :
  580.                 thisuser.bwcolors[0]);
  581. #ifdef __OS2__
  582.       CellStr[1] = (unsigned char) curatr;
  583.       VioScrollUp(l, 0, topline - 1, 79, 65535, CellStr, 0);
  584. #else
  585.       SCROLL_UP(l,topline-1,0);
  586. #endif
  587.       curatr=sa;
  588.       oldy += (topline-l);
  589.     }
  590.   }
  591.   topline=l;
  592.   if (using_modem)
  593.     screenlinest=thisuser.screenlines;
  594.   else
  595.     screenlinest=defscreenbottom+1-topline;
  596. }
  597.  
  598.  
  599. void savescreen(screentype *s)
  600. {
  601. #ifdef RIPDRIVE
  602.   if (rd_on())
  603.     rd_str("\1|1\x1b""0000$SAVE0$\r");
  604. #endif
  605.   if (!s->scrn1)
  606.     s->scrn1=(char *)malloca(screenlen);
  607.  
  608.   if (s->scrn1)
  609. #ifdef __OS2__
  610.     {
  611.       USHORT ScreenBufferSize = screenlen;
  612.  
  613.       VioReadCellStr(s->scrn1, &ScreenBufferSize, 0, 0, 0);
  614.     }
  615. #else
  616.     memmove(s->scrn1,scrn,screenlen);
  617. #endif
  618.  
  619.   s->x1=WhereX();
  620.   s->y1=WhereY();
  621.   s->topline1=topline;
  622.   s->curatr1=curatr;
  623. }
  624.  
  625.  
  626. void restorescreen(screentype far *s)
  627. /* restorescreen restores a screen previously saved with savescreen */
  628. {
  629. #ifdef RIPDRIVE
  630.   if (rd_on())
  631.     rd_str("\1|1\x1b""0000$RESTORE0$\r");
  632. #endif
  633.   if (s->scrn1) {
  634. #ifdef __OS2__
  635.     VioWrtCellStr(s->scrn1, screenlen, 0, 0, 0);
  636. #else
  637.     memmove(scrn,s->scrn1,screenlen);
  638. #endif
  639.     bbsfree(s->scrn1);
  640.     s->scrn1=NULL;
  641.   }
  642.   topline=s->topline1;
  643.   curatr=s->curatr1;
  644.   movecsr(s->x1,s->y1);
  645. }
  646.  
  647.  
  648. void temp_cmd(char *s)
  649. {
  650.   int i;
  651.  
  652.   pr_Wait(1);
  653.   savescreen(&screensave);
  654. #ifdef RIPDRIVE
  655.   if (rd_on())
  656.     localrip_deactivate();
  657. #endif
  658.   i=topline;
  659.   topline=0;
  660.   curatr=0x07;
  661.   clrscrb();
  662.   extern_prog(s, EFLAG_TOPSCREEN|EFLAG_SHRINK);
  663. #ifdef RIPDRIVE
  664.   if (rd_on())
  665.     localrip_activate(sysinfo.ripdir, sysinfo.ripdir);
  666. #endif
  667.   restorescreen(&screensave);
  668.   topline=i;
  669.   pr_Wait(0);
  670. }
  671.  
  672.  
  673. char xlate[] = {
  674.   'Q','W','E','R','T','Y','U','I','O','P',0,0,0,0,
  675.   'A','S','D','F','G','H','J','K','L',0,0,0,0,0,
  676.   'Z','X','C','V','B','N','M',
  677. };
  678.  
  679. char scan_to_char(unsigned char ch)
  680. {
  681.   if ((ch>=16) && (ch<=50))
  682.     return(xlate[ch-16]);
  683.   else
  684.     return(0);
  685. }
  686.  
  687. void alt_key(unsigned char ch)
  688. {
  689.   char ch1;
  690.   char *ss, *ss1,s[81],cmd[128];
  691.   int f,l;
  692.  
  693.   cmd[0]=0;
  694.   ch1=scan_to_char(ch);
  695.   if (ch1) {
  696.     sprintf(s,"%sMACROS.TXT",syscfg.datadir);
  697.     f=sh_open1(s,O_RDONLY | O_BINARY);
  698.     if (f>0) {
  699.       l=filelength(f);
  700.       ss=malloca(l+10);
  701.       if (ss) {
  702.         sh_read(f,ss,l);
  703.         sh_close(f);
  704.  
  705.         ss[l]=0;
  706.         ss1=strtok(ss,"\r\n");
  707.         while (ss1) {
  708.           if (upcase(*ss1)==ch1) {
  709.             strtok(ss1," \t");
  710.             ss1=strtok(NULL,"\r\n");
  711.             if (ss1 && (strlen(ss1)<128))
  712.               strcpy(cmd,ss1);
  713.             ss1=NULL;
  714.           } else
  715.             ss1=strtok(NULL,"\r\n");
  716.         }
  717.         bbsfree(ss);
  718.       } else
  719.         sh_close(f);
  720.       if (cmd[0]) {
  721.         if (cmd[0]=='@') {
  722.           if (okmacro && okskey && (!charbufferpointer) && (cmd[1])) {
  723.             for (l=strlen(cmd)-1; l>=0; l--) {
  724.               if (cmd[l]=='{')
  725.                 cmd[l]='\r';
  726.               strcpy(charbuffer,cmd);
  727.               charbufferpointer=1;
  728.             }
  729.           }
  730.         } else {
  731.           temp_cmd(cmd);
  732.         }
  733.       }
  734.     }
  735.   }
  736. }
  737.  
  738. void skey(char ch)
  739. /* skey handles all f-keys and the like hit FROM THE KEYBOARD ONLY */
  740. {
  741.   int i,i1;
  742.  
  743.   if (((syscfg.sysconfig & sysconfig_no_local)==0) && (!in_extern)) {
  744.     if (okskey) {
  745.       if ((ch>=104) && (ch<=113)) {
  746.         set_autoval(ch-104);
  747.       } else {
  748.         switch ((unsigned char) ch) {
  749.           case 59: /* F1 */
  750.             val_cur_user();
  751.             break;
  752.           case 60: /* F2 */
  753.             topdata+=1;
  754.             if (topdata==3)
  755.               topdata=0;
  756. #ifdef RIPDRIVE
  757.             rd_coff();
  758. #endif
  759.             topscreen();
  760. #ifdef RIPDRIVE
  761.             rd_con();
  762. #endif
  763.             break;
  764.           case 61: /* F3 */
  765.             if (using_modem) {
  766.               incom=(!incom);
  767.               dump();
  768.               tleft(0);
  769.             }
  770.             break;
  771.           case 62: /* F4 */
  772.             chatcall=0;
  773.             topscreen();
  774.             break;
  775.           case 63: /* F5 */
  776.             hangup=1;
  777.             dtr(0);
  778.             break;
  779.           case 64: /* F6 */
  780.             sysop_alert=!sysop_alert;
  781.             tleft(0);
  782.             break;
  783.           case 65: /* F7 */
  784.             thisuser.extratime-=5.0*60.0;
  785.             tleft(0);
  786.             break;
  787.           case 66: /* F8 */
  788.             thisuser.extratime+=5.0*60.0;
  789.             tleft(0);
  790.             break;
  791.           case 67: /* F9 */
  792.             if (thisuser.sl!=255) {
  793.               if (actsl!=255)
  794.                 actsl=255;
  795.               else
  796.                 reset_act_sl();
  797.               changedsl();
  798.               tleft(0);
  799.             }
  800.             break;
  801.           case 68: /* F10 */
  802.             if (chatting==0) {
  803.               if (syscfg.sysconfig & sysconfig_2_way)
  804.                 chat1("",1);
  805.               else
  806.                 chat1("",0);
  807.             } else
  808.               chatting=0;
  809.             break;
  810.           case 71: /* HOME */
  811.             if (chatting==1) {
  812.               if (chat_file)
  813.                 chat_file=0;
  814.               else
  815.                 chat_file=1;
  816.             }
  817.             break;
  818.           case 88: /* Shift-F5 */
  819.             i1=(rand() % 20) + 10;
  820.             for (i=0; i<i1; i++)
  821.               outchr(rand() % 256);
  822.             hangup=1;
  823.             dtr(0);
  824.             break;
  825.           case 98: /* Ctrl-F5 */
  826.             nl();
  827.             pl(get_string(924));
  828.             nl();
  829.             hangup=1;
  830.             dtr(0);
  831.             break;
  832.           case 103: /* Ctrl-F10 */
  833.             if (chatting==0)
  834.               chat1("",0);
  835.             else
  836.               chatting=0;
  837.             break;
  838.           case 84: /* Shift-F1 */
  839.             set_global_handle(!global_handle);
  840.             topscreen();
  841.             break;
  842.           case 93: /* Shift-F10 */
  843.             temp_cmd(getenv("COMSPEC"));
  844.             break;
  845. /* #ifdef RIPDRIVE */
  846.       case 85: /* Shift-F2 */
  847.         if (sysinfo.flags & OP_FLAGS_RIPDRIVE_ON) {
  848.           sysinfo.flags &= ~OP_FLAGS_RIPDRIVE_ON;
  849.           rd_disable();
  850.         } else if (ripdrive) {
  851.           printf("\a");
  852.           sysinfo.flags |= OP_FLAGS_RIPDRIVE_ON;
  853.           localrip_activate(sysinfo.ripdir, sysinfo.ripdir);
  854.           cleared = NEEDCLEAR;
  855.         }
  856.         break;
  857. /*#endif*/
  858.           default:
  859.             alt_key((unsigned char) ch);
  860.             break;
  861.         }
  862.       }
  863.     } else {
  864.       if (wfc==1)
  865.         holdphone(1);
  866.       alt_key((unsigned char) ch);
  867.       if (wfc==1) {
  868.         cleanup_net();
  869.         holdphone(0);
  870.       }
  871.     }
  872.   }
  873. }
  874.  
  875.  
  876. void tleft(int x)
  877. {
  878.   int cx,cy,ctl,cc,ln,i;
  879.   double nsln;
  880.   char tl[30];
  881.   static char sbuf[200];
  882.   static char *ss[8];
  883.  
  884.   if (!sbuf[0]) {
  885.     ss[0]=sbuf;
  886.     for (i=0; i<7; i++) {
  887.       strcpy(ss[i],get_stringx(1,85+i));
  888.       ss[i+1]=ss[i]+strlen(ss[i])+1;
  889.     }
  890.   }
  891.  
  892.   cx=WhereX();
  893.   cy=WhereY();
  894.   ctl=topline;
  895.   cc=curatr;
  896.   if (crttype==7)
  897.     curatr=0x07;
  898.   else
  899.     curatr=sysinfo.topscreen_color;
  900.   topline=0;
  901.   nsln=nsl();
  902.   if (chatcall && (topdata==2))
  903.     ln=5;
  904.   else
  905.     ln=4;
  906.  
  907.  
  908.   if (topdata) {
  909.  
  910.     if ((using_modem) && (!incom)) {
  911.       movecsr(1,ln);
  912.       outs(ss[0]);
  913.       for (i=19; i<strlen(curspeed); i++)
  914.         out1ch('═');
  915.     } else {
  916.       movecsr(1,ln);
  917.       outs(curspeed);
  918.       for (i=WhereX(); i<23; i++)
  919.         out1ch('═');
  920.     }
  921.  
  922.     if ((thisuser.sl!=255) && (actsl==255)) {
  923.       movecsr(23,ln);
  924.       outs(ss[1]);
  925.     }
  926.  
  927.     if (global_handle) {
  928.       movecsr(40,ln);
  929.       outs(ss[2]);
  930.     }
  931.  
  932.     movecsr(54,ln);
  933.     if (sysop_alert) {
  934.       outs(ss[3]);
  935.     } else {
  936.       outs(ss[4]);
  937.     }
  938.  
  939.     movecsr(64,ln);
  940.     if (sysop1()) {
  941.       outs(ss[5]);
  942.     } else {
  943.       outs(ss[6]);
  944.     }
  945.   }
  946.  
  947.   switch (topdata)
  948.     {
  949.     case 1:
  950.       if (useron) {
  951.         movecsr(18,3);
  952.         sprintf(tl,"T-%6.2f",nsln/60.0);
  953.         outs(tl);
  954.       }
  955.       break;
  956.     case 2:
  957.       movecsr(64,3);
  958.       if (useron)
  959.         sprintf(tl,"T-%6.2f",nsln/60.0);
  960.       else
  961.         strcpy(tl,thisuser.pw);
  962.       outs(tl);
  963.       break;
  964.   }
  965.   topline=ctl;
  966.   curatr=cc;
  967.   movecsr(cx,cy);
  968.   if ((x) && (useron))
  969.     if (nsln==0.0) {
  970.       nl();
  971.       pl(get_string(926));
  972.       nl();
  973.       hangup=1;
  974.     }
  975. }
  976.  
  977.  
  978. void topscreen(void)
  979. {
  980.   int cc,cx,cy,ctl,i;
  981.   char sl[81],ar[17],dar[17],restrict[17],rst[17],lo[90],ol[190],calls[20];
  982.  
  983.  
  984.   switch(topdata) {
  985.     case 0:
  986.       set_protect(0);
  987.       break;
  988.     case 1:
  989.       set_protect(5);
  990.       break;
  991.     case 2:
  992.       if (chatcall)
  993.         set_protect(6);
  994.       else {
  995.         if (topline==6)
  996.           set_protect(0);
  997.         set_protect(5);
  998.       }
  999.       break;
  1000.   }
  1001.   cx=WhereX();
  1002.   cy=WhereY();
  1003.   ctl=topline;
  1004.   cc=curatr;
  1005.   if (crttype==7)
  1006.     curatr=0x07;
  1007.   else
  1008.     curatr=sysinfo.topscreen_color;
  1009.   topline=0;
  1010.   for (i=0; i<80; i++)
  1011.     sl[i]=205;
  1012.   sl[80]=0;
  1013.  
  1014.   switch (topdata) {
  1015.     case 0:
  1016.       break;
  1017.     case 1:
  1018.       read_status();
  1019.       movecsr(0,0);
  1020.       sprintf(ol,"%-50s  Activity for %8s:      ",
  1021.           syscfg.systemname,status.date1);
  1022.       outs(ol);
  1023.  
  1024.       movecsr(0,1);
  1025.       sprintf(ol,"Users: %4u       Total Calls: %5lu      Calls Today: %4u    Posted      :%3u ",
  1026.           status.users,status.callernum1,status.callstoday,status.localposts);
  1027.       outs(ol);
  1028.  
  1029.       movecsr(0,2);
  1030.       sprintf(ol,"%-36s      %-4u min   /  %2u%%    E-mail sent :%3u ",
  1031.           nam(&thisuser,usernum),status.activetoday,
  1032.           (int) (10*status.activetoday/144),status.emailtoday);
  1033.       outs(ol);
  1034.  
  1035.       movecsr(0,3);
  1036.       sprintf(ol,"SL=%3u   DL=%3u               FW=%3u      Uploaded:%2u files    Feedback    :%3u ",
  1037.           thisuser.sl,thisuser.dsl,fwaiting,status.uptoday,status.fbacktoday);
  1038.       outs(ol);
  1039.       break;
  1040.  
  1041.     case 2:
  1042.  
  1043.       strcpy(rst,restrict_string);
  1044.       for (i=0; i<=15; i++) {
  1045.         if (thisuser.ar & (1 << i))
  1046.           ar[i]='A'+i;
  1047.         else
  1048.           ar[i]=32;
  1049.         if (thisuser.dar & (1 << i))
  1050.           dar[i]='A'+i;
  1051.         else
  1052.           dar[i]=32;
  1053.         if (thisuser.restrict & (1 << i))
  1054.           restrict[i]=rst[i];
  1055.         else
  1056.           restrict[i]=32;
  1057.       }
  1058.       dar[16]=0;
  1059.       ar[16]=0;
  1060.       restrict[16]=0;
  1061.       if (strcmp(thisuser.laston,date()))
  1062.         strcpy(lo,thisuser.laston);
  1063.       else
  1064.         sprintf(lo,"Today:%2d",thisuser.ontoday);
  1065.  
  1066.       movecsr(0,0);
  1067.       sprintf(ol,"%-35s W=%3u UL=%4u/%6lu SL=%3u LO=%5u PO=%4u",
  1068.           nam(&thisuser,usernum),thisuser.waiting,thisuser.uploaded,
  1069.           thisuser.uk,thisuser.sl,thisuser.logons,thisuser.msgpost);
  1070.       outs(ol);
  1071.  
  1072.       movecsr(0,1);
  1073.       if (thisuser.wwiv_regnum)
  1074.         sprintf(calls,"%lu",thisuser.wwiv_regnum);
  1075.       else
  1076.         strcpy(calls,thisuser.callsign);
  1077.       sprintf(ol,"%-20s %12s  %-6s DL=%4u/%6lu DL=%3u TO=%5.0lu ES=%4u",
  1078.           thisuser.realname,thisuser.phone,calls,
  1079.           thisuser.downloaded,thisuser.dk,thisuser.dsl,
  1080.           ((long) ((thisuser.timeon+timer()-timeon)/60.0)),
  1081.           thisuser.emailsent+thisuser.emailnet);
  1082.       outs(ol);
  1083.  
  1084.       movecsr(0,2);
  1085.       sprintf(ol,"ARs=%-16s/%-16s R=%-16s EX=%3u %-8s FS=%4u",
  1086.           ar,dar,restrict,thisuser.exempt,lo,thisuser.feedbacksent);
  1087.       outs(ol);
  1088.  
  1089.       movecsr(0,3);
  1090.       sprintf(ol,"%-40.40s %c %2u %-17s          FW= %3u",
  1091.           thisuser.note,thisuser.sex,thisuser.age,
  1092.           ctypes[thisuser.comp_type],fwaiting);
  1093.       outs(ol);
  1094.  
  1095.       if (chatcall) {
  1096.         movecsr(0,4);
  1097.         outs(chatreason);
  1098.       }
  1099.       break;
  1100.   }
  1101.   if (ctl!=0) {
  1102.     movecsr(0,ctl-1);
  1103.     outs(sl);
  1104.   }
  1105.   topline=ctl;
  1106.   movecsr(cx,cy);
  1107.   curatr=cc;
  1108.   tleft(0);
  1109. }
  1110.  
  1111. void set_autoval(int n)
  1112. {
  1113.   auto_val(n, &thisuser);
  1114.   reset_act_sl();
  1115.   changedsl();
  1116. }
  1117.