home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / CONIO.C < prev    next >
Text File  |  1993-05-06  |  39KB  |  1,600 lines

  1. #include "vars.h"
  2. #pragma hdrstop
  3. #include <mem.h>
  4. #include <conio.h>
  5. #define TWO_WAY
  6. #define SCROLL_UP(t,b,l) \
  7.   _CH=t;\
  8.   _DH=b;\
  9.   _BH=curatr;\
  10.   _AL=l;\
  11.   _CL=0;\
  12.   _DL=79;\
  13.   _AH=6;\
  14.   my_video_int();
  15.  
  16. #define GLOBAL_SIZE 256
  17.  
  18. static char global_buf[GLOBAL_SIZE];
  19. static int global_ptr;
  20.  
  21. void my_video_int()
  22. {
  23. #if __TURBOC__ >= 0x0200
  24.   /* TC 2.0 or TC++ here */
  25.   static unsigned short sav_bp;
  26.  
  27.   __emit__(0x56, 0x57); /* push si, push di */
  28.   sav_bp = _BP;
  29.   geninterrupt(0x10);
  30.   _BP = sav_bp;
  31.   __emit__(0x5f, 0x5e); /* pop di, pop si */
  32. #else
  33.   /* TC 1.5 here */
  34.   _VideoInt();
  35. #endif
  36. }
  37.  
  38. void set_global_handle(int i)
  39. {
  40.   char s[81];
  41.  
  42.   if (i) {
  43.     if (!global_handle) {
  44.       sprintf(s,"%sGLOBAL.TXT",syscfg.gfilesdir);
  45.       global_handle=open(s,O_RDWR | O_APPEND | O_BINARY | O_CREAT,
  46.                            S_IREAD | S_IWRITE);
  47.       if (global_handle<0)
  48.         global_handle=0;
  49.       global_ptr=0;
  50.     }
  51.   } else {
  52.     if (global_handle) {
  53.       write(global_handle,global_buf,global_ptr);
  54.       close(global_handle);
  55.       global_handle=0;
  56.     }
  57.   }
  58. }
  59.  
  60. void global_char(char ch)
  61. {
  62.   global_buf[global_ptr++]=ch;
  63.   if (global_ptr==GLOBAL_SIZE) {
  64.     write(global_handle,global_buf,global_ptr);
  65.     global_ptr=0;
  66.   }
  67. }
  68.  
  69. void movecsr(int x,int y)
  70. /* This, obviously, moves the cursor to the location specified, offset from
  71.  * the protected dispaly at the top of the screen
  72.  */
  73. {
  74.   if (x<0)
  75.     x=0;
  76.   if (x>79)
  77.     x=79;
  78.   if (y<0)
  79.     y=0;
  80.   y+=topline;
  81.   if (y>screenbottom)
  82.     y=screenbottom;
  83.  
  84.   _BH=0x00;
  85.   _DH=y;
  86.   _DL=x;
  87.   _AH=0x02;
  88.   my_video_int();
  89. }
  90.  
  91. int wherex()
  92. /* This function returns the current X cursor position, as the number of
  93.  * characters from the left hand side of the screen.  An X position of zero
  94.  * means the cursor is at the left-most position
  95.  */
  96. {
  97.   _BH=0x00;
  98.   _AH=0x03;
  99.   my_video_int();
  100.   tempio=_DL;
  101.   return(tempio);
  102. }
  103.  
  104. int wherey()
  105. /* This function returns the Y cursor position, as the line number from
  106.  * the top of the logical window.  The offset due to the protected top
  107.  * of the screen display is taken into account.  A wherey() of zero means
  108.  * the cursor is at the top-most position it can be at.
  109.  */
  110. {
  111.   _BH=0x00;
  112.   _AH=0x03;
  113.   my_video_int();
  114.   tempio=_DH;
  115.   return(tempio-topline);
  116. }
  117.  
  118. void lf()
  119. /* This function performs a linefeed to the screen (but not remotely) by
  120.  * either moving the cursor down one line, or scrolling the logical screen
  121.  * up one line.
  122.  */
  123. {
  124.   _BH=0x00;
  125.   _AH=0x03;
  126.   my_video_int();
  127.   tempio=_DL;
  128.   if (_DH==screenbottom) {
  129.     SCROLL_UP(topline,screenbottom,1);
  130.     _DL=tempio;
  131.     _DH=screenbottom;
  132.     _BH=0;
  133.     _AH=0x02;
  134.     my_video_int();
  135.   } else {
  136.     tempio=_DH+1;
  137.     _DH=tempio;
  138.     _AH=0x02;
  139.     my_video_int();
  140.   }
  141. }
  142.  
  143. void cr()
  144. /* This short function returns the local cursor to the left-most position
  145.  * on the screen.
  146.  */
  147. {
  148.   _BH=0x00;
  149.   _AH=0x03;
  150.   my_video_int();
  151.   _DL=0x00;
  152.   _AH=2;
  153.   my_video_int();
  154. }
  155.  
  156. void clrscrb()
  157. /* This clears the local logical screen */
  158. {
  159.   SCROLL_UP(topline,screenbottom,0);
  160.   movecsr(0,0);
  161.   lines_listed=0;
  162. }
  163.  
  164. void bs()
  165. /* This function moves the cursor one position to the left, or if the cursor
  166.  * is currently at its left-most position, the cursor is moved to the end of
  167.  * the previous line, except if it is on the top line, in which case nothing
  168.  * happens.
  169.  */
  170. {
  171.   _BH=0;
  172.   _AH=3;
  173.   my_video_int();
  174.   if (_DL==0) {
  175.     if (_DH != topline) {
  176.       _DL=79;
  177.       tempio=_DH-1;
  178.       _DH=tempio;
  179.       _AH=2;
  180.       my_video_int();
  181.     }
  182.   } else {
  183.     _DL--;
  184.     _AH=2;
  185.     my_video_int();
  186.   }
  187. }
  188.  
  189. void out1chx(unsigned char ch)
  190. /* This function outputs one character to the screen, then updates the
  191.  * cursor position accordingly, scolling the screen if necessary.  Not that
  192.  * this function performs no commands such as a C/R or L/F.  If a value of
  193.  * 8, 7, 13, 10, 12 (backspace, beep, C/R, L/F, TOF), or any other command-
  194.  * type characters are passed, the appropriate corresponding "graphics"
  195.  * symbol will be output to the screen as a normal character.
  196.  */
  197. {
  198.   _BL=curatr;
  199.   _BH=0x00;
  200.   _CX=0x01;
  201.   _AL=ch;
  202.   _AH=0x09;
  203.   my_video_int();
  204.   _BH=0x00;
  205.   _AH=0x03;
  206.   my_video_int();
  207.   ++_DL;
  208.   if (_DL==80) {
  209.     _DL=0;
  210.     if (_DH==screenbottom) {
  211.       SCROLL_UP(topline,screenbottom,1);
  212.       _DH=screenbottom;
  213.       _DL=0;
  214.       _BH=0;
  215.       _AH=0x02;
  216.       my_video_int();
  217.     } else {
  218.       tempio=_DH+1;
  219.       _DH=tempio;
  220.       _AH=0x02;
  221.       my_video_int();
  222.     }
  223.   } else {
  224.     _AH=0x02;
  225.     my_video_int();
  226.   }
  227. }
  228.  
  229. void out1ch(unsigned char ch)
  230. /* This function outputs one character to the local screen.  C/R, L/F, TOF,
  231.  * BS, and BELL are interpreted as commands instead of characters.
  232.  */
  233. {
  234.   if (ch>31)
  235.     out1chx(ch);
  236.   else
  237.     if (ch==13)
  238.       cr();
  239.     else
  240.       if (ch==10)
  241.         lf();
  242.       else
  243.         if (ch==12)
  244.           clrscrb();
  245.         else
  246.           if (ch==8)
  247.             bs();
  248.           else
  249.             if (ch==7)
  250.               if (outcom==0) {
  251.                 setbeep(1);
  252.                 wait1(4);
  253.                 setbeep(0);
  254.               }
  255. }
  256.  
  257. void outs(char *s)
  258. /* This (obviously) outputs a string TO THE SCREEN ONLY */
  259. {
  260.   int i;
  261.   char ch;
  262.  
  263.   for (i=0; s[i]!=0; i++) {
  264.     ch=s[i];
  265.     out1ch(ch);
  266.   }
  267. }
  268.  
  269. void pr_wait(int i1)
  270. {
  271.   int i;
  272.  
  273.   if (i1) {
  274.     if (okansi()) {
  275.       i=curatr;
  276.       setc((thisuser.sysstatus & sysstatus_color) ? thisuser.colors[3] :
  277.             thisuser.bwcolors[3]);
  278.       outstr("[Stimpy Working]\x1b[16D");
  279.       setc(i);
  280.     } else {
  281.       outstr("[Stimpy Working]");
  282.     }
  283.   } else {
  284.     if (okansi()) {
  285.       outstr("                \x1b[16D");
  286.     } else {
  287.       for (i=0; i<16; i++)
  288.         backspace();
  289.     }
  290.   }
  291. }
  292.  
  293. void set_protect(int l)
  294. /* set_protect sets the number of lines protected at the top of the screen. */
  295. {
  296.   if (l!=topline) {
  297.     if (l>topline) {
  298.       if ((wherey()+topline-l) < 0) {
  299.         _CH=topline;
  300.         _DH=screenbottom+1;
  301.         _AL=l-topline;
  302.         _CL=0;
  303.         _DL=79;
  304.         _BH=0x07;
  305.         _AH=7;
  306.         my_video_int();
  307.         movecsr(wherex(),wherey()+l-topline);
  308.       } else {
  309.         oldy += (topline-l);
  310.       }
  311.     } else {
  312.       SCROLL_UP(l,topline-1,0);
  313.       oldy += (topline-l);
  314.     }
  315.   }
  316.   topline=l;
  317.   if (using_modem)
  318.     screenlinest=thisuser.screenlines;
  319.   else
  320.     screenlinest=defscreenbottom+1-topline;
  321. }
  322.  
  323. void savescreen(screentype *s)
  324. {
  325.   memmove(s->scrn1,scrn,screenlen);
  326.   s->x1=wherex();
  327.   s->y1=wherey();
  328.   s->topline1=topline;
  329.   s->curatr1=curatr;
  330. }
  331.  
  332. void restorescreen(screentype far *s)
  333. /* restorescreen restores a screen previously saved with savescreen */
  334. {
  335.   memmove(scrn,s->scrn1,screenlen);
  336.   topline=s->topline1;
  337.   curatr=s->curatr1;
  338.   movecsr(s->x1,s->y1);
  339. }
  340.  
  341. void makewindow(int x, int y, int xlen, int ylen)
  342. /* makewindow makes a window with the upper-left hand corner at (x,y), and the
  343.    lower-right corner at (x+xlen,y+ylen) */
  344. {
  345.   int i,xx,yy;
  346.   unsigned char s[81];
  347.  
  348.   if (xlen>80)
  349.     xlen=80;
  350.   if (ylen>(screenbottom+1-topline))
  351.     ylen=(screenbottom+1-topline);
  352.   if ((x+xlen)>80)
  353.     x=80-xlen;
  354.   if ((y+ylen)>screenbottom+1)
  355.     y=screenbottom+1-ylen;
  356.   xx=wherex();
  357.   yy=wherey();
  358.   for (i=1; i<xlen-1; i++)
  359.     s[i]=196;
  360.   s[0]=218;
  361.   s[xlen-1]=191;
  362.   s[xlen]=0;
  363.   movecsr(x,y);
  364.   outs(s);
  365.   s[0]=192;
  366.   s[xlen-1]=217;
  367.   movecsr(x,y+ylen-1);
  368.   outs(s);
  369.   for (i=1; i<xlen-1; i++)
  370.     s[i]=32;
  371.   s[0]=179;
  372.   s[xlen-1]=179;
  373.   for (i=1; i<ylen-1; i++) {
  374.     movecsr(x,i+y);
  375.     outs(s);
  376.   }
  377.   movecsr(xx,yy);
  378. }
  379.  
  380. void editline(char *s, int len, int status, int *returncode, char *ss)
  381. /* editline edits a string, doing I/O to the screen only. */
  382. {
  383.   int i,j,k,oldatr,cx,cy,pos,ch,done,insert,i1;
  384.  
  385.   oldatr=curatr;
  386.   cx=wherex();
  387.   cy=wherey();
  388.   for (i=strlen(s); i<len; i++)
  389.     s[i]=32;
  390.   s[len]=0;
  391.   curatr=0x70;
  392.   outs(s);
  393.   movecsr(cx,cy);
  394.   done=0;
  395.   pos=0;
  396.   insert=0;
  397.   do {
  398.     ch=getchd();
  399.     if (ch==0) {
  400.       ch=getchd();
  401.       switch (ch) {
  402.         case 59:
  403.           done=1;
  404.           *returncode=DONE;
  405.           break;
  406.         case 71: pos=0; movecsr(cx,cy); break;
  407.         case 79: pos=len; movecsr(cx+pos,cy); break;
  408.         case 77: if (pos<len) {
  409.             pos++;
  410.             movecsr(cx+pos,cy);
  411.           }
  412.           break;
  413.         case 75: if (pos>0) {
  414.             pos--;
  415.             movecsr(cx+pos,cy);
  416.           }
  417.           break;
  418.         case 72:
  419.         case 15:
  420.           done=1;
  421.           *returncode=PREV;
  422.           break;
  423.         case 80:
  424.           done=1;
  425.           *returncode=NEXT;
  426.           break;
  427.         case 82:
  428.           if (status!=SET) {
  429.             if (insert)
  430.               insert=0;
  431.             else
  432.               insert=1;
  433.           }
  434.           break;
  435.         case 83:
  436.           if (status!=SET) {
  437.             for (i=pos; i<len; i++)
  438.               s[i]=s[i+1];
  439.             s[len-1]=32;
  440.             movecsr(cx,cy);
  441.             outs(s);
  442.             movecsr(cx+pos,cy);
  443.           }
  444.           break;
  445.       }
  446.     } else {
  447.       if (ch>31) {
  448.         if (status==UPPER_ONLY)
  449.           ch=upcase(ch);
  450.     if (status==SET) {
  451.       ch=upcase(ch);
  452.       if (ch!=' ') {
  453.         i1=1;
  454.             for (i=0; i<len; i++)
  455.           if ((ch==ss[i]) && (i1)) {
  456.         i1=0;
  457.         pos=i;
  458.         movecsr(cx+pos,cy);
  459.         if (s[pos]==' ')
  460.           ch=ss[pos];
  461.         else
  462.           ch=' ';
  463.           }
  464.         if (i1)
  465.           ch=ss[pos];
  466.       }
  467.     }
  468.         if ((pos<len)&&((status==ALL) || (status==UPPER_ONLY) || (status==SET) ||
  469.             ((status==NUM_ONLY) && (((ch>='0') && (ch<='9')) || (ch==' '))))) {
  470.           if (insert) {
  471.             for (i=len-1; i>pos; i--)
  472.               s[i]=s[i-1];
  473.             s[pos++]=ch;
  474.             movecsr(cx,cy);
  475.             outs(s);
  476.             movecsr(cx+pos,cy);
  477.           } else {
  478.             s[pos++]=ch;
  479.             out1ch(ch);
  480.           }
  481.         }
  482.       } else {
  483.     ch=ch;
  484.         switch(ch) {
  485.       case 13:
  486.           case 9:
  487.             done=1;
  488.             *returncode=NEXT;
  489.             break;
  490.           case 27:
  491.             done=1;
  492.             *returncode=DONE;
  493.             break;
  494.           case 8:
  495.             if (pos>0) {
  496.               if (insert) {
  497.                 for (i=pos-1; i<len; i++)
  498.                   s[i]=s[i+1];
  499.                 s[len-1]=32;
  500.                 pos--;
  501.                 movecsr(cx,cy);
  502.                 outs(s);
  503.                 movecsr(cx+pos,cy);
  504.               } else {
  505.                 pos--;
  506.                 movecsr(cx+pos,cy);
  507.               }
  508.             }
  509.             break;
  510.         }
  511.       }
  512.     }
  513.   } while (done==0);
  514.   movecsr(cx,cy);
  515.   curatr=oldatr;
  516.   outs(s);
  517.   movecsr(cx,cy);
  518. }
  519.  
  520. void val_cur_user()
  521. /* val_cur_user allows the sysop at the keyboard to validate the current user,
  522.    chaning sl, dsl, ar, dar, sysop sub, exemptions, restrictions, and user
  523.    note
  524.  */
  525. {
  526.   char sl[4],dsl[4],exempt[4],sysopsub[4],ar[17],dar[17],restrict[17],rst[17],
  527.        tl[50];
  528.   int cp,i,done,rc,wx,wy;
  529.  
  530.   pr_wait(1);
  531.   savescreen(&screensave);
  532.   curatr=7;
  533.   wx=15;
  534.   wy=4;
  535.   makewindow(wx,wy,50,7);
  536.   itoa((int)thisuser.sl,sl,10);
  537.   itoa((int)thisuser.dsl,dsl,10);
  538.   itoa((int)thisuser.exempt,exempt,10);
  539.   itoa((int)thisuser.sysopsub,sysopsub,10);
  540.   strcpy(rst,restrict_string);
  541.   for (i=0; i<=15; i++) {
  542.     if (thisuser.ar & (1 << i))
  543.       ar[i]='A'+i;
  544.     else
  545.       ar[i]=32;
  546.     if (thisuser.dar & (1 << i))
  547.       dar[i]='A'+i;
  548.     else
  549.       dar[i]=32;
  550.     if (thisuser.restrict & (1 << i))
  551.       restrict[i]=rst[i];
  552.     else
  553.       restrict[i]=32;
  554.   }
  555.   dar[16]=0;
  556.   ar[16]=0;
  557.   restrict[16]=0;
  558.   cp=0;
  559.   done=0;
  560.   movecsr(wx+2,wy+1); sprintf(tl,"SL  : %s",sl); outs(tl);
  561.   movecsr(wx+26,wy+1); sprintf(tl,"AR  : %s",ar); outs(tl);
  562.   movecsr(wx+2,wy+2); sprintf(tl,"DSL : %s",dsl); outs(tl);
  563.   movecsr(wx+26,wy+2); sprintf(tl,"DAR : %s",dar); outs(tl);
  564.   movecsr(wx+2,wy+3); sprintf(tl,"EXMT: %s",exempt); outs(tl);
  565.   movecsr(wx+26,wy+3); sprintf(tl,"RSTR: %s",restrict); outs(tl);
  566.   movecsr(wx+2,wy+4); sprintf(tl,"SYSOPSUB: %s",sysopsub); outs(tl);
  567.   movecsr(wx+2,wy+5); sprintf(tl,"NOTE: %s",thisuser.note); outs(tl);
  568.   while (done==0) {
  569.     switch(cp) {
  570.       case 0:
  571.         movecsr(wx+8,wy+1);
  572.         editline(sl,3,NUM_ONLY,&rc,"");
  573.         thisuser.sl=(char) atoi(sl);
  574.         itoa((int)thisuser.sl,sl,10);
  575.         sprintf(tl,"%-3s",sl); outs(tl);
  576.         break;
  577.       case 1:
  578.         movecsr(wx+32,wy+1);
  579.         editline(ar,16,SET,&rc,"ABCDEFGHIJKLMNOP ");
  580.         thisuser.ar=0;
  581.         for (i=0; i<=15; i++)
  582.           if (ar[i]!=32)
  583.             thisuser.ar |= (1 << i);
  584.         break;
  585.       case 2:
  586.         movecsr(wx+8,wy+2);
  587.         editline(dsl,3,NUM_ONLY,&rc,"");
  588.         thisuser.dsl=(char) atoi(dsl);
  589.         itoa((int)thisuser.dsl,dsl,10);
  590.         sprintf(tl,"%-3s",dsl); outs(tl);
  591.         break;
  592.       case 3:
  593.         movecsr(wx+32,wy+2);
  594.         editline(dar,16,SET,&rc,"ABCDEFGHIJKLMNOP ");
  595.         thisuser.dar=0;
  596.         for (i=0; i<=15; i++)
  597.           if (dar[i]!=32)
  598.             thisuser.dar |= (1 << i);
  599.         break;
  600.       case 4:
  601.         movecsr(wx+8,wy+3);
  602.         editline(exempt,3,NUM_ONLY,&rc,"");
  603.         thisuser.exempt=(char) atoi(exempt);
  604.         itoa((int)thisuser.exempt,exempt,10);
  605.         sprintf(tl,"%-3s",exempt); outs(tl);
  606.         break;
  607.       case 5:
  608.         movecsr(wx+32,wy+3);
  609.         editline(restrict,16,SET,&rc,rst);
  610.         thisuser.restrict=0;
  611.         for (i=0; i<=15; i++)
  612.           if (restrict[i]!=32)
  613.             thisuser.restrict |= (1 << i);
  614.         break;
  615.       case 6:
  616.         movecsr(wx+12,wy+4);
  617.         editline(sysopsub,3,NUM_ONLY,&rc,"");
  618.         thisuser.sysopsub=(char) atoi(sysopsub);
  619.         itoa((int)thisuser.sysopsub,sysopsub,10);
  620.         sprintf(tl,"%-3s",sysopsub); outs(tl);
  621.         break;
  622.       case 7:
  623.         movecsr(wx+8,wy+5);
  624.         editline(thisuser.note,40,ALL,&rc,"");
  625.         break;
  626.     }
  627.     switch(rc) {
  628.       case DONE: done=1; break;
  629.       case NEXT: cp=(cp+1) % 8; break;
  630.       case PREV: cp--; if (cp==-1) cp=7;  break;
  631.     }
  632.   }
  633.   restorescreen(&screensave);
  634.   reset_act_sl();
  635.   changedsl();
  636.   pr_wait(0);
  637. }
  638.  
  639. void temp_cmd(char *s, int ccc)
  640. {
  641.   int i;
  642.  
  643.   pr_wait(1);
  644.   savescreen(&screensave);
  645.   i=topline;
  646.   topline=0;
  647.   curatr=0x07;
  648.   clrscrb();
  649.   do_remote(s, ccc);
  650.   restorescreen(&screensave);
  651.   topline=i;
  652.   pr_wait(0);
  653. }
  654.  
  655. char xlate[] = {
  656.   'Q','W','E','R','T','Y','U','I','O','P',0,0,0,0,
  657.   'A','S','D','F','G','H','J','K','L',0,0,0,0,0,
  658.   'Z','X','C','V','B','N','M',
  659. };
  660.  
  661. char scan_to_char(unsigned char ch)
  662. {
  663.   if ((ch>=16) && (ch<=50))
  664.     return(xlate[ch-16]);
  665.   else
  666.     return(0);
  667. }
  668.  
  669. void alt_key(unsigned char ch)
  670. {
  671.   char ch1;
  672.   char *ss, *ss1,s[81],cmd[128];
  673.   int f,l;
  674.  
  675.   cmd[0]=0;
  676.   ch1=scan_to_char(ch);
  677.   if (ch1) {
  678.     sprintf(s,"%sMACROS.TXT",syscfg.datadir);
  679.     f=open(s,O_RDONLY | O_BINARY);
  680.     if (f>0) {
  681.       l=filelength(f);
  682.       ss=farmalloc(l+10);
  683.       if (ss) {
  684.         read(f,ss,l);
  685.         close(f);
  686.     ss[l]=0;
  687.     ss1=strtok(ss,"\r\n");
  688.     while (ss1) {
  689.       if (toupper(*ss1)==ch1) {
  690.         strtok(ss1," \t");
  691.         ss1=strtok(NULL,"\r\n");
  692.         if (ss1)
  693.           strcpy(cmd,ss1);
  694.         ss1=NULL;
  695.       } else
  696.         ss1=strtok(NULL,"\r\n");
  697.     }
  698.     farfree(ss);
  699.       } else
  700.         close(f);
  701.       if (cmd[0]) {
  702.         temp_cmd(cmd,1);
  703.       }
  704.     }
  705.   }
  706. }
  707.  
  708. void skey(char ch)
  709. /* skey handles all f-keys and the like hit FROM THE KEYBOARD ONLY */
  710. {
  711.   int i,i1;
  712.  
  713.   if (((syscfg.sysconfig & sysconfig_no_local) ==0) && (okskey)) {
  714.     if ((ch>=104) && (ch<=113)) {
  715.       set_autoval(ch-104);
  716.     } else
  717.       switch ((unsigned char) ch) {
  718.         case 59: /* F1 */
  719.       val_cur_user();
  720.       break;
  721.         case 60: /* F2 */
  722.           topdata+=1;
  723.           if (topdata==3)
  724.             topdata=0;
  725.           topscreen();
  726.           break;
  727.     case 61: /* F3 */
  728.       if (using_modem) {
  729.         incom=(!incom);
  730.         dump();
  731.             tleft(0);
  732.       }
  733.       break;
  734.         case 62: /* F4 */
  735.           chatcall=0;
  736.           topscreen();
  737.           break;
  738.         case 63: /* F5 */
  739.           hangup=1;
  740.       dtr(0);
  741.       break;
  742.     case 64: /* F6 */
  743.       sysop_alert=!sysop_alert;
  744.           tleft(0);
  745.       break;
  746.         case 65: /* F7 */
  747.           thisuser.extratime-=5.0*60.0;
  748.           tleft(0);
  749.           break;
  750.         case 66: /* F8 */
  751.           thisuser.extratime+=5.0*60.0;
  752.           tleft(0);
  753.           break;
  754.         case 67: /* F9 */
  755.           if (thisuser.sl!=255) {
  756.             if (actsl!=255)
  757.               actsl=255;
  758.             else
  759.               reset_act_sl();
  760.             changedsl();
  761.             tleft(0);
  762.           }
  763.           break;
  764.         case 68: /* F10 */
  765.           if (chatting==0) {
  766.             if (syscfg.sysconfig & sysconfig_2_way)
  767.               chat1("",1);
  768.             else
  769.               chat1("",0);
  770.           } else
  771.             chatting=0;
  772.           break;
  773.     case 71: /* HOME */
  774.       if (chatting) {
  775.         if (chat_file)
  776.           chat_file=0;
  777.         else
  778.           chat_file=1;
  779.       }
  780.       break;
  781.     case 88: /* Shift-F5 */
  782.       i1=(rand() % 20) + 10;
  783.       for (i=0; i<i1; i++)
  784.         outchr(rand() % 256);
  785.           hangup=1;
  786.       dtr(0);
  787.       break;
  788.     case 98: /* Ctrl-F5 */
  789.       nl();
  790.       pl("fCall back later when you are there.");
  791.       nl();
  792.       hangup=1;
  793.       dtr(0);
  794.       break;
  795.         case 103: /* Ctrl-F10 */
  796.           if (chatting==0)
  797.             chat1("",0);
  798.           else
  799.             chatting=0;
  800.           break;
  801.         case 84: /* Shift-F1 */
  802.           set_global_handle(!global_handle);
  803.           topscreen();
  804.           break;
  805.         case 93: /* Shift-F10 */
  806.           temp_cmd(getenv("COMSPEC"),0);
  807.           break;
  808.         default:
  809.           alt_key((unsigned char) ch);
  810.           break;
  811.       }
  812.   }
  813. }
  814.  
  815. void tleft(int x)
  816. {
  817.   int cx,cy,ctl,cc,ln,i;
  818.   double nsln;
  819.   char tl[30];
  820.  
  821.   cx=wherex();
  822.   cy=wherey();
  823.   ctl=topline;
  824.   cc=curatr;
  825.   if (crttype==7)
  826.     curatr=0x07;
  827.   else
  828.     curatr=0x0e;
  829.   topline=0;
  830.   nsln=nsl();
  831.   if (chatcall && (topdata==2))
  832.     ln=5;
  833.   else
  834.     ln=4;
  835.   if (topdata) {
  836.     if ((using_modem) && (!incom)) {
  837.       movecsr(1,ln);
  838.       outs("═════Comm Disabled═");
  839.       for (i=19; i<strlen(curspeed); i++)
  840.         out1ch('═');
  841.     } else {
  842.       movecsr(1,ln);
  843.       outs(curspeed);
  844.     }
  845.     if ((thisuser.sl!=255) && (actsl==255)) {
  846.       movecsr(23,ln);
  847.       outs("═Temp Sysop═");
  848.     }
  849.     if (global_handle) {
  850.       movecsr(40,ln);
  851.       outs("═Capture═");
  852.     }
  853.     movecsr(54,ln);
  854.     if (sysop_alert) {
  855.       outs("═Alert═");
  856.     } else {
  857.       outs("═══════");
  858.     }
  859.     movecsr(64,ln);
  860.     if (sysop1()) {
  861.       outs("═Available═");
  862.     } else {
  863.       outs("═══════════");
  864.     }
  865.   }
  866.   switch (topdata)
  867.     {
  868.     case 1:
  869.       if (useron) {
  870.         movecsr(18,3);
  871.         sprintf(tl,"T-%6.2f",nsln/60.0);
  872.         outs(tl);
  873.       }
  874.       break;
  875.     case 2:
  876.       movecsr(64,3);
  877.       if (useron)
  878.         sprintf(tl,"T-%6.2f",nsln/60.0);
  879.       else
  880.         strcpy(tl,thisuser.pw);
  881.       outs(tl);
  882.       break;
  883.   }
  884.   topline=ctl;
  885.   curatr=cc;
  886.   movecsr(cx,cy);
  887.   if ((x) && (useron))
  888.     if (nsln==0.0) {
  889.       outstr("\r\nTime expired.\r\n");
  890.       hangup=1;
  891.     }
  892. }
  893.  
  894. void topscreen()
  895. {
  896.   int cc,cx,cy,ctl,i;
  897.   char sl[81],ar[17],dar[17],restrict[17],rst[17],lo[90],ol[190],calls[20];
  898.  
  899.   switch(topdata) {
  900.     case 0:
  901.       set_protect(0);
  902.       break;
  903.     case 1:
  904.       set_protect(5);
  905.       break;
  906.     case 2:
  907.       if (chatcall)
  908.         set_protect(6);
  909.       else {
  910.         if (topline==6)
  911.           set_protect(0);
  912.         set_protect(5);
  913.       }
  914.       break;
  915.   }
  916.   cx=wherex();
  917.   cy=wherey();
  918.   ctl=topline;
  919.   cc=curatr;
  920.   if (crttype==7)
  921.     curatr=0x07;
  922.   else
  923.     curatr=0x0e;
  924.   topline=0;
  925.   for (i=0; i<80; i++)
  926.     sl[i]=205;
  927.   sl[80]=0;
  928.   switch (topdata) {
  929.     case 0:
  930.       break;
  931.     case 1:
  932.       movecsr(0,0);
  933.       sprintf(ol,"%-50s  Activity for %8s:      ",
  934.           syscfg.systemname,status.date1);
  935.       outs(ol);
  936.       movecsr(0,1);
  937.       sprintf(ol,"Users: %4d       Total Calls: %5ld      Calls Today: %4d    Posted      :%3d ",
  938.           status.users,status.callernum1,status.callstoday,status.msgposttoday);
  939.       outs(ol);
  940.       movecsr(0,2);
  941.       sprintf(ol,"%-36s      %-4d min   /  %2d%%    E-mail sent :%3d ",
  942.           nam(&thisuser,usernum),status.activetoday,
  943.           (int) (10*status.activetoday/144),status.emailtoday);
  944.       outs(ol);
  945.       movecsr(0,3);
  946.       sprintf(ol,"SL=%3d   DL=%3d               FW=%3d      Uploaded:%2d files    Feedback    :%3d ",
  947.           thisuser.sl,thisuser.dsl,fwaiting,status.uptoday,status.fbacktoday);
  948.       outs(ol);
  949.       break;
  950.     case 2:
  951.       strcpy(rst,restrict_string);
  952.       for (i=0; i<=15; i++) {
  953.         if (thisuser.ar & (1 << i))
  954.           ar[i]='A'+i;
  955.         else
  956.           ar[i]=32;
  957.         if (thisuser.dar & (1 << i))
  958.           dar[i]='A'+i;
  959.         else
  960.           dar[i]=32;
  961.         if (thisuser.restrict & (1 << i))
  962.           restrict[i]=rst[i];
  963.         else
  964.           restrict[i]=32;
  965.       }
  966.       dar[16]=0;
  967.       ar[16]=0;
  968.       restrict[16]=0;
  969.       if (strcmp(thisuser.laston,date()))
  970.         strcpy(lo,thisuser.laston);
  971.       else
  972.         sprintf(lo,"Today:%2d",thisuser.ontoday);
  973.       movecsr(0,0);
  974.       sprintf(ol,"%-36s W=%2d UL=%4d/%6ld SL=%3d LO=%5d PO=%4d",
  975.           nam(&thisuser,usernum),thisuser.waiting,thisuser.uploaded,
  976.           thisuser.uk,thisuser.sl,thisuser.logons,thisuser.msgpost);
  977.       outs(ol);
  978.       movecsr(0,1);
  979.       if (thisuser.wwiv_regnum)
  980.         sprintf(calls,"%lu",thisuser.wwiv_regnum);
  981.       else
  982.     strcpy(calls,thisuser.zipcode);
  983.       sprintf(ol,"%-20s %12s  %-6s DL=%4d/%6ld DL=%3d TO=%5.0ld ES=%4d",
  984.           thisuser.realname,thisuser.phone,calls,
  985.           thisuser.downloaded,thisuser.dk,thisuser.dsl,
  986.           ((long) ((thisuser.timeon+timer()-timeon)/60.0)),
  987.           thisuser.emailsent+thisuser.emailnet);
  988.       outs(ol);
  989.       movecsr(0,2);
  990.       sprintf(ol,"ARs=%-16s/%-16s R=%-16s EX=%3d %-8s FS=%4d",
  991.           ar,dar,restrict,thisuser.exempt,lo,thisuser.feedbacksent);
  992.       outs(ol);
  993.       movecsr(0,3);
  994.       sprintf(ol,"%-40s %c %2d %-17s          FW= %3d",
  995.           thisuser.note,thisuser.sex,thisuser.age,
  996.           ctypes[thisuser.comp_type],fwaiting);
  997.       outs(ol);
  998.       if (chatcall) {
  999.         movecsr(0,4);
  1000.         outs(chatreason);
  1001.       }
  1002.       break;
  1003.   }
  1004.   if (ctl!=0) {
  1005.     movecsr(0,ctl-1);
  1006.     outs(sl);
  1007.   }
  1008.   topline=ctl;
  1009.   movecsr(cx,cy);
  1010.   curatr=cc;
  1011.   tleft(0);
  1012. }
  1013. /****************************************************************************/
  1014.  
  1015. #ifdef TWO_WAY
  1016.  
  1017. int x1,y1,x2,y2,cp0,cp1;
  1018.  
  1019. void two_way_chat(char *s, char *rollover, int maxlen, int crend)
  1020. {
  1021.   char s2[100], temp1[50], side0[12] [80], side1[12] [80];
  1022.   int side, cnt, cnt2, cntr;
  1023.   int i,i1,done,cm,begx;
  1024.   char s1[255];
  1025.   unsigned char ch;
  1026.  
  1027.   cm=chatting;
  1028.   begx=wherex();
  1029.   if (rollover[0]!=0) {
  1030.     if (charbufferpointer) {
  1031.       strcpy(s1,rollover);
  1032.       strcat(s1,&charbuffer[charbufferpointer]);
  1033.       strcpy(&charbuffer[1],s1);
  1034.       charbufferpointer=1;
  1035.     } else {
  1036.       strcpy(&charbuffer[1],rollover);
  1037.       charbufferpointer=1;
  1038.     }
  1039.     rollover[0]=0;
  1040.   }
  1041.   done=0;
  1042.   side = 0;
  1043.   do {
  1044.     ch=getkey();
  1045.       if (lastcon)
  1046.         {
  1047.           if (wherey() == 11)
  1048.             {
  1049.               outstr("\x1b[12;1H");
  1050.               ansic(3);
  1051.                 for(cnt=0;cnt<=thisuser.screenchars;cnt++)
  1052.                     s2[cnt]=205;
  1053.           strcpy(temp1,"4 Two Way Chat 3");
  1054.           cnt=(((thisuser.screenchars-strlen(temp1)) /2));
  1055.           strncpy(&s2[cnt+1],temp1,(strlen(temp1)));
  1056.           s2[thisuser.screenchars]=0;
  1057.           outstr(s2);
  1058.           s2[0]=0;
  1059.           temp1[0]=0;
  1060.                 for(cntr=1;cntr<12;cntr++)
  1061.                   {
  1062.                     sprintf(s2,"\x1b[%d;%dH",cntr,1);
  1063.                     outstr(s2);
  1064.                       if ((cntr >=0) && (cntr <5))
  1065.                         {
  1066.                           ansic(1);
  1067.                           outstr(side0[cntr+6]);
  1068.                          }
  1069.                     outstr("\x1b[K");
  1070.                     s2[0]=0;
  1071.                   }
  1072.               sprintf(s2,"\x1b[%d;%dH",5,1);
  1073.               outstr(s2);
  1074.               s2[0]=0;
  1075.             }
  1076.           else
  1077.             if (wherey() > 11)
  1078.               {
  1079.                 x2=(wherex()+1);
  1080.                 y2=(wherey()+1);
  1081.                 sprintf(s2,"\x1b[%d;%dH",y1,x1);
  1082.                 outstr(s2);
  1083.                 s2[0]=0;
  1084.               }
  1085.           side = 0;
  1086.           ansic(1);
  1087.         }
  1088.       else
  1089.         {
  1090.           if (wherey() >= 23)
  1091.             {
  1092.               for(cntr=13;cntr<25;cntr++)
  1093.                 {
  1094.                   sprintf(s2,"\x1b[%d;%dH",cntr,1);
  1095.                   outstr(s2);
  1096.                     if ((cntr >= 13) && (cntr <17))
  1097.                       {
  1098.                         ansic(5);
  1099.                         outstr(side1[cntr-7]);
  1100.                       }
  1101.                   outstr("\x1b[K");
  1102.                   s2[0]=0;
  1103.                 }
  1104.               sprintf(s2,"\x1b[%d;%dH",17,1);
  1105.               outstr(s2);
  1106.               s2[0]=0;
  1107.             }
  1108.           else
  1109.             if ((wherey() < 12) && (side == 0))
  1110.               {
  1111.                 x1=(wherex()+1);
  1112.                 y1=(wherey()+1);
  1113.                 sprintf(s2,"\x1b[%d;%dH",y2,x2);
  1114.                 outstr(s2);
  1115.                 s2[0]=0;
  1116.               }
  1117.           side=1;
  1118.           ansic(5);
  1119.         }
  1120.     if (cm)
  1121.       if (chatting==0)
  1122.         ch=13;
  1123.     if ((ch>=32)) {
  1124.       if (side==0)
  1125.        {
  1126.          if ((wherex()<(thisuser.screenchars-1)) && (cp0<maxlen))
  1127.            {
  1128.              if (wherey() < 11)
  1129.                {
  1130.                  side0[wherey()][cp0++]=ch;
  1131.                  outchr(ch);
  1132.                }
  1133.              else
  1134.               {
  1135.               side0[wherey()][cp0++]=ch;
  1136.               side0[wherey()][cp0]=0;
  1137.               for(cntr=0;cntr<12;cntr++)
  1138.                 {
  1139.                   sprintf(s2,"\x1b[%d;%dH",cntr,1);
  1140.                   outstr(s2);
  1141.                   if ((cntr >=0) && (cntr <6))
  1142.                     {
  1143.                       ansic(1);
  1144.                       outstr(side0[cntr+6]);
  1145.                       y1=wherey()+1;
  1146.                       x1=wherex()+1;
  1147.                     }
  1148.                   outstr("\x1b[K");
  1149.                   s2[0]=0;
  1150.                 }
  1151.               sprintf(s2,"\x1b[%d;%dH",y1,x1);
  1152.               outstr(s2);
  1153.               s2[0]=0;
  1154.             }
  1155.         if (wherex()==(thisuser.screenchars-1))
  1156.             done=1;
  1157.       } else {
  1158.         if (wherex()>=(thisuser.screenchars-1))
  1159.             done=1;
  1160.       }
  1161.       }
  1162.       else
  1163.        {
  1164.          if ((wherex()<(thisuser.screenchars-1)) && (cp1<maxlen) )
  1165.            {
  1166.               if (wherey() < 23)
  1167.                 {
  1168.                   side1[wherey()-13][cp1++]=ch;
  1169.                   outchr(ch);
  1170.                 }
  1171.              else
  1172.               {
  1173.                 side1[wherey()-13][cp1++]=ch;
  1174.                 side1[wherey()-13][cp1]=0;
  1175.                   for(cntr=13;cntr<25;cntr++)
  1176.                     {
  1177.                       sprintf(s2,"\x1b[%d;%dH",cntr,1);
  1178.                       outstr(s2);
  1179.                         if ((cntr >=13) && (cntr <18))
  1180.                           {
  1181.                             ansic(5);
  1182.                             outstr(side1[cntr-7]);
  1183.                             y2=wherey()+1;
  1184.                             x2=wherex()+1;
  1185.                           }
  1186.                        outstr("\x1b[K");
  1187.                        s2[0]=0;
  1188.                      }
  1189.               sprintf(s2,"\x1b[%d;%dH",y2,x2);
  1190.               outstr(s2);
  1191.               s2[0]=0;
  1192.             }
  1193.         if (wherex()==(thisuser.screenchars-1))
  1194.             done=1;
  1195.       } else {
  1196.         if (wherex()>=(thisuser.screenchars-1))
  1197.             done=1;
  1198.       }
  1199.       }
  1200.     } else
  1201.         switch(ch) {
  1202.       case 7:
  1203.         if ((chatting) && (outcom))
  1204.           outcomch(7);
  1205.         break;
  1206.           case 13: /* C/R */
  1207.               if (side == 0)
  1208.                 side0[wherey()][cp0]=0;
  1209.               else
  1210.                 side1[wherey()-13][cp1]=0;
  1211.             done=1;
  1212.             break;
  1213.           case 8:  /* Backspace */
  1214.             if (side==0)
  1215.               {
  1216.                 if (cp0)
  1217.                   {
  1218.                     if (side0[wherey()][cp0-2]==3)
  1219.                       {
  1220.                         cp0-=2;
  1221.                         ansic(0);
  1222.                       }
  1223.                     else
  1224.                       if (side0[wherey()][cp0-1]==8)
  1225.                         {
  1226.                           cp0--;
  1227.                           outchr(32);
  1228.                         }
  1229.                       else
  1230.                         {
  1231.                           cp0--;
  1232.                           backspace();
  1233.                         }
  1234.                   }
  1235.               }
  1236.             else
  1237.               if (cp1)
  1238.                 {
  1239.                   if (side1[wherey()-13][cp1-2]==3)
  1240.                     {
  1241.                       cp1-=2;
  1242.                       ansic(0);
  1243.                     }
  1244.                   else
  1245.                     if (side1[wherey()-13][cp1-1]==8)
  1246.                       {
  1247.                         cp1--;
  1248.                         outchr(32);
  1249.                       }
  1250.                     else
  1251.                       {
  1252.                         cp1--;
  1253.                         backspace();
  1254.                       }
  1255.                 }
  1256.             break;
  1257.           case 24: /* Ctrl-X */
  1258.             while (wherex()>begx) {
  1259.               backspace();
  1260.                 if (side==0)
  1261.                   cp0=0;
  1262.                 else
  1263.                   cp1=0;
  1264.             }
  1265.             ansic(0);
  1266.             break;
  1267.           case 23: /* Ctrl-W */
  1268.             if (side==0)
  1269.               {
  1270.               if (cp0) {
  1271.               do {
  1272.                 if (side0[wherey()][cp0-2]==3) {
  1273.                   cp0-=2;
  1274.                   ansic(0);
  1275.                 } else
  1276.                   if (side0[wherey()][cp0-1]==8) {
  1277.                     cp0--;
  1278.                     outchr(32);
  1279.                   } else {
  1280.                     cp0--;
  1281.                     backspace();
  1282.                   }
  1283.               } while ((cp0) && (side0[wherey()][cp0-1]!=32) &&
  1284.                        (side0[wherey()][cp0-1]!=8) &&
  1285.                        (side0[wherey()][cp0-2]!=3));
  1286.               }
  1287.               }
  1288.             else
  1289.               {
  1290.               if (cp1) {
  1291.               do {
  1292.                 if (side1[wherey()-13][cp1-2]==3) {
  1293.                   cp1-=2;
  1294.                   ansic(0);
  1295.                 } else
  1296.                   if (side1[wherey()-13][cp1-1]==8) {
  1297.                     cp1--;
  1298.                     outchr(32);
  1299.                   } else {
  1300.                     cp1--;
  1301.                     backspace();
  1302.                   }
  1303.               } while ((cp1) && (side1[wherey()-13][cp1-1]!=32) &&
  1304.                        (side1[wherey()-13][cp1-1]!=8) &&
  1305.                        (side1[wherey()-13][cp1-2]));
  1306.               }
  1307.             }
  1308.             break;
  1309.           case 14: /* Ctrl-N */
  1310.                 if (side == 0)
  1311.                   {
  1312.                     if ((wherex()) && (cp0<maxlen))
  1313.                       {
  1314.                         outchr(8);
  1315.                         side0[wherey()][cp0++]=8;
  1316.                       }
  1317.                   }
  1318.                 else
  1319.                   if ((wherex()) && (cp1<maxlen))
  1320.                     {
  1321.                       outchr(8);
  1322.                       side1[wherey()-13][cp1++]=8;
  1323.                     }
  1324.         break;
  1325.       case 16: /* Ctrl-P */
  1326.         if (side==0)
  1327.         {
  1328.           if (cp0<maxlen-1)
  1329.           {
  1330.         ch=getkey();
  1331.         if ((ch>='0') && (ch<='9'))
  1332.         {
  1333.           side0[wherey()][cp0++]=3;
  1334.           side0[wherey()][cp0++]=ch;
  1335.           ansic(ch-'0');
  1336.         }
  1337.         else if ((ch>='A') && (ch<='F'))
  1338.         {
  1339.           side0[wherey()][cp0++]=3;
  1340.           side0[wherey()][cp0++]=ch;
  1341.           ansic(ch-'A'+10);
  1342.         }
  1343.         else if ((ch>='a') && (ch<='f'))
  1344.         {
  1345.           side0[wherey()][cp0++]=3;
  1346.           side0[wherey()][cp0++]=ch;
  1347.           ansic(ch-'a'+10);
  1348.         }
  1349.           }
  1350.         }
  1351.         else
  1352.         {
  1353.           if (cp1<maxlen-1)
  1354.           {
  1355.         ch=getkey();
  1356.         if ((ch>='0') && (ch<='9'))
  1357.         {
  1358.           side1[wherey()-13][cp1++]=3;
  1359.           side1[wherey()-13][cp1++]=ch;
  1360.           ansic(ch-'0');
  1361.         }
  1362.         else if ((ch>='A') && (ch<='F'))
  1363.         {
  1364.           side1[wherey()-13][cp1++]=3;
  1365.           side1[wherey()-13][cp1++]=ch;
  1366.           ansic(ch-'A'+10);
  1367.         }
  1368.         else if ((ch>='a') && (ch<='f'))
  1369.         {
  1370.           side1[wherey()-13][cp1++]=3;
  1371.           side1[wherey()-13][cp1++]=ch;
  1372.           ansic(ch-'a'+10);
  1373.         }
  1374.           }
  1375.         }
  1376.         break;
  1377.       case 9:  /* Tab */
  1378.         if (side==0)
  1379.               {
  1380.                 i=5-(cp0 % 5);
  1381.                   if (((cp0+i)<maxlen) && ((wherex()+i)<thisuser.screenchars))
  1382.                     {
  1383.                       i=5-((wherex()+1) % 5);
  1384.                         for (i1=0; i1<i; i1++)
  1385.                           {
  1386.                             side0[wherey()][cp0++]=32;
  1387.                             outchr(32);
  1388.                           }
  1389.                     }
  1390.               }
  1391.             else
  1392.               {
  1393.                 i=5-(cp1 % 5);
  1394.                   if (((cp1+i)<maxlen) && ((wherex()+i)<thisuser.screenchars))
  1395.                     {
  1396.                       i=5-((wherex()+1) % 5);
  1397.                         for (i1=0; i1<i; i1++)
  1398.                           {
  1399.                             side1[wherey()-13][cp1++]=32;
  1400.                             outchr(32);
  1401.                           }
  1402.                     }
  1403.               }
  1404.             break;
  1405.         }
  1406.   } while ((done==0) && (hangup==0));
  1407.   if (ch!=13)
  1408.   {
  1409.     if (side==0)
  1410.       {
  1411.         i=cp0-1;
  1412.           while ((i>0) && (side0[wherey()][i]!=32) &&
  1413.                  (side0[wherey()][i]!=8) || (side0[wherey()][i-1]==3))
  1414.             i--;
  1415.               if ((i>(wherex()/2)) && (i!=(cp0-1)))
  1416.                 {
  1417.                   i1=cp0-i-1;
  1418.                     for (i=0; i<i1; i++)
  1419.                       outchr(8);
  1420.                     for (i=0; i<i1; i++)
  1421.                       outchr(32);
  1422.                     for (i=0; i<i1; i++)
  1423.                       rollover[i]=side0[wherey()][cp0-i1+i];
  1424.                   rollover[i1]=0;
  1425.                   cp0 -= i1;
  1426.                 }
  1427.           side0[wherey()][cp0]=0;
  1428.       }
  1429.   else
  1430.       {
  1431.         i=cp1-1;
  1432.           while ((i>0) && (side1[wherey()-13][i]!=32) &&
  1433.                  (side1[wherey()-13][i]!=8) || (side1[wherey()-13][i-1]==3))
  1434.             i--;
  1435.               if ((i>(wherex()/2)) && (i!=(cp1-1)))
  1436.                 {
  1437.                   i1=cp1-i-1;
  1438.                     for (i=0; i<i1; i++)
  1439.                       outchr(8);
  1440.                     for (i=0; i<i1; i++)
  1441.                       outchr(32);
  1442.                     for (i=0; i<i1; i++)
  1443.                       rollover[i]=side1[wherey()-13][cp1-i1+i];
  1444.                   rollover[i1]=0;
  1445.                   cp1 -= i1;
  1446.                 }
  1447.           side1[wherey()-13][cp1]=0;
  1448.       }
  1449.   }
  1450.   if ((crend) && (wherey() != 11) && (wherey()<23))
  1451.     nl();
  1452.   if (side == 0)
  1453.     cp0=0;
  1454.   else
  1455.     cp1=0;
  1456.  s[0]=0;
  1457. }
  1458.  
  1459. #endif
  1460.  
  1461. void chat1(char *chatline, int two_way)
  1462. {
  1463.  
  1464.   int tempdata, cnt;
  1465.   char cl[81],xl[81],s[161],s1[161],atr[81],s2[81],cc;
  1466.   int i,i1,cf,oe;
  1467.   double tc;
  1468.  
  1469.   chatcall=0;
  1470.     chatting=1;
  1471.   tc=timer();
  1472.   cf=0;
  1473.  
  1474.   savel(cl,atr,xl,&cc);
  1475.   s1[0]=0;
  1476.  
  1477.   oe=echo;
  1478.   echo=1;
  1479.   nl();
  1480.   nl();
  1481.   tempdata=topdata;
  1482.   if (!okansi())
  1483.     two_way=0;
  1484.   if (modem_speed==300)
  1485.     two_way=0;
  1486.  
  1487. #ifndef TWO_WAY
  1488.   two_way=0;
  1489. #endif
  1490.  
  1491.   if (syscfg.sysconfig & sysconfig_two_color)
  1492.     two_color=1;
  1493. #ifdef TWO_WAY
  1494.   if (two_way) {
  1495.     clrscrb();
  1496.     cp0=0;
  1497.     cp1=0;
  1498.     if (defscreenbottom==24) {
  1499.       topdata=0;
  1500.       topscreen();
  1501.     }
  1502.     outstr("\x1b[2J");
  1503.     x2=1;
  1504.     y2=13;
  1505.     outstr("\x1b[1;1H");
  1506.     x1=wherex();
  1507.     y1=wherey();
  1508.     outstr("\x1b[12;1H");
  1509.     ansic(3);
  1510.     for(cnt=0;cnt<thisuser.screenchars;cnt++)
  1511.       outchr(205);
  1512.     strcpy(s,syscfg.sysopname);
  1513.     strcat(s," chatting with ");
  1514.     strcat(s,thisuser.name);
  1515.     cnt=((thisuser.screenchars-strlen(s))/2);
  1516.     sprintf(s1,"\x1b[12;%dH",cnt);
  1517.     outstr(s1);
  1518.     ansic(4);
  1519.     outstr(s);
  1520.     outstr("\x1b[1;1H");
  1521.     s[0]=0;
  1522.     s1[0]=0;
  1523.     s2[0]=0;
  1524.   }
  1525. #endif
  1526.   ansic(7);
  1527.   sprintf(s,"%s's here...",syscfg.sysopname);
  1528.   outstr(s);
  1529.   nl();
  1530.   nl();
  1531.   strcpy(s1,chatline);
  1532.   do {
  1533. #ifdef TWO_WAY
  1534.     if (two_way)
  1535.       two_way_chat(s,s1,160,1);
  1536.     else
  1537. #endif
  1538.       inli(s,s1,160,1);
  1539.     if ((chat_file) && (!two_way)) {
  1540.       if (cf==0) {
  1541.         if (!two_way)
  1542.           outs("-] Chat file opened.\r\n");
  1543.         sprintf(s2,"%sCHAT.TXT",syscfg.gfilesdir);
  1544.         cf=open(s2,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  1545.         lseek(cf,0L,SEEK_END);
  1546.         sprintf(s2,"\r\n\r\nChat file opened %s %s\r\n",date(),times());
  1547.         write(cf,(void *)s2,strlen(s2));
  1548.         strcpy(s2,"----------------------------------\r\n\r\n");
  1549.         write(cf,(void *)s2,strlen(s2));
  1550.       }
  1551.       strcat(s,"\r\n");
  1552.       write(cf,(void *)s,strlen(s));
  1553.     } else
  1554.       if (cf) {
  1555.     close(cf);
  1556.     cf=0;
  1557.         if (!two_way)
  1558.           outs("-] Chat file closed.\r\n");
  1559.       }
  1560.     if (hangup)
  1561.       chatting=0;
  1562.   } while (chatting);
  1563.   if (chat_file) {
  1564.     close(cf);
  1565.     chat_file=0;
  1566.   }
  1567.   ansic(0);
  1568.   two_color=0;
  1569.   if (two_way)
  1570.     outstr("\x1b[2J");
  1571.   nl();
  1572.   ansic(7);
  1573.   pl("Chat mode over...");
  1574.   nl();
  1575.   chatting=0;
  1576.   tc=timer()-tc;
  1577.   if (tc<0)
  1578.     tc += 86400.0;
  1579.   extratimecall += tc;
  1580.   topdata=tempdata;
  1581.   if (useron)
  1582.     topscreen();
  1583.   echo=oe;
  1584.   restorel(cl,atr,xl,&cc);
  1585. }
  1586.  
  1587. void set_autoval(int n)
  1588. {
  1589.   valrec v;
  1590.  
  1591.   v=syscfg.autoval[n];
  1592.   thisuser.sl=v.sl;
  1593.   thisuser.dsl=v.dsl;
  1594.   thisuser.ar=v.ar;
  1595.   thisuser.dar=v.dar;
  1596.   thisuser.restrict=v.restrict;
  1597.   reset_act_sl();
  1598.   changedsl();
  1599. }
  1600.