home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
archives
/
perqa.tar.gz
/
perqa.tar
/
kermitutils
< prev
next >
Wrap
Text File
|
1984-12-04
|
6KB
|
212 lines
module KermitUtils;
EXPORTS
IMPORTS KermitGlobals FROM KermitGlobals ;
PROCEDURE StartTimer;
PROCEDURE CheckTimer ;
PROCEDURE StopTimer;
PROCEDURE XmtChar(ch:Char); (* Perq version -pt*)
FUNCTION GetIn :CharBytes; (* get character *)
FUNCTION UnChar(c:CharBytes): CharBytes;
FUNCTION MakeChar(c:CharBytes): CharBytes;
FUNCTION IsControl(c:CharBytes): Boolean;
FUNCTION IsPrintable(c:CharBytes): Boolean;
FUNCTION Ctl(c:CharBytes): CharBytes;
FUNCTION IsValidPType(c:CharBytes): Boolean;
FUNCTION CheckFunction(c:Integer): CharBytes;
FUNCTION ilength (VAR s : istring) : Integer;
FUNCTION GetArgument(VAR arg: istring): Boolean ;
PROCEDURE EnCodeParm(VAR data:istring); (* encode parameters *)
PROCEDURE DeCodeParm(VAR data:istring); (* decode parameters *)
PROCEDURE Inverse( turn_on: Boolean ) ;
PRIVATE
IMPORTS IOErrors FROM IOErrors ;
IMPORTS IO_Unit FROM IO_Unit ;
IMPORTS IO_Others FROM IO_Others ;
IMPORTS CmdParse FROM CmdParse ;
IMPORTS Screen FROM Screen ;
{$RANGE-}
FUNCTION UnChar(c:CharBytes): CharBytes;
(* reverse of makechar *)
BEGIN
UnChar := c - BLANK
END;
FUNCTION MakeChar(c:CharBytes): CharBytes;
(* convert integer to printable *)
BEGIN
MakeChar := c + BLANK
END;
FUNCTION IsControl(c:CharBytes): Boolean;
(* true if control *)
BEGIN
(* Clear the 8th bit *)
c := Land( c, #177 ) ;
IsControl := (c = DEL) OR (c < BLANK)
END;
FUNCTION IsPrintable(c:CharBytes): Boolean;
(* opposite of iscontrol *)
BEGIN
IsPrintable := NOT IsControl(c)
END;
FUNCTION Ctl(c:CharBytes): CharBytes;
(* c XOR 100 *)
BEGIN
Ctl := LXor(c, #100)
END;
FUNCTION IsValidPType(c:CharBytes): Boolean;
(* true if valid packet type *)
BEGIN
IsValidPType :=
c IN [TYPEB, TYPED, TYPEE, TYPEF, TYPEN, TYPES, TYPET, TYPEY, TYPEZ]
END;
FUNCTION CheckFunction(c:Integer): CharBytes;
(* calculate checksum *)
VAR
x: Integer;
BEGIN
(* CheckFunction := (c + ( c AND 300 ) /100 ) AND 77; *)
x := Shift( Land(c, #300), -6) ;
CheckFunction := Land(x+c, #077)
END;
PROCEDURE EnCodeParm((* Updating *) VAR data:istring); (* encode parameters *)
VAR
i: Integer;
BEGIN
FOR i:=1 TO NUMPARAM DO
data[i] := BLANK;
data[NUMPARAM+1] := ENDSTR;
data[1] := MakeChar(SizeRecv); (* my biggest packet *)
data[2] := MakeChar(MyTimeOut); (* when I want timeout*)
data[3] := MakeChar(MyPad); (* how much padding *)
data[4] := Ctl(MyPadChar); (* my padding character *)
data[5] := MakeChar(myEOL); (* my EOL *)
data[6] := MyQuote; (* my quote char *)
END;
PROCEDURE DeCodeParm(VAR data:istring); (* decode parameters *)
BEGIN
SizeSend := UnChar(data[1]);
TheirTimeOut := UnChar(data[2]); (* when I should time out *)
NumPad := UnChar(data[3]); (* padding characters to send *)
PadChar := Ctl(data[4]); (* padding character *)
SendEOL := UnChar(data[5]); (* EOL to send *)
SendQuote := data[6]; (* quote to send *)
END;
{ Copyright (C) 1981 by Bell Laboratories, Inc., and Whitesmiths Ltd. }
{ length -- compute length of string }
FUNCTION ilength (VAR s : istring) : Integer;
VAR
n : Integer;
BEGIN
n := 1;
WHILE (s[n] <> ENDSTR) DO
n := n + 1;
ilength := n - 1
END;
PROCEDURE StartTimer;
(* Start the time count, in clock ticks. -pt*)
BEGIN
IOGetTime( OldTime ) ; (* Current clock value *)
TimeLeft := TheirTimeOut * 60 (* in ticks *)
END;
PROCEDURE CheckTimer ;
(* Decrement "TimeLeft" by time between last call and now -pt*)
VAR now: Double ;
BEGIN
IF (TimeLeft > 0) THEN (* Still counting *)
BEGIN
IOGetTime( now ) ;
TimeLeft := TimeLeft - now[0] + OldTime[0] ;
OldTime := now
END
END ;
PROCEDURE StopTimer;
BEGIN
TimeLeft := Maxint;
END;
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
PROCEDURE XmtChar(ch:Char); (* Perq version -pt*)
BEGIN
WHILE IOCWrite(RS232Out, ch) <> IOEIOC DO (* nothing *) ;
END;
FUNCTION GetIn :CharBytes; (* get character *)
(* Should return NULL (ENDSTR) if no characters, Perq version -pt*)
VAR
byte: CharBytes ;
c :Char ;
BEGIN
IF (IOCRead(RS232In, c) = IOEIOC) THEN
BEGIN
byte := land( Ord(c), #377 ) (* [pgt001] *)
END
ELSE byte := ENDSTR ;
GetIn := byte ;
(* ChInPack := ChInPack + 1.0 (@ AddTo( x, 1) *)
END;
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
(* Get the next argument from the command line -pt*)
(* Return True if an argument is available - returned in "arg" too -pt*)
FUNCTION GetArgument(VAR arg: istring): Boolean ;
VAR
return: Boolean ; (* Return value *)
i, len: Integer ; (* index and argument length *)
id: String ; (* Identifier/argument from the line *)
BEGIN (*-GetArgument-*)
dumCh := NextIDString( CmdLine, id, return ) ; (* Get an identifier *)
IF (id = '') THEN return := False (* nothing *)
ELSE
BEGIN
return := True ; (* Success *)
len := Length( id ) ; (* get the string's length *)
FOR i := 1 TO len DO (* put the string in "arg" *)
arg[i] := Ord( id[i] ) ;
arg[len+1] := ENDSTR (* finish it off *)
END ;
GetArgument := return
END ; (*-GetArgument-*)
PROCEDURE Inverse( turn_on: Boolean ) ;
(* Change chrsor function for inverse video *)
BEGIN (*-Inverse-*)
IF turn_on THEN SChrFunc( RNot )
ELSE SChrFunc( RRpl )
END (*-Inverse-*).