This is a beginning at an attempt to delineate the script programming language differences among MS-DOS Kermit, Kermit 95, and C-Kermit. It will be fleshed out over time. The aim is to give you an idea which Kermit script language features can be used in which Kermit programs. Bear in mind that:
Compatibility among the major Kermit programs is always a goal, but sometimes an elusive one given the distributed (over space and time) nature of the Kermit Project. Scripts can be written that are totally portable among the three script-capable versions by avoiding features that are not common to all three, or by having the script test the Kermit program and version that's running it to enable circumlocutions where needed, and by storing system-dependent quantities (like path or device names) in variables rather than hardwiring into the script.
CONTENTS
If a script is to be portable among different Kermit implementations, versions, and/or platforms, you can use the following constructions to determine the specific environment:
set take error on ; Stop execution of this file on any error. check if ; Is script programming included? set take error off ; Yes, so we can check errors ourselves
The items that can be checked are listed when you type "check ?". If you try to check an item that does not appear in the list, the check fails.
if equal \v(program) "MS-DOS_KERMIT" set port tcp \%1 else set host \%1
define badversion echo MS-DOS Kermit 3.15 required, exit 1 if < \v(version) 315 badversion
C-Kermit \v(version) numbers begin with 501188 (for version 5A(188)). For C-Kermit 7.0.197, \v(version) is 700197, which is bigger than a 16 bit integer. So if you want your version-number comparisons to be safe for 16-bit platforms, use lexical, rather than numeric comparisons:
define badversion echo C-Kermit 7.0 or K95 1.1.19 required, exit 1 if LLT \v(version) 70000 badversion
Finally, note that the version test, complete with error message, can be made in one statement, but only in C-Kermit 7.0 or K95 1.1.19 and later, so this form of the version test is not portable:
if LLT \v(version) 70000 exit 1 C-Kermit 7.0 or K95 1.1.19 required
if < \v(version) 1117 exit K95 1.1.17 or later required
In C-Kermit, the value of \v(xversion) is the same as that of \v(version).
To display the value of any variable, type:
show variable namewhere name is the variable name (the part inside the parentheses), or:
echo \v(name)
Use SHOW VARIABLES to list the values of all built-in variables.
If your script is to contain file names, then for maximum portability, use names without paths containing no more than one period, with no more than 8 characters before the period and three after, containing only lowercase ASCII letters and digits, and no spaces. Also note all variables and functions whose values are directory names, such as \v(directory) and \fdirname(), include the terminating directory separator, so you don't have to hard-code it into your scripts:
send \fdirname(\%1)oofa.txt
End-of-line differences among platforms (CRLF versus LF versus CR) can be handled in C-Kermit with \v(newline). MS-DOS Kermit doesn't have this variable, but you can still script portably with:
if equal \v(program) C-Kermit assign eol \v(newline) else assign eol \13\10
and then use \m(eol) wherever you need a line terminator.
Another useful device is the SWITCH statement, which can be used to select platform-appropriate constructions:
define noport echo Can't open port, exit 1 switch \v(system) { :MS-DOS, set port com1, if fail noport, break :WIN32, set tapi line, if fail noport, break :UNIX switch \v(osname) { :Linux, set line /dev/ttyS1, if fail noport, break :HP-UX, set line /dev/cua0p0, if fail noport, break :default, set line /dev/cua, if fail noport, break } :VMS, set line tta0:, if fail noport, break :default, echo System "\v(system)" unexpected, exit 1 } ; Port is open...
The IF command of C-Kermit and K95 is considerable more evolved than that of MS-DOS Kermit.
Feature MS-DOS Kermit K-95 C-Kermit Extended IF (XIF) 3.15 1.1.0 5A(188) Numeric conditions No 1.1.8 6.0 Consolidated IF and XIF No 1.1.18 7.0 Boolean Expressions No 1.1.18 7.0
The following table lists IF conditions. The program version numbers are not necessarily accurate; some of the conditions listed might also be available in earlier program versions, but they are definitely available as of the version numbers listed.
IF Condition MS-DOS Kermit K-95 C-Kermit ! No 1.1.18 7.0 != No 1.1.18 7.0 && No 1.1.18 7.0 ( No 1.1.18 7.0 ) No 1.1.18 7.0 < 3.00 1.1.0 5A(188) <= No 1.1.18 7.0 = 3.00 1.1.0 5A(188) > 3.00 1.1.0 5A(188) >= No 1.1.18 7.0 || No 1.1.18 7.0 absolute No 1.1.18 7.0 alarm 3.00 1.1.0 5A(188) and No 1.1.18 7.0 asktimeout No 1.1.18 7.0 available No 1.1.18 7.0 background No 1.1.18 7.0 c-kermit No 1.1.18 7.0 command No 1.1.18 7.0 count 3.00 1.1.0 5A(188) declared No 1.1.18 7.0 defined 3.00 1.1.0 5A(188) directory No 1.1.18 7.0 emulation 3.15 1.1.18 7.0 equal 3.00 1.1.0 5A(188) exist 3.00 1.1.0 5A(188) errorlevel 3.00 No No failure 3.00 1.1.0 5A(188) false No 1.1.18 7.0 flag No 1.1.18 7.0 float No 1.1.18 7.0 foreground No 1.1.18 7.0 gui No 1.1.21 8.0 iksd No 1.1.18 7.0 inpath 3.14 No No k-95 No 1.1.18 7.0 kbhit No 1.1.21 8.0 lgt 3.14 1.1.0 5A(188) llt 3.14 1.1.0 5A(188) local No 1.1.18 7.0 match No 1.1.18 7.0 newer 3.14 1.1.? 6.0 not 3.00 1.1.0 5A(188) numeric 3.14 1.1.0 5A(188) open No 1.1.18 7.0 or No 1.1.18 7.0 quiet No 1.1.18 7.0 readable No 1.1.18 7.0 remote-only No 1.1.8 6.0 success 3.00 1.1.0 5A(188) tapi No 1.1.12 7.0 true 3.15 1.1.8 6.0 version No 1.1.8 6.0 wild No 1.1.18 7.0 writeable No 1.1.18 7.0
In MS-DOS Kermit, IF EXIST filespec command allows wildcard file specifications. Thus "if exist *.txt" succeeds if there are any .txt files. C-Kermit and K-95 have finer-grained distinctions:
Besides \ffiles(), there are similar functions \frfiles() (regular files, recursive), \fdirectories() (directory files), \frdirectories() (directory files, recursive). The \f...() functions are supported by MS-DOS Kermit too, so to check portably whether a wildcard matches any existing files, use these functions rather than IF EXIST.
C-Kermit and K95 have UNIX-like command-line syntax, e.g.:
kermit -p e -T -s oofa.txt
MS-DOS Kermit accepts ordinary interactive-mode commands on the command line with commands separated by commas, e.g.:
kermit set parity even, set file type text, send oofa.txt
Thus the command-line syntaxes are incompatible. Nevertheless, C-Kermit and K95 can be given MS-DOS-Kermit-like command lines as the argument of the -C option:
kermit -C "set parity even, set file type text, send oofa.txt"
Feature MS-DOS Kermit K-95 C-Kermit TAKE command 1.0 1.1.0 4.0 Macros 2.26 1.1.0 5A(188) INPUT 2.29 1.1.0 5A(188) GOTO 2.31 1.1.0 5A(188) IF 2.31 1.1.0 5A(188) Macro parameters 2.31 1.1.0 5A(188) \%x variables 2.31 1.1.0 5A(188) \v(xxx) variables 3.10 1.1.0 5A(188) \m(xxx) variables 3.11 1.1.0 5A(188) Local file i/o 3.11 1.1.0 5A(188) \fxxx() functions 3.14 1.1.0 5A(188) \&a[] Arrays 3.15 1.1.0 5A(188) Commandline arg array \&@[] ---- 1.1.0 5A(188) Arithmetic 3.15 1.1.0 5A(188) FOR, WHILE, XIF 3.16 1.1.0 5A(188) MINPUT 3.15 1.1.0 5A(190) Local scalar variables 3.15 1.1.5 6.0.192 Argument vector array \&_[] 3.15 1.1.5 6.0.192 Block structure 3.16 1.1.5 6.0.192 SWITCH 3.16 1.1.5 6.0.192 Array initialization ---- 1.1.13 7.0.195 \%* variable ---- 1.1.13 7.0.195 Command switches ---- 1.1.14 7.0.195 Recursive file lists 3.16 1.1.14 7.0.195 Local arrays ---- 1.1.16 7.0.195 More than 9 macro arguments ---- 1.1.16 7.0.195 Date conversion ---- 1.1.17 7.0.195 Relative dates ---- 1.1.18 7.0.195 Command-file arguments ---- 1.1.18 7.0.195 Pattern matching ---- 1.1.18 7.0.195 IF/XIF consolidation ---- 1.1.18 7.0.195 Compound booleans ---- 1.1.18 7.0.195 Assignment operators ---- 1.1.18 7.0.195 Kerbang scripts ---- ------ 7.0.195
DOS and Windows applications must use different methods to access the keyboard and, as a result, the keycodes that are the basis for key mapping in MS-DOS Kermit and Kermit 95 are different. For example, if you type SHOW KEY in MS-DOS Kermit and then press Alt-a, you are told that the Scan Code (keycode) is 2334, whereas in K-95 it is 2145.
Converting a large MS-DOS Kermit key map (i.e. a file containing many SET KEY commands) to Kermit 95 would be a laborious task indeed, if not for the following Kermit 95 commands:
MS-DOS Kermit and Kermit 95 both support a large repertoire of keyboard verbs ("Kverbs") such as \KdecF10 (meaning, "send what the DEC VT terminal F10 key would send"). A thorough census has not yet been done, but with very few exceptions, Kermit 95 should support every Kverb that MS-DOS Kermit supports. Of course Kermit 95 also supports a great many additional ones, mostly related its many additional terminal emulations.
Variable MS-DOS Kermit K-95 C-Kermit \v(argc) Yes Yes Yes \v(args) No Yes Yes \v(blockcheck) No Yes Yes \v(browser) No Yes Yes \v(browsopts) No Yes Yes \v(browsurl) No Yes Yes \v(charset) Yes Yes Yes \v(cmdfile) Yes Yes Yes \v(cmdlevel) Yes Yes Yes \v(cmdsource) No Yes Yes \v(cols) No Yes Yes \v(connection) No Yes Yes \v(console) Yes No No \v(count) Yes Yes Yes \v(cps) Yes Yes Yes \v(cpu) No Yes Yes \v(crc16) Yes Yes Yes \v(d$ac) No Yes Yes \v(d$cc) No Yes Yes \v(d$ip) No Yes Yes \v(d$lc) No Yes Yes \v(d$lp) No Yes Yes \v(d$px) No Yes Yes \v(date) Yes Yes Yes \v(day) Yes Yes Yes \v(dialnumber) No Yes Yes \v(dialresult) No Yes Yes \v(dialstatus) No Yes Yes \v(dialsuffix) No Yes Yes \v(dialtype) No Yes Yes \v(directory) Yes Yes Yes \v(disk) Yes No No \v(dosversion) Yes No No \v(download) No Yes Yes \v(editor) No Yes Yes \v(editfile) No Yes Yes \v(editopts) No Yes Yes \v(errno) No Yes Yes \v(errorlevel) Yes No No \v(errstring) No Yes Yes \v(escape) No Yes Yes \v(evaluate) No Yes Yes \v(exitstatus) No Yes Yes \v(filename) No Yes Yes \v(filenumber) No Yes Yes \v(filespec) Yes Yes Yes \v(fsize) Yes Yes Yes \v(ftype) No Yes Yes \v(herald) No Yes Yes \v(home) No Yes Yes \v(host) No Yes Yes \v(hwparity) No Yes Yes \v(input) Yes Yes Yes \v(inchar) No Yes Yes \v(incount) No Yes Yes \v(inidir) Yes Yes Yes \v(instatus) Yes Yes Yes \v(intime) No Yes Yes \v(inwait) No Yes Yes \v(ipaddress) No Yes Yes \v(keyboard) Yes Yes No \v(line) Yes Yes Yes \v(local) No Yes Yes \v(lockdir) No No Yes \v(lockpid) No No Yes \v(macro) No Yes Yes \v(minput) Yes Yes Yes \v(model) No Yes Yes \v(modem) No Yes Yes \v(monitor) Yes No No \v(mousecurx) No Yes No \v(mousecury) No Yes No \v(m_aa_off) No Yes Yes \v(m_aa_on) No Yes Yes \v(m_dc_off) No Yes Yes \v(m_dc_on) No Yes Yes \v(m_dial) No Yes Yes \v(m_ec_off) No Yes Yes \v(m_ec_on) No Yes Yes \v(m_fc_hw) No Yes Yes \v(m_fc_no) No Yes Yes \v(m_fc_sw) No Yes Yes \v(m_hup) No Yes Yes \v(m_init) No Yes Yes \v(m_pulse) No Yes Yes \v(m_tone) No Yes Yes \v(name) No Yes Yes \v(ndate) Yes Yes Yes \v(nday) Yes Yes Yes \v(newline) No Yes Yes \v(ntime) Yes Yes Yes \v(osname) No Yes Yes \v(osrelease) No Yes Yes \v(osversion) No Yes Yes \v(packetlen) No Yes Yes \v(parity) No Yes Yes \v(pexitstat) No Yes Yes \v(pid) No Yes Yes \v(platform) Yes Yes Yes \v(printer) No Yes Yes \v(program) Yes Yes Yes \v(protocol) No Yes Yes \v(p_8bit) No Yes Yes \v(p_ctl) No Yes Yes \v(p_rpt) No Yes Yes \v(query) Yes Yes Yes \v(return) Yes Yes Yes \v(rows) No Yes Yes \v(serial) No Yes Yes \v(sendlist) No Yes Yes \v(session) Yes No No \v(speed) Yes Yes Yes \v(startup) Yes Yes Yes \v(status) Yes Yes Yes \v(sysid) Yes Yes Yes \v(system) Yes Yes Yes \v(tcpip_status) Yes No No \v(terminal) Yes Yes Yes \v(test) No Yes Yes \v(tfsize) No Yes Yes \v(tftime) No Yes Yes \v(time) Yes Yes Yes \v(tmpdir) No Yes Yes \v(trigger) No Yes Yes \v(ttyfd) No Yes Yes \v(userid) No Yes Yes \v(version) Yes Yes Yes \v(window) No Yes Yes \v(xferstatus) No Yes Yes \v(xfermsg) No Yes Yes \v(xprogram) No Yes Yes \v(xversion) No Yes Yes
Function MS-DOS Kermit K-95 C-Kermit \Fbasename() No Yes Yes \Fbreak() No Yes Yes \Fcapitalize() No Yes Yes \Fcharacter() Yes Yes Yes \Fchecksum() Yes Yes Yes \Fcode() Yes Yes Yes \Fcommand() No Yes Yes \Fcontents() Yes Yes Yes \Fcrc16() No Yes Yes \Fcvtdate() No Yes Yes \Fdate() Yes Yes Yes \Fday() No Yes Yes \Fdayofyear() No Yes Yes \Fdefinition() Yes Yes Yes \Fdialconvert() No Yes Yes \Fdimension() No Yes Yes \Fdirectories() Yes Yes Yes \Fdirname() No Yes Yes \Fdoy2date() No Yes Yes \Ferrstring() No Yes Yes \Fevaluate() Yes Yes Yes \Fexecute() No Yes Yes \Ffiles() Yes Yes Yes \Fhexify() No Yes Yes \Findex() Yes Yes Yes \Fipaddress() No Yes Yes \Flength() Yes Yes Yes \Fliteral() Yes Yes Yes \Flop() No Yes Yes \Flower() Yes Yes Yes \Flpad() Yes Yes Yes \Fltrim() No Yes Yes \Fmaximum() Yes Yes Yes \Fminimim() Min Yes Yes \Fmjd() No Yes Yes \Fmjd2date() No Yes Yes \Fn2hex() No Yes Yes \Fn2octal() No Yes Yes \Fn2time() No Yes Yes \Fnday() No Yes Yes \Fnextfile() Yes Yes Yes \Fntime() No Yes Yes \Fpathname() No Yes Yes \Fpermissions() No Yes Yes \Frandom() No Yes Yes \Frawcommand() No Yes Yes \Frdirectories() Yes Yes Yes \Frfiles() Yes Yes Yes \Frepeat() Yes Yes Yes \Freplace() Yes Yes Yes \Freverse() Yes Yes Yes \Fright() Yes Yes Yes \Frindex() Yes Yes Yes \Frpad() Yes Yes Yes \Fscrncurx() No Yes No \Fscrncury() No Yes No \Fscrnstr() No Yes No \Fsize() Yes Yes Yes \Fspan() No Yes Yes \Fsplit() No Yes Yes \Fstripn() No Yes Yes \Fstripx() No Yes Yes \Fsubstring() Yes Yes Yes \Ftime() No Yes Yes \Ftrim() No Yes Yes \Funhexify() No Yes Yes \Fupper() Yes Yes Yes \Fverify() Yes Yes Yes \Fword() No Yes Yes
MS-DOS Kermit C-Kermit/K95 Direct access to hardware: Yes No SET NETWORK TYPE command: No Yes Network connections: SET PORT net host SET HOST host Uses own built-in TCP stack: Yes No Uses OS TCP/IP stack: No Yes Built-in TELNET command: No Yes Built-in modem dialing: No Yes Multiple connections: Yes No REINPUT reads from connection: Yes No