home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
ckscripts.tar.gz
/
ckscripts.tar
/
rmsg
< prev
next >
Wrap
Text File
|
2004-05-23
|
3KB
|
54 lines
# RMSG - Macro implementation of Kermit REMOTE MESSAGE
#
# The REMOTE MESSAGE command sends a short text message to a Kermit
# server for display. This command is found in MS-DOS Kermit but
# not in C-Kermit or Kermit 95. The following macros implement it.
# C-Kermit 8.0 or later or Kermit 95 2.0 or later are required, and
# a connection to a Kermit server must already exist. TAKE this file
# to define the needed macros, or add the definitions to your K95
# or C-Kermit customization file. Usage:
#
# rmsg "This is a message"
#
# Sends the quoted text (quotes required if message includes spaces) in a
# Kermit Message packet. Message should not include control characters.
# Waits for acknowledgement. Tries up to five times. Default timeout is
# four seconds; adjust as necessary by redefining \%t.
#
# F. da Cruz, Columbia University, May 2004.
#
local \%t # Local variables
.\%t = 4 # INPUT timeout (change if necessary)
def CHK1 { # Construct Type 1 Block Check
local s # Local variable
.s := \fchecksum(\fcontents(\%1)) # Arithmetic checksum
(+ (& (+ (/ (& s 192) 64) s) 63) 32) # Return Kermit block check
}
def MPKT { # Construct Message Packet
local t n p # Local vars
.t := \fcontents(\%1) # Message text
.t := \freplace(\m(t),\v(p_ctl),\v(p_ctl)\v(p_ctl)) # Escape special chars
.t := \freplace(\m(t),\v(p_rpt),\v(p_ctl)\v(p_rpt))
if def \v(p_8bit) .t := \freplace(\m(t),\v(p_8bit),\v(p_ctl)\v(p_8bit))
.n := \flength(\m(t)) # Length of message
if ( > n 90 ) stop 1 "TOO LONG" # Long packets not allowed
.p := "\fchar(n+37)\{32}GM\fchar(n+32)\m(t)" # Make Message packet
chk1 "\m(p)" # Get its checksum
return \{1}\m(p)\fchar(\v(return)) # Return the complete packet
}
def RMSG { # Send Message Packet to Kermit server
local spkt i # Local variables
mpkt "\fcontents(\%1)" # Encapsulate message in packet
.spkt := \v(return) # Save the packet
clear input # Clear the INPUT buffer
for ( i 1 5 1 ) { # Try five times
output \m(spkt)\13 # Send the M-packet
if fail stop 1 "I/O Error" # Check for I/O error
input \%t "\{1}#\{32}Y>" # Wait up to \%t seconds for ACK
if success break # Got it
}
if ( > i 5 ) end 1 "MESSAGE FAILED" # Return and print status
end 0 "MESSAGE OK"
}