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

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