;D:KFUNC.ACT›; Utility functions for Kermit›; (C) 1983 John Howard Palevich›; to be distributed free of charge›;›;Started September 24, 1983››MODULE››CARD ARRAY bauds = [300 600 1200› 1800 2400 4800› 9600]››PROC SHOWBUF(STRING BUF, INT LEN)› INT I› FOR I = 0 TO LEN-1 DO› PUT(27)› PUT(BUF(I))› OD› RETURN››PROC MERROR(BYTE A,X,Y)› IF debug = 1 THEN› PRINTF("ERROR %B%E", y)› IF Y = 128 THEN› CLOSE(2)› CLOSE(3)› CLOSE(1)› BREAK()› FI› FI› ERRORNUM = Y› RETURN››CARD FUNC DecodeBaud(BYTE b)› STRING buf(6)› STRC(bauds(b), buf)› RETURN(buf)››CARD FUNC DecodeFlag(BYTE f)› IF f = 0 THEN› RETURN("off")› ELSE› RETURN("on")› FI››BYTE FUNC IsAlpha(BYTE c)› IF (c >= 'a AND c <= 'z) OR› (c >= 'A AND c <= 'Z)› THEN› RETURN(1)› ELSE› RETURN(0)› FI››BYTE FUNC ToUpper(BYTE c)› IF c >= 'a AND c <= 'z THEN› RETURN(c - 32)› ELSE› RETURN(c)› FI››;SPack()›;›; Send a Packet››PROC SPack(BYTE TY› INT NUM, LEN› STRING DATA)› INT I, BUFP› BYTE CHKSUM› STRING BUFFER(100)›› IF DEBUG = 1 THEN› PRINTF("SPack('%C,%D,%D,",› TY, NUM, LEN)› PUT('")› SHOWBUF(DATA, LEN)› PRINTF("%C)%E", '")› ELSE› PUT('.)› FI›› FOR I = 1 TO PAD› DO› PUTD(2, PADCHAR)› OD›› BUFFER(0) = SOH› BUFFER(1) = 32 + LEN+3› BUFFER(2) = 32 + NUM› BUFFER(3) = TY›› CHKSUM = BUFFER(1)+BUFFER(2)› +BUFFER(3)›› FOR I = 0 TO LEN-1› DO› BUFFER(I+4) = DATA(I)› CHKSUM ==+ DATA(I)› OD›› CHKSUM = (CHKSUM + ((CHKSUM & 192)› RSH 6)) & 63› BUFFER(LEN+4) = 32 + CHKSUM› BUFFER(LEN+5) = EOL› CIOV(2, 11, BUFFER, LEN+6, -1, -1)› RETURN››;GetRT›; Get a byte from R: with timeout›; and user-abort››BYTE FUNC GetRT(BYTE POINTER B)› CHAR FSC = 19, TIMER›› TIMER = FSC+3› WHILE NCIB() = 0 DO› IF FSC = TIMER THEN› IF DEBUG = 1 THEN ;say timeout› PRINTE("(Timeout)")› FI› RETURN(0)› ELSEIF CH <> $FF THEN ;User abort› RETURN(0)› FI› OD› B^ = GETD(2)› RETURN(1)››; RPack()›;›; Read a Packet››INT FUNC RPack(INT POINTER LEN, NUM› STRING DATA)› INT I, DONE› CHAR CHKSUM, T, UT, TY›› IF DEBUG = 1 THEN› PRINT("RPack")› FI›› DO› IF GETRT(@T) = 0 THEN› RETURN(0)› FI› IF DEBUG = 1 AND T <> SOH THEN› PUT(27)› PUT(T)› FI› UNTIL› T = SOH› OD› DONE = FALSE› WHILE DONE = FALSE› DO› IF GETRT(@T) = 0 THEN› RETURN(0)› FI› IF IMAGE = FALSE› THEN› T ==& 127› FI› IF T <> SOH THEN ;GOT LEN› CHKSUM = T› LEN^ = T-3-32›› IF GETRT(@T) = 0 THEN› RETURN(0)› FI› IF IMAGE = FALSE› THEN› T ==& 127› FI› IF T <> SOH THEN ;GOT NUM› CHKSUM ==+ T› NUM^ = T - 32›› IF GETRT(@T) = 0 THEN› RETURN(0)› FI› IF IMAGE = FALSE THEN T ==& 127 FI› IF T <> SOH THEN› CHKSUM ==+ T› TY = T›› FOR I = 0 TO LEN^-1 DO› IF GETRT(@T) = 0 THEN› RETURN(0)› FI› IF IMAGE = FALSE THEN T ==& 127 FI› IF T = SOH THEN EXIT FI› CHKSUM ==+ T› DATA(I) = T› OD›› IF T <> SOH THEN› IF GETRT(@T) = 0 THEN› RETURN(0)› FI› IF IMAGE <> TRUE THEN T ==& 127 FI› IF T <> SOH THEN› DONE = TRUE› FI› FI› FI› FI› FI› OD› CHKSUM = (CHKSUM + › ((CHKSUM & 192) RSH 6)) & 63› UT = T - 32› IF CHKSUM <> UT THEN› IF DEBUG = 1 THEN› PRINTF("(Bad checksum: %D <> %D)%E",› CHKSUM, UT)› FI› RETURN(FALSE)› FI› IF DEBUG = 1 THEN ;give type› PRINTF("('%C%C,%D,%D,%C",› 27, TY, NUM^, LEN^, '")› SHOWBUF(DATA, LEN^)› PRINTF("%C)%E", '")› FI› IF TY = 'E THEN› PRINT("Error: ")› SHOWBUF(DATA, LEN^)› PUTE()› FI› RETURN(TY)››;BuFill›;›;Get a bufferful of data from the›;file that's being sent. Only›;control-quoting is done; 8-bit &›;repeat count prefixes arn't handled››INT FUNC BuFill(STRING BUFFER)› INT I› BYTE T,T7› STOPR()› I = 0› DO› T = GETD(3)› IF MStatus(3) >= 128 THEN› IF DEBUG = 1 THEN› PRINTE("End-of-file")› FI› EXIT› FI› IF IMAGE = TRUE THEN› T7 = T & 127› IF T7 < 32 OR T7 = 127 OR› T7 = QUOTE› THEN› BUFFER(I) = QUOTE› I ==+ 1› IF T7 <> QUOTE THEN› T ==! 64› FI› FI› ELSE› IF T <> 155 THEN T ==& 127 FI› IF T < 32 OR T = 127› OR T = QUOTE OR T = 155› THEN› IF T = 155 THEN› BUFFER(I) = QUOTE› BUFFER(I+1) = 13 ! 64› I ==+ 2› T = 10› FI› BUFFER(I) = QUOTE› I ==+ 1› IF T <> QUOTE THEN T==! 64 FI› FI› FI› BUFFER(I) = T› I ==+ 1› IF I >= SPSIZ-8 THEN› STARTR()› RETURN(I)› FI› OD› STARTR()› IF I = 0› THEN› RETURN(EOF)› ELSE› RETURN(I)› FI››;BufEmp›;›;Get data from an incomming packet›;into a file.››PROC BufEmp(STRING BUFFER› INT LEN)›› INT I› BYTE T›› STOPR()› FOR I = 0 TO LEN-1› DO› T = BUFFER(I)› IF T = MYQUOTE› THEN› I ==+ 1› T = BUFFER(I)› IF (T & 127) <> MYQUOTE› THEN› T ==! 64› FI› FI› IF IMAGE = TRUE THEN› PUTD(3, T)› ELSEIF T = CR THEN› PUTD(3, 155)› ELSEIF T <> 10 THEN› PUTD(3, T)› FI› OD› STARTR()› RETURN››;SPar()›;›;Fill the data array with my›;send-init parameters››PROC SPar(STRING DATA)› DATA(0) = 32 + MAXPACK› DATA(1) = 32 + 5› DATA(2) = 32 + 0› DATA(3) = 64 ! 0› DATA(4) = 32 + 13› DATA(5) = MYQUOTE› RETURN››;RPar()›;›;Get the other host's send-init›;parameters››PROC RPAR(STRING DATA)› SPSIZ = DATA(0) - 32› TIMINT = DATA(1) - 32› PAD = DATA(2) - 32› PADCHAR = DATA(3) ! 64› EOL = DATA(4) - 32› QUOTE = DATA(5)› RETURN››; --- END OF D:KFUNC.ACT ---›