home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / PPL4C11.ZIP / TERM_IO.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-18  |  4.0 KB  |  185 lines

  1. /*** TERM_IO.C ***/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "pcl4c.h"
  7. #include "term_io.h"
  8. #include "ascii.h"
  9. #include "dos_io.h"
  10. #include "win_io.h"
  11.  
  12. #define FALSE 0
  13. #define TRUE !FALSE
  14.  
  15. static int EchoFlag = FALSE;
  16. static char EnterMsg[] = "Enter Filename:";
  17.  
  18. static  char Temp[80];
  19.  
  20. static int TraceFlag = FALSE;
  21. static FILE *TraceID;
  22. static char TraceBuf[2];
  23.  
  24.  
  25. /* turn I/O tracing ON or OFF */
  26.  
  27. void SetIOtrace(int Flag)
  28. {TraceFlag = Flag;
  29.  if(TraceFlag) TraceID = fopen("TRACE.BIN","wb");
  30.  else if(TraceID) fclose(TraceID);
  31. }
  32.  
  33. void MsgEcho(int Flag)
  34. {EchoFlag = Flag;
  35. }
  36.  
  37. /* write message to right status line */
  38.  
  39. void WriteMsg(char *MsgPtr)
  40. {if(EchoFlag)
  41.    {WinPutString(SCR_WIN,MsgPtr);
  42.     WinPutChar(SCR_WIN,'\n');
  43.    }
  44.  WinClear(RGT_WIN);
  45.  WinPutChar(RGT_WIN,' ');
  46.  WinPutString(RGT_WIN,MsgPtr);
  47.  WinGetPos(SCR_WIN,NULL,NULL);
  48. }
  49.  
  50. /*** write message + integer parm */
  51.  
  52. void WriteIntMsg(char *MsgPtr, int Parm)
  53. {char Temp[50];
  54.  sprintf(Temp,"%s %d", MsgPtr, Parm);
  55.  WriteMsg(Temp);
  56. }
  57.  
  58. /*** write message + hexidecimal parm */
  59.  
  60. void WriteHexMsg(char *MsgPtr, int Parm)
  61. {char Temp[50];
  62.  sprintf(Temp,"%s 0x%x", MsgPtr, Parm);
  63.  WriteMsg(Temp);
  64. }
  65.  
  66. /*** write message + long parm */
  67.  
  68. void WriteLongMsg(char *MsgPtr, long Parm)
  69. {char Temp[50];
  70.  sprintf(Temp,"%s %ld", MsgPtr, Parm);
  71.  WriteMsg(Temp);
  72. }
  73.  
  74. /*** read message */
  75.  
  76. void ReadMsg(char *Buffer,int Length,int StartCol)
  77. {WinSetPos(RGT_WIN,0,StartCol);
  78.  WinGetString(RGT_WIN,Buffer,Length);
  79.  WinGetPos(SCR_WIN,NULL,NULL);
  80. }
  81.  
  82. /*** display the error text ***/
  83.  
  84. void SayError(int Port, char *ptr)
  85. {sprintf(Temp,"ERROR! COM%d : %s",1+Port,ptr);
  86.  WriteMsg(Temp);
  87.  /* cancel remote */
  88.  CharPut(Port,CAN);
  89.  CharPut(Port,CAN);
  90.  CharPut(Port,CAN);
  91. } /* end SayError */
  92.  
  93. /*** test DSR ***/
  94.  
  95. int TestDSR(int Port)
  96. {int ThisDSR;
  97.  static LastDSR = 0;
  98.  ThisDSR = SioDSR(Port);
  99.  /* report if DSR status changed */
  100.  if(ThisDSR!=LastDSR)
  101.      {if(ThisDSR) sprintf(Temp,"DSR is up\n");
  102.       else sprintf(Temp,"DSR dropped\n");
  103.       WinPutString(SCR_WIN,Temp);
  104.       LastDSR = ThisDSR;
  105.      }
  106.  return ThisDSR;
  107. }
  108.  
  109. /*** output character to serial port ***/
  110.  
  111. int CharPut(int Port, char ch)
  112. {int i, rc;
  113.  int n;
  114.  if(!TestDSR(Port)) return DSR_DROPPED;
  115.  /* transmit character [avoiding TX buffer overflow] */
  116.  while((rc=SioPutc(Port,ch))==-1);
  117.  if(rc<-1)
  118.    {sprintf(Temp,"SioPutc Error: COM%d: ",1+Port);
  119.     WinPutString(SCR_WIN,Temp);
  120.     SioError(rc);
  121.     SioDone(Port);
  122.     exit(1);
  123.    }
  124.  if(TraceFlag) if(rc>-1)
  125.    {TraceBuf[0] = 1;
  126.     TraceBuf[1] = ch;
  127.     n = fwrite(TraceBuf,2,1,TraceID);
  128.    }
  129.  return(rc);
  130. }
  131.  
  132. /*** receive character from serial port ***/
  133.  
  134. int CharGet(int Port, int Timeout)
  135. {int rc;
  136.  int n;
  137.  if(!TestDSR(Port)) return DSR_DROPPED;
  138.  rc = SioGetc(Port,Timeout);
  139.  if(rc<-1)
  140.      {sprintf(Temp,"SioGetc Error: COM%d: ",1+Port);
  141.       WinPutString(SCR_WIN,Temp);
  142.       SioError(rc);
  143.       SioDone(Port);
  144.       exit(1);
  145.      }
  146.  if(TraceFlag) if(rc>-1)
  147.    {TraceBuf[0] = 2;
  148.     TraceBuf[1] = (char)rc;
  149.     n = fwrite(TraceBuf,2,1,TraceID);
  150.    }
  151.  return(rc);
  152. }
  153.  
  154. /*** fetch name from user if Filespec[] is empty ***/
  155.  
  156. int FetchName(char *FileName)
  157. {/* already have filename ? */
  158.  if(strlen(FileName) > 0) return TRUE;
  159.  /* get filename from user */
  160.  WriteMsg(EnterMsg);
  161.  ReadMsg(FileName,20,1+strlen(EnterMsg));
  162.  /* got non-NULL name ? */
  163.  if(strlen(FileName)>0) return TRUE;
  164.  else return FALSE;
  165. }
  166.  
  167. /* display CPS */
  168.  
  169. void WriteCPS(long StartTics,long FileBytes,char *Filename,int Skipped)
  170. {int  CPS;
  171.  long Tics;
  172.  long Secs;
  173.  char Temp[80];
  174.  if(*Filename=='\0') return;
  175.  if(!Skipped)
  176.    {Secs = (SioTimer() - StartTics) / 18;
  177.     if(Secs>0) CPS = (int)(FileBytes / Secs);
  178.     else Skipped = TRUE;
  179.    }
  180.  if(Skipped) sprintf(Temp,"%s skipped (%ld bytes)\n",Filename,FileBytes);
  181.  else sprintf(Temp,"%s transferred @ %d CPS (%ld bytes)\n",Filename,CPS,FileBytes);
  182.  WinPutString(SCR_WIN,Temp);
  183.  }
  184.  
  185.