imported 9.0.300
[ckermit.git] / ckermit70.txt
diff --git a/ckermit70.txt b/ckermit70.txt
new file mode 100644 (file)
index 0000000..4661a51
--- /dev/null
@@ -0,0 +1,17661 @@
+
+   [1]The Columbia Crown The Kermit Project | Columbia University
+   612 West 115th Street, New York NY 10025 USA o [2]kermit@columbia.edu
+   ...since 1981
+   [3]Home [4]Kermit 95 [5]C-Kermit [6]Scripts [7]Current [8]New [9]FAQ
+   [10]Support
+
+Supplement to [11]Using C-Kermit , 2nd Edition
+
+For C-Kermit 7.0
+
+As of C-Kermit version:  7.0.196
+This file created:  8 February 2000
+This file last updated:
+Mon Sep 13 08:52:41 2010
+
+
+Authors: Frank da Cruz and Christine M. Gianone
+Address: The Kermit Project
+         Columbia University
+         612 West 115th Street
+         New York NY 10025-7799
+         USA
+Fax:     +1 (212) 662-6442
+E-Mail:  [12]kermit-support@columbia.edu
+Web:     [13]http://www.columbia.edu/kermit/
+Or:      [14]http://www.kermit-project.org/
+Or:      [15]http://www.columbia.nyc.ny.us/kermit/
+
+NOTICES
+
+   This document:
+          Copyright © 1997, 2000, Frank da Cruz and Christine M. Gianone.
+          All rights reserved.
+
+   Kermit 95:
+          Copyright © 1995, 2000, Trustees of Columbia University in the
+          City of New York. All rights reserved.
+
+   C-Kermit:
+          Copyright © 1985, 2000,
+          Trustees of Columbia University in the City of New York. All
+          rights reserved. See the C-Kermit [16]COPYING.TXT file or the
+          copyright text in the [17]ckcmai.c module for disclaimer and
+          permissions.
+
+   When Kerberos(TM) and/or SRP(TM) (Secure Remote Password) and/or SSL
+          protocol are included:
+          Portions Copyright © 1990, Massachusetts Institute of
+          Technology.
+          Portions Copyright © 1991, 1993 Regents of the University of
+          California.
+          Portions Copyright © 1991, 1992, 1993, 1994, 1995 by AT&T.
+          Portions Copyright © 1997, Stanford University.
+          Portions Copyright © 1995-1997, Eric Young <eay@cryptosoft.com>.
+
+   For the full text of the third-party copyright notices, see
+   [18]Appendix V.
+
+WHAT IS IN THIS FILE
+
+   This file lists changes made to C-Kermit since the second edition of
+   the book [19]Using C-Kermit was published and C-Kermit 6.0 was released
+   in November 1996. Use this file as a supplement to the second edition
+   of Using C-Kermit until the third edition is published some time in
+   2000. If the "most recent update" shown above is long ago, contact
+   Columbia University to see if there is a newer release.
+
+   For further information, also see the [20]CKCBWR.TXT ("C-Kermit
+   beware") file for hints, tips, tricks, restrictions, frequently asked
+   questions, etc, plus the system-specific "beware file", e.g.
+   [21]CKUBWR.TXT for UNIX, [22]CKVBWR.TXT for VMS, etc, and also any
+   system-specific update files such as KERMIT95.HTM for Kermit 95 (in the
+   DOCS\MANUAL\ subdirectory of your K95 directory).
+
+     This Web-based copy of the C-Kermit 7.0 update notes supersedes the
+     plain-text CKERMIT2.TXT file. All changes after 19 January 2000
+     appear only here in the Web version. If you need an up-to-date
+     plain-text copy, use your Web browser to save this page as plain
+     text.
+
+ABOUT FILENAMES
+
+   In this document, filenames are generally shown in uppercase, but on
+   file systems with case-sensitive names such as UNIX, OS-9, and AOS/VS,
+   lowercase names are used: [23]ckubwr.txt, [24]ckermit70.txt, etc.
+
+ADDITIONAL FILES
+
+   Several other files accompany this new Kermit release:
+
+   SECURITY.TXT
+          Discussion of Kermit's new authentication and encryption
+          features:
+
+          + [25]Plain-text version
+          + [26]HTML (hypertext) version
+
+   IKSD.TXT
+          How to install and manage an Internet Kermit Service Daemon.
+
+          + [27]Plain-text version
+          + [28]HTML (hypertext) version
+
+          Also see [29]cuiksd.htm for instructions for use.
+
+   TELNET.TXT
+          A thorough presentation of Kermit's new advanced Telnet features
+          and controls.
+
+          + [30]Plain-text version
+          + [31]HTML (hypertext) version
+
+THE NEW C-KERMIT LICENSE
+
+   The C-Kermit license was rewritten for version 7.0 to grant automatic
+   permission to packagers of free operating-system distributions to
+   include C-Kermit 7.0. Examples include Linux (GNU/Linux), FreeBSD,
+   NetBSD, etc. The new license is in the [32]COPYING.TXT file, and is
+   also displayed by C-Kermit itself when you give the VERSION or
+   COPYRIGHT command. The new C-Kermit license does not apply to
+   [33]Kermit 95.
+
+ACKNOWLEDGMENTS
+
+   Thanks to Jeff Altman, who joined the Kermit Project in 1995, for much
+   of what you see in C-Kermit 7.0, especially in the networking and
+   security areas, and his key role in designing and implementing the
+   Internet Kermit Service Daemon. And special thanks to Lucas Hart for
+   lots of help with the VMS version; to Peter Eichhorn for continuous
+   testing on the full range of HP-UX versions and for a consolidated set
+   of HP-UX makefile targets; and to Colin Allen, Mark Allen, Roger Allen,
+   Ric Anderson, William Bader, Mitch Baker, Mitchell Bass, Nelson Beebe,
+   Gerry Belanger, Jeff Bernsten, Mark Berryman, John Bigg, Volker
+   Borchert, Jonathan Boswell, Tim Boyer, Frederick Bruckman, Kenneth
+   Cochran, Jared Crapo, Bill Delaney, Igor Sobrado Delgado, Clarence
+   Dold, Joe Doupnik, John Dunlap, Max Evarts, Patrick French, Carl
+   Friedberg, Carl Friend, Hirofumi Fujii, Andrew Gabriel, Gabe Garza,
+   Boyd Gerber, David Gerber, George Gilmer, Hunter Goatley, DJ Hagberg,
+   Kevin Handy, Andy Harper, Randolph Herber, Sven Holström, Michal
+   Jaegermann, Graham Jenkins, Dick Jones, Terry Kennedy, Robert D Keys,
+   Nick Kisseberth, Igor Kovalenko, David Lane, Adam Laurie, Jeff
+   Liebermann, Eric Lonvick, Hoi Wan Louis, Arthur Marsh, Gregorie Martin,
+   Peter Mauzey, Dragan Milicic, Todd Miller, Christian Mondrup, Daniel
+   Morato, Dat Nguyen, Herb Peyerl, Jean-Pierre Radley, Steve Rance,
+   Stephen Riehm, Nigel Roles, Larry Rosenman, Jay S Rouman, David
+   Sanderson, John Santos, Michael Schmitz, Steven Schultz, Bob Shair,
+   Richard Shuford, Fred Smith, Michael Sokolov, Jim Spath, Peter Szell,
+   Ted T'so, Brian Tillman, Linus Torvalds, Patrick Volkerding, Martin
+   Vorländer, Steve Walton, Ken Weaverling, John Weekley, Martin Whitaker,
+   Jim Whitby, Matt Willman, Joellen Windsor, Farrell Woods, and many
+   others for binaries, hosting, reviews, suggestions, advice, bug
+   reports, and all the rest over the 3+ year C-Kermit 7.0 development
+   cycle. Thanks to Russ Nelson and the board of the Open Software
+   Initiative ([34]http://www.opensource.org) for their cooperation in
+   developing the new C-Kermit license and to the proprietors of those
+   free UNIX distributions that have incorporated C-Kermit 7.0 for their
+   cooperation and support, especially FreeBSD's Jörg Wunsch.
+
+NOTE TO KERMIT 95 USERS
+
+   Kermit 95 and C-Kermit share the same command and scripting language,
+   the same Kermit file-transfer protocol implementation, and much else
+   besides.
+
+   Like the book [35]Using C-Kermit, this file concentrates on the aspects
+   of C-Kermit that are common to all versions: UNIX, VMS, Windows, OS/2,
+   VOS, AOS/VS, etc. Please refer to your Kermit 95 documentation for
+   information that is specific to Kermit 95.
+
+   C-Kermit 7.0 corresponds to Kermit 95 1.1.19.
+
+C-KERMIT VERSIONS AND VERSION NUMBERS
+
+   "C-Kermit" refers to all the many programs that are compiled in whole
+   or in part from common C-language source code, comprising:
+
+     * A Kermit file transfer protocol module
+     * A command parser and script execution module
+     * A modem-dialing module
+     * A network support module
+     * A character-set translation module.
+
+   and several others. These "system-independent" modules are combined
+   with system-dependent modules for each platform to provide the required
+   input/output functions, and also in some cases overlaid with an
+   alternative user interface, such as Macintosh Kermit's point-and-click
+   interface, and in some cases also a terminal emulator, as Kermit 95.
+
+   The C-Kermit version number started as 1.0, ... 3.0, 4.0, 4.1 and then
+   (because of confusion at the time with Berkeley UNIX 4.2), 4B, 4C, and
+   so on, with the specific edit number in parentheses, for example
+   4E(072) or 5A(188). This scheme was used through 5A(191), but now we
+   have gone back to the traditional numbering scheme with decimal points:
+   major.minor.edit; for example 7.0.196. Internal version numbers (the
+   \v(version) variable), however, are compatible in C-Kermit 5A upwards.
+
+   Meanwhile, C-Kermit derivatives for some platforms (Windows, Macintosh)
+   might go through several releases while C-Kermit itself remains the
+   same. These versions have their own platform-specific version numbers,
+   such as Kermit 95 1.1.1, 1.1.2, and so on.
+
+   C-Kermit Version History:
+
+  1.0       1981-1982         Command-line only, 4.2 BSD UNIX only
+  2.0       (*)               (who remembers...)
+  3.0       May 1984          Command-line only, supports several platforms
+  4.0-4.1   Feb-Apr 1985 (*)  First interactive and modular version
+  4C(050)   May 1985
+  4D(060)   April 1986
+  4E(066)   August 1987       Long packets
+  4E(068)   January 1988
+  4E(072)   January 1989
+  4F(095)   August 1989 (*)   Attribute packets
+  5A(188)   November 1992     Scripting, TCP/IP, sliding windows (1)
+  5A(189)   September 1993    Control-char unprefixing
+  5A(190)   October 1994      Recovery
+  5A(191)   April 1995        OS/2 only
+  6.0.192   September 1996    Intelligent dialing, autodownload, lots more (2)
+  6.1.193   1997-98 (*)       Development only
+  6.1.194   June 1998         K95 only - switches, directory recursion, more
+  7.0.195   August 1999       IKSD + more (CU only as K95 1.1.18-CU)
+  7.0.196   1 January 2000    Unicode, lots more
+
+   (*) Never formally released (4.0 was a total rewrite)
+   (1) Using C-Kermit, 1st Edition
+   (2) Using C-Kermit, 2nd Edition
+
+CONTENTS
+
+ I.  [36]C-KERMIT DOCUMENTATION
+
+ II. [37]NEW FEATURES
+
+     (0) [38]INCOMPATIBILITIES WITH PREVIOUS RELEASES
+     (1) [39]PROGRAM AND FILE MANAGEMENT AND COMMANDS
+         1.0.  [40]Bug fixes
+         1.1.  [41]Command Continuation
+         1.2.  [42]Editor Interface
+         1.3.  [43]Web Browser and FTP Interface
+         1.4.  [44]Command Editing
+         1.5.  [45]Command Switches
+               1.5.1. [46]General Switch Syntax
+               1.5.2. [47]Order and Effect of Switches
+               1.5.3. [48]Distinguishing Switches from Other Fields
+               1.5.4. [49]Standard File Selection Switches
+               1.5.5. [50]Setting Preferences for Different Commands
+         1.6.  [51]Dates and Times
+         1.7.  [52]Partial Completion of Keywords
+         1.8.  [53]Command Recall
+         1.9.  [54]EXIT Messages
+         1.10. [55]Managing Keyboard Interruptions
+         1.11. [56]Taming the Wild Backslash -- Part Deux
+               1.11.1. [57]Background
+               1.11.2. [58]Kermit's Quoting Rules
+               1.11.3. [59]Passing DOS Filenames from Kermit to Shell Commands
+               1.11.4. [60]Using Variables to Hold DOS Filenames
+               1.11.5. [61]Passing DOS Filenames as Parameters to Macros
+               1.11.6. [62]Passing DOS File Names from Macro Parameters to the D
+OS Shell
+               1.11.7. [63]Passing DOS Filenames to Kermit from the Shell
+         1.12. [64]Debugging
+         1.13. [65]Logs
+         1.14. [66]Automatic File-Transfer Packet Recognition at the Command Pro
+mpt
+         1.15. [67]The TYPE Command
+         1.16. [68]The RESET Command
+         1.17. [69]The COPY and RENAME Commands
+         1.18. [70]The MANUAL Command
+         1.19. [71]String and Filename Matching Patterns
+         1.20. [72]Multiple Commands on One Line
+         1.21. [73]What Do I Have?
+         1.22. [74]Generalized File Input and Output
+               1.22.1. [75]Why Another I/O System?
+               1.22.2. [76]The FILE Command
+               1.22.3. [77]FILE Command Examples
+               1.22.4. [78]Channel Numbers
+               1.22.5. [79]FILE Command Error Codes
+               1.22.6. [80]File I/O Variables
+               1.22.7. [81]File I/O Functions
+               1.22.8. [82]File I/O Function Examples
+         1.23. [83]The EXEC Command
+         1.24. [84]Getting Keyword Lists with '?'
+     (2) [85]MAKING AND USING CONNECTIONS
+         2.0. [86]SET LINE and SET HOST Command Switches
+         2.1. [87]Dialing
+              2.1.1. [88]The Dial Result Message
+              2.1.2. [89]Long-Distance Dialing Changes
+              2.1.3. [90]Forcing Long-Distance Dialing
+              2.1.4. [91]Exchange-Specific Dialing Decisions
+              2.1.5. [92]Cautions about Cheapest-First Dialing
+              2.1.6. [93]Blind Dialing (Dialing with No Dialtone)
+              2.1.7. [94]Trimming the Dialing Dialog
+              2.1.8. [95]Controlling the Dialing Speed
+              2.1.9. [96]Pretesting Phone Number Conversions
+              2.1.10. [97]Greater Control over Partial Dialing
+              2.1.11. [98]New DIAL-related Variables and Functions
+              2.1.12. [99]Increased Flexibility of PBX Dialing
+              2.1.13. [100]The DIAL macro - Last-Minute Phone Number Conversions
+              2.1.14. [101]Automatic Tone/Pulse Dialing Selection
+              2.1.15. [102]Dial-Modifier Variables
+              2.1.16. [103]Giving Multiple Numbers to the DIAL Command
+         2.2. [104]Modems
+              2.2.1. [105]New Modem Types
+              2.2.2. [106]New Modem Controls
+         2.3. [107]TELNET and RLOGIN
+              2.3.0. [108]Bug Fixes
+              2.3.1. [109]Telnet Binary Mode Bug Adjustments
+              2.3.2. [110]VMS UCX Telnet Port Bug Adjustment
+              2.3.3. [111]Telnet New Environment Option
+              2.3.4. [112]Telnet Location Option
+              2.3.5. [113]Connecting to Raw TCP Sockets
+              2.3.6. [114]Incoming TCP Connections
+         2.4. [115]The EIGHTBIT Command
+         2.5. [116]The Services Directory
+         2.6. [117]Closing Connections
+         2.7. [118]Using C-Kermit with External Communication Programs
+              2.7.0. [119]C-Kermit over tn3270 and tn5250
+              2.7.1. [120]C-Kermit over Telnet
+              2.7.2. [121]C-Kermit over Rlogin
+              2.7.3. [122]C-Kermit over Serial Communication Programs
+              2.7.4. [123]C-Kermit over Secure Network Clients
+              2.7.4.1. [124]SSH
+              2.7.4.2. [125]SSL
+              2.7.4.3. [126]SRP
+              2.7.4.4. [127]SOCKS
+              2.7.4.5. [128]Kerberos and SRP
+         2.8. [129]Scripting Local Programs
+         2.9. [130]X.25 Networking
+              2.9.1. [131]IBM AIXLink/X.25 Network Provider Interface for AIX
+              2.9.2. [132]HP-UX X.25
+         2.10. [133]Additional Serial Port Controls
+         2.11. [134]Getting Access to the Dialout Device
+         2.12. [135]The Connection Log
+         2.13. [136]Automatic Connection-Specific Flow Control Selection
+         2.14. [137]Trapping Connection Establishment and Loss
+         2.15. [138]Contacting Web Servers with the HTTP Command
+     (3) [139]TERMINAL CONNECTION
+         3.1. [140]CONNECT Command Switches
+         3.2. [141]Triggers
+         3.3. [142]Transparent Printing
+         3.4. [143]Binary and Text Session Logs
+     (4) [144]FILE TRANSFER AND MANAGEMENT
+         4.0. [145]Bug Fixes, Minor Changes, and Clarifications
+         4.1. [146]File-Transfer Filename Templates
+         4.1.1. [147]Templates in the As-Name
+         4.1.2. [148]Templates on the Command Line
+         4.1.3. [149]Post-Transfer Renaming
+         4.2. [150]File-Transfer Pipes and Filters
+         4.2.1. [151]Introduction
+         4.2.1.1. [152]Terminology
+         4.2.1.2. [153]Notation
+         4.2.1.3. [154]Security
+         4.2.2. [155]Commands for Transferring from and to Pipes
+         4.2.2.1. [156]Sending from a Command
+         4.2.2.2. [157]Receiving to a Command
+         4.2.3. [158]Using File-Transfer Filters
+         4.2.3.1. [159]The SEND Filter
+         4.2.3.2. [160]The RECEIVE Filter
+         4.2.4. [161]Implicit Use of Pipes
+         4.2.5. [162]Success and Failure of Piped Commands
+         4.2.6. [163]Cautions about Using Pipes to Transfer Directory Trees
+         4.2.7. [164]Pipes and Encryption
+         4.2.8. [165]Commands and Functions Related to Pipes
+         4.2.8.1. [166]The OPEN !READ and OPEN !WRITE Commands
+         4.2.8.2. [167]The REDIRECT Command
+         4.2.8.3. [168]Receiving Mail and Print Jobs
+         4.2.8.4. [169]Pipe-Related Functions
+         4.3. [170]Automatic Per-File Text/Binary Mode Switching
+         4.3.1. [171]Exceptions
+         4.3.2. [172]Overview
+         4.3.3. [173]Commands
+         4.3.4. [174]Examples
+         4.4. [175]File Permissions
+         4.4.1. [176]When ATTRIBUTES PROTECTION is OFF
+         4.4.1.1. [177]Unix
+         4.4.1.2. [178]VMS
+         4.4.2. [179]When ATTRIBUTES PROTECTION is ON
+         4.4.2.1. [180]System-Specific Permissions
+         4.4.2.1.1. [181]UNIX
+         4.4.2.1.2. [182]VMS
+         4.4.2.2. [183]System-Independent Permissions
+         4.5. [184]File Management Commands
+         4.5.1. [185]The DIRECTORY Command
+         4.5.2. [186]The CD and BACK Commands
+         4.5.2.1. [187]Parsing Improvements
+         4.5.2.2. [188]The CDPATH
+         4.5.3. [189]Creating and Removing Directories
+         4.5.4. [190]The DELETE and PURGE Commands
+         4.6. [191]Starting the Remote Kermit Server Automatically
+         4.7. [192]File-Transfer Command Switches
+         4.7.1. [193]SEND Command Switches
+         4.7.2. [194]GET Command Switches
+         4.7.3. [195]RECEIVE Command Switches
+         4.8. [196]Minor Kermit Protocol Improvements
+         4.8.1. [197]Multiple Attribute Packets
+         4.8.2. [198]Very Short Packets
+         4.9. [199]Wildcard / File Group Expansion
+         4.9.1. [200]In UNIX C-Kermit
+         4.9.2. [201]In Kermit 95
+         4.9.3. [202]In VMS, AOS/VS, OS-9, VOS, etc.
+         4.10. [203]Additional Pathname Controls
+         4.11. [204]Recursive SEND and GET: Transferring Directory Trees
+         4.11.1. [205]Command-Line Options
+         4.11.2. [206]The SEND /RECURSIVE Command
+         4.11.3. [207]The GET /RECURSIVE Command
+         4.11.4. [208]New and Changed File Functions
+         4.11.5. [209]Moving Directory Trees Between Like Systems
+         4.11.6. [210]Moving Directory Trees Between Unlike Systems
+         4.12. [211]Where Did My File Go?
+         4.13. [212]File Output Buffer Control
+         4.14. [213]Improved Responsiveness
+         4.15. [214]Doubling and Ignoring Characters for Transparency
+         4.16. [215]New File-Transfer Display Formats
+         4.17. [216]New Transaction Log Formats
+         4.17.1. [217]The BRIEF Format
+         4.17.2. [218]The FTP Format
+         4.18. [219]Unprefixing NUL
+         4.19. [220]Clear-Channel Protocol
+         4.20. [221]Streaming Protocol
+         4.20.1. [222]Commands for Streaming
+         4.20.2. [223]Examples of Streaming
+         4.20.2.1. [224]Streaming on Socket-to-Socket Connections
+         4.20.2.2. [225]Streaming on Telnet Connections
+         4.20.2.3. [226]Streaming with Limited Packet Length
+         4.20.2.4. [227]Streaming on Dialup Connections
+         4.20.2.5. [228]Streaming on X.25 Connections
+         4.20.3. [229]Streaming - Preliminary Conclusions
+         4.21. [230]The TRANSMIT Command
+         4.22. [231]Coping with Faulty Kermit Implementations
+         4.22.1. [232]Failure to Accept Modern Negotiation Strings
+         4.22.2. [233]Failure to Negotiate 8th-bit Prefixing
+         4.22.3. [234]Corrupt Files
+         4.22.4. [235]Spurious Cancellations
+         4.22.5. [236]Spurious Refusals
+         4.22.6. [237]Failures during the Data Transfer Phase
+         4.22.7. [238]Fractured Filenames
+         4.22.8. [239]Bad File Dates
+         4.23. [240]File Transfer Recovery
+         4.24. [241]FILE COLLISION UPDATE Clarification
+         4.25. [242]Autodownload Improvements
+     (5) [243]CLIENT/SERVER
+         5.0. [244]Hints
+         5.1. [245]New Command-Line Options
+         5.2. [246]New Client Commands
+         5.3. [247]New Server Capabilities
+         5.3.1. [248]Creating and Removing Directories
+         5.3.2. [249]Directory Listings
+         5.4. [250]Syntax for Remote Filenames with Embedded Spaces
+         5.5. [251]Automatic Orientation Messages upon Directory Change
+         5.6. [252]New Server Controls
+         5.7. [253]Timeouts during REMOTE HOST Command Execution
+     (6) [254]INTERNATIONAL CHARACTER SETS
+         6.0. [255]ISO 8859-15 Latin Alphabet 9
+         6.1. [256]The HP-Roman8 Character Set
+         6.2. [257]Greek Character Sets
+         6.3. [258]Additional Latin-2 Character Sets
+         6.4. [259]Additional Cyrillic Character Sets
+         6.5. [260]Automatic Character-Set Switching
+         6.6. [261]Unicode
+         6.6.1. [262]Overview of Unicode
+         6.6.2. [263]UCS Byte Order
+         6.6.2. [264]UCS Transformation Formats
+         6.6.3. [265]Conformance Levels
+         6.6.4. [266]Relationship of Unicode with Kermit's Other Character Sets
+         6.6.5. [267]Kermit's Unicode Features
+         6.6.5.1. [268]File Transfer
+         6.6.5.2. [269]The TRANSLATE Command
+         6.6.5.3. [270]Terminal Connection
+         6.6.5.4. [271]The TRANSMIT Command
+         6.6.5.5. [272]Summary of Kermit Unicode Commands
+         6.7. [273]Client/Server Character-Set Switching
+     (7) [274]SCRIPT PROGRAMMING
+         7.0. [275]Bug Fixes
+         7.1. [276]The INPUT Command
+         7.1.1. [277]INPUT Timeouts
+         7.1.2. [278]New INPUT Controls
+         7.1.3. [279]INPUT with Pattern Matching
+         7.1.4. [280]The INPUT Match Result
+         7.2. [281]New or Improved Built-In Variables
+         7.3. [282]New or Improved Built-In Functions
+         7.4. [283]New IF Conditions
+         7.5. [284]Using More than Ten Macro Arguments
+         7.6. [285]Clarification of Function Call Syntax
+         7.7. [286]Autodownload during INPUT Command Execution
+         7.8. [287]Built-in Help for Functions.
+         7.9. [288]Variable Assignments
+         7.9.1. [289]Assignment Operators
+         7.9.2. [290]New Assignment Commands
+         7.10. [291]Arrays
+         7.10.1. [292]Array Initializers
+         7.10.2. [293]Turning a String into an Array of Words
+         7.10.3. [294]Arrays of Filenames
+         7.10.4. [295]Automatic Arrays
+         7.10.5. [296]Sorting Arrays
+         7.10.6. [297]Displaying Arrays
+         7.10.7. [298]Other Array Operations
+         7.10.8. [299]Hints for Using Arrays
+         7.10.9. [300]Do-It-Yourself Arrays
+         7.10.10. [301]Associative Arrays
+         7.11. [302]OUTPUT Command Improvements
+         7.12. [303]Function and Variable Diagnostics
+         7.13. [304]Return Value of Macros
+         7.14. [305]The ASSERT, FAIL, and SUCCEED Commands.
+         7.15. [306]Using Alarms
+         7.16. [307]Passing Arguments to Command Files
+         7.17. [308]Dialogs with Timed Responses
+         7.18. [309]Increased Flexibility of SWITCH Case Labels
+         7.19. "[310]Kerbang" Scripts
+         7.20. [311]IF and XIF Statement Syntax
+         7.20.1. [312]The IF/XIF Distinction
+         7.20.2. [313]Boolean Expressions (The IF/WHILE Condition)
+         7.21. [314]Screen Formatting and Cursor Control
+         7.22. [315]Evaluating Arithmetic Expressions
+         7.23. [316]Floating-Point Arithmetic
+         7.24. [317]Tracing Script Execution
+         7.25. [318]Compact Substring Notation
+         7.26. [319]New WAIT Command Options
+         7.26.1. [320]Waiting for Modem Signals
+         7.26.2. [321]Waiting for File Events
+         7.27. [322]Relaxed FOR and SWITCH Syntax
+     (8) [323]USING OTHER FILE TRANSFER PROTOCOLS
+     (9) [324]COMMAND-LINE OPTIONS
+         9.0. [325]Extended-Format Command-Line Options
+         9.1. [326]Command Line Personalities
+         9.2. [327]Built-in Help for Command Line Options
+         9.3. [328]New Command-Line Options
+    (10) [329]C-KERMIT AND G-KERMIT
+
+III. [330]APPENDICES
+
+III.1. [331]Character Set Tables
+III.1.1. [332]The Hewlett Packard Roman8 Character Set
+III.1.2. [333]Greek Character Sets
+III.1.2.1. [334]The ISO 8859-7 Latin / Greek Alphabet
+III.1.2.2. [335]The ELOT 927 Character Set
+III.1.2.3. [336]PC Code Page 869
+III.2. [337]Updated Country Codes
+
+IV. [338]ERRATA & CORRIGENDA: Corrections to "Using C-Kermit" 2nd Edition.
+V. [339]ADDITIONAL COPYRIGHT NOTICES
+
+I. C-KERMIT DOCUMENTATION
+
+   The user manual for C-Kermit is:
+
+     Frank da Cruz and Christine M. Gianone, [340]Using C-Kermit, Second
+     Edition, Digital Press / Butterworth-Heinemann, Woburn, MA, 1997,
+     622 pages, ISBN 1-55558-164-1.
+
+   [341]CLICK HERE for reviews.
+
+   The present document is a supplement to Using C-Kermit 2nd Ed, not a
+   replacement for it.
+
+   US single-copy price: $52.95; quantity discounts available. Available
+   in bookstores or directly from Columbia University:
+
+  The Kermit Project
+  Columbia University
+  612 West 115th Street
+  New York NY  10025-7799
+  USA
+  Telephone: +1 (212) 854-3703
+  Fax:       +1 (212) 662-6442
+
+   Domestic and overseas orders accepted. Price: US $44.95 (US, Canada,
+   and Mexico). Shipping: $4.00 within the USA; $15.00 to all other
+   countries. Orders may be paid by MasterCard or Visa, or prepaid by
+   check in US dollars. Add $65 bank fee for checks not drawn on a US
+   bank. Do not include sales tax. Inquire about quantity discounts.
+
+   You can also order by phone from the publisher, Digital Press /
+   [342]Butterworth-Heinemann, with MasterCard, Visa, or American Express:
+
+  +1 800 366-2665   (Woburn, Massachusetts office for USA & Canada)
+  +44 1865 314627   (Oxford, England distribution centre for UK & Europe)
+  +61 03 9245 7111  (Melbourne, Vic, office for Australia & NZ)
+  +65 356-1968      (Singapore office for Asia)
+  +27 (31) 2683111  (Durban office for South Africa)
+
+   A [343]German-language edition of the First Edition is also available:
+
+     Frank da Cruz and Christine M. Gianone, C-Kermit - Einführung und
+     Referenz, Verlag Heinz Heise, Hannover, Germany (1994). ISBN
+     3-88229-023-4. Deutsch von Gisbert W. Selke. Price: DM 88,00. Verlag
+     Heinz Heise GmbH & Co. KG, Helstorfer Strasse 7, D-30625 Hannover.
+     Tel. +49 (05 11) 53 52-0, Fax. +49 (05 11) 53 52-1 29.
+
+   The [344]Kermit file transfer protocol is specified in:
+
+     Frank da Cruz, Kermit, A File Transfer Protocol, Digital Press,
+     Bedford, MA, 1987, 379 pages, ISBN 0-932376-88-6. US single-copy
+     price: $39.95. Availability as above.
+
+   News and articles about Kermit software and protocol are published
+   periodically in the journal, [345]Kermit News. Subscriptions are free;
+   contact Columbia University at the address above.
+
+   Online news about Kermit is published in the
+   [346]comp.protocols.kermit.announce and [347]comp.protocols.kermit.misc
+   newsgroups.
+
+II. NEW FEATURES
+
+   Support for the Bell Labs Plan 9 operating system was added to version
+   6.0 too late to be mentioned in the book (although it does appear on
+   the cover).
+
+   Specific changes and additions are grouped together by major topic,
+   roughly corresponding to the chapters of [348]Using C-Kermit.
+
+0. INCOMPATIBILITIES WITH PREVIOUS RELEASES
+
+    1. C-Kermit 7.0 uses FAST Kermit protocol settings by default. This
+       includes "unprefixing" of certain control characters. Because of
+       this, file transfers that worked with previous releases might not
+       work in the new release (but it is more likely that they will work,
+       and much faster). If a transfer fails, you'll get a
+       context-sensitive hint suggesting possible causes and cures.
+       Usually SET PREFIXING ALL does the trick.
+    2. C-Kermit 7.0 transfers files in BINARY mode by default. To restore
+       the previous behavior, put SET FILE TYPE TEXT in your C-Kermit
+       initialization file.
+    3. No matter whether FILE TYPE is BINARY or TEXT by default, C-Kermit
+       7.0 now switches between text and binary mode automatically on a
+       per-file basis according to various criteria, including (a) which
+       kind of platform is on the other end of the connection (if known),
+       (b) the version of Kermit on the other end, and (c) the file's name
+       (see [349]Section 4, especially [350]4.3). To disable this
+       automatic switching and restore the earlier behavior, put SET
+       TRANSFER MODE MANUAL in your C-Kermit initialization file. To
+       disable automatic switching for a particular transfer, include a
+       /TEXT or /BINARY switch with your SEND or GET command.
+    4. The RESEND and REGET commands automatically switch to binary mode;
+       previously if RESEND or REGET were attempted when FILE TYPE was
+       TEXT, these commands would fail immediately, with a message telling
+       you they work only when the FILE TYPE is BINARY. Now they simply do
+       this for you. See [351]Section 4.23 for additional (important)
+       information.
+    5. SET PREFIXING CAUTIOUS and MINIMAL now both prefix linefeed (10 and
+       138) in case rlogin, ssh, or cu are "in the middle", since
+       otherwise <LF>~ might appear in Kermit packets, and this would
+       cause rlogin, ssh, or cu to disconnect, suspend, escape back, or
+       otherwise wreck the file transfer. Xon and Xoff are now always
+       prefixed too, even when Xon/Xoff flow control is not in effect,
+       since unprefixing them has proven dangerous on TCP/IP connections.
+    6. In UNIX, VMS, Windows, and OS/2, the DIRECTORY command is built
+       into C-Kermit itself rather than implemented by running an external
+       command or program. The built-in command might not behave the way
+       the platform-specific external one did, but many options are
+       available for customization. Of course the underlying
+       platform-specific command can still be accessed with "!", "@", or
+       "RUN" wherever the installation does not forbid. In UNIX, the "ls"
+       command can be accessed directly as "ls" in C-Kermit. See
+       [352]Section 4.5.1 for details.
+    7. SEND ? prints a list of switches rather than a list of filenames.
+       If you want to see a list of filenames, use a (system-dependent)
+       construction such as SEND ./? (for UNIX, Windows, or OS/2), SEND
+       []? (VMS), etc. See [353]Sections 1.5 and [354]4.7.1.
+    8. In UNIX, OS-9, and Kermit 95, the wildcard characters in previous
+       versions were * and ?. In C-Kermit 7.0 they are *, ?, [, ], {, and
+       }, with dash used inside []'s to denote ranges and comma used
+       inside {} to separate list elements. If you need to include any of
+       these characters literally in a filename, precede each one with
+       backslash (\). See [355]Section 4.9.
+    9. SET QUIET { ON, OFF } is now on the command stack, just like SET
+       INPUT CASE, SET COUNT, SET MACRO ERROR, etc, as described on p.458
+       of [356]Using C-Kermit, 2nd Edition. This allows any macro or
+       command file to SET QUIET ON or OFF without worrying about saving
+       and restoring the global QUIET value. For example, this lets you
+       write a script that tries SET LINE on lots of devices until it
+       finds one free without spewing out loads of error messages, and
+       also without disturbing the global QUIET setting, whatever it was.
+   10. Because of the new "." operator (which introduces assignments),
+       macros whose names begin with "." can not be invoked "by name".
+       However, they still can be invoked with DO.
+   11. The syntax of the EVALUATE command has changed. See [357]Section
+       7.9.2. To restore the previous syntax, use SET EVALUATE OLD.
+   12. The \v(directory) variable now includes the trailing directory
+       separator; in previous releases it did not. This is to allow
+       constructions such as:
+  cd \v(dir)data.tmp
+
+       to work across platforms that might have different directory
+       notation, such as UNIX, Windows, and VMS.
+   13. Prior to C-Kermit 7.0, the FLOW-CONTROL setting was global and
+       sticky. In C-Kermit 7.0, there is an array of default flow-control
+       values for each kind of connection, that are applied automatically
+       at SET LINE/PORT/HOST time. Thus a SET FLOW command given before
+       SET LINE/PORT/HOST is likely to be undone. Therefore SET FLOW can
+       be guaranteed to have the desired effect only if given after the
+       SET LINE/PORT/HOST command.
+   14. Character-set translation works differently in the TRANSMIT command
+       when (a) the file character-set is not the same as the local end of
+       the terminal character-set, or (b) when the terminal character-set
+       is TRANSPARENT.
+
+1. PROGRAM AND FILE MANAGEMENT AND COMMANDS
+
+1.0. Bug Fixes
+
+   The following patches were issued to correct bugs in C-Kermit 6.0.
+   These are described in detail in the 6.0 PATCHES file. All of these
+   fixes have been incorporated in C-Kermit 6.1 (never released except as
+   K95 1.1.16-17) and 7.0.
+
+ 0001   All UNIX         C-Kermit mishandles timestamps on files before 1970
+ 0002   Solaris 2.5++    Compilation error on Solaris 2.5 with Pro C
+ 0003   All VMS          CKERMIT.INI Fix for VMS
+ 0004   VMS/VAX/UCX 2.0  C-Kermit 6.0 can't TELNET on VAX/VMS with UCX 2.0
+ 0005   All              C-Kermit Might Send Packets Outside Window
+ 0006   All              MOVE from SEND-LIST does not delete original files
+ 0007   Solaris 2.5++    Higher serial speeds on Solaris 2.5
+ 0008   All              C-Kermit application file name can't contain spaces
+ 0009   AT&T 7300 UNIXPC setuid and hardware flow-control problems
+ 0010   Linux on Alpha   Patch to make ckutio.c compile on Linux/Alpha
+ 0011   OS-9/68000 2.4   Patch to make ck9con.c compile on OS-9/68000 2.4
+ 0012   MW Coherent 4.2  Patches for successful build on Coherent 4.2
+ 0013   SINIX-Y 5.43     "delay" variable conflicts with <sys/clock.h>
+ 0014   VMS/VAX/CMU-IP   Subject: Patches for VAX/VMS 5.x + CMU-IP
+ 0015   All              XECHO doesn't flush its output
+ 0016   VMS              CD and other directory operations might not work
+ 0017   Linux 1.2.x++    Use standard POSIX interface for high serial speeds
+ 0018   UNIX             SET WILDCARD-EXPANSION SHELL dumps core
+ 0019   All              Hayes V.34 modem init string problem
+ 0020   All              READ command does not fail if file not open
+ 0021   All              Problems with long function arguments
+ 0022   All              Certain \function()s can misbehave
+ 0023   All              X MOD 0 crashes program
+ 0024   All              Internal bulletproofing for lower() function
+ 0025   OpenBSD          Real OpenBSD support for C-Kermit 6.0
+ 0026   All              Incorrect checks for macro/command-file nesting depth
+ 0027   All              ANSWER doesn't automatically CONNECT
+ 0028   All              Overzealous EXIT warning
+ 0029   All              OUTPUT doesn't echo when DUPLEX is HALF
+ 0030   All              Minor problems with REMOTE DIRECTORY/DELETE/etc
+ 0031   All              CHECK command broken
+ 0032   All              Problem with SET TRANSMIT ECHO
+ 0033   UNIX, VMS, etc   HELP SET SERVER says too much
+ 0034   All              READ and !READ too picky about line terminators
+ 0035   All              END from inside SWITCH doesn't work
+ 0036   All              Problem telnetting to multihomed hosts
+ 0037   All              Redirection failures in REMOTE xxx > file
+
+   REDIRECT was missing in many UNIX C-Kermit implementations; in version
+   7.0, it should be available in all of them.
+
+1.1. Command Continuation
+
+   Comments that start with ";" or "#" can no longer be continued. In:
+
+  ; this is a comment -
+  echo blah
+
+   the ECHO command will execute, rather than being taken as a
+   continuation of the preceding comment line. This allows easy
+   "commenting out" of commands from macro definitions.
+
+   However, the text of the COMMENT command can still be continued onto
+   subsequent lines:
+
+  comment this is a comment -
+  echo blah
+
+   As of version 6.0, backslash is no longer a valid continuation
+   character. Only hyphen should be used for command continuation. This is
+   to make it possible to issue commands like "cd a:\" on DOS-like
+   systems.
+
+   As of version 7.0:
+
+     * You can quote a final dash to prevent it from being a continuation
+       character:
+  echo foo\-
+
+       This prints "foo-". The command is not continued.
+     * You can enter commands such as:
+  echo foo - ; this is a comment
+
+       interactively and they are properly treated as continued commands.
+       Previously this worked only in command files.
+
+1.2. Editor Interface
+
+   SET EDITOR name [ options ]
+          Lets you specify a text-editing program. The name can be a fully
+          specified pathname like /usr/local/bin/emacs19/emacs, or it can
+          be the name of any program in your PATH, e.g. "set editor
+          emacs". In VMS, it must be a DCL command like "edit",
+          "edit/tpu", "emacs", etc. If an environment variable EDITOR is
+          defined when Kermit starts, its value is the default editor. You
+          can also specify options to be included on the editor command
+          line. Returns to Kermit when the editor exits.
+
+   EDIT [ filename ]
+          If the EDIT command is given without a filename, then if a
+          previous filename had been given to an EDIT command, it is used;
+          if not, the editor is started without a file. If a filename is
+          given, the editor is started on that file, and the filename is
+          remembered for subsequent EDIT commands.
+
+   SHOW EDITOR
+          Displays the full pathname of your text editor, if any, along
+          with any command line options, and the file most recently edited
+          (and therefore the default filename for your next EDIT command).
+
+   Related variables: \v(editor), \v(editopts), \v(editfile).
+
+1.3. Web Browser and FTP Interface
+
+   C-Kermit includes an FTP command, which simply runs the FTP program;
+   C-Kermit does not include any built-in support for Internet File
+   Transfer Protocol, nor any method for interacting directly with an FTP
+   server. In version 7.0, however, C-Kermit lets you specify your FTP
+   client:
+
+   SET FTP-CLIENT [ name [ options ] ]
+          The name is the name of the FTP executable. In UNIX, Windows, or
+          OS/2, it can be the filename of any executable program in your
+          PATH (e.g. "ftp.exe" in Windows, "ftp" in UNIX); elsewhere (or
+          if you do not have a PATH definition), it must be the fully
+          specified pathname of the FTP program. If the name contains any
+          spaces, enclose it braces. Include any options after the
+          filename; these depend the particular ftp client.
+
+   The Web browser interface is covered in the following subsections.
+
+1.3.1. Invoking your Browser from C-Kermit
+
+   BROWSE [ url ]
+          Starts your preferred Web browser on the URL, if one is given,
+          otherwise on the most recently given URL, if any. Returns to
+          Kermit when the browser exits.
+
+   SET BROWSER [ name [ options ] ]
+          Use this command to specify the name of your Web browser
+          program, for example: "set browser lynx". The name must be in
+          your PATH, or else it must be a fully specified filename; in VMS
+          it must be a DCL command.
+
+   SHOW BROWSER
+          Displays the current browser, options, and most recent URL.
+
+   Related variables: \v(browser), \v(browsopts), \v(browsurl).
+
+   Also see [358]Section 2.15: Contacting Web Servers with the HTTP
+   Command.
+
+1.3.2. Invoking C-Kermit from your Browser
+
+   The method for doing this depends, of course, on your browser. Here are
+   some examples:
+
+   Netscape on UNIX (X-based)
+          In the Options->Applications section, set your Telnet
+          application to:
+
+  xterm -e /usr/local/bin/kermit/kermit -J %h %p
+
+          (replace "/usr/local/bin/kermit/kermit" by C-Kermit's actual
+          pathname). -J is C-Kermit's command-line option to "be like
+          Telnet"; %h and %p are Netscape placeholders for hostname and
+          port.
+
+   Lynx on UNIX
+          As far as we know, this can be done only at compile time. Add
+          the following line to the Lynx userdefs.h file before building
+          the Lynx binary:
+
+  #define TELNET_COMMAND "/opt/bin/kermit -J"
+
+          And then add lines like the following to the Lynx.cfg file:
+
+  DOWNLOADER:Kermit binary download:/opt/bin/kermit -i -V -s %s -a %s:TRUE
+  DOWNLOADER:Kermit text download:/opt/bin/kermit -s %s -a %s:TRUE
+
+  UPLOADER:Kermit binary upload:/opt/bin/kermit -i -r -a %s:TRUE
+  UPLOADER:Kermit text upload:/opt/bin/kermit -r -a %s:TRUE
+  UPLOADER:Kermit text get:/opt/bin/kermit -g %s:TRUE
+  UPLOADER:Kermit binary get:/opt/bin/kermit -ig %s:TRUE
+
+   But none of the above is necessary if you make C-Kermit your default
+   Telnet client, which you can do by making a symlink called 'telnet' to
+   the C-Kermit 7.0 binary. See [359]Section 9.1 for details.
+
+1.4. Command Editing
+
+   Ctrl-W ("Word delete") was changed in 7.0 to delete back to the
+   previous non-alphanumeric, rather than all the way back to the previous
+   space.
+
+1.5. Command Switches
+
+   As of version 7.0, C-Kermit's command parser supports a new type of
+   field, called a "switch". This is an optional command modifier.
+
+1.5.1. General Switch Syntax
+
+   A switch is a keyword beginning with a slash (/). If it takes a value,
+   then the value is appended to it (with no intervening spaces),
+   separated by a colon (:) or equal sign (=). Depending on the switch,
+   the value may be a number, a keyword, a filename, a date/time, etc.
+   Examples:
+
+  send oofa.txt                              ; No switches
+  send /binary oofa.zip                      ; A switch without a value
+  send /protocol:zmodem oofa.zip             ; A switch with a value (:)
+  send /protocol=zmodem oofa.zip             ; A switch with a value (=)
+  send /text /delete /as-name:x.x oofa.txt   ; Several switches
+
+   Like other command fields, switches are separated from other fields,
+   and from each other, by whitespace, as shown in the examples just
+   above. You can not put them together like so:
+
+  send/text/delete/as-name:x.x oofa.txt
+
+   (as you might do in VMS or DOS, or as we might once have done in
+   TOPS-10 or TOPS0-20, or PIP). This is primarily due to ambiguity
+   between "/" as switch introducer versus "/" as UNIX directory
+   separator; e.g. in:
+
+  send /delete/as-name:foo/text oofa.txt
+
+   Does "foo/text" mean the filename is "foo" and the transfer is to be in
+   text mode, or does it mean the filename is "foo/text"? Therefore we
+   require whitespace between switches to resolve the ambiguity. (That's
+   only one of several possible ambiguities -- it is also conceivable that
+   a file called "text" exists in the path "/delete/as-name:foo/").
+
+   In general, if a switch can take a value, but you omit it, then either
+   a reasonable default value is supplied, or an error message is printed:
+
+  send /print:-Plaserwriter oofa.txt         ; Value included = print options
+  send /print oofa.txt                       ; Value omitted, OK
+  send /mail:kermit@columbia.edu oofa.txt    ; Value included = address
+  send /mail oofa.txt                        ; Not OK - address required
+  ?Address required
+
+   Context-sensitive help (?) and completion (Esc or Tab) are available in
+   the normal manner:
+
+  C-Kermit> send /pr? Switch, one of the following:
+    /print /protocol
+  C-Kermit> send /pro<ESC>tocol:?  File-transfer protocol,
+   one of the following:
+    kermit   xmodem   ymodem   ymodem-g   zmodem
+  C-Kermit> send /protocol:k<TAB>ermit
+
+   If a switch takes a value and you use completion on it, a colon (:) is
+   printed at the end of its name to indicate this. If it does not take a
+   value, a space is printed.
+
+   Also, if you type ? in a switch field, switches that take values are
+   shown with a trailing colon; those that don't take values are shown
+   without one.
+
+1.5.2. Order and Effect of Switches
+
+   The order of switches should not matter, except that they are evaluated
+   from left to right, so if you give two switches with opposite effects,
+   the rightmost one is used:
+
+  send /text /binary oofa.zip                ; Sends oofa.zip in binary mode.
+
+   Like other command fields, switches have no effect whatsoever until the
+   command is entered (by pressing the Return or Enter key). Even then,
+   switches affect only the command with which they are included; they do
+   not have global effect or side effects.
+
+1.5.3. Distinguishing Switches from Other Fields
+
+   All switches are optional. A command that uses switches lets you give
+   any number of them, including none at all. Example:
+
+  send /binary oofa.zip
+  send /bin /delete oofa.zip
+  send /bin /as-name:mupeen.zip oofa.zip
+  send oofa.zip
+
+   But how does Kermit know when the first "non-switch" is given? It has
+   been told to look for both a switch and for something else, the data
+   type of the next field (filename, number, etc). In most cases, this
+   works well. But conflicts are not impossible. Suppose, for example, in
+   UNIX there was a file named "text" in the top-level directory. The
+   command to send it would be:
+
+  send /text
+
+   But C-Kermit would think this was the "/text" switch. To resolve the
+   conflict, use braces:
+
+  send {/text}
+
+   or other circumlocutions such as "send //text", "send /./text", etc.
+
+   The opposite problem can occur if you give an illegal switch that
+   happens to match a directory name. For example:
+
+  send /f oofa.txt
+
+   There is no "/f" switch (there are several switches that begin with
+   "/f", so "/f" is ambiguous). Now suppose there is an "f" directory in
+   the root directory; then this command would be interpreted as:
+
+     Send all the files in the "/f" directory, giving each one an as-name
+     of "oofa.txt".
+
+   This could be a mistake, or it could be exactly what you intended;
+   C-Kermit has no way of telling the difference. To avoid situations like
+   this, spell switches out in full until you are comfortable enough with
+   them to know the minimum abbreviation for each one. Hint: use ? and
+   completion while typing switches to obtain the necessary feedback.
+
+1.5.4. Standard File Selection Switches
+
+   The following switches are used on different file-oriented commands
+   (such as SEND, DIRECTORY, DELETE, PURGE) to refine the selection of
+   files that match the given specification.
+
+   /AFTER:date-time
+          Select only those files having a date-time later than the one
+          given. See [360]Section 1.6 for date-time formats. Synonym:
+          /SINCE.
+
+   /NOT-AFTER:date-time
+          Select only those files having a date-time not later than (i.e.
+          earlier or equal to) the one given. Synonym: /NOT-SINCE.
+
+   /BEFORE:date-time
+          Select only those files having a date-time earlier than the one
+          given.
+
+   /NOT-BEFORE:date-time
+          Select only those files having a date-time not earlier than
+          (i.e. later or equal to) the one given.
+
+   /DOTFILES
+          UNIX and OS-9 only: The filespec is allowed to match files whose
+          names start with (dot) period. Normally these files are not
+          shown.
+
+   /NODOTFILES
+          (UNIX and OS-9 only) Don't show files whose names start with dot
+          (period). This is the opposite of /DOTFILES, and is the default.
+          Note that when a directory name starts with a period, the
+          directory and (in recursive operations) all its subdirectories
+          are skipped.
+
+   /LARGER-THAN:number
+          Only select files larger than the given number of bytes.
+
+   /SMALLER-THAN:number
+          Only select files smaller than the given number of bytes.
+
+   /EXCEPT:pattern
+          Specifies that any files whose names match the pattern, which
+          can be a regular filename, or may contain "*" and/or "?"
+          metacharacters (wildcards), are not to be selected. Example:
+
+  send /except:*.log *.*
+
+          sends all files in the current directory except those with a
+          filetype of ".log". Another:
+
+  send /except:*.~*~ *.*
+
+          sends all files except the ones that look like Kermit or EMACS
+          backup files (such as "oofa.txt.~17~") (of course you can also
+          use the /NOBACKUP switch for this).
+
+          The pattern matcher is the same one used by IF MATCH string
+          pattern ([361]Section 7.4), so you can test your patterns using
+          IF MATCH. If you need to match a literal * or ? (etc), precede
+          it by a backslash (\). If the pattern contains any spaces, it
+          must be enclosed in braces:
+
+  send /except:{Foo bar} *.*
+
+          The pattern can also be a list of up to 8 patterns. In this
+          case, the entire pattern must be enclosed in braces, and each
+          sub-pattern must also be enclosed in braces; this eliminates the
+          need for designating a separator character, which is likely to
+          also be a legal filename character on some platform or other,
+          and therefore a source of confusion. You may include spaces
+          between the subpatterns but they are not necessary. The
+          following two commands are equivalent:
+
+  send /except:{{ck*.o} {ck*.c}} ck*.?
+  send /except:{{ck*.o}{ck*.c}} ck*.?
+
+          If a pattern is to include a literal brace character, precede it
+          with "\". Also note the apparent conflict of this list format
+          and the string-list format described in [362]Section 4.9.1. In
+          case you want to include a wildcard string-list with braces on
+          its outer ends as an /EXCEPT: argument, do it like this:
+
+  send /except:{{{ckuusr.c,ckuus2.c,ckuus6.c}}} ckuus*.c
+
+1.5.5. Setting Preferences for Different Commands
+
+   Certain oft-used commands offer lots of switches because different
+   people have different requirements or preferences. For example, some
+   people want to be able to delete files without having to watch a list
+   of the deleted files scroll past, while others want to be prompted for
+   permission to delete each file. Different people prefer different
+   directory-listing styles. And so on. Such commands can be tailored with
+   the SET OPTIONS command:
+
+   SET OPTIONS command [ switch [ switch [ ... ] ] ]
+          Sets each switch as the default for the given command, replacing
+          the "factory default". Of course you can also override any
+          defaults established by the SET OPTIONS command by including the
+          relevant switches in the affected command any time you issue it.
+
+   SHOW OPTIONS
+          Lists the commands that allows option-setting, and the options
+          currently in effect, if any, for each. Switches that have
+          synonyms are shown under their primary name; for example. /LOG
+          and /VERBOSE are shown as /LIST.
+
+   Commands for which options may be set include DIRECTORY, DELETE, PURGE,
+   and TYPE. Examples:
+
+  SET OPTIONS DIRECTORY /PAGE /NOBACKUP /HEADING /SORT:DATE /REVERSE
+  SET OPTIONS DELETE /LIST /NOHEADING /NOPAGE /NOASK /NODOTFILES
+  SET OPTIONS TYPE /PAGE
+
+   Not necessarily all of a command's switches can be set as options. For
+   example, file selection switches, since these would normally be
+   different for each command.
+
+   Put the desired SET OPTIONS commands in your C-Kermit customization
+   file for each command whose default switches you want to change every
+   time you run C-Kermit.
+
+1.6. Dates and Times
+
+   Some commands and switches take date-time values, such as:
+
+  send /after:{8-Feb-2000 10:28:01}
+
+   Various date-time formats are acceptable. The rules for the date are:
+
+     * The year must have 4 digits.
+     * If the year comes first, the second field is the month.
+     * The day, month, and year may be separated by spaces, /, -, or
+       underscore.
+     * The month may be numeric (1 = January) or spelled out or
+       abbreviated in English.
+
+   If the date-time string contains any spaces, it must be enclosed in
+   braces. Examples of legal dates:
+
+                           Interpretation:
+  2000-Feb-8                8 February 2000
+  {2000 Feb 8}              8 February 2000
+  2000/Feb/8                8 February 2000
+  2000_Feb_8                8 February 2000
+  2000-2-8                  8 February 2000
+  2000-02-08                8 February 2000
+  8-Feb-2000                8 February 2000
+  08-Feb-2000               8 February 2000
+  12/25/2000                25 December 2000
+  25/12/2000                25 December 2000
+
+   The last two examples show that when the year comes last, and the month
+   is given numerically, the order of the day and month doesn't matter as
+   long as the day is 13 or greater (mm/dd/yyyy is commonly used in the
+   USA, whereas dd/mm/yyyy is the norm in Europe). However:
+
+  08/02/2000                Is ambiguous and therefore not accepted.
+
+   If a date is given, the time is optional and defaults to 00:00:00. If
+   the time is given with a date, it must follow the date, separated by
+   space, /, -, or underscore, and with hours, minutes, and seconds
+   separated by colon (:). Example:
+
+  2000-Feb-8 10:28:01       Represents 8 February 2000, 10:28:01am
+
+   If a date is not given, the current date is used and a time is
+   required.
+
+   Time format is hh:mm:ss or hh:mm or hh in 24-hour format, or followed
+   by "am" or "pm" (or "AM" or "PM") to indicate morning or afternoon.
+   Examples of times that are acceptable:
+
+                           Interpretation:
+  3:23:56                    3:23:56am
+  3:23:56am                  3:23:56am
+  3:23:56pm                  3:23:56pm = 15:23:56
+ 15:23:56                    3:23:56pm = 15:23:56
+  3:23pm                     3:23:00pm = 15:23:00
+  3:23PM                     3:23:00pm = 15:23:00
+  3pm                        3:00:00pm = 15:00:00
+
+   Examples of legal date-times:
+
+  send /after:{8 Feb 2000 10:28:01}
+  send /after:8_Feb_2000_10:28:01
+  send /after:8-Feb-2000/10:28:01
+  send /after:2000/02/08/10:28:01
+  send /after:2000/02/08_10:28:01
+  send /after:2000/02/08_10:28:01am
+  send /after:2000/02/08_10:28:01pm
+  send /after:2000/02/08_10:28pm
+  send /after:2000/02/08_10pm
+  send /after:10:00:00pm
+  send /after:10:00pm
+  send /after:10pm
+  send /after:22
+
+   Finally, there is a special all-numeric format you can use:
+
+  yyyymmdd hh:mm:ss
+
+   For example:
+
+  20000208 10:28:01
+
+   This is Kermit's standard date-time format (based on ISO 8601), and is
+   accepted (among other formats) by any command or switch that requires a
+   date-time, and is output by any function whose result is a calendar
+   date-time.
+
+   There are no optional parts to this format and it must be exactly 17
+   characters long, punctuated as shown (except you can substitute
+   underscore for space in contexts where a single "word" is required).
+   The time is in 24-hour format (23:00:00 is 11:00pm). This is the format
+   returned by \fdate(filename), so you can also use constructions like
+   this:
+
+  send /after:\fdate(oofa.txt)
+
+   which means "all files newer than oofa.txt".
+
+   Besides explicit dates, you can also use the any of the following
+   shortcuts:
+
+   TODAY
+          Stands for the current date at 00:00:00.
+
+   TODAY 12:34:56
+          Stands for the current date at the given time.
+
+   YESTERDAY
+          Stands for yesterday's date at 00:00:00. A time may also be
+          given.
+
+   TOMORROW
+          Stands for tomorrow's date at 00:00:00. A time may also be
+          given.
+
+   + number { DAYS, WEEKS, MONTHS, YEARS } [ time ]
+          Is replaced by the future date indicated, relative to the
+          current date. If the time is omitted, 00:00:00 is used.
+          Examples: +3days, +2weeks, +1year, +37months.
+
+   - number { DAYS, WEEKS, MONTHS, YEARS } [ time ]
+
+          Is replaced by the past date indicated, relative to the current
+          date. If the time is omitted, 00:00:00 is used.
+
+   The time can be separated from the date shortcut by any of the same
+   separators that are allowed for explicit date-times: space, hyphen,
+   slash, period, or underscore. In switches and other space-delimited
+   fields, use non-spaces to separate date/time fields, or enclose the
+   date-time in braces, e.g.:
+
+  purge /before:-4days_12:00:00
+  purge /before:{- 4 days 12:00:00}
+
+   Of course you can also use variables:
+
+  define \%n 43
+  purge /before:-\%ndays_12:00:00
+
+   Shortcut names can be abbreviated to any length that still
+   distinguishes them from any other name that can appear in the same
+   context, e.g. "TOD" for today, "Y" for yesterday. Also, the special
+   abbreviation "wks" is accepted for WEEKS, and "yrs" for "YEARS".
+
+   (To see how to specify dates relative to a specific date, rather than
+   the current one, see the [363]\fmjd() function description below.)
+
+   You can check date formats with the DATE command. DATE by itself prints
+   the current date and time in standard format: yyyymmdd hh:mm:ss. DATE
+   followed by a date and/or time (including shortcuts) converts it to
+   standard format if it can understand it, otherwise it prints an error
+   message.
+
+   The following variables and functions deal with dates and times; any
+   function argument designated as "date-time" can be in any of the
+   formats described above.
+
+   \v(day)
+          The first three letters of the English word for the current day
+          of the week, e.g. "Wed".
+
+   \fday(date-time)
+          The first three letters of the English word for day of the week
+          of the given date. If a time is included, it is ignored.
+          Example: \fday(8 Feb 1988) = "Mon".
+
+   \v(nday)
+          The numeric day of the week: 0 = Sunday, 1 = Monday, ..., 6 =
+          Saturday.
+
+   \fnday(date-time)
+          The numeric day of the week for the given date. If a time is
+          included, it is ignored. Example: \fnday(8 Feb 1988) = "1".
+
+   \v(date)
+          The current date as dd mmm yyyy, e.g. "08 Feb 2000" (as in this
+          example, a leading zero is supplied for day-of-month less than
+          10).
+
+   \v(ndate)
+          The current date in numeric format: yyyymmdd, e.g. "20000208".
+
+   \v(time)
+          The current time as hh:mm:ss, e.g. "15:27:14".
+
+   \ftime(time)
+          The given free-format date and/or time (e.g. "3pm") returns the
+          time (without the date) converted to hh:mm:ss 24-hour format,
+          e.g. "15:00:00" (the date, if given, is ignored).
+
+   \v(ntime)
+          The current time as seconds since midnight, e.g. "55634".
+
+   \v(tftime)
+          The elapsed time of the most recent file-transfer operation in
+          seconds.
+
+   \v(intime)
+          The elapsed time for the most recent INPUT command to complete,
+          in milliseconds.
+
+   \fntime(time)
+          The given free-format date and/or time is converted to seconds
+          since midnight (the date, if given, is ignored). This function
+          replaces \ftod2secs(), which is now a synonym for \fntime().
+          Unlike \ftod2secs(), \fntime() allows a date to be included, and
+          it allows the time to be in free format (like 3pm), and it
+          allows the amount of time to be more than 24 hours. E.g.
+          \fntime(48:00:00) = 172800. Example of use:
+
+  set alarm \fntime(48:00:00) ; set alarm 48 hours from now.
+
+   \fn2time(seconds)
+          The given number of seconds is converted to hh:mm:ss format.
+
+   \fdate(filename)
+          Returns the modification date-time of the given file in standard
+          format: yyyymmdd hh:mm:ss.
+
+   \fcvtdate(date-time)
+          Converts a free-format date and/or time to Kermit standard
+          format: yyyymmdd hh:mm:ss. If no argument is given, returns the
+          current date-time in standard format. If a date is given but no
+          time, the converted date is returned without a time. If a time
+          is given with no date, the current date is supplied. Examples:
+
+  \fcvtdate(4 Jul 2000 2:21:17pm) = 20000704 14:21:17
+  \fcvtdate() = 20000704 14:21:17 (on 4 Jul 2000 at 2:21:17pm).
+  \fcvtd(4 Jul 2000) = 20000704
+  \fcvtd(6pm) = 20000704 18:00:00 (on 4 Jul 2000 at 6:00pm).
+
+   \fdayofyear(date-time)
+   \fdoy(date-time)
+          Converts a free-format date and/or time to yyyyddd, where ddd is
+          the 3-digit day of the year, and 1 January is Day 1. If a time
+          is included with the date, it is returned in standard format. If
+          a date is included but no time, the date is returned without a
+          time. If a time is given with no date, the time is converted and
+          the current date is supplied. If no argument is given, the
+          current date-time is returned. Synonym: \fdoy(). Examples:
+
+  \fddayofyear(4 Jul 2000 2:21:17pm) = 2000185 14:21:17
+  \fdoy() = 2000185 14:21:17 (on 4 Jul 2000 at 2:21:17pm).
+  \fdoy(4 Jul 2000) = 2000185
+  \fdoy(6pm) = 2000185 18:00:00 (on 4 Jul 2000 at 6:00pm).
+
+   Note: The yyyyddd day-of-year format is often erroneously referred to
+   as a Julian date. However, a true Julian date is a simple counting
+   number, the number of days since a certain fixed day in the past.
+   [364]See \fmjd() below.
+
+   \fdoy2date(date-time)
+          Converts a date or date-time in day-of-year format to a standard
+          format date. A yyyyddd-format date must be supplied; time is
+          optional. The given date is converted to yyyymmdd format. If a
+          time is given, it is converted to 24-hour format. Examples:
+
+  \fdoy2date(2000185) = 20000704
+  \fdoy2(2000185 3pm) = 20000704 15:00:00
+
+   \fmjd(date-time)
+          Converts free-format date and/or time to a Modified Julian Date
+          (MJD), the number of days since 17 Nov 1858 00:00:00. If a time
+          is given, it is ignored. Examples:
+
+  \fmjd(4 Jul 2000) = 50998
+  \fmjd(17 Nov 1858) = 0
+  \fmjd(16 Nov 1858) = -1
+
+   \fmjd2date(mjd)
+          Converts an MJD (integer) to standard date format, yyyymmdd:
+
+  \fmjd2(50998) = 4 Jul 1998
+  \fmjd2(0) = 17 Nov 1858
+  \fmjd2(-1) = 16 Nov 1858
+  \fmjd2(-365) = 17 Nov 1857
+
+   MJDs are normal integers and, unlike DOYs, may be added, subtracted,
+   etc, with each other or with other integers, to obtain meaningful
+   results. For example, to find out the date 212 days ago:
+
+  echo \fmjd2date(\fmjd()-212)
+
+   Constructions such as this can be used in any command where a date-time
+   is required, e.g.:
+
+  send /after:\fmjd2date(\fmjd()-212)
+
+   to send all files that are not older than 212 days (this is equivalent
+   to "send /after:-212days").
+
+   MJDs also have other regularities not exhibited by other date formats.
+   For example, \fmodulus(\fmjd(any-date),7) gives the day of the week for
+   any date (where 4=Sun, 5=Mon, ..., 3=Sat). (However, it is easier to
+   use \fnday() for this purpose, and it gives the more conventional
+   result of 0=Sun, 1=Mon, ..., 6=Sat).
+
+   Note that if MJDs are to be compared, they must be compared numerically
+   (IF <, =, >) and not lexically (IF LLT, EQUAL, LGT), whereas DOYs must
+   be compared lexically if they include a time (which contains ":"
+   characters); however, if DOYs do not include a time, they may also be
+   compared numerically.
+
+   In any case, lexical comparison of DOYs always produces the appropriate
+   result, as does numeric comparison of MJDs.
+
+   The same comments apply to sorting. Also note that DOYs are fixed
+   length, but MJDs can vary in length. However, all MJDs between 3 April
+   1886 and 30 Aug 2132 are 5 decimal digits long. (MJDs become 6 digits
+   long on 31 Aug 2132, and 7 digits long on 13 Oct 4596).
+
+1.7. Partial Completion of Keywords
+
+   Partial completion of keywords was added in C-Kermit 7.0. In prior
+   versions, if completion was attempted (by pressing the Esc or Tab key)
+   on a string that matched different keywords, you'd just get a beep. Now
+   Kermit completes up to the first character where the possibly matching
+   keywords differ and then beeps. For example:
+
+  C-Kermit> send /n<Tab>
+
+   which matches /NOT-BEFORE and /NOT-AFTER, now completes up to the dash:
+
+  C-Kermit> send /n<Tab>ot-<Beep>
+
+   Partial completion works for filenames too (as it has for some years).
+
+1.8. Command Recall
+
+   C-Kermit has had a command history buffer for some time, which could be
+   scrolled interactively using control characters or (in Kermit 95 only)
+   arrow keys. Version 7.0 adds a REDO command that allows the most recent
+   command matching a given pattern to be re-executed:
+
+   { REDO, RR, ^ } [ pattern ]
+          Search the command history list for the most recent command that
+          matches the given pattern, and if one is found, execute it
+          again.
+
+   The pattern can be a simple string (like "send"), in which case the
+   last SEND command is re-executed. Or it can contain wildcard characters
+   "*" and/or "?", which match any string and any single character,
+   respectively (note that "?" must be preceded by backslash to override
+   its normal function of giving help), and in most C-Kermit versions may
+   also include [] character lists and {} string lists (see [365]Section
+   4.9).
+
+   The match works by appending "*" to the end of the given pattern (if
+   you didn't put one there yourself). Thus "redo *oofa" becomes "redo
+   *oofa*" and therefore matches the most recent command that contains
+   "oofa" anywhere within the command. If you want to inhibit the
+   application of the trailing "*", e.g. to force matching a string at the
+   end of a command, enclose the pattern in braces:
+
+  redo {*oofa}
+
+   matches the most recent command that ends with "oofa".
+
+   REDO commands themselves are not entered into the command history list.
+   If no pattern is given, the previous (non-REDO) command is re-executed.
+   The REDOne command is reinserted at the end of the command history
+   buffer, so the command scrollback character (Ctrl-P, Ctrl-B, or
+   Uparrow) can retrieve it.
+
+   Examples:
+
+  C-Kermit> echo foo
+  foo
+  C-Kermit> show alarm
+  (no alarm set)
+  C-Kermit> echo blah
+  blah
+  C-Kermit> redo          ; Most recent command
+  blah
+  C-Kermit> redo s        ; Most recent command starting with "s"
+  (no alarm set)
+  C-Kermit> redo echo f   ; Most recent command starting with "echo f"
+  foo
+  C-Kermit> redo *foo     ; Most recent command that has "foo" in it
+  foo
+  C-Kermit> <Ctrl-P>      ; Scroll back
+  C-Kermit> echo foo      ; The REDOne command is there
+  C-Kermit> redo {*foo}   ; Most recent command that ends with "foo"
+  foo
+  C-Kermit>
+
+   Since REDO, REDIAL, and REDIRECT all start the same way, and RED is the
+   designated non-unique abbreviation for REDIAL, REDO must be spelled out
+   in full. For convenience, RR is included as an invisible easy-to-type
+   synonym for REDO. You can also use the "^" character for this:
+
+  C-Kermit> ^             ; Most recent command
+  C-Kermit> ^ s           ; Most recent command starting with "s"
+  C-Kermit> ^s            ; Ditto (space not required after "^").
+  C-Kermit> ^*foo         ; Most recent command that has "foo" in it.
+  C-Kermit> ^{*foo}       ; Most recent command ends with "foo".
+
+   Unlike the manual command-history-scrolling keys, the REDO command can
+   be used in a script, but it's not recommended (since the command to be
+   REDOne might not be found, so if the REDO command fails, you can't tell
+   whether it was because REDO failed to find the requested command, or
+   because the command was found but it failed).
+
+1.9. EXIT Messages
+
+   The EXIT and QUIT commands now accept an optional message to be
+   printed. This makes the syntax of EXIT and QUIT just like END and STOP:
+
+   { EXIT, QUIT, END, STOP } [ status-code [ message ] ]
+
+   where status-code is a number (0 indicating success, nonzero indicating
+   failure). This is handy in scripts that are never supposed to enter
+   interactive mode:
+
+  dial 7654321
+  if fail exit 1 Can't make connection - try again later.
+
+   Previously this could only be done in two steps:
+
+  dial 7654321
+  xif fail { echo Can't make connection - try again later, exit 1 }
+
+   A status code must be included in order to specify a message. In the
+   case of EXIT and QUIT, the default status code is contained in the
+   variable \v(exitstatus), and is set automatically by various events
+   (file transfer failures, etc; it can also be set explicitly with the
+   SET EXIT STATUS command). If you want to give an EXIT or QUIT command
+   with a message, but without changing the exit status from what it
+   normally would have been, use the \v(exitstatus) variable, e.g.:
+
+   exit \v(existatus) Goodbye from \v(cmdfile).
+
+   The EXIT status is returned to the system shell or whatever other
+   process invoked C-Kermit, e.g. in UNIX:
+
+  C-Kermit> exit 97 bye bye
+  bye bye
+  $ echo $?
+  97
+  $
+
+1.10. Managing Keyboard Interruptions
+
+   When C-Kermit is in command or file-transfer mode (as opposed to
+   CONNECT mode), it can be interrupted with Ctrl-C. Version 7.0 adds the
+   ability to disarm the Ctrl-C interrupt:
+
+   SET COMMAND INTERRUPT { ON, OFF }
+          COMMAND INTERRUPT is ON by default, meaning the Ctrl-C can be
+          used to interrupt a command or a file transfer in progress. Use
+          OFF to disable these interruptions, and use it with great
+          caution for obvious reasons.
+
+   SET TRANSFER INTERRUPT { ON, OFF }
+          This can be used to disable keyboard interruption of file
+          transfer when C-Kermit is in local mode, or to re-enable it
+          after it has been disabled. This applies to the X, Z, E, and
+          similar keys as well as to the system interrupt character,
+          usually Ctrl-C. This is distinct from SET TRANSFER CANCELLATION,
+          which tells whether packet mode can be exited by sending a
+          special sequence of characters.
+
+   Several other commands can be interrupted by pressing any key while
+   they are active. Version 7.0 adds the ability to disable this form of
+   interruption also:
+
+   SET INPUT CANCELLATION { ON, OFF }
+          Whether an INPUT command in progress can be interrupted by
+          pressing a key. Normally ON. Setting INPUT CANCELLATION OFF
+          makes INPUT commands uninterruptible except by Ctrl-C (unless
+          COMMAND INTERRUPTION is also OFF).
+
+   SET SLEEP CANCELLATION { ON, OFF }
+          Whether a SLEEP, PAUSE, or WAIT command in progress can be
+          interrupted by pressing a key. Normally ON. Setting SLEEP
+          CANCELLATION OFF makes these commands uninterruptible except by
+          Ctrl-C (unless COMMAND INTERRUPTION is also OFF). Synonyms: SET
+          PAUSE CANCELLATION, SET WAIT CANCELLATION.
+
+   So to make certain a script is not interruptible by the user, include
+   these commands:
+
+  SET TRANSFER INTERRUPT OFF
+  SET SLEEP CANCELLATION OFF
+  SET INPUT CANCELLATION OFF
+  SET COMMAND INTERRUPTION OFF
+
+   Make sure to turn them back on afterwards if interruption is to be
+   re-enabled.
+
+   When a PAUSE, SLEEP, WAIT, or INPUT command is interrupted from the
+   keyboard, the new variable \v(kbchar) contains a copy of the (first)
+   character that was typed and caused the interruption, provided it was
+   not the command interrupt character (usually Ctrl-C). If these commands
+   complete successfully or time out without a keyboard interruption, the
+   \v(kbchar) variable is empty.
+
+   The \v(kbchar) variable (like any other variable) can be tested with:
+
+  if defined \v(kbchar) command
+
+   The command is executed if the variable is not empty.
+
+   The \v(kbchar) variable can be reset with WAIT 0 (PAUSE 0, SLEEP 0,
+   etc).
+
+1.11. Taming The Wild Backslash -- Part Deux
+
+   [366]Using C-Kermit, 2nd Edition, contains a brief section, "Taming the
+   Wild Backslash", on page 48, which subsequent experience has shown to
+   be inadequate for Kermit users intent on writing scripts that deal with
+   Windows, DOS, and OS/2 filenames, in which backslash (\) is used as the
+   directory separator. This section fills in the blanks.
+
+1.11.1. Background
+
+   The Kermit command language shares a certain unavoidable but annoying
+   characteristic with most other command languages that are capable of
+   string replacement, namely the necessity to "quote" certain characters
+   when you want them to be taken literally. This is a consequence of the
+   facts that:
+
+    1. One or more characters must be set aside to denote replacement,
+       rather than acting as literal text.
+    2. We have only 96 printable characters to work with in ASCII, which
+       is still the only universally portable character set.
+    3. There is no single printable character that is unused everywhere.
+    4. Variables are not restricted to certain contexts, as they are in
+       formal programming languages like C and Fortran, but can appear
+       anywhere at all within a command, and therefore require special
+       syntax.
+
+   Thus there can be conflicts. To illustrate, the standard UNIX shell
+   uses dollar sign ($) to introduce variables. So the shell command:
+
+  echo $TERM
+
+   displays the value of the TERM variable, e.g. vt320. But suppose you
+   want to display a real dollar sign:
+
+  echo The price is $10.20
+
+   This causes the shell to evaluate the variable "$1", which might or
+   might not exist, and substitute its value, e.g.:
+
+  The price is 0.20
+
+   (in this case the $1 variable had no value.) This is probably not what
+   you wanted. To force the dollar sign to be taken literally, you must
+   apply a "quoting rule", such as "precede a character by backslash (\)
+   to force the shell to take the character literally":
+
+  echo The price is \$10.20
+  The price is $10.20
+
+   But now suppose you want the backslash AND the dollar sign to be taken
+   literally:
+
+  echo The price is \\$10.20
+
+   This doesn't work, since the first backslash quotes the second one,
+   thereby leaving the dollar sign unquoted again:
+
+  The price is \0.20
+
+   Quoting the dollar sign requires addition of a third backslash:
+
+  echo The price is \\\$10.20
+  The price is \$10.20
+
+   The first backslash quotes the second one, and the third backslash
+   quotes the dollar sign.
+
+   Every command language -- all UNIX shells, VMS DCL, DOS Batch, AOS/VS
+   CLI, etc etc -- has similar rules. UNIX shell rules are probably the
+   most complicated, since many printable characters -- not just one --
+   are special there: dollar sign, single quote, double quote, backslash,
+   asterisk, accent grave, number sign, ampersand, question mark,
+   parentheses, brackets, braces, etc -- practically every
+   non-alphanumeric character needs some form of quoting if it is to be
+   taken literally. And to add to the confusion, the UNIX shell offers
+   many forms of quoting, and many alternative UNIX shells are available,
+   each using slightly different syntax.
+
+1.11.2. Kermit's Quoting Rules
+
+   Kermit's basic quoting rules are simple by comparison (there are, of
+   course, additional syntax requirements for macro definitions, command
+   blocks, function calls, etc, but they are not relevant here).
+
+   The following characters are special in Kermit commands:
+
+   Backslash (\)
+          Introduces a variable, or the numeric representation of a
+          special character, or a function, or other item for
+          substitution. If the backslash is followed by a digit or by any
+          of the following characters:
+
+  x, o, d, m, s, f, v, $, %, &, :, {
+
+          this indicates a special substitution item; otherwise the
+          following character is to be taken literally (exceptions: \ at
+          end of line is taken literally; \n, \b, and \n are special items
+          in the OUTPUT command only).
+
+   Semicolon (;)
+          (Only when at the beginning of a line or preceded by at least
+          one space or tab) Introduces a comment.
+
+   Number sign (#)
+          (Only when at the beginning of a line or preceded by at least
+          one space or tab) Just like semicolon; introduces a comment.
+
+   Question mark (?)
+          (Only at the command prompt - not in command files or macros)
+          Requests context-sensitive help.
+
+   To force Kermit to take any of these characters literally, simply
+   precede it by a backslash (\).
+
+   Sounds easy! And it is, except when backslash also has a special
+   meaning to the underlying operating system, as it does in DOS, Windows,
+   and OS/2, where it serves as the directory separator in filenames such
+   as:
+
+  D:\K95\KEYMAPS\READ.ME
+
+   Using our rule, we would need to refer to this file in Kermit commands
+   as follows:
+
+  D:\\K95\\KEYMAPS\\READ.ME
+
+   But this would not be obvious to new users of Kermit software on DOS,
+   Windows, or OS/2, and it would be annoying to seasoned ones. Thus
+   MS-DOS Kermit and Kermit 95 go to rather extreme lengths to allow the
+   more natural notation, as in:
+
+  send d:\k95\keymaps\read.me
+
+   The reason this is tricky is that we also need to allow for variables
+   and other expressions introduced by backslash in the same command. For
+   example, suppose \%a is a variable whose value is "oofa" (without the
+   quotes). What does the following command do?
+
+  send d:\%a
+
+   Does it send the file named "oofa" in the current directory of the D:
+   disk, or does it send a file named "%a" in the root directory of the D:
+   disk? This is the kind of trouble we get into when we attempt to bend
+   the rules in the interest of user friendliness. (The answer is: if the
+   variable \%a has definition that is the name of an existing file, that
+   file is sent; if a file d:\%a exists, it is sent; otherwise if both
+   conditions are true, the variable takes precedence, and the literal
+   filename can be forced by quoting: \\%a.)
+
+   In Kermit 95 (but not MS-DOS Kermit), we also bend the rules another
+   way by allowing you to use forward slash (/) rather than backslash (\)
+   as the directory separator:
+
+  send d:/k95/keymaps/read.me
+
+   This looks more natural to UNIX users, and in fact is perfectly
+   acceptable to the Windows 95/98/NT and OS/2 operating systems on the
+   API level. BUT (there is always a "but") the Microsoft shell,
+   COMMAND.COM, for Windows 95/98 and NT does not allow this notation, and
+   therefore it can not be used in any Kermit command -- such as RUN --
+   that invokes the Windows command shell AND your command shell is
+   COMMAND.COM or any other shell that does not allow forward slash as
+   directory separator (some alternative shells do allow this).
+
+     NOTE: There exists a wide variety of alternative shells from third
+     parties that do not have this restriction. If you are using a shell
+     that accepts forward slash as a directory separator, you can stop
+     reading right now -- UNLESS (there is always an "unless") you want
+     your scripts to be portable to systems that have other shells. Also
+     note that some Windows shells might actually REQUIRE forward slashes
+     (instead of backslashes) as directory separators; we do not treat
+     this situation below, but the treatment is obvious -- use slash
+     rather backslash as the directory separator.
+
+1.11.3. Passing DOS Filenames from Kermit to Shell Commands
+
+   The following Kermit commands invoke the system command shell:
+
+  RUN (and its synonyms ! and @)
+  REDIRECT
+  PIPE
+
+   Each of these commands takes a shell command as an operand. These shell
+   commands are not, and can not be, parsed by Kermit since Kermit does
+   not know the syntax of shell commands, and so can't tell the difference
+   between a keyword, a filename, a variable, a switch, or other item.
+   Therefore the rules can not be bent since Kermit doesn't know where or
+   how to bend them. To illustrate (using the regular Windows shell):
+
+  run c:\\windows\\command\\chkdsk.exe
+
+   works OK, but:
+
+  run c:/windows/command/chkdsk.exe
+
+   is not accepted by COMMAND.COM. But:
+
+  run c:\windows\command\chkdsk.exe
+
+   results in Kermit applying its quoting rules before sending the text to
+   the shell. Since "w" and "c" are not in the list of backslash-item
+   codes, the backslash means "take the following character literally".
+   Thus, by the time this filename gets to the Windows shell, it has
+   become:
+
+  c:windowscommandchkdsk.exe
+
+   which is probably not what you wanted. (If "w" and "c" were in the
+   list, the results could be even stranger.) Even more confusing is the
+   case where a directory or filename starts with one or more digits:
+
+  run c:\123\lotus.exe
+
+   in which "\123" is the Kermit notation for ASCII character 123, which
+   happens to be left brace ({), resulting in "c:{lotus.exe".
+
+   So when passing filenames to a Windows shell, always use double
+   backslashes as directory separators, to ensure that the shell gets
+   single backslashes:
+
+  run c:\\windows\\command\\chkdsk.exe
+  run c:\\123\\lotus.exe
+
+   Similar problems might occur with the built-in EDIT, BROWSE, and FTP
+   commands. These commands result in Kermit building a shell command
+   internally to invoke the associated helper program; the form of this
+   command might conflict with the form demanded by certain alternative
+   shells.
+
+1.11.4. Using Variables to Hold DOS Filenames
+
+   Now to the next level. Suppose you want to write a script in which
+   filenames are parameters, and therefore are stored in variables.
+   Example:
+
+  define \%f c:\windows\command\chkdsk.exe
+  ...
+  run \%f
+
+   Obviously this won't work for the reasons just noted; the RUN command
+   requires directory separators be coded as double backslashes:
+
+  define \%f c:\\windows\\command\\chkdsk.exe
+  ...
+  run \%f
+
+   This will work; no surprises here. However, if you had used ASSIGN
+   rather than DEFINE, you might have been surprised after all; review
+   pages 348-349 of [367]Using C-Kermit (2nd Ed) for the difference
+   between DEFINE and ASSIGN.
+
+   We have said that any Kermit 95 or MS-DOS Kermit command that parses
+   filenames itself -- SEND, for example -- does not require double
+   backslashes since it knows it is parsing a filename. So since the
+   following works:
+
+  send c:\windows\command\chkdsk.exe
+
+   Should the following also work?
+
+  define \%f c:\windows\command\chkdsk.exe
+  ...
+  send \%f
+
+   Answer: No. Why? Because \%f is evaluated "recursively", to allow for
+   the possibility that its definition contains further variable
+   references. This is true of all "backslash-percent-letter" (or -digit)
+   variables, and also for array references. So \%f becomes
+   c:\windows\command\chkdsk.exe, which becomes
+   c:windowscommandchkdsk.exe.
+
+   The trick here is to use the "other" kind of variable, that is
+   evaluated only "one level deep" rather than recursively:
+
+  define filename c:\windows\command\chkdsk.exe
+  ...
+  send \m(filename)
+
+   Similarly if you want to prompt the user for a filename:
+
+  ask filename { Please type a filename: }
+   Please type a filename: c:\windows\command\chkdsk.exe
+  send \m(filename)
+
+1.11.5. Passing DOS Filenames as Parameters to Macros
+
+   Suppose you want to pass a DOS filename containing backslashes as a
+   parameter to a Kermit macro. This raises two issues:
+
+    1. Parameters to macros are "just text" and so are fully evaluated
+       before they are passed to the macro.
+    2. Once inside the macro, the formal parameters \%1, \%2, ... \%9 are
+       the type of variable that is evaluated recursively.
+
+   Thus a DOS filename is ruined once in the act of parsing the macro
+   invocation, and again when referring to it from within the macro. To
+   illustrate, suppose "test" is a macro. Then in the invocation:
+
+  test c:\mydir\blah.txt
+
+   "c:mydirblah.txt" is assigned to \%1. However, if we double the
+   backslashes:
+
+  test c:\\mydir\\blah.txt
+
+   "c:\mydir\blah.txt" is assigned to \%1. But then when you refer to \%1
+   in the macro, it is evaluated recursively, resulting in
+   "c:mydirblah.txt". To illustrate:
+
+  define test echo \%1
+  test c:\mydir\blah.txt
+  c:mydirblah.txt
+  test c:\\mydir\\blah.txt
+  c:mydirblah.txt
+  test c:\\\\mydir\\\\blah.txt
+  c:\mydir\blah.txt
+
+   Let's address each part of the problem separately. First, inside the
+   macro. You can use the \fcontents() function to force a
+   backslash-percent variable (such as a macro argument) to be evaluated
+   one level deep instead of recursively, for example:
+
+  define test echo { The filename is "\fcontents(\%1)"}
+
+  test c:\mydir\blah.txt               ; We don't expect this to work
+   The filename is "c:mydirblah.txt"   ; and it doesn't.
+  test c:\\mydir\\blah.txt             ; But this does...
+   The filename is "c:\mydir\blah.txt"
+
+   Thus if the filename arrives inside the macro with single backslashes,
+   the backslashes are preserved if you always refer to the parameter
+   through the \fcontents() function.
+
+   Now how to ensure that backslashes are not stripped or misinterpreted
+   when passing a filename to a macro? This brings us back to what we
+   learned in earlier sections:
+
+    1. If it is a literal filename, either double the backslashes, or (if
+       the filename is to be used only within Kermit itself and not passed
+       to a DOS shell, or it is to be passed to an alternative shell that
+       accepts forward slash as a directory separator), use forward slash
+       instead of backslash as the directory separator.
+    2. If it is a variable that contains a filename, make sure you use a
+       macro-style variable name, rather than a
+       backslash-percent-character name.
+
+   Examples:
+
+  define test echo \fcontents(\%1)
+  define filename c:\mydir\blah.txt
+
+  test c:\\mydir\\blah.txt  ; Literal filename with double backslashes
+  c:\mydir\blah.txt
+
+  test c:/mydir/blah.txt    ; Literal filename with forward slashes
+  c:/mydir/blah.txt
+
+  test \m(filename)         ; Variable
+  c:\mydir\blah.txt
+
+   But what if you don't like these rules and you still want to pass a
+   literal filename containing single backslashes to a macro? This is
+   possible too, but a bit tricky: turn command quoting off before
+   invoking the macro, and then turn it back on inside the macro. Example:
+
+  define test set command quoting on, echo \fcontents(\%1)
+
+  set command quoting off
+  test c:\mydir\blah.txt
+  c:\mydir\blah.txt
+
+   Upon return from the macro, command quoting is back on (since the macro
+   turned it on).
+
+   Obviously this trick can not be used if the filename is stored in a
+   variable, since it prevents the variable from being evaluated.
+
+1.11.6. Passing DOS File Names from Macro Parameters to the DOS Shell
+
+   Now suppose you need to pass a DOS filename to a macro, and the macro
+   needs to pass it, in turn, to the Windows shell via (say) Kermit's RUN
+   command. This works too:
+
+  define xrun run \fcontents(\%1)
+  xrun c:\\windows\\command\\chkdsk.exe
+
+   (or you can use the SET COMMAND QUOTING OFF / ON technique described
+   above to avoid the double backslashes.) But..
+
+  xrun c:/windows/command/chkdsk.exe
+
+   does not work if the Windows shell does not recognize "/" as a
+   directory separator. If there is a chance that a filename might be
+   passed to the macro in this form, the macro will need to convert it to
+   a form acceptable to the shell:
+
+  define xrun run \freplace(\fcontents(\%1),/,\\)
+
+   Here we replace all occurrences (if any) of "/" in the argument with
+   "\" prior to issuing the RUN command. Of course, in order to specify
+   "\" as a literal character in the \freplace() argument list, we have to
+   double it.
+
+1.11.7. Passing DOS Filenames to Kermit from the Shell
+
+   As noted in the manual, the \&@[] array contains Kermit's command-line
+   arguments. Suppose one of these arguments, say \&@[3], is a DOS
+   filename such as C:\FOO\BAR\BAZ\OOFA.TXT. (Note: In C-Kermit 7.0 and
+   K95 1.1.18 and later, command-line arguments after "=" or "--" are also
+   available in the top-level \%1..9 variables; see [368]Section 7.5.)
+
+   Of course you can eliminate any problems by using forward slashes
+   rather than backslashes in the filename, but sometimes this is not
+   possible, as when the Kermit command line is being generated by another
+   program than can only generate "native" format DOS filenames.
+
+   As noted in the manual, "\%x" variables and \&x[] arrays are always
+   evaluated "all the way" (recursively). If the contents of one of these
+   variables contains backslashes, this causes another level of
+   evaluation.
+
+   There is another kind of variable, which is evaluated only "one level
+   deep". You can use this to prevent interpretation of the backslashes in
+   the filenames. Example:
+
+  assign filename \fcontents(\&@[3])  ; Transfer contents
+  ...
+  send \m(filename)
+
+   Or, more simply:
+
+  send \fcontents(\&@[3])
+
+1.12. Debugging
+
+   The debug log is produced when you give a "log debug" command. This is
+   normally done at the request of the Kermit help desk, for forwarding to
+   the Kermit developers for analysis as a last resort in troubleshooting
+   problems. (Last resort because it can grow quite huge in a very short
+   time.) In cases where timing information is critical to understanding a
+   problem, you can tell C-Kermit to put a timestamp on each debug log
+   line by giving the command:
+
+  SET DEBUG TIMESTAMP ON
+
+   At any time before or after activating the debug log (SET DEBUG
+   TIMESTAMP OFF turns off timestamping). Timestamps can be turned off and
+   on as desired while logging. Obviously, they increase the size and
+   growth rate of the log significantly, and so should be used sparingly.
+   Timestamps are of the form hh:mm:ss.xxx, where .xxx is thousands of a
+   second (but is included only on platforms that include this feature).
+
+1.13. Logs
+
+   In UNIX C-Kermit and in K-95, you can now direct any log to a pipe.
+   This not only lets you send your logs to places other than disk files,
+   but also lets you customize them to any desired degree.
+
+   LOG { DEBUG, PACKETS, SESSION, TRANSACTION, CONNECTION } { file, pipe }
+          ...
+          A "pipe" is the name of a command, preceded by a vertical bar.
+          If the pipe contains any spaces, it must be enclosed in braces.
+
+   Here are some examples for UNIX (always remember the importance of
+   getting the UNIX shell quoting rules right):
+
+   LOG TRANSACTIONS |lpr
+          This sends the transaction log to the default UNIX printer,
+          rather than to a file (use "lp" rather than "lpr" if necessary).
+
+   LOG TRANSACTIONS {| myfilter > t.log}
+          For those who don't like the format of the transaction log, or
+          want to extract certain information from it; write your own
+          output filter.
+
+   LOG SESSION {| lpr -Plaserwriter}
+          This sends the session log to a specific UNIX printer, rather
+          than to a file. Note the braces around the pipeline. These are
+          required because it contains spaces.
+
+   LOG DEBUG {| tail -100 > debug.log}
+          This causes the debug log file to contain only the final 100
+          lines. Suppose C-Kermit crashes under some unpredictable
+          circumstances, and you need a debug log to catch it in the act.
+          But the debug log can grow to huge proportions very quickly,
+          possibly filling up the disk. Piping the debug log through
+          "tail" results in keeping only the last 100 lines (or other
+          number of your choice).
+
+   LOG DEBUG {| grep "^TELNET" > debug.log}
+          This one shows how to log only Telnet negotiations. Piping the
+          debug log through grep or egrep lets you log only specific
+          information, rather than everything. "man grep" for further
+          info.
+
+   LOG DEBUG {| gzip -c > debug.log.gz}
+          Creates a full debug log, but compressed by gzip to save space.
+
+   LOG PACKETS {| tr "\\01" "X" | cut -c9- > packet.log}
+          This one writes the regular packet log, but translates the
+          Ctrl-A that starts each packet to the letter "X" and removes the
+          s-nn-nn- notation from the beginning of each line. Note the
+          double backslash (normal Kermit quoting rules). "man tr" and
+          "man cut" for further info.
+
+   See [369]Section 2.12 for information about the new connection log.
+
+1.14. Automatic File-Transfer Packet Recognition at the Command Prompt
+
+   Beginning in version 7.0, C-Kermit can recognize Kermit (and in some
+   cases also Zmodem) file-transfer packets while at its command prompt.
+   This is convenient (for example), if you escaped back from a remote
+   Kermit program and told the local Kermit program to send a file, but
+   forgot to tell the remote Kermit program to receive it (and the local
+   Kermit did not have the "send a Kermit receive command" feature
+   available). This feature is controlled by the following command:
+
+   SET COMMAND AUTODOWNLOAD { ON, OFF }
+          When ON, which is the default, the command parser recognizes
+          Kermit packets when Kermit is in remote mode. An S packet makes
+          it go into receive mode, an I packet makes it go into server
+          mode. When OFF, packet recognition is disabled and the behavior
+          when a packet is received at the command prompt is as it was in
+          C-Kermit 6.1 and earlier (namely to print an error message).
+
+   COMMAND AUTODOWNLOAD is the command-mode equivalent of TERMINAL
+   AUTODOWNLOAD, which is effective during CONNECT mode.
+
+1.15. The TYPE Command
+
+   The TYPE command now accepts a selection of optional switches
+   ([370]Section 1.5), and also sets several variables.
+
+   Syntax: TYPE [ switches... ] filename
+
+   Variables:
+
+   \v(ty_ln)
+          Line number of current line (during TYPE command; see /PREFIX)
+
+   \v(ty_lc)
+          Line count of file most recently TYPEd.
+
+   \v(ty_mc)
+          Match count of file most recently TYPEd (see /MATCH).
+
+   Switches:
+
+   /PAGE
+          If /PAGE is included, Kermit pauses at the end of each screenful
+          and issues a "more?" prompt. You may press the space bar to view
+          the next page (screenful), or press "q" or "n" to return to the
+          C-Kermit prompt. If this switch is given, it overrides the
+          COMMAND MORE-PROMPTING setting for this command only. If it is
+          not given, paging is according to COMMAND MORE-PROMPTING.
+
+   /NOPAGE
+          Do not pause at the end of each screenful; show the whole file
+          (or all selected lines) at once. If this switch is given, it
+          overrides the COMMAND MORE-PROMPTING setting for this command
+          only. If it is not given, paging is according to COMMAND
+          MORE-PROMPTING.
+
+   /HEAD[:n]
+          Only show the first n lines of the file (where n is a number).
+          If n is omitted, 10 is used.
+
+   /TAIL[:n]
+          Only show the last n lines of the file (where n is a number). If
+          nis omitted, 10 is used. Note: /HEAD and /TAIL can't be
+          combined; if you give both switches, only the most recent one is
+          used.
+
+   /MATCH:pattern
+          Only type lines from the file that match the given pattern (see
+          [371]Section 4.9.1 for pattern notation). UNIX users familiar
+          with grep should note a significant difference: there is no
+          implied "*" at the beginning and end of the pattern. Thus:
+
+  TYPE /MATCH:foo    Lists lines whose entire contents are "foo".
+  TYPE /MATCH:foo*   Lists lines that start with "foo".
+  TYPE /MATCH:*foo   Lists lines that end with "foo".
+  TYPE /MATCH:*foo*  Lists lines that have "foo" anywhere in them.
+
+          /HEAD and /TAIL apply after /MATCH, so "type /tail:20 /match:x*"
+          shows the last 20 lines in the file that start with "x".
+
+   /PREFIX:string
+          Print the given string at the beginning of each line. The string
+          may be a constant, a variable, or a quoted variable. If it's an
+          unquoted variable, its value at the time the TYPE command was
+          given is used as a constant. If it is a quoted variable, it is
+          re-evaluated for each line; a useful variable for this context
+          is \v(ty_ln) (the line number of the current line being typed).
+          If the prefix is to include spaces, it must be enclosed in
+          braces. Examples:
+
+        type /prefix:{oofa.txt: } /match:*thing* oofa.txt
+                Prints all lines in oofa.txt that contain "thing" with the
+                filename itself as the prefix (similar to UNIX grep).
+
+        type /prefix:{\v(time). } oofa.txt
+                Prefixes each line of oofa.txt with the time at which the
+                TYPE command was given (one backslash)
+
+        type /prefix:{\\v(time). } oofa.txt
+                Prefixes each line of oofa.txt with the time at which that
+                line is being typed (two backslashes).
+
+        type /prefix:{\\v(ty_ln). } oofa.txt
+                Prefixes each line of oofa.txt with its line number.
+
+        type /prefix:{\\flpad(\\v(ty_ln),4). } oofa.txt
+                Same as the previous example, except the line number is
+                right-adjusted in a 4-column field.
+
+   /WIDTH[:n]
+          Truncates each line at column n (which must be a number) prior
+          to printing it. This option can be used for long lines when you
+          don't want them to wrap. If nis omitted, your current screen
+          width is used.
+
+   /COUNT
+          Counts lines and -- if /MATCH was included, matches -- but does
+          not print any lines from the file. The line and match count is
+          shown at the end, and the variables \v(ty_lc) and \v(ty_lm) are
+          set accordingly.
+
+   SET OPTIONS TYPE { /PAGE, /NOPAGE, /WIDTH:n }
+          Sets the paging default for TYPE commands, which can be
+          overridden in any particular TYPE command by including the
+          desired switch.
+
+   If a TYPE command is given with no switch, and no SET OPTIONS TYPE
+   selection is in effect, paging is according to your COMMAND
+   MORE-PROMPTING setting (SHOW COMMAND).
+
+1.16. The RESET Command
+
+   The RESET command, added in 7.0, closes all open files and logs, but
+   does not affect the open connection (if any).
+
+1.17. The COPY and RENAME Commands
+
+   As of C-Kermit 7.0, in the UNIX version only, the COPY and RENAME
+   commands are built in and do not call the underlying platform's COPY or
+   RENAME command. This allows them to work in "NOPUSH" versions and other
+   circumstances where it can't access system commands, and it allows file
+   copying and renaming to be done portably in scripts. The
+   characteristics of the built-in COPY or RENAME include:
+     * It fails if the source file is a directory or is wild or lacks read
+       access.
+     * It fails if the source file is the destination file.
+     * It allows the destination file to be a directory, in which case the
+       source file is copied (or renamed) into it with the same name.
+     * It overwrites an existing destination file if its permission
+       allows.
+     * It sets the new file's permission according to umask but also
+       carries forward the source file's execute permission bits if the
+       destination file did not already exist.
+     * It fails if interrupted by Ctrl-C.
+     * Upon error, it prints an appropriate message.
+     * It returns standardized error codes that can be tested by IF
+       SUCCESS / FAIL.
+
+   These commands now also accept the following switches:
+
+  /LIST (/LOG, /VERBOSE)    = Print "file1 => file2 (OK)" (or error message).
+  /NOLIST (/NOLOG, /QUIET)  = Don't print anything (except error messages).
+
+   /NOLIST is the default.
+
+   The same built-in code is used by the UNIX C-Kermit server to execute
+   REMOTE COPY commands (except in this case no switches are available).
+
+   The COPY command also accepts the following additional switches. When
+   any of these are given (and they can be used in any combination except
+   /SWAP and /APPEND), some of the checks listed above are relaxed, and
+   thus it might be possible to get into trouble in certain cases, e.g.
+   when the source and target files are the same file:
+
+  /APPEND                   = Append source file to destination file.
+  /SWAP-BYTES               = Swap bytes (see [372]Section 6.6.5).
+  /FROMB64                  = Decode the source file from Base64 encoding.
+  /TOB64                    = Encode the target file in Base64.
+
+   Base64 is the encoding commonly used for enclosures in Internet email.
+
+1.18. The MANUAL Command
+
+   The MANUAL command can be used to access the appropriate Kermit manual
+   or other manual. The general syntax is:
+
+   MANUAL [ string ]
+          If the string is omitted, C-Kermit asks the underlying system to
+          access the C-Kermit manual using whatever method is appropriate
+          for the system.
+
+   The specific action depends on the system. In UNIX, a "man" command is
+   issued; "kermit" is the default argument but other manual topics may be
+   specified. If the "man" command allows index or string searching, the
+   appropriate syntax may be included.
+
+   In Kermit 95, the MANUAL command brings up the HTML online K95 manual.
+
+   In VMS and elsewhere, "man" is simply translated to "help", with a
+   default argument of "kermit"; other and/or additional arguments may be
+   included according to the definition of the system's "help" command.
+
+   Correct operation of the "man" command in C-Kermit depends on the
+   appropriate man page or help topic having been installed in the right
+   place with the right permissions and format.
+
+1.19. String and Filename Matching Patterns
+
+   A pattern is a string that includes special notation for matching
+   classes or sequences of characters. C-Kermit 7.0 / K95 1.1.19 supports
+   patterns in several places:
+
+     * Filenames ([373]Section 4.9)
+     * SWITCH case labels ([374]Section 7.18)
+     * The new IF MATCH statement ([375]Section 7.4)
+     * TYPE /MATCH ([376]Section 1.15)
+     * SET FILE TEXT-PATTERNS and BINARY-PATTERNS ([377]Section 4.3)
+     * The \fsearch() and \farraylook() functions ([378]Sections 7.3 and
+       [379]7.10.7)
+     * The \fpattern() function used with [M,RE]INPUT ([380]Section 7.1)
+
+   Patterns are also called wildcards, especially when used for filename
+   matching. C-Kermit's pattern syntax is explained in [381]Section 4.9.1,
+   and also by the HELP WILDCARDS command.
+
+1.20. Multiple Commands on One Line
+
+   As of C-Kermit 7.0, commands can be grouped together on one line by
+   separating the commands with commas and enclosing the list in braces.
+   For example:
+
+  C-Kermit> { echo One, echo Two, echo Three }
+  C-Kermit> do { echo One, echo Two, echo Three }
+
+   Command lists can be nested:
+
+  [ do ] { echo One, echo Two, if true { echo A, echo B}, echo Three }
+
+   and the END command works as it does in macros:
+
+  [ do ] { echo One, echo Two, if true end, echo Three }
+
+   The "one line" stricture is, of course, pliant to line-continuation
+   conventions, namely that lines ending in hyphen (-) or left brace ({)
+   are to be continued. Thus the first example can also be rendered:
+
+  [ do ] {
+      echo One
+      echo Two
+      echo Three
+  }
+
+   (the "do" is optional).
+
+1.21. What Do I Have?
+
+   C-Kermit can be built for hundreds of different platforms with
+   practically countless configuration options. Certain commands might not
+   be available in certain configurations, etc. Even on the same platform,
+   different builds are possible: "maximum functionality", "minimum size",
+   "maximum performance", and so on. You can find out a lot about the
+   configuration of your C-Kermit program with the SHOW FEATURES command.
+   Of course, a lot of what it says, especially in the bottom part, might
+   seem like gibberish, but can be deciphered with a Rosetta Stone (such
+   as the C-Kermit source or the [382]ckccfg.txt file). In any case, the
+   output from SHOW FEATURES might easily explain why some expected
+   feature is missing, or some buffer is smaller than expected. Here's a
+   sample of the bottom section for the SunOS version:
+
+C-Kermit 7.0.196, 1 Jan 2000
+
+Major optional features included:
+ Network support (type SHOW NET for further info)
+ Telnet Kermit Option
+ Hardware flow control
+ External XYZMODEM protocol support
+ Latin-1 (West European) character-set translation
+ Latin-2 (East European) character-set translation
+ Cyrillic (Russian, Ukrainian, etc) character-set translation
+ Greek character-set translation
+ Hebrew character-set translation
+ Japanese character-set translation
+ Unicode character-set translation
+ Pseudoterminal control
+ REDIRECT command
+ RESEND command
+ Fullscreen file transfer display
+ Control-character unprefixing
+ Streaming
+ Autodownload
+
+Major optional features not included:
+ No Kerberos(TM) authentication
+ No SRP(TM) (Secure Remote Password) protocol
+ No Secure Sockets Layer (SSL) protocol
+ No Transport Layer Security (TLS) protocol
+ No encryption
+ No X Windows forwarding
+
+Host info:
+ Machine:    sun4m
+ Model:      (unknown)
+ OS:         SunOS
+ OS Release: 4.1.3_U1
+ OS Version: 4
+
+Target: sunos41gsc
+GCC version: 2.7.2
+Compiled Dec 31 1999 10:38:54, options:
+ __GNUC__ __STDC__ _POSIX_JOB_CONTROL _SC_JOB_CONTROL ARRAYREFLEN=1024 BIGBUFOK
+ BROWSER BSD4 CK_ANSIC CK_APC CK_AUTODL CK_CURSES CK_DNS_SRV CK_ENVIRONMENT
+ CK_FAST CK_LOGIN CK_MKDIR CK_NAWS CK_PCT_BAR CK_PERMS CK_RECALL CK_RTSCTS
+ CK_SPEED CK_TIMERS CK_TMPDIR CK_TTGWSIZ CK_TTYFD CK_WREFRESH CKEXEC
+ CKFLOAT=double CKGHNLHOST ckmaxfiles=64 CKMAXOPEN=64 CKMAXPATH=1023 CKREALPATH
+ CKREGEX CKSYSLOG CKTUNING CMDBL=32763 CMDDEP=64 CONGSPD DCMDBUF DIRENT DYNAMIC
+ FNFLOAT FORDEPTH=32 GFTIMER HADDRLIST HDBUUCP IFDEBUG IKS_OPTION IKSDB
+ IKSDCONF INBUFSIZE=32768 INPBUFSIZ=4096 MAC_MAX=16384 MACLEVEL=128 MAXDDIR=32
+ MAXDNUMS=4095 MAXGETPATH=128 MAXTAKE=54 MAXWLD=102400 MSENDMAX=1024 NETCMD
+ NETCONN NETPTY NOKVERBS NOSETBUF OBUFSIZE=32768 PARSENSE PATTERNS PIPESEND
+ RENAME RLOGCODE SAVEDUID SELECT SIG_V SOL_SOCKET sparc STREAMING sun SUNOS4
+ SYSTIMEH TCPSOCKET TIMEH TLOG TNCODE TTLEBUF TTSPDLIST UIDBUFLEN=256 UNIX
+ UNPREFIXZERO USE_LSTAT USE_MEMCPY VNAML=4096 WHATAMI XFRCAN Z_MAXCHAN=46
+ z_maxchan=46 ZXREWIND
+
+ byte order: big endian
+
+ sizeofs: int=4 long=4 short=2 char=1 char*=4 float=4 double=8
+
+ floating-point: precision=16 rounding=1
+
+   Without going into detail about what all the notation means, notice a
+   couple things:
+
+     * The Options section shows symbols ("macros") in effect during
+       compilation, together with their values (for those that have
+       values). The options are listed in alphabetical order to make any
+       particular option easier to find.
+     * MAXWLD is the maximum number of files that a wildcard can expand
+       to.
+     * Anything starting with "NO" is a feature (or something other than a
+       feature) that has been deliberately "compiled out", or omitted.
+     * Important items for script writers include: CMDBL=32763 (the size
+       of the command buffer and therefore the maximum length for a macro
+       or variable definition; CMDDEP=64 (the limit on recursion depth);
+       FORDEPTH=32 (the nesting limit on FOR loops); INBUFSIZE=32768 (the
+       size of the INPUT command circular buffer); MAC_MAX=16384 (the
+       maximum number of macros), etc.
+
+   See the [383]ckccfg.txt file for details.
+
+1.22. Generalized File Input and Output
+
+   C-Kermit 7.0 adds a new generalized I/O system for stream files,
+   augmenting (and to some extent, overlapping with) the older OPEN, READ,
+   WRITE, and CLOSE commands. In the new file i/o system, which can be
+   used simultaneously with the old one, all commands are grouped together
+   under the new FILE keyword, and some related functions and variables
+   are added.
+
+1.22.1. Why Another I/O System?
+
+   The well-known LOG, OPEN, READ, WRITE, and CLOSE commands have the
+   following restrictions:
+
+    1. Only one READ file and one WRITE file can be open at a time.
+    2. The READ and WRITE commands are strictly line oriented.
+    3. These commands can not be used with binary files.
+    4. They do not support read/write access or random access.
+    5. The syntax is a bit counterintuitive for programmers.
+
+   The new file i/o system allows multiple files to be open at once, in
+   any desired combination of modes (read/write/append) supported by the
+   operating system, for line, block (record), or character i/o, for
+   sequential or random access, using consistent syntax and conventions.
+
+   The new system, however, does not replace the old one, since the old
+   system still must be used for:
+
+    1. The session, packet, debug, transaction, and connection logs.
+    2. Reading and writing commands rather than files.
+    3. Existing scripts.
+
+   The new system works only with regular files, not with commands or
+   pipes or mailboxes or pseudoterminals. No special provisions are made
+   in the FILE commands for handling devices or network connections, nor
+   for preventing you from trying to open them; if the underlying
+   operating system treats them like regular stream disk files, the FILE
+   commands (except, of course SEEK, REWIND, and COUNT) might work with
+   them. (In C programming terms, the FILE commands are, at present,
+   nothing more than a front end to fopen() / fread() / fwrite() /
+   fclose() and friends, which are a portable API to sequential files, but
+   this might change in the future for platforms like VMS and VOS that
+   have more complicated file systems.)
+
+   Definitions:
+
+   Channel
+          A number assigned to a file when it is opened, by which it must
+          be referred to in all input/output operations.
+
+   Read/Write Pointer
+          The current position in an open file, expressed as the 0-based
+          byte count from the beginning.
+
+1.22.2. The FILE Command
+
+   FILE keyword [ switches ] channel [ data ]
+          The keyword specifies the function: FILE OPEN, FILE READ, FILE
+          WRITE, FILE CLOSE, etc. For convenience (and for familiarity to
+          C programmers), the two-word FILE commands can be shortened to
+          the single words FOPEN, FREAD, FWRITE, FCLOSE, and so on.
+          Switches are optional, and modify or amplify the requested file
+          function.
+
+   As in C, Fortran, and other programming languages, open files are
+   referred to by "channels", integers such as 0, 1, 2, 3, and so on. A
+   channel number is assigned when you open a file. The number of
+   available channels depends on the underlying operating system, and can
+   be seen in the variable:
+
+  \v(f_max)
+
+   or by giving the FILE LIST (FLIST) command. Channels are discussed in
+   greater detail in [384]Section 1.22.4.
+
+   FILE command errors can be caught with IF FAIL after the FILE command.
+   In addition, the \v(f_error) variable is set to the completion code of
+   the command: 0 if no error, or a negative number if there was an error.
+   The error codes are listed in [385]Section 1.22.5.
+
+   The command to open a file is:
+
+   FILE OPEN [ switches ] variable filename
+          Opens a file for the type of access specified by the switches,
+          or for read-only access if no switches are given. Upon success,
+          a channel number is assigned to this file and stored in the
+          given variable so you can refer to the open file in subsequent
+          i/o commands. If the file can not be opened, the FILE OPEN
+          command fails. Synonym: FOPEN.
+
+   The FILE OPEN switches are:
+
+   /READ
+          Open the file for read access. If no switches are given, /READ
+          is assumed. If the file does not exist or can't be opened for
+          read access, the FILE OPEN command fails.
+
+   /WRITE
+          Allow writing. If a file of the same name already exists, it is
+          overwritten unless /READ or /APPEND is also included. If a file
+          of the given name does not exist, it is created.
+
+   /APPEND
+          Equivalent to /WRITE, except that if the file exists, it is not
+          destroyed. The read/write pointer is set to the end of the file,
+          so unless you change it with FILE SEEK or REWIND (see below),
+          the first FILE WRITE command adds to the end of the file,
+          preserving what was there already. If /WRITE is also given, it
+          is ignored.
+
+   /BINARY
+          Open the file in "binary" mode, rather than text mode. This
+          switch is meaningless (but still can be used) in UNIX. In VMS,
+          Windows, and OS/2, it inhibits end-of-line processing and
+          conversion, and so should be used for binary files and/or files
+          that are to be accessed in record or character mode rather than
+          line by line.
+
+   The variable for the channel number can be any kind of variable: the
+   \%x kind, a macro name, or an array element. But it must be a variable,
+   not a number -- C-Kermit assigns the channel number; you can't tell it
+   what number to use.
+
+   Example:
+
+  FILE OPEN \%c oofa.txt                  ; Open oofa.txt for reading.
+  IF FAIL exit 1 Can't open oofa.txt      ; Always check to see if it worked.
+  ECHO oofa.txt: channel = \%c
+
+   If the file oofa.txt is opened successfully, a channel number is
+   assigned to the variable \%c. Here's another example using a macro name
+   for the channel number:
+
+  FILE OPEN channel oofa.txt              ; Open oofa.txt for reading.
+  IF SUCCESS ECHO oofa.txt: channel = \m(channel)
+
+   Switches can be combined when it makes sense and the underlying
+   operating system allows it. For example, to open a file in binary mode
+   for reading and writing (sometimes called "update"):
+
+  FILE OPEN /READ /WRITE /BINARY \%c budget.db
+
+   Some combinations might be allowed, others not. For example /READ
+   /APPEND will usually not be allowed. /WRITE /APPEND is treated as
+   /APPEND.
+
+   A major advantage of the new system over the older one is that you can
+   have multiple files open at once. Suppose, for example, that you want
+   to open all the files in a certain directory at once:
+
+  .\%n := \ffiles(/usr/olga*,&f)          ; Get file list into array.
+  if ( > \%n \v(f_max) ) {                ; Make sure there aren't too many.
+      exit 1 {\v(dir): \%n = Too many files}
+  }
+  declare \&c[\%n]                        ; Make array for channel numbers.
+  for \%i 1 \%n 1 {                       ; Loop to open every file...
+      file open \&c[\%i] \&f[\%i]         ; Try to open this one
+      if fail exit 1 Open error: \&f[\%i] ; Check for failure
+  }
+
+   If this loop completes successfully, the \&c[] array will contain \%n
+   channel numbers of open files in elements 1 through \%n.
+
+   Any file that you open with FILE OPEN stays open until Kermit exits, or
+   you close it explicitly. The command to close a file is:
+
+   FILE CLOSE { ALL, channel }
+          If a channel number is given and the channel refers to an open
+          file, the file is closed and the channel is freed for reuse; if
+          the channel does not refer to an open file, an error message is
+          printed and the command fails. If ALL is specified instead of a
+          specific channel, all files opened with FILE OPEN are closed and
+          if all open files were closed successfully (even if no files
+          were open), the command succeeds; if any open file could not be
+          closed, the command fails; however, all open files that could be
+          closed are still closed. Synonym: FCLOSE.
+
+   FILE CLOSE might fail because, for example, the disk filled up or a
+   quota was exceeded. Example:
+
+  fopen /write \%c new.txt                ; Open new.txt for writing.
+  if fail exit 1                          ; Check for error.
+  fclose \%c                              ; Close the file we just opened.
+
+   This creates a 0-length file called new.txt.
+
+   Note that FILE OPEN /WRITE (without /READ or /APPEND) always creates a
+   new file, and therefore destroys any file with the same name that might
+   already exist (assuming you have permission to delete it). To avoid
+   overwriting existing files, simply check first:
+
+  if exist new.txt exit 1 {Fatal - new.txt already exists}
+  fopen /write \%c new.txt
+  if fail ...
+
+   The next two commands give information about open files:
+
+   FILE STATUS channel
+          Tells the name of the file, if any, open on the given channel
+          and the switches it was opened with. The read/write pointer is
+          also shown; this is where the next read or write will occur;
+          "[EOF]" is shown if the current position in the open file is the
+          end -- i.e. the next read will fail if the file was opened in
+          /READ mode; the next write will add material to the end. The
+          current line number (0-based) is also shown if known. The FILE
+          STATUS command succeeds if the channel is open, and fails if
+          there is no open file on the given channel, or if the channel
+          number is invalid or out of range. Synonym: FSTATUS.
+
+   FILE LIST
+          Lists the channel number and name of each open file, along with
+          its OPEN modes (R, W, A, B, RW, etc) and its current read/write
+          pointer or "[EOF]" if it is at the end. Also tells the number of
+          files currently opened with FILE OPEN, plus the maximum number
+          of open files allowed by the system and the maximum number
+          allowed for FILE OPEN. Synonym: FLIST.
+
+   Next come the commands for reading and writing files:
+
+   FILE READ [ switches ] channel [ variable ]
+          Reads data from the file on the given channel number into the
+          variable, if one was given; if no variable was given, the result
+          is printed on the screen. IMPORTANT: The variable should
+          normally be a macro name rather than a \%x or \&x[] variable if
+          you want backslash characters in the file to be taken literally
+          (see pp.408-412 of [386]Using C-Kermit for an explanation; you
+          can also read into a \%x or \&x[] variable, but then you must
+          remember to protect future references to by \fcontents() if you
+          don't want C-Kermit to process any backslashes it might
+          contain). The desired amount of data (according to the switches)
+          is read from the file at the current read/write pointer, and
+          upon completion the read/write position is updated to first byte
+          after the data that was read, no matter what switches were
+          given. Synonym: FREAD.
+
+   FILE WRITE [ switches ] channel text
+          Writes the given text to the file on the given channel number.
+          The text, of course, can be literal text or a variable, or any
+          combination. If the text might contain leading or trailing
+          spaces, it must be enclosed in braces if you want to preserve
+          them. Synonym: FWRITE.
+
+   Before proceeding, a caution about the NUL character. C-Kermit is so
+   named because it is a Kermit program written in the C language. In C,
+   character strings are represented as a sequence of non-NUL bytes
+   terminated by a NUL byte (a byte in which all bits are 0). Thus a C
+   string can not contain NUL bytes; it always ends with the first NUL
+   byte. C-Kermit variables are implemented as C strings and therefore
+   can't contain NUL bytes either, so the FILE READ and FILE WRITE
+   commands do not handle files or strings that contain NUL bytes, except
+   when the /CHARACTER switch is included with the FILE READ or WRITE
+   command, or when /LPAD:0 or /RPAD:0 is given with the FILE WRITE
+   command; these switches are explained below.
+
+   Also note that Kermit can not be used read or write binary numbers in
+   the machine's internal format (integer or floating-point); in general,
+   numbers can be processed only when represented as numeric or
+   floating-point strings.
+
+   FILE READ switches are:
+
+   /LINE
+          Specifies that a line of text is to be read. A line is defined
+          according to the underlying operating system's text-file format.
+          For example, in UNIX a line is a sequence of characters up to
+          and including a linefeed, or the end of the file, which ever
+          comes first. The line terminator (if any) is removed before
+          assigning the text to the variable. If no switches are included
+          with the FILE READ command, /LINE is assumed. Normally this
+          switch should not be used with files opened in /BINARY mode (but
+          nothing prevents it either).
+
+   /SIZE:number
+          Specifies that the given number of bytes (characters) is to be
+          read. The actual number of bytes returned will be less if the
+          end of file is reached (or a NUL byte is encountered). For
+          example, if a file is 514 bytes long, FILE READ /SIZE:512
+          returns 512 bytes the first time and 2 bytes the second time.
+          FILE READ /SIZE provides a kind of "record i/o" for files that
+          do not necessarily contain lines. The resulting block of
+          characters is assigned to the variable without any editing.
+          Synonym: /BLOCK.
+
+   /CHARACTER
+          Equivalent to /SIZE:1. If FILE READ /CHAR succeeds but the
+          variable is empty, this indicates a NUL byte was read. Synonym:
+          BYTE.
+
+   FILE WRITE switches are:
+
+   /LINE
+          Specifies that an appropriate line terminator is to be added to
+          the end of the text. If no switches are included, /LINE is
+          assumed.
+
+   /SIZE:number
+          Specifies that the given number of bytes (characters) is to be
+          written. If the given text is longer than the requested size, it
+          is truncated; if is shorter, it is padded according /LPAD and
+          /RPAD switches. Synonym: /BLOCK.
+
+   /LPAD[:value]
+          If /SIZE was given, but the text is shorter than the requested
+          size, the text is padded on the left with sufficient copies of
+          the character whose ASCII value is given to write the given
+          length. If no value is specified, 32 (the code for Space) is
+          used. The value can also be 0 to write the indicated number of
+          NUL bytes. If /SIZE was not given, this switch is ignored.
+
+   /RPAD[:value]
+          Like LPAD, but pads on the right.
+
+   /CHARACTER
+          Specifies that one character should be written. If the text is
+          empty or not given, a NUL character is written; otherwise the
+          first character of text is given. Synonym: /BYTE.
+
+   /STRING
+          Specifies that the text is to be written as-is, with no
+          terminator added.
+
+   Here's an example in which we copy a text file line by line:
+
+  file open /read \%c oofa.txt            ; Open input file
+  if fail exit 1 Can't open input file    ; Check that it's open
+  file open /write \%d new.txt            ; Open output file
+  if fail exit 1 Can't open output file   ; Check
+  while true {                            ; Loop to copy lines
+      file read /line \%c line            ; Read a line
+      if fail break                       ; Assume failure = end of file
+      file write /line \%d {\m(line)}     ; Write the line to output file
+      if fail exit 1 Write failure        ; Failure here is fatal
+  }
+  file close \%c                          ; Close the two files
+  file close \%d
+
+   Note that since /LINE is the default for both FILE READ and FILE WRITE,
+   it can be omitted as in the following example, where we also use the
+   short names for the FILE commands.
+
+  fopen /read \%c oofa.txt                ; Open input file
+  if fail exit 1 Can't open input file    ; Check that it's open
+  fopen /write \%d new.txt                ; Open output file
+  if fail exit 1 Can't open output file   ; Check
+  while true {                            ; Loop to copy lines
+      fread \%c line                      ; Read a line
+      if fail break                       ; Assume failure = end of file
+      fwrite \%d {\m(line)}               ; Write the line to output file
+      if fail exit 1 Write failure        ; Failure here is fatal
+  }
+  fclose \%c                              ; Close the two files
+  fclose \%d
+
+   Here's the same example using "record i/o" (the open and close
+   sequences are are omitted since they are the same as above). The result
+   is the same, but execution is much faster:
+
+  while true {                            ; Loop to copy blocks
+      fread /size:512 \%c block           ; Read a block into \%a
+      if fail break                       ; Assume failure = end of file
+      fwrite /string \%d {\m(block)}      ; Write the block to output file
+      if fail exit 1 Write failure        ; Failure here is fatal
+  }
+
+   Although record i/o is faster, it should not be used in line-oriented
+   applications, since it returns arbitrary chunks of the file to your
+   script, rather than lines. In this example, FWRITE /STRING is used
+   rather than FWRITE /SIZE:512 to avoid the last output block being
+   padded beyond the original file's length.
+
+   A file can also be copied character by character, but this is much
+   slower than line i/o and VERY much slower than block i/o:
+
+  while true {                            ; Loop to copy blocks
+      fread /char \%c c                   ; Read a character into c
+      if fail break                       ; Assume failure = end of file
+      fwrite /char \%d {\m(c)}            ; Write character to output file
+      if fail exit 1 Write failure        ; Failure is fatal
+  }
+
+   Although character i/o is slow, it is the only way to process files
+   that contain NUL characters (i.e. bytes composed of only zero bits). In
+   the example above, when "fread /char \%c c" returns a NUL, the c
+   variable is empty. But since the FREAD /CHAR command did not fail, we
+   know the result was really a NUL. FWRITE /CHAR, when given an empty
+   variable (or no variable at all) writes a NUL. Thus the loop above will
+   copy any file at all (very slowly). In non-copying applications, NULs
+   are detected like this:
+
+  fread /char \%c c
+  if fail (do something)
+  if not def c (a NUL byte was read)
+
+   Finally some advanced file operations:
+
+   FILE FLUSH channel
+          For output files only: commits all previous writes to disk, in
+          case the computer was buffering them. Synonym: FFLUSH.
+
+   FILE COUNT [ { /BYTES, /LINES, /LIST, /NOLIST } ] channel
+          By default, or if the /BYTES switch is given, counts the bytes
+          in the file, if any, open on the given channel. If the /LINES
+          switch is given, counts lines in the file. If the /LIST switch
+          is given, the result is printed. If the /NOLIST switch is given,
+          the result is not printed. /QUIET is a synonym for /NOLIST. If
+          neither /LIST nor /NOLIST is given, the result is printed if the
+          command is given at top level, i.e. not from a command file or
+          macro. In all cases, the result of the most recent FILE COUNT
+          command is stored in the variable \v(f_count). Note that FILE
+          COUNT /LINE works (and can only work) by reading the entire
+          file; expect it to take some time if the file is large. Synonym:
+          FCOUNT.
+
+   FILE REWIND channel
+          Moves the read/write pointer to the beginning of the file.
+          Equivalent to FILE SEEK channel 0. Synonym: FREWIND.
+
+   FILE SEEK [ switches ] channel { [{+,-}]number, LAST, EOF }
+          Moves the read/write pointer for the file on this channel to the
+          given position, which may be a byte (character) number or a line
+          number, expressed in either absolute or relative terms.
+          Switches:
+
+        /BYTE
+                The number given is a byte number. Synonym: /CHARACTER.
+
+        /LINE
+                The number given is a line number.
+
+        /ABSOLUTE
+                The number given is absolute.
+
+        /RELATIVE
+                The number given is relative to the current position.
+
+          By default, or if the /BYTE switch is given, the number is a
+          byte number (0 = first byte). If /LINE is given, the number is a
+          line number (0 = first line). EOF means to move to the end of
+          the file. LAST means to move to the last line or character of
+          the file, depending on whether it's a line or character seek.
+
+          If neither the /RELATIVE nor the /ABSOLUTE switch is given, then
+          if a signed number is given, the motion is relative to the
+          current position. An expression that evaluates to a negative
+          number is not considered signed for this purpose; that is, a
+          sign (+ or -) must be included as the first character of the
+          number in the command itself to force a relative seek (in the
+          absence of /RELATIVE or /ABSOLUTE).
+
+          If the number has no sign, or if the /ABSOLUTE switch is given,
+          the number represents an absolute position (relative to the
+          beginning of the file). Subsequent FILE READs or WRITEs will
+          take place at the new position.
+
+          If the read/write pointer is placed after the end of the file, a
+          subsequent FILE READ will fail, but a FILE WRITE will succeed
+          (possibly creating a file with "holes"). If a FILE SEEK /BYTE
+          command is given, the current line becomes unknown (unless the
+          position is 0) and subsequent FILE SEEK /RELATIVE /LINE commands
+          will fail until the next non-relative FILE SEEK /LINE command is
+          given. Synonym: FSEEK.
+
+   An absolute FILE SEEK to a negative position fails silently, as does a
+   relative seek to a position before the beginning of the file.
+
+   A caution about relative SEEKs: remember that the number is relative to
+   the current position. Whenever you read or write, this changes the
+   position. In each of the following examples, assume the file open on
+   channel \%c is positioned at line n (the FREAD target variable is
+   omitted for lack of space):
+
+  { FREAD \%c, FSEEK /LINE \%c -1, FREAD \%c }  <-- Reads line n twice
+  { FREAD \%c, FSEEK /LINE \%c +0, FREAD \%c }  <-- Reads lines n and n+1
+  { FREAD \%c, FSEEK /LINE \%c +1, FREAD \%c }  <-- Reads lines n and n+2
+  { FREAD \%c, FSEEK /LINE \%c -2, FREAD \%c }  <-- Reads lines n and n-1
+  { FREAD \%c, FSEEK /LINE \%c -3, FREAD \%c }  <-- Reads lines n and n-2
+
+   Another caution: Using FSEEK and FREAD /SIZE to repeatedly read the
+   same disk block (e.g. when sampling a database record that is
+   frequently updated) might not give you updated disk blocks due to the
+   internal buffering and caching of the C library (this probably varies
+   from one platform/compiler combination to another). If necessary you
+   can force a fresh disk read with a close/open sequence:
+
+  FCLOS \%c
+  FOPEN \%c samefilename
+  FSEEK \%c samespot
+  FREAD /SIZE:howmanybytes \%c variable
+
+1.22.3. FILE Command Examples
+
+   To read the last 10 lines of a text file into an array:
+
+  fopen /read \%c oofa.txt                ; Open the file
+  if fail exit 1 Can't open oofa.txt      ; Always check for failure
+  dcl \&a[10]                             ; Declare a 10-element array
+  fcount /line \%c                        ; Count lines in the file
+  fseek /line \%c \v(f_count)-10          ; Seek to 10 lines from the end
+  if fail exit 1 Can't seek               ; Check for failure
+  for \%i 1 10 1 { fread \%c \&a[\%i] }   ; Read the last 10 lines
+  fclose \%c                              ; Close the file
+
+   Note that blank lines show up as empty (undefined) array elements, for
+   example if you give a "show array a" command at this point. This is
+   normal. You can still use these elements; e.g.:
+
+  for \%i 1 10 1 { echo \%i. \&a[\%i] }   ; Display the 10 lines
+
+   Here is how to read the last line of a file (already open on channel
+   \%c):
+
+  fseek /line \%c last                    ; Seek directly to last line
+
+   Alternatively:
+
+  fseek /line \%c eof                     ; Seek to end of file
+  fseek /line \%c -1                      ; Seek to beginning of last line
+
+   Alternatively:
+
+  fcount /line \%c                        ; Count the file's lines
+  fseek /line \%c \v(f_count)-1           ; Seek to last line
+  fread \%c                               ; Read it
+
+   To read every other line from the file (using relative SEEK), skipping
+   the first line:
+
+  fopen /read \%c oofa.txt                ; Open the file
+  while ( success ) {                     ; Loop through lines
+      fseek /line \%c +1                  ; Skip a line
+      if success fread \%c                ; Read & display a line
+  }
+  fclose \%c                              ; Close the file
+
+   Here is how to read the lines of a file in reverse order:
+
+  fopen /read \%c oofa.txt                ; Open
+  if fail exit 1                          ; Check
+  fseek /line \%c last                    ; Seek to last line
+  while success {                         ; Loop
+      fread \%c                           ; Read line
+      fseek /line \%c -2                  ; Seek backwards two lines
+  }
+  fclose \%c                              ; Close the file
+
+   The loop works because a relative SEEK outside the file fails.
+
+   It is also possible to use block i/o to manage random-access files with
+   fixed-length records (as long as they don't contain NUL characters).
+   Suppose, for example, you have a file of "card image" records with
+   fixed-field information about customers, such as:
+
+  Name:     Columns  1-32  (column numbers are 1-based)
+  Address:  Columns 33-72
+  Balance:  Columns 73-80
+
+   The records are indexed by customer number, starting with 0. There are
+   no line terminators separating them. Therefore the record for customer
+   number n starts at position nx 80 (\%n*80).
+
+   Now suppose we received a payment from customer number 173 and want to
+   update the balance:
+
+  .\%n = 173                               ; Customer (record) number
+  .\%a = 12.72                             ; Amount
+  fopen /read /write \%c customer.db       ; Open the file
+  if fail stop 1 OPEN FAILED: \f_errmsg()  ; Check
+  fseek /byte \%c 80*\%n                   ; Seek to record
+  fread /size:80 \%c r                     ; Read the record
+  if fail stop 1 READ FAILED: \f_errmsg()  ; Check (IMPORTANT)
+  .\%b := \fright(\m(r),8)                 ; Extract the balance
+  .\%b := \ffpadd(\%b,\%a,2)               ; Add the new payment
+  if fail stop 1 ARITHMETIC ERROR: \%b/\%a ; Catch bad records
+  .r := {\fleft(\m(r),72)\flpad(\%b,8)}    ; Update the record
+  fseek /byte \%c 80*\%n                   ; Reposition to same spot
+  fwrite /size:80 \%c {\m(r)}              ; Replace the record
+  if fail stop 1 WRITE FAILED: \f_errmsg() ; Check
+  fclose \%c                               ; Close the file
+
+   REMEMBER: Using FILE SEEK to move beyond the end of file can result in
+   a file with holes when writing; when reading, an end-of-file error will
+   occur -- be sure to check for it.
+
+1.22.4. Channel Numbers
+
+   C-Kermit's channel numbers are integers from 0 to some
+   platform-dependent limit, such as 46 or 1985 (the value of \v(f_max)).
+   This is the limit placed by the operating system on the number of files
+   that may be opened by one process or user or job, minus the standard
+   input, output, and error files, and minus the number of files reserved
+   by C-Kermit for logs, OPEN READ and WRITE, and file transfer (and maybe
+   some command files -- the \v(f_max) number can't be exact).
+
+   Although you must include a variable in the FILE OPEN command, to which
+   the channel number is assigned, you don't have to use a variable in the
+   other FILE commands if you know what the number is -- you can just put
+   the number. This saves you a few keystrokes when typing commands at the
+   prompt:
+
+  fopen \%c oofa.txt
+  flist
+  0. /usr/olga.oofa.txt (R) 0
+
+   This tells the channel number is 0 (the number on the left is the
+   channel file's channel number). Of course you can also find it by
+   echoing the variable:
+
+  echo \%c
+  0
+
+   Or with "fstatus \%c". Now you can type commands like:
+
+  fread 0
+
+   to read a line from the file. Obviously, however, using digits rather
+   than a variable for the channel number would be poor practice in a
+   script.
+
+   If in commands like:
+
+  fread \%c \%a
+
+   you have trouble remembering which variable is which, note that the
+   channel number is, indeed, a number. Anywhere C-Kermit accepts a number
+   it can also accept an expression, so you can put parentheses around the
+   channel number to remind you it's the channel number and not the
+   variable into which data is to be read:
+
+  fread (\%c) \%a
+
+   Normally channel numbers are assigned sequentially as 0, 1, 2, ... up
+   to the limit. However, once you start closing files, there can be holes
+   in the sequence. New channels are assigned to fill in the holes. Thus
+   you can't depend on channel numbers being in any particular sequence.
+
+1.22.5. FILE Command Errors
+
+   Each FILE command sets the variable \v(f_error) to one of the following
+   values:
+
+    0 = No error
+   -1 = System error
+   -2 = Attempt to read after end of file
+   -3 = Channel not open
+   -4 = Channel number out of range (negative or too large)
+   -5 = Numeric argument (size, ...) out of range
+   -6 = File not found
+   -7 = Bad or missing filename
+   -8 = Too many files are already open (FILE OPEN only)
+   -9 = Forbidden operation (e.g. write to a read-only file)
+  -10 = Access denied
+  -11 = Illegal combination of OPEN modes (FILE OPEN only)
+  -12 = Buffer overflow
+  -13 = Current line number unknown (for relative line seeks)
+  -14 through -98: Reserved.
+  -99 = Requested operation not implemented in this version of C-Kermit
+ -999 = Unknown error
+
+   When \v(f_error) is -1, this means the FILE command failed because
+   because of a system error, in which case you can examine the following
+   variables:
+
+  \v(errno)     = System error number.
+  \v(errstring) = Error message corresponding to \v(errno).
+
+   A special function is available for translating the \v(f_error) code to
+   an error message string:
+
+\f_errmsg([code])
+  If the code is -1, returns error message of the most recent system
+  error; otherwise if the code is a valid \v(f_error) value, the associated
+  message is returned.  If the code is omitted, the status message
+  corresponding to the current \v(f_error) value is returned.
+
+   A FILE command that fails prints the appropriate error message
+   automatically, except when the command is READ or SEEK and the error is
+   -2 (end of file); in that case, the command still fails, but does not
+   print a message. This allows constructions such as:
+
+  fopen \%c oofa.txt
+  while success { fread \%c }
+  fclose \%c
+
+   to work as expected, i.e. without an annoying message when the end of
+   file is reached.
+
+1.22.6. File I/O Variables
+
+   The variables associated with the file i/o package are:
+
+   \v(f_count)
+          Result of the most recent FILE COUNT (FCOUNT) command.
+
+   \v(f_error)
+          Numeric error code of most recent FILE command (0 = no error).
+
+   \v(f_max)
+          Maximum number of files open simultaneously.
+
+1.22.7. File I/O Functions
+
+   Some of the FILE commands can also be issued as function calls, which
+   makes script writing a bit more convenient, especially for C
+   programmers. Also, several functions are provided that do not have
+   command equivalents. Each of these functions takes a channel number as
+   the first argument. These functions do not work for OPEN { READ, !READ,
+   WRITE, !WRITE, and APPEND } files.
+
+   \f_status(channel)
+          Returns 0 if the channel is not open, otherwise a number between
+          1 and 15 which is the sum of the OPEN modes:
+
+  1 = /READ
+  2 = /WRITE
+  4 = /APPEND
+  8 = /BINARY
+
+   The remaining functions work only for open channels. Each of these
+   functions can fail for the applicable reasons listed in [387]Section
+   1.22.5. For instructions on handling function errors, see [388]Section
+   7.12.
+
+   \f_pos(channel)
+          Returns the file's current read/write pointer (0-based). There
+          is no FILE command equivalent.
+
+   \f_line(channel)
+          Returns the file's current line number (0-based), if known,
+          otherwise -1. There is no FILE command equivalent. The line
+          number is known as long as no character or block i/o has been
+          done on the channel.
+
+   \f_handle(channel)
+          Returns the "file handle" of the file. That is, it translates
+          the portable C-Kermit channel number into a system-specific file
+          handle or number that can be passed to other programs on the
+          same platform. In UNIX this is a file descriptor. There is no
+          FILE command equivalent.
+
+   \f_eof(channel)
+          Returns 1 if the read/write pointer of the file on the given
+          channel is at the end of the file, 0 otherwise. Convenient in
+          WHILE statements, e.g.:
+
+    while not \f_eof(\%c) { fread \%c }
+
+   \f_getchar(channel)
+          Equivalent to FREAD /CHAR. Returns the character actually read.
+          If \f_getchar() does not fail but the return value is empty,
+          this means a NULL character was read.
+
+   \f_getline(channel)
+          Equivalent to FREAD /LINE. Returns the line actually read, but
+          with the line terminator stripped. If \f_getline() does not fail
+          but the return value is empty, this normally means an empty line
+          was read.
+
+   \f_getblock(channel,n)
+          Equivalent to FREAD /SIZE:n. Returns the block of characters
+          actually read. If the returned block is smaller than n, it
+          indicates either that the end of file was reached or a NUL
+          character is in the block.
+
+   \f_putchar(channel,c)
+          Equivalent to FWRITE /CHARACTER. Writes the character c. If c
+          contains more than one character, only the first is written. If
+          c is empty a NUL is written. Returns the number of characters
+          written on success, or a negative error code upon failure.
+
+   \f_putline(channel,string)
+          Equivalent to FWRITE /LINE. Writes the string and adds the
+          appropriate line termination character or sequence. If the
+          string is empty or omitted, an empty line is written. Returns
+          the number of characters written on success, or a negative error
+          code upon failure.
+
+   \f_putblock(channel,string)
+          Equivalent to FWRITE /STRING. Writes the string as given. If the
+          string is empty or omitted, nothing is written. Returns the
+          number of characters written on success, or a negative error
+          code upon failure.
+
+1.22.8. File I/O Function Examples
+
+  fopen /read \%c oofa.txt            ; Open our favorite file for reading
+  if failure exit 1                   ; Check that it's open
+  while not \f_eof(\%c) {             ; Loop until EOF
+      .line := \f_getline(\%c)        ; Get a line
+      if success echo {\m(line)}      ; Echo it
+  }
+  if not \f_eof(\%c) {                ; Check reason for loop exit
+      exit 1 File Error: \f_errmsg()  ; If not EOF say so.
+  }
+
+  frewind \%c                         ; Rewind the file
+  while not \f_eof(\%c) {             ; Same thing but with block i/o
+      .block := \f_getblock(\%c,256)  ; (much faster than line i/o)
+      if success xecho {\m(block)}
+  }
+
+  frewind \%c                         ; Rewind again
+  while not \f_eof(\%c) {             ; Same deal but with character i/o
+      .c := \f_getchar(\%c)           ; (much slower than line i/o)
+      if success xecho {\m(c)}
+  }
+  close \%c
+
+   To close all open files (equivalent to FCLOSE ALL):
+
+  for \%i 0 \v(f_max)-1 1 {
+      if \f_status(\%i) fclose \%i
+  }
+
+1.23. The EXEC Command
+
+   The EXEC command is available only in UNIX.
+
+   EXEC [ /REDIRECT ] command [ arg1 [ arg2 [ ... ] ]
+          Runs the given command with the arguments in such a way that the
+          command replaces C-Kermit in memory, and C-Kermit ceases to
+          execute. EXEC is like RUN, except instead of returning to
+          C-Kermit when finished, the command returns to whatever process
+          invoked Kermit.
+
+   In the normal case, no files are closed, so the EXEC'd command inherits
+   the open files, read/write pointers, working directory, process ID,
+   user ID (unless command is SUID), group ID (unless command is SGID),
+   groups, etc. (In UNIX, the EXEC command is simply a front end for
+   execvp().)
+
+   If the /REDIRECT switch is included, then if a connection is open (SET
+   LINE or SET HOST), it becomes the standard input and output of the
+   EXEC'd program. If no connection is open, the /REDIRECT switch has no
+   effect. For example to use C-Kermit for PPP dialing in Linux:
+
+  set modem type usr          ; Specify the kind of modem you have
+  set line /dev/ttyS1         ; Specify the device it's connected to
+  set speed 57600             ; and the speed
+  set flow rts/cts            ; and flow control.
+  set dial retries 100        ; Try the dial sequence up to 100 times.
+  dial {{9-212-555-1212}{9-212-555-1213}{9-212-555-1214}{9-212-555-1215}}
+  if fail exit 1
+  for \%i 1 16 1 {            ; Try up to 16 times to get login prompt
+      input 10 Login:         ; Wait 10 sec for it to appear
+      if success break        ; Got it - proceed...
+      output \13              ; Send a carriage return and try again
+  }
+  if ( > \%i 16 ) stop 1 NO LOGIN PROMPT
+  lineout \(myuserid)         ; Send user ID
+  input 30 assword:           ; Wait for Password prompt
+  if fail stop 1 NO PASSWORD PROMPT
+  lineout \m(mypassword)      ; Send the password.
+  exec /redirect pppd         ; Replace ourselves with pppd.
+
+   In this example we assume that the script has already set up the
+   myuserid and mypassword variables -- normally the password should be
+   prompted for, rather than stored on disk. Notice the advantages over
+   the well-known "chat script":
+     * You don't have to control the modem itself with AT commands;
+       Kermit's DIAL command does this for you.
+     * You can have Kermit automatically redial as many times as you want
+       until it gets a connection (if this is legal in your country).
+     * You can have Kermit fetch the number or numbers from a dialing
+       directory.
+     * You can have Kermit cycle through a list of phone numbers (this is
+       new in C-Kermit 7.0; see [389]Section 2.1.16) without having to
+       enter the numbers in a dialing directory.
+     * Dialing is location-independent; you can use the same script to
+       dial from different areas or countries.
+     * Once the connection is made, the full power of Kermit's script
+       language is available to manage the dialog with the terminal server
+       or other device that answers the phone call.
+
+   NOTE: PPP and SLIP dialing are not available in Windows 95/98/NT/2000,
+   whose APIs do not provide a method for an application to hand over a
+   connection to the PPP or SLIP driver.
+
+1.24. Getting Keyword Lists with '?'
+
+   Suppose you type "te" at the C-Kermit> 6.0 prompt and then Esc or Tab
+   to request keyword completion. Kermit beeps, indicating that more than
+   one command starts with "te". But if you type '?' to see what they are,
+   Kermit shows only "telnet". So why the beep? Because of invisible
+   keywords like "telopt", "terminal", and "text". Lots of keywords are
+   invisible because they are either synonyms for other keywords or else
+   esoteric options to be used only in special circumstances, so we don't
+   want them cluttering up the menus.
+
+   But then there is no way for you to discover them. So in C-Kermit 7.0,
+   if you type '?' AFTER the beginning of a keyword field, then invisible
+   keywords are shown too:
+
+  C-Kermit> te<Esc><BEEP>
+  C-Kermit> te? Command, one of the following:
+   telnet    telopt    terminal  text
+  C-Kermit>te
+
+   But if '?' is typed at the beginning of a field, only visible keywords
+   are shown, as before (so, in this example, if '?' is typed at the
+   C-Kermit> prompt, "telnet" is the only command shown that starts with
+   "te").
+
+2. MAKING AND USING CONNECTIONS The SET LINE, SET HOST, and SET PORT (a
+synonym for SET LINE) commands have new synonyms, in which the word SET is
+replaced by the word OPEN: OPEN LINE, etc. There is no new functionality
+here, but OPEN is a better verb, since SET generally takes no action, whereas
+these commands actually try to open a connection. Furthermore, there is the
+symmetry with CLOSE. 2.0. SET LINE and SET HOST Command SwitchesThe SET LINE
+(SET PORT) and SET HOST commands now allow switches before the device or host
+name, in most cases, and under certain circumstances, also at the end. The
+new syntax is backwards compatible with the previous syntax; thus SET LINE,
+SET PORT, and SET HOST commands in command files written for C-Kermit 6.0 or
+earlier still work. The expanded syntax is:
+
+{ OPEN, SET } { LINE, PORT, HOST } [ switches ] device-or-address [ switches
+]
+
+The first group of switches is:
+
+   /NETWORK-TYPE:{TCP/IP,X.25,PIPE,PTY...}
+          When more than one network type is available, this lets you
+          specify the type of network to use for this connection without
+          affecting your global SET NETWORK TYPE. See [390]Section 2.7
+          about pipes and ptys.
+
+   /USERID:[string]
+          This switch is equivalent to SET LOGIN USERID. If a string is
+          given, it sent to host during Telnet negotiations; if this
+          switch is given but the string is omitted, no user ID is sent to
+          the host. If this switch is not given, your current LOGIN USERID
+          (\v(userid) value), if any, is sent. Unlike most other switches,
+          this one is "sticky", since the value must persist throughout
+          the session in case the server requests the ID string at a later
+          time.
+
+   /CONNECT
+          Enter CONNECT mode immediately and automatically after the
+          device or connection is open. On serial devices, however, when
+          CARRIER-WATCH is not OFF, wait up to 1 second for the Carrier
+          Detect signal to appear before trying to connect, to give the
+          device time to react DTR, which might have been off prior to
+          opening the device.
+
+   /SERVER
+          Enter server mode immediately and automatically after the device
+          or connection is open. Treatment of carrier is the same as for
+          /CONNECT.
+
+   /WAIT
+   /NOWAIT
+          For Telnet connections only: Like SET TELNET WAIT { ON, OFF },
+          but applies only to this connection, and in fact applies only
+          when OPENing this connection (which is usually the only place it
+          matters). Typically you would use TELNET /NOWAIT to make a
+          connection to a misbehaving Telnet server that does not reply to
+          negotiations as required by the Telnet protocol definition.
+
+   Note: /CONNECT and /SERVER switches are not available in the RLOGIN and
+   TELNET commands, since these commands already include an implicit
+   /CONNECT and preclude automatic entry into server mode.
+
+   The /CONNECT and /SERVER switches are especially useful with "set host
+   *" connections. For example, suppose you want to start a Kermit server
+   on socket 3000 of your TCP host. Normally you would have to give the
+   command:
+
+  set host * 3000
+
+   and then wait for a connection to come in, and only then could you give
+   the SERVER command (or else define a macro to do this, and then execute
+   the macro). Now you can do it in one step:
+
+  set host /server * 3000
+
+   This tells C-Kermit to wait for the connection and then enter server
+   mode once it comes in, no matter how long it takes. Similarly, "set
+   host /conn *" can be used to wait for a "chat" connection to come in.
+
+   Another set of switches is available in VMS only, for use only with SET
+   LINE:
+
+   /SHARE
+          Allows the SET LINE device to be opened in shared mode. Normally
+          it makes no sense to open a serial device in shared mode, but
+          it's necessary when C-Kermit is running in an environment such
+          as DECIntact, that opens your job's controlling terminal in such
+          a way that C-Kermit can't open it too, unless it enables SHARE
+          privilege. Note: SHARE privilege is required.
+
+   /NOSHARE
+          Requires that the SET LINE device not be in use by any other
+          process in order for it to be successfully opened by C-Kermit.
+          If neither /SHARE nor /NOSHARE is specified, /NOSHARE is used.
+
+   The second group of switches is:
+
+   /NO-TELNET-INIT
+          Do not send initial Telnet negotiations even if this is a Telnet
+          port.
+
+   /RAW-SOCKET
+          This is a connection to a raw TCP socket ([391]Section 2.3.5).
+
+   /RLOGIN
+          Use Rlogin protocol even if this is not an Rlogin port.
+
+   /TELNET
+          Send initial Telnet negotiations even if this is not a Telnet
+          port.
+
+   As of C-Kermit 7.0 and K95 1.1.19, the TELNET command includes an
+   implicit /TELNET switch. So if you TELNET to a non-TELNET port, Kermit
+   sends initial Telnet negotiations. This makes sense, since that's what
+   "telnet" means.
+
+   If you want to make a connection to a non-Telnet port without sending
+   initial Telnet negotiations, use:
+
+  set host [ /connect ] name-or-address port
+
+   or:
+
+  telnet name-or-address port /no-telnet-init
+
+   Additional switches might be added in the future; type "set host ?" or
+   "set line ?" to see a current list.
+
+2.1. Dialing
+
+   Automatic redialing is illegal or restricted in many countries, so
+   until C-Kermit 7.0, it was disabled by default, i.e. until a SET DIAL
+   RETRIES command was given. In C-Kermit 7.0, if no SET DIAL RETRIES
+   command has been given, a default is picked dynamically at DIAL time
+   based on the calling country code, if known. At this writing, the only
+   country code known to have no restrictions on automatic redialing is 1.
+   So in this case a limit of 10 is chosen; otherwise 1. If you have not
+   given an explicit SET DIAL RETRIES command, SHOW DIAL shows the value
+   as "(auto)", and then the value actually used is shown when you give
+   the DIAL command.
+
+   As of C-Kermit 7.0, automatic redialing is automatically canceled if
+   the call could not be placed because no dialtone was detected.
+
+2.1.1. The Dial Result Message
+
+   If DIAL DISPLAY is not ON, the "Call complete" message now shows the
+   modem's call result message, for example:
+
+  Dialing: ...
+  Call complete: "CONNECT 31200/ARQ/V32/LAPM/V42BIS"
+
+   The exact format and contents of this message, of course, depends on
+   the make, model, and configuration of your modem, so use your modem
+   manual to interpret it. The call result message is also available in
+   C-Kermit's \v(dialresult) variable.
+
+  C-Kermit> echo \v(dialresult)
+  CONNECT 31200/ARQ/V32/LAPM/V42BIS
+  C-Kermit> echo Speed = \fword(\v(dialresult),2)
+  Speed = 31200
+  C-Kermit>
+
+   Suppose your modem reports the modulation speed as shown above and you
+   want to ensure your call is completed at (say) 24000 bps or more. You
+   can use a little macro to do the job:
+
+define HSDIAL {                ; High Speed DIAL
+    local \%s
+    if < \v(argc) 1 if not def \v(dialnumber) end 1 Usage: \%0 number
+    set dial retries 100
+    set dial interval 1
+    while true {
+        dial \%*
+        if fail end 1 DIAL failed.
+        asg \%s \fword(\v(dialresult),2)
+        if def \%s if numeric \%s if not < \%s 24000 break
+    }
+}
+
+   (See [392]Section 7.5 about the \%* variable.)
+
+2.1.2. Long-Distance Dialing Changes
+
+   Due to the glut of cell phones, pagers, fax machines, ISPs, etc, area
+   codes and dialing rules are changing all the time. In the North
+   American Numbering Plan (NANP) countries (USA, Canada, etc), area codes
+   are split or overlayed with increasing frequency, and 10- and 11-digit
+   dialing is gradually becoming the norm for local calls. Changes are
+   occurring In Europe, too, partly for these reasons and partly because
+   of some new EC rules.
+
+   In France, effective 18 October 1996, all calls, even local ones, must
+   be dialed with an area code. French area codes are presently 1-digit
+   numbers, 1-6, and the long-distance dialing prefix is 0. All calls
+   within France are considered long distance and begin with 01, 02, ...,
+   06.
+
+   Effective 1 May 1997, all calls within the US state of Maryland, even
+   local ones, must be dialed with an area code but without the
+   long-distance prefix -- this is the now widely-known North American
+   phenomenon of "ten digit dialing". The same is happening elsewhere --
+   many cities in Florida adopted 10-digit dialing in 1998.
+
+   In Italy beginning 19 June 1998, all calls to fixed (as opposed to
+   mobile) numbers must be prefixed by 0. When calling into Italy from
+   outside, the 0 must follow the country code (39). Calls to cell phones,
+   however, must be placed without the 0. Then on 29 December 2000, the 0
+   will become a 4 (for calling fixed numbers) and a prefix of 3 must used
+   for calling mobile phones. More info at:
+   http://www.telecomitalia.it/npnn/.
+
+   In Spain, effective 4 April 1998, with hard cutover on 18 July 1998,
+   all calls within the country must be dialed with 9 digits, and all
+   calls from outside Spain must also be dialed with 9 digits (after the
+   country code, 34). The new 9-digit numbers all begin with "9". More
+   info at: [393]http://www.telefonica.es/cambiodenumeracion/
+
+   Several new dialing features and commands have been added in version
+   6.1 and 7.0 to address these changes.
+
+   C-Kermit 6.0 and Kermit 95 1.1.11 and earlier handle the French
+   situation via a reasonable subterfuge (setting the local area code to a
+   nonexistent one), but did not handle "ten-digit dialing" well at all;
+   the recommended technique was to change the long-distance dialing
+   prefix to nothing, but this defeated Kermit's "list numbers for one
+   name" feature when the numbers were in different locations. For
+   example:
+
+  set dial ld-prefix
+  dial onlineservice
+
+   where "onlineservice" is a dialing directory entry name corresponding
+   to entries that are in (say) Maryland as well as other states, would
+   not correctly dial the numbers not in Maryland.
+
+   A new command lets you specify a list of area codes to be considered
+   local, except that the area code must be dialed:
+
+   SET DIAL LC-AREA-CODES [ areacode [ areacode [ areacode [ ... ] ] ] ]
+          The list may include up to 32 area codes. If a number is called
+          whose area code is in this list, it is dialed WITHOUT the
+          long-distance prefix, but WITH the area code.
+
+   So in Maryland, which (last time we looked) has two area codes, 410 and
+   301, the setup would be:
+
+  SET DIAL LC-AREA-CODES 410 301
+
+   Example:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL AREA-CODE 301
+  SET DIAL LC-AREA-CODES 410 301 <-- Area codes in 10-digit dialing region
+  DIAL +1 (301) 765-4321         <-- Dials 3017654321  (local with area code)
+  DIAL +1 (410) 765-4321         <-- Dials 4107654321  (local with area code)
+  DIAL +1 (212) 765-4321         <-- Dials 12127654321 (long distance)
+
+   The SET DIAL LC-AREA-CODES command does not replace the SET DIAL
+   AREA-CODE command. The latter specifies the area code you are dialing
+   from. If the called number is in the same area code, then the area code
+   is dialed if it is also in the LC-AREA-CODES list, and it is not dialed
+   otherwise. So if "301" had not appeared in the LC-AREA-CODES list in
+   the previous example:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL AREA-CODE 301
+  SET DIAL LC-AREA-CODES 410     <-- Area codes in 10-digit dialing region
+  DIAL +1 (301) 765-4321         <-- Dials 7654321     (local)
+  DIAL +1 (410) 765-4321         <-- Dials 4107654321  (local with area code)
+  DIAL +1 (212) 765-4321         <-- Dials 12127654321 (long distance)
+
+   The new Kermit versions also add a Local Call Prefix and Local Call
+   Suffix, in case you have any need for it. These are added to the
+   beginning and of local phone numbers (i.e. numbers that are not
+   long-distance or international). Examples:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL LC-PREFIX 9
+  SET DIAL LC-SUFFIX *
+  SET DIAL LC-AREA-CODES 410     <-- Area codes in 10-digit dialing region
+  SET DIAL AREA-CODE 301
+  DIAL +1 (301) 765-4321         <-- Dials 97654321*     (local)
+  DIAL +1 (410) 765-4321         <-- Dials 94107654321*  (local with area code)
+  DIAL +1 (212) 765-4321         <-- Dials 12127654321   (long distance)
+
+2.1.3. Forcing Long-Distance Dialing
+
+   Suppose a number is in your country and area, but for some reason you
+   need to dial it long-distance anyway (as is always the case in France).
+   There have always been various ways to handle this:
+
+    1. Temporarily set your area code to a different (or nonexistent or
+       impossible) one (but this required knowledge of which area codes
+       were nonexistent or impossible in each country).
+    2. Dial the number literally instead of using the portable format, but
+       this defeats the purpose of the portable dialing directory.
+
+   Now there is also a new command that, very simply, can force
+   long-distance dialing:
+
+   SET DIAL FORCE-LONG-DISTANCE { ON, OFF }
+          If a call is placed to a portable phone number within the same
+          country code as the calling number, it is dialed with the
+          long-distance prefix and the area code if FORCE-LONG-DISTANCE is
+          ON. If OFF, the regular rules and procedures apply.
+
+   Example (France):
+
+  SET DIAL COUNTRY-CODE 33
+  SET DIAL AREA-CODE 6
+  SET DIAL FORCE-LONG-DISTANCE ON
+
+   (In fact, SET DIAL COUNTRY-CODE 33 automatically sets DIAL
+   FORCE-LONG-DISTANCE ON...)
+
+   Example (USA, for a certain type of reverse-charge calling in which the
+   called number must always be fully specified):
+
+  SET DIAL PREFIX 18002666328$     ; 1-800-COLLECT
+  SET DIAL COUNTRY-CODE 1
+  SET DIAL AREA-CODE 212
+  SET DIAL FORCE-LONG-DISTANCE ON
+
+   Example (Toronto, where calls to exchange 976 within area code 416 must
+   be dialed as long distance, even when you are dialing from area code
+   416):
+
+  SET DIAL COUNTRY-CODE 1
+  SET DIAL AREA-CODE 416
+  SET DIAL FORCE-LONG-DISTANCE ON
+  DIAL +1 (416) 976-xxxx
+
+   If dialing methods were consistent and sensible, of course it would be
+   possible to always dial every domestic call as if it were long
+   distance. But in many locations this doesn't work or if it does, it
+   costs extra. The following macro can be used for dialing any given
+   number with forced long-distance format:
+
+  define LDIAL {
+      local \%x
+      set dial force-long-distance on
+      dial \%*
+      asg \%x \v(success)
+      set dial force-long-distance off
+      end \%x
+  }
+
+   (See [394]Section 7.5 about the \%* variable.)
+
+2.1.4. Exchange-Specific Dialing Decisions
+
+   This applies mainly to the North American Numbering Plan (NANP). Refer
+   to the section "Alternative notations" in [395]Using C-Kermit 2nd
+   Edition, pages 106-107, and the story about Toronto on page 110. Using
+   the new LC-AREA-CODES list, we can address the problem by treating the
+   exchange as part of the area code:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL AREA-CODE 416
+  SET DIAL LC-AREA-CODES 905276
+  DIAL +1 416 765 4321               <-- 7654321      (local)
+  DIAL +1 905 276 4321               <-- 9052764321   (local with area code)
+  DIAL +1 905 528 4321               <-- 19055284321  (long distance)
+
+   The same technique can be used in Massachusetts (story at top of page
+   111) and in any other place where dialing to some exchanges within a
+   particular area code is local, but to others in the same area code is
+   long distance.
+
+2.1.5. Cautions about Cheapest-First Dialing
+
+   Kermit does not maintain a knowledge base of telephony information; it
+   only provides the tools to let you enter a phone number in a standard
+   format and dial it correctly from any location in most cases.
+
+   In particular, Kermit does not differentiate the charging method from
+   the dialing method. If a call that is DIALED as long-distance (e.g.
+   from 212 to 718 in country code 1) is not CHARGED as long distance, we
+   have no way of knowing that without keeping a matrix of charging
+   information for every area-code combination within every country, and
+   any such matrix would be obsolete five minutes after it was
+   constructed. Thus, "cheapest-first" sorting is only as reliable as our
+   assumption that the charging method follows the dialing method. A good
+   illustration would be certain online services that have toll-free
+   dialup numbers which they charge you a premium (in your online service
+   bill) for using.
+
+2.1.6. Blind Dialing (Dialing with No Dialtone)
+
+   C-Kermit's init string for Hayes-like modems generally includes an X4
+   command to enable as many result codes as possible, so that Kermit can
+   react appropriately to different failure reasons. One of the result
+   codes that X4 enables is "NO DIALTONE". A perhaps not obvious side
+   effect of enabling this result code that the modem must hear dialtone
+   before it will dial.
+
+   It is becoming increasingly necessary to force a modem to dial even
+   though it does not hear a dialtone on the phone line; for example, with
+   PBXs that have strange dialtones, or with phone systems in different
+   countries, or with ISDN phones, etc. This is called "blind dialing".
+
+   C-Kermit 7.0 has two new commands to cope with this situation:
+
+   SET DIAL IGNORE-DIALTONE { ON, OFF }
+          OFF (the default) means to tell the modem to wait for dialtone
+          before dialing. ON means to enable "blind dialing", i.e. tell
+          the modem NOT to wait for dialtone before dialing. Generally
+          this is accomplished by sending ATX3 to the modem just prior to
+          dialing. SET MODEM TYPE xxx and then SHOW MODEM displays
+          Kermit's built-in "ignore dialtone" command.
+
+   SET DIAL COMMAND IGNORE-DIALTONE text
+          This lets you change the built-in ignore-dialtone command (such
+          as ATX3) to whatever you choose, in case the built-in one does
+          not work, or another command works better.
+
+   Notes:
+    1. The ignore-dialtone command is not sent unless SET DIAL
+       IGNORE-DIALTONE is ON.
+    2. The ATX3 command generally disables not only NO DIALTONE, but also
+       BUSY. So this will prevent Kermit from detecting when the line is
+       busy. This is a property of the modem, not of Kermit.
+
+2.1.7. Trimming the Dialing Dialog
+
+   The command:
+
+  SET MODEM COMMAND action [ command ]
+
+   is used to override Kermit's built-in modem commands for each action,
+   for each kind of modem in its internal database. If you include a
+   command, this is used instead of the built-in one. If you omit the
+   command, this restores the original built-in command.
+
+   If you want to omit the command altogether, so Kermit doesn't send the
+   command at all, or wait for a response, use:
+
+  SET MODEM COMMAND action {}
+
+   That is, specify a pair of empty braces as the command, for example:
+
+  SET MODEM COMMAND ERROR-CORRECTION ON {}
+
+2.1.8. Controlling the Dialing Speed
+
+   The rate at which characters are sent to the modem during dialing is
+   normally controlled by the built-in modem database. You might want to
+   override this if Kermit seems to be dialing too slowly, or it is
+   sending characters to the modem faster than the modem handle them. A
+   new command was added for this in C-Kermit 7.0:
+
+   SET DIAL PACING number
+          Specifies the number of milliseconds (thousandths of seconds) to
+          pause between each character when sending commands to the modem
+          during DIAL or ANSWER command execution. 0 means no pause at
+          all, -1 (the default) or any other negative number means to use
+          the value from the database. Any number greater than 0 is the
+          number of milliseconds to pause.
+
+   HINT: You might also need to control the rate at which the modem
+   generates Touch Tones during dialing, for example when sending a
+   numeric page. There are two ways to do this. One way is to insert pause
+   characters into the dialing string. For modems that use the AT command
+   set, the pause character is comma (,) and causes a 2-second pause. On
+   most modems, you can use the S8 register to change the pause interval
+   caused by comma in the dialing string. The other way is to set your
+   modem's tone generation interval, if it has a command for that. Most
+   AT-command-set modems use S11 for this; the value is in milliseconds.
+   For example on USR modems:
+
+  ATS11=200
+
+   selects an interval of 200 milliseconds to separate each dialing tone.
+
+   Hint: To add S-Register settings or other commands to your dialing
+   procedure, use the new SET MODEM COMMAND PREDIAL-INIT command
+   ([396]Section 2.2.2).
+
+2.1.9. Pretesting Phone Number Conversions
+
+   The LOOKUP command now accepts telephone numbers as well as
+   directory-entry names, for example:
+
+  LOOKUP +1 (212) 7654321
+
+   When given a phone number, LOOKUP prints the result of converting the
+   phone number for dialing under the current dialing rules. For example,
+   if my country code is 1 and my area code is 212, and I am dialing out
+   from a PBX whose outside-line prefix is "93,":
+
+  C-Kermit> lookup +1 (212) 7654321
+  +1 (212) 7654321 => 93,7654321
+  C-Kermit>
+
+   You can also use the \fdialconvert(phone-number) function ([397]Section
+   2.1.11) to do this programmatically:
+
+  C-Kermit> echo "\fdialconvert(+1 (212) 7654321)"
+  "93,7654321"
+  C-Kermit>
+
+   So the new LOOKUP behaves as follows:
+
+   LOOKUP portable-format-phone-number
+          Displays how the number would actually be dialed Sets FAILURE if
+          there was a conversion error, otherwise SUCCESS.
+
+   LOOKUP literal-format-phone-number
+          Displays the same literal-format-phone-number Always sets
+          SUCCESS.
+
+   LOOKUP dialing-directory-name
+          Displays all matching entries and converts portable phone
+          numbers. Sets SUCCESS if at least one entry was found, otherwise
+          FAILURE.
+
+   LOOKUP =anything
+          Displays "=anything" and sets SUCCESS.
+
+   There is, at present, no programmatic way to fetch numbers from the
+   dialing directory. This will be considered for a future release.
+
+2.1.10. Greater Control over Partial Dialing
+
+   The following rules now apply to partial dialing:
+
+     * Phone number transformations based on country and area code,
+       application of prefixes, etc, are performed only on the first
+       PDIAL.
+     * Each PDIAL argument is looked up in the dialing directory, so it is
+       possible have directory entries for pieces of phone numbers or
+       other information.
+     * Suffixes are not applied automatically, since there is no way for
+       C-Kermit to know in which PDIAL segment you want them to be
+       applied.
+
+   However, the suffix that *would* have been applied, based on the
+   dialing rules that were invoked when processing the first PDIAL
+   command, is stored in the variable:
+
+  \v(dialsuffix)
+
+   which you can include in any subsequent PDIAL or DIAL commands.
+
+   Example:
+
+  pdial {\m(my_long_distance_pager_number_part_1)}
+  pdial {\m(my_long_distance_pager_number_part_2)}
+  pdial {\v(dialsuffix)}
+  pdial {\m(my_long_distance_pager_number_part_3)}
+  pdial {@\m(numeric_pager_code)#}
+
+2.1.11. New DIAL-related Variables and Functions
+
+   \fdialconvert(s)
+          s is a phone number in either literal or portable format (not a
+          dialing directory entry name). The function returns the dial
+          string that would actually be used by the DIAL command when
+          dialing from the current location, after processing country
+          code, area code, and other SET DIAL values, and should be the
+          same as the result of LOOKUP when given a telephone number.
+
+   \v(dialsuffix)
+          Contains the suffix, if any, that was applied in the most recent
+          DIAL command, or the suffix that would have been applied in the
+          most recent PDIAL command. Use this variable to send the dial
+          suffix at any desired point in a PDIAL sequence.
+
+   \v(dialtype)
+          A number indicating the type of call that was most recently
+          placed. Can be used after a normal DIAL command, or after the
+          first PDIAL command in a PDIAL sequence. Values are:
+
+  -2: Unknown because TAPI handled the phone number translation.
+  -1: Unknown because some kind of error occured.
+   0: Internal within PBX.
+   1: Toll-free.
+   2: Local within calling area.
+   3: Unknown (e.g. because a literal-format phone number was given).
+   4: Long distance within country.
+   5: International
+
+   \v(dialcount)
+          The current value of the DIAL retry counter, for use in a DIAL
+          macro ([398]Section 2.1.13).
+
+   \v(d$px)
+          PBX Exchange (see [399]Section 2.1.12).
+
+   Other dial-related variables, already documented in [400]Using C-Kermit
+   (or other sections of this document, e.g. [401]Section 2.1.1), include
+   \v(dialnumber), \v(dialstatus), etc. A convenient way to display all of
+   them is:
+
+  show variable dial  ; hint: abbreviate "sho var dial"
+
+   This shows the values of all the variables whose names start with
+   "dial". Also "show variable d$" (to show the \v(d$...) variables).
+
+2.1.12. Increased Flexibility of PBX Dialing
+
+   Refer to [402]Using C-Kermit, 2nd Edition, pages 107-108. Recall that
+   three commands are needed to configure C-Kermit for dialing from a PBX:
+
+  SET DIAL PBX-EXCHANGE number
+  SET DIAL PBX-INSIDE-PREFIX number
+  SET DIAL PBX-OUTSIDE-PREFIX number
+
+   Unfortunately, this model does not accommodate PBXs that have more than
+   one exchange. For example our PBX at Columbia University (which must
+   handle more than 10,000 phones) has 853-xxxx and 854-xxxx exchanges.
+
+   Beginning in C-Kermit 7.0, the SET DIAL PBX-EXCHANGE command accepts a
+   list of exchanges, e.g.:
+
+  SET DIAL PBX-EXCHANGE 853 854
+
+   (multiple exchanges are separated by spaces, not commas).
+
+   So now when dialing a portable-format number that has the same country
+   and area codes as those of your dialing location, C-Kermit compares the
+   exchange of the dialed number with each number in the PBX Exchange list
+   (rather than with a single PBX Exchange number, as it did formerly) to
+   determine whether this is an internal PBX number or an external call.
+   If it is an external call, then the PBX Outside Prefix is applied, and
+   then the normal dialing rules for local or long-distance calls.
+
+   If it is an inside call, the exchange is replaced by the PBX Inside
+   Prefix. But if the PBX has more than one exchange, a single fixed PBX
+   Inside Prefix is probably not sufficient. For example, at Columbia
+   University, we must dial 3-xxxx for an internal call to 853-xxxx, but
+   4-xxxx for a call to 854-xxxx. That is, the inside prefix is the final
+   digit of the exchange we are dialing. For this reason, C-Kermit 7.0
+   provides a method to determine the inside prefix dynamically at dialing
+   time, consisting of a new variable and new syntax for the SET DIAL
+   PBX-INSIDE-PREFIX command:
+
+   \v(d$px)
+          This variable contains the exchange that was matched when a PBX
+          internal call was detected. For example, if the PBX exchange
+          list is "853 854" and a call is placed to +1 (212) 854-9999,
+          \v(d$px) is set to 854.
+
+   SET DIAL PBX-INSIDE-PREFIX \fxxx(...)
+          If the PBX Inside Prefix is defined to be a function, its
+          evaluation is deferred until dialing time. Normally, this would
+          be a string function having \v(d$px) as an operand. Of course,
+          you can still specify a constant string, as before.
+
+   So given the following setup:
+
+  SET DIAL COUNTRY-CODE 1
+  SET DIAL AREA-CODE 212
+  SET DIAL PBX-OUTSIDE-PREFIX 93,
+  SET DIAL PBX-EXCHANGE 853 854
+  SET DIAL PBX-INSIDE-PREFIX \fright(\v(d$px),1)
+
+   The following numbers give the results indicated:
+
+ Number                   Result
+  +1 (212) 854-9876        4-9876
+  +1 (212) 853-1234        3-1234
+  +1 (212) 765-4321        93,765-4321
+  +1 (333) 765-4321        93,1333765-4321
+
+   Furthermore, the K_PBX_XCH environment variable may now be set to a
+   list of exchanges to automatically initialize C-Kermit's PBX exchange
+   list, for example (in UNIX ksh or bash):
+
+  export K_PBX_XCH="853 854"
+
+   (Quotes required because of the space.) Of course, this variable can
+   also be set to a single exchange, as before:
+
+  export K_PBX_XCH=853
+
+2.1.13. The DIAL macro - Last-Minute Phone Number Conversions
+
+   After a DIAL or LOOKUP command is given, a list of phone numbers is
+   assembled from the dialing directory (if any), with all
+   location-dependent conversion rules applied as described in Chapter 5
+   of [403]Using C-Kermit.
+
+   However, additional conversions might still be required at the last
+   minute based on local or ephemeral conditions. So that you can have the
+   final word on the exact format of the dial string, C-Kermit 7.0 lets
+   you pass the converted string through a macro of your own design for
+   final processing before dialing. The relevant command is:
+
+   SET DIAL MACRO [ name ]
+          Specifies the name of a macro to be run on each phone number
+          after all built-in conversions have been applied, just before
+          the number is dialed. If no name is given, no macro is run. The
+          phone number, as it would have been dialed if there were no dial
+          macro, is passed to the macro.
+
+   The dial macro can do anything at all (except start a file transfer).
+   However, the normal use for the macro would be to modify the phone
+   number. For this reason the phone number is passed to the macro as
+   argument number 1 (\%1). To cause a modified number to be dialed, the
+   macro should terminate with a RETURN statement specifying a return
+   value. To leave the number alone, the macro should simply end. Example:
+
+  define xxx return 10108889999$\%1
+  set dial macro xxx
+  dial xyzcorp
+
+   This defines a DIAL MACRO called xxx, which puts an access code on the
+   front of the number. Another example might be:
+
+  def xxx if equal "\v(modem)" "hayes-1200" return \freplace(\%1,$,{,,,,,})
+  set dial macro xxx
+  dial xyzcorp
+
+   which replaces any dollar-sign in the dial string by a series of five
+   commas, e.g. because this particular modem does not support the "wait
+   for bong" feature (remember that commas that are to be included
+   literally in function arguments must be enclosed in braces to
+   distinguish them from the commas that separate the arguments) and when
+   the IF condition is not satisfied, the macro does not return a value,
+   and so the number is not modified. Then when a DIAL command is given
+   referencing a dialing directory entry, "xyzcorp". The macro is
+   automatically applied to each matching number.
+
+   Numerous dial-, modem-, communications-, and time-related variables are
+   available for decision making your dial macro. Type SHOW VARIABLES for
+   a list. Of particular interest is the \v(dialcount) variable, which
+   tells how many times the DIAL command gone through its retry loop: 1 on
+   the first try, 2 on the second, 3 on the third, and so on, and the
+   \v(dialresult) and \v(dialstatus) variables.
+
+   Here are some other applications for the DIAL MACRO (from users):
+
+     * Phone numbers in the dialing directory are formatted with '-' for
+       readability, but some modems don't like the hyphens, so the DIAL
+       macro is used to remove them before dialing; e.g 0090-123-456-78-99
+       becomes 00901234567899: "def xxx return \freplace(\%1,-)".
+     * To set some specific modem (or other) options depending on the
+       called customer or telephone number.
+     * Choosing the most appropriate provider based on (e.g.) time of day,
+       or cycling through a list of providers in case some providers might
+       be busy.
+
+   To illustrate the final item, suppose you have a choice among many
+   phone service providers; the provider is chosen by dialing an access
+   code before the number. Different providers might be better (e.g.
+   cheaper) for certain times of day or days of the week, or for dialing
+   certain locations; you can use the DIAL macro to add the access for the
+   most desirable provider.
+
+   Similarly, when the same number might be reached through multiple
+   providers, it's possible that one provider might not be able to
+   complete the call, but another one can. In that case, you can use the
+   DIAL macro to switch providers each time through the DIAL loop --
+   that's where the \v(dialcount) variable comes in handy.
+
+   The following command can be used to debug the DIAL macro:
+
+   SET DIAL TEST { ON, OFF }
+          Normally OFF, so the DIAL command actually dials. When ON, the
+          DIAL command performs all lookups and number conversions, and
+          then goes through the number list and retry loop, but instead of
+          actually dialing, lists the numbers it would have called if none
+          of the DIAL attempts succeeded (or more precisely, every number
+          was always busy).
+
+2.1.14. Automatic Tone/Pulse Dialing Selection
+
+   SET DIAL METHOD { AUTO, DEFAULT, PULSE, TONE }
+          Chooses the dialing method for subsequent calls.
+
+   Prior to version 7.0, C-Kermit's DIAL METHOD was DEFAULT by default,
+   meaning it does not specify a dialing method to the modem, but relies
+   on the modem to have an appropriate default dialing method set. So, for
+   example, when using Hayes compatible modems, the dial string would be
+   something like ATD7654321, rather than ATDT7654321 or ATDP7654321.
+
+   In C-Kermit 7.0 and K95 1.1.19, the dial method can be set from the
+   environment variable:
+
+  K_DIAL_METHOD
+
+   when Kermit starts. The values can be TONE, PULSE, or DEFAULT, e.g.
+   (UNIX):
+
+  set K_DIAL_METHOD=TONE; export K_DIAL_METHOD
+
+   In the absence of a K_DIAL_METHOD definition, the new default SET DIAL
+   METHOD is AUTO rather than DEFAULT. When DIAL METHOD is AUTO and the
+   local country code is known, then if tone dialing is universally
+   available in the corresponding area, tone dialing is used; if dialing
+   from a location where pulse dialing is mandatory, pulse dialing is
+   used.
+
+   The "tone country" and "pulse country" lists are preloaded according to
+   our knowledge at the time of release. You can see their contents in the
+   SHOW DIAL listing. You can change the lists with:
+
+   SET DIAL TONE-COUNTRIES [ cc [ cc [ ... ] ] ]
+          Replaces the current TONE-COUNTRIES list with the one given.
+          Each cc is a country code; separate them with spaces (not
+          commas). Example:
+
+  set dial tone-countries 1 358 44 46 49
+
+          If no country codes are given, the current list, if any, is
+          removed, in which case SET DIAL METHOD AUTO is equivalent to SET
+          DIAL METHOD DEFAULT.
+
+   SET DIAL PULSE-COUNTRIES [ cc [ cc [ ... ] ] ]
+          Replaces the current PULSE-COUNTRIES list with the one give.
+          Syntax and operation is like SET DIAL TONE-COUNTRIES.
+
+   If the same country code appears in both lists, Pulse takes precedence.
+
+   The SET DIAL TONE- and PULSE-COUNTRIES commands perform no verification
+   whatsoever on the cc's, since almost any syntax might be legal in some
+   settings. Furthermore, there is no facility to edit the lists; you can
+   only replace the whole list. However, since the only purpose of these
+   lists is to establish a basis for picking tone or pulse dialing
+   automatically, all you need to override the effect of the list is to
+   set a specific dialing method with SET DIAL METHOD TONE or SET DIAL
+   METHOD PULSE.
+
+2.1.15. Dial-Modifier Variables
+
+   As of C-Kermit 7.0, dial modifiers are available in the following
+   variables:
+
+ \v(dm_lp) Long pause
+ \v(dm_sp) Short pause
+ \v(dm_pd) Pulse dial
+ \v(dm_td) Tone dial
+ \v(dm_wa) Wait for answer
+ \v(dm_wd) Wait for dialtone
+ \v(dm_rc) Return to command mode
+
+   You can use these in your dial strings in place of hardwired modifiers
+   like "@", ",", etc, for increased portability of scripts. Example:
+
+  C-Kermit>set modem type usrobotics
+  C-Kermit>sho variables dm
+   \v(dm_lp) = ,
+   \v(dm_sp) = /
+   \v(dm_pd) = P
+   \v(dm_td) = T
+   \v(dm_wa) = @
+   \v(dm_wd) = W
+   \v(dm_rc) = ;
+  C-Kermit>exit
+
+2.1.16. Giving Multiple Numbers to the DIAL Command
+
+   Prior to C-Kermit 7.0, the only way to give a DIAL command a list of
+   phone numbers to try until one answers was to create a dialing
+   directory that had multiple entries under the same name, and then use
+   that entry name in the DIAL command. Now a list of numbers can be given
+   to the DIAL command directly in the following format:
+
+  dial {{number1}{number2}{number3}...}
+
+   This is the same list format used by SEND /EXCEPT: and other commands
+   that allow a list where normally a single item is given. Restrictions
+   on this form of the DIAL command are:
+
+     * The first two braces must be adjacent; spacing is optional
+       thereafter.
+     * Each number must be an actual number to dial, not a dialing
+       directory entry.
+     * Dialing directory entries may not contain number lists in this
+       format.
+
+   In all other respects, the numbers are treated as if they had been
+   fetched from the dialing directory; they can be in literal or portable
+   format, etc. Example:
+
+  dial {{7654321} {+1 (212) 5551212} { 1-212-5556789 }}
+
+   The list can be any length at all, within reason.
+
+   This feature is especially handy for use with the K95 Dialer, allowing
+   a list of phone numbers to be specified in the Telephone Number box
+   without having to set up or reference a separate dialing directory.
+
+   You can also use it to add commonly-dialed sequences as variables in
+   your C-Kermit customization file, e.g.:
+
+  define work {{7654321}{7654322}{7654323}}
+
+   and then:
+
+  dial {\m(work)}
+
+   (the variable name must be enclosed in braces).
+
+   Or more simply:
+
+  define work dial {{7654321}{7654322}{7654323}}
+
+   and then:
+
+  work
+
+2.2. Modems
+
+2.2.1. New Modem Types
+
+   Since C-Kermit 6.0:
+
+  atlas-newcom-33600ifxC Atlas/Newcom 33600
+  att-keepintouch        AT&T KeepinTouch PCMCIA V.32bis Card Modem
+  att-1900-stu-iii       AT&T Secure Data STU-III Model 1900
+  att-1910-stu-iii       AT&T Secure Data STU-III Model 1910
+  bestdata               Best Data
+  cardinal               Cardinal V.34 MVP288X series.
+  compaq                 Compaq Data+Fax (e.g. in Presario)
+  fujitsu                Fujitsu Fax/Modem Adapter
+  generic-high-speed     Any modern error-correcting data-compressing modem
+  itu-t-v25ter/v250      ITU-T (CCITT) V.25ter (V.250) standard command set
+  megahertz-att-v34      Megahertz AT&T V.34
+  megahertz-xjack        Megahertz X-Jack
+  motorola-codex         Motorola Codex 326X Series
+  motorola-montana       Motorola Montana
+  mt5634zpx              Multitech MT5634ZPX
+  rockwell-v90           Rockwell V.90 56K
+  rolm-244pc             Siemens/Rolm 244PC (AT command set)
+  rolm-600-series        Siemens/Rolm 600 Series (AT command set)
+  spirit-ii              QuickComm Spirit II
+  suprasonic             SupraSonic V288+
+  supra-express-v90      Supra Express V.90
+
+   One of the new types, "generic-high-speed" needs a bit of explanation.
+   This type was added to easily handle other types that are not
+   explicitly covered, without going through the bother of adding a
+   complete user-defined modem type. This one works for modern modems that
+   use the AT command set, on the assumption that all the default
+   ("factory") settings of the modem (a) are appropriate for Kermit, (b)
+   include error correction, data compression, and speed buffering; and
+   (c) are recallable with the command AT&F.
+
+   If the command to recall your modem's profile is not AT&F, use the SET
+   MODEM COMMAND INIT-STRING command to specify the appropriate modem
+   command. The default init-string is AT&F\13 (that is, AT, ampersand, F,
+   and then carriage return); a survey of about 20 modern modem types
+   shows they all support this, but they might mean different things by
+   it. For example, the USR Sportster or Courier needs AT&F1 (not AT&F,
+   which is equivalent to AT&F0, which recalls an inappropriate profile),
+   so for USR modems:
+
+  set modem type generic-high-speed
+  set modem command init AT&F1\13
+
+   Of course, USR modems already have their own built-in modem type. But
+   if you use this one instead, it will dial faster because it has fewer
+   commands to give to the modem; in that sense "&F1" is like a macro that
+   bundles numerous commands into a single one. See your modem manual for
+   details about factory profiles and commands to recall them.
+
+   WARNING: Do not use the generic-high-speed modem type in operating
+   systems like VMS where hardware flow control is not available, at least
+   not unless you change the init string from AT&F\13 to something else
+   that enables local Xon/Xoff or other appropriate type of flow control.
+
+   Also see [404]Section 2.1.7 for additional hints about making dialing
+   go faster.
+
+2.2.2. New Modem Controls
+
+   SET MODEM CAPABILITIES list
+          In C-Kermit 7.0, this command automatically turns MODEM
+          SPEED-MATCHING OFF if SB (Speed Buffering) is in the list, and
+          turns it ON if SB is absent.
+
+   SET MODEM COMMAND PREDIAL-INIT [ text ]
+          Commands to be sent to the modem just prior to dialing. Normally
+          none.
+
+   SET MODEM SPEAKER { ON, OFF }
+          Determines whether modem speaker is on or off while call is
+          being placed. ON by default. Note: This command does not provide
+          fine-grained control over when the speaker is on or off.
+          Normally, ON means while the call is being placed, until the
+          point at which carrier is successfully established. If your
+          modem has a different speaker option that you want to choose,
+          then use the SET MODEM COMMAND SPEAKER ON text command to
+          specify this option.
+
+   SET MODEM COMMAND SPEAKER { ON, OFF } [ text ]
+          Specify or override the commands to turn your modem's speaker on
+          and off.
+
+   SET MODEM VOLUME { LOW, MEDIUM, HIGH }
+          When MODEM SPEAKER is on, select volume. Note: In some modems,
+          especially internal ones, these commands have no effect; this is
+          a limitation of the particular modem, not of Kermit.
+
+   SET MODEM COMMAND VOLUME { LOW, MEDIUM, HIGH } [ text ]
+          Specify or override the commands to set your modem's speaker
+          volume.
+
+   SET MODEM COMMAND IGNORE-DIALTONE [ text ]
+          The command to enable blind dialing ([405]Section 2.1.6).
+
+   SET MODEM ESCAPE-CHARACTER code
+          Has been augmented to allow codes of 0 or less: < 0 means the
+          escape mechanism is disabled. = 0 means to use (restore) the
+          default value from the modem database. > 0 and < 128 is a
+          literal value to be used instead of the default one. > 127 means
+          the escape mechanism is disabled. This affects "modem hangup".
+          When the escape mechanism is disabled, but SET MODEM
+          HANGUP-METHOD is MODEM-COMMAND, it sends the hangup command
+          immediately, without the <pause>+++<pause> business first. This
+          is useful (for example) when sending lots of numeric pages, a
+          process in which never we go online, and so never need to escape
+          back. Eliminating the unnecessary pauses and escape sequence
+          allows a lot more pages to be sent per unit time.
+
+   Recall that C-Kermit can dial modems to which it is connected via
+   TCP/IP (Telnet or Rlogin) as described on page 126 of [406]Using
+   C-Kermit, 2nd Ed. In this case the MODEM HANGUP-METHOD should be
+   MODEM-COMMAND, since RS-232 signals don't work over TCP/IP connections.
+   As noted in the manual, such connections are set up by the following
+   sequence:
+
+  set host host [ port ]
+  set modem type name
+  dial number
+
+   But this can cause complications when you use Kermit to switch between
+   serial and TCP/IP connections. In the following sequence:
+
+  set host name
+  set modem type name
+  set port name
+
+   the first two commands obey the rules for dialing out over Telnet.
+   However, the SET PORT command requires that Kermit close its current
+   (Telnet) connection before it can open the serial port (since Kermit
+   can only have one connection open at a time). But since a modem type
+   was set after the "set host" command was given, Kermit assumes it is a
+   Telnet dialout connection and so sends the modem's hangup sequence is
+   sent to the Telnet host. To avoid this, close the network connection
+   explicitly before opening the serial one:
+
+  set host name
+  close
+  set modem type name
+  set port name
+
+2.3. TELNET and RLOGIN
+
+   For additional background, please also read the [407]TELNET.TXT file,
+   also available on the Web in [408]HTML format.
+
+   Cautions:
+
+     * If making a Telnet connection with C-Kermit takes a very long time,
+       like over a minute, whereas the system Telnet program makes the
+       same connection immediately, try including the /NOWAIT switch:
+  C-Kermit> telnet /nowait hostname
+
+       See [409]TELNET.TXT or [410]TELNET.HTM for details. If it also
+       takes a very long time to make a Telnet connection with system
+       Telnet, then the delay is most likely caused by reverse DNS lookups
+       when your host is not properly registered in DNS.
+     * When supplying numeric IP addresses to C-Kermit or to any other
+       application (regular Telnet, Rlogin, etc), do not include leading
+       0's in any fields unless you intend for those fields to be
+       interpreted as octal (or hex) numbers. The description of the
+       Internet address interpreter (the sockets library inet_addr()
+       routine) includes these words:
+
+     All numbers supplied as "parts" in a "." notation may be decimal,
+     octal, or hexadecimal, as specified in the C language (that is, a
+     leading 0x or 0X implies hexadecimal; otherwise, a leading 0 implies
+     octal; otherwise, the number is interpreted as decimal).
+       To illustrate, 128.59.39.2 and 128.059.039.002 are not the same
+       host! Even though most of the fields contain non-octal digits.
+       Using system Telnet (not Kermit):
+  $ telnet 128.059.039.002
+  Trying 128.49.33.2 ...
+
+       Of course the same thing happens with Kermit because it uses (as it
+       must) the same system service for resolving network addresses that
+       Telnet, FTP, and all other TCP/IP applications use.
+     * The RLOGIN section on page 123 does not make it clear that you can
+       use the SET TELNET TERMINAL-TYPE command to govern the terminal
+       type that is reported by C-Kermit to the RLOGIN server.
+     * Note that the SET TCP commands described on pages 122-123 might be
+       absent; some platforms that support TCP/IP do not support these
+       particular controls.
+
+   New commands:
+
+   TELOPT { AO, AYT, BREAK, CANCEL, EC, EL, EOF, EOR, GA, IP, DMARK,
+          DO, DONT, NOP, SB, SE, SUSP, WILL, WONT }
+          This command was available previously, but supported only DO,
+          DONT, WILL, and WONT. Now it lets you send all the Telnet
+          protocol commands. Note that certain commands do not require a
+          response, and therefore can be used as nondestructive "probes"
+          to see if the Telnet session is still open; e.g.:
+
+  set host xyzcorp.com
+  ...
+  telopt nop
+  if fail stop 1 Connection lost
+
+   SET TCP ADDRESS [ ip-address ]
+          Specifies the IP address of the computer that C-Kermit is
+          running on. Normally this is not necessary. The exception would
+          be if your machine has multiple network adapters (physical or
+          virtual) with a different address for each adapter AND you want
+          C-Kermit to use a specific address when making outgoing
+          connections or accepting incoming connections.
+
+   SET TCP DNS-SERVICE-RECORDS { ON, OFF }
+          Tells C-Kermit whether to try to use DNS SRV records to
+          determine the host and port number upon which to find an
+          advertised service. For example, if a host wants regular Telnet
+          connections redirected to some port other than 23, this feature
+          allows C-Kermit to ask the host which port it should use. Since
+          not all domain servers are set up to answer such requests, this
+          feature is OFF by default.
+
+   SET TCP REVERSE-DNS-LOOKUP { ON, OFF, AUTO }
+          Tells Kermit whether to perform a reverse DNS lookup on TCP/IP
+          connections. This allows Kermit to determine the actual hostname
+          of the host it is connected to, which is useful for connections
+          to host pools, and is required for Kerberos connections to host
+          pools and for incoming connections. If the other host does not
+          have a DNS entry, the reverse lookup could take a long time
+          (minutes) to fail, but the connection will still be made. Turn
+          this option OFF for speedier connections if you do not need to
+          know exactly which host you are connected to and you are not
+          using Kerberos. AUTO, the default, means the lookup is done on
+          hostnames, but not on numeric IP addresses.
+
+   SET TELNET WAIT-FOR-NEGOTIATIONS { ON, OFF }
+          Each Telnet option must be fully negotiated either On or Off
+          before the session can continue. This is especially true with
+          options that require sub-negotiations such as Authentication,
+          Encryption, and Kermit; for proper support of these options
+          Kermit must wait for the negotiations to complete. Of course,
+          Kermit has no way of knowing whether a reply is delayed or not
+          coming at all, and so will wait a minute or more for required
+          replies before continuing the session. If you know that Kermit's
+          Telnet partner will not be sending the required replies, you can
+          set this option of OFF to avoid the long timeouts. Or you can
+          instruct Kermit to REFUSE specific options with the SET TELOPT
+          command.
+
+   SET TELOPT [ { /CLIENT, /SERVER } ] option
+          { ACCEPTED, REFUSED, REQUESTED, REQUIRED }
+          [ { ACCEPTED, REFUSED, REQUESTED, REQUIRED } ]
+          SET TELOPT lets you specify policy requirements for Kermit's
+          handling of Telnet option negotiations. Setting an option is
+          REQUIRED causes Kermit to offer the option to the peer and
+          disconnect if the option is refused. REQUESTED causes Kermit to
+          offer an option to the peer. ACCEPTED results in no offer but
+          Kermit will attempt to negotiate the option if it is requested.
+          REFUSED instructs Kermit to refuse the option if it is requested
+          by the peer.
+
+          Some options are negotiated in two directions and accept
+          separate policies for each direction; the first keyword applies
+          to Kermit itself, the second applies to Kermit's Telnet partner;
+          if the second keyword is omitted, an appropriate
+          (option-specific) default is applied. You can also include a
+          /CLIENT or /SERVER switch to indicate whether the given policies
+          apply when Kermit is the Telnet client or the Telnet server; if
+          no switch is given, the command applies to the client.
+
+          Note that some of Kermit's Telnet partners fail to refuse
+          options that they do not recognize and instead do not respond at
+          all. In this case it is possible to use SET TELOPT to instruct
+          Kermit to REFUSE the option before connecting to the problem
+          host, thus skipping the problematic negotiation.
+
+          Use SHOW TELOPT to view current Telnet Option negotiation
+          settings. SHOW TELNET displays current Telnet settings.
+
+2.3.0. Bug Fixes
+
+   If "set host nonexistent-host" was given (and it properly failed),
+   followed by certain commands like SEND, the original line and modem
+   type were not restored and C-Kermit thought that it still had a network
+   hostname; fixed in 7.0.
+
+2.3.1. Telnet Binary Mode Bug Adjustments
+
+   SET TELNET BUG BINARY-ME-MEANS-U-TOO { ON, OFF } was added to edit 192
+   after the book was printed. Also SET TELNET BUG BINARY-U-MEANS-ME-TOO.
+   The default for both is OFF. ON should be used when communicating with
+   a Telnet partner (client or server) that mistakenly believes that
+   telling C-Kermit to enter Telnet binary mode also means that it, too,
+   is in binary mode, contrary to the Telnet specification, which says
+   that binary mode must be negotiated in each direction separately.
+
+2.3.2. VMS UCX Telnet Port Bug Adjustment
+
+   A new command, SET TCP UCX-PORT-BUG, was added for VMS versions with
+   UCX (DEC TCP/IP), applying only to early versions of UCX, like 2.2 or
+   earlier. If you try to use VMS C-Kermit to make a Telnet connection
+   using a port name (like "telnet", which is used by default), the
+   underlying UCX getservbyname() function might return the service number
+   with its bytes swapped and the connection will fail. If "telnet
+   hostname 23" works, then your version of UCX has this bug and you can
+   put "set tcp ucx-port-bug on" in your CKERMIT.INI file to get around
+   it.
+
+2.3.3. Telnet New Environment Option
+
+   The TELNET NEW-ENVIRONMENT option ([411]RFC 1572) is supported as 7.0.
+   This option allows the C-Kermit Telnet client to send certain
+   well-known variables to the Telnet server, including USER, PRINTER,
+   DISPLAY, and several others. This feature is enabled by default in
+   Windows and OS/2, disabled by default elsewhere. The command to enable
+   and disable it is:
+
+  SET TELNET ENVIRONMENT { ON, OFF }
+
+   When ON, and you Telnet to another computer, you might (or might not)
+   notice that the "login:" or "Username:" prompt does not appear --
+   that's because your username was sent ahead, in which case the remote
+   system might prompt you only for your password (similar to Rlogin). Use
+   "set telnet environment off" to defeat this feature, particularly in
+   scripts where the dialog must be predictable. You can also use this
+   command to specify or override specific well-known environment variable
+   values:
+
+ SET TELNET ENVIRONMENT { ACCT,DISPLAY,JOB,PRINTER,SYSTEMTYPE,USER } [ text ]
+
+2.3.4. Telnet Location Option
+
+   The TELNET LOCATION option ([412]RFC 779) is supported in 7.0. This
+   option allows the C-Kermit Telnet client to send a location string to
+   the server if the server indicates its willingness to accept one. If an
+   environment variable named LOCATION exists at the time C-Kermit starts,
+   its value is used as the location string. If you want to change it,
+   use:
+
+  SET TELNET LOCATION text
+
+   If you omit the text from this command, the Telnet location feature is
+   disabled.
+
+   SET TELNET ENVIRONMENT DISPLAY is used to set the DISPLAY variable that
+   is sent to the host, as well as the the XDISPLAY location.
+
+2.3.5. Connecting to Raw TCP Sockets
+
+   The SET HOST and TELNET commands now accept an optional switch,
+   /RAW-SOCKET, at the end, only if you first give a host and a port.
+   Example:
+
+  set host xyzcorp.com 23 /raw-socket
+  set host 128.49.39.2:2000 /raw-socket
+  telnet xyzcorp.com 3000 /raw
+
+   Without this switch, C-Kermit behaves as a Telnet client when (a) the
+   port is 23 or 1649, or (b) the port is not 513 and the server sent what
+   appeared to be Telnet negotiations -- that is, messages starting with
+   0xFF (IAC). With this switch, Kermit should treat all incoming bytes as
+   raw data, and will not engage in any Telnet negotiations or NVT CRLF
+   manipulations. This allows transparent operation through (e.g.) raw TCP
+   ports on Cisco terminal servers, through the 'modemd' modem server,
+   etc.
+
+2.3.6. Incoming TCP Connections
+
+   Accomplished via SET HOST * port, were introduced in C-Kermit 6.0, but
+   for UNIX only. In Version 7.0, they are also available for VMS.
+
+2.4. The EIGHTBIT Command
+
+   EIGHTBIT is simply a shorthand for: SET PARITY NONE, SET TERMINAL
+   BYTESIZE 8, SET COMMAND BYTESIZE 8; that is, a way to set up an 8-bit
+   clean connection in a single command.
+
+2.5. The Services Directory
+
+   Chapter 7 of [413]Using C-Kermit does not mention the ULOGIN macro,
+   which is used by our sample services directory, CKERMIT.KND. Unlike
+   UNIXLOGIN, VMSLOGIN, etc, this one is for use with systems that require
+   a user ID but no password. Therefore it doesn't prompt for a password
+   or wait for a password prompt from the remote service.
+
+   In version 7.0, the CALL macro was changed to not execute a SET MODEM
+   TYPE command if the given modem type was the same as the current one;
+   otherwise the new SET MODEM TYPE command would overwrite any
+   customizations that the user had made to the modem settings. Ditto for
+   SET LINE / SET PORT and SET SPEED.
+
+2.6. Closing Connections
+
+   Until version 7.0, there was never an obvious and general way to close
+   a connection. If a serial connection was open, it could be closed by
+   "set line" or "set port" (giving no device name); if a network
+   connection was open, it could be closed by "set host" (no host name).
+
+   In version 7.0, a new command closes the connection in an obvious and
+   straightforward way, no matter what the connection type:
+
+  CLOSE [ CONNECTION ]
+
+   The CLOSE command was already present, and required an operand such as
+   DEBUG-LOG, WRITE-FILE, etc, and so could never be given by itself. The
+   new CONNECTION operand is now the default operand for CLOSE, so CLOSE
+   by itself closes the connection, if one is open, just as you would
+   expect, especially if you are a Telnet or Ftp user.
+
+   Also see the description of the new SET CLOSE-ON-DISCONNECT command in
+   [414]Section 2.10.
+
+2.7. Using C-Kermit with External Communication Programs
+
+   C-Kermit 7.0 includes a new ability to create and conduct sessions
+   through other communications programs. Two methods are available:
+
+    1. Pty (pseudoterminal): The external program is run on a
+       "pseudoterminal", which is controlled by Kermit. This method works
+       with practically any external program, but it is not portable. At
+       this writing, it works only on some (not all) UNIX versions, and
+       not on any non-UNIX platforms.
+    2. Pipe: The external program's standard input and output are
+       redirected through a "pipe" controlled by Kermit. This method is
+       relatively portable -- it should work across all UNIX versions, and
+       it also works in Windows and OS/2 -- but it is effective only when
+       the external program actually uses standard i/o (and many don't).
+
+   The two methods are started differently but are used the same way
+   thereafter.
+
+   The purpose of this feature is to let you use C-Kermit services like
+   file transfer, character-set translation, scripting, automatic dialing,
+   etc, on connections that Kermit can't otherwise make itself.
+
+   This feature is the opposite of the REDIRECT feature, in which C-Kermit
+   makes the connection, and redirects an external (local) command or
+   program over this connection. In a pty or pipe connection, C-Kermit
+   runs and controls a local command or program, which makes the
+   connection. (The same method can be used to simply to control a local
+   program without making a connection; see [415]Section 2.8.)
+
+   To find out if your version of Kermit includes PTY support, type "show
+   features" and look for NETPTY in the alphabetical list of options. For
+   pipes, look for NETCMD.
+
+   The commands are:
+
+   SET NETWORK TYPE PTY or SET NETWORK TYPE PIPE
+   SET HOST command
+          where command is any interactive command. If the command does
+          not use standard i/o, you must use SET NETWORK TYPE PTY.
+
+   Notes:
+
+     * COMMAND is an invisible synonym for PIPE.
+     * The command and its arguments are case-sensitive in UNIX.
+
+   The SET NETWORK TYPE, SET HOST sequence sets the given network type for
+   all subsequent SET HOST commands until another SET NETWORK TYPE command
+   is given to change it.
+
+   You can also use the new /NETWORK-TYPE:PTY or /NETWORK-TYPE:PIPE (or
+   simply /PIPE or /PTY) switches on the SET HOST command itself:
+
+  SET HOST /NETWORK-TYPE:PIPE command  ; These two are the same
+  SET HOST /PIPE command
+
+  SET HOST /NETWORK-TYPE:PTY command   ; Ditto
+  SET HOST /PTY command
+
+   These are like SET NETWORK TYPE followed by SET HOST, except they apply
+   only to the connection being made and do not change the global network
+   type setting (see [416]Section 1.5 about the difference between
+   switches and SET commands).
+
+   Include any command-line options with the command that might be needed,
+   as in this example where C-Kermit uses another copy of itself as the
+   communications program:
+
+  SET HOST /PIPE /CONNECT kermit -YQJ xyzcorp.com
+
+     IMPORTANT: In Unix, wildcards and redirectors are interpreted by the
+     shell. If you want to run a program with (say) SET HOST /PTY with
+     its i/o redirected or with wildcard file arguments, you will need to
+     invoke the shell too. Example:
+
+SET HOST /PTY {sh -c "crypt < foo.x"}
+SET HOST /PTY {sh -c "grep somestring *.txt"}
+
+   As usual, if you include the /CONNECT switch, SET HOST enters CONNECT
+   mode immediately upon successful execution of the given command.
+   Therefore new commands are available as a shorthand for SET HOST
+   /CONNECT /PTY and /PIPE:
+
+   PTY [ command ]
+   PIPE [ command ]
+          The PTY and PIPE commands work like the TELNET and RLOGIN
+          commands: they set up the connection (in this case, using the
+          given command) and then enter CONNECT mode automatically (if the
+          PIPE or PTY command is given without a command, it continues the
+          current session if one is active; otherwise it gives an error
+          message).
+
+   The PIPE command is named after the mechanism by which C-Kermit
+   communicates with the command: UNIX pipes. C-Kermit's i/o is "piped"
+   through the given command. Here is a typical example:
+
+  PIPE rlogin -8 xyzcorp.com
+
+   This is equivalent to:
+
+  SET HOST /PIPE rlogin -8 xyzcorp.com
+  CONNECT
+
+   and to:
+
+  SET HOST /PIPE /CONNECT rlogin -8 xyzcorp.com
+
+   IMPORTANT:
+          If you are writing a script, do not use the PIPE, PTY, TELNET,
+          or RLOGIN command unless you really want C-Kermit to enter
+          CONNECT mode at that point. Normally SET HOST is used in scripts
+          to allow the login and other dialogs to be controlled by the
+          script itself, rather than by an actively participating human at
+          the keyboard.
+
+   Throughput of pty and pipe connections is limited by the performance of
+   the chosen command or program and by the interprocess communication
+   (IPC) method used and/or buffering capacity of the pipe or pty, which
+   in turn depends on the underlying operating system.
+
+   In one trial (on SunOS 4.1.3), we observed file transfer rates over an
+   rlogin connection proceeding at 200Kcps for downloads, but only 10Kcps
+   for uploads on the same connection with the same settings (similar
+   disparities were noted in HP-UX). Examination of the logs revealed that
+   a write to the pipe could take as long as 5 seconds, whereas reads were
+   practically instantaneous. On the other hand, using Telnet as the
+   external program rather than rlogin, downloads and uploads were better
+   matched at about 177K each.
+
+   Most external communication programs, like C-Kermit itself, have escape
+   characters or sequences. Normally these begin with (or consist entirely
+   of) a control character. You must be sure that this control character
+   is not "unprefixed" when uploading files, otherwise the external
+   program will "escape back" to its prompt, or close the connection, or
+   take some other unwanted action. When in CONNECT mode, observe the
+   program's normal interaction rules. Of course C-Kermit's own escape
+   character (normally Ctrl-\) is active too, unless you have taken some
+   action to disable it.
+
+   On PTY connections, the underlying PTY driver is not guaranteed to be
+   transparent to control characters -- for example, it might expand tabs,
+   translate carriage returns, generate signals if it sees an interrupt
+   character, and so on. Similar things might happen on a PIPE connection.
+   For this reason, if you plan to transfer files over a PTY or PIPE
+   connection, tell the file sender to:
+
+   SET PREFIXING ALL
+          This causes all control characters to be prefixed and
+          transmitted as printable ASCII characters.
+
+   If the external connection program is not 8-bit clean, you should also:
+
+   SET PARITY SPACE
+          This causes 8-bit data to be encoded in 7 bits using single
+          and/or locking shifts.
+
+   And if it does not make a reliable connection (such as those made by
+   Telnet, Rlogin, Ssh, etc), you should:
+
+   SET STREAMING OFF
+          This forces C-Kermit to treat the connection as unreliable and
+          to engage in its normal ACK/NAK protocol for error detection and
+          correction, rather than "streaming" its packets, as it normally
+          does on a network connection ([417]Section 4.20).
+
+   In some cases, buffer sizes might be restricted, so you might also need
+   to reduce the Kermit packet length to fit; this is a trial-and-error
+   affair. For example, if transfers always fail with 4000-byte packets,
+   try 2000. If that fails too, try 1000, and so on. The commands are:
+
+   SET RECEIVE PACKET-LENGTH number
+          This tells the file receiver to tell the file sender the longest
+          packet length it can accept.
+
+   SET SEND PACKET-LENGTH number
+          This tells the file sender not to send packets longer than the
+          given length, even if the receiver says longer ones are OK. Of
+          course, if the receiver's length is shorter, the shorter length
+          is used.
+
+   If none of this seems to help, try falling back to the bare minimum,
+   lowest-common-denominator protocol settings:
+
+   ROBUST
+          No sliding windows, no streaming, no control-character
+          unprefixing, packet length 90.
+
+   And then work your way back up by trial and error to get greater
+   throughput.
+
+   Note that when starting a PIPE connection, and the connection program
+   (such as telnet or rlogin) prints some greeting or information messages
+   before starting the connection, these are quite likely to be printed
+   with a stairstep effect (linefeed without carriage return). This is
+   because the program is not connected with the UNIX terminal driver;
+   there's not much Kermit can do about it. Once the connection is made,
+   everything should go back to normal. This shouldn't happen on a PTY
+   connection because a PTY is, indeed, a terminal.
+
+   On a similar note, some connection programs (like Solaris 2.5 rlogin)
+   might print lots of error messages like "ioctl TIOCGETP: invalid
+   argument" when used through a pipe. They are annoying but usually
+   harmless. If you want to avoid these messages, and your shell allows
+   redirection of stderr, you can redirect stderr in your pipe command, as
+   in this example where the user's shell is bash:
+
+  PIPE rlogin xyzcorp.com 2> /dev/null
+
+   Or use PTY rather than PIPE, since PTY is available on Solaris.
+
+2.7.0. C-Kermit over tn3270 and tn5250
+
+   Now you can make a connection from C-Kermit "directly" to an IBM
+   mainframe and transfer files with it, assuming it has Kermit-370
+   installed. Because tn3270 is neither 8-bit clean nor transparent to
+   control characters, you must give these commands:
+
+  SET PREFIXING ALL   ; Prefix all control characters
+  SET PARITY SPACE    ; Telnet connections are usually not 8-bit clean
+
+   and then:
+
+  SET HOST /PTY /CONNECT tn3270 abccorp.com
+
+   or simply:
+
+  pty tn3270 abccorp.com
+
+   SET HOST /PIPE does not work in this case, at least not for file
+   transfer. File transfer does work, however, with SET HOST /PTY,
+   provided you use the default packet length of 90 bytes; anything longer
+   seems to kill the session.
+
+   You can also make connections to IBM AS/400 computers if you have a
+   tn5250 program installed:
+
+  pty tn5250 hostname
+
+   In this case, however, file transfer is probably not in the cards since
+   nobody has ever succeeded in writing a Kermit program for the AS/400.
+   Hint:
+
+  define tn3270 {
+      check pty
+      if fail end 1 Sorry - no PTY support...
+      pty tn3270 \%*
+  }
+
+   Similarly for tn5250. Note that CHECK PTY and CHECK PIPE can be used in
+   macros and scripts to test whether PTY or PIPE support is available.
+
+2.7.1. C-Kermit over Telnet
+
+   Although C-Kermit includes its own Telnet implementation, you might
+   need to use an external Telnet program to make certain connections;
+   perhaps because it has access or security features not available in
+   C-Kermit itself. As noted above, the only precautions necessary are
+   usually:
+
+  SET PREFIXING ALL   ; Prefix all control characters
+  SET PARITY SPACE    ; Telnet connections might not be 8-bit clean
+
+   and then:
+
+  SET HOST /PTY (or /PIPE) /CONNECT telnet abccorp.com
+
+   or, equivalently:
+
+  PTY (or PIPE) telnet abccorp.com
+
+2.7.2. C-Kermit over Rlogin
+
+   C-Kermit includes its own Rlogin client, but this can normally be used
+   only if you are root, since the rlogin TCP port is privileged. But ptys
+   and pipes let you make rlogin connections with C-Kermit through your
+   computer's external rlogin program, which is normally installed as a
+   privileged program:
+
+  SET PREFIXING ALL
+
+   and then:
+
+  SET HOST /PTY (or /PIPE) /CONNECT rlogin -8 abccorp.com
+
+   or, equivalently:
+
+  PTY (or PIPE) rlogin -8 abccorp.com
+
+   The "-8" option to rlogin enables transmission of 8-bit data. If this
+   is not available, then include SET PARITY SPACE if you intend to
+   transfer files.
+
+   Note that the normal escape sequence for rlogin is Carriage Return
+   followed by Tilde (~), but only when the tilde is followed by certain
+   other characters; the exact behavior depends on your rlogin client, so
+   read its documentation.
+
+2.7.3. C-Kermit over Serial Communication Programs
+
+   Ptys and pipes also let you use programs that make serial connections,
+   such as cu or tip. For example, C-Kermit can be used through cu to make
+   connections that otherwise might not be allowed, e.g. because C-Kermit
+   is not installed with the required write permissions to the dialout
+   device and the UUCP lockfile directory.
+
+   Suppose your UUCP Devices file contains an entry for a serial device
+   tty04 to be used for direct connections, but this device is protected
+   against you (and Kermit when you run it). In this case you can:
+
+  SET CONTROL PREFIX ALL
+  PTY (or PIPE) cu -l tty04
+
+   (Similarly for dialout devices, except then you also need to include
+   the phone number in the "cu" command.)
+
+   As with other communication programs, watch out for cu's escape
+   sequence, which is the same as the rlogin program's: Carriage Return
+   followed by Tilde (followed by another character to specify an action,
+   like "." for closing the connection and exiting from cu).
+
+2.7.4. C-Kermit over Secure Network Clients
+
+     DISCLAIMER: There are laws in the USA and other countries regarding
+     use, import, and/or export of encryption and/or decryption or other
+     forms of security software, algorithms, technology, and intellectual
+     property. The Kermit Project attempts to follow all known statutes,
+     and neither intends nor suggests that Kermit software can or should
+     be used in any way, in any location, that circumvents any
+     regulations, laws, treaties, covenants, or other legitimate canons
+     or instruments of law, international relations, trade, ethics, or
+     propriety.
+
+   For secure connections or connections through firewalls, C-Kermit 7.0
+   can be a Kerberos, SRP, and/or SOCKS client when built with the
+   appropriate options and libraries. But other application-level security
+   acronyms and methods -- SSH, SSL, SRP, TLS -- pop up at an alarming
+   rate and are (a) impossible to keep up with, (b) usually mutually
+   incompatible, and (c) have restrictions on export or redistribution and
+   so cannot be included in C-Kermit itself.
+
+   However, if you have a secure text-based Telnet (or other) client that
+   employs one of these security methods, you can use C-Kermit "through"
+   it via a pty or pipe.
+
+2.7.4.1. SSH
+
+   C-Kermit does not and can not incorporate SSH due to licensing, patent,
+   and USA export law restrictions.
+
+   The UNIX SSH client does not use standard input/output, and therefore
+   can be used only by Kermit's PTY interface, if one is present. The
+   cautions about file transfer, etc, are the same as for Rlogin. Example:
+
+  SET PREFIXING ALL
+  PTY ssh XYZCORP.COM
+
+   Or, for a scripted session:
+
+  SET PREFIXING ALL
+  SET HOST /PTY ssh XYZCORP.COM
+
+   Hint:
+
+  define ssh {
+      check pty
+      if fail end 1 Sorry - no PTY support...
+      pty ssh \%*
+  }
+
+2.7.4.2. SSL
+
+   Secure Sockets Layer (SSL) is another TCP/IP security overlay, this one
+   designed by and for Netscape. An SSL Telnet client is available for
+   UNIX from the University of Queensland. More info at:
+
+  [418]http://www.psy.uq.oz.au/~ftp/Crypto/
+
+   Interoperability with C-Kermit is unknown. C-Kermit also includes its
+   own built-in SSL/TLS support, but it is not exportable; [419]CLICK HERE
+   file for details.
+
+2.7.4.3. SRP
+
+   SRP(TM) is Stanford University's Secure Remote Password protocol. An
+   SRP Telnet client is available from Stanford:
+
+  [420]http://srp.stanford.edu/srp/
+
+   Stanford's SRP Telnet client for UNIX has been tested on SunOS and
+   works fine with C-Kermit, as described in [421]Section 2.7.1, e.g.
+
+  SET PREFIX ALL
+  PTY (or PIPE) srp-telnet xenon.stanford.edu
+
+   C-Kermit itself can be built as an SRP Telnet client on systems that
+   have libsrp.a installed; the C-Kermit support code, however, may not be
+   exported outside the USA or Canada.
+
+2.7.4.4. SOCKS
+
+   C-Kermit can be built as a SOCKS-aware client on systems that have a
+   SOCKS library. See section 8.1.1 of the [422]ckccfg.txt file.
+
+   C-Kermit 7.0 can also be run over SOCKSified Telnet or rlogin clients
+   with SET NETWORK TYPE COMMAND. Suppose the Telnet program on your
+   system is SOCKS enabled but C-Kermit is not. Make Kermit connections
+   like this:
+
+  SET PREFIX ALL
+  PTY (or PIPE) telnet zzz.com
+
+2.7.4.5. Kerberos
+
+   UNIX C-Kermit can be built with MIT Kerberos IV or V authentication and
+   encryption. Instructions are available in a [423]separate document.
+   Additional modules are required that can not be exported from the USA
+   to any country except Canada, by US law.
+
+   If you have Kerberos installed but you don't have a Kerberized version
+   of C-Kermit, you can use ktelnet as C-Kermit's external communications
+   program to make secure connections without giving up C-Kermit's
+   services:
+
+  SET PREFIX ALL
+  PTY (or PIPE) ktelnet cia.gov
+
+2.8. Scripting Local Programs
+
+   If your version of Kermit has PTY support built in, then any text-based
+   program can be invoked with SET HOST /PTY or equivalent command and
+   controlled using the normal sequence of OUTPUT, INPUT, IF SUCCESS
+   commands (this is the same service that is provided by the 'expect'
+   program, but controlled by the Kermit script language rather than Tcl).
+
+   When PTY service is not available, then any program that uses standard
+   input and output can be invoked with SET HOST /PIPE.
+
+   Here's an example in which we start an external Kermit program, wait
+   for its prompt, give it a VERSION command, and then extract the numeric
+   version number from its response:
+
+  set host /pty kermit -Y
+  if fail stop 1 {Can't start external command}
+  input 10 C-Kermit>
+  if fail stop 1 {No C-Kermit> prompt}
+  output version\13
+  input 10 {Numeric: }
+  if fail stop 1 {No match for "Numeric:"}
+  clear input
+  input 10 \10
+  echo VERSION = "\fsubstr(\v(input),1,6)"
+  output exit\13
+
+   This technique could be used to control any other interactive program,
+   even those that do screen formatting (like Emacs or Vi), if you can
+   figure out the sequence of events. If your Kermit program doesn't have
+   PTY support, then the commands are restricted to those using standard
+   i/o, including certain shells, interactive text-mode "hardcopy" editors
+   like ex, and so on.
+
+   If you are using the PTY interface, you should be aware that it runs
+   the given program or command directly on the pty, without any
+   intervening shell to interpret metacharacters, redirectors, etc. If you
+   need this sort of thing, include the appropriate shell invocation as
+   part of your command; for example:
+
+  pty echo *
+
+   just echoes "*"; whereas:
+
+  pty ksh -c "echo *"
+
+   echoes all the filenames that ksh finds matching "*".
+
+   Similarly for redirection:
+
+  set host /pty ksh -c "cat > foo"  ; Note: use shell quoting rules here
+  set transmit eof \4
+  transmit bar
+
+   And for that matter, for built-in shell commands:
+
+  set host /pty ksh -c "for i in *; do echo $i; done"
+
+   The PIPE interface, on the other hand, invokes the shell automatically,
+   so:
+
+  pipe echo *
+
+   prints filenames, not "*".
+
+2.9. X.25 Networking
+
+   X.25 networking is documented in [424]Using C-Kermit, 2nd Edition. When
+   the book was published, X.25 was available only in SunOS, Solaris, and
+   Stratus VOS. Unlike TCP/IP, X.25 APIs are not standardized; each
+   vendor's X.25 libraries and services (if they have them at all) are
+   unique.
+
+   This section describes new additions.
+
+2.9.1. IBM AIXLink/X.25 Network Provider Interface for AIX
+
+   Support for X.25 was added via IBM's Network Provider Interface (NPI),
+   AIXLink/X.25 1.1, to the AIX 4.x version of C-Kermit 7.0.
+   Unfortunately, AIXLink/X.25 is a rather bare-bones facility, lacking in
+   particular any form of PAD support (X.3, X.28, X.29). Thus, the AIX
+   version of C-Kermit, when built to include X.25 networking, has neither
+   a PAD command, nor a SET PAD command. The same is true for the
+   underlying AIX system: no PAD support. Thus it is not possible to have
+   an interactive shell session over an X.25 connection into an AIX system
+   (as far as we know), even from X.25-capable Kermit versions (such as
+   Solaris or VOS) that do include PAD support.
+
+   Thus the X.25 capabilities in AIX C-Kermit are limited to peer-to-peer
+   connections, e.g. from a C-Kermit client to a C-Kermit server. Unlike
+   the Solaris, SunOS, and VOS versions, the AIX version can accept
+   incoming X.25 connections:
+
+  set network type x.25
+  if fail stop 1 Sorry - no X.25 support
+  ; Put any desired DISABLE or ENABLE or SET commands here.
+  set host /server *
+  if fail stop 1 X.25 "set host *" failed
+
+   And then access it from the client as follows:
+
+  set network type x.25
+  if fail stop 1 Sorry - no X.25 support
+  set host xxxxxxx ; Specify the X.25/X.121 address
+  if fail stop 1 Can't open connection
+
+   And at this point the client can use the full range of client commands:
+   SEND, GET, REMOTE xxx, FINISH, BYE.
+
+   The AIX version also adds two new variables:
+
+   \v(x25local_nua)
+          The local X.25 address.
+
+   \v(x25remote_nua)
+          The X.25 address of the host on the other end of the connection.
+
+   C-Kermit's AIX X.25 client has not been tested against anything other
+   than a C-Kermit X.25 server on AIX. It is not known if it will
+   interoperate with C-Kermit servers on Solaris, SunOS, or VOS.
+
+   To make an X.25 connection from AIX C-Kermit, you must:
+
+  set x25 call-user-data xxxx
+
+   where xxxx can be any even-length string of hexadecimal digits, e.g.
+   123ABC.
+
+2.9.2. HP-UX X.25
+
+   Although C-Kermit presently does not include built-in support for HP-UX
+   X.25, it can still be used to make X.25 connections as follows: start
+   Kermit and tell it to:
+
+  set prefixing all
+  set parity space
+  pty padem address
+
+   This should work in HP-UX 9.00 and later (see [425]Section 2.7). If you
+   have an earlier HP-UX version, or the PTY interface doesn't work or
+   isn't available, try:
+
+  set prefixing all
+  set parity space
+  pipe padem address
+
+   Failing that, use Kermit to telnet to localhost and then after logging
+   back in, start padem as you would normally do to connect over X.25.
+
+2.10. Additional Serial Port Controls
+
+   C-Kermit 7.0 adds the following commands for greater control over
+   serial ports. These commands are available only in C-Kermit versions
+   whose underlying operating systems provide the corresponding services
+   (such as POSIX and UNIX System V), and even then their successful
+   operation depends on the capabilities of the specific device and
+   driver.
+
+   SET DISCONNECT { ON, OFF }
+          On a SET LINE or SET PORT connection with SET CARRIER ON or
+          AUTO, if the carrier signal drops during the connection,
+          indicating that the connection has been lost, and C-Kermit
+          notices it, this setting governs what happens next. With SET
+          DISCONNECT OFF, which is consistent with previous behavior, and
+          therefore the default, C-Kermit continues to keep the device
+          open and allocated. With SET DISCONNECT ON, C-Kermit
+          automatically closes and releases the device when it senses a
+          carrier on-to-off transition, thus allowing others to use it.
+          However, it remains the default device for i/o (DIAL, REDIAL,
+          INPUT, SEND, CONNECT, etc), so if a subsequent i/o command is
+          given, the device is reopened if it is still available. When it
+          has been automatically closed in this manner, SHOW
+          COMMUNICATIONS puts "(closed)" after its name, and in UNIX, the
+          lockfile disappears -- both from SHOW COMM and from the lockfile
+          directory itself. Synonym: SET CLOSE-ON-DISCONNECT.
+
+   SET EXIT ON-DISCONNECT { ON, OFF }
+          Like DISCONNECT, but makes the program exit if a connection
+          drops.
+
+   Note that SET CLOSE-ON-DISCONNECT and SET EXIT ON-DISCONNECT apply only
+   to connections that drop; they do not apply to connections that can't
+   be made in the first place. For example, they have no effect when a SET
+   LINE, SET HOST, TELNET, or DIAL command fails.
+
+   HANGUP
+          If [CLOSE-ON-]DISCONNECT is ON, and the HANGUP command is given
+          on a serial device, and the carrier signal is no longer present
+          after the HANGUP command, the device is closed and released.
+
+   SET PARITY HARDWARE { EVEN, ODD }
+          Unlike SET PARITY { EVEN, ODD, MARK, SPACE }, which selects 7
+          data bits plus the indicated kind of parity (to be done in
+          software by Kermit itself), SET PARITY HARDWARE selects 8 data
+          bits plus even or odd parity, to be done by the underlying
+          hardware, operating system, or device driver. This command is
+          effective only with a SET LINE or SET PORT device. That is, it
+          has no effect in remote mode, nor on network connections. There
+          is presently no method for selecting 8 data bits plus mark or
+          space parity. If hardware parity is in effect, the variable
+          \v(hwparity) is set to "even" or "odd". Note: some platforms
+          might also support settings of SPACE, MARK, or NONE.
+
+   SET STOP-BITS { 1, 2 }
+          This tells the number of 1-bits to insert after an outbound
+          character's data and parity bits, to separate it from the next
+          character. Normally 1. Choosing 2 stop bits should do no harm,
+          but will slow down serial transmission by approximately 10
+          percent. Historically, 2 stop bits were used with Teletypes (at
+          110 bps or below) for print-head recovery time. There is
+          presently no method for choosing any number of stop bits besides
+          1 and 2.
+
+   SET SERIAL [ dps ]
+          dps stands for Data-bits, Parity, Stop-bits. This is the
+          notation familiar to many people for serial port configuration:
+          7E1, 8N1, 7O2, etc. The data bits number also becomes the
+          TERMINAL BYTESIZE setting. The second character is E for Even, O
+          for Odd, M for Mark, S for Space, or N for None. The list of
+          available options depends on the capabilities of the specific
+          platform. If dps is omitted, 8N1 is used. Type "set serial ?"
+          for a list of available choices. Examples:
+
+        SET SERIAL 7E1
+                Equivalent to SET PARITY EVEN, SET STOP-BITS 1, SET TERM
+                BYTE 7.
+
+        SET SERIAL 8N1
+                Equivalent to SET PARITY NONE, SET STOP-BITS 1, SET TERM
+                BYTE 8.
+
+        SET SERIAL 7E2
+                Equivalent to SET PARITY EVEN and SET STOP-BITS 2, SET
+                TERM BYTE 7.
+
+        SET SERIAL 8E2
+                Same as SET PARITY HARDWARE EVEN, SET STOP-BITS 2, SET
+                TERM BYTE 8.
+
+        SET SERIAL
+                Same as SET PARITY NONE and SET STOP-BITS 1, SET TERM BYTE
+                8.
+
+   Notes:
+
+     * The SET SERIAL xx2 options are available only in Kermit versions
+       where the SET PARITY HARDWARE command is also available. (SHOW
+       FEATURES includes "HWPARITY" in its options list.)
+     * The SET SERIAL 7xx and 8N1 options affect the software parity
+       setting, even for network connections.
+     * As noted in the manual, selecting 8 data bits does not give you
+       8-bit terminal sessions in CONNECT mode unless you also SET
+       TERMINAL BYTESIZE 8. The default terminal bytesize remains 7, to
+       protect against the situation where the remote host is generating
+       parity but you don't know about it. If the terminal bytesize was 8
+       by default and you CONNECTed to such a host, you would see only
+       garbage on your screen.
+     * If you do not give a SET STOP-BITS or SET SET SERIAL command,
+       C-Kermit does not attempt to set the device's stop bits; instead,
+       it uses whatever setting the device uses when not given explicit
+       instructions about stop bits.
+
+   SHOW COMMUNICATIONS displays the current settings. Stop bits and
+   hardware parity are shown only for SET PORT / SET LINE (serial)
+   devices, since they do not apply to network connections or to remote
+   mode. STOP-BITS is shown as "(default)" if you have not given an
+   explicit SET STOP-BITS or SET SERIAL command.
+
+   The \v(serial) variable shows the SET SERIAL setting (8N1, 7E1, etc).
+
+2.11. Getting Access to the Dialout Device
+
+     This section is for UNIX only; note the special words about QNX at
+     the end. Also see [426]Section 2.0 for SET LINE switches,
+     particularly the /SHARE switch for VMS only.
+
+   C-Kermit does its best to obey the UUCP lockfile conventions of each
+   platform (machine, operating system, OS version) where it runs, if that
+   platform uses UUCP.
+
+   But simply obeying the conventions is often not good enough, due to the
+   increasing likelihood that a particular serial device might have more
+   than one name (e.g. /dev/tty00 and /dev/term/00 are the same device in
+   Unixware 7; /dev/cua and /dev/cufa are the same device in NeXTSTEP),
+   plus the increasingly widespread use of symlinks for device names, such
+   as /dev/modem.
+
+   C-Kermit 7.0 goes to greater lengths than previous versions to
+   successfully interlock with other communications program (and other
+   instances of Kermit itself); for example, by:
+
+     * Creation of dual lockfiles whenever a symlink is used; one for the
+       link name and one for the real name.
+     * Creation of dual lockfiles in HP-UX according to HP rules.
+     * Creation of dual uppercase/lowercase lockfile names in SCO
+       UNIX/ODT/OSR5.
+     * The use of ttylock() in versions of AIX where it works.
+     * The use, wherever possible, of lockfile names based on
+       inode/major/minor device number rather than device name.
+
+   See the [427]ckuins.txt and [428]ckubwr.txt files for details.
+
+   QNX is almost unique among UNIX varieties in having no UUCP programs
+   nor UUCP-oriented dialout-device locking conventions. QNX does,
+   however, allow a program to get the device open count. This can not be
+   a reliable form of locking unless all applications do it (and they
+   don't), so by default, Kermit uses this information only for printing a
+   warning message such as:
+
+  C-Kermit>set line /dev/ser1
+  WARNING - "/dev/ser1" looks busy...
+
+   However, if you want to use it as a lock, you can do so with:
+
+  SET QNX-PORT-LOCK { ON, OFF }
+
+   QNX-PORT-LOCK is OFF by default; if you set in ON, C-Kermit fails to
+   open any dialout device when its open count indicates that another
+   process has it open. SHOW COMM (in QNX only) displays the setting, and
+   if you have a port open, it also shows the current open count (with
+   C-Kermit's own access always counting as 1).
+
+2.12. The Connection Log
+
+   C-Kermit 7.0 adds the ability to log connections, so you can see where
+   you've been and have a record of calls you've made. A connection is
+   defined as any communications session that is begun by SET LINE, SET
+   PORT, DIAL, SET HOST, TELNET, or RLOGIN. Connections are not logged
+   unless you request it; the command is:
+
+   LOG CX [ filename [ { NEW, APPEND } ] ]
+          Enables logging of connections in the given file. If the
+          trailing { NEW, APPEND } keyword is omitted, the file is opened
+          for appending; i.e. new records are written to the end. If NEW
+          is specified, a new file is created; if a file of the same name
+          already existed, it is overwritten. If the filename is omitted,
+          CX.LOG in your home (login) directory is used (note: uppercase).
+          To accept all defaults, just use "log connections" (or "l c" for
+          short). Synonym: LOG CONNECTIONS.
+
+   CLOSE CX-LOG
+          This closes the connection log if it was open. (Note, the CLOSE
+          CONNECTION command closes the connection itself).
+
+   SHOW CX
+          This shows your current connection, if any, including the
+          elapsed time (since you opened it). Synonym: SHOW CONNECTION.
+
+   \v(cx_time)
+          This variable shows the elapsed time of your current connection,
+          or if there is no current connection, of your most recent
+          connection, of if there have been no connections, 0.
+
+   The connection contains one line per connection, of the form:
+
+  yyyymmdd hh:mm:ss username pid p=v [ p=v [ ... ] ]
+
+   where the timestamp (in columns 1-18) shows when the connection was
+   made; username is the login identity of the person who made the
+   connection; pid is Kermit's process ID when it made the connection. The
+   p's are parameters that depend on the type of connection, and the v's
+   are their values:
+
+  T = Connection Type (TCP, SERIAL, DIAL, DECNET, etc).
+  H = The name of the Host from which the connection was made.
+  N = Destination phone Number or Network host name or address.
+  D = Serial connections only: Device name.
+  O = Dialed calls only: Originating country code & area code if known.
+  E = Elapsed time in hh:mm:ss format (or hhh:mm:ss, etc).
+
+   If you always want to keep a connection log, simply add:
+
+  log connections
+
+   to your C-Kermit customization file. Note, however, that if you make a
+   lot of connections, your CX.LOG will grow and grow. You can handle this
+   by adding a "logrotate" procedure like the following to your
+   customization file, before the "log connections" command:
+
+  define LOGROTATE {                    ; Define LOGROTATE macro
+      local \%i \%m \%d \%n \%f MAX
+      def MAX 4                         ; How many months to keep
+      if not def \%1 -                  ; No argument given
+        end 1 \%0: No filename given
+      if not = 1 \ffiles(\%1) -         ; Exactly 1 file must match
+        end 1 \%0: \%1 - File not found
+      .\%d := \fsubstr(\fdate(\%1),1,6) ; Arg OK - get file year & month
+      if = \%d -                        ; Compare file year & month
+        \fsubstr(\v(ndate),1,6) -       ; with current year & month
+          end 0                         ; Same year & month - done
+      rename \%1 \%1.\%d                ; Different - rename file
+      .\%n := \ffiles(\%1.*)            ; How many old files
+      if < \%n \m(MAX) end 0            ; Not enough to rotate
+      .\%m := \%1.999999                ; Initial compare string
+      for \%i 1 \%n 1 {                 ; Loop thru old logs
+         .\%f := \fnextfile()           ; Get next file name
+         if llt \%f \%m .\%m := \%f     ; If this one older remember it
+      }
+      delete \%m                        ; Delete the oldest one
+  }
+  log connections                       ; Now open the (possibly new) log
+  logrotate \v(home)CX.LOG              ; Run the LOGROTATE macro
+
+   As you can see, this compares the yyyymm portion of the modification
+   date (\fdate()) of the given file (\%1) with the current yyyymm. If
+   they differ, the current file has the yyyymm suffix (from its most
+   recent modification date) appended to its name. Then we search through
+   all other such files, find the oldest one, and delete it. Thus the
+   current log, plus the logs from the most recent four months, are kept.
+   This is all done automatically every time you start C-Kermit.
+
+   On multiuser systems, it is possible to keep a single, shared,
+   system-wide connection log, but this is not recommended since (a) it
+   requires you keep a publicly write-accessible logfile (a glaring target
+   for mischief), and (b) it would require each user to log to that file
+   and not disable logging. A better method for logging connections, in
+   UNIX at least, is syslogging (see [429]ckuins.txt Section 15 and
+   [430]Section 4.2 of the [431]IKSD Administration Guide for details).
+
+2.13. Automatic Connection-Specific Flow Control Selection
+
+   Beginning in C-Kermit 7.0, the appropriate flow-control method for each
+   connection type is kept in a table, for example:
+
+  Remote:           NONE
+  Modem:            RTS/CTS
+  Direct-Serial:    NONE
+  TCPIP:            NONE
+
+   The size of the table and values for each connection type can vary from
+   platform to platform. Type "set flow ?" for a list of available
+   flow-control types.
+
+   The table is used to automatically select the appropriate kind of flow
+   control whenever you make a connection. You can display the table with:
+
+  SHOW FLOW-CONTROL
+
+   The defaults are as follows:
+
+   Remote:
+          NONE or XON/XOFF. This is because C-Kermit is not allowed to
+          find out what type of connection the incoming user has (*). No
+          kind of flow control will work on every kind of connection,
+          including (unexpectedly) KEEP, which we would have liked to use,
+          but not turning off flow control at the remote end during file
+          transfer on TCP/IP connections is fatal to the transfer (except
+          in VMS and HP-UX, where it must be set to Xon/Xoff!) Therefore
+          if you are dialing in to a serial port on a server (UNIX or VMS)
+          where C-Kermit is running, you will need to tell C-Kermit to
+          "set flow keep" before transferring files (assuming the modem
+          and port are configured correctly by the system administrator;
+          otherwise you'll need to give a specific kind of flow control,
+          e.g. "set flow xon/xoff"), so in this case C-Kermit will not
+          disable flow control, as it must do when you are coming via
+          Telnet (directly or through a terminal server, except on VMS and
+          HP-UX).
+
+   Modem:
+          This applies when you dial out with a modem. In this case, the
+          MODEM FLOW-CONTROL setting takes affect after the SET FLOW
+          setting, so it can pick the most appropriate flow control for
+          the combination of the particular modem and the
+          computer/port/driver that is dialing.
+
+   Direct-Serial:
+          The default here is NONE because C-Kermit has no way of knowing
+          what kind of flow control, if any, is or can be done by the
+          device at the other end of the connection. RTS/CTS would be a
+          bad choice here, because if the CTS signal is not asserted, the
+          connection will hang. And since direct connections are often
+          made with 3-wire cables, there is a good chance the CTS signal
+          will not be received.
+
+   TCPIP:
+          NONE, since TCP and IP provide their own flow control
+          transparently to the application, except in VMS, where Xon/Xoff
+          is the default due to the requirements of the VMS TCP/IP
+          products.
+
+   Other networks:
+          NONE, since networks should provide their flow control
+          transparently to the application.
+
+   (*) This is possibly the worst feature of UNIX, VMS, and other
+   platforms where C-Kermit runs. If C-Kermit was able to ask the
+   operating system what kind of connection it had to the user, it could
+   set up many things for you automatically.
+
+   You can modify the default-flow-control table with:
+
+  SET FLOW-CONTROL /xxx { NONE, KEEP, RTS/CTS, XON/XOFF, ... }
+
+   where "xxx" is the connection type, e.g.
+
+  SET FLOW /REMOTE NONE
+  SET FLOW /DIRECT RTS/CTS
+
+   If you leave out the switch, SET FLOW works as before, choosing the
+   flow control method to be used on the current connection:
+
+  SET FLOW XON/XOFF
+
+   Thus, whenever you make a connection with SET PORT, SET LINE, DIAL, SET
+   HOST, TELNET, RLOGIN, etc, an appropriate form of flow control is
+   selected automatically. You can override the automatic selection with a
+   subsequent SET FLOW command, such as SET FLOW NONE (no switch
+   included).
+
+   The flow control is changed automatically too when you give a SET MODEM
+   TYPE command. For example, suppose your operating system (say Linux)
+   supports hardware flow control (RTS/CTS). Now suppose you give the
+   following commands:
+
+  set line /dev/ttyS2    ; Automatically sets flow to NONE
+  set modem type usr     ; Automatically sets flow to RTS/CTS
+  set modem type rolm    ; Doesn't support RTS/CTS so now flow is XON/XOFF
+
+   IMPORTANT: This new feature tends to make the order of SET LINE/HOST
+   and SET FLOW commands matter, where it didn't before. For example, in
+   VMS:
+
+  SET FLOW KEEP
+  SET LINE TTA0:
+
+   the SET LINE undoes the SET FLOW KEEP command; the sequence now must
+   be:
+
+  SET FLOW /DIRECT KEEP
+  SET LINE TTA0:
+
+   or:
+
+  SET LINE TTA0:
+  SET FLOW KEEP
+
+2.14. Trapping Connection Establishment and Loss
+
+   If you define a macro called ON_OPEN, it is executed any time that a
+   SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or similar command
+   succeeds in opening a connection. The argument is the host or device
+   name (as shown by SHOW COMMUNICATIONS, and the same as \v(line)). This
+   macro can be used for all sorts of things, like automatically setting
+   connection- or host-specific parameters when the connection is opened.
+   Example:
+
+  def ON_OPEN {
+      switch \%1 {
+        :abccorp.com, set reliable off, break
+        :xyzcorp.com, set receive packet-length 1000, break
+        etc etc...
+      }
+  }
+
+   If you define a macro called ON_CLOSE, it will be executed any time
+   that a SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or any other kind
+   of connection that C-Kermit has made is closed, either by the remote or
+   by a local CLOSE, HANGUP, or EXIT command or other local action, such
+   as when a new connection is opened before an old one was explicitly
+   closed.
+
+   As soon as C-Kermit notices the connection has been closed, the
+   ON_CLOSE macro is invoked at (a) the top of the command parsing loop,
+   or (b) when a connection is closed implicitly by a command such as SET
+   LINE that closes any open connection prior to making a new connection,
+   or (c) when C-Kermit closes an open connection in the act of exiting.
+
+   The ON_CLOSE macro was inspired by the neverending quest to unite
+   Kermit and SSH. In this case using the "tunnel" mechanism:
+
+  def TUNNEL {                                ; \%1 = host to tunnel to
+      local \%p
+      if not def \%1 stop 1
+      assign tunnelhost \%1                   ; Make global copy
+      undef on_close
+      set macro error off
+      close connection                        ; Ignore any error
+      open !read tunnel start \%1
+      read \%p                                ; Get port number
+      if fail stop 1 Tunnel failure: \%1
+      close read
+      if fail stop 1 Tunnel failure: \%1      ; See [432]Section 4.2.8.1
+      assign on_close {                       ; Set up close handler
+          echo Closing tunnel: \m(tunnelhost)
+          !tunnel stop \m(tunnelhost)
+          undef on_close
+      }
+      set host localhost:\%p /telnet
+      if success end 0
+      undef on_close
+      stop 1 Connection failure: \%1
+  }
+
+   In this case, when the connection stops, we also need to shut down the
+   tunnel, even if it is at a later time after TUNNEL has finished
+   executing. This way we can escape back, reconnect, transfer files, and
+   so on until the connection is broken by logging out from the remote, or
+   by explicitly closing it, or by EXITing from C-Kermit, at which time
+   the tunnel is shut down.
+
+   When the connection is closed, no matter how, the ON_CLOSE macro
+   executes and then undefines (destroys) itself, since we don't want to
+   be closing tunnels in the future when we close subsequent connections.
+
+   Other such tricks can be imagined, including ending ON_CLOSE with a
+   STOP command to force the command stack to be peeled all the way back
+   to the top, for example in a deeply nested script that depends on the
+   connection being open:
+
+  def on_close { stop 1 CONNECTION LOST }
+
+   When C-Kermit invokes the ON_CLOSE macro, it supplies one argument
+   (\%1): the reason the connection was closed as a number, one of the
+   following:
+
+  2 - Fatal failure to negotiate a required item on a network connection.
+  1 - Closed by C-Kermit command.
+  0 - All others (normally closed by remote).
+
+   which may be used for any purpose; for example, to add a comment to the
+   connection log:
+
+  def on_close {
+      local \%m
+      if not open cx end 0
+      switch \%1 {
+        :0, .\%m = Closed by remote, break
+        :1, .\%m = Closed by me, break
+        :2, .\%m = Network protocol negotiation failure, break
+      }
+      if def \%m writeln cx {# \%m}
+  }
+
+2.15. Contacting Web Servers with the HTTP Command
+
+   C-Kermit 7.0 (at this writing, the UNIX version only) supports direct
+   contact and interaction with Web servers via HTTP 1.0 protocol. To make
+   a connection, use Kermit's normal method for making a TCP/IP
+   connection, but specify the HTTP port:
+
+  SET HOST host http [ switches ]
+
+   where host is the IP hostname or address, and http is the name of the
+   TCP port for the Web server. Relevant switches include:
+
+   /RAW
+          Treat the connection as a transparent binary pipe. This switch
+          may be required if a port other than 'http' is used.
+
+   /SSL
+          Make an secure private connection with SSL (only if SSL support
+          is included in your version of Kermit). In this case the port
+          name might need to be https rather than http, e.g. "set host
+          secureserver.xyxcorp.com https /ssl".
+
+   /TLS
+          Make an secure private connection with TLS (only if TLS support
+          is included in your version of Kermit). In this case the port
+          name would be https rather than http.
+
+   Then you can issue an HTTP command. In most cases, the server closes
+   the connection when the command is complete. Example:
+
+  SET HOST www.columbia.edu http
+  IF FAIL EXIT 1 Can't contact server
+  HTTP GET kermit/index.html
+
+   At this point the connection is closed, since that's how HTTP 1.0
+   works. If you want to perform additional operations, you must establish
+   a new connection with another SET HOST command.
+
+   The HTTP command acts as a client to the Web server, except instead of
+   displaying the results like a Web browser would, it stores them. Any
+   HTTP command can (but need not) include any or all of the following
+   switches:
+
+   /AGENT:user-agent
+          Identifies the client to the server; "C-Kermit" or "Kermit-95"
+          by default.
+
+   /HEADER:header-line
+          Used for specifying any optional headers. A list of headers is
+          provided using braces for grouping:
+
+  /HEADER:{{tag:value}{tag:value}...}
+
+          For a listing of valid tag value and value formats see [433]RFC
+          1945: Hypertext Transfer Protocol -- HTTP/1.0. A maximum of
+          eight headers may be specified.
+
+   /USER:name
+          In case a page requires a username for access.
+
+   /PASSWORD:password
+          In case a page requires a password for access.
+
+   /ARRAY:arrayname
+          Tells Kermit to store the response headers in the given array,
+          one line per element. The array need not be declared in advance.
+          Example:
+
+  C-Kermit? http /array:c get kermit/index.html
+  C-Kermit? show array c
+  Dimension = 9
+  1. Date: Fri, 26 Nov 1999 23:12:22 GMT
+  2. Server: Apache/1.3.4 (Unix)
+  3. Last-Modified: Mon, 06 Sep 1999 22:35:58 GMT
+  4. ETag: "bc049-f72-37d441ce"
+  5. Accept-Ranges: bytes
+  6. Content-Length: 3954
+  7. Connection: close
+  8. Content-Type: text/html
+
+   As you can see, the header lines are like MIME e-mail header lines:
+   identifier, colon, value. The /ARRAY switch is the only method
+   available to a script to process the server responses for a POST or PUT
+   command.
+
+   The HTTP commands are:
+
+   HTTP [ switches ] GET remote-filename [ local-filename ]
+          Retrieves the named file. If a local-filename is given, the file
+          is stored locally under that name; otherwise it is stored with
+          its own name.
+
+   HTTP [ switches ] HEAD remote-filename local-filename
+          Like GET except without actually getting the file; instead it
+          gets only the headers, storing them into the given file, whose
+          name must be given, one line per header item, as shown above in
+          the /ARRAY: switch description.
+
+   HTTP [ switches ] INDEX remote-directory [ local-filename ]
+          Retrieves the file listing for the given server directory. NOTE:
+          This command is not supported by most Web servers.
+
+   HTTP [ switches ] POST [ /MIME-TYPE:type ] local-file remote-file
+          Used to send a response as if it were sent from a form. The data
+          to be posted must be read from a file.
+
+   HTTP [ switches ] PUT [ /MIME-TYPE:type ] local-file remote-file
+          Uploads a local file to a server file.
+
+   HTTP [ switches ] DELETE remote-filename
+          Instructs the server to delete the specified filename.
+
+3. TERMINAL CONNECTION
+
+3.1. CONNECT Command Switches
+
+   The following switches (see [434]Section 1.5) were added to the CONNECT
+   command in 7.0:
+
+   /QUIETLY
+          Don't print the "Connecting to..." or "Back at..." messages. CQ
+          is an invisible command synonym for CONNECT /QUIETLY.
+
+   /TRIGGER:string
+          Specify a trigger or triggers ([435]Section 3.2) effective for
+          this CONNECT command only, temporarily overriding any current
+          SET TERMINAL TRIGGER values ([436]Section 3.2).
+
+   Note: Other switches might also be available; type "connect ?" for a
+   list, "help connect" for a description of each.
+
+3.2. Triggers
+
+   Triggers were added for UNIX, VMS, AOS/VS, and K95 in C-Kermit 7.0.
+
+   SET TERMINAL TRIGGER string
+          Tells C-Kermit to look for the given string during all
+          subsequent CONNECT sessions, and if seen, to return to command
+          mode automatically, as if you had escaped back manually. If the
+          string includes any spaces, you must enclose it in braces.
+          Example:
+
+  set terminal trigger {NO CARRIER}
+
+   Comparisons are made after character-set translation.
+
+   If a string is to include a literal brace character, precede it with a
+   backslash:
+
+  ; My modem always makes this noise when the connection is lost:
+  set terminal trigger |||ppp\{\{\{\{UUUUUUU
+
+   If you want Kermit to look for more than one string simultaneously, use
+   the following syntax:
+
+  set terminal trigger {{string1}{string2}...{stringn}}
+
+   In this case, C-Kermit will return to command mode automatically if any
+   of the given strings is encountered. Up to 8 strings may be specified.
+
+   If the most recent return to command mode was caused by a trigger, the
+   new variable, \v(trigger), shows the trigger value; otherwise
+   \v(trigger) is empty.
+
+   The SHOW TRIGGER command displays the SET TERMINAL TRIGGER values as
+   well as the \v(trigger) value.
+
+3.3. Transparent Printing
+
+   As noted in the manual, C-Kermit's CONNECT command on UNIX is not a
+   terminal emulator, but rather a "semitransparent pipe" between the
+   terminal or emulator you are using to access C-Kermit, and the remote
+   host to which C-Kermit is connected. The "semitransparent" qualifier is
+   because of character-set translation as well as several actions taken
+   by the emulator in response to the characters or strings that pass
+   through it, such as APCs, Kermit packets (autodownload), triggers, etc.
+
+   The UNIX version of C-Kermit 7.0 adds another such action: Transparent
+   printing, also called Controller printing (as distinct from Autoprint
+   or line or screen print). It is intended mainly for use on UNIX
+   workstation consoles (as opposed to remote logins), but with some care
+   can also be used when accessing C-Kermit remotely.
+
+   Transparent printing is related to APC by sharing C-Kermit's built-in
+   ANSI escape-sequence parser to detect "printer on" and "printer off"
+   sequences from the host. When the printer-on sequence is received, all
+   subsequent arriving characters -- including NUL, control characters,
+   and escape sequences -- are sent to the SET PRINTER device instead of
+   to your screen until the printer-off sequence is received, or you
+   escape back, whichever happens first. These bytes are not translated or
+   modified or filtered in any way by Kermit (except for possibly
+   stripping of the 8th bit, as noted below), but if filtering or
+   translation is desired, this can be accomplished by your SET PRINTER
+   selection (e.g. by choosing a pipeline of filters).
+
+   By default, your SET PRINTER device is your default UNIX printer, but
+   it can also be a file, a command, or the null device (which causes all
+   printer material to be discarded). See [437]Using C-Kermit, 2nd Ed.,
+   p.41 for details.
+
+   Transparent printing is controlled by the command:
+
+   SET TERMINAL PRINT { ON, OFF }
+          When ON, transparent-print sequences are obeyed, and printing
+          occurs on the system where C-Kermit is running. When OFF,
+          transparent print sequences are ignored and passed through to
+          your actual terminal or emulator, along with the data they
+          enclose. OFF is the default, for compatibility with earlier
+          C-Kermit releases. As noted in the manual, when the current SET
+          PRINTER device is a file, transparent-print material is appended
+          to it; the file is not overwritten.
+
+   SET TERMINAL BYTESIZE { 7, 8 }
+   SET PARITY { EVEN, ODD, MARK, SPACE, NONE }
+          If the terminal bytesize is 7, or PARITY is not NONE, the 8th
+          bit of each byte is stripped prior to printing.
+
+   The transparent-print escape sequences are:
+
+   <ESC>[5i
+          Printer On. Send all subsequent incoming bytes to the printer
+          without any kind of filtering, translation, or alteration. Note:
+          <ESC> stands for ASCII character number 27 (decimal), Escape.
+
+   <ESC>[4i
+          Printer Off. Resume displaying incoming bytes on the screen.
+
+   These are the same sequences used by DEC VT100 and higher terminals and
+   other ANSI X3.64 and ISO 6429 compatible terminals. There is no
+   provision for selecting other printer-control sequences.
+
+   Restrictions:
+
+    1. You must SET TERM TRANSPARENT-PRINT ON before you can use this
+       feature.
+    2. Only the 7-bit forms of the escape sequences are supported. The
+       8-bit CSI C1 control is not recognized.
+    3. Autoprint is not supported, since this requires a full-fledged
+       terminal emulator with direct access to the screen.
+    4. The start-print and stop-print sequences pass through to the screen
+       (there is no way to avoid this without causing unacceptable delays
+       or deadlocks in CONNECT mode). Thus if your terminal or emulator
+       also supports transparent printing via these same sequences, an
+       empty file will be sent to its printer. Normally this has no
+       effect.
+
+   Point (4) is similar to the situation with autodownload and APC -- when
+   you have several Kermit clients in a chain, you should take care that
+   these features are enabled in only one of them.
+
+   Example 1:
+
+  set printer {|lpr -Plaser}  ; Specify the printer (if not default).
+  set term print on           ; Enable transparent printing.
+  set term byte 8             ; Enable 8-bit characters.
+  connect                     ; Enter CONNECT mode.
+
+   Example 2:
+
+  set printer /home/users/olga/printer.log  ; Send printer material to a file.
+
+   Example 3:
+
+  set printer {| grep -v ^Received | lpr}   ; Filter out some lines
+
+   Then use "pcprint" or "vtprint" commands on the host to initiate
+   transparent print operations. See [438]Using C-Kermit, 2nd Ed., p.406
+   for details.
+
+   Here is a sample "pcprint" shell script for UNIX:
+
+  #!/bin/sh
+  echo -n '<ESC>[5i'
+  if [ $# -eq 0 ]; then
+    cat
+  else
+    cat $*
+  fi
+  echo -n '<FF><ESC>[4i'
+  # (end)
+
+   (Replace "<ESC>" by the actual ASCII Escape character and "<FF>" by the
+   ASCII Formfeed character).
+
+   If you always want transparent printing enabled, put "set term print
+   on" in your C-Kermit customization file (~/.mykermrc in UNIX). The "set
+   term bytesize" selection, however, is a property of each separate
+   connection.
+
+3.4. Binary and Text Session Logs
+
+   C-Kermit 7.0 corrects an oversight in earlier releases, in which binary
+   session logs (SET SESSION-LOG BINARY) translated character sets and
+   performed various formatting transformations (e.g. "newline mode")
+   before writing characters to the session log. In C-Kermit 7.0,
+   binary-mode session logging writes characters as they come in, before
+   anything (other that parity-bit stripping) is done to them. Text-mode
+   session logging records the characters after processing.
+
+4. FILE TRANSFER
+
+   Every file is transferred either in text mode (which implies
+   record-format and character-set translation) or binary mode (in which
+   each byte is sent literally without any kind of conversion). The mode
+   in which a file is transferred is controlled by (a) the default mode,
+   in the absence of any other indications; (b) the SET FILE TYPE command;
+   (c) various automatic mechanisms based on client/server negotiations,
+   directory information or filename patterns, etc.
+
+   The default FILE TYPE was changed from TEXT to BINARY in C-Kermit 7.0
+   because:
+
+     * Transferring a text file in binary mode does less damage than
+       transferring a binary file in text mode.
+     * Only binary-mode transfers can be recovered from the point of
+       failure.
+     * The automatic transfer-mode mechanisms switch to text mode on a
+       per-file basis anyway, so only those files that are not covered by
+       the automatic mechanisms are affected.
+     * All file transfers on the Web are done in binary mode, so people
+       are accustomed to it and expect it.
+
+4.0. BUG FIXES, MINOR CHANGES, AND CLARIFICATIONS
+
+4.0.0. Filenames with Spaces
+
+   Filenames that contain spaces are a major nuisance to a program like
+   Kermit, whose command language is line- and word-oriented, in which
+   words are separated by spaces and a filename is assumed to be a "word".
+   In general (unless noted otherwise in the description of a particular
+   command), there is only one way to refer to such files in Kermit
+   commands, and that is to enclose the name in braces:
+
+  send {this file}
+
+   Tells Kermit to send the file whose name is "this file" (two words, no
+   quotes). Of course, various circumlocutions are also possible, such as:
+
+  define \%a this file
+  send \%a
+
+   BUT, perhaps contrary to expectation, you can't use "\32" to represent
+   the space:
+
+  send this\32file
+
+   does not work. Why? Because the Kermit parser, which must work on many
+   operating systems including Windows, has no way of knowing what you
+   mean by "this\32file". Do you mean a file whose name is "this file" in
+   the current directory? Or do you mean a file whose name is "32file" in
+   the "this" subdirectory of the current directory? Guessing won't do
+   here; Kermit must behave consistently and deterministically in all
+   cases on all platforms.
+
+   Note that you can't use Esc or Tab within {...} for filename
+   completion, or question mark to get a filename list. However, you can
+   include wildcards; for example:
+
+  send {* *}
+
+   sends all files whose name contains a space.
+
+   All things considered, it is best to avoid spaces in file and directory
+   names if you can. Also see [439]Section 5.4 on this topic.
+
+4.0.1. Packet out of Window
+
+   C-Kermit 6.0 could send packets "out of window" if the window size was
+   greater than 1 and ACKs had arrived out of order. Fixed in 6.1.
+
+4.0.2. MOVE after ADD SEND-LIST
+
+   ADD SEND-LIST followed by MOVE did not delete original files; fixed in
+   6.1. Carrier loss was not detected during transfer; in 7.0 C-Kermit
+   checks for this (but results can not be guaranteed). In any case, the
+   protocol will eventually time out if the connection is lost.
+
+4.0.3. GET and RECEIVE As-Names
+
+   In 5A(190) through 6.0.192, the GET and RECEIVE as-name did not
+   properly override the RECEIVE PATHNAMES setting. In 7.0 it does.
+
+4.0.4. New Brief Statistics Listing
+
+   Version 7.0 adds a /BRIEF switch to the STATISTICS command, to display
+   a short file-transfer statistics report. /BRIEF is now the default. Use
+   /VERBOSE to see the full display, which is about 25 lines long.
+
+4.0.5. Improved FAST Command
+
+   The preinstalled definition of the FAST macro did not take enough
+   factors into account. Now it sets packet lengths and window sizes
+   appropriate to the configuration. Furthermore, in IRIX only, it might
+   restrict the SEND packet length to 4000, to work around a bug in the
+   IRIX Telnet server, depending on the IRIX version (see [440]ckubwr.txt,
+   IRIX section). To see the built-in definition of the FAST macro, type
+   "show macro fast". To change it, simply define it to be whatever you
+   want -- it's just a macro, like any other.
+
+4.0.6. The SET SEND BACKUP Command
+
+   Version 7.0 adds SET SEND BACKUP { ON, OFF }. This tells whether backup
+   files should be sent. Backup files are the ones created by Kermit (and
+   EMACS, and possibly other applications) to preserve old copies of files
+   when creating new ones with the same name. Kermit does this when
+   receiving a file and its FILE COLLISION setting is BACKUP (or RENAME,
+   in which case it the new file gets the backup name). On most platforms,
+   the backup name is formed by adding:
+
+  .~n~
+
+   to the end of the filename, where "n" is a number. For example, if the
+   original file is oofa.txt, a backup file might be called:
+
+  oofa.txt.~1~
+
+   (or oofa.txt.~2~, etc). If you SET SEND BACKUP OFF, this tells Kermit
+   not to send files that have backup names. Normally, SET SEND BACKUP is
+   ON (as shown by SHOW PROTOCOL), and backup files are sent if their
+   names match the SEND file specification.
+
+   Also see PURGE, SET FILE COLLISION, SEND /NOBACKUP, DIRECTORY
+   /[NO]BACKUP.
+
+4.0.7. The SET { SEND, RECEIVE } VERSION-NUMBERS Command
+
+   VMS Only. Normally when sending files, VMS C-Kermit strips the version
+   number. For example, if the file is FOO.BAR;34, the name is sent as
+   FOO.BAR (without the ";34"). If you want to keep version numbers on
+   when sending files, use SET SEND VERSION-NUMBERS ON. The effect depends
+   on the receiver.
+
+   Normally when receiving files, and an incoming filename includes a
+   VMS-style version number (such as FOO.BAR;34) VMS C-Kermit strips it
+   before trying to create the new file; this way the new file receives
+   the next highest version number in the customary manner for VMS. If you
+   want version numbers on incoming filenames to be used in creating the
+   new files, use SET RECEIVE VERSION-NUMBERS ON.
+
+   Normally these commands would be effective only when VMS C-Kermit is
+   exchanging files with a non-VMS Kermit program, since VMS-to-VMS
+   transfers use labeled mode unless you have gone out of your way to
+   defeat it.
+
+   Example: You want to send all versions of all files in the current
+   directory from a VMS C-Kermit client to a UNIX C-Kermit server. Use:
+
+  set send version-numbers on
+  send *.*;*
+
+   The resulting Unix files will have VMS-style version numbers as part of
+   their name, for example "foo.bar;1", "foo.bar;2", etc.
+
+   Now suppose you want to send these files from Unix to another VMS
+   system and preserve the version numbers. Again we have a Unix C-Kermit
+   server and VMS C-Kermit client. Give these commands to the client:
+
+  set receive version-numbers on
+  get *
+
+4.0.8. The SET { SEND, RECEIVE } { MOVE-TO, RENAME-TO } Commands
+
+   These commands are persistent global versions of the /MOVE-TO: and
+   /RENAME-TO: switches of the SEND, GET, and RECEIVE commands. They
+   should normally be used only when setting up a dedicated
+   transaction-processing application, in which each file is to be moved
+   or renamed immediately after, and only if, it is transferred
+   successfully, so that (for example) an independent, concurrent process
+   can notice when new files appear and process them immediately without
+   having to guess whether they are complete.
+
+4.0.9. SET FILE INCOMPLETE AUTO
+
+   SET FILE INCOMPLETE { KEEP, DISCARD }, which tells whether to keep or
+   discard incompletely received files, has a new option, AUTO, which is
+   also the default. It means KEEP the incomplete file if the transfer is
+   in binary mode, otherwise DISCARD it. This reduces the chances that a
+   subsequent recovery operation (RESEND, REGET, etc) could produce a
+   corrupt file, since recovery works only for binary-mode transfers.
+
+4.1. FILE-TRANSFER FILENAME TEMPLATES
+
+   File-transfer filename templates allow files to be renamed
+   automatically by the file sender, the receiver, or both, during
+   transfer of groups of files.
+
+4.1.1. Templates in the As-Name
+
+   Prior to C-Kermit 6.1 and Kermit 95 1.1.12 the only options that could
+   be used to affect the names of files being transferred were SET
+   FILENAMES { LITERAL, CONVERTED } and SET { SEND, RECEIVE } PATHNAMES {
+   ON, OFF }, plus the "as-name" feature of the SEND (MOVE, etc) and
+   RECEIVE commands.
+
+   Previously, the as-name could be used only for a single file. For
+   example:
+
+  SEND FOO BAR
+
+   would send the file FOO under the name BAR, but:
+
+  SEND *.TXT anything
+
+   was not allowed, since it would give the same name to each file that
+   was sent. When receiving:
+
+  RECEIVE FOO
+
+   would rename the first incoming file to FOO before storing it on the
+   disk, but subsequent files would not be renamed to FOO, since this
+   would result in overwriting the same file repeatedly. Instead, they
+   were stored under the names they arrived with.
+
+   Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to
+   specify as-names in SEND, RECEIVE, and related commands even for file
+   groups. This is accomplished by using replacement variables in the
+   as-name, along with optional material such character-string functions
+   and/or constant strings. An as-name containing replacement variables is
+   called a filename template.
+
+   The key to filename templates is the new variable:
+
+  \v(filename)
+
+   During file transfer it is replaced by the name of each file currently
+   being transferred (after transfer, it is the name of the last file
+   transferred).
+
+   So, for example:
+
+  send *.txt \v(filename).new
+
+   sends each file with its own name, but with ".new" appended to it. Of
+   course if the name already contains periods, this could confuse the
+   file receiver, so you can also achieve fancier effects with
+   constructions like:
+
+  send *.txt \freplace(\v(filename),.,_).new
+
+   which replaces all periods in the original filename by underscores, and
+   then appends ".new" to the result. So, for example, oofa.txt would be
+   sent as oofa_txt.new.
+
+   Another new variable that is useful in this regard is \v(filenumber),
+   which is the ordinal number of the current file in the file group, so
+   you can also:
+
+  send *.txt FILE\flpad(\v(filenum),2,0)
+
+   resulting in a series of files called FILE00, FILE01, FILE02, etc. (At
+   the end of the transfer, \v(filenum) tells the number of files that
+   were transferred).
+
+   If you specify a constant as-name when sending a file group:
+
+  send *.txt thisnameonly
+
+   Kermit complains and asks you to include replacement variables in the
+   as-name. You should generally use \v(filename) or \v(filenumber) for
+   this purpose, since other variables (with the possible exception of
+   date/time related variables) do not change from one file to the next.
+   But Kermit accepts any as-name at all that contains any kind of
+   variables for file group, even if the variable will not change. So:
+
+  send *.txt \%a
+
+   is accepted, but all files are sent with the same name (the value of
+   \%a, if it has one and it is constant). If the variable has no value at
+   all, the files are sent under their own names.
+
+   Of course, the value of \%a in the previous example need not be
+   constant:
+
+  define \%a FILE\flpad(\v(filenum),2,0)_at_\v(time)
+  send *.txt \%a
+
+   The RECEIVE command, when given without an as-name, behaves as always,
+   storing all incoming files under the names they arrive with, subject to
+   SET FILE NAME and SET RECEIVE PATHNAMES modifications ([441]Section
+   4.10).
+
+   However, when an as-name is given in the RECEIVE command, it is applied
+   to all incoming files rather than to just the first. If it does not
+   contain replacement variables, then the current FILE COLLISION setting
+   governs the result. For example:
+
+  receive foo
+
+   will result in incoming files named foo, foo.~1~, foo.~2~, and so on,
+   with the default FILE COLLISION setting of BACKUP. If it does contain
+   replacement variables, of course they are used.
+
+   When receiving files, the \v(filename) variable refers to the name that
+   was received in the incoming file-header packet, BEFORE any processing
+   by SET FILE NAMES or SET RECEIVE PATHNAMES. Since the filenames in
+   file-header packets are usually in uppercase, you would need to convert
+   them explicitly if you want them in lowercase, e.g.:
+
+  receive \flower(\v(filename)).new
+
+4.1.2. Templates on the Command Line
+
+   On the command-line, use templates as shown above as the -a option
+   argument, bearing in mind the propensity of UNIX and perhaps other
+   shells to treat backslash as a shell escape character. So in UNIX (for
+   example):
+
+  kermit -s oofa.* -a x.\\v(filenum)
+
+   By the way, this represents a change from 6.0 and earlier releases in
+   which the as-name (-a argument or otherwise) was not evaluated by the
+   command parser. Thus, for example, in VMS (where the shell does not
+   care about backslashes), it was possible to:
+
+  kermit -s oofa.txt -a c:\tmp\oofa.txt
+
+   Now backslashes in the as-name must be quoted not only for the shell
+   (if necessary) but also for Kermit itself:
+
+  kermit -s oofa.txt -a c:\\tmp\\oofa.txt      ; Kermit only
+  kermit -s oofa.txt -a c:\\\\tmp\\\\oofa.txt  ; Shell and Kermit
+
+   You can also use the \fliteral() function for this:
+
+  kermit -s oofa.txt -a \fliteral(c:\tmp\oofa.txt)      ; Kermit only
+  kermit -s oofa.txt -a \\fliteral(c:\\tmp\\oofa.txt)   ; Shell and Kermit
+
+4.1.3. Post-Transfer Renaming
+
+   Filename templates are now also useful in SET { SEND, RECEIVE }
+   RENAME-TO and in the /RENAME-TO: switch, that can be given to the SEND,
+   GET, or RECEIVE commands; this is similar to an as-name, but is
+   effective on a per-file basis if and only if the file was transferred
+   successfully.
+
+   MOVE-TO and RENAME-TO address a requirement commonly stated for
+   transaction processing and similar systems. Suppose, for example, a
+   central system "X" accepts connections from multiple clients
+   simultaneously; a process on X waits for a file to appear and then
+   processes the file. This process must have a way of knowing when the
+   file has been completely and successfully transferred before it starts
+   to process it. This can be accomplished easily using C-Kermit's SET {
+   SEND, RECEIVE } { MOVE-TO, RENAME-TO } command or /MOVE-TO: or
+   /RENAME-TO: switches, described in [442]Sections 4.7.1 through
+   [443]4.7.3.
+
+   Here's an example for the client side, in which files to be sent are
+   placed in a certain directory (/usr/olga/tosend in this example) by
+   another process when they are ready to go. This might be in a hospital
+   or big doctor's office, where medical insurance claims are entered at a
+   number of workstations, and then deposited in the "tosend" directory,
+   from which they are sent to a claims clearinghouse. We assume the
+   connection is already made and a Kermit server is on the other end.
+
+  local srcdir findir              ; Declare local (automatic) variables
+  assign srcdir /usr/olga/tosend   ; Local source directory (files to send)
+  assign findir /usr/olga/sent     ; Where to move files after they are sent
+  log transactions                 ; Keep a log of transfers
+  cd \m(srcdir)                    ; Change to the source directory
+  while true {                     ; Loop forever...
+      send /move-to:\m(findir) *   ; Send all files
+      sleep 60                     ; Sleep a minute
+  }                                ; Go back and do it again
+
+   Note how simple this is. Once each file is sent, it is moved so it
+   won't be sent again (you could also use SEND /RENAME-TO: or even SEND
+   /DELETE). If a transfer fails, the file is not moved and so we try
+   again to send it next time around. If there are no files to send, the
+   SEND command does nothing but a message is printed; you can avoid the
+   message by checking first to see if any files are in the directory:
+
+  while true {                     ; Loop forever...
+      if > \ffiles(*) 0 -          ; If there are any files
+        send /move-to:\m(findir) * ; send them.
+      sleep 60                     ; Sleep a minute.
+  }                                ; Go back and do it again.
+
+   It's even simpler on the server side (here again we assume the
+   connection is already in place):
+
+  local rcvdir findir              ; Declare local (automatic) variables
+  assign rcvdir /usr/ivan/tmp      ; Temporary receiving directory
+  assign findir /usr/ivan/new      ; Where to move files after reception
+  log transactions                 ; Keep a log of transfers
+  cd \m(rcvdir)                    ; Change to the source directory
+  set receive move-to \m(findir)   ; Declare move-to directory.
+  server                           ; Enter server mode.
+
+   A separate process (e.g. the medical claim-form decoder) can look for
+   files appearing in the /usr/ivan/new directory and process them with
+   every confidence that they have been completely received.
+
+   Note that the use of MOVE-TO can result in moved files overwriting one
+   another (the application would normally avoid this by assigning each
+   transaction a unique, e.g. based on customer number and claim number).
+   But if filename collisions are a possibility in your application,
+   RENAME-TO might be a better choice; you can use any variables you like
+   in the template to ensure uniqueness of the RENAME-TO filename; for
+   example:
+
+  SET RECEIVE RENAME-TO \v(filename)_\v(ndate)_\v(ntime)_\v(userid)_\v(pid)
+
+4.2. FILE-TRANSFER PIPES AND FILTERS
+
+4.2.1. INTRODUCTION
+
+   Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to send
+   from a command, or "pipe", as well as from a file, and to receive to a
+   pipe or command. In a typical example, we might want to transfer an
+   entire directory tree from one UNIX system to another (but without
+   using the methods described in [444]Sections 4.3 , [445]4.10,
+   [446]4.11, and [447]4.15). We could do this in multiple steps as
+   follows:
+
+  1. Create a tar archive of the desired directory tree
+  2. Compress the tar archive
+  3. Transfer it in binary mode to the other computer
+  4. Decompress it
+  5. Extract the directory tree from the tar archive
+
+   But this is inconvenient and it requires a temporary file, which might
+   be larger than we have room for.
+
+   The new pipe-transfer feature lets you do such things in a single step,
+   and without intermediate files.
+
+   Additional new features, also discussed here, let you specify pre- and
+   post- processing filters for outbound and incoming files, and give you
+   a way to insert the output from shell or system commands into C-Kermit
+   commands.
+
+   The file-transfer related features are available only with Kermit
+   protocol, not with any external protocols, nor with K95's built-in
+   XYZMODEM protocols (because XYZMODEM recovers from transmission errors
+   by rewinding the source file, and you can't rewind a pipe).
+
+   This section begins by discussing the simple and straightforward use of
+   these features in UNIX, in which pipes and input/output redirection are
+   a fundamental component and therefore "just work", and then goes on to
+   discuss their operation in Windows and OS/2, where matters are much
+   more complicated.
+
+4.2.1.1. TERMINOLOGY
+
+   Standard Input
+          This is a precise technical term denoting the normal source of
+          input for a command or program, which is the keyboard of your
+          terminal by default, but which can be redirected to a file or
+          pipe.
+
+   Stdin
+          Abbreviation for Standard Input.
+
+   Standard Output
+          A precise technical term denoting the normal destination for
+          output from a command or program, which is your terminal screen
+          by default, but which can be redirected to a file.
+
+   Stdout
+          Abbreviation for Standard Output.
+
+   Stdio
+          Abbreviation for Standard Input / Standard Output.
+
+   I/O
+          Abbreviation for Input / Output.
+
+   Shell
+          Text-based system command processor, such as the UNIX shell, DOS
+          COMMAND.COM, etc.
+
+   Pipe
+          A mechanism by which the standard output of one program is sent
+          to the standard input of another.
+
+   Pipeline
+          A series of programs connected by pipes.
+
+4.2.1.2. NOTATION
+
+   In command descriptions, "command" is replaced by a shell or system
+   command or pipeline. The command names specified in these commands are
+   interpreted by your shell, just as if you were typing them at the shell
+   prompt, and so if they are in your PATH, they will be found in the
+   expected manner. Therefore you don't have to specify complete pathnames
+   for commands that are programs (but it shouldn't hurt if you do).
+
+   The normal notation for I/O redirection is as follows:
+
+  <  Read Stdin from the given file.
+  >  Send Stdout to the given file.
+  |  Send Stdout from the command on the left to the command on the right.
+
+   Examples:
+
+   sort < foo > bar
+          Sorts the lines in file "foo" and writes the results to file
+          "bar"
+
+   grep -c "some text" *.txt | grep -v ":0" | sort | pr -3 | lpr
+          This is a command pipeline composed of 5 commands:
+
+   grep -c "some text" *.txt
+          Looks in all files whose names end with ".txt" for the string
+          "some text" and writes to Stdout the names of each file followed
+          by a colon and the number of occurrences in each.
+
+   grep -v ":0"
+          Prints to Stdout the lines from Stdin that do NOT contain the
+          string ":0", in this case, it removes the names of files that do
+          not contain "some text".
+
+   sort
+          Sorts the lines from Stdin alphabetically to Stdout.
+
+   pr -3
+          Arranges the lines from Stdin in three columns.
+
+   lpr
+          Prints its Stdin on the default printer.
+
+   Note that the Kermit features described here work only with commands
+   that use Stdio. If you attempt to use them with commands whose input
+   and output can not be redirected, Kermit will most likely get stuck.
+   Kermit has no way of telling how an external command works, nor what
+   the syntax of the shell is, so it's up to you to make sure you use
+   these features only with redirectable commands.
+
+   The quoting rules of your shell apply to the command. Thus in UNIX,
+   where C-Kermit tries to use your preferred shell for running commands,
+   shell "metacharacters" within commands must be escaped if they are to
+   be taken literally, using the methods normal for your shell. For
+   example, the UNIX tr (translate) command must have its arguments in
+   quotes:
+
+  tr "[a-z]" "[A-Z]"
+
+   otherwise the shell is likely to replace them by all filenames that
+   match, which is probably not what you want. This is also true when
+   using your shell directly, and has nothing to do with Kermit.
+
+4.2.1.3. SECURITY
+
+   Some sites might not wish to allow access to system commands or
+   external programs from within Kermit. Such access, including all the
+   features described here, can be disabled in various ways:
+
+    1. When building from source code, include -DNOPUSH among the CFLAGS.
+    2. At runtime, give the NOPUSH command.
+    3. For server mode, give the DISABLE HOST command.
+    4. Implicit use of pipes can be disabled as described in [448]Section
+       4.2.4.
+
+   Note: 3 and 4 are not necessary if you have done 1 or 2.
+
+4.2.2. Commands for Transferring from and to Pipes
+
+   SEND /COMMAND sends data from a command or command pipeline, and
+   RECEIVE /COMMENT writes data to a command or pipeline. The GET /COMMAND
+   command asks a server to send material, and then writes the incoming
+   material to a command or pipeline. These features, along with switches
+   (like "/COMMAND", described in [449]Section 4.7) are new to C-Kermit
+   6.1. The following synonyms are also provided:
+
+  CSEND    = SEND /COMMAND
+  CRECEIVE = RECEIVE /COMMAND
+  CGET     = GET /COMMAND
+
+   None of these commands can be used if a SEND or RECEIVE FILTER
+   (respectively, [450]Section 4.2.3) is in effect, or if a NOPUSH command
+   ([451]Section 4.2.1.3) has been given, or if the current protocol is
+   not Kermit.
+
+4.2.2.1. Sending from a Command
+
+   SEND /COMMAND command [ as-name ]
+   SEND /AS-NAME:as-name /COMMAND command
+   CSEND command [ as-name ]
+          These three forms are the same. They work like the SEND command,
+          but instead of sending a file, it sends the standard output of
+          the given command, either under the command's own name, or else
+          with the given as-name. If the command contains spaces, it must
+          be enclosed in braces. Braces should also be used for the
+          as-name if it contains spaces. If braces are included around
+          either the command or the as-name, they are removed after
+          parsing but before use. As with SEND, the transfer is in text or
+          binary mode according the current FILE TYPE setting, unless you
+          override the global transfer mode by including a /TEXT or
+          /BINARY switch. The command must require no input.
+
+   When sending from a command or pipeline, C-Kermit has no way of knowing
+   in advance how much data will be sent, and so it can not send the size
+   to the other Kermit in the Attribute packet, and so the receiving
+   Kermit has no way of displaying "percent done" or a progress bar
+   (thermometer).
+
+   Examples that make sense in text mode (illustrated by common UNIX
+   commands):
+
+   SEND /COMMAND finger
+   CSEND finger
+          sends the current "finger" listing (who's logged in) under the
+          name "finger". The two forms "send /command" and "csend" are
+          equivalent; we won't bother showing them both in the rest of the
+          examples.
+
+   SEND /COMMAND:{finger}
+   CSEND {finger}
+          Same as previous example (braces are removed from "{finger}").
+
+   SEND /COMMAND:{ finger }
+   CSEND { finger }
+          Same as previous example, but note that the spaces are kept.
+          This does not prevent the shell from running the "finger"
+          program, but its output is sent under the name " finger " (with
+          a leading and trailing space).
+
+   SEND /COMMAND:finger /AS-NAME:userlist
+   CSEND finger userlist
+          sends the current finger listing under the name "userlist".
+
+   SEND /COMMAND:{finger | sort -r} /AS-NAME:userlist
+   CSEND {finger | sort -r} userlist
+          sends the current finger listing, sorted in reverse order, under
+          the name "userlist". The braces are needed to distinguish the
+          command from the as-name.
+
+   SEND /COMMAND:{finger | sort -r} /AS-NAME:{userlist}
+   CSEND {finger | sort -r} {userlist}
+          Same as previous example (braces are removed from "{userlist}").
+
+   SEND /COMMAND:{finger | sort -r}
+          /AS-NAME:{\freplace(\v(filename),\32,_)}
+
+   CSEND {finger | sort -r} {\freplace(\v(filename),\32,_)}
+          Like the previous example, but sends the output of the command
+          under the name of the command, but with all spaces (\32)
+          replaced by underscores, so the as-name is "finger_|_sort_-r".
+
+   Examples that make sense in binary mode (three equivalent forms are
+   shown):
+
+   SEND /COMMAND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
+   SEND /COMMAND /BINARY /AS-NAME:mydir.tar.gz {tar cf - . | gzip -c}
+   CSEND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
+          Makes a tar archive of the current directory, compresses it with
+          the GNU gzip program, and sends it as "mydir.tar.gz". The other
+          Kermit can, of course, just store it as a file, or it can use
+          CRECEIVE to uncompress and dearchive it as part of the transfer
+          process.
+
+   When using a "pipeline" of commands in the command field, obviously,
+   the first command must not require any input, and the last command
+   should produce some output, and all intermediate commands should get
+   some input and produce some output.
+
+4.2.2.2. Receiving to a Command
+
+   RECEIVE /COMMAND command
+   CRECEIVE command
+          This is like RECEIVE, except incoming material is written to the
+          standard input of the given command, in text or binary mode
+          according to the normal rules for file reception. Be sure to
+          include a redirector to a file (if the command normally writes
+          to standard output), or the output of the command won't go
+          anywhere. The command may contain spaces; braces are not needed,
+          but they are removed if used.
+
+   WARNING: C-Kermit has no way of knowing anything about the command, or
+   even whether it is a command. Thus this command will always cause
+   C-Kermit to enter protocol mode, as long as some text is specified in
+   the command field. However, if the text does not correspond to a
+   command, the transfer will eventually fail with a message such as
+   "Error writing data" or "Failure to close file".
+
+   Examples for text mode (in UNIX):
+
+   RECEIVE /COMMAND sort -r > reverse.txt
+   CRECEIVE sort -r > reverse.txt
+          The text that is received is sorted in reverse order and stored
+          in the file "reverse.txt". The two forms shown are equivalent.
+
+   RECEIVE /COMMAND {sort -r > reverse.txt}
+   CRECEIVE {sort -r > reverse.txt}
+          The same as the previous example; if braces are included, they
+          are simply removed.
+
+   RECEIVE /COMMAND {sort -r > \flower(\v(filename)).reverse}
+   CRECEIVE {sort -r > \flower(\v(filename)).reverse}
+          Same but stores result under the incoming filename, lowercased,
+          and with ".reverse" appended to it.
+
+   RECEIVE /COMMAND sort
+   CRECEIVE sort
+          Does nothing useful, since the output of sort has nowhere to go.
+
+   RECEIVE /COMMAND sort -r | pr -3 | lpr -Plaserjet
+   CRECEIVE sort -r | pr -3 | lpr -Plaserjet
+          The text that is received is sorted in reverse order, arranged
+          into three columns, and sent to the "laserjet" printer.
+
+   Examples for binary mode:
+
+   RECEIVE /COMMAND:{gunzip -c | tar xf -}
+   CRECEIVE {gunzip -c | tar xf -}
+          Assuming the data that is received is a compressed tar archive,
+          uncompresses the archive and passes it to tar for extraction. In
+          this case the braces are needed because otherwise the final "-"
+          would be taken as a command continuation character (see
+          [452]Using C-Kermit, 2nd Edition, p.33).
+
+   GET /COMMAND remote-file command
+   GET /COMMAND /AS-NAME:command remote-file
+   CGET remote-file command
+          This command tells the Kermit client to send a GET request for
+          the given remote file to a Kermit server. Unlike GET, however,
+          the incoming material is written to a command, rather than to a
+          file. If the remote-file or the command contain spaces, they
+          must be enclosed in braces. The same cautions about the command
+          apply as for CRECEIVE.
+
+   Examples (for UNIX):
+
+   GET /COMMAND oofa.txt sort -r > oofa.new
+   GET /COMMAND {oofa.txt} {sort -r > oofa.new}
+   CGET oofa.txt sort -r > oofa.new
+   CGET {oofa.txt} {sort -r > oofa.new}
+          These four are equivalent. Each of them requests the server to
+          send its "oofa.txt" file, and as it arrives, it is sorted in
+          reverse order and written to "oofa.new".
+
+   GET /COMMAND {profile exec a} lpr
+   GET /COMMAND {profile exec a} {lpr}
+   GET /COMMAND /AS-NAME:lpr {profile exec a}
+   GET /COMMAND /AS-NAME:{lpr} {profile exec a}
+   GET /COMMAND /AS:lpr {profile exec a}
+   CGET {profile exec a} lpr
+   CGET {profile exec a} {lpr}
+          Here the remote filename contains spaces so it MUST be enclosed
+          in braces. As it arrives it is sent to the lpr program for
+          printing. Braces are optional around "lpr" since it contains no
+          spaces.
+
+   GET /COMMAND *.txt {cat >> new.txt}
+   GET /AS-NAME:{cat >> new.txt} /COMMAND *.txt
+   CGET *.txt {cat >> new.txt}
+          This gets all the ".txt" files from the server and concatenates
+          them all into a single "new.txt" file on the client.
+
+   GET /COMMAND *.txt {echo \v(filename)>>new.txt;cat>>new.txt}
+   CGET *.txt {echo \v(filename)>>new.txt;cat>>new.txt}
+          As above, but inserts each file's name before its contents.
+
+4.2.3. Using File-Transfer Filters
+
+   The commands described in [453]Section 4.2.2 let you send the output of
+   a command, or receive data into a command. But what if you want to
+   specify preprocessing for files that you send, or postprocessing of
+   files that you receive, even when multiple files are involved? For this
+   you need a way to specify send and receive filters. The commands are
+   SET SEND FILTER and SET RECEIVE FILTER; SHOW PROTOCOL displays the
+   current settings.
+
+4.2.3.1. The SEND Filter
+
+   SET SEND FILTER [ command ]
+          This command specifies a command to be run on any file that you
+          SEND (or MOVE, MSEND, etc). It also applies to files sent when
+          in server mode, in response to GET commands, but not to the
+          results of REMOTE commands like REMOTE DIRECTORY, REMOTE TYPE,
+          REMOTE HOST, etc. The command may be, but need not be, enclosed
+          in braces; if it is, the braces are stripped before use. The
+          output of this command is sent, rather than the file itself. The
+          current FILE TYPE setting (TEXT or BINARY) applies to the output
+          of the command. The command must contain at least one instance
+          of \v(filename), for which the name of the actual file is
+          substituted. If the command is omitted, the send filter is
+          removed and files are sent in the normal manner.
+
+   The SET SEND FILTER sets up a "global" filter -- that is, one that
+   applies to all subsequent file-sending commands until you change or
+   remove it. You can also specify a "local" filter to be used in a
+   specific file-sending command by using the /FILTER switch (see
+   [454]Section 1.5); for example:
+
+  SEND /FILTER:command [ other-switches ] filename
+
+   Besides \v(filename), you can include any other script programming
+   notation in the send filter: variable names, array references, calls to
+   built-in string or other functions, and so on. These are evaluated
+   during file transfer, NOT during parsing, and they are evaluated
+   separately for each file.
+
+   When the SEND or MOVE (SEND /DELETE) command is used with a send
+   filter, the output from the filter is sent under the file's original
+   name unless you specify an "as-name" or template. The Attribute packet
+   (if any) contains the original file's attributes (size, creation date,
+   etc). So (for example) if the filter changes the file's size, the
+   progress thermometer might be wrong. (We can't send the size of the
+   output from the filter, because it is not known until the transfer is
+   finished.) If you prefer that the size not be sent, use "set attributes
+   size off".
+
+   You can not use send filters with RESEND (SEND /RECOVER) or PSEND (SEND
+   /START).
+
+   Examples for text mode:
+
+   SET SEND FILTER sort -r \v(filename) ; Braces may be omitted
+   SET SEND FILTER {sort -r \v(filename)} ; Braces may be included
+   SEND *.txt
+          This sends every file in the current directory whose name ends
+          with ".txt" under its own name, but with its lines sorted in
+          reverse order.
+
+   SEND /FILTER:{sort -r \v(filename)} *.txt
+          Same as above, but the filter applies only to this SEND command.
+          Braces are required in this case.
+
+   SET SEND FILTER {sort -r \v(filename)}
+   SEND oofa.txt reverse.txt
+          Sends the oofa.txt file with its lines sorted in reverse order
+          under the name "reverse.txt".
+
+   SET SEND FILTER {sort -r \v(filename)}
+   SEND oofa.* \v(filename).reverse
+          Sends all the oofa.* files with their lines sorted in reverse
+          order; each file is sent under its own name but with ".reverse"
+          appended to it.
+
+   SET SEND FILTER {tr "[a-z]" "[A-Z]" < \v(filename)}
+   SEND *.txt
+          Sends all ".txt" files under their own names, but uppercasing
+          their contents.
+
+   Note that the SEND FILTER applies not only to files that are sent with
+   SEND, MOVE, MSEND, etc, but also to files sent by the C-Kermit server
+   in response to GET requests.
+
+   Examples for binary mode:
+
+   SET SEND FILTER {gzip -c \v(filename)}
+   SEND /BINARY oofa.txt oofa.txt.gz
+          Sends the oofa.txt file, compressed by gzip, as oofa.txt.gz.
+
+   SEND /BINARY /FILTER:{gzip -c \v(filename)} oofa.txt oofa.txt.gz
+          As above, but the filter applies only to this SEND command.
+
+   SET SEND FILTER {gzip -c \v(filename)}
+   SEND /BINARY oofa.* \fupper(\replace(\v(filename),.,_)).GZ
+          Sends all the oofa.* files, compressed by gzip, each under its
+          own name, but with the name uppercased, all periods within the
+          name converted to underscores, and ".GZ" appended to it. So, for
+          example, "oofa.txt" is sent as "OOFA_TXT.GZ".
+
+   In the gzip examples, note that the amount of data that is sent is
+   normally less than the original file size because gzip compresses the
+   file. But Kermit sends the original file size ahead in the attribute
+   packet anyway (unless you tell it not too). Thus the transfer will
+   probably appear to terminate early, e.g. when the receiver's
+   file-transfer display thermometer is only at 40%. If this annoys you,
+   tell Kermit to "set attribute length off". On the other hand, you can
+   use the final position of the thermometer as a measure of the
+   effectiveness of compression.
+
+4.2.3.2. The RECEIVE Filter
+
+   SET RECEIVE FILTER [ command ]
+          This command specifies that the given command will be run on any
+          file that is received before it is written to disk. The command
+          may be, but need not be, enclosed in braces; if it is the braces
+          are stripped before use. The following two commands are
+          equivalent:
+
+  SET RECEIVE FILTER sort -r > \v(filename)
+  SET RECEIVE FILTER {sort -r > \v(filename)}
+
+   The RECEIVE filter command may contain a "\v(filename)" sequence to be
+   replaced by the incoming filename from the file header packet, but it
+   is not required. However you must use it whenever your filter would
+   normally write to Stdout, otherwise its output will be lost.
+
+   The RECEIVE filter command may contain one or more "\v(filename)"
+   sequence to be replaced by the incoming filename from the file header
+   packet, but it is not required. However you must use it whenever your
+   filter would normally write to Stdout, otherwise its output will be
+   lost.
+
+   RECEIVE /FILTER:command and GET /FILTER:command can also be used to
+   specify a filter to be used for only one file-transfer operation.
+
+   UNIX examples for text mode:
+
+   SET RECEIVE FILTER lpr
+   RECEIVE
+          All the files that are received are sent to the default UNIX
+          print spooler.
+
+   RECEIVE /FILTER:lpr
+          Same as above, except the lpr filter is used only with this
+          RECEIVE command.
+
+   RECEIVE lpr
+          This is probably not what you want; it creates a file called
+          lpr.
+
+   SET RECEIVE FILTER {sort -r > \v(filename)}
+   RECEIVE
+          Stores each incoming file with its lines sorted in reverse
+          order, under its own name.
+
+   RECEIVE /FILTER:{sort -r > \v(filename)}
+          As above, but the filter is used only for this RECEIVE command.
+
+   SET RECEIVE FILTER sort -r > \v(filename)
+   RECEIVE reverse.txt
+          Stores each incoming file with its lines sorted in reverse
+          order, under the name "reverse.txt". The actual result depends
+          on the FILE COLLISION setting. If it is OVERWRITE and multiple
+          files arrive, then each incoming file destroys the previous one.
+          If it is BACKUP (the default), filename conflicts are resolve by
+          adding "version numbers" to the filenames: reverse.txt,
+          reverse.txt.~1~, reverse.txt.~2~, etc.
+
+   SET RECEIVE FILTER sort -r > \v(filename)
+   RECEIVE \v(filename).reverse
+          Stores each incoming file with its lines sorted in reverse
+          order, under the name it arrived with, but with ".reverse"
+          appended to it.
+
+   SET RECEIVE FILTER sort -r > \v(filename)
+   RECEIVE \flower(\v(filename)).reverse
+          Like the previous example, but ensures that the filename is
+          lowercase.
+
+          Examples for binary mode:
+
+   SET RECEIVE FILTER gunzip -c > \v(filename)
+   RECEIVE
+          This receives one or more presumably compressed file and
+          uncompresses each one into a file having the same name it was
+          sent with. For example, if the file is sent with the name
+          OOFA.TXT.GZ, it is stored with that name, even after
+          decompression.
+
+   SET RECEIVE FILTER gunzip -c > \v(filename)
+   RECEIVE \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3))
+          Like the previous example, but the resulting filename has its
+          rightmost three characters removed from it and the remainder is
+          lowercased. So if the incoming filename is OOFA.TXT.GZ, it is
+          stored as oofa.txt after decompression.
+
+   Of course you don't want to type such long hideous commands, so we have
+   also introduced several new functions:
+
+   \fstripx(string[,character])
+          This function removes the rightmost segment of the string that
+          starts with the given character. If no character is given,
+          period (.) is used. Thus it is most conveniently used for
+          stripping the extension from a filename (or the decimal portion
+          from a floating-point number written in US/UK style). Examples:
+
+   \fstripx(OOFA.TXT.GZ)             => OOFA.TXT
+   \fstripx(OOFA.TXT.GZ,.)           => OOFA.TXT
+   \fstripx(OOFA.TXT.GZ,X)           => OOFA.T
+   \fstripx(\fstripx(OOFA.TXT.GZ))   => OOFA
+   \fstripx($100.00)                 => $100
+
+   \fstripn(string,number)
+          Removes the rightmost number characters from the string.
+          Examples:
+
+   \fstripn(OOFA.TXT.GZ)             => OOFA.TXT.GZ
+   \fstripn(OOFA.TXT.GZ,3)           => OOFA.TXT
+   \fstripn(OOFA.TXT.GZ,7)           => OOFA
+
+   \fstripb(string[,c1[,c2]])
+          Strips enclosing matching braces, brackets, parentheses, or
+          quotes from the string. The second argument, c1, specifies which
+          kind of enclosure to look for; if not specified, any enclosing
+          (), [], <>, {}, "", '', or `' are removed. If c1 is specified
+          and c2 is not, then if c1 is an opening brace, bracket, or
+          parenthesis, the matching closing one is supplied automatically
+          as c2. If both c1 and c2 are specified, then to be stripped the
+          string must begin with c1 and end with c2. If the string is not
+          enclosed in the indicated manner, the result is the original
+          string. Examples:
+
+   \fstripb("abc")                   => abc
+   \fstripb([abc])                   => abc
+   \fstripb([abc)                    => [abc
+   \fstripb(<abc>)                   => abc
+   \fstripb(<abc>,[)                 => <abc>
+   \fstripb((abc))                   => abc
+   \fstripb((abc),[)                 => (abc)
+   \fstripb((abc),{(})               => abc
+   \fstripb(+abc+)                   => +abc+
+   \fstripb(+abc+,+)                 => abc
+   \fstripb(+abc+,+,^)               => +abc+
+   \fstripb(+abc^,+,^)               => abc
+   \fstripb('abc')                   => abc
+   \fstripb(`abc')                   => abc
+   \fstripb(``abc'')                 => `abc'
+   \fstripb(\fstripb(``abc''))       => abc
+
+          Notice the special syntax required for including a literal
+          parenthesis in the argument list. As the last two examples
+          illustrate, \fstripb() strips only one level at at a time;
+          nesting can be used to strip a small fixed number of levels;
+          loops can be used to strip larger or indeterminate numbers of
+          levels.
+
+   \flop(string[,char])
+          Removes the leftmost segment of the string that ends with the
+          given character. If no character is given, period (.) is used.
+          Examples:
+
+  \flop(OOFA.TXT.GZ)               => TXT.GZ
+  \flop(OOFA.TXT.GZ,.)             => TXT.GZ
+  \flop(OOFA.TXT.GZ,X)             => T.GZ
+
+          To remove the leftmost number characters, just use
+          \fsubstring(s,number+1). To return the rightmost number
+          characters, use \fright(s,number).
+
+   So the hideous example:
+
+  receive \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3))
+
+   can now be written as:
+
+  receive \flower(\fstripx(\v(filename)))
+
+   That is, the filename stripped of its extension and then lowercased.
+   This is not only shorter and less hideous, but also does not depend on
+   the length of the extension being 3.
+
+   Note that when a receive filter is in effect, this overrides your FILE
+   COLLISION setting, since Kermit has no way of knowing what the final
+   destination filename will be (because it does not know, and can not be
+   expected to know, the syntax of every version of every command shell on
+   every platform on the planet).
+
+4.2.4. Implicit Use of Pipes
+
+   If you wish, C-Kermit can also examine incoming filenames to see if
+   they start with "!", and if so, the subsequent text is treated as a
+   command to read from or write to. For example, if a Kermit client is
+   given the following command:
+
+  get {!finger | sort}
+
+   the server on the other end, if it supports this feature, will run the
+   "finger" program, pipe its standard output to the "sort" program, and
+   send sort's standard output back to you. Similarly, if you:
+
+  send oofa.txt !sort -r > oofa.new
+
+   or, equivalently:
+
+  send oofa.txt {!sort -r > oofa.new}
+
+   or:
+
+  send /as-name:{!sort -r > oofa.new} oofa.txt
+
+   this has the receiver send the contents of the incoming oofa.txt file
+   to the sort program, which sorts the text in reverse order and stores
+   the result in oofa.new.
+
+   This use of the exclamation mark should be familiar to UNIX users as
+   the "bang" feature that lets you run an external application or command
+   from within another application.
+
+   Kermit's "bang" feature is disabled by default, since it is not unheard
+   for filenames to actually begin with "!". So if you want to use this
+   feature, you must enable it with the following command:
+
+   SET TRANSFER PIPES { ON, OFF }
+          ON enables the recognition of "!" notation in incoming filenames
+          during file transfer as an indicator that the remaining text is
+          the name of a command. OFF, the default, disables this feature
+          and uses the text as a filename in the normal fashion. This
+          command does NOT affect SEND /COMMAND, GET /COMMAND, CSEND, etc.
+
+   So using a combination of CSEND (SEND /COMMAND) and the "bang" feature,
+   you can transfer a directory tree all in one command (assuming the
+   remote Kermit supports pipe transfers and has them enabled):
+
+  CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
+
+   or:
+
+  SEND /COMMAND:{tar cf - . | gzip -c} /as:{!gunzip -c | tar xf -}
+
+   Pay close attention to the syntax. Braces are needed around the command
+   because it contains spaces; braces are needed around the as-name
+   because it ends with "-". The as-name must begin with "!" or receiving
+   Kermit will not recognize it as a command. The CSEND command must NOT
+   begin with "!" unless you are running a command whose name really does
+   start that character.
+
+   Similarly, you have a Kermit server send a directory tree to be
+   unpacked on the client end:
+
+  CGET {!tar cf - . | gzip -c} {gunzip -c | tar xf -}
+
+   or:
+
+  GET /COMMAND {!tar cf - . | gzip -c} /as:{gunzip -c | tar xf -}
+
+   Notice how, in this case, the bang is required in the remote command,
+   to distinguish it from a filename, but not in the local command, since
+   by definition of CGET (or GET /COMMAND), it is known to be a command.
+
+   SEND and RECEIVE FILTERs supersede the bang feature. For example, if a
+   file arrives under the name "!gunzip -c | tar xf -", but the receiving
+   Kermit also has been given a command like:
+
+  set receive filter sort -r > \v(filename)
+
+   then the incoming data will be sorted rather than gunzipped.
+
+   Finally, if SET TRANSFER PIPES is ON (and in this case, this must be
+   done in your C-Kermit initialization file), you can send from a pipe on
+   the C-Kermit command line:
+
+  kermit -s "!finger | sort -r" -a userlist
+
+   In this case the "filename" contains spaces and so must be quoting
+   using your shell's quoting rules.
+
+4.2.5. Success and Failure of Piped Commands
+
+   Commands or programs started by Kermit as a result of CSEND or CRECEIVE
+   commands, CGET, SEND /COMMAND, REDIRECT commands (see [455]Section
+   4.2.8.2), implicit use of pipes, RUN commands, and so forth, should
+   return their exit status codes to the Kermit command that caused them
+   to be run, and therefore IF SUCCESS and IF FAILURE tests after these
+   commands should work as expected. For example:
+
+  CSEND blah < filename
+
+   should fail if there is no command called "blah" or if there is no file
+   called "filename". However, this is not foolproof and sometimes
+   C-Kermit might think a command succeeded when it failed, or vice versa.
+   This is most likely to happen when the highly system-dependent methods
+   that Kermit must use to determine a command's exit status code do not
+   supply the right information.
+
+   It can also happen because some commands might define success and
+   failure differently from what you expect, or because you are using a
+   pipeline composed of many commands, and one of them fails to pass
+   failing exit status codes up the chain. The most likely culprit is the
+   shell itself, which in most cases must be interposed between Kermit and
+   any external program to be run.
+
+   In any case, you can examine the following variable to find out the
+   exit status code returned to Kermit by the process most recently run by
+   any command that runs external commands or programs, including CSEND,
+   CRECEIVE, REDIRECT, RUN, etc:
+
+  \v(pexitstat)
+
+   In UNIX, Windows and OS/2, the value should be -2 if no command has
+   been run yet, 0 if the most recent command succeeded, -1, -3, or -4 if
+   there was an internal error, and a positive number returned by the
+   command itself if the command failed. If the number is in the range
+   1-127, this is the program's exit status code. If it is 128 or greater,
+   this is supposed to indicate that the command or program was
+   interrupted or terminated from outside itself.
+
+   In Windows 95 and 98, the return values of the default shell are
+   unreliable; various third-party shells can be used to work around this
+   deficiency.
+
+   In VMS, it is the actual exit status code of the command that was run.
+   This is an odd number if the command succeeded, and an even number if
+   it failed. You can see the associated message as follows:
+
+  run write sys$output f$message(\v(pexitstat))
+
+   Or, more conveniently, use the new Kermit function:
+
+  echo \ferrstring(\v(pexitstat))
+
+   which converts a system error code (number) to the corresponding
+   message.
+
+4.2.6. Cautions about Using Pipes to Transfer Directory Trees
+
+   Although utilities such as tar and zip/unzip might be available on
+   different platforms (such as UNIX and Windows), this does not
+   necessarily mean you can use them successfully to transfer directory
+   trees between unlike platforms. For example:
+
+  CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
+
+   when used from UNIX to Windows will have satisfactory results for
+   binary files, but not for text files. UNIX text files have lines ending
+   with Linefeed (LF) only, whereas Windows text files have lines ending
+   in Carriage Return and Linefeed (CRLF). Thus any text files that were
+   in the archive formed by the first tar command will be unpacked by the
+   second tar command in their original form, and will display and print
+   incorrectly in Windows (except in applications that have been
+   explicitly coded to handle UNIX-format text files). On the other hand
+   if you told gzip to use "text mode" to do record format conversion
+   (assuming there was a way to tell it, as there is with most "zip"
+   programs), this would destroy any binary files in the archive.
+
+   Furthermore, if the archive contains text files that are written in
+   languages other than English, the "special" (accented and/or non-Roman)
+   characters are NOT translated, and are therefore likely show up as
+   gibberish on the target system. For example, West European languages
+   are usually encoded in ISO Latin Alphabet 1 in UNIX, but in PC code
+   page 850 on the PC. Capital A with acute accent is code point 193
+   (decimal) Latin-1, but 181 in CP850. So A-acute in the UNIX file
+   becomes Middle Box Bottom on the PC, and similarly for all the other
+   special characters, and for all other languages -- Greek, Russian,
+   Hebrew, Japanese, etc.
+
+   So when transferring text files between unlike platforms, you should
+   use direct Kermit file transfers so Kermit can apply the needed
+   record-format and character-set transformations. Use pipelines
+   containing archivers like tar or zip only if all the files are binary
+   or the two systems use the same record format and character set for
+   text files.
+
+   Also see [456]Sections 4.3, [457]4.10, [458]4.11, and [459]4.15 for how
+   to transfer directory trees between both like and unlike systems
+   directly with Kermit.
+
+4.2.7. Pipes and Encryption
+
+   Of course pipelines could be used for encrypted file transfers,
+   assuming proper precautions could be taken concerning the transmission
+   of the key. But there is rarely a good way to do this. To illustrate
+   using UNIX crypt:
+
+  csend {crypt key < filename} {!crypt key > filename}
+
+   Or, more ambitiously:
+
+  csend {tar cf - . | gzip -c | crypt key} {!crypt key | gunzip -c | tar xf -}
+
+   transmits the key in the file header packet as part of the (clear-text)
+   remote command, defeating the entire purpose of encrypting the file
+   data.
+
+   But if you are connected in terminal mode to the remote computer and
+   type:
+
+  creceive {crypt key > filename}
+
+   at the remote Kermit prompt, you have also transmitted the key in clear
+   text over the communications link.
+
+   At present, the only secure way to use CSEND and CRECEIVE with an
+   encryption filter is to have a human operator at both ends, so the key
+   does not have to be transmitted.
+
+   Theoretically it would be possible to use PGP software (Pretty Good
+   Privacy, by Phil Zimmerman, Phil's Pretty Good Software) to avoid key
+   transmission (since PGP uses separate public and private key and "lets
+   you communicate securely with people you've never met, with no secure
+   channels needed for prior exchange of keys"), but the specific method
+   has yet to be worked out.
+
+     HINT: See the PGP User's Guide, e.g. at:
+     [460]http://www.telstra.com.au/docs/PGP/
+     Especially the topic "Using PGP as a UNIX-Style Filter":
+     [461]http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html
+
+   In any case, better and more convenient security options are now
+   available: Kerberos authentication and encryption ([462]CLICK HERE for
+   details) and the new ability to run C-Kermit "though" other
+   communication programs, described in [463]Section 2.7.
+
+4.2.8. Commands and Functions Related to Pipes
+
+4.2.8.1. The OPEN !READ and OPEN !WRITE Commands
+
+   These are described in [464]Using C-Kermit, and are generally useful
+   with reading output from commands that produce more than one line on
+   their standard output, or writing multiple lines into commands that
+   accept them on their standard input.
+
+   In C-Kermit 7.0 CLOSE !READ is accepted as a synonym for CLOSE READ,
+   and CLOSE !WRITE for CLOSE WRITE.
+
+   Testing the success and failure of these commands, however, can be a
+   bit tricky. Consider:
+
+  open !read lalaskjfsldkfjsldkfj
+
+   (where "lalaskjfsldkfjsldkfj" is neither a valid command nor the name
+   of a program or script that can be run). OPEN !READ, in UNIX at least,
+   translates this into execl(shellpath,shellname,"-c",command). This
+   means it starts your preferred shell (e.g. from the SHELL environment
+   variable) and asks it to execute the given command. It must be this
+   way, because your command can be a either an internal shell command
+   (which only your shell can execute) or an external command, which only
+   your shell knows how to find (it knows your PATH and interprets, etc).
+   Therefore unless OPEN !READ can't start your shell, it always succeeds.
+
+   Continuing with the nonexistent-command example:
+
+  C-Kermit> open !read lalaskjfsldkfjsldkfj
+  C-Kermit> status
+   SUCCESS
+  C-Kermit> read line
+  C-Kermit> status
+   SUCCESS
+  C-Kermit> echo "\m(line)"
+  "bash: lalaskjfsldkfjsldkfj: command not found"
+  C-Kermit> close read
+  C-Kermit> status
+   FAILURE
+  C-Kermit>
+
+   In other words, the failure can not be detected on OPEN, since the OPEN
+   command succeeds if it can start your shell. It can't be detected on
+   READ, since all this does is read output from the shell, which in this
+   case happens to be an error message. However, failure IS detected upon
+   close, since this is the occasion upon which the shell gives Kermit its
+   exit status code.
+
+   For an illustration of this situation, see [465]Section 2.14.
+
+4.2.8.2. The REDIRECT Command
+
+   A second method of I/O redirection is offered by the REDIRECT command.
+   This is a rather advanced and tricky feature that is presently
+   supported only in UNIX C-Kermit, in OS-9 C-Kermit, and in Kermit 95.
+   Syntax:
+
+   REDIRECT command
+          Runs the given command, sending its standard output to the
+          current communications channel (SET LINE, SET PORT, or SET HOST
+          connection), and reading its standard input from the same
+          connection. Works only in local mode -- i.e. a connection is
+          required -- and then only if the given command uses Standard
+          I/O.
+
+   Example:
+
+  redirect finger
+
+   runs the local "finger" command and sends its output over the
+   connection as plain text, where presumably there is a process set up to
+   read it. Another example:
+
+  redirect finger | sort -r
+
+   shows the use of a pipeline.
+
+   Note: REDIRECT differs from CSEND/CRECEIVE in two important ways: (1)
+   it does not use the Kermit protocol, and (2) it uses a bidirectional
+   pipe rather than a one-way pipe.
+
+   The primary use of the REDIRECT command is to run external protocols,
+   such as sz/rz in UNIX for ZMODEM, when they work over Standard I/O(*).
+   Example:
+
+  set host xyzcorp.com
+  (login, etc)
+  redirect sz oofa.zip
+
+   lets you make a Telnet connection with C-Kermit and then do a ZMODEM
+   transfer over it. ZMODEM protocol messages go both ways over the same
+   connection simultaneously.
+
+   It is possible to use C-Kermit on UNIX as your PPP dialer and then to
+   REDIRECT the connection to the PPP software, but C-Kermit 7.0 offers a
+   better approach to PPP dialing in its new EXEC command ([466]Section
+   1.23).
+
+   In theory, you can also redirect an interactive process. For example,
+   suppose you tell Kermit 95 to wait for an incoming TCP/IP connection:
+
+  set host * 3000
+
+   and then tell C-Kermit on UNIX to:
+
+  set host kermit95hostname 3000
+  redirect ksh
+
+   and then tell Kermit 95 to CONNECT: now you are talking to the UNIX
+   K-shell; you can give commands (pwd, ls, etc) and see the results. In
+   practice, the K-shell's terminal modes are messed up because (a) it is
+   not going through the Unix terminal driver, and (b) it is "smart" and
+   knows it is being redirected, and so acts in a decidedly inhospitable
+   manner (other applications like EMACS, vi, etc, simply refuse to run if
+   their standard i/o has been redirected).
+
+     (*) The publicly-distributed sz/rz programs do not work as clients.
+     However, Omen Technology does offer an up-to-date redirectable
+     client XYZMODEM program called crzsz.
+
+4.2.8.3. Receiving Mail and Print Jobs
+
+   As of 7.0, and in UNIX only, files that are sent to C-Kermit as mail
+   (when the other Kermit uses a MAIL or SEND /MAIL command) or to be
+   printed (via REMOTE PRINT or SEND /PRINT) are now piped directly to the
+   mail or print program, rather than written to temporary files and then
+   mailed or printed and then deleted. This has the advantages of (a) not
+   requiring a temporary file, and (b) allowing mail to have a proper
+   subject in place of the filename. Temporary files were bad not only
+   because they required (a) space, and (b) writeability of the current
+   directory, but also because using them could result in wiping out an
+   existing file. See [467]Section 4.7 for more about SEND /MAIL and SEND
+   /PRINT.
+
+4.2.8.4. Pipe-Related Functions
+
+   The \fcommand(command) function runs the given shell or system command
+   and returns the command's standard output as its value (with any
+   newline characters stripped from the end), unless the result is too
+   long, in which case it returns the empty string. The maximum length for
+   the result is at least 1022 bytes, and it might be longer on some
+   platforms. Examples (UNIX):
+
+  C-Kermit> echo "\fcommand(date)"
+  "Fri Apr 18 13:31:42 1997"
+  C-Kermit> echo "\fcommand(finger | wc -l)" ; how many users logged in?
+  "      83"
+  C-Kermit> evaluate \fcommand(finger | wc -l) * 2
+  166
+  C-Kermit> echo Welcome to \fcommand(tty) on \fcommand(date)
+  Welcome to /dev/ttyre on Fri Apr 18 13:31:42 1997
+  C-Kermit> echo "\fcommand(ls oofa.*)"
+  "oofa.c
+  oofa.h
+  oofa.o"
+  C-Kermit> cd /directory-with-thousands-of-files
+  C-Kermit> echo "\fcommand(ls -l)" ; This would be too long
+  ""
+  C-Kermit>
+
+   If a command's output would be too long, you can use the other, more
+   laborious method of reading from a command: OPEN !READ command, READ
+   each line, CLOSE !READ.
+
+   The \frawcommand(command) function is identical to \fcommand(command),
+   except it does not remove trailing newline characters:
+
+  C-Kermit> echo "\frawcommand(date)"
+  "Fri Apr 18 13:31:42 1997
+  "
+  C-Kermit> echo "\frawcommand(ls oofa.*)"
+  "oofa.c
+  oofa.h
+  oofa.o
+  "
+  C-Kermit>
+
+   Use \frawcommand() if you want to retain the final line terminators, or
+   if the command's output is "binary". But remember that if the result of
+   this (or any other) function contains any NUL (ASCII code 0)
+   characters, the first NUL will terminate the result string because this
+   is how C strings work (it's "C-Kermit", remember?).
+
+   These functions are useful not only locally, but also in the
+   client/server arena. If you need to get the results from a system
+   command on the server end into a variable on the client end, just do:
+
+  [ remote ] query kermit command(date)
+
+   The result is in the local \v(query) variable; see [468]Using C-Kermit,
+   2nd Ed., pp.359-360 for details.
+
+4.3. Automatic Per-File Text/Binary Mode Switching
+
+   When transferring files between like systems (e.g. UNIX-to-UNIX),
+   binary mode can be used for all files unless character-set translation
+   is needed, and in fact Kermit programs of recent vintage recognize each
+   others' platforms and switch to binary mode automatically when it is
+   appropriate (e.g. DOS to OS/2, or UNIX to UNIX). (Exception: LABELED
+   mode is chosen for VMS-to-VMS and OS/2-to-OS/2 transfers so complex
+   file formats can be preserved.)
+
+   On a client/server connection between like systems, the transfer mode
+   is currently determined by the file sender, rather than always by the
+   client. If the client is sending, it controls the transfer mode. If a
+   GET command is sent to the server, the server sends all files in binary
+   mode if its TRANSFER CHARACTER-SET is TRANSPARENT; otherwise it uses
+   text mode for text files (according to its text-pattern list) and
+   binary mode for binary files. Of course, the client can control the
+   server's transfer character-set with the REMOTE SET TRANSFER
+   CHARACTER-SET command.
+
+   When transferring files between unlike systems, however, (e.g.
+   UNIX-to-DOS), some files (such as executable program images) must be
+   transferred in binary mode but others (such as plain-text files) must
+   be transferred in text mode so their record format and character sets
+   can be appropriately converted. If a binary file is transferred in text
+   mode, it is ruined. If a text file is transferred in binary mode, then
+   at the very least, its format can be incorrect; at worst it is also
+   corrupted because its character set was not converted (in extreme cases
+   the corruption is total, e.g. because one system is ASCII-based and the
+   other EBCDIC).
+
+4.3.1. Exceptions
+
+   VMS C-Kermit, when sending files to a non-VMS system, switches to text
+   or binary mode automatically for each file, based on the record format
+   in the file's directory entry; thus the mechanisms described in this
+   section do not apply to VMS C-Kermit, yet the effect is the same:
+   automatic text/binary mode switching when VMS C-Kermit is sending
+   files. See the VMS Appendix of [469]Using C-Kermit for details.
+
+   Kermit versions that support LABELED or IMAGE transfer mode are
+   likewise not affected by this feature when one of those modes is
+   selected (normally used only when transferring between like systems).
+
+   Kermit versions that support file-transfer pipes and filters are not
+   affected by this feature when pipes or filters are used, since the
+   output of a pipe or filter (such as gzip) is likely to require transfer
+   in a different mode than the original file.
+
+   Finally, SEND /TEXT or SEND /BINARY will force files to be sent in the
+   indicated mode, overriding all automatic transfer-mode-choosing
+   mechanisms.
+
+4.3.2. Overview
+
+   Suppose you give C-Kermit a command like:
+
+  SEND *.*
+
+   And suppose the pattern *.* matches a mixture of text files (such as
+   program source code) and binary files (such os object modules or
+   executable programs).
+
+   C-Kermit 6.0 and earlier (except on VMS) send all files in the same
+   mode: whatever you said in your most recent SET FILE TYPE command, or
+   else whatever mode was chosen automatically according to the rules on
+   page 236 of Using C-Kermit, 2nd Ed.
+
+   But when text and binary files are mixed in the same group, and the
+   files are being transferred to an unlike system (e.g. UNIX to IBM
+   Mainframe), this results in corruption of either all the text files or
+   all the binary files.
+
+   Stream-oriented file systems such as in UNIX and DOS do not record any
+   information about the file to tell us whether the file should be
+   transferred in binary or text mode, making it impossible to select the
+   transfer mode for each file in a group automatically with any
+   certainty.
+
+   However, we can use some fairly-well established file naming
+   conventions for this purpose. C-Kermit 7.0 lets you provide lists of
+   filename patterns that are used to separately determine the file type
+   for each individual file being transfered. A pattern is a string,
+   possibly containing the special characters "*" (asterisk, which matches
+   any string of zero of more characters) and/or "?" (question mark, which
+   matches any single character). For example "a*b" matches all files
+   whose names start with "a" and end with "b", such as "ab", "arb",
+   "ababababab", etc, but not "abba". And "a?b" matches any file whose
+   name starts with "a", ends with "b", and is exactly 3 characters long.
+
+     NOTE: When typing commands at the C-Kermit prompt, you must prefix
+     "?" with \ to override its normal function of giving help.
+
+   (Also see [470]Section 4.9 for additional pattern-matching notations
+   that might be available in your version of C-Kermit.)
+
+   When you have specified filename recognition patterns, C-Kermit can
+   transfer the ones whose names match any of the binary-mode patterns in
+   binary mode, and those with names that match any of the text-mode
+   patterns in text mode, and those whose names match neither in the
+   prevailing mode you have chosen, or that was chosen automatically via
+   peer recognition.
+
+4.3.3. Commands
+
+   SET FILE PATTERNS { ON, OFF, AUTO }
+          This tells Kermit whether to do per-file filename
+          pattern-matching to determine text or binary mode. The normal
+          and default setting is AUTO, which means to use pattern lists to
+          switch transfer mode only when it is certain that the other
+          Kermit program supports automatic notification of transfer mode
+          (via Attribute packets) on a per-file basis (this information is
+          obtained automatically during protocol startup negotiation). ON
+          means to always determine the transfer mode from the filename
+          and pattern list when sending files. Use OFF to disable this
+          feature (without resetting your pattern lists). Also note that
+          if you have selected LABELED file transfer (SET FILE TYPE
+          LABELED), this takes precedence over filename-matching patterns
+          and all files are sent in labeled mode.
+
+   SET TRANSFER MODE MANUAL
+          Disables the use of filename patterns, no matter what the FILE
+          PATTERNS setting.
+
+   REMOTE SET TRANSFER MODE MANUAL
+          Client command to disable automatic transfer mode, and therefore
+          also filename patterns, in the server. Synonym: REMOTE SET XFER
+          MODE MANUAL.
+
+   { GET, SEND, etc } { /BINARY, /TEXT }
+          Including a /BINARY or /TEXT (or, where supported, /IMAGE or
+          /LABELED) switch with a file-transfer command changes the
+          transfer mode to manual for that command only, and therefore
+          disables patterns that that command.
+
+   SET FILE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          A list of zero or more patterns, separated by spaces (not
+          commas). Letters in a pattern are case-sensitive if the
+          underlying filenames are case sensitive (as in UNIX), and
+          case-insensitive otherwise (as in Windows). If a file's name is
+          matched by any pattern in the list and SET FILE PATTERNS is ON,
+          the file is sent in binary mode. Examples:
+
+  SET FILE BINARY-PATTERNS *.gz *.Z *.tar *.zip *.o *.so *.a *.out ; UNIX
+  SET FILE BINARY-PATTERNS *.EXE *.ZIP *.OBJ *.COM ; DOS or OS/2 or Windows
+
+          If a pattern contains spaces, enclose it in braces.
+
+   SET FILE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Like SET FILE BINARY-PATTERNS, but the patterns choose text
+          files rather than binary ones. Examples:
+
+  SET FILE TEXT-PATTERNS *.TXT *.KSC *.HTM* *.BAT ; DOS, Windows, OS/2
+
+   ADD BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Adds one or more patterns to the BINARY-PATTERN list.
+
+   ADD TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Adds one or more patterns to the TEXT-PATTERN list.
+
+   REMOVE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Removes one or more patterns from the BINARY-PATTERN list. The
+          given patterns are matched with the ones in the BINARY-PATTERNS
+          list with case sensitivity if the underlying file system has
+          case-sensitive names (as do UNIX and OS-9), otherwise with case
+          independence.
+
+   REMOVE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Removes one or more patterns from the TEXT-PATTERN list.
+
+   SHOW PATTERNS
+          Displays the current pattern selections.
+
+   Whenever you give a SET FILE BINARY-PATTERNS or SET FILE TEXT-PATTERNS
+   command, the previous list is replaced. If you give one of these
+   commands without a pattern list, the previous list is removed.
+
+   When patterns are active and files are being sent, text patterns (if
+   any) are applied first (but only if not RESENDing and not sending in
+   LABELED mode), then binary patterns, so if the same pattern appears in
+   both lists, binary mode is chosen.
+
+4.3.4. Examples
+
+   Here's an example that might be used when sending files from UNIX:
+
+  set file type binary
+  set file text-patterns *.c *.h *.w *.txt makefile
+  set file binary-patterns *.o
+  msend makefile wermit wart ck*.[cwho] ck*.txt
+
+   Note that "wermit" and "wart" do not match any patterns so they are
+   sent in the prevailing mode, which is binary. Also note the use of
+   "makefile" as a pattern that does not contain any wildcard characters
+   (there is no other convention to distinguish among "wermit" and "wart",
+   which are binary executables, and "makefile", which is a text file,
+   purely by their names).
+
+   Most C-Kermit implementations have a default pattern list built in,
+   which includes patterns that are almost certain to succeed in picking
+   the right transfer mode. Others are omitted due to ambiguity. For
+   example ".hlp", and ".ini" are generally binary types in Windows but
+   text types everywhere else.
+
+     NOTE: ".doc", used for decades to denote plain-text documentation
+     files, now more often than not denotes a Microsoft Word Document, so
+     ".doc" is now considered a binary type since it does less harm to
+     transfer a plain-text document in binary mode than it does to
+     transfer an MS Word file in text mode (except when IBM mainframes
+     are involved!)
+
+     ANOTHER NOTE: ".com" files are binary in DOS-like operating systems,
+     but they are text (DCL command procedures) in VMS. VMS C-Kermit
+     sends .COM files in text mode; K95 sends them in binary mode. If you
+     download a .COM file from VMS to DOS or Windows, and then upload it
+     to another VMS system, be sure to use SEND /TEXT to preserve its
+     textness.
+
+   You can see the default pattern list by starting C-Kermit without its
+   initialization file (e.g. "kermit -Y") and using the SHOW PATTERNS
+   command. If you will be depending on this feature, be sure to examine
+   the list carefully in conjunction with the applications that you use.
+
+   The default pattern list does not take "backup files" into account
+   because (a) people usually don't want to transfer them; and (b) it
+   would make the pattern lists more than twice as long. For example, we
+   would need to include both *.txt and *.txt.~[0-9]*~ for ".txt" files,
+   and similarly for all the others. Instead, you can use SEND /NOBACKUP
+   (or SET SEND BACKUP OFF) to skip over all backup files.
+
+   Put your most commonly-used safe pattern declarations in your C-Kermit
+   customization file (ckermod.ini, .mykermrc, k95custom.ini, etc).
+
+   As noted, SET FILE PATTERNS is ON by default. Sometimes, however, it is
+   desirable, or necessary, to force files to be sent in a particular
+   mode, and often this must be done from the command line (e.g. when
+   using Kermit as a download helper in a Web browser like Lynx). The -V
+   command-line options is equivalent to SET FILE PATTERNS OFF and SET
+   TRANSFER MODE MANUAL. Example:
+
+  kermit -Vis oofa.txt
+
+   forces oofa.txt to be sent in binary mode, even though ".txt" might
+   match a text pattern.
+
+4.4. File Permissions
+
+   "Permissions" refers to a code associated with a file that specifies
+   who is allowed to access it, and in what manner. For example, the
+   owner, the members of one or more groups, the system administrator, and
+   everybody else, might be allowed various combinations of Read, Write,
+   Append, Execute, or Listing access.
+
+   The permission code goes by different names on different platforms. In
+   UNIX, it might be called the filemode. In VMS, it is called the file
+   protection (or protection mask).
+
+   The comments in this section presently apply only to the UNIX and VMS
+   versions of C-Kermit, to which these features were added in version
+   7.0; the DOS, Windows, and OS/2 file systems embody no notions of
+   protection, and so MS-DOS Kermit and Kermit 95 do not send file
+   permissions, and ignore them when received.
+
+   The permissions for a received file are determined by a combination of
+   the file transfer mode (VMS-to-VMS transfers only), whether a file of
+   the same name exists already, whether permissions of the file are
+   received in the file attribute packet, and the setting of ATTRIBUTES
+   PROTECTION.
+
+   The default for ATTRIBUTES PROTECTION is ON. If no attributes are
+   received, the effect is the same as if attributes PROTECTION were OFF.
+
+   For VMS-to-VMS transfers, the default LABELED mode simply copies the
+   protection code from source to destination.
+
+4.4.1. When ATTRIBUTES PROTECTION is OFF
+
+   If no file of the same name exists, system defaults determine the
+   permissions of the new file. Otherwise, the actions taken depend on the
+   current FILE COLLISION setting: BACKUP, OVERWRITE, RENAME, etc, as
+   documented in [471]Using C-Kermit. But now the new file (if it is
+   created at all) automatically inherits the permissions (mode bits) of
+   the existing file in a way that is appropriate for the platform.
+
+4.4.1.1. Unix
+
+   All mode bits are inherited except the directory bit, since the
+   incoming file can not possibly be a directory. (In any case, it is not
+   possible to receive a file that has the same name as an existing
+   directory unless FILE COLLISION is set to RENAME).
+
+4.4.1.2. VMS
+
+   Files with the same name as an existing file, transferred in modes
+   other than LABELED between VMS systems, inherit the protection of the
+   prior version.
+
+4.4.2 When ATTRIBUTES PROTECTION is ON
+
+   File permissions can be conveyed as part of the file transfer process,
+   in accordance with the Kermit protocol definition. If the file sender
+   puts system-dependent and/or system-independent versions of the file
+   protection (permissions) into the Attribute (A) packet, the file
+   receiver can set the new file's permissions from them. Otherwise, the
+   permissions are set the same as for ATTRIBUTES PROTECTION OFF.
+
+   When the incoming A packet contains system-dependent permissions, the
+   file receiver checks to see if the sender has the same system ID (e.g.
+   both the sending and receiving systems are UNIX, or both are VMS); if
+   so, it decodes and uses the system-dependent permissions; otherwise it
+   uses the generic ones (if any) and applies them to the owner field,
+   setting the other fields appropriately as described in the following
+   sections.
+
+   Setting the incoming file's protection from the A packet is controlled
+   by SET ATTRIBUTES PROTECTION (or PERMISSION), which is ON by default,
+   and its status is displayed by SHOW ATTRIBUTES.
+
+   The main benefit of this feature is to not have to "chmod +x" an
+   executable file after transfer from UNIX to UNIX. Its cross-platform
+   benefits are less evident, perhaps to retain the status of the Unix 'x'
+   bit on a VMS system, for subsequent transfer back to a Unix system.
+
+4.4.2.1. System-Specific Permissions
+
+   System-specific file permissions are used when the two Kermit programs
+   recognize each other as running on the same type of system. For
+   example, both are running under some form of UNIX (it doesn't matter
+   which UNIX variation -- HP-UX, Solaris, AIX, etc -- all use the same
+   scheme for file permissions); or both are running under VMS (even if
+   one is on an Alpha and the other on a VAX, and/or one is old and the
+   other is new).
+
+4.4.2.1.1. UNIX
+
+   UNIX supports three categories of users, File Owner, Group, and World,
+   and three types of file access permission: Read, Write, and Execute.
+   Thus, a UNIX file's permissions are expressed in 9 bits.
+
+   The system-dependent permission string for UNIX is a 3-digit octal
+   string, the low-order 9 bits of the st_mode member of the stat struct;
+   we deliberately chop off the "file format" bits because they are not
+   permissions, nor do we convey the setuid/setgid bits, lock bit, sticky
+   bit, etc.
+
+4.4.2.1.2. VMS
+
+   VMS supports four categories of users, System, File Owner, Group, and
+   World, and four types of file access permission: Read, Write, Execute,
+   and Delete. Thus, a VMS file's permissions are expressed in 16 bits.
+
+   The system-dependent protection string for VMS is a 4-digit hexadecimal
+   string, corresponding to the internal-format protection word of the
+   file (RWED for each of World,Group,Owner,System). A new file normally
+   gets all 16 protection bits from the original file of the same name.
+
+   Note: VMS-to-VMS transfers take place in LABELED mode when the two
+   C-Kermits recognize each other's platform as VMS (unless you have
+   disabled LABELED-mode transfers). In this case, all of a file's
+   attributes are preserved in the transfer and the protection mask (and
+   other information) is taken from the file's internal information, and
+   this takes precedence over any information in the Attribute packets.
+   You can defeat the automatic switching into LABELED mode (if you want
+   to) with SET TRANSFER MODE MANUAL.
+
+4.4.2.2. System-Independent Permissions
+
+   The system-independent ("generic") protection is used when the system
+   IDs of the two Kermit programs do not agree (e.g. one is UNIX, the
+   other is VMS). The generic protection attribute includes the following
+   permissions (not all are applicable to every file system): Read, Write,
+   Append, Execute, Delete, Search. The generic permissions are derived
+   from the owner permissions of the source file, thus, a Unix 'w'
+   permission becomes VMS Write,Delete.
+
+   The Owner field of the new file's permissions is set from the incoming
+   generic protection attribute.
+
+   In UNIX, the Group and World permissions are set according to your
+   umask, except that execute permission is NOT set in these fields if it
+   was not also set in the generic protection (and consequently, is set in
+   the Owner field).
+
+   In VMS, the System, Group, and World permissions are set according to
+   the process default file permission (as shown in VMS by SHOW
+   PROTECTION), except that no permissions are allowed in these fields
+   that are not included in the generic permissions.
+
+   Note that the VMS and UNIX interpretations of Execute permission are
+   not identical. In UNIX, a file (binary executable, shell script, etc)
+   may not be executed unless it has Execute permission, and normally
+   files that are not intended for execution do not have Execute
+   permission. In VMS, Read permission implicitly supplies Execute
+   capability. Generally files that have Read permission also have
+   explicit Execute permission, but files (binary executables, DCL command
+   procedures) that have Read permission and not Execute permission can
+   still be executed.
+
+4.5. File Management Commands
+
+4.5.1. The DIRECTORY Command
+
+   Prior to C-Kermit 7.0, the DIRECTORY command always ran an external
+   system command (such as "ls" on UNIX) or program to product the
+   directory listing. This had certain advantages, mostly that you could
+   include system-dependent options for customized listings, e.g. on UNIX:
+
+  dir -lt c* | more
+
+   or in VMS:
+
+  directory /size/date/protection/except=*.obj oofa.*;0
+
+   This approach, however, carries some disadvantages: C-Kermit can't
+   return SUCCESS or FAILURE status for (e.g.) "dir foo" according to
+   whether the file "foo" exists; and it runs an inferior process, which
+   might be a problem in some environments for resource and/or security
+   reasons, and won't work at all in a "nopush" environment (e.g. one in
+   which C-Kermit is configured to forbid access to exterior commands and
+   programs, e.g. in a VMS "captive account").
+
+   In C-Kermit 7.0 on VMS and UNIX, and in K95 1.1.19 and later, the
+   DIRECTORY command is internal to Kermit. It can be run in a "nopush"
+   environment and returns SUCCESS or FAILURE status appropriately. In
+   UNIX it prints all dates and times in a consistent way (unlike ls). In
+   VMS it prints precise file sizes, rather than "blocks". It offers
+   several formatting and other options, but it is not necessarily more
+   flexible than the corresponding external commands or programs (the UNIX
+   "ls" program, the VMS "directory" command). The syntax is:
+
+   DIRECTORY [ switch [ switch [ ... ] ] ] [ filespec ]
+
+   If no filespec is given, all files in the current directory are listed.
+
+   Optional switches include all the standard file-selection switches
+   presented in [472]Section 1.5.4, plus:
+
+   /ALL
+          Show both regular files and directories; this is the default.
+
+   /ARRAY:x
+          Instead of displaying a directory listing, put the files that
+          would have been shown (based on the filespec and other selection
+          switches) in the given array. The array need not (and should
+          not) be predeclared; if the array already exists, it is
+          destroyed and reused. The array name can be a single letter,
+          like "a", or any fuller form, such as "&a", "\&a", "\&a[]", etc.
+          If the /ARRAY switch is included, the following other switches
+          are ignored: /BRIEF, /VERBOSE, /HEADING, /PAGE, /ENGLISHDATE,
+          /ISODATE, /XFERMODE, /MESSAGE, /SORT, /REVERSE, /ASCENDING. In
+          other words, only file selection switches are meaningful with
+          /ARRAY: /FILES, /DIRECTORIES, /ALL, /DOTFILES, /NOBACKUP,
+          /RECURSIVE, /SMALLER, /LARGER, /AFTER, /BEFORE, /EXCEPT, etc.
+          The resulting array has the number of files (n) as its 0th
+          element, and the filenames in elements 1 through n Example:
+
+  dir /array:&a /files /nobackup /after:19990101 /larger:10000 [ab]*
+  show array &a
+
+   /FILES
+          Only show regular files.
+
+   /DIRECTORIES
+          Only show directories.
+
+   /BACKUP
+          In UNIX, OS-9, K-95, and other versions that support SET FILE
+          COLLISION BACKUP and create backup files by appending .~n~ to
+          the filename (where "n" is a number), /BACKUP means to include
+          these files in directory listings. This is the default.
+
+   /NOBACKUP
+          This is the opposite of /BACKUP: that is, do not include backup
+          files in the listing.
+
+   /BRIEF
+          List filenames only; use a compact format, as many filenames as
+          will fit across the screen (based on the longest name). A brief
+          listing is always sorted alphabetically.
+
+   /VERBOSE
+          List one file per line, and include date, size, and (in UNIX
+          only) permissions of each file. This is the opposite of /BRIEF,
+          and is the default.
+
+   /PAGE
+          Pause at the end of each screenful and give a "more?" prompt,
+          even if SET COMMAND MORE-PROMPTING is OFF.
+
+   /NOPAGE
+          Don't pause at the end of each screenful and give a "more?"
+          prompt, even if SET COMMAND MORE-PROMPTING is ON. If neither
+          /PAGE or /NOPAGE is given, paging is according to the prevailing
+          COMMAND MORE-PROMPTING setting (which can be displayed with SHOW
+          COMMAND).
+
+   /ENGLISHDATE
+          Show dates in dd-mmm-yyyy format; mmm is the first three letters
+          of the English month name.
+
+   /ISODATE
+          Show dates in yyyy-mm-dd format; mm is the month number, 1-12.
+          This is the opposite of /ENGLISHDATE, and is the default.
+
+   /HEADINGS
+          Print a heading before the listing and a summary at the end.
+
+   /NOHEADINGS
+          Don't print a heading before the listing or a summary at the
+          end. This is the opposite of /HEADINGS, and is the default.
+
+   /XFERMODE
+          Only in Kermit programs that support SET FILE PATTERNS. If this
+          switch is included, and the filename matches any FILE
+          BINARY-PATTERN ([473]Section 4.3), "(B)" is printed after the
+          filename; otherwise, if it matches a FILE TEXT-PATTERN, "(T)" is
+          printed.
+
+   /NOXFERMODE
+          Don't display transfer-mode indicators. This is the opposite of
+          /XFERMODE and is the default.
+
+   /RECURSIVE
+          Show files not only in the given directory, but also in its
+          subdirectories (if any), their subdirectories, etc.
+
+   /NORECURSIVE
+          Don't show files in subdirectories. This is the opposite of
+          /RECURSIVE, and is the default.
+
+   /MESSAGE:text
+          This lets you specify a short text string to be appended to the
+          end of each directory listing line (a space is supplied
+          automatically). If the text contains any spaces, enclose it in
+          braces, e.g. /MESSAGE:{two words}.
+
+   /NOMESSAGE
+          Don't append any message to the end of each directory listing
+          line (default).
+
+   /SORT:[{NAME,SIZE,DATE}]
+          Sort the listing by name, size, or date. If the /SORT switch is
+          given but the "sort-by" keyword is omitted, the listing is
+          sorted by name. /SORT:NAME /ASCENDING (alphabetic sort by name)
+          is the default.
+
+   /NOSORT
+          Don't sort the listing. Files are listed in whatever order they
+          are supplied by the operating system, e.g. inode order in UNIX.
+
+   /REVERSE
+          If the /SORT switch is given, reverse the order of the sort.
+          Synonym: /DESCENDING.
+
+   /ASCENDING
+          If the /SORT switch is given, sort the listing in normal order.
+          This is the opposite of /REVERSE and is the default.
+
+   Note that most of the DIRECTORY-specific switches come in pairs, in
+   which one member of a pair (e.g. /NOHEADINGS) is the opposite of the
+   other (e.g. /HEADINGS).
+
+   If you always want to use certain options, you can set them with the
+   SET OPTIONS DIRECTORY command ([474]Section 1.5.5). Use SHOW OPTIONS to
+   list the options currently in effect. To make the desired options apply
+   every time you run C-Kermit, put a SET OPTIONS DIRECTORY command in
+   your C-Kermit customization file, specifying the desired options.
+   Options set in this manner apply to every subsequent DIRECTORY command.
+   Of course, if you include switches in a DIRECTORY command, these
+   override any defaults, built-in or custom. Example:
+
+  DIRECTORY            ; Use "factory defaults"
+  SET OPTIONS DIRECTORY /SORT:SIZE /REVERSE /HEADINGS  ; Customize defaults
+  DIRECTORY            ; Use customized defaults
+  DIR /SORT:NAME       ; Override customized default SORT key
+  SET OPT DIR /RECURS  ; Add /RECURSIVE to customized defaults
+  DIR /ASCEND          ; Override customized default SORT order
+
+   Notes:
+
+     * Only a single sort key is supported; there is presently no way to
+       have multiple sort keys.
+     * If the /BRIEF switch is given, all other switches (except
+       /[NO]RECURSIVE, /[NO]DOTFILES, /DIRECTORIES, /FILES, and /ALL) are
+       ignored.
+     * /SORT:anything gives incorrect results if any files have lengths
+       greater than 10 digits (i.e. that are more than 9999999999 bytes
+       long, i.e. if they are 10GB or more in size) because the overlong
+       length field causes the date and name fields to be misaligned.
+     * /SORT:NAME is redundant in VMS since VMS returns filenames in
+       alphabetic order anyway.
+     * /SORT:NAME ignores alphabetic case on platforms where case does not
+       matter in filenames, but this works only for unaccented Roman
+       letters A-Z.
+     * /SORT:NAME is currently based on code values, and so works fine for
+       ASCII, but will probably produce unexpected results for files with
+       non-ASCII or 8-bit characters in their names. (Locale-based sorting
+       raises rather significant issues of portability, size, performance,
+       etc.)
+     * /SORT:DATE works right only for ISO-format dates, not English ones.
+     * /SORT:SIZE sorts the size field lexically. On some platforms (e.g.
+       Windows), the size of a directory file is listed as "<DIR>" rather
+       than as a number; in this case, the "<DIR>" files are gathered at
+       the end (or beginning, depending on the sort order) of the listing.
+     * /RECURSIVE is accepted but ignored in AOS/VS. Use the normal
+       system-specific filespec notation, e.g. "dir #.txt".
+     * /RECURSIVE has no affect when a full, absolute pathname is given;
+       e.g. "dir /recursive /tmp/foo" (where "foo" is a regular file) only
+       shows the "/tmp/foo" file. If you want to see all "foo" files in
+       the /tmp tree, do "cd /tmp" and then "dir /recursive foo".
+     * If a file size of -1 is shown, or date-time of 0000-00-00 00:00:00,
+       this means the file was located, but access to information about
+       the file was denied to C-Kermit.
+     * In VMS, if FOO.DIR;1 is a directory within your current directory,
+       "directory foo" and "directory [.foo]" list the files in the [.FOO]
+       subdirectory, but "directory foo.dir" lists the directory file
+       itself; similarly for "*.dir" versus "[.*]", etc.
+     * In UNIX, if "foo" is a directory within your current directory,
+       "directory foo" lists the files in the foo directory. If you want
+       to list the foo directory file itself, put an asterisk at the end:
+       "dir foo*".
+
+   Hint: How to find the biggest files in a directory tree:
+
+  cd xxx ; (root of tree)
+  directory /sort:size /recursive /reverse /dotfiles /page
+
+   Another hint: If you often use several different directory-listing
+   formats, define macro shortcuts for them:
+
+  DEFINE WD DIRECTORY /SORT:DATE /REVERSE \%*  ; Reverse chronological order
+  DEFINE SD DIRECTORY /SORT:SIZE /REVERSE \%*  ; Reverse order of size
+  DEFINE ND DIRECTORY /SORT:NAME /ASCEND \%*   ; Alphabetical by name
+  DEFINE DL DIR /DIR /SORT:NAME /ASCEND \%*    ; Alphabetical directory list
+
+   Put these definitions in your C-Kermit customization file. Note that
+   "\%*" ([475]Section 7.5) in these definitions lets you include other
+   switches in your macro invocations, e.g.:
+
+  wd /headings *.txt
+
+   Of course you can still access your external directory listing program
+   by using RUN or "!", e.g. in VMS:
+
+  run directory /size/date/protection/except=*.obj oofa.*;0
+
+   or:
+
+  !dir /size/date/prot/exc=*.obj oofa.*;0
+
+   In UNIX, use "!ls" or just "ls" (which is a special synonym for "!ls").
+
+4.5.2. The CD and BACK Commands
+
+   In C-Kermit 7.0, the CD command has a new friend, the BACK command.
+   BACK means "CD to my previous current directory". A second BACK brings
+   you back to where you were before the first one; thus successive BACK
+   commands switch back and forth between two directories.
+
+4.5.2.1. Parsing Improvements
+
+   The CD command, as well as other commands that parse a directory name,
+   were changed in 7.0 to provide all the expected functions: completion
+   on Tab or Esc, directory-name lists on ?, etc. Other affected commands
+   include SET SERVER GET-PATH, SET TEMP-DIRECTORY, SET FILE
+   DOWNLOAD-DIRECTORY, and SPACE. CD and REMOTE CD also now work with
+   logical names.
+
+   In VMS, the situation is a bit complicated since a directory name can
+   look like "DEV:", "[FOO.BAR]", "DEV:[FOO.BAR]", "[FOO]BAR.DIR;1", etc.
+   Completion and ?-help might not always work, but they do in many cases.
+   Examples:
+
+  cd ?           Lists all subdirectories of the current directory
+  cd []?         Ditto
+  cd k?          Ditto, but only those starting with K
+  cd [foo]?      Lists all subdirectories of the [FOO] directory
+  cd [-]?        Lists all subdirectories of the superior directory
+  cd [--]?       Lists all subdirectories of the directory 2 levels up
+  cd [...]?      Lists all directories below the current one
+  cd [foo.?      Does not work.
+
+   C-Kermit allows all of the following in VMS:
+
+  cd bar         CD to subdirectory BAR of the current directory
+  cd .bar        Ditto
+  cd [.bar]      Ditto
+  cd bar.dir     etc...
+  cd bar.dir;
+  cd bar.dir;1
+  cd [foo.bar]
+  cd <foo.bar>
+  cd bar.baz     This can go more than 1 level deep...
+  cd dir:        (where logical name DIR is defined as [FOO.BAR])
+
+   As well as the following:
+
+  cd ..          Go up one level as in UNIX
+  cd .           The current directory
+  cd             My login directory
+
+   Note that "cd -" (go up one level) does not work as expected, because
+   "-" is Kermit's command continuation character. However, "cd [-]", and
+   "
+   cd {-}" have the desired effect (and so does "cd ..", which is easier
+   to type).
+
+4.5.2.2. The CDPATH
+
+   The CD command in the UNIX, Windows, OS/2, and VMS versions of
+   C-Kermit, as of version 6.1 / 1.1.12, searches the CDPATH for the given
+   directory, if it is not absolute and if a CDPATH environment variable
+   is defined. Example (in UNIX ksh or bash):
+
+  $ export CDPATH=$HOME:$HOME/kermit:/tmp
+
+   Now if you give a "cd xxx" command, no matter what your current
+   directory is, if the "xxx" directory is not a subdirectory of your
+   current directory, then the xxx subdirectory of your home directory is
+   used or if that does not exist, then the xxx subdirectory of the kermit
+   subdirectory of your home directory is used or if that does not exist,
+   then /tmp/xxx is used. This is how the ksh "cd" command works, and now
+   the C-Kermit CD command works the same way.
+
+   In VMS, you can define CDPATH to be a list of directories that contain
+   actual directory delimiters, and/or logical names representing
+   directories, using commas to separate them, e.g.:
+
+  $ define cdpath [HOME],[SOMEOTHERDIR],[HOME.MISC]
+  $ define cdpath SYS$LOGIN:,DISK1:[HOME],DISK2:[SCRATCH.IVAN]
+
+   Example:
+
+  $ define cdpath SYS$LOGIN:,[IVAN],[OLAF],[OLGA.MISC]
+  $ kermit
+  DISK1:[OLGA] C-Kermit> cd blah
+
+   tries the BLAH subdirectory of the user's login directory, then
+   [OLGA.BLAH], [IVAN.BLAH], [OLAF.BLAH], and [OLGA.MISC.BLAH], in that
+   order, using the first one it finds, failing if it finds none.
+
+   In C-Kermit 7.0, you may also set the CDPATH from the Kermit prompt:
+
+   SET CD PATH path
+          Allows the CD PATH to be set from within C-Kermit.
+
+   SHOW CD shows the CD path and all other information relevant to the CD
+   command.
+
+4.5.2.3. CD Messages
+
+   Whenever you change directory, you can have C-Kermit display a "Read
+   Me" file from the new directory automatically. The commands are:
+
+   SET CD MESSAGE { ON, OFF, FILE list }
+          ON enables this feature; OFF (the default) disables it. File
+          lets you specify the name of the "Read Me" file. A list of names
+          to look for can be given in the following format:
+
+  {{name1}{name2}{name3}{...}}
+
+          e.g.:
+
+  SET SERVER CD-MESSAGE FILE {{./.readme}{README.TXT}{READ.ME}}
+
+          The default list of CD-message files is system dependent.
+
+   SHOW CD shows your current directory, previous directory, CD path, and
+   CD message info.
+
+4.5.3. Creating and Removing Directories
+
+   The MKDIR command now allows you to create multiple directories at
+   once:
+
+  C-Kermit> mkdir a/b/c/d
+
+   creates the directory a in the current directory (if it doesn't exist
+   already), and then creates subdirectory b in the a directory (if it
+   didn't exist already), and so on.
+
+   If you use MKDIR to try to create a directory that already exists,
+   C-Kermit will print a warning ("?Directory already exists"), but the
+   MKDIR command will still succeed. If you want to avoid the warning
+   message, use IF DIRECTORY first to check if the directory already
+   exists.
+
+   The RMDIR command, however, will not remove more than one directory,
+   nor will it remove a directory that contains any files. (There is, as
+   yet, no RMDIR /RECURSIVE command, although one might be added later.)
+
+   In VMS, these commands (like CD) are more forgiving of your syntax than
+   is the DCL command shell; "mkdir oofa" is equivalent to "mkdir [.oofa]"
+   and so on. Also in VMS, you'll find that C-Kermit's RMDIR command is
+   easier than deleting a directory in DCL, since it automatically first
+   gives it owner delete permission if you are the owner.
+
+4.5.4. The DELETE and PURGE Commands
+
+   The DELETE command now offers a selection of switches, and has a new
+   companion, the PURGE command. First, DELETE:
+
+   DELETE [ switches... ] filespec
+          Deletes the file or files that match the filespec, which may
+          contain wildcards ([476]Section 4.9).
+
+   Optional switches include the standard file-selection switches
+   presented in [477]Section 1.5.4, plus:
+
+   /ASK
+          Before deleting each file, ask permission interactively. Answers
+          are Yes or OK (delete the file), No (don't delete it), or Quit
+          (stop executing the DELETE command).
+
+   /NOASK
+          Don't ask permission to delete each file.
+
+   /LIST
+          List each file and show whether it was deleted. Synonyms: /LOG,
+          /VERBOSE.
+
+   /NOLIST
+          Don't list files while deleting them. Synonyms: /NOLOG, /QUIET.
+
+   /HEADING
+          Print a heading and summary line.
+
+   /NOHEADING
+          Don't print a heading and summary line.
+
+   /PAGE
+          When listing, pause at the end of each screenful and give the
+          "More?" prompt. If you reply "n" (no), the DELETE command
+          terminates.
+
+   /SIMULATE
+          Do everything implied by the given switches and filespec, except
+          do not actually delete any files. This lets you preview which
+          files would be deleted; implies /LIST.
+
+   Now the PURGE command:
+
+   PURGE [ switches... ] [ filespec ]
+          (VMS only) Runs the DCL PURGE command. Switches and filespec, if
+          any, are passed directly to DCL without parsing or verification.
+          Deletes excess versions of the given (or all) files. The rest of
+          this section does not apply to VMS.
+
+   PURGE [ switches... ] [ filespec ]
+          (UNIX only) Deletes "backup files" that match the filespec,
+          which may contain wildcards ([478]Section 4.9). If no filespec
+          is given, all backup files in the current directory are selected
+          (subject to modification by any switches). Do not include backup
+          notation in the filespec.
+
+   Explanation:
+
+   To avoid destroying preexisting files when a new file arrives that has
+   the same name, C-Kermit backs up the old file by appending a "backup
+   number" to its name. In UNIX, the backup suffix consists of a period, a
+   tilde, a number, and another tilde. For example, if a file called
+   oofa.txt exists and a new oofa.txt file arrives, the original is
+   renamed to oofa.txt.~1~. If another oofa.txt file arrives, the existing
+   one is renamed to oofa.txt.~2~. And so on. This system is compatible
+   with the one used by EMACS. Thus over time, if you receive a lot of
+   files with C-Kermit or edit them with EMACS, backup files can build up.
+   The new PURGE command lets you clean out accumulated backup files:
+
+   Optional switches include the standard file-selection switches
+   presented in [479]Section 1.5.4, plus all the switches listed above for
+   the DELETE command, plus:
+
+   /KEEP:n
+          Retains the n most recent (highest-numbered) backup files for
+          each file. For example, if oofa.txt, oofa.txt.~1~, oofa.txt.~2~,
+          oofa.txt.~10~, oofa.txt.~12~, and oofa.txt.~100~ exist, "purge
+          /keep:2 oofa.txt" deletes oofa.txt.~1~, oofa.txt.~2~, and
+          oofa.txt.~10~, and keeps oofa.txt, oofa.txt.~12~, and
+          oofa.txt.~100~. If /KEEP is given without a number, one (the
+          highest numbered) backup file is kept.
+
+   CAUTION: The PURGE command should be used only when *.~*~ files truly
+   are backup files. This is the case for EMACS, and it is the DEFAULT for
+   C-Kermit. However, if C-Kermit's FILE COLLISION has been set to RENAME,
+   newly received files will look like backup files. In that case, don't
+   use the PURGE command or you'll be removing new files rather than old
+   ones. (Use SHOW FILE to find the FILE COLLISION setting.)
+
+   The PURGE command is presently available only in UNIX. The command
+   succeeds if it deleted any files, or if it deleted no files but there
+   were no errors. It fails if it deleted no files and there were errors
+   (i.e. deletion was attempted but failed). In VMS, backup file versions
+   are handled automatically by the OS, and a PURGE command can be used at
+   the VMS prompt to clean them up.
+
+   If you want certain switches to be supplied automatically with each
+   DELETE or PURGE command, you can set them with SET OPTIONS
+   ([480]Section 1.5.5) and you can display any such settings with SHOW
+   OPTIONS. Of course you can override them on a per-command basis by
+   including switches in your PURGE or DELETE command.
+
+   Also see SET FILE COLLISION, SHOW FILE, SEND /NOBACKUP, SET SEND
+   BACKUP, and DIRECTORY /[NO]BACKUP.
+
+4.6. Starting the Remote Kermit Server Automatically
+
+   As noted on pages 275-276 of [481]Using C-Kermit 2nd edition, you can
+   have Kermit send "kermit receive" commands automatically when it is in
+   local mode and you give a SEND or similar command, to start the remote
+   Kermit receiver in case it is not already started. The "kermit receive"
+   commands are specified by:
+
+  SET PROTOCOL KERMIT binary-receive-command text-receive-command
+
+   As of version 7.0, a Kermit protocol option has been added to send a
+   string to the host in advance of any Kermit packets when you give a
+   GET-class or REMOTE command. This will switch the remote C-Kermit into
+   the appropriate mode or, if the remote system is at a system command
+   (shell) prompt, execute the string on the remote system. The new syntax
+   of the SET PROTOCOL KERMIT command is:
+
+  SET PROTOCOL KERMIT [ s1 [ s2 [ s3 ] ] ]
+
+   where:
+
+       Default         Meaning
+  s1  {kermit -ir}     Remote "kermit receive in binary mode" command.
+  s2  {kermit -r}      Remote "kermit receive in text mode" command.
+  s3  {kermit -x}      Remote "start kermit server" command.
+
+   NOTE: If the remote Kermit is 6.0, the following are recommended for
+   fast startup and high-performance file transfer (see Appendix I in
+   [482]Using C-Kermit, second Edition, for command-line options):
+
+  s1   kermit -YQir   (Kermit receive binary, skip init file, fast.)
+  s2   kermit -YQTr   (Kermit receive text, skip init file, fast.)
+  s3   kermit -YQx    (Kermit server, skip init file, fast.)
+
+   If the remote is C-Kermit 7.0 or later, change the -x option (enter
+   server mode) to -O (uppercase letter O), which means "enter server mode
+   for One transaction only); this way, it is not stuck in server after
+   the transfer. Also note that the Q is redundant in version 7.0, since
+   fast Kermit protocol settings are now the default.
+
+   Note that in case the C-Kermit executable is called "wermit" or
+   "ckermit" you can change "kermit" in the strings above to "wermit" or
+   "ckermit" and C-Kermit 7.0 or later will recognize these as synonyms
+   for "kermit", in case it is at its command prompt when one of these
+   strings is sent to it.
+
+4.7. File-Transfer Command Switches
+
+   Over the years, various new methods of transferring a file have
+   accumulated, until we had, in addition to the SEND command, also MOVE
+   (send and then delete), MAIL (send as email), REMOTE PRINT (send to be
+   printed), CSEND (send the output of a command), PSEND (send a part of a
+   file), BSEND (send in binary mode), RESEND (resume an interrupted
+   SEND), etc etc. Similarly: GET, REGET, CGET, RETRIEVE, and so on.
+
+   Not only is it confusing to have different names for these commands,
+   many of which are not real words, but this also does not allow all
+   combinations, like "send a file as mail, then delete it".
+
+   In C-Kermit 7.0, the SEND, GET, and RECEIVE commands were restructured
+   to accept modifier switches (switches are explained in [483]Section
+   1.5).
+
+4.7.1. SEND Command Switches
+
+   Without switches, the SEND command still works exactly as before:
+
+  send oofa.txt      ; send a single file
+  send oofa.*        ; send multiple files
+  send oofa.txt x.x  ; send oofa.txt as x.x (tell receiver its name is x.x)
+  send               ; send from SEND-LIST
+
+   But now the following modifier switches may be included between "send"
+   and the filename. Zero, one, two, or more switches may be included in
+   any combination that makes sense. Switch names (such as /BINARY) can be
+   abbreviated, just like any other keywords. Most of these switches work
+   only when using Kermit protocol (/TEXT and /BINARY are the exceptions).
+
+   /AFTER:date-time
+          Specifies that only those files modified (or, in VMS, created)
+          after the given date-time (see [484]Section 1.6) are to be sent.
+          Examples:
+
+  send /text /after:{2-Feb-1997 10:28:30} *.txt
+  send /text /after:\fdate(oofa.txt) *.txt
+
+          Synonym: /SINCE.
+
+   /ARRAY:arrayname
+          Specifies that instead of sending a file, C-Kermit is to send
+          the contents of the given array. Since an array does not have a
+          filename, you should include an /AS-NAME switch to specify the
+          name under which the array is to be sent (if you do not, the
+          name "_array_x_" is used, where 'x' is replaced by the array
+          designator). See [485]section 7.10 for array-name syntax. As
+          noted in that section, you can also include a range to have a
+          segment of the array sent, rather than the whole thing; for
+          example: "send /array:&a[100:199]". It is strongly recommended
+          that you accompany the /ARRAY switch with a /TEXT or /BINARY
+          switch to force the desired transfer mode, since otherwise the
+          various automatic mechanisms might switch to binary mode when
+          you really wanted text, or vice versa. In text mode a line
+          terminator is added to the end of each array element, but not in
+          binary mode. For details and examples see [486]Section 7.10.11.
+
+   /AS-NAME:text
+          Specifies "text" as the name to send the file under. You can
+          also still specify the as-name as the second filename on the
+          SEND command line. The following two commands are equivalent:
+
+  send oofa.txt oofa.new
+  send /as:oofa.new oofa.txt
+
+   /BEFORE:date-time
+          Specifies that only those files modified (or, in VMS, created)
+          before the given date-time ([487]Section 1.6) are to be sent.
+
+   /BINARY
+          Performs this transfer in binary mode without affecting the
+          global transfer mode, overriding not only the FILE TYPE and
+          TRANSFER MODE settings, but also the FILE PATTERN setting, but
+          for this SEND command only. In other words, SEND /BINARY means
+          what it says: send the file in binary mode, regardless of any
+          other settings. Example:
+
+  set file type text      ; Set global transfer mode to text
+  send /binary oofa.zip   ; Send a file in binary
+  send oofa.txt           ; This one is sent in text mode
+
+   /COMMAND
+          SEND /COMMAND is equivalent to CSEND ([488]Section 4.2.2) -- it
+          says to send the output from a command, rather than the contents
+          of a file. The first "filename" on the SEND command line is
+          interpreted as the name of a command; the second (if any) is the
+          as-name. Examples:
+
+  send /command {grep Sunday oofa.txt} sunday.txt
+  send /as-name:sunday.txt /command {grep Sunday oofa.txt}
+  send /bin /command {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
+
+   /DELETE
+          Deletes the file (or each file in the group) after it has been
+          sent successfully (but does not delete it if it was not sent
+          successfully). SEND /DELETE is equivalent to MOVE. Has no effect
+          when used with /COMMAND. Example:
+
+  send /delete *.log
+
+   /DOTFILES
+          (UNIX and OS-9 only) Normally files whose names begin with "."
+          are skipped when matching wildcards that do not also beging with
+          ".". Include /DOTFILES to force these files to be included too.
+
+   /RECURSIVE
+          Descend the through the directory tree when locating files to
+          send. Automatically sets /PATHNAMES:RELATIVE. Explained in
+          [489]Section 4.11 .
+
+   /EXCEPT:pattern
+          See [490]Section 1.5.4.
+
+   /NOBACKUP
+          This means to skip backup files when sending, even if they match
+          the SEND file specification. This is equivalent to using SEND
+          /EXCEPT and including *.~[0-9]*~ in the exception list (or *.~*~
+          if Kermit was built without pattern-matching support; see
+          [491]Section 4.9.1). Including this switch is equivalent to
+          giving SET SEND BACKUP OFF ([492]Section 4.0.6) prior to SEND,
+          except its effect is local to the SEND command with which it was
+          given.
+
+   /NODOTFILES
+          The opposite of /DOTFILES (q.v.)
+
+   /FILENAMES:{CONVERTED,LITERAL}
+          Use this switch to override the current global SET FILE NAMES
+          setting for this transfer only.
+
+   /FILTER:command
+          This specifies a filter to pass the file through before sending
+          it. See the [493]section on file-transfer pipes and filters. The
+          /FILTER switch applies only to the file-transfer command it is
+          given with; it does not affect the global SEND FILTER setting,
+          if any.
+
+   /IMAGE
+          VMS: Sends in image mode. Non-VMS: same as /BINARY.
+
+   /LABELED
+          VMS and OS/2 only: Sends in labeled mode.
+
+   /LARGER-THAN:number
+          Specifies that only those files that are longer than the given
+          number of bytes are to be sent.
+
+   /LISTFILE:filename
+          Specifies that the files to be sent are listed in a file with
+          the given filename. The file contains one filename per line.
+          These filenames are not checked in any way; each filename is
+          taken and does not use or depend on any Kermit-specific syntax.
+          In particular, backslashes are not treated specially, leading
+          and trailing spaces are not stripped, etc. However, if a
+          filename contains wildcards, they are expanded. Example: If a
+          file named files.txt contains the following lines:
+
+  blah.txt
+  oofa*
+  x.x
+
+          (but without leading or trailing spaces), then the C-Kermit
+          command "send /listfile:files.txt" will send the files blah.txt,
+          x.x, and all files whose names start with "oofa", assuming the
+          files exist and are readable. The /LISTFILE switch, can, of
+          course, be used with other switches when it makes sense, for
+          example, /EXCEPT, /BINARY, /AFTER, /SMALLER, /MOVE-TO, /DELETE,
+          /AS-NAME with a template, etc.
+
+   /MAIL:address
+          Sends the file as e-mail to the given address or addresses.
+          "send /mail:address filename" is equivalent to "mail filename
+          address". You can include multiple addresses separated by
+          commas. Examples:
+
+  send /mail:kermit-support@columbia.edu packet.log
+  send /mail:cmg,fdc,jrd oofa.txt
+
+          As with any switch argument, if the address or address list
+          contains any spaces, you must enclose it in braces. The format
+          of the addresses must agree with that understood by the
+          mail-sending program on the receiver's computer.
+
+   /MOVE-TO:directory-name
+          Specifies that after each (or the only) source file is sent
+          successfully, and ONLY if it is sent successfully, it should be
+          moved to the named directory. If the directory name contains
+          spaces, enclose it in braces. If the directory does not exist,
+          it is created if possible; if it can't be created, the command
+          fails and an error message is printed. Example:
+
+  send /text /move-to:/users/olga/backup/ *.txt
+
+   /NOT-AFTER:date-time
+          Specifies that only those files modified at or before the given
+          date and time are to be sent.
+
+   /NOT-BEFORE:date-time
+          Specifies that only those files modified at or after the given
+          date and time are to be sent.
+
+   /PATHNAMES:{OFF,ABSOLUTE,RELATIVE}
+          Use this switch to override the current global SET SEND
+          PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE or
+          RELATIVE also sets /FILENAMES:LITERAL (also for this transfer
+          only) since pathnames are not sent otherwise.
+
+   /RENAME-TO:text
+          Specifies that after the (or each) source file is sent
+          successfully, and ONLY if it is sent successfully, it should be
+          renamed to the name given. If the name contains spaces, enclose
+          it in braces. If a file group is being sent, then the "text"
+          must contain a variable reference such as \v(filename) (see
+          [494]Section 4.1). Example:
+
+  send /rename-to:ok_\v(filename) *.*
+
+          This sends each file in the current directory and if it was sent
+          successfully, changes its name to begin with "ok_".
+
+   /SMALLER-THAN:number
+          Specifies that only those files that are smaller than the given
+          number of bytes are to be sent.
+
+   /SUBJECT:text
+          Subject for email. Actually, this is just a synonym for
+          /AS-NAME. If the text includes spaces, you must enclose it in
+          braces. If you don't specify a subject (or as-name), the name of
+          the file is used as the subject. Example:
+
+  send /mail:kermit-support@columbia.edu /subj:{As requested} packet.log
+
+   /PRINT:options
+          Sends the file to be printed, optionally specifying options for
+          the printer. Equivalent to REMOTE PRINT filename options.
+          Examples:
+
+  send /print oofa.txt              ; No options.
+  send /print:/copies=3 oofa.txt    ; "/copies=3" is a VMS PRINT switch.
+  send /print:-#3 oofa.txt          ; "-#3" is a UNIX lpr switch.
+
+   /PROTOCOL:name
+          Uses the given protocol to send the file (Kermit, Zmodem, etc)
+          for this transfer without changing global protocol. Only
+          available in Kermit 95, UNIX, and OS-9. Example:
+
+  set protocol kermit               ; Set global protocol
+  send /proto:zmodem /bin oofa.zip  ; Send just this file with Zmodem
+  send oofa.txt                     ; This file is sent with Kermit
+
+   /QUIET
+          When sending in local mode, this suppresses the file-transfer
+          display.
+
+   /RECOVER
+          Used to recover from a previously interrupted transfer; SEND
+          /RECOVER is equivalent to RESEND. Recovery only works in binary
+          mode; SEND /RECOVER and RESEND include an implied /BINARY
+          switch. Even then, recovery will successful only if (a) the
+          original (interrupted) transfer was also in binary mode, or (b)
+          if it was in text mode, the two Kermit programs run on platforms
+          where text-mode transfers are not length-changing.
+
+   /STARTING:number
+          Starts sending the file from the given byte position. SEND
+          /STARTING:n filename is equivalent to PSEND filename n.
+
+   /TEXT
+          Performs this transfer in text mode without affecting the global
+          transfer mode, overriding not only the FILE TYPE and TRANSFER
+          MODE settings, but also the FILE PATTERN setting, for this SEND
+          command only. In other words, SEND /TEXT really send the file in
+          text mode, regardless of any other settings or negotiations.
+
+   About mail... Refer to [495]Section 4.7.1. The same rules apply as for
+   file transfer. If you are mailing multiple files, you can't use an
+   as-name (in this case, a subject) unless it contains replacement
+   variables like \v(filenum). For example, if you:
+
+  send /mail:somebody@xyz.com *.txt
+
+   Then each file will arrive as a separate email message with its name as
+   the subject. But if you:
+
+  send /mail:somebody@xyz.com /subject:{Here is a file} *.txt
+
+   Then each file message will have the same subject, which is probably
+   not what you want. You can get around this with constructions like:
+
+  send /mail:somebody@xyz.com /subject:{Here is \v(filename)} *.txt
+
+   which embed the filename in the subject.
+
+   The MOVE, CSEND, MAIL, and RESEND commands now also accept the same
+   switches. And the switches are also operative when sending from a
+   SEND-LIST (see [496]Using C-Kermit, 2nd Ed, pp.191-192), so, for
+   example, it is now possible to SEND /PRINT or SEND /MAIL from a
+   SEND-LIST.
+
+   The MSEND and MMOVE commands also take switches, but not all of them.
+   With these commands, which take an arbitrary list of filespecs, you can
+   use /BINARY, /DELETE, /MAIL, /PRINT, /PROTOCOL, /QUIET, /RECOVER, and
+   /TEXT (and /IMAGE or /LABELED, depending on the platform). MMOVE is
+   equivalent to MSEND /DELETE. (If you want to send a group of files, but
+   in mixed transfer modes with per-file as-names, use ADD SEND-LIST and
+   then SEND.)
+
+   The MSEND/MMOVE switches come before the filenames, and apply to all of
+   them:
+
+  msend /print /text *.log oofa.txt /etc/motd
+
+   If you type any of these commands (SEND, CSEND, MSEND, etc) followed by
+   a question mark (?), you will see a list of the switches you can use.
+   If you want to see a list of filenames, you'll need to type something
+   like "send ./?" (UNIX, OS/2, Windows, etc), or "send []?" (VMS), etc.
+   Of course, you can also type pieces of a filename (anything that does
+   not start with "/") and then "?" to get a list of filenames that start
+   that way; e.g. "send x.?" still works as before.
+
+   In UNIX, where "/" is also the directory separator, there is usually no
+   ambiguity between a fully-specified pathname and a switch, except when
+   a file in the root directory has the same name as a switch (as noted in
+   [497]Section 1.5):
+
+  send /etc/motd                        ; Works as expected
+  send /command                         ; ???
+
+   The second example interprets "/command" as a switch, not a filename.
+   To send a file actually called "command" in the root directory, use:
+
+  send {/command}
+
+   or other system-dependent forms such as //command, /./command,
+   c:/command, etc, or cd to / and then "send command".
+
+4.7.2. GET Command Switches
+
+   Without switches, the GET command still works about the same as before:
+
+  get oofa.txt                          ; GET a single file
+  get oofa.*                            ; GET multiple files
+
+   However, the mechanism for including an "as-name" has changed.
+   Previously, in order to include an as-name, you were required to use
+   the "multiline" form of GET:
+
+  get
+  remote-filespec
+  local-name
+
+   This was because the remote filespec might contain spaces, and so there
+   would be no good way of telling where it ended and where the local name
+   began, e.g:
+
+  get profile exec a foo
+
+   But now since we can use {braces} for grouping, we don't need the
+   multiline GET form any more, and in fact, support for it has been
+   removed. If you give a GET command by itself on a line, it fails and an
+   error message is printed. The new form is:
+
+   GET [ switches... ] remote-name [ local-name ]
+          Ask the server to send the file whose name is remote-name. If
+          the optional local-name is given, store it locally under this
+          name. If the remote-name or local-name contains spaces, they
+          must be enclosed in braces:
+
+  get {profile exec a} foo
+  get oofa.txt {~/My Files/Oofa text}
+
+   If you want to give a list of remote file specifications, use the MGET
+   command:
+
+   MGET [ switches... ] remote-name [ remote-name [ remote-name ... ] ]
+          Ask the server to send the files whose names are given.
+
+   Now you can also include modifier switches between GET or MGET and the
+   remote-name; most of the same switches as SEND:
+
+   /AS-NAME:text
+          Specifies "text" as the name to store the incoming file under.
+          (This switch is not available for MGET.) You can also still
+          specify the as-name as the second filename on the GET command
+          line. The following two commands are equivalent:
+
+  get oofa.txt oofa.new
+  get /as:oofa.new oofa.txt
+
+   /BINARY
+          Tells the server to send the given file(s) in binary mode
+          without affecting the global transfer mode. Example:
+
+  set file type text      ; Set global transfer mode to text
+  get /binary oofa.zip    ; get a file in binary mode
+  get oofa.txt            ; This one is transferred in text mode
+
+          Or, perhaps more to the point:
+
+  get /binary foo.txt     ; where "*.txt" is a text-pattern
+
+          This has the expected effect only if the server is C-Kermit 7.0
+          or later or K95 1.1.19 or later.
+
+   /COMMAND
+          GET /COMMAND is equivalent to CGET ([498]Section 4.2.2) -- it
+          says to receive the file into the standard input of a command,
+          rather than saving it on disk. The /AS-NAME or the second
+          "filename" on the GET command line is interpreted as the name of
+          a command. Examples:
+
+  get /command sunday.txt {grep Sunday oofa.txt}
+  get /command /as-name:{grep Sunday oofa.txt} sunday.txt
+  get /bin /command {!gunzip -c | tar xf -} {tar cf - . | gzip -c}
+
+   /DELETE
+          Asks the Kermit server to delete the file (or each file in the
+          group) after it has been transferred successfully (but not to
+          delete it if it was not sent successfully). GET /DELETE is
+          equivalent to RETRIEVE. Example:
+
+  get /delete *.log
+
+   /EXCEPT:pattern
+          Specifies that any files whose names match the pattern, which
+          can be a regular filename, or may contain "*" and/or "?"
+          metacharacters, are to be refused upon arrival. To specify
+          multiple patterns (up to 8), use outer braces around the group,
+          and inner braces around each pattern:
+
+  /EXCEPT:{{pattern1}{pattern2}...}
+
+          See the description of SEND /EXCEPT in [499]Section 4.7.1 for
+          examples, etc. Refusal is accomplished using the Attribute
+          Rejection mechanism (reason "name"), which works only when
+          Attribute packets have been successfully negotiated.
+
+   /FILENAMES:{CONVERTED,LITERAL}
+          Use this switch to override the current global SET FILE NAMES
+          setting for this transfer only.
+
+   /FILTER:command
+          This specifies a filter to pass the incoming file through before
+          writing to disk. See the [500]section on file-transfer pipes and
+          filters. The /FILTER switch applies only to the file-transfer
+          command it is given with; it does not affect the global RECEIVE
+          FILTER setting, if any.
+
+   /IMAGE
+          VMS: Transfer in image mode. Non-VMS: same as /BINARY.
+
+   /LABELED
+          VMS and OS/2 only: Specifies labeled transfer mode.
+
+   /MOVE-TO:directory
+          This tells C-Kermit to move each file that is successfully
+          received to the given directory. Files that are not successfully
+          received are not moved. By default, files are not moved.
+
+   /PATHNAMES:{OFF,ABSOLUTE,RELATIVE,AUTO}
+          Use this switch to override the current global SET RECEIVE
+          PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE or
+          RELATIVE also sets /FILENAMES:LITERAL (also for this transfer
+          only) since incoming pathnames would not be treated as pathnames
+          otherwise. See [501]Section 4.10.
+
+   /QUIET
+          When sending in local mode, this suppresses the file-transfer
+          display.
+
+   /RECOVER
+          Used to recover from a previously interrupted transfer; GET
+          /RECOVER is equivalent to REGET. Recovery only works in binary
+          mode; SEND /RECOVER and RESEND include an implied /BINARY
+          switch. Even then, recovery will successful only if (a) the
+          original (interrupted) transfer was also in binary mode, or (b)
+          if it was in text mode, the two Kermit programs run on platforms
+          where text-mode transfers are not length-changing.
+
+   /RECURSIVE
+          Tells the server that the GET file specification applies
+          recursively. This switch also automatically sets
+          /PATHNAMES:RELATIVE in both the server AND the client. When used
+          in conjunction with /DELETE, this "moves" a directory tree from
+          the server's computer to the client's computer (except that only
+          regular files are deleted from the server's computer, not
+          directories; thus the original directories will be left, but
+          will contain no files). Note that all servers that support
+          /RECURSIVE do not necessarily do so in combination with other
+          switches, such as /RECOVER. (Servers that do include C-Kermit
+          7.0 and later, K95 1.1.19 and later.)
+
+   /RENAME-TO:string
+          This tells C-Kermit to rename each file that is successfully
+          received to the given string. Files that are not successfully
+          received are not renamed. By default, files are not renamed. The
+          string can be a literal string, which is appropriate when only
+          one file is being received, or it can contain one or more
+          variables that are to be evaluated at the time each file is
+          received, such as \v(filename), \v(filenumber), \v(ntime),
+          \v(pid), \v(user), etc. WARNING: if you give a literal string
+          and more than one file arrives, each incoming file will be given
+          the same name (but SET FILE COLLISION BACKUP or RENAME can be
+          used to keep the incoming files from overwriting each other).
+
+   /TEXT
+          Tells the server to perform this transfer in text mode without
+          affecting its global transfer mode. See /BINARY for additional
+          info.
+
+   The /MAIL and /PRINT options are not available (as they are for SEND),
+   but you can use /COMMAND to achieve the same effect, as in these UNIX
+   examples:
+
+  get /command oofa.txt {mail kermit@columbia.edu}
+  get /command oofa.txt lpr
+
+   In OS/2 or Windows, you can GET and print like this:
+
+  get oofa.txt prn
+
+   The CGET, REGET, RETRIEVE commands also accept the same switches as
+   GET. CGET automatically sets /COMMAND; REGET automatically sets
+   /RECOVER and /BINARY, and RETRIEVE automatically sets /DELETE.
+
+4.7.3. RECEIVE Command Switches
+
+   Without switches, the RECEIVE command still works as before:
+
+  receive            ; Receives files under their own names
+  receive /tmp       ; Ditto, but into the /tmp directory
+  r                  ; Same as "receive"
+  receive foo.txt    ; Receives a file and renames to foo.txt
+
+   Now you can also include modifier switches may be included between
+   "receive" and the as-name; most of the same switches as GET:
+
+   /AS-NAME:text
+          Specifies "text" as the name to store the incoming file under.
+          You can also still specify the as-name as a filename on the
+          command line. The following two commands are equivalent:
+
+  r oofa.new
+  r /as:oofa.new
+
+   /BINARY
+          Performs this transfer in binary mode without affecting the
+          global transfer mode. NOTE: This does not override the incoming
+          filetype (as it does with GET), so this switch is useful only if
+          ATTRIBUTE TYPE is OFF, or if the other Kermit does not send a
+          TYPE (text or binary) attribute. In any case, it has no affect
+          whatsoever on the file sender.
+
+   /COMMAND
+          RECEIVE /COMMAND is equivalent to CRECEIVE ([502]Section 4.2.2)
+          -- it says to receive the file into the standard input of a
+          command, rather than saving it on disk. The /AS-NAME or the
+          "filename" on the RECEIVE command line is interpreted as the
+          name of a command.
+
+  r /command {grep Sunday oofa.txt}
+  r /command /as-name:{grep Sunday oofa.txt}
+  r /bin /command {tar cf - . | gzip -c}
+
+   /EXCEPT:pattern
+          Specifies that any files whose names match the pattern, which
+          can be a regular filename, or may contain "*" and/or "?"
+          metacharacters, are to be refused upon arrival. To specify
+          multiple patterns (up to 8), use outer braces around the group,
+          and inner braces around each pattern:
+
+  /EXCEPT:{{pattern1}{pattern2}...}
+
+          See the description of SEND /EXCEPT in [503]Section 4.7.1 for
+          examples, etc. Refusal is accomplished using the Attribute
+          Rejection mechanism (reason "name"), which works only when
+          Attribute packets have been successfully negotiated.
+
+   /FILENAMES:{CONVERTED,LITERAL}
+          Use this switch to override the current global SET FILE NAMES
+          setting for this transfer only.
+
+   /FILTER:command
+          This specifies a filter to pass the incoming file through before
+          writing to disk. See the [504]section on file-transfer pipes and
+          filters. The /FILTER switch applies only to the file-transfer
+          command it is given with; it does not affect the global RECEIVE
+          FILTER setting, if any.
+
+   /IMAGE
+          VMS: Transfer in image mode. Non-VMS: same as /BINARY. See
+          comments under RECEIVE /BINARY.
+
+   /LABELED
+          VMS and OS/2 only: Specifies labeled transfer mode. See comments
+          under RECEIVE /BINARY.
+
+   /MOVE-TO:directory
+          This tells C-Kermit to move each file that is successfully
+          received to the given directory. Files that are not successfully
+          received are not moved. By default, files are not moved.
+
+   /PATHNAMES:{ABSOLUTE,RELATIVE,OFF,AUTO}
+          Use this switch to override the current global SET RECEIVE
+          PATHNAMES setting for this transfer only. See [505]Section 4.10.
+
+   /RECURSIVE
+          When used with the RECEIVE command, /RECURSIVE is simply a
+          synonym for /PATHNAMES:RELATIVE.
+
+   /RENAME-TO:string
+          This tells C-Kermit to rename each file that is successfully
+          received to the given string. Files that are not successfully
+          received are not renamed. By default, files are not renamed. The
+          string can be a literal string, which is appropriate when only
+          one file is being received, or it can contain one or more
+          variables that are to be evaluated at the time each file is
+          received, such as \v(filename), \v(filenumber), \v(ntime),
+          \v(pid), \v(user), etc. WARNING: if you give a literal string
+          and more than one file arrives, each incoming file will be given
+          the same name (but SET FILE COLLISION BACKUP or RENAME can be
+          used to keep the incoming files from overwriting each other).
+
+   /QUIET
+          When receiving in local mode, this suppresses the file-transfer
+          display.
+
+   /TEXT
+          Receives in text mode without affecting the global transfer
+          mode. See comments under RECEIVE /BINARY.
+
+   The /MAIL and /PRINT options are not available, but you can use
+   /COMMAND to achieve the same effect, as in these UNIX examples:
+
+  r /command {mail kermit@columbia.edu}
+  r /command lpr
+
+   In OS/2 or Windows, you can RECEIVE and print like this:
+
+  receive prn
+
+   The CRECEIVE command now also accepts the same switches.
+
+4.8. Minor Kermit Protocol Improvements
+
+4.8.1. Multiple Attribute Packets
+
+   C-Kermit 7.0 now sends more than one Attribute packet if a file's
+   attributes do not fit into a single packet of the negotiated length. If
+   a particular attribute (such as file creation date-time) does not fit
+   within the negotiated length (which will only happen when the
+   negotiated length is around 20 or less), that attribute is not sent at
+   all.
+
+4.8.2. Very Short Packets
+
+   There are certain situations where extremely short packets must be
+   used; 20 or 30 bytes at most. This can happen when one or more devices
+   along the communication path have very small buffers and lack an
+   effective means of flow control. Examples are sometimes cited involving
+   radio modems.
+
+   When the maximum packet length is shorter than certain packets that
+   would be sent, those packets are either truncated or else broken up
+   into multiple packets. Specifically:
+
+    1. Parameter negotiation packets (I, S, and their ACKs) are truncated
+       to the negotiated length. Any parameters that do not fit are reset
+       to their default values. There is no provision in the Kermit
+       protocol for fragmentation and reassembly of parameter strings.
+    2. File header packets (containing the filename) are simply truncated.
+       There is no provision in the Kermit protocol for fragmentation and
+       reassembly of filenames.
+    3. Attribute packets are fragmented and reassembled as described in
+       4.8.1 without loss of data, except in case a field will not fit at
+       all in the negotiated length (the longest attribute is usually the
+       date and time of file creation/modification) because of the rule
+       that attributes may not be broken across packets.
+    4. Data packets and other packets are unaffected -- they can be as
+       short as they need to be, within reason.
+
+4.9. Wildcard / File Group Expansion
+
+   "Wildcard" refers to the notation used in filenames to specify a group
+   of files by pattern matching.
+
+4.9.1. In UNIX C-Kermit
+
+   Prior to C-Kermit 7.0, C-Kermit was capable of expanding wildcard
+   strings containing only the "metacharacters" '*' and '?':
+
+   *
+          Matches any sequence of zero or more characters. For example:
+          "ck*.c" matches all files whose names start with "ck" and end
+          with ".c", including "ck.c".
+
+   ?
+          Matches any single character. For example, "ck?.c" matches all
+          files whose names are exactly 5 characters long and start with
+          "ck" and end with ".c". When typing commands at the prompt, you
+          must precede any question mark to be used for matching by a
+          backslash (\) to override the normal function of question mark,
+          which is providing menus and file lists.
+
+   C-Kermit 7.0 adds the additional features that users of ksh, csh, and
+   bash are accustomed to:
+
+   [abc]
+          Square brackets enclosing a list of characters matches any
+          single character in the list. Example: ckuusr.[ch] matches
+          ckuusr.c and ckuusr.h.
+
+   [a-z]
+          Square brackets enclosing a range of characters; the hyphen
+          separates the low and high elements of the range. For example,
+          [a-z] matches any character from a to z.
+
+   [acdm-z]
+          Lists and ranges may be combined. This example matches a, c, d,
+          or m through z.
+
+   {string1,string2,...}
+          Braces enclose a list of strings to be matched. For example:
+          ck{ufio,vcon,cmai}.c matches ckufio.c, ckvcon.c, or ckcmai.c.
+          The strings may themselves contain metacharacters, bracket
+          lists, or indeed, other lists of strings, but (when matching
+          filenames) they may not contain directory separators.
+
+          Thus, the metacharacters in filenames (and in any other field
+          that can be a pattern, such as the IF MATCH pattern, SEND or GET
+          exception lists, etc) are:
+
+ * ? [ {
+
+          And within braces only, comma (,) is a metacharacter.
+
+   To include a metacharacter in a pattern literally, precede it with a
+   backslash '\' (or two if you are passing the pattern to a macro).
+   Examples:
+
+  send a*b      ; Send all files whose names start with 'a' and end with 'b'.
+  send a?b      ; Ditto, but the name must be exactly three characters long.
+  send a[a-z]b  ; Ditto, but the second character must be a lowercase letter.
+  send a[x\-z]b ; Ditto, except the second character must be 'x', '-', or 'y'.
+  send a[ghi]b  ; Ditto, except the second character must be 'g', 'h', or 'i'.
+  send a[?*]b   ; Ditto, except the second character must be '?' or '*'.
+  send a[\?\*]b ; Same as previous.
+  send *?[a-z]* ; All files with names containing at least one character
+                ; that is followed by a lowercase letter.
+
+   Or, more practically:
+
+  send ck[cuw]*.[cwh]  ; Send the UNIX C-Kermit source files.
+
+   To refer to the C-Kermit sources files and makefile all in one
+   filespec:
+
+  {{makefile,ck[cuw]*.[cwh]}}
+
+   (NOTE: if the entire pattern is a {stringlist}, you must enclose it it
+   TWO pairs of braces, since the SEND command strips the outer brace
+   pair, because of the "enclose in braces if the filename contains
+   spaces" rule).
+
+   If the makefile is called ckuker.mak:
+
+  ck[cuw]*.{[cwh],mak}
+
+   (NOTE: double braces are not needed here since the pattern does not
+   both begin and end with a brace.)
+
+   To add in all the C-Kermit text files:
+
+  ck[cuw]*.{[cwh],mak,txt}
+
+   All of these features can be used anywhere you would type a filename
+   that is allowed to contain wildcards.
+
+   When you are typing at the command prompt, an extra level of quoting is
+   required for the '?' character to defeat its regular function of
+   producing a list of files that match what you have typed so far, for
+   example:
+
+  send ck[cu]?
+
+   lists all the files whose names start with ckc and cku. If you quote
+   the question mark, it is used as a pattern-matching character, for
+   example:
+
+  send ck\?[ft]io.c
+
+   sends all the file and communications i/o modules for all the
+   platforms: ckufio.c, ckutio.c, ckvfio.c, ckvtio.c, etc.
+
+   If, however, a filename actually contains a question mark and you need
+   to refer to it on the command line, you must use three (3) backslashes.
+   For example, if the file is actually called ck?fio.c, you would use:
+
+  send ck\\\?fio.c
+
+   Further notes on quoting:
+
+     * A single backslash is sufficient for quoting a special character at
+       the command prompt or in a command file. However, when passing
+       patterns to macros you'll need double backslashes, and when
+       referring to these patterns within the macro, you'll need to use
+       \fcontents(\%1) (see [506]Section 1.11.5). You should enclose macro
+       argument references in braces in case grouped arguments were
+       passed. Example:
+ define ismatch {
+     if match {\fcont(\%1)} {\fcont(\%2)} {
+         end 0 MATCH
+     } else {
+         end 1 NO MATCH
+     }
+ }
+ ismatch ab*yz a*\\**z           ; Backslash must be doubled
+ ismatch {abc def xyz} *b*e*y*   ; Braces must be used for grouping
+
+     * Watch out for possible conflicts between {} in filename patterns
+       and {} used for grouping multiple words into a single field, when
+       the pattern has outer braces. For example, in:
+     if match {abc xyz} {a* *z} echo THEY MATCH
+
+       braces must be used to group "abc xyz" into a single string. Kermit
+       strips off the braces before comparing the string with the pattern.
+       Therefore:
+ if match makefile {makefile,Makefile} echo THEY MATCH
+
+       does not work, but:
+ if match makefile {{makefile,Makefile}} echo THEY MATCH
+
+       does.
+     * If you use a pattern that has outer braces, like {*.txt,*.doc}, in
+       a field that accepts a pattern list (like SEND /EXCEPT:xxx), you'll
+       need to add two extra sets of outer braces:
+ send /except:{{{*.txt,*.doc}}} *.*
+
+   C-Kermit's new pattern matching capabilities are also used when
+   C-Kermit is in server mode, so now you can send requests such as:
+
+  get ck[cuw]*.[cwh]
+
+   to a C-Kermit server without having to tell it to SET WILD SHELL first.
+   Previously this would have required:
+
+  mget ckc*.c ckc*.w ckc*.h cku*.c cku*.w cku*.h ckw*.c ckw*.w ckw*.h
+
+   The new pattern matching features make SET WILD SHELL redundant, and
+   barring any objections, it will eventually be phased out. (One possible
+   reason for retaining it would be as an escape mechanism when Kermit
+   does not understand the underlying file system.)
+
+   By the way, patterns such as these are sometimes referred to as
+   "regular expressions", but they are not quite the same. In a true
+   regular expression (for example), "*" means "zero or more repetitions
+   of the previous item", so (for example), "([0-9]*)" would match zero or
+   more digits in parentheses. In Kermit (and in most shells), this
+   matches one digit followed by zero or more characters, within
+   parentheses. Here are some hints:
+
+     * Although you can't match any sequence of digits (or letters, etc),
+       you can match (say) 1, 2, or 3 of them in row. For example, the
+       following pattern matches Kermit backup files (with backup numbers
+       from 1 to 999):
+ *.~{[1-9],[1-9][0-9],[1-9][0-9][0-9]}~
+
+     * There is presently no NOT operator, so no way to match any
+       character or string EXCEPT the one(s) shown.
+
+   In other wildcarding news...
+
+     * You may now "send xxx" where "xxx" is a directory name, and this
+       will send all the files from the directory xxx, as if you had typed
+       "send xxx/*". You can also use the special shorthand "send ." to
+       send all the files from the current directory.
+     * To easily skip over backup files (the ones whose names end like
+       .~22~) when sending, you can use SEND /NOBACKUP (see [507]Section
+       4.0.6 for details).
+     * When choosing Kermit to expand wildcards, rather than the shell,
+       you can choose whether "dot files" -- files whose names begin with
+       ".", which are normally "invisible" -- should be matched:
+ SET WILD KERMIT /NO-MATCH-DOT-FILES (this is the default)
+ SET WILD KERMIT /MATCH-DOT-FILES    (this allows matching of "." files)
+
+       or include the /DOTFILES or /NODOTFILES switch on the command you
+       are using, such as SEND or DIRECTORY.
+     * Commands such as DIRECTORY and SEND allow recursive directory
+       traversal. There are also new functions for this to use in scripts.
+       See [508]Section 4.11 for details.
+
+   When building file lists in UNIX, C-Kermit follows symbolic links.
+   Because of this, you might encounter any or all of the following
+   phenomena:
+
+     * Multiple copies of the same file; e.g. one from its real directory
+       and others from links to its real directory, if both the real
+       directory and the links to it are in the wildcard expansion list.
+     * A command might unexpectedly "hang" for a long time because an NFS
+       link might not be responding, or the directory you are looking at
+       contains a link to a huge directory tree (example: "directory
+       /recursive /etc" when /etc/spool is a symlink to /var/spool, which
+       is a large organization's incoming email directory, containing tens
+       of thousands of subdirectories).
+
+   The size of the file list that Kermit can build is limited in most
+   C-Kermit implementations. The limit, if any, depends on the
+   implementation. Use the SHOW FEATURES command and look in the
+   alphabetized options list for MAXWLD to see the value.
+
+4.9.2. In Kermit 95
+
+   Kermit 95 1.1.19 and later uses the same pattern matching syntax as in
+   UNIX, but (as always) you will encounter numerous difficulties if you
+   use backslash (\) as the directory separator. In any command where K95
+   parses filenames itself (that is, practically any file-oriented command
+   except RUN), you can use forward slash (/) as the directory separator
+   to avoid all the nasty conflicts.
+
+4.9.3. In VMS, AOS/VS, OS-9, VOS, etc.
+
+   Platforms other than UNIX, Windows 95/98/NT, and OS/2 have their own
+   filename matching capabilities that are, in general, different from
+   Kermit's built-in ones and in any case might conflict with them. For
+   example, [] encloses directory names in VMS.
+
+   Nevertheless you can still use all the pattern-matching capabilities
+   described in [509]Section 4.9.1 by loading a file list into an array
+   (e.g. with \ffiles(*,&a), see [510]Section 4.11.3) and then using IF
+   MATCH on the members.
+
+4.10. Additional Pathname Controls
+
+   In version 6.0 and earlier, C-Kermit's SET { SEND, RECEIVE } PATHNAMES
+   command had only ON and OFF as options. In version 7.0, there are more
+   choices:
+
+   SET SEND PATHNAMES OFF
+          When sending a file, strip all disk/directory information from
+          the name. Example: "send /usr/olga/letters/oofa.txt" sends the
+          file as "oofa.txt". This applies to actual filenames, not to any
+          as-name you might specify.
+
+   SET SEND PATHNAMES RELATIVE
+          When sending a file, leave the pathname on as given. For
+          example, if your current directory is /usr/olga, "send
+          letters/oofa.txt" sends the file as "letters/oofa.txt", not
+          "/usr/olga/letters/oofa.txt" or "letters.txt".
+
+   SET SEND PATHNAMES ABSOLUTE
+          When sending a file, convert its name to the full, absolute
+          local pathname. For example, if your current directory is
+          /usr/olga, "send letters/oofa.txt" sends the file as
+          "/usr/olga/letters/oofa.txt". NOTE: Even with this setting,
+          device and/or node names are not included. For example, in VMS,
+          any node or device name is stripped; in Windows or OS/2, any
+          disk letter is stripped.
+
+   SET RECEIVE PATHNAMES OFF
+          When receiving a file, strip all disk/directory information from
+          the name before attempting to store it. This applies to incoming
+          filename, not to any as-name you might specify. Example: If a
+          file arrives under the name "/usr/olga/letters/oofa.txt" it is
+          stored simply as "oofa.txt" in your download directory or, if no
+          download directory has been specified, in your current
+          directory.
+
+   SET RECEIVE PATHNAMES RELATIVE
+          When receiving a file, leave the pathname on as it appears in
+          the incoming name, but if the incoming name appears to be
+          absolute, make it relative to your current or download
+          directory. Examples:
+
+          + "oofa.txt" is stored as "oofa.txt".
+          + "letters/oofa.txt" is stored as "letters/oofa.txt"; the
+            "letters" subdirectory is created if it does not already
+            exist.
+          + "/usr/olga/letters/oofa.txt" is stored as
+            "usr/olga/letters/oofa.txt" in your current or download
+            directory, and the "usr", "usr/olga", etc, directories are
+            created if they do not exist.
+
+   SET RECEIVE PATHNAMES ABSOLUTE
+          The incoming filename is used as given. Thus it cannot be stored
+          unless the given path (if any) already exists or can be created.
+          In this case, node, device, or disk designations are NOT
+          stripped, since they most likely were given explicitly by the
+          user as an as-name, meant to be used as given.
+
+   SET RECEIVE PATHNAMES AUTO
+          This is the default, and means RELATIVE if the sender tells me
+          it is a recursive transfer, OFF otherwise.
+
+   Set FILE NAMES CONVERTED now also affects pathnames too. When PATHNAMES
+   are RELATIVE or ABSOLUTE and FILE NAMES are CONVERTED, the file sender
+   converts its native directory-name format to UNIX format, and the file
+   receiver converts from UNIX format to its native one; thus UNIX format
+   is the common intermediate representation for directory hierarchies, as
+   it is in the ZIP/UNZIP programs (which is why ZIP archives are
+   transportable among, UNIX, DOS, and VMS).
+
+   Here's an example in which a file is sent from Windows to UNIX with
+   relative pathnames and FILE NAMES CONVERTED:
+
+  Source name                Intermediate name      Destination Name
+  C:\K95\TMP\OOFA.TXT        K95/TMP/OOFA.TXT       k95/tmp/oofa.txt
+
+   In a more complicated example, we send the same file from Windows to
+   VMS:
+
+  Source name                Intermediate name      Destination Name
+  C:\K95\TMP\OOFA.TXT        K95/TMP/OOFA.TXT       [.K95.TMP]OOFA.TXT
+
+   (Note that disk letters and device designations are always stripped
+   when pathnames are relative).
+
+   As you can imagine, as more and more directory formats are considered,
+   this approach keeps matters simple: on each platform, Kermit must know
+   only its own local format and the common intermediate one. In most
+   cases, the receiver can detect which format is used automatically.
+
+4.11. Recursive SEND and GET: Transferring Directory Trees
+
+   C-Kermit 7.0 in selected versions (UNIX, VMS, VOS, AOS/VS, Windows, and
+   OS/2 at this writing) now permits the SEND command to traverse
+   directories "recursively" if you ask it to; that is, to send files from
+   the current or specified directory and all of its subdirectories too,
+   and their subdirectories, etc. (Some other commands can do this too,
+   including DIRECTORY.)
+
+   This feature is new to UNIX, Windows, VOS, and OS/2. VMS and AOS/VS
+   have always included "wildcard" or "template" characters that allow
+   this, and in this case, recursive directory traversal could happen
+   behind Kermit's back, i.e. Kermit does not have to do it itself (in
+   VMS, the notation is "[...]" or "[directory...]"; in AOS/VS is "#"). In
+   C-Kermit 7.0, however, SEND /RECURSIVE is supported by C-Kermit itself
+   for VMS.
+
+4.11.1. Command-Line Options
+
+   To descend a directory tree when sending files, use the -L command-line
+   option to indicate that the send operation is to be recursive, and
+   include a name or pattern to be sent. When giving a pattern, you should
+   enclose it in quotes to prevent the shell from expanding it. Examples:
+
+  $ kermit -Ls "/usr/olga/*" # send all of Olga's files in all her directories
+  $ kermit -Ls foo.txt       # send all foo.txt files in this directory tree
+  $ kermit -Ls "*.txt"       # send all .txt files in this directory tree
+  $ kermit -Ls "letters/*"   # send all files in the letters directory tree
+  $ kermit -Ls letters       # send all files in the letters directory tree
+  $ kermit -Ls "*"           # send all files in this directory tree
+  $ kermit -Ls .             # UNIX only: send all files in this directory tree
+  $ kermit -s .              # UNIX only: a filename of . implies -L
+
+   If you let the shell expand wildcards, Kermit only sends files whose
+   names match files in the current or given directory, because the shell
+   replaces an unquoted wildcard expression with the list of matching
+   files -- and the shell does not build recursive lists. Note that the
+   "." notation for the tree rooted at the current directory is allowed
+   only in UNIX, since in Windows and OS/2, it means "*.*" (nonrecursive).
+
+4.11.2. The SEND /RECURSIVE Command
+
+   If you include the /RECURSIVE switch in a SEND (or MOVE, or similar)
+   command, it means to descend the current or specified directory tree
+   searching for files whose names match the given name or pattern. Since
+   this is not terribly useful unless you also include pathnames with the
+   outbound files, the /RECURSIVE switch also includes an implicit
+   /PATHNAMES:RELATIVE switch (which you can undo by including an explicit
+   /PATHNAMES switch after the /RECURSIVE switch).
+
+   Examples:
+
+   SEND /RECURSIVE *
+          Sends all of the files in the current directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc, including their relative pathnames. Empty
+          directories are not sent.
+
+   SEND /RECURSIVE /PATHNAMES:ABSOLUTE *
+          Sends all of the files in the current directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc, including their absolute pathnames.
+
+   SEND /RECURSIVE /PATHNAMES:OFF *
+          Sends all of the files in the current directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc, without pathnames.
+
+   SEND /RECURSIVE /usr/olga/*
+          Sends all of the files in the /usr/olga directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc.
+
+   SEND /RECURSIVE /usr/olga (or /usr/olga/)
+          Same as above. If the name is a directory name (with or without
+          a trailing slash), its files are sent, and those of its
+          subdirectories, and their subdirectories, etc (see [511]Section
+          4.9).
+
+   SEND /RECURSIVE /TEXT /usr/olga/*.txt
+          As above, but only files whose names end with ".txt" are sent,
+          and they are sent in text mode (as they would be by default
+          anyway if SET FILE PATTERNS is ON or AUTO).
+
+   SEND .
+          UNIX only: Send all the files in the current directory.
+
+   SEND /RECURSIVE .
+          UNIX only: Sends all of the files in the current directory and
+          all of its subdirectories, etc ([512]Section 4.9).
+
+   The /RECURSIVE switch is different from most other switches in that its
+   effect is immediate (but still local to the command in which it is
+   given), because it determines how filenames are to be parsed. For
+   example, "send *.txt" fails with a parse error ("No files match") if
+   there are no *.txt files in the current directory, but "send /recursive
+   *.txt" succeeds if there are ".txt" files anywhere in the tree rooted
+   at the current directory.
+
+   The /RECURSIVE switch also affects the file lists displayed if you type
+   "?" in a filename field. "send ./?" lists the regular files in the
+   current directory, but "send /recursive ./?" lists the entire directory
+   tree rooted at the current directory.
+
+4.11.3. The GET /RECURSIVE Command
+
+   In a client/server setting, the client can also request a recursive
+   transfer with:
+
+   GET /RECURSIVE [ other switches ] remote-filespec [ local-spec ]
+
+   In which remote file specification can be a directory name, a filename,
+   a wildcard, or any combination. If the local-spec is not given (and
+   PATHNAMES are RELATIVE), incoming files and directories go into the
+   current local directory. If local-spec is given and is a directory, it
+   becomes the root of the tree into which the incoming files and
+   directories are placed. If local-spec has the syntax of a directory
+   name (e.g. in UNIX it ends with /), C-Kermit creates the directory and
+   then places the incoming files into it. If local-spec is a filename
+   (not recommended), then all incoming files are stored with that name
+   with collisions handled according to the FILE COLLISION setting.
+
+   Again, the normal method for transferring directory trees uses relative
+   pathnames, and this is the default when the sender has been given the
+   /RECURSIVE switch. The action at the receiver depends on its RECEIVE
+   PATHNAMES setting. The default is AUTO, meaning that if the sender
+   tells it to expect a recursive transfer, then it should automatically
+   switch to relative pathnames for this transfer only; otherwise it obeys
+   the RECEIVE PATHNAMES setting of OFF, ABSOLUTE, or RELATIVE.
+
+   What happens if a file arrives that has an absolute pathname, when the
+   receiver has been told to use only relative pathnames? As a security
+   precaution, in this case the receiver treats the name as if it was
+   relative. For example, if a file arrives as:
+
+  /usr/olga/oofa.txt
+
+   The receiver creates a "usr" subdirectory in its current directory, and
+   then an "olga" subdirectory under the "usr" subdirectory in which to
+   store the incoming file.
+
+   Suppose, however there is a sequence of directories:
+
+  /usr/olga/a/b/c/d/
+
+   in which "a" contains nothing but a subdirectory "b", which in turn
+   contains nothing but a subdirectory "c", which in turn contains nothing
+   but a subdirectory "d", which contains nothing at all. Thus there are
+   no files in the "/usr/olga/a/" tree, and so it is not sent, and
+   therefore it is not reproduced on the target computer.
+
+4.11.4. New and Changed File Functions
+
+   C-Kermit 7.0 adds the following functions:
+
+   \ffiles(pattern[,&a])
+          This function has been changed to match only regular files in
+          the current or given directory, and to take an optional array
+          name as a second argument (explained below).
+
+   \fdirectories(pattern[,&a])
+          Returns the number of directories that match the given pattern.
+          If the pattern does not include a directory, then the search is
+          performed in the current directory.
+
+   \frfiles(pattern[,&a])
+          Returns the number of files in the current or given directory
+          and all of its subdirectories, and their subdirectories, etc,
+          that match the given pattern. Warning -- this one can take quite
+          some time if performed at the root of a large directory tree.
+
+   \frdirectories(pattern[,&a])
+          Returns the number of directories in the current or given
+          directory and all of its subdirectories, and their
+          subdirectories, etc, that match the given pattern.
+
+   Each of these functions builds up a list of files to be returned by the
+   \fnextfile() function, just as \ffiles() always has done. (This can
+   also be done with the /ARRAY switch of the DIRECTORY command; see
+   [513]Sections 4.5.1 and [514]7.10).
+
+   Each of these functions can be given an array name as an optional
+   second argument. If an array name is supplied, the array will contain
+   the number of files as its 0th element, and the filenames in elements 1
+   through last. If the array already existed, its previous contents are
+   lost. For example, if the current directory contains two files,
+   oofa.txt and foo.bar, then "\ffiles(*,&a)" creates an array \&a[] with
+   a dimension of 2, containing the following elements:
+
+ \&a[0] = 2
+ \&a[1] = oofa.txt
+ \&a[2] = foo.bar
+
+   If no files match the specification given in the first argument, the
+   array gets a dimension of 0, which is the same as undeclaring the
+   array.
+
+   Note that the order in which the array is filled (and in which
+   \fnextfile() returns filenames) is indeterminate (but see [515]Section
+   7.10.5).
+
+   Here's an example that builds and prints a list of all the file whose
+   names end in .txt in the current directory and all its descendents:
+
+  asg \%n \frfiles(*.txt)
+  declare \&a[\%n]
+  for \%i 1 \%n 1 {
+      asg \&a[\%i] \fnextfile()
+      echo \flpad(\%i,4). "\&a[\%i]"
+  }
+
+   Alternatively, using the array method, and then printing the filenames
+   in alphabetic order (see [516]Section 7.10.3 and [517]7.10.5):
+
+  asg \%n \frfiles(*.txt,&a)
+  sort &a
+  for \%i 1 \%n 1 {
+      echo \flpad(\%i,4). "\&a[\%i]"
+  }
+
+   Or even more simply:
+
+  asg \%n \frfiles(*.txt,&a)
+  sort &a
+  show array &a
+
+   As noted elsewhere, the file lists built by \ffiles(), \frfiles(), etc,
+   are now "safe" in the sense that SEND and other file-related commands
+   can reference \fnextfile() without resetting the list:
+
+  set send pathnames relative
+  for \%i 1 \frfiles(*.txt) 1 {
+      asg \%a \fnextfile()
+      echo Sending \%a...
+      send \%a
+      if fail break
+  }
+
+   Copying to an array (as shown on p.398 of [518]Using C-Kermit 2nd Ed)
+   is no longer necessary.
+
+4.11.5. Moving Directory Trees Between Like Systems
+
+4.11.5.1. UNIX to UNIX
+
+   Transferring a directory tree from one computer to another replicates
+   the file sender's arrangement of files and directories on the file
+   receiver's computer. Normally this is done using relative pathnames,
+   since the user IDs might not be identical on the two computers. Let's
+   say both computers are UNIX based, running C-Kermit 7.0 or later. On
+   the sending computer (leaving out the connection details, etc):
+
+  C-Kermit> cd /usr/olga
+  C-Kermit> send /recursive .
+
+   The /RECURSIVE switch tells C-Kermit to descend through the directory
+   tree and to include relative pathnames on outbound filenames.
+
+   On the receiving computer:
+
+  C-Kermit> mkdir olgas-files           ; Make a new directory.
+  C-Kermit> cd olgas-files              ; CD to it.
+  C-Kermit> receive /recursive          ; = /PATHNAMES:RELATIVE
+
+   Each Kermit program recognizes that the other is running under UNIX and
+   switches to binary mode and literal filenames automatically.
+   Directories are automatically created on the receiving system as
+   needed. File dates and permissions are automatically reproduced from
+   source to destination.
+
+4.11.5.2. VMS to VMS
+
+   To send recursively from VMS, simply include the /RECURSIVE switch, for
+   example at the sender:
+
+  $ kermit
+  C-Kermit> cd [olga]
+  C-Kermit> send /recursive *.*;0
+
+   And at the receiver:
+
+  C-Kermit> cd [.olga]
+  C-Kermit> receive /recursive
+
+   The notation "..." within directory brackets in VMS means "this
+   directory and all directories below it"; the /RECURSIVE switch, when
+   given to the sender, implies the use of "..." in the file specification
+   so you don't have to include "..."; but it makes no difference if you
+   do:
+
+  $ kermit
+  C-Kermit> send /recursive [olga...]*.*;0
+
+   And at the receiver:
+
+  C-Kermit> cd [.olga]
+  C-Kermit> receive /recursive
+
+   In either case, since both systems recognize each other as VMS, they
+   switch into LABELED transfer mode automatically.
+
+4.11.6. Moving Directory Trees Between Unlike Systems
+
+   There are several difficulties with recursive transfers between unlike
+   systems:
+
+     * File formats can be different, especially text files character sets
+       and record formats. This can now be handled by using SET FILE
+       PATTERN, SET FILE TEXT-PATTERNS, and SET FILE BINARY-PATTERNS
+       ([519]Section 4.3).
+     * File naming conventions are different. For example, one system
+       might allow (and use) longer filenames than the other. You can tell
+       Kermit how to handle file names with the normal "set file names"
+       and "set file collision" mechanisms. Most modern Kermits are fairly
+       tolerant of illegal filenames and should not fail simply because of
+       an incoming filename; rather, it will do its best to convert it to
+       a recognizable and unique legal filename.
+     * Directory notations can be different, e.g. backslashes instead of
+       slashes, brackets, parentheses, spaces, etc. But this is now
+       handled by converting pathnames to a standard format during
+       transfer ([520]Section 4.10).
+
+   So now, for the first time, it is possible to send directory trees
+   among any combination of UNIX, DOS, Windows, OS/2, VMS, AOS/VS, etc.
+   Here's an example sending files from an HP-UX system (where text files
+   are encoded in the HP Roman8 character set) to a PC with K95 (where
+   text files are encoded in CP850):
+
+ Sender:
+  cd xxx                           ; CD to root of source tree
+  set file type binary             ; Default transfer mode
+  set file character-set hp-roman8 ; Local character set for text files
+  set xfer character-set latin1    ; Transfer character set
+  set file patterns on             ; Enable automatic file-type switching...
+  set file binary-patterns *.Z *.gz *.o  ; based on these patterns...
+  set file text-patterns *.txt *.c *.h   ; for binary and text files.
+  send /recursive *                ; Send all the file in this directory tree
+
+ Receiver:
+  cd yyy                           ; CD to root of destination tree
+  set file character-set cp850     ; Local character set for text files
+  receive /pathnames:relative      ; Receive with pathnames
+
+   Notes:
+     * Replace "xxx" and "yyy" with the desired directories.
+     * Replace the file character sets appropriately.
+     * Change the patterns as needed (or just use the built-in default
+       lists).
+     * SEND /RECURSIVE also implies /PATHNAMES:RELATIVE.
+     * The file sender tells the file receiver the transfer mode of each
+       file.
+     * The file sender tells the file receiver the transfer character set.
+     * By default, destination file dates will be the same as on the
+       source.
+     * Many of the settings shown might already be set by default.
+     * See [521]Sections 4.3, [522]4.10, and [523]4.15 for additional
+       explanation.
+
+   If you are refreshing an existing directory on the destination
+   computer, use "set file collision update" or other appropriate file
+   collision option to handle filename collisions.
+
+4.12. Where Did My File Go?
+
+   Now that Kermit can be started by clicking on desktop icons (thus
+   obscuring the concept of "current directory"), and can have a download
+   directory, and can create directories for incoming files on the fly,
+   etc, sometimes it is easy to lose a file after transfer. Of course, if
+   you keep a transaction log:
+
+  LOG TRANSACTIONS
+
+   it will record the fate and final resting place of each file. But in
+   case you did not keep a log, the new command:
+
+  WHERE
+
+   added in C-Kermit 7.0, gives you as much information as it has about
+   the location of the last files transferred, including the pathname
+   reported by the receiving Kermit, if any, when C-Kermit is the sender.
+   This information was also added to SHOW FILE in somewhat less detail.
+
+4.13. File Output Buffer Control
+
+   (UNIX only). The new command SET FILE OUTPUT lets you control how
+   incoming files are written to disk:
+
+   SET FILE OUTPUT BUFFERED [ size ]
+          Chooses buffered file output; this is the default. UNIX does its
+          normal sort of disk buffering. The optional size specifies
+          Kermit's own file output buffer size, and therefore the
+          frequency of disk accesses (write() system calls) -- the bigger
+          the size, the fewer the disk accesses.
+
+   SET FILE OUTPUT UNBUFFERED [ size ]
+          This forces each file output write() call to actually commit the
+          data to disk immediately. Choosing this option will usually slow
+          file reception down.
+
+   SET FILE OUTPUT BLOCKING
+          Write() calls should not return until they are complete. This is
+          the normal setting, and it lets Kermit detect disk-write errors
+          immediately.
+
+   SET FILE OUTPUT NONBLOCKING
+          Write() calls should return immediately. This can speed up file
+          reception, but also delay the detection of disk-write errors.
+
+   Experimentation with these parameters should be harmless, and might (or
+   might not) have a perceptible, even dramatic, effect on performance.
+
+4.14. Improved Responsiveness
+
+   In version 7.0, C-Kermit's file-transfer protocol engine has been tuned
+   for additional speed and responsiveness.
+
+     * Binary-mode transfers over 8-bit connections, a very common case,
+       are now handled in a special way that minimizes overhead.
+     * SET TRANSFER CRC-CALCULATION is now OFF by default, rather than ON.
+       (This affects only the overall per-transfer CRC, \v(crc16), not the
+       per-packet CRCs)
+     * Connection loss during file transfer is now detected immediately in
+       most cases on Internet connections and on serial connections when
+       CARRIER-WATCH is not set to OFF.
+
+4.15. Doubling and Ignoring Characters for Transparency
+
+   The following commands were added in 7.0, primarily to allow successful
+   file transfer through ARPAnet TACs and with Honeywell DPS6 systems, but
+   can be used in any setting where they might be needed:
+
+   SET SEND DOUBLE-CHAR { [ char [ char [ ... ] ] ], NONE }
+          Tells C-Kermit to double the specified characters (use decimal
+          notation) in packets that it sends. For example, if you are
+          sending files through a device that uses @ as an escape
+          character, but allows you to send a single copy of @ through by
+          doubling it, use "set send double 64".
+
+   SET RECEIVE IGNORE-CHAR [ char [ char [ ... ] ] ]
+          Tells C-Kermit to ignore the specified character(s) in incoming
+          packets. Use this, for example, when something between the
+          sender and receiver is inserting linefeeds for wrapping, NULs
+          for padding, etc.
+
+4.16. New File-Transfer Display Formats
+
+   SET TRANSFER DISPLAY { BRIEF, CRT, FULLSCREEN, NONE, SERIAL }
+          Selects the file-transfer display format.
+
+   BRIEF is the new one. This writes one line to the screen per file,
+   showing the file's name, transfer mode, size, the status of the
+   transfer, and when the transfer is successful, the effective data rate
+   in characters per second (CPS). Example:
+
+  SEND ckcfn3.o (binary) (59216 bytes): OK (0.104 sec, 570206 cps)
+  SEND ckcfns.o (binary) (114436 bytes): OK (0.148 sec, 772006 cps)
+  SEND ckcmai.c (text) (79147 bytes): OK (0.180 sec, 438543 cps)
+  SEND ckcmai.o (binary) (35396 bytes): OK (0.060 sec, 587494 cps)
+  SEND ckcnet.o (binary) (62772 bytes): REFUSED
+  SEND ckcpro.o (binary) (121448 bytes): OK (0.173 sec, 703928 cps)
+  SEND ckcpro.w (text) (63687 bytes): OK (0.141 sec, 453059 cps)
+  SEND makefile (text) (186636 bytes): OK (0.444 sec, 420471 cps)
+  SEND wermit (binary) (1064960 bytes): OK (2.207 sec, 482477 cps)
+
+   Note that transfer times are now obtained in fractional seconds, rather
+   than whole seconds, so the CPS figures are more accurate (the display
+   shows 3 decimal places, but internally the figure is generally precise
+   to the microsecond).
+
+4.17. New Transaction Log Formats
+
+   The new command:
+
+  SET TRANSACTION-LOG { VERBOSE, FTP, BRIEF [ separator ] }
+
+   lets you choose the format of the transaction log. VERBOSE (the
+   default) indicates the traditional format described in the book. BRIEF
+   and FTP are new. This command must be given prior to the LOG
+   TRANSACTION command if a non-VERBOSE type is desired.
+
+4.17.1. The BRIEF Format
+
+   BRIEF chooses a one-line per file format suitable for direct
+   importation into databases like Informix, Oracle, or Sybase, in which:
+
+     * Each record has 8 fields.
+     * Fields are separated by a non-alphanumeric separator character.
+     * The default separator character is comma (,).
+     * Any field containing the separator character is enclosed in
+       doublequotes.
+     * The final field is enclosed in doublequotes.
+
+   The fields are:
+
+    1. Date in yyyymmdd format
+    2. Time in hh:mm:ss format
+    3. Action: SEND or RECV
+    4. The local filename
+    5. The size of the file
+    6. The transfer mode (text, binary, image, labeled)
+    7. The status of the transfer: OK or FAILED
+    8. Additional status-dependent info, in doublequotes.
+
+   Examples:
+
+  20000208,12:08:52,RECV,/u/olga/oofa.txt,5246,text,OK,"0.284sec 18443cps"
+  20000208,12:09:31,SEND,/u/olga/oofa.exe,32768,binary,OK,"1.243sec 26362cps"
+  20000208,12:10:02,SEND,"/u/olga/a,b",10130,text,FAILED,"Refused: date"
+
+   Note how the filename is enclosed in doublequotes in the final example,
+   because it contains a comma.
+
+   To obtain BRIEF format, you must give the SET TRANSACTION-LOG BRIEF
+   command before the LOG TRANSACTIONS command. (If you give them in the
+   opposite order, a heading is written to the log by the LOG command.)
+
+4.17.2. The FTP Format
+
+   SET TRANSACTION-LOG FTP (available only in UNIX) chooses a format that
+   is compatible with the WU-FTPD (Washington University FTP daemon) log,
+   and so can be processed by any software that processes the WU-FTPD log.
+   It logs only transfers in and out, both successful and failed (but
+   success or failure is not indicated, due to lack of a field in the
+   WU-FTPD log format for this purpose). Non-transfer events are not
+   recorded.
+
+   Unlike other logs, the FTP-format transaction log is opened in append
+   mode by default. This allows you to easily keep a record of all your
+   kermit transfers, and it also allows the same log to be shared by
+   multiple simultaneous Kermit processes or (permissions permitting)
+   users. You can, of course, force creation of a new logfile by
+   specifying the NEW keyword after the filename, e.g.
+
+  log transactions oofa.log new
+
+   All records in the FTP-style log are in a consistent format. The first
+   field is fixed-length and contains spaces; subsequent fields are
+   variable length, contain no spaces, and are separated by one or more
+   spaces. The fields are:
+
+   Timestamp
+          This is an asctime-style timestamp, example: "Wed Sep 16
+          20:19:05 1999" It is always exactly 24 characters long, and the
+          subfields are always in fixed positions.
+
+   Elapsed time
+          The whole number of seconds required to transfer the file, as a
+          string of decimal digits, e.g. "24".
+
+   Connection
+          The name of the network host to which C-Kermit is connected, or
+          the name of the serial device through which it has dialed (or
+          has a direct connection), or "/dev/tty" for transfers in remote
+          mode.
+
+   Bytes transferred
+          The number of bytes transferred, decimal digits, e.g. "1537904".
+
+   Filename
+          The name of the file that was transferred, e.g.
+          "/pub/ftp/kermit/a/README.TXT". If the filename contains any
+          spaces or control characters, each such character is replaced by
+          an underscore ('_') character.
+
+   Mode
+          The letter 'b' if the file was transferred in binary mode, or
+          'a' if it was transferred in text (ASCII) mode.
+
+   Options
+          This field always contains an underscore ('_') character.
+
+   Direction
+          The letter 'o' if the file was transferred Out, and 'i' if the
+          file was transferred In.
+
+   User class
+          The letter 'r' indicates the file was transferred by a Real
+          user.
+
+   User identification
+          The ID of the user who transferred the file.
+
+   Server identification
+          The string "kermit". This distinguishes a Kermit transfer log
+          record from a WU-FTPD record, which contains "ftp" in this
+          field.
+
+   Authentication class
+          The digit '1' if we know the user's ID on the client system,
+          otherwise '0'. Currently, always '0'.
+
+   Authenticated user
+          If the authentication class is '1', this is the user's ID on the
+          client system. Otherwise it is an asterisk ('*'). Currently it
+          is always an asterisk.
+
+   Examples:
+
+  Thu Oct 22 17:42:48 1998 0 * 94 /usr/olga/new.x a _ i r olga kermit 0 *
+  Thu Oct 22 17:51:29 1998 1 * 147899 /usr/olga/test.c a _ o r olga kermit 0 *
+  Thu Oct 22 17:51:44 1998 1 * 235 /usr/olga/test.o b _ i r olga kermit 0 *
+  Fri Oct 23 12:10:25 1998 0 * 235 /usr/olga/x.ksc a _ o r olga kermit 0 *
+
+   Note that an ftp-format transaction log can also be selected on the
+   Kermit command line as follows:
+
+  kermit --xferfile:filespec
+
+   This is equivalent to:
+
+  SET TRANSACTION-LOG FTP
+  LOG TRANSACTIONS filespec APPEND
+
+   Conceivably it could be possible to have a system-wide shared Kermit
+   log, except that UNIX lacks any notion of an append-only file; thus any
+   user who could append to the log could also delete it (or alter it).
+   This problem could be worked around using setuid/setgid tricks, but
+   these would most likely interfere with the other setuid/setgid tricks
+   C-Kermit must use for getting at dialout devices and UUCP logfiles.
+
+4.18. Unprefixing NUL
+
+   As of 6.1.193 Alpha.10, C-Kermit can finally send and receive
+   file-transfer packets in which NUL (ASCII 0) is unprefixed (no more
+   NUL-terminated packets!). NUL is, of course, extremely prevalent in
+   binary files such as executables, and this has been a significant
+   source of packet overhead. For example, when transferring itself (the
+   SunOS C-Kermit executable) with minimal prefixing and 9000-byte
+   packets, we see:
+
+  File size:                       1064960
+  Packet chars with 0 prefixed:    1199629  overhead = 12.65%
+  Packet chars with 0 unprefixed:  1062393  overhead = -0.03%
+
+   Transfer rates go up accordingly, not only because of the reduced
+   amount of i/o, but also because less computation is required on each
+   end.
+
+4.19. Clear-Channel Protocol
+
+   Now that C-Kermit itself is capable of sending and receiving any byte
+   at all on a clear channel ([524]Section 4.18), it is, for the first
+   time, in a position to negotiate a clear channel with the other Kermit,
+   giving it permission (but not requiring it) to unprefix any and all
+   characters that it knows are safe. In general this means all but the
+   Kermit start-of-packet character (normally Ctrl-A), Carriage Return
+   (not only Kermit's end-of-packet character, but also treated specially
+   on Telnet NVT links), and IAC (255, also special to Telnet).
+
+   By default, C-Kermit will say it has a clear channel only if it has
+   opened a TCP socket. Since the Kermit program on the far end of a
+   TCP/IP connection generally does not know it has a TCP/IP connection,
+   it will not announce a clear channel unless it has been told to do so.
+   The command is:
+
+   SET CLEAR-CHANNEL { ON, OFF, AUTO }
+
+   AUTO is the default, meaning that the clear-channel status is
+   determined automatically from the type of connection. ON means to
+   announce a clear channel, OFF means not to announce it. Use SHOW
+   STREAMING ([525]Section 4.20) to see the current CLEAR-CHANNEL status.
+   Synonym: SET CLEARCHANNEL.
+
+   CLEAR-CHANNEL is also set if you start C-Kermit with the -I switch (see
+   [526]Section 4.20).
+
+   Whenever a clear channel is negotiated, the resulting control-character
+   unprefixing is "sticky"; that is, it remains in effect after the
+   transfer so you can use SHOW CONTROL to see what was negotiated.
+
+   You can also see whether a clear channel was negotiated in the
+   STATISTICS /VERBOSE Display.
+
+   The advantage of the clear channel feature is that it can make file
+   transfers go faster automatically. The disadvantage would be
+   file-transfer failures if the channel is not truly clear, for example
+   if C-Kermit made a Telnet connection to a terminal server, and then
+   dialed out from there; or if C-Kermit made an Rlogin connection to host
+   and then made a Telnet connection from there to another host. If a file
+   transfer fails on a TCP/IP connection, use SHOW CONTROL to check
+   whether control characters became unprefixed as a result of protocol
+   negotiations, and/or SHOW STREAMING ([527]Section 4.20) to see if
+   "clear-channel" was negotiated. If this happened, use SET CLEAR-CHANNEL
+   OFF and SET PREFIXING CAUTIOUS (or whatever) to prevent it from
+   happening again.
+
+4.20. Streaming Protocol
+
+   A new Kermit protocol option called "streaming" was added in C-Kermit
+   7.0. The idea is that if the two Kermit partners have a reliable
+   transport (such as TCP/IP or X.25) between them, then there is no need
+   to send ACKs for Data packets, or NAKs, since a reliable transport
+   will, by definition, deliver all packets in order and undamaged. On
+   such a connection, streaming cuts down not only on Kermit program
+   overhead (switching back and forth between reading and sending
+   packets), but also tends to make the underlying transport use itself
+   more efficiently (e.g. by defeating the Nagle algorithm and/or Delayed
+   ACK stratagem of the TCP layer). Furthermore, it allows transfers to
+   work smoothly on extremely slow network congestions that would
+   otherwise cause timeouts and retransmissions, and even failure when the
+   retry limit was exceeded.
+
+   The trick is knowing when we can stream:
+
+    1. If C-Kermit has opened a TCP socket or X.25 connection, it offers
+       stream.
+    2. If C-Kermit has been started with the -I (uppercase) option, or if
+       it has been told to SET RELIABLE ON, it offers to stream.
+    3. If C-Kermit is in remote mode, and has been told to SET RELIABLE
+       AUTO (or ON), it always offers to stream, and also always agrees to
+       stream, if the other Kermit offers. Unless you take explicit
+       actions to override the defaults, this allows the local Kermit (the
+       one that made the connection, and so knows whether it's reliable)
+       to control streaming.
+
+   (Note that an offer to stream also results in a Clear-Channel
+   announcement if CLEAR-CHANNEL is set to AUTO; see [528]Section 4.19.)
+
+   When BOTH Kermits offer to stream, then they stream; otherwise they
+   don't. Thus streaming-capable Kermit programs interoperate
+   automatically and transparently with nonstreaming ones. If the two
+   Kermits do agree to stream, you'll see the word "STREAMING" on the
+   fullscreen file-transfer display in the Window Slots field. You can
+   also find out afterwards with the STATISTICS or SHOW STREAMING
+   commands.
+
+     WARNING: Automatic choice of streaming is based on the assumption of
+     a "direct" end-to-end network connection; for example, a Telnet or
+     Rlogin connection from host A to host B, and transferring files
+     between A and B. However, if your connection has additional
+     components -- something "in the middle" (B) that you have made a
+     network connection to, which makes a separate connection to the
+     destination host (C), then you don't really have a reliable
+     connection, but C-Kermit has no way of knowing this; transferring
+     files between A and C will probably fail. In such cases, you'll need
+     to tell the *local* C-Kermit to "set reliable off" before
+     transferring files (it does no good to give this command to the
+     remote Kermit since the local one controls the RELIABLE setting).
+
+   Streaming is like using an infinite window size, with no timeouts and
+   no tolerance for transmission errors (since there shouldn't be any). It
+   relies on the underlying transport for flow control, error correction,
+   timeouts, and retransmission. Thus it is very suitable for use on
+   TCP/IP connections, especially slow or bursty ones, since Kermit's
+   packet timeouts won't interfere with the transfer -- each packet takes
+   as long to reach its destination as it takes TCP to deliver it. If TCP
+   can't deliver the packet within its own timeout period (over which
+   Kermit has no control), it signals a fatal error. Just like FTP.
+
+   Streaming goes much faster than non-streaming when a relatively small
+   packet length is used, and it tends to go faster than non-streaming
+   with even the longest packet lengths. The Kermit window size is
+   irrelevant to streaming protocol, but still might affect performance in
+   small ways since it can result in different paths through the code.
+
+   The definition of "reliable transport" does not necessarily demand
+   8-bit and control-character transparency. Streaming can work with
+   parity and/or control-character prefixing just as well (but not as
+   fast) as without them; in such cases you can leave RELIABLE set to ON,
+   but set CLEARCHANNEL and/or PARITY appropriately.
+
+   Maximum performance -- comparable to and often exceeding FTP -- is
+   achieved on socket-to-socket connections (in which the considerable
+   overhead of the terminal driver and Telnet or Rlogin server is
+   eliminated) with long packets and the new "brief" file-transfer display
+   ([529]Section 4.16).
+
+4.20.1. Commands for Streaming
+
+   SET RELIABLE { ON, OFF, AUTO }
+          SET RELIABLE ON tells Kermit that it has a reliable transport.
+          SET RELIABLE OFF tells Kermit the transport is not reliable.
+          SET RELIABLE AUTO tells Kermit that it should SET RELIABLE ON
+          whenever it makes a reliable connection (e.g. TELNET or SET HOST
+          on a TCP/IP or X.25 network), and when in remote mode it should
+          believe the transport is reliable if the other Kermit says it is
+          during Kermit protocol negotiation.
+
+   AUTO is the default; the Kermit program that makes the connection knows
+   whether it is reliable, and tells the remote Kermit.
+
+   The RELIABLE setting has several effects, including:
+
+     * It can affect the timeouts used during normal ACK/NAK protocol.
+     * It can affect the clear-channel announcement.
+     * It can affect streaming.
+
+   If you TELNET or SET HOST somewhere, this includes an implicit SET
+   RELIABLE ON command. The -I command-line option is equivalent to SET
+   RELIABLE ON.
+
+   Since SET RELIABLE ON (and -I) also implies SET CLEAR CHANNEL ON, you
+   might find that in certain cases you need to tell Kermit that even
+   though the connection is reliable, it doesn't have a clear channel
+   after all:
+
+  SET CLEAR-CHANNEL OFF
+  SET PREFIXING CAUTIOUS ; or whatever...
+
+   You can control streaming without affecting the other items with:
+
+  SET STREAMING { ON, OFF, AUTO }
+
+   AUTO is the default, meaning streaming will occur if Kermit has made a
+   TCP/IP connection or if RELIABLE is ON (or it was started with the -I
+   command line option). OFF means don't stream; ON means offer to stream
+   no matter what.
+
+4.20.2. Examples of Streaming
+
+   Here we look at the use and behavior of streaming on several different
+   kinds of connections, and compare its performance with non-streaming
+   transfers.
+
+4.20.2.1. Streaming on Socket-to-Socket Connections
+
+   Here we get streaming automatically when both Kermit programs are
+   capable of it, since they both make socket connections. For example, on
+   the far end:
+
+  C-Kermit> set host * 3000
+  C-Kermit> server
+
+   and on the near end:
+
+  C-Kermit> set host foo.bar.xyz.com 3000
+  (now give SEND and GET command)
+
+   All subsequent file transfers use streaming automatically.
+
+   Here are the results from 84 trials, run on a production network,
+   disk-to-disk, in which a 1-MB binary file (the SunOS C-Kermit Sparc
+   executable) was sent from a Sun Sparc-10 with SunOS 4.1.3 to an IBM
+   Power Server 850 with AIX 4.1, socket-to-socket, over a 10Mbps 10BaseT
+   Ethernet, using minimal control-character unprefixing, window sizes
+   from 10 to 32, and packet sizes from 1450 to 9010:
+
+                Streaming    Nonstreaming
+  Max CPS         748955        683354
+  Min CPS         221522        172491
+  Mean CPS        646134        558680
+  Median CPS      678043        595874
+  Std Dev         101424        111493
+
+   Correlations:
+
+  CPS and window size:   -0.036
+  CPS and packet length:  0.254
+  CPS and streaming:      0.382
+
+   Note that the relationship between streaming and throughput is
+   significantly stronger than that between CPS and window size or packet
+   length.
+
+   Also note that this and all other performance measurements in this
+   section are snapshots in time; the results could be much different at
+   other times when the load on the systems and/or the network is higher
+   or lower.
+
+   In a similar socket-to-socket trial, but this time over a wide-area
+   TCP/IP connection (from New York City to Logan, Utah, about 2000
+   miles), the following results were obtained:
+
+                Streaming    Nonstreaming
+  Max CPS         338226        318203
+  Min CPS         191659        132314
+  Mean CPS        293744        259240
+  Median CPS      300845        273271
+  Std Dev          41914         52351
+
+   Correlations:
+
+  CPS and window size:    0.164
+  CPS and packet length:  0.123
+  CPS and streaming:      0.346
+
+4.20.2.2. Streaming on Telnet Connections
+
+   In this case the local copy of Kermit is told to TELNET or SET HOST,
+   and so it knows it has a reliable connection and -- unless it has been
+   told not to -- will offer to stream, and the other Kermit program,
+   since it has STREAMING set to AUTO, agrees.
+
+   Since we have a reliable connection, we'll also get control-character
+   unprefixing automatically because of the new clear-channel protocol
+   ([530]Section 4.19).
+
+   Any errors that occur during streaming are fatal to the transfer. The
+   message is "Transmission error on reliable link". Should this happen:
+
+    1. Check the remote Kermit's flow control setting (SHOW
+       COMMUNICATIONS). If it is NONE, change it to XON/XOFF, or vice
+       versa. If it is XON/XOFF (or you just changed it to XOFF/XOFF),
+       make sure the file sender is prefixing the XON and XOFF characters.
+       In the most drastic case, use "set prefix all" to force prefixing
+       of all control characters.
+    2. The remote Telnet server might chop off the 8th bit. In that case,
+       tell C-Kermit to "set parity space". Or, you might be able to force
+       the Telnet to allow eight-bit data by telling C-Kermit to "set
+       telopt binary request accept" -- that is, request the Telnet server
+       to enter binary mode, and accept binary-mode bids from the server.
+    3. The remote Telnet server might have a buffering limitation. If a
+       and b don't cure the problem, tell the file receiver to "set
+       receive packet-length 1000" (or other number -- use the largest one
+       that works). This too, is no different from the non-streaming case
+       (more about this in [531]Section 4.20.2.3).
+
+   And remember you can continue interrupted binary-mode transfers where
+   they left off with the RESEND (= SEND /RECOVER) command.
+
+   Here are the figures for the same 84 trials between the same Sun and
+   IBM hosts as in 4.20.2.1, on the same network, but over a Telnet
+   connection rather than socket-to-socket:
+
+                  Streaming    Nonstreaming
+  Max CPS         350088        322523
+  Min CPS          95547        173152
+  Mean CPS        321372        281830
+  Median CPS      342604        291469
+  Std Dev          40503         29948
+
+   Correlations:
+
+  CPS and window size:    0.001
+  CPS and packet length:  0.152
+  CPS and streaming:      0.128
+
+   Here the effect is not as emphatic as in the socket-to-socket case, yet
+   on the whole streaming tends to be beneficial.
+
+   Additional measurements on HP-UX using C-Kermit 7.0 Beta.06:
+
+                  Windowing     Streaming
+  HP-UX 8->8      not tested       14Kcps
+  HP-UX 8->9      not tested       76Kcps
+  HP-UX 8->10      36Kcps          66Kcps
+  HP-UX 9->9      not tested      190Kcps
+  HP-UX 9->10     160Kcps         378Kcps
+
+4.20.2.3. Streaming with Limited Packet Length
+
+   The IRIX telnet server (at least the ones observed in IRIX 5.3 and 6.2)
+   does not allow Kermit to send packets longer than 4096 bytes. Thus when
+   sending from IRIX C-Kermit when it is on the remote end of a Telnet
+   connection, the packet length must be 4K or less. Trials in this case
+   (in which packet lengths range from 1450 to 4000) show a strong
+   advantage for streaming, which would be evident in any other case where
+   the packet length is restricted, and stronger the shorter the maximum
+   packet length.
+
+                  Streaming    Nonstreaming
+  Max CPS         426187        366870
+  Min CPS         407500        276517
+  Mean CPS        415226        339168
+  Median CPS      414139        343803
+  Std Dev           6094         25851
+
+   Correlations:
+
+  CPS and window size:    0.116
+  CPS and packet length:  0.241
+  CPS and streaming:      0.901
+
+4.20.2.4. Streaming on Dialup Connections
+
+   Here "dialup" refers to a "direct" dialup connection, not a SLIP or PPP
+   connection, which is only a particular kind of TCP/IP connection.
+
+   Attempt this at your own risk, and then only if (a) you have
+   error-correcting modems, and (b) the connections between the modems and
+   computers are also error-free, perfectly flow-controlled, and free of
+   interrupt conflicts. Streaming can be used effectively and to fairly
+   good advantage on such connections, but remember that the transfer is
+   fatal if even one error is detected (also remember that should a
+   binary-mode transfer fail, it can be recovered from the point of
+   failure with RESEND).
+
+   To use streaming on an unreliable connection, you must tell both
+   Kermits that the connection is reliable:
+
+  kermit -I
+
+   or:
+
+  C-Kermit> set reliable on
+
+   In this case, it will probably be necessary to prefix some control
+   characters, for example if your connection is through a terminal server
+   that has an escape character. Most Cisco terminal servers, for example,
+   require Ctrl-^ (30, as well as its high-bit equivalent, 158) to be
+   prefixed. To unprefix these, you'll need to defeat the "clear channel"
+   feature:
+
+  C-Kermit> set reliable on
+  C-Kermit> set clear-channel off
+  C-Kermit> set prefixing none
+  C-Kermit> set control prefix 1 13 30 158 ; and whatever else is necessary
+
+   Dialup trials were done using fixed large window and packet sizes. They
+   compare uploading and downloading of two common types of files, with
+   and without streaming. Configuration:
+
+     HP-9000/715/33 -- 57600bps, RTS/CTS -- USR Courier V.34 --
+     V.34+V.42, 31200bps -- USR V.34+ Rackmount -- 57600bps, RTS/CTS --
+     Cisco terminal server -- Solaris 2.5.1. Packet size = 8000, Window
+     Size = 30, Control Character Unprefixing Minimal (but including the
+     Cisco escape character).
+
+   Since this is not a truly reliable connection, a few trials failed when
+   a bad packet was received (most likely due to UART overruns); the
+   failure was graceful and immediate, and the message was informative.
+   The results of ten successful trials uploading and downloading the two
+   files with and without streaming are:
+
+            Streaming..
+            Off    On
+   Upload   5194   5565   txt (= C source code, 78K)
+            3135   3406   gz  (= gzip file, compressed, 85K)
+ Download   5194   5565   txt
+            3041   3406   gz
+
+   Each CPS figure is the mean of 10 results.
+
+   A brief test was also performed on a LAT-based dialout connection from
+   a VAX 3100 with VMS 5.5 to a USR Courier V.34 connected to a DECserver
+   700 at 19200 bps. The 1-MB Sparc executable downloaded from a Sun to
+   the VAX at 1100cps without streaming and 1900cps with streaming, using
+   8000-byte packets, 30 window slots, and minimal prefixing in both
+   cases.
+
+4.20.2.5. Streaming on X.25 Connections
+
+   We have only limited access to X.25 networks. One trial was performed
+   in which the 1MB Solaris 2.4 Sparc executable was transferred over a
+   SunLink X.25 connection; nothing is known about the actual physical
+   connection. With a packet length of 8000 and a window size of 30, the
+   file transferred at 6400 cps (using a maximum of 6 window slots). With
+   the same packet length, but with streaming, it transferred without
+   mishap at 6710 cps, about 5% faster.
+
+4.20.3. Streaming - Preliminary Conclusions
+
+   The results vary with the particular connection, but are good overall.
+   Although numerous lower-level tricks can be used to improve performance
+   on specific platforms or connection methods, streaming occurs at a
+   high, system-independent level of the Kermit protocol and therefore can
+   apply to all types of platforms and (reliable) connections
+   transparently.
+
+4.21. The TRANSMIT Command
+
+   Prior to C-Kermit 7.0, the TRANSMIT command transmitted in text or
+   binary mode according to SET FILE TYPE { TEXT, BINARY }. But now that
+   binary mode is likely to be the default for protocol transfers, it is
+   evident that this not also an appropriate default for TRANSMIT, since
+   binary-mode TRANSMIT is a rather specialized and tricky operation.
+   Therefore, TRANSMIT defaults to text mode always, regardless of the
+   FILE TYPE setting.
+
+   C-Kermit 7.0 expands the capabilities of the TRANSMIT command by adding
+   the following switches (see [532]Section 1.5). The new syntax is:
+
+  TRANSMIT [ switches... ] filename
+
+   Zero or more switches may be included:
+
+   /PIPE
+          When /PIPE is included, "filename" is interpreted as a system
+          command or program whose output is to be sent. Synonym:
+          /COMMAND. Example:
+
+  transmit /pipe finger
+
+          You may enclose the command in braces, but you don't have to:
+
+  xmit /pipe {ls -l | sort -r +0.22 -0.32 | head}
+
+   /BINARY
+          Transmits the file (or pipe output) in binary mode.
+
+   /TEXT
+          Transmits the file (or pipe output) in line-oriented text mode.
+          Current FILE CHARACTER-SET and TERMINAL CHARACTER-SET selections
+          govern translation. Default.
+
+   /TRANSPARENT
+          Specifies text mode without character-set translation, no matter
+          what the FILE and TERMINAL CHARACTER-SET selections are.
+
+   /NOWAIT
+          This is equivalent to SET TRANSMIT PROMPT 0, but for this
+          TRANSMIT command only. Applies only to text mode; it means to
+          not wait for any kind of echo or turnaround character after
+          sending a line before sending the next line. (Normally Kermit
+          waits for a linefeed.)
+
+   When TRANSMIT ECHO is ON, C-Kermit tries to read back the echo of each
+   character that is sent. Prior to C-Kermit 7.0, 1 second was allowed for
+   each echo to appear; if it didn't show up in a second, the TRANSMIT
+   command would fail. Similarly for the TRANSMIT PROMPT character.
+   However, with today's congested Internet connections, etc, more time is
+   often needed:
+
+   SET TRANSMIT TIMEOUT number
+
+   Specifies the number of seconds to wait for an echo or the prompt
+   character when TRANSMIT PROMPT is nonzero; the default wait is 1
+   second. If you specify 0, the wait is indefinite. When a timeout
+   interval of 0 is specified, and a desired echo or prompt does not show
+   up, the TRANSMIT command will not terminate until or unless you
+   interrupt it with Ctrl-C; use SET TRANSMIT TIMEOUT 0 with caution.
+
+   Note: to blast a file out the communications connection without any
+   kind of synchronization or timeouts or other manner of checking, use:
+
+  SET TRANSMIT ECHO OFF
+  SET TRANSMIT PROMPT 0 (or include the /NOWAIT switch)
+  SET TRANSMIT PAUSE 0
+  TRANSMIT [ switches ] filename
+
+   In this case, text-file transmission is not-line oriented and large
+   blocks can be sent, resulting in a significant performance improvement
+   over line-at-at-time transmission. Successful operation depends (even
+   more than usual for the TRANSMIT command!) on a clean connection with
+   effective flow control.
+
+   For details on TRANSMIT and character sets, see [533]Section 6.6.5.4.
+
+  4.22. Coping with Faulty Kermit Implementations
+
+   Kermit protocol has been implemented in quite a few third-party
+   commercial, shareware, and freeware software packages, with varying
+   degrees of success. In most cases operation is satisfactory but slow --
+   only the bare minimum subset of the protocol is available -- short
+   packets, no sliding windows, no attributes, etc. In other cases, the
+   implementation is incorrect, resulting in failures at the initial
+   negotiation stage or corrupted files.
+
+   C-Kermit 7.0 and Kermit 95 1.1.19 include some new defense mechanisms
+   to help cope with the most common situations. However, bear in mind
+   there is only so much we can do in such cases -- the responsibility for
+   fixing the problem lies with the maker of the faulty software.
+
+    4.22.1. Failure to Accept Modern Negotiation Strings
+
+   The published Kermit protocol specification states that new fields can
+   be added to the parameter negotiation string. These are to be ignored
+   by any Kermit implementation that does not understand them; this is
+   what makes the Kermit protocol extensible. Unfortunately, some Kermit
+   implementations become confused (or worse) when receiving a negotiation
+   string longer than the one they expect. You can try working around such
+   problems by telling Kermit to shorten its negotiation string (and thus
+   disable the corresponding new features):
+
+  SET SEND NEGOTIATION-STRING-MAX-LENGTH number
+
+   Try a number like 10. If that doesn't work, try 9, 8, 7, 6, and so on.
+
+    4.22.2. Failure to Negotiate 8th-bit Prefixing
+
+   The published Kermit protocol specification states that 8th-bit
+   prefixing (which allows transfer of 8-bit data over a 7-bit connection)
+   occurs if the file sender puts a valid prefix character (normally "&")
+   in the 8th-bit-prefix field of the negotiation string, and the receiver
+   puts either a letter "Y" or the same prefix character. At least one
+   faulty Kermit implementation exists that does not accept the letter
+   "Y". To force C-Kermit / K-95 to reply with the other Kermit's prefix
+   character rather than a "Y", give the following (invisible) command:
+
+  SET Q8FLAG ON
+
+   Use SET Q8FLAG OFF to restore the normal behavior.
+
+    4.22.3. Corrupt Files
+
+   Refer to [534]Section 4.22.2. Some Kermit implementations mistakenly
+   interpret the "Y" as a prefix character. Then, whenever a letter Y
+   appears in the data, the Y and the character that follows it are
+   replaced by a garbage character. At this writing, we are not sure if
+   there is any solution, but try "set send negotiation-string-max-length
+   6" and/or "set q8flag on".
+
+   File corruption can also occur when control characters within the file
+   data are sent without prefixing, as at least some are by default in
+   C-Kermit 7.0 and K-95. Some Kermit implementations do not handle
+   incoming "bare" control characters. To work around, "set prefixing
+   all".
+
+    4.22.4. Spurious Cancellations
+
+   The Kermit protocol specification states that if an ACK to a Data
+   packet contains X in its data field, the transfer of the current file
+   is canceled, and if it contains a Z, the entire transfer is canceled.
+   At least one overzealous Kermit implementation applies this rule to
+   non-Data packets as well, the typical symptom being that any attempt to
+   transfer a file whose name begins with X or Z results in cancellation.
+   This is because the file receiver typically sends back the name under
+   which it stored the file (which might not be the same as the name it
+   was sent with) in the ACK to the File Header packet. This is
+   information only and should not cause cancellation. To work around the
+   problem, use:
+
+  SET F-ACK-BUG { ON, OFF }
+
+   ON tells Kermit not to send back the filename in the ACK to the file
+   header packet as it normally would do (OFF puts Kermit back to normal
+   after using ON).
+
+   A variation on the this bug occurs in an obscure Kermit program for
+   MUMPS: When this Kermit program sends a file called (say) FOO.BAR, it
+   requires that the ACK to its F packet contain exactly the same name,
+   FOO.BAR. However, C-Kermit likes to send back the full pathname,
+   causing the MUMPS Kermit to fail. SET F-ACK-BUG ON doesn't help here.
+   So a separate command has been added to handle this situation:
+
+  SET F-ACK-PATH { ON, OFF }
+
+   Normally it is ON (regardless of the SET SEND PATHNAMES setting). Use
+   SET F-ACK-PATH OFF to instruct Kermit to send back only the filename
+   without the path in the ACK to the F packet.
+
+    4.22.5. Spurious Refusals
+
+   Some Kermit implementations, notably PDP-11 Kermit 3.60 and earlier,
+   have bugs in their handling of Attribute packets that can cause
+   unwarranted refusal of incoming files, e.g. based on date or size. This
+   can be worked around by telling one or both of the Kermit partners to:
+
+  SET ATTRIBUTES OFF
+
+    4.22.6. Failures during the Data Transfer Phase
+
+   This can be caused by control-character unprefixing ([535]Section
+   4.22.3 ), and fixed by:
+
+  SET PREFIXING ALL
+
+   It can also have numerous other causes, explained in Chapter 10 of
+   [536]Using C-Kermit: the connection is not 8-bit transparent (so use
+   "set parity space" or somesuch), inadequate flow control, etc. Consult
+   the manual.
+
+    4.22.7. Fractured Filenames
+
+   At least one well-known PC-based communications package negotiates data
+   compression, which (according to the protocol specification) applies to
+   both the filename and the file data, but then fails to decompress the
+   filename. Example: C-Kermit sends a file called R000101.DAT (where
+   000101 might be non-Y2K-wise YYMMDD notation), and the package in
+   question stores the files as R~#0101.DAT. Workaround: Tell C-Kermit to
+   SET REPEAT COUNTS OFF.
+
+    4.22.8. Bad File Dates
+
+   At least one well-known PC-based communications package negotiates the
+   passing of file timestamps from sender to receiver, but when it is
+   sending files, it always gives them a timestamp of 1 February 1970.
+   Workaround: tell C-Kermit to SET ATTRIBUTE DATE OFF. You don't get the
+   file's real date, but you also don't get 1 Feb 1970; instead the file
+   gets the current date and time.
+
+  4.23. File Transfer Recovery
+
+   Prior to C-Kermit 7.0, RESEND (SEND /RECOVER) and REGET (GET /RECOVER)
+   refused to work if FILE TYPE was not BINARY or the /BINARY switch was
+   not included. Now these commands include an implied /BINARY switch,
+   meaning they set the file type to binary for the duration of the
+   command automatically.
+
+   In the client/server arrangement, this also forces the server into
+   binary mode (if it is C-Kermit 7.0 or greater, or K95 1.1.19 or
+   greater) so the recovery operation proceeds, just as you asked and
+   expected.
+
+   BUT... Just as before, the results are correct only under the following
+   conditions:
+
+     * If the prior interrupted transfer was also in binary mode; or:
+     * If the prior transfer was in text mode and the other computer was a
+       "like platform" (e.g. UNIX-to-UNIX, Windows-to-Windows,
+       DOS-to-Windows) AND there was no character-set translation (i.e.
+       TRANSFER CHARACTER-SET was TRANSPARENT).
+
+   Note that these circumstances are more likely to obtain in C-Kermit
+   7.0, in which:
+
+     * The default FILE TYPE in C-Kermit 7.0 is BINARY.
+     * The default FILE INCOMPLETE setting is AUTO, which means KEEP if
+       the transfer is in binary mode, DISCARD otherwise.
+     * C-Kermit 7.0, Kermit 95 1.1.17, and MS-DOS Kermit 3.15 and later
+       can recognize "like platforms" and switch into binary mode
+       automatically. Transfers between like platforms are always binary
+       unless character-set translation has been requested, and then is
+       still binary for all files whose names match a binary pattern,
+       unless the automatic mechanisms have been disabled (with a /TEXT
+       switch, or with SET TRANSFER MODE MANUAL).
+     * SEND /BINARY and GET /BINARY always force binary-mode transfers,
+       even when FILE TYPE is TEXT, even when TRANSFER MODE is AUTOMATIC,
+       even when PATTERNS are ON and the file's name matches a text
+       pattern.
+
+   But also note that the automatic client/server transfer-mode
+   adjustments do not work with versions of C-Kermit prior to 7.0 or K95
+   prior to 1.1.16.
+
+   If the prior transfer was in text mode:
+
+     * If text-mode transfers between the two platforms are
+       "length-changing" (as they are between UNIX -- which terminates
+       text lines with LF -- and DOS or Windows -- which terminates text
+       lines with CRLF), the recovered file will be corrupt.
+     * If text-mode transfers between the two platforms are not
+       length-changing, but character-set translation was active in the
+       prior transfer, the result will be a file in which the first part
+       has translated characters and the second part does not.
+
+   But in C-Kermit 7.0 and K95 1.1.19 and later, incompletely transferred
+   text files are not kept unless you change the default. But if you have
+   done this, and you have an incompletely transferred text file, you'll
+   need to:
+
+     * Transfer the whole file again in text mode, or:
+     * Use SEND /STARTING-AT: to recover the transfer at the correct
+       point; but you have to find out what that point is, as described in
+       the manual.
+
+   Kermit has no way of knowing whether the previous transfer was in text
+   or binary mode so it is your responsibility to choose the appropriate
+   recovery method.
+
+   If you use C-Kermit to maintain parallel directories on different
+   computers, using SET FILE COLLISION to transfer only those files that
+   changed since last time, and the files are big enough (or the
+   connection slow enough) to require SEND /RECOVER to resume interrupted
+   transfers, you should remember that SEND /RECOVER (RESEND) overrides
+   all FILE COLLISION settings. Therefore you should use SEND /RECOVER
+   (RESEND) only on the file that was interrupted, not the file group. For
+   example, if the original transfer was initiated with:
+
+  SEND *
+
+   and was interrupted, then after reestablishing your connection and
+   starting the Kermit receiver with SET FILE COLLISION UPDATE on the
+   remote end, use the following sequence at the sender to resume the
+   transfer:
+
+  SEND /RECOVER name-of-interrupted-file
+
+   and then:
+
+  SEND *
+
+   (In C-Kermit 7.0 and later, \v(filename) contains the name of the file
+   most recently transferred, as long you have not EXITed from Kermit or
+   changed directory, etc.
+
+  4.24. FILE COLLISION UPDATE Clarification
+
+   In UNIX, file modification dates are used when comparing the file date
+   with the date in the attribute packet. In VMS, however, the file
+   creation date is used. These two policies reflect the preferences of
+   the two user communities.
+
+   Also, remember that the file date/time given in the attribute packet is
+   the local time at the file sender. At present, no timezone conversions
+   are defined in or performed by the Kermit protocol. This is primarily
+   because this feature was designed at a time when many of the systems
+   where Kermit runs had no concept of timezone, and therefore would be
+   unable to convert (say, to/from GMT or UTC or Zulu time).
+
+   As a consequence, some unexpected results might occur when transferring
+   files across timezones; e.g. commands on the target system that are
+   sensitive to file dates might not work (UNIX "make", backups, etc).
+
+   Timezone handling is deferred for a future release.
+
+  4.25. Autodownload Improvements
+
+   Refer to pages 164-165 of [537]Using C-Kermit about the hazards of
+   autodownload when C-Kermit is "in the middle". As of C-Kermit 7.0, no
+   more hazards. If C-Kermit has TERMINAL AUTODOWNLOAD ON and it detects a
+   packet of the current protocol type (Kermit or Zmodem), it "erases" the
+   visual aspect of the packet that would be seen by the terminal (or,
+   more to the point, the emulator, such as K95). This way, only C-Kermit
+   goes into RECEIVE mode, and not also the terminal emulator through
+   which C-Kermit is accessed. And therefore, it is no longer necessary to
+   SET TERMINAL AUTODOWNLOAD OFF to prevent multiple Kermits from going
+   into receive mode at once, but of course it is still necessary to
+   ensure that, when you have multiple Kermits in a chain, that the
+   desired one receives the autodownload.
+
+   The defaults have not been changed; Kermit 95 still has autodownload ON
+   by default, and C-Kermit has it OFF by default.
+
+  5. CLIENT/SERVER
+
+  5.0. Hints
+
+   If you use SET SERVER GET-PATH to set up your server, and the GET-PATH
+   does not include the server's current directory, clients can become
+   quite confused. For example, "remote dir oofa.txt" shows a file named
+   oofa.txt, but "get oofa.txt" fails. In this situation, you should
+   either DISABLE DIR or make your GET-PATH include the current directory.
+
+  5.1. New Command-Line Options
+
+   The -G command-line option is like -g (GET), except the incoming file
+   is sent to standard output rather than written to disk.
+
+   The -I option ("Internet") is used to tell a remote C-Kermit program
+   that you are coming in via Internet Telnet or Rlogin and therefore have
+   a reliable connection. The -I option is equivalent to SET RELIABLE ON
+   and SET FLOW NONE.
+
+   The -O option ("Only One") tells C-Kermit to enter server mode but then
+   exit after the first client operation.
+
+   See [538]Section 9.3 for details.
+
+  5.2. New Client Commands
+
+   BYE and FINISH no longer try to do anything if a connection is not
+   active. Thus a sequence like "hangup" followed by "bye" or "finish"
+   will no longer get stuck in a long timeout-and-retransmission cycle,
+   nor will it try to open a new connection.
+
+   REMOTE EXIT
+          Similar to FINISH, except it ensures that the Kermit server
+          program exits back to the operating system or shell prompt.
+          (FINISH would return it to its interactive prompt if it was
+          started in interactive mode, and would cause it to exit if it
+          entered server mode via command-line option.) When C-Kermit is
+          to be the server, you can use { ENABLE, DISABLE } EXIT to
+          control the client's access to this feature.
+
+   REMOTE MKDIR directory-name
+          Tells the client to ask the server to create a directory with
+          the given name, which can be absolute or relative. The syntax of
+          the directory name depends on the Kermit server (see [539]next
+          section); in all cases, it can be in the syntax of the system
+          where the server is running (UNIX, VMS, DOS, etc) but newer
+          servers also accept UNIX syntax, no matter what the underlying
+          platform. The server will not execute this command if (a) it
+          does not understand it, (b) a DISABLE MKDIR command has been
+          given, or (c) a DISABLE CWD command has been given; otherwise,
+          the command is executed, but will fail if the directory can not
+          be created, in which cases most servers will attempt to return a
+          message giving the reason for failure. The REMOTE MKDIR command
+          succeeds if the remote directory is created, or if it already
+          exists and therefore does not need to be created, and fails
+          otherwise.
+
+   REMOTE RMDIR directory-name
+          Tells the client to ask the server to remove (delete) a
+          directory with the given name. The same considerations apply as
+          for REMOTE MKDIR.
+
+   REMOTE SET FILE INCOMPLETE { DISCARD, KEEP, AUTO }
+          Previously this was only available in its earlier form, REMOTE
+          SET INCOMPLETE (no FILE). The earlier form is still available,
+          but invisible. Also, AUTO was added, meaning KEEP if in binary
+          mode, DISCARD otherwise.
+
+   REMOTE SET TRANSFER MODE { AUTOMATIC, MANUAL }
+          Tells the client to ask the server to set the given
+          file-transfer mode. Automatic means (roughly): if the client and
+          the server are running on the same kind of computer (e.g. both
+          are on UNIX), then use binary mode automatically; if the system
+          types are different, use some other method to automatically
+          determine text or binary mode, such as filename pattern
+          matching. MANUAL means, in this context, obey the client's FILE
+          TYPE setting (TEXT or BINARY). Synonym: REMOTE SET XFER MODE.
+
+   [ REMOTE ] QUERY KERMIT function(args...)
+          Prior to C-Kermit 7.0, the arguments were not evaluated locally.
+          Thus it was not possible to have the server run the function
+          with client-side variables as arguments. Now:
+
+  define \%a oofa.*
+  remote query kermit files(\%a)    ; Client's \%a
+  remote query kermit files(\\%a)   ; Server's \%a
+
+   [ REMOTE ] LOGIN [ user [ password ] ]
+          LOGIN is now a synonym for REMOTE LOGIN.
+
+   LOGOUT
+          This command, when given in local mode, is equivalent to REMOTE
+          LOGOUT. When given at the IKSD prompt, it logs out the IKSD.
+          When given at the C-Kermit prompt when it has no connection, it
+          does nothing.
+
+   Note that in C-Kermit 7.0, the REMOTE (or R) prefix is not required for
+   QUERY, since there is no local QUERY command. The new top-level QUERY
+   command does exactly what REMOTE QUERY (RQUERY) does.
+
+   All REMOTE commands now have single-word shortcuts:
+
+ Shortcut   Full Form
+  RASG       REMOTE ASSIGN
+  RCD        REMOTE CD
+  RCOPY      REMOTE COPY
+  RDEL       REMOTE DELETE
+  RDIR       REMOTE DIRECTORY
+  REXIT      REMOTE EXIT
+  RHELP      REMOTE HELP
+  RHOST      REMOTE HOST
+  RPWD       REMOTE PWD
+  RSET       REMOTE SET
+  etc.
+
+   The R prefix is not applied to LOGIN because there is already an RLOGIN
+   command with a different meaning. It is not applied to LOGOUT either,
+   since LOGOUT knows what to do in each case, and for symmetry with
+   LOGIN.
+
+    5.2.1. Remote Procedure Definitions and Calls
+
+   This is nothing new, but it might not be obvious... REMOTE ASSIGN and
+   REMOTE QUERY may be used to achieve remote procedure execution. The
+   remote procedure can be defined locally or remotely.
+
+   A remote procedure call is accomplished as noted in the previous
+   section:
+
+  [ remote ] query kermit function-name(args...)
+
+   This invokes any function that is built in to the Kermit server, e.g.:
+
+  [ remote ] query kermit size(foo.bar)
+
+   returns the size of the remote file, foo.bar.
+
+   Now note that C-Kermit includes an \fexecute() function, allowing it to
+   execute any macro as if it were a built-in function. So suppose MYMACRO
+   is the name of a macro defined in the server. You can execute it from
+   the client as follows (the redundant "remote" prefix is omitted in the
+   remaining examples):
+
+  query kermit execute(mymacro arg1 arg2...)
+
+   The return value, if any, is the value of the RETURN command that
+   terminated execution of the macro, for example:
+
+  define addtwonumbers return \feval(\%1+\%2)
+
+   The client invocation would be:
+
+  query kermit execute(addtwonumbers 3 4)
+  7
+
+   The result ("7" in this case) is also assigned to the client's
+   \v(query) variable.
+
+   To execute a remote system command or command procedure (shell script,
+   etc) use:
+
+  query kermit command(name args...)
+
+   Finally, suppose you want the client to send a macro to the server to
+   be executed on the server end. This is done as follows:
+
+  remote assign macroname definition
+  query kermit execute(macroname arg1 arg2...)
+
+   Quoting is required if the definition contains formal parameters.
+
+  5.3. New Server Capabilities
+
+    5.3.1. Creating and Removing Directories
+
+   The C-Kermit 7.0 server responds to REMOTE MKDIR and REMOTE RMDIR
+   commands. The directory name may be in either the native format of the
+   server's computer, or in UNIX format. For example, a server running on
+   VMS with a current directory of [IVAN] can accept commands from the
+   client like:
+
+  remote mkdir olga         ; Makes [IVAN.OLGA] (nonspecific format)
+  remote mkdir .olga        ; Makes [IVAN.OLGA] (VMS format without brackets)
+  remote mkdir olga/        ; Makes [IVAN.OLGA] (UNIX relative format)
+  remote mkdir /ivan/olga   ; Makes [IVAN.OLGA] (UNIX absolute format)
+  remote mkdir [ivan.olga]  ; Makes [IVAN.OLGA] (VMS absolute format)
+  remote mkdir [.olga]      ; Makes [IVAN.OLGA] (VMS relative format)
+
+    5.3.1.1. Creating Directories
+
+   If a directory name is given that contains more than one segment that
+   does not exist, the server attempts to create all the segments. For
+   example, if the client says:
+
+  REMOTE MKDIR letters/angry
+
+   a "letters" subdirectory is created in the server's current directory
+   if it does not already exist, and then an "angry" subdirectory is
+   created beneath it, if it does not already have one. This can repeated
+   to any reasonable depth:
+
+  REMOTE MKDIR a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/z/y/z
+
+    5.3.1.2. Removing Directories
+
+   When attempting to execute a REMOTE RMDIR, the server can remove only a
+   single directory, not an entire sequence or tree. The system service
+   that is called to remove the directory generally requires not only that
+   the server process has write delete access, but also that the directory
+   contain no files.
+
+   In the future, a REMOTE RMDIR /RECURSIVE command (and the accompanying
+   protocol) might be added. For now, use the equivalent REMOTE HOST
+   command(s), if any.
+
+    5.3.2. Directory Listings
+
+   Directory listings are generated by C-Kermit itself, rather than by
+   running the underlying system's directory command. Some control over
+   the listing format can be obtained with the SET OPTIONS DIRECTORY
+   command ([540]Section 4.5.1). The following options affect listings
+   sent by the server: /[NO]HEADING, /[NO]DOTFILES, and /[NO]BACKUP. In
+   UNIX and VMS, the listing is always sorted by filename. There is, at
+   present, no protocol defined for the client to request listing options
+   of the server; this might be added in the future.
+
+   The server's directory listings are in the following format:
+
+   Protection or permissions:
+          In UNIX and OS-9, this is a 10-character field, left adjusted.
+          In VMS it is a 22-character field, left-adjusted. In each case,
+          the protection / permission codes are shown in the server
+          platform's native format. In other operating systems, this field
+          is not shown.
+
+   Size in bytes:
+          This is always a 10-character field. The file's size is shown as
+          a decimal number, right adjusted in the field. If the file is a
+          directory and its size can not be obtained, the size is shown as
+          "<DIR>". Two blanks follow this field.
+
+   Date:
+          Always in yyyy-mm-dd hh:mm:ss numeric format, and therefore 19
+          characters long. If the file's date/time can't be obtained,
+          zeros (0) are shown for all the digits. This field is followed
+          by two blanks.
+
+   Filename:
+          This field extends to the end of the line. Filenames are shown
+          relative to the server's current directory. In UNIX, symbolic
+          links are shown as they are in an "ls -l" listing as "linkname
+          -> filename".
+
+   In UNIX and VMS, listings are returned by the server in alphabetical
+   order of filename. There are presently no other sort or selection
+   options.
+
+   However, since these are fixed-field listings, all fields can be used
+   as sort keys by external sort programs. Note, in particular, that the
+   format used for the date allows a normal lexical on that field to
+   achieve the date ordering. For example, let's assume we have a UNIX
+   client and a UNIX server. In this case, the server's listing has the
+   date in columns 22-40, and thus could be sorted by the UNIX sort
+   program using "sort +0.22 -0.40" or in reverse order by "sort +0.22
+   -0.40r".
+
+   Since the UNIX client can pipe responses to REMOTE commands through
+   filters, any desired sorting can be accomplished this way, for example:
+
+C-Kermit> remote directory | sort +0.22 -0.40
+
+   You can also sort by size:
+
+  C-Kermit> remote directory | sort +0.11 -0.19
+
+   You can use sort options to select reverse or ascending order. "man
+   sort" (in UNIX) for more information. And of course, you can pipe these
+   listings through any other filter of your choice, such as grep to skip
+   unwanted lines.
+
+  5.4. Syntax for Remote Filenames with Embedded Spaces
+
+   C-Kermit and K95, when in server mode, assume that any spaces in the
+   file specification in an incoming GET command are filename separators.
+   Thus if the client gives a command like:
+
+  get {oofa.txt oofa.bin}
+
+   or, equivalently:
+
+  mget oofa.txt oofa.bin
+
+   the server tries to send the two files, oofa.txt and oofa.bin. But what
+   if you want the server to send you a file named, say:
+
+  D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL
+
+   How does the server know this is supposed to be one file and not seven?
+   In this case, you need to the send file name to the server enclosed in
+   either curly braces:
+
+  {D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}
+
+   or ASCII doublequotes:
+
+  "D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL"
+
+   The method for doing this depends on your client. If your client is
+   C-Kermit 7.0, any recent version of Kermit 95, or MS-DOS Kermit 3.16,
+   then you have to enclose the name in braces just so the client can
+   parse it, so to send braces or doublequotes to the server, you must put
+   them inside the first, outside pair of braces. And you also need to
+   double the backslashes to prevent them from being interpreted:
+
+  get {{D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL}}
+  get {"D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL"}
+
+   To get around the requirement to double backslashes in literal
+   filenames, of course you can also use:
+
+  set command quoting off
+  get {{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}}
+  get {"D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL"}
+  set command quoting on
+
+   If you are giving a "kermit" command to the UNIX shell, you have to
+   observe the shell's quoting rules, something like this:
+
+  kermit -ig "{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}"
+
+   Here, the quotes go on the outside so UNIX will pass the entire
+   filename, spaces, braces, and all, as a single argument to Kermit, and
+   the backslashes are not doubled because (a) the UNIX shell ignores them
+   since they are in a quoted string, and (b) Kermit ignores them since
+   the interactive command parser is not activated in this case.
+
+  5.5. Automatic Orientation Messages upon Directory Change
+
+   C-Kermit 7.0, when acting as a server, can send an orientation message
+   to the client whenever the server directory changes. For example, when
+   the client gives a REMOTE CD command, the server sends the contents of
+   the new directory's "Read Me" file to the client's screen. The
+   following commands govern this feature:
+
+   SET SERVER CD-MESSAGE FILE name
+          Given to the servr, allows the message-file name to be specified
+          at runtime. A list of names to look for can be given in the
+          following format:
+
+  {{name1}{name2}{name3}{...}}
+
+          e.g. SET SERVER CD-MESSAGE FILE
+          {{./.readme}{README.TXT}{READ.ME}}
+
+   REMOTE SET SERVER CD-MESSAGE { ON, OFF }
+          Given to the client, lets the client control whether the server
+          sends automatic CD messages.
+
+   SHOW SERVER
+          Given to server, includes CD-Message status.
+
+   The default CD message file name is system dependent. SHOW CD or SHOW
+   SERVER displays the list. Also see [541]Section 4.5.2.
+
+  5.6. New Server Controls
+
+   DISABLE ENABLE
+          Allows the server to configured such that DISABLEd features can
+          not be re-enabled by any means -- e.g. if the client is somehow
+          able to get the server into command mode. Once DISABLEd, ENABLE
+          can not be re-ENABLEd.
+
+   SET SERVER IDLE-TIMEOUT seconds
+          This was available previously in Kermit 95 only. Now it can be
+          used in C-Kermit also to specify a maximum number of seconds the
+          server is allowed to be idle before exiting server mode. 0
+          seconds means no idle timeout. In C-Kermit (but not K-95), SET
+          SERVER TIMEOUT and SET SERVER IDLE-TIMEOUT are mutually
+          exclusive -- you can have one or the other (or neither), but not
+          both. (Server timeouts are for the benefit of primitive Kermit
+          clients that are not capable of timing out on their own; to our
+          knowledge, no such clients are still in circulation.)
+
+   SET SERVER KEEPALIVE { ON, OFF }
+          (See next section).
+
+  5.7. Timeouts during REMOTE HOST Command Execution
+
+   Prior to C-Kermit 7.0, the C-Kermit server would block waiting for
+   output from a system command invoked via REMOTE HOST from the client.
+   If the system command took a long time to execute, the client would
+   time out and send NAK packets. If the command took too long, the client
+   would reach its retry limit and give up. Even if it didn't, the NAKs
+   would cause unnecessary retransmissions.
+
+   In version 7.0, the C-Kermit server (VMS and select()-capable UNIX
+   versions only), sends "keepalive packets" (empty data packets) once per
+   second while waiting for the system command to complete. This procedure
+   should be entirely transparent to the Kermit client, and should prevent
+   the unwanted timeouts and NAKs. When C-Kermit 7.0 itself (or K95
+   1.1.19) is the client, it prints dots to show the keepalive packets.
+
+   The keepalive feature can be turned off and on with:
+
+  SET SERVER KEEPALIVE { ON, OFF }
+
+   Normally it should be on. Turn it off it if causes trouble with the
+   client, or if it seems to slow down the server (as it might on some
+   platforms under certain circumstances).
+
+  6. INTERNATIONAL CHARACTER SETS
+
+   Support for several new single-byte character sets was added in
+   C-Kermit 7.0. Unicode / ISO 10646 is not yet supported, but is a high
+   priority for forthcoming releases.
+
+  6.0. ISO 8859-15 Latin Alphabet 9
+
+   To accommodate the Euro currency symbol, and to correct several other
+   longstanding problems with ISO Latin Alphabet 1, ISO 8859-15 Latin
+   Alphabet 9 was issued in May 1998. It is supported by C-Kermit 7.0 as a
+   transfer character set, a file character set, and a terminal character
+   set. Translations that preserve the new characters are available
+   between Latin-9 and several other sets including:
+
+  PC Code Page 858         (Western European languages, similar to CP850)
+  Windows Code Page 1252   (Western European languages, similar to Latin-1)
+  Windows Code Page 1250   (Eastern European languages, similar to Latin-2)
+
+   The Latin-9 transfer character set also allows for the OE digraph
+   character, used primarily in French, to be preserved in transfers
+   involving the DEC MCS or NeXT character sets.
+
+   The Euro character is also present in the Universal Character Set,
+   described in [542]Section 6.6.
+
+  6.1. The HP-Roman8 Character Set
+
+   The HP-Roman8 character set is supported in C-Kermit 6.0 and later but
+   was omitted from Table VII-4 in the 2nd Edition of Using C-Kermit due
+   to lack of space. It is listed in [543]Appendix III.
+
+  6.2. Greek Character Sets
+
+   Greek character sets were added in 6.1:
+
+  SET FILE CHARACTER-SET { CP869, ELOT927, GREEK-ISO }
+  SET TRANSFER CHARACTER-SET { GREEK-ISO }
+
+   GREEK-ISO is ISO 8859-7, which the same as ELOT 928.
+
+   The new Greek character sets are listed in [544]Appendix III.
+
+  6.3. Additional Latin-2 Character Sets
+
+   The following have been added as FILE and TERMINAL CHARACTER-SETs:
+
+   MAZOVIA-PC
+          A PC code page used in Poland, equivalent to CP437, but with 18
+          substitutions needed for Polish.
+
+   CP1250
+          The Windows Latin 2 Code Page. Equivalent to ISO 8859-2, but
+          with different encoding.
+
+  6.4. Additional Cyrillic Character Sets
+
+   The following have been added as FILE and TERMINAL CHARACTER-SETs:
+
+   BULGARIA-PC
+          This is the Cyrillic PC code page used in Bulgaria, where it is
+          called Code Page 856. It is attributed to a company called
+          DATEC, Inc, but CP856 is not a proper designation, since it
+          refers to a Hebrew Code Page (see the IBM Registry).
+
+   CP855
+          This PC Code Page contains all the Cyrillic letters that are
+          also in ISO 8859-5, and is therefore useful for non-Russian
+          Cyrillic text (Ukrainian, Belorussian, etc), unlike CP866, which
+          has a smaller repertoire of Cyrillic letters.
+
+   CP1251
+          The Windows Cyrillic Code Page. Equivalent to CP855, but with
+          different encoding.
+
+   KOI8R
+          An extension to "Old KOI-8" that adds upper and lower case
+          Cyrillic letter Io (looks like Roman E with diaeresis) plus a
+          selection of box-drawing characters to columns 8 through 11,
+          which are vacant in original Old KOI-8. KOI8-R is used for the
+          Russian language. It is specified in [545]RFC 1489.
+
+   KOI8U
+          A similar extension of Old KOI-8, but for Ukrainian. It is
+          specified in [546]RFC 2319.
+
+  6.5. Automatic Character-Set Switching
+
+   Prior to version 7.0, C-Kermit's file character-set always had to be
+   set explicitly. In 7.0 and later, it is set automatically when:
+
+    1. This feature is enabled (as it is unless you disable it).
+    2. An incoming text-mode transfer includes a transfer-character-set
+       announcer and you have not previously given a SET FILE
+       CHARACTER-SET command. In this case, C-Kermit switches to an
+       appropriate file character set. For example, on an HP-UX
+       workstation, an incoming Latin-1 file automatically selects
+       HP-Roman8 for the local copy of the file; in Data General AOS/VS,
+       it would select DG International.
+    3. You give a SET TRANSFER CHARACTER-SET command without having
+       previously specified a FILE CHARACTER-SET. An appropriate file
+       character-set is chosen automatically.
+
+   In addition, when you give a SET FILE CHARACTER-SET command, the
+   appropriate transfer character-set is automatically chosen, to be used
+   when you are sending files (but this does not override the one
+   announced by the sender when you are receiving files).
+
+   You might not agree about what is "appropriate", so of course you can
+   disable or change all of the above actions.
+
+   You can disable (or re-enable) the new automatic character-set
+   switching feature in each direction separately:
+
+   SET RECEIVE CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL }
+          AUTOMATIC is the default, causing the behavior described above
+          when an incoming file arrives. Choose MANUAL to defeat this
+          behavior and force your current FILE CHARACTER-SET setting to be
+          used, no matter what it is. Note that SET RECEIVE CHARACTER-SET
+          MANUAL does not disable recognition of the incoming transfer
+          character-set announcer, and translation from the corresponding
+          character-set to your current file character-set. To disable
+          that, use SET ATTRIBUTE CHARACTER-SET OFF.
+
+   SET SEND CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL }
+          Again AUTOMATIC is the default, causing the behavior described
+          above when you give a SET { FILE, TRANSFER } CHARACTER-SET
+          command. Use MANUAL to allow you to specify the transfer and
+          file character-sets independently.
+
+   SHOW CHARACTER-SETS
+          Tells settings of { SEND, RECEIVE } CHARACTER-SET-SELECTION.
+
+   Normally, however, it is more convenient to leave automatic switching
+   active, and change any associations that are not appropriate for your
+   application, area, or country. The commands are:
+
+   SHOW ASSOCIATIONS
+          This command lists all the associations in each direction: for
+          each possible transfer character-set, it lists the associated
+          file character-set, and vice versa. These are two separate and
+          independent lists.
+
+   ASSOCIATE TRANSFER-CHARACTER-SET name1 [ name2 ]
+          Changes the association for the transfer character-set name1 to
+          be the file character-set name2. If name2 is omitted, automatic
+          switching is disabled for this transfer character-set only.
+
+   ASSOCIATE FILE-CHARACTER-SET name1 [ name2 ]
+          Changes the association for the file character-set name1 to be
+          the transfer character-set name2. If name2 is omitted, automatic
+          switching is disabled for this file character-set only.
+
+  6.6. UNICODE
+
+   C-Kermit 7.0 adds support for Unicode, the Universal Character Set,
+   for:
+
+     * File Transfer (SEND, RECEIVE, GET, etc)
+     * Terminal connection (CONNECT)
+     * Unguarded file capture (LOG SESSION)
+     * Unguarded file transmission (TRANSMIT)
+     * Local file character-set conversion (TRANSLATE)
+
+   C-Kermit is not, however, a "Unicode application" in the sense that its
+   commands, messages, or user interface are Unicode. Rather, it is
+   "Unicode aware" in its ability to handle and convert Unicode text in
+   the course of file transfer and terminal connection, and you can also
+   use Kermit to convert local files between Unicode and other character
+   sets. TLA's:
+
+  BMP - Base Multilingual Plane
+  BOM - Byte Order Mark
+  CJK - Chinese, Japanese, and Korean
+  ISO - International Standards Organization
+  TLA - Three-Letter Acronym
+  UCS - Universal Character Set
+  UTF - UCS Transformation Format
+
+   Unicode and ISO 10646 are the coordinated and compatible corporate and
+   international standards for the Universal Character Set (UCS). Unlike
+   single-byte and even most multibyte character sets, the UCS can
+   represent all characters in every existing writing system. A flat
+   plain-text file encoded in some form of UCS can contain any mixture of
+   English, Spanish, Italian, German, Hebrew, Arabic, Greek, Russian,
+   Armenian, Georgian, Japanese, Chinese, Korean, Vietnamese, Tibetan,
+   Hindi, Bengali, Tamil, Thai, Ethiopic, and so on, plus scientific and
+   mathematical notation, as well as texts in Runes, Ogham, Glagolitic,
+   and other historic scripts.
+
+   The UCS already covers these scripts and many more, but it's an
+   evolving standard with efforts underway to accommodate even more
+   languages and writing systems. Support is growing for native UCS use on
+   many platforms and in many applications. The goal of the framers of the
+   UCS is for it to replace ASCII, the ISO Latin Alphabets, ISCII, VISCII,
+   the Chinese, Japanese, and Korean (CJK) multibyte sets, etc, as well as
+   the many private character sets in use today, in other words to become
+   *the* Universal Character Set.
+
+   Until that time, however, conversions between existing sets and the UCS
+   will be necessary when moving text between platforms and applications.
+   Now Kermit can help.
+
+    6.6.1. Overview of Unicode
+
+   For a more complete picture, please visit:
+
+  [547]http://www.unicode.org/
+
+   and access the various online introductions, FAQs, technical reports,
+   and other information. For greater depth, order the latest version of
+   the published Unicode Standard. The following overview contains a great
+   many oversimplifications and perhaps an opinion or two.
+
+   At present, the UCS is a 16-bit (2-byte) character set, but with
+   provisions to grow to a 4-byte set. UCS-2 refers to the two-byte set,
+   also called the Base Multilingual Plane (BMP), in which each character
+   has 16 bits, and therefore there are 2^16 = 65536 possible characters.
+   The first 128 characters are the same as US ASCII (C0 control
+   characters and DEL included), the next 32 are the C1 control characters
+   of ISO 6429, and the next 96 are the Right Half of ISO 8859-1 Latin
+   Alphabet 1. The remaining tens of thousands of characters are arranged
+   newly for the UCS, usually (but not always) in sections corresponding
+   to existing standards, such as ISO Latin/Cyrillic, often plus
+   additional characters not appearing in the existing standards due to
+   lack of space (or other reasons).
+
+   ISO 10646 allows for additional planes, e.g. for Egyptian hieroglyphics
+   or ancient (or other esoteric) CJK characters, but these planes are not
+   yet defined and so we will say nothing more about them here, except
+   that their use will require the 4-byte form of UCS, called UCS-4, in
+   some form (more about "forms" in [548]Section 6.6.2).
+
+   Unicode and ISO 10646 are constantly under revision, mainly to add new
+   characters. The Unicode revision is denoted by a version number, such
+   as 1.0, 1.1, 2.0, 3.0. The ISO 10646 standard revision is identified by
+   Edition (such as ISO 10646-1 1993), plus reference to any amendments.
+   The first versions of these standards included encodings for Korean
+   Hangul syllables (Jamos); these encodings were changed in version 1.1
+   of Unicode and by Amendment 5 to ISO 10646-1. The Unicode Technical
+   Committee and the ISO acknowledge that this was a bad thing to do, and
+   promise never change encodings or character names again, since this
+   poses serious problems for conformance and data interchange.
+
+   A UCS-2 value is customarily written like this:
+
+  U+xxxx
+
+   where "xxxx" represents four hexadecimal digits, 0-9 and A-F. For
+   example, U+0041 is "A", U+00C1 is A-acute, U+042F is uppercase Cyrillic
+   "Ya", U+FB4F is Hebrew Ligature Alef Lamed, and U+FFFD is the special
+   character that means "not a character".
+
+   Most characters from widely-used alphabetic writing systems such as the
+   West European ones, Cyrillic, Greek, Hebrew, Vietnamese, etc, are
+   available in "precomposed" form; for example Uppercase Latin Letter A
+   with Acute Accent is a single character (as it is in Latin-1). However,
+   the UCS also permits composition of a base character with one or more
+   nonspacing diacritics. This means the same character can be represented
+   in more than one way, which can present problems in many application
+   areas, including transfer and character-set conversion of text.
+
+   Conversion from ASCII or Latin-1 to UCS-2 text is "trivial": simply
+   insert a NUL (0) byte before each ASCII or Latin-1 byte. Converting in
+   the reverse direction (provided the UCS-2 file contains only U+0000 to
+   U+00FF) is equally simple (if we ignore the issue of composition):
+   remove every second (NUL) byte. Conversion of other character sets to
+   and from UCS, however, requires tables or algorithms specific to each
+   set. Nevertheless, the relatively transparent upwards compatibility
+   from ASCII and Latin-1, in which a very large share of the world's
+   textual data is encoded, gives the UCS an entree onto existing
+   platforms.
+
+   But the 2-byte format and the preponderance of NUL and other control
+   bytes in UCS-2 text pose problems for current applications and
+   transmission methods. And to make matters worse, different hardware
+   platforms store UCS-2 characters in different byte order. Thus a UCS-2
+   file transferred by FTP (or accessed via NFS, etc) between two
+   computers with different architecture might have its bytes in the wrong
+   order (or worse; see [549]Section 6.6.5.1 ).
+
+    6.6.2. UCS Byte Order
+
+   Consider the number 1. In an 8-bit byte, this would be represented by
+   the following series of 0- and 1-bits:
+
+  +-----------------+
+  | 0 0 0 0 0 0 0 1 |
+  +-----------------+
+
+   Therefore in a 16-bit "word" the representation might be:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 |
+  +-----------------+-----------------+
+
+   Now consider the number 256, which is 2 to the 8th power. The binary
+   representation is 100000000 (1 followed by 8 zeros). 256 would go into
+   a 16-bit word like this:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 |
+  +-----------------+-----------------+
+
+   When a computer works this way, it is said to be Big Endian, meaning it
+   puts the most significant (biggest) byte first (on the "left") in a
+   16-bit word, and the least significant byte second (on the right).
+
+   However, some other computers have the opposite arrangement, called
+   Little Endian, in which 1 is:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 |
+  +-----------------+-----------------+
+
+   and 256 is:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 |
+  +-----------------+-----------------+
+
+   Computers such as Sparc, MIPS, PA-RISC, and PowerPC are Big Endian,
+   whereas the PC and the Alpha are Little Endian. Endianness has never
+   been an issue with 7- or 8-bit characters, but it is with UCS
+   characters. It can be a tricky business to share or transfer a UCS-2
+   file between two different kinds of computers.
+
+   To alleviate (but not entirely solve) the problem, UCS-2 files are
+   supposed to begin with the Unicode character U+FEFF, Zero-Width
+   No-Break Space (ZWNBS). This is a kind of "no-op" (note: any such
+   assertion must normally be qualified with many "but ifs" and "excepts"
+   which are omitted here in the interest of brevity). If the bytes are
+   reversed the ZWNBS becomes U+FFFE, which is not (and never will be) a
+   defined UCS character. U+FEFF at the beginning of a UCS file is
+   therefore called a Byte Order Mark, or BOM.
+
+   Any application that creates a UCS-2 (or UTF-16, or UCS-4) file should
+   include a BOM, and any application that reads one should test for a
+   BOM, and if one is found, infer the byte order from it. This is a
+   convention, however -- not a standard or a requirement -- and
+   applications vary in their ability to handle BOMs and "backwards" UCS-2
+   files.
+
+   Note that a BOM is useful only at the beginning of a file. If you
+   append one UCS-2 file to another, and both have BOMs, the internal BOM
+   is no longer a BOM. And if the byte orders of the two files differ,
+   then either the first part or the second will be backwards. (Various
+   other undesirable effects might also occur, not discussed here.)
+
+    6.6.2. UCS Transformation Formats
+
+   UCS textual data can be modified in various ways for transmission or
+   storage. Any officially sanctioned method of doing this is called a UCS
+   Transformation Format, or UTF. One such method, called UTF-16, is
+   essentially identical with UCS-2 except that it designates certain code
+   values as "escape sequences" (called surrogate pairs) to access
+   characters in other planes without having to use full UCS-4. We won't
+   discuss UTF-16 further here, since at the moment there are no other
+   planes. Several other UTF's (such as UTF-1, UTF-2, and UTF-7) have
+   fallen into disuse and are not discussed here. The most important
+   transformation format today is UTF-8.
+
+   UTF-8, so called because it "serializes" UCS-2 data into a stream of
+   8-bit bytes, is designed to allow the UCS to work with present-day
+   communications gear, computers, and software. The most important
+   properties of UTF-8 are that byte order is constant (no byte swapping)
+   and all (7-bit) ASCII characters represent themselves. Therefore
+   conversion between ASCII and UTF-8 is no conversion at all, and
+   applications or platforms (such as Plan 9 from Bell Labs) that use
+   UTF-8 "for everything" can still run traditional ASCII-only
+   applications and be accessed from them. In particular, unlike UCS-2,
+   ASCII characters are not padded with NUL bytes. But also unlike UCS-2,
+   there is no transparency for Latin-1 or any other non-ASCII character
+   set. Every non-ASCII UCS-2 character is represented by a sequence of 2
+   or 3 UTF-8 bytes. Thus UTF-8 is more compact than UCS-2 for text
+   containing a preponderance of ABC's (or other ASCII characters), about
+   the same as UCS-2 for other alphabetic scripts (Cyrillic, Roman, Greek,
+   etc), and larger than UCS-2 for Chinese, Japanese, and Korean.
+
+   The UTF-8 uncoding of the UCS has been adopted by the Internet as the
+   preferred character set for new applications, and is gradually being
+   retrofitted into traditional applications like FTP ([550]RFC 2640).
+
+    6.6.3. Conformance Levels
+
+   Although the Unicode and ISO 10646 standards both describe the same
+   character set, these standards differ in many ways, including their
+   stated requirements for conformance and their classification of
+   conformance levels.
+
+   Kermit has always abided by ISO character-set standards, including ISO
+   character-set designation and invocation methods. In adapting Unicode,
+   therefore, we had to choose from among the available ISO designations
+   which, in turn, correspond with ISO 10646 conformance levels. At
+   present, Kermit claims the lowest conformance level, 1, meaning
+   (roughly) that it does not handle combining forms and it does not
+   handle Korean Hangul Jamos (just as, at present, it does not handle
+   Korean in general). Note that ISO 10646 Conformance Levels 1 and 2
+   sidestep the issue of the code changes for Korean Hangul by announcing
+   non-support for Hangul regardless of encoding.
+
+   ISO 10646 Conformance Level 1 is approximately equivalent to Unicode
+   Normalization Form C (described in Unicode Technical Report 15,
+   incorporated into Unicode 3.0).
+
+   As noted in [551]Section 6.6.2, Kermit does not claim to support UTF-16
+   at the present time, hence the UCS-2 nomenclature. Kermit treats
+   surrogates just as if they were any other UCS-2 characters, rather than
+   as escapes to other planes, which means that (except when converting
+   between UCS-2 and UTF-8) they are translated to "error" characters,
+   since (a) no other planes are defined yet (and if they were, no other
+   character sets supported by Kermit would encode their characters), and
+   (b) no valid surrogate character corresponds to any other UCS-2
+   character.
+
+   A minor yet significant aspect of Unicode 3.0 and some recent
+   perturbation of ISO 10646-1 (probably Amendment 18, "Symbols and Other
+   Characters") is the addition of the Euro Sign at U+20AC. As noted in
+   [552]Section 6.0, Kermit's "Euro compliance" includes conversion
+   between Latin Alphabet 9 and various PC code pages. Text can also be
+   converted between UCS-2 or UTF-8 and any other Euro-compliant character
+   set (Latin-9, CP858, CP1250, CP1252) without loss of the Euro Sign.
+
+    6.6.4. Relationship of Unicode with Kermit's Other Character Sets
+
+   Kermit's character sets are divided into two groups: single-byte sets
+   (such as Roman, Hebrew, Cyrillic, Greek) and multibyte (various
+   Japanese sets). The two groups are distinct since one normally would
+   not expect to convert Kanji ideograms to Roman (or other) letters, or
+   vice versa.
+
+   Unicode character-set conversion works with both groups, but obviously
+   the result depends on the repertoires of the source and destination
+   character-sets both including the characters in the file. For example,
+   you can translate a Hungarian text file between Latin-2 and Unicode,
+   but not between (say) Unicode and Latin/Greek. By the same token you
+   can convert Japanese text from Shift-JIS or EUC or JIS-7 to Unicode and
+   back, but you can't convert the same file to (say) Latin-1 if it
+   contains Japanese characters.
+
+     JIS-7 is equivalent to DEC Kanji and ISO-2022-JP except that the
+     latter two do not support halfwidth Katakana. Kermit treats all
+     three of these sets the same way, i.e. as JIS-7.
+
+   As noted, Kermit presently does not handle combining diacritics, and so
+   will not correctly convert UCS files that use them into a single-byte
+   character set. For example, if a UCS file contains Latin Capital Letter
+   A (U+0041) followed by Combining Acute Accent (U+0301), the result will
+   be a two-character sequence, A followed by another character. This is
+   what is meant by Conformance Level 1. (The situation grows worse with
+   multiple diacritics, since they can occur in any order.)
+
+   A higher level of conformance is possible, in which "canonical
+   equivalences" are handled via algorithms and databases, at some
+   (perhaps considerable) cost in performance, since a fair amount of
+   additional code must be executed for every character during data
+   transfer (database lookup, sorting of combining sequences into
+   canonical order, etc). This can be added in future releases if there is
+   a need (but in many cases, pre- and postpostprocessing might be a
+   better option).
+
+   Within these constraints, Kermit converts between the UCS and its other
+   character sets. For example, a mixture of Russian and English (and/or
+   Dutch, or Latin) text can bet converted between the UCS and ISO
+   Latin/Cyrillic or KOI-8. But since Kermit does not presently support
+   Arabic character-set conversion, the new availability of UCS conversion
+   does not mean that Kermit can convert from Arabic UCS text to some
+   other character set, because Kermit does not support any other
+   character set that includes Arabic. Ditto for Thai, Armenian, Georgian,
+   Tibetan, Chinese, Korean, etc. However, Kermit CAN convert Arabic (or
+   any other script) between UCS-2 and UTF-8.
+
+   Considering Cyrillic more carefully, note that the UCS also contains
+   numerous Cyrillic characters not found in any of the Cyrillic sets (ISO
+   Latin/Cyrillic, KOI8, CP866, etc) that Kermit supports; characters
+   needed for Abkhasian, Yakut, Tatar, Bashkir, Altaic, Old Church
+   Slavonic, etc; UCS text containing any of these historic or "extended"
+   Cyrillic characters can not be converted to any of Kermit's current
+   single-byte Cyrillic sets without loss. The situation is similar for
+   Greek, Hebrew, etc, and even worse for Japanese since Unicode contains
+   thousands of Kanjis that are lacking from the Japanese character sets
+   based on JIS X 0208, such as EUC-JP, JIS-7, and Shift-JIS.
+
+   In general, when converting from UCS to a single-byte set, there is
+   always the possibility of data loss, just as there is when converting
+   from any larger set to a smaller one. For example, if a UCS file
+   contains Devanagari characters, these characters will be lost when
+   converting to (say) Latin-1, just as Roman vowels with acute accents
+   are lost when converting from Latin-1 (an 8-bit set) to German ISO 646
+   (a 7-bit set).
+
+    6.6.5. Kermit's Unicode Features
+
+   C-Kermit can convert between UCS-2 or UTF-8 and any of its other
+   character sets, and also between UCS-2 and UTF-8. When converting
+   between UCS-2 or UTF-8 and a non-Unicode character set (such as
+   Latin-1), the UCS Line Separator (LS, U+2028) and Paragraph Separator
+   (PS, U+2029) characters are converted to the appropriate line
+   terminator (CR, LF, or CRLF). When converting from a non-Unicode set to
+   UCS-2 or UTF-8, however, line terminators are not converted to LS or
+   PS. This is in accordance with the recommendations of Unicode Technical
+   Report #13.
+
+   When C-Kermit starts, it tests the native byte order of the computer.
+   You can see the result in the SHOW FEATURES or SHOW FILE display. It's
+   also available in the variable \v(byteorder): 0 means Big Endian, 1
+   means Little Endian.
+
+   When UCS-2 is involved in file transfer or translation, the following
+   commands tell C-Kermit what to do about byte order:
+
+   SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN }
+          This is for reading UCS-2 files that don't have a BOM, and also
+          for writing UCS-2 files. If this command is not given, the
+          machine's native byte order is used when writing UCS-2 files,
+          and also when reading UCS-2 files that don't have a BOM.
+
+   SET FILE UCS BOM { ON, OFF }
+          This setting is used when creating UCS-2 files. A BOM is added
+          at the beginning by default. Use OFF to not add the BOM. This
+          command has no affect when writing files.
+
+   COPY /SWAP-BYTES sourcefile destinationfile
+          Use this for fixing a UCS-2 file whose bytes are in the wrong
+          order.
+
+   Use SHOW FILE to display the FILE UCS settings.
+
+   Please note, again, that C-Kermit's user interface, including its
+   script language, is not internationalized in any way. String
+   comparisons, case conversion, and so on, work only for US ASCII
+   (comparisons for equality work with other sets, but not
+   lexically-greater-or-less-than or caseless comparisons; even
+   comparisons for equality can fail when composed characters or byte
+   order are involved). String functions such as \findex() and
+   \fsubstring() that reference byte positions do just that; they won't
+   work with UTF-8 text that contains any non-ASCII characters, and they
+   will not work with UCS-2 text at all since they use C strings
+   internally, which are NUL-terminated. These are just a few examples to
+   illustrate that neither Unicode nor any other character-set beyond
+   ASCII is supported at the user-interface, command, or scripting level
+   in this version of C-Kermit.
+
+    6.6.5.1. File Transfer
+
+   Kermit supports both UCS-2 and UTF-8 as file and transfer character
+   sets in text-mode file transfer.
+
+   To select UCS-2 or UTF-8 as a file character-set, use:
+
+  SET FILE CHARACTER-SET { UCS2, UTF8 }
+
+   If you want to send a UCS-2 text file (or save an incoming file in
+   UCS-2 format), tell Kermit to:
+
+  SET FILE CHARACTER-SET UCS2
+
+   and if you want to send a UTF-8 text file (or store an incoming file in
+   UTF-8 format), tell Kermit to:
+
+  SET FILE CHARACTER-SET UTF8
+
+   When sending UCS-2 files, Kermit determines the byte order from the
+   BOM, if there is one (and if there is a BOM, it is stripped, i.e. not
+   sent). If there is no BOM, the byte order is the one specified in the
+   most recent SET FILE UCS BYTE-ORDER command, if any, otherwise the
+   computer's native byte order is assumed. When storing incoming files as
+   UCS-2, the byte order is according SET FILE UCS BYTE-ORDER, if given,
+   otherwise the native one; a BOM is written according to SET FILE UCS
+   BOM.
+
+   A transfer character-set should be chosen that includes all of the
+   characters in the source file. So, for example, if you are sending a
+   UCS-2 file containing only German-language text, your transfer
+   character-set can be Latin-1, Latin-2, Latin-9, UCS-2, or UTF-8. But if
+   you are sending a file that contains a combination of Hebrew and Greek,
+   your transfer character-set must be UCS-2 or UTF-8 if you don't want to
+   lose one script or the other. Furthermore, the transfer character-set
+   must be one that is supported by the receiving Kermit program. Since
+   UCS support is new, it is possible that the other Kermit program (if it
+   supports character sets at all) does not support it, but does support
+   single-byte sets such as Latin-1, Latin/Cyrillic, etc.
+
+   To select UCS-2 or UTF-8 as a transfer character-set, use:
+
+  SET TRANSFER CHARACTER-SET { UCS2, UTF8 }
+
+   It is up to the receiving Kermit program to convert the transfer format
+   to its own local format, if necessary. If it does not understand the
+   UTF-8 or UCS-2 transfer character-set, and your file can not be
+   adequately represented by any single-byte transfer character-set (such
+   as Latin-1 or Latin/Cyrillic) then, if UTF-8 format is acceptable on
+   the receiving computer, use UTF-8 as the transfer character-set, with
+   the receiver told to "set unknown-char keep", or with the sender told
+   to "set attribute char off". If you want the file to be stored in UCS-2
+   format at the receiver, send it it binary mode if the source file is
+   also UCS-2, or else use the TRANSLATE command (next section) to convert
+   it to UCS-2 first, then send it in binary mode. You should not use
+   UCS-2 as a transfer character-set in text-mode transfers to Kermit
+   programs that don't support it, because they are likely to corrupt the
+   result the same way FTP would (see the final paragraph of this
+   section).
+
+   When UCS-2 is the transfer character set, it always goes into Kermit
+   packets in Big Endian format, with no BOM. As always, the transfer
+   character-set is announced by the sender to the receiver. The
+   announcement for UCS-2 is "I162" (ISO Registration 162 = UCS-2 Level 1)
+   and by definition it is Big Endian (the standards say that when UCS-2
+   is serialized into bytes, the order must be Big Endian). The
+   announcement for UTF-8 is "I190" (UTF-8 Level 1).
+
+   When receiving a file whose transfer character-set is UCS-2 or UTF-8,
+   you must choose the appropriate file character set for the result.
+   There is no way Kermit can do this for you automatically, since UCS
+   data can be in any script at all, or any combination.
+
+   In general, UTF-8 or UCS-2 should be chosen as a transfer character-set
+   if the source file is also encoded in some form of UCS and it contains
+   more than one script. But there are other situations where where UTF-8
+   or UCS-2 offer advantages. For example, suppose the source file is on a
+   NeXTstation and the destination file is on VMS. Both the NeXT and the
+   DEC Multinational character sets include the French OE digraph, but
+   Latin-1 does not. Therefore French words containing this character
+   might not arrive intact when Latin-1 is the transfer character-set, but
+   will with UTF-8 or UCS-2, since the UCS includes the OE digraph (but so
+   does Latin-9).
+
+   UCS-2 should be chosen as a transfer character-set only for Japanese
+   text files that contain a large preponderance of Kanji, since in this
+   case (and only this case) UCS-2 (two bytes per Kanji) is more efficient
+   than UTF-8 (three bytes per Kanji). The same will be true for Chinese
+   and Korean when they are supported by Kermit. UCS-2 should never be
+   used as a transfer character-set with a transfer partner that does not
+   support UCS-2 since this can cause file corruption (see last paragraph
+   in this section).
+
+   Note that Kermit's repeat-count compression is 100% ineffective for
+   UCS-2, and is also ineffective for multibyte characters in UTF-8 and
+   EUC-JP; this is because repeat-compression is a transport-level
+   mechanism that operates on a per-byte basis; it has no knowledge of the
+   distinction between a byte and a character.
+
+   When C-Kermit starts, it sets up associations ([553]Section 6.5) for
+   incoming files whose transfer character sets are UCS-2 or UTF-8
+   appropriately for the platform so that the file character-set for the
+   incoming file is UCS-2 in Windows and UTF-8 elsewhere. Otherwise,
+   C-Kermit does not make any default associations for UCS-2 or UTF-8, but
+   of course you may add or change associations to suit your needs and
+   preferences by including the appropriate ASSOCIATE commands in your
+   Kermit startup file. For example, if you are a PC user and deal only
+   with text written in Greek and English, you can:
+
+  ASSOCIATE TRANSFER-CHARACTER-SET UTF8 CP869
+  ASSOCIATE TRANSFER-CHARACTER-SET UCS2 CP869
+  ASSOCIATE FILE-CHARACTER-SET CP869 UTF8
+
+   Note that when file transfer involves conversion between a single-byte
+   character set and UCS-2 or UTF-8, the file-transfer thermometer and
+   estimated time left might be inaccurate, since they are based on the
+   source file size, not the transfer encoding. This is purely a cosmetic
+   issue and does not effect the final result. (And is not, strictly
+   speaking, a bug; Kermit protocol presently includes no method for the
+   sender to furnish an "estimated transfer size" to the receiver, and in
+   any case any such guess could be as far off as the file size, given the
+   many other factors that come into play, such as compression and
+   prefixing).
+
+   A caution about FTP and UCS-2. As noted previously, if you transfer a
+   UCS-2 file with FTP in binary mode between two computers with opposite
+   Endianness, the result will have its bytes in the wrong order. However,
+   if you use FTP to transfer a UCS-2 file in "ascii" (text) mode to ANY
+   computer, even if it is identical to yours, the result will be
+   corrupted because FTP's line-terminator conversions do not account for
+   UCS-2. The same holds when sending from a UCS-aware Kermit program to
+   an older Kermit program in text mode with a transfer character-set of
+   UCS-2. So use UCS-2 as a transfer character-set ONLY with a UCS-2-aware
+   Kermit partner.
+
+    6.6.5.2. The TRANSLATE Command
+
+   In Kermit versions that have Unicode support included, TRANSLATE now
+   always goes through Unicode; that is, the source set is converted to
+   UCS-2 and thence to the target set. This is a major improvement, since
+   in prior releases, C-Kermit had to pick the "most appropriate" transfer
+   character-set as the intermediate set, and this would result in the
+   loss of any characters that the source and target sets had in common
+   but were lacking from the intermediate set (for example the OE digraph
+   when translating from NeXT to DEC MCS through Latin-1). This never
+   happens when Unicode is the intermediate set because Unicode is a
+   superset of all other character sets supported by Kermit. A more
+   dramatic example would be translation between Cyrillic PC code page 866
+   and KOI8-R ([554]Section 6.4); formerly all the line- and box-drawing
+   characters would be lost (since ISO 8859-5 does not have any); now the
+   ones that these two sets have in common are preserved.
+
+   UCS-2 and UTF-8 are now both supported as source-file and
+   destination-file character sets by C-Kermit's TRANSLATE command, for
+   example:
+
+  translate oofa.txt ucs2 latin1 oofa-l1.txt
+
+   translates oofa.txt from UCS-2 to Latin-1, storing the result as
+   oofa-l1.txt. Similarly:
+
+  translate oofa.txt utf8 latin1 oofa-l1.txt
+  translate oofa.txt latin1 ucs2 oofa-ucs2.txt
+  translate oofa.txt latin1 utf8 oofa-utf8.txt
+  translate oofa.txt ucs2 utf8 oofa-utf8.txt
+  translate oofa.txt utf8 ucs2 oofa-ucs2.txt
+
+   Treatment of the UCS-2 BOM is exactly the same as for file transfer.
+   Note that if a UCS-2 source file is in the "wrong" byte order and lacks
+   a BOM, and you don't tell Kermit about it with SET FILE UCS BYTE-ORDER,
+   the result of the translation is total gibberish. Recall that you can
+   use COPY /SWAP-BYTES to switch the byte order of an errant UCS-2 file
+   (or any other file for that matter, if you can think of a reason to).
+   Also note that:
+
+  translate oofa.txt ucs2 ucs2 new.txt
+
+   Produces a result in the native (or SET FILE UCS) byte-order as long as
+   oofa.txt has a BOM.
+
+   As a side benefit of the Unicode work, the TRANSLATE command now works
+   for the first time also for all Japanese character sets that Kermit
+   supports. In other words, if you have a Japanese text file in any of
+   the following encodings:
+
+  EUC-JP
+  Shift-JIS
+  JIS-7
+  UCS-2
+  UTF-8
+
+   You can use the TRANSLATE command to convert to any other encoding from
+   the same list.
+
+    6.6.5.3. Terminal Connection
+
+   The CONNECT command now allows UTF-8 as a local or remote terminal
+   character-set:
+
+  SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 }
+  SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 }
+  SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 }
+
+   (Recall that Kermit's terminal character-set has two "ends" -- the set
+   used on the host to which Kermit is connected, and the set used on the
+   local keyboard and screen.)
+
+   UCS-2 is not supported as a terminal character-set (either end) since
+   (a) it is not used that way anywhere to our knowledge, and (b) the
+   problems of Endianness and the high likelihood of loss of
+   synchronization make it impractical. (Telecommunications is
+   byte-oriented; if one byte, or any odd number of bytes, is lost because
+   of buffer overruns, circuit resets, etc (or likewise if a burst of
+   noise appears that takes the guise of an odd number of bytes), the byte
+   order of the subsequent data stream will be backwards; unlike UTF-8 and
+   traditional byte-based character sets, UCS-2 is not "self
+   synchronizing".)
+
+   UTF-8 does not have byte-order or synchronization problems and is
+   growing in popularity as a terminal character set as well as in other
+   application areas. It allows a single terminal session to use multiple
+   scripts (Roman, Cyrillic, Greek, etc) without ISO 2022 character-set
+   switching (which terminal emulators like Kermit 95 can handle but few
+   host applications understand or use), and meshes nicely with the
+   Unicode screen fonts that are beginning to appear.
+
+   UTF-8 was first used in Plan 9 and soon will be available in Linux. It
+   will probably spread from there (Unicode in some form is, of course,
+   also used in Windows NT, but only internally -- not for access from
+   outside).
+
+   To use UTF-8 or any other character set that uses 8-bit bytes in your
+   terminal session, be sure to tell C-Kermit to:
+
+  SET TERMINAL BYTESIZE 8
+  SET COMMAND BYTESIZE 8
+  SET PARITY NONE
+
+   (or use the shortcut command, EIGHTBIT, which does all three at once).
+
+   In a setup where your local Kermit program uses a single-byte character
+   set such as PC Code Page 850 and the remote host uses UTF-8:
+
+  SET TERM CHAR UTF8 CP850
+
+   or:
+
+  SET TERM REMOTE CHAR UTF8
+  SET TERM LOCAL CHAR CP850
+
+   all works as expected. UTF-8 text on the remote displays correctly on
+   your screen, and when you type CP850 characters, they are translated to
+   UTF-8 sequences for transmission, and the echo from the host is
+   translated from UTF-8 back to CP850. Telnet negotiations and
+   autodownload take place before any character-set translation and work
+   as before. The session log (if text mode was selected for it) contains
+   only the local terminal character-set. And so on.
+
+   Kermit merely supplies translations from UTF-8 to your local terminal
+   character-set (this includes treating UTF-8 Line Separator and
+   Paragraph separator as CRLF). However, Kermit does does not, at
+   present, perform "canonicalization" of composed sequences, nor does it
+   automatically execute bidirectionality algorithms for display of
+   mixed-direction text (e.g. Hebrew and English). Such presentation
+   issues, like all others in the terminal-host regime, are left to the
+   host.
+
+   By the way, C-Kermit also allows UTF-8 to be the local end of the
+   terminal character-set, but so far this code is not tested, since we
+   don't have a UTF-8 console or terminal to work with. However, it can be
+   stated without doubt that C-Kermit's key mapping will not work for
+   UTF-8 values, since (a) the key map is indexed by 8-bit byte values and
+   (b) C-Kermit reads keystrokes a byte at a time (these comments do not
+   apply to K95, which has direct access to the keyboard and can read
+   "wide" keycodes and uses them to index a "wide" keymap).
+
+   Restrictions: As noted, the CONNECT command does not support UCS-2 as a
+   REMOTE TERMINAL character-set. Neither does it support the Japanese
+   sets EUC-JP, JIS-7, and Shift-JIS. Support for the Japanese sets (and
+   possibly Chinese and Korean too) might be added in a future release.
+   Since the TRANSMIT command (next section) uses the same REMOTE TERMINAL
+   character-sets as the CONNECT command, it has the same restrictions.
+
+    6.6.5.4. The TRANSMIT Command
+
+   As described in Chapter 15 of [555]Using C-Kermit and [556]Section 4.21
+   of this document, the TRANSMIT command can be used to upload a file
+   without protocol, more or less as if you were typing it on your
+   keyboard while connected to the host. When TRANSMITting in text mode,
+   the file's character set is converted to the host's unless you have SET
+   TERMINAL CHARACTER-SET TRANSPARENT, or you include the new TRANSMIT
+   switch, /TRANSPARENT.
+
+   Before C-Kermit 7.0, the file character-set was assumed to be the same
+   as the local end of the terminal character-set, and the TRANSMIT
+   command used the same translations as the CONNECT command, ignoring the
+   file character-set.
+
+   In C-Kermit 7.0, that assumption (a poor one to begin with) can no
+   longer be made, since UCS-2 can be a file character-set but not a
+   terminal character-set. So now the file's character-set is given by
+   your most recent SET FILE CHARACTER-SET command. The host's character
+   set is the remote end of your most recent SET TERMINAL CHARACTER-SET
+   command:
+
+  SET TERMINAL CHARACTER-SET remote-set [ local-set ]
+
+   or:
+
+  SET TERMINAL REMOTE-CHARACTER-SET remote-set
+
+   The TRANSMIT command converts each source-file character from the FILE
+   character-set to the REMOTE TERMINAL character-set, and then transmits
+   the translated characters according to your SET TRANSMIT preferences
+   (Chapter 15).
+
+   If you have SET TRANSMIT ECHO ON, and the host is echoing the
+   transmitted characters, the echos are converted from the remote
+   terminal character-set to the local terminal character-set.
+
+  [ A picture would help... ]
+
+   Confused? Let's work through an example. Suppose your local computer is
+   a NeXTstation, on which text files are encoded in the NeXT character
+   set, and that the remote computer is a Data General AViiON, which uses
+   the Data General International character set. Further suppose that you
+   are logged in to the NeXT from a VT220 terminal which uses the DEC
+   Multinational character set.
+
+   You need to convert the file from NeXT encoding to DG encoding and
+   convert the echoes from DG encoding to DEC encoding. So on the NeXT,
+   tell C-Kermit to:
+
+  eightbit
+  set file character-set next
+  set term character-set dg-international dec-mcs
+  transmit /text nextdata.txt
+
+   (This assumes you have some sort of collection process already set up
+   on the Data General, such as a text editor or the venerable "cat >
+   foo". The EIGHTBIT command is equivalent to SET TERMINAL BYTESIZE 8,
+   SET COMMAND BYTESIZE 8, SET PARITY NONE.)
+
+   To further complicate matters, suppose your local terminal character
+   set is the same as the remote one, so you don't need terminal
+   character-set translation, but you need to TRANSMIT a file that is in a
+   different character set and you want it translated to the host set. In
+   this case, use SET TERM CHARACTER-SET to actually specify the character
+   set used on each end, rather than specifying TRANSPARENT:
+
+  eightbit
+  set file character-set ucs2
+  set term character-set latin1 latin1
+  transmit /text ucs2data.txt
+
+   The distinction between:
+
+  SET TERMINAL CHARACTER-SET xxx yyy
+
+   (where xxx and yyy are the same set) and:
+
+  SET TERMINAL CHARACTER-SET TRANSPARENT
+
+   is new to C-Kermit 7.0, but affects only the TRANSMIT command.
+
+   The TRANSMIT command currently does nothing special with UCS-2/UTF-8
+   Line and Paragraph Separator characters; more experience is required to
+   find out how these behave in a genuine Unicode terminal-host setting.
+
+   Restrictions: As noted, the TRANSMIT command translates from the FILE
+   character-set to the REMOTE TERMINAL character-set. This rules out
+   translations to any character set that is not supported as a REMOTE
+   TERMINAL character-set, such as UCS-2, EUC-JP, JIS-7, and Shift-JIS.
+
+    6.6.5.5. Summary of Kermit Unicode Commands
+
+   Specifying file character-set and byte order:
+          SET FILE CHARACTER-SET { ..., UCS2, UTF8 }
+          REMOTE SET FILE CHARACTER-SET { ..., UCS2, UTF8 } (See next
+          section)
+          SET FILE UCS BOM { ON, OFF }
+          SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN }
+
+   Specifying the transfer character-set:
+          SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 }
+          REMOTE SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 }
+
+   Specifying the terminal character-set:
+          SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 }
+          SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 }
+          SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 }
+
+   Displaying settings:
+          SHOW FILE
+          SHOW TRANSFER
+          SHOW TERMINAL
+          SHOW CHARACTER-SETS
+
+   Commands that use these settings include:
+          SEND, RECEIVE, GET, etc.
+          CONNECT
+          TRANSMIT
+          LOG SESSION
+
+   Converting files:
+          TRANSLATE infile { ..., UCS-2, UTF-8 } { ..., UCS-2, UTF-8 }
+          outfile
+          COPY /SWAP-BYTES infile outfile
+
+  6.7. Client/Server Character-Set Switching
+
+   A simple mechanism has been added to allow the client to change the
+   server's FILE CHARACTER-SET:
+
+   REMOTE SET FILE CHARACTER-SET name
+          The client asks the server to change its file character-set to
+          the one given. The name must match one of the server's file
+          character-set names. For convenience, C-Kermit uses its own file
+          character-set keyword list for parsing this command so you can
+          use ? for help and Tab or Esc for completion. However, since the
+          server might have a different repertoire (or even use different
+          names for the same sets), C-Kermit accepts any string you supply
+          and sends it to the server. The server, if it supports this
+          command (C-Kermit 7.0 and K95 1.1.19 do), sets its file
+          character-set as requested, and also disables automatic
+          character-set switching ([557]Section 6.5). If the server does
+          not support this command or if it does not support the given
+          character set, the REMOTE SET FILE CHARACTER-SET command fails.
+
+   Here's an example that sends a Japanese text file encoded in Shift-JIS
+   to a server using every combination of Kermit's Japanese-capable file
+   and transfer character sets:
+
+  dcl \&x[] = euc ucs2 utf8             ; transfer character-sets
+  dcl \&y[] = eu uc ut                  ; 2-letter abbreviations for them
+  dcl \&f[] = shift euc jis7 ucs2 utf8  ; file character-sets
+  dcl \&g[] = sj eu j7 uc ut            ; 2-letter abbreviations
+
+  set file char shift-jis               ; local file character-set is Shift-JIS
+  for \%i 1 \fdim(&x) 1 {               ; for each transfer character-set...
+      set xfer char \&x[\%i]            ; set it
+      for \%j 1 \fdim(&f) 1 {           ; for each remote file character-set...
+          remote set file char \&f[\%j] ; set it
+          if fail exit 1 SERVER REJECTED CHARSET
+          send /text meibo-sj.html meibo-sj-\&y[\%i]-\&g[\%j].txt ; send the fil
+e
+          if fail exit 1 TRANSFER FAILED
+      }
+  }
+
+   The Kermit-370 server does not support REMOTE SET FILE CHARACTER-SET,
+   but since it supports REMOTE KERMIT commands, you can get the same
+   effect with REMOTE KERMIT SET FILE CHARACTER-SET name.
+
+  7. SCRIPT PROGRAMMING
+
+   (Also see [558]Section 2.8, Scripting Local Programs.)
+
+  7.0. Bug Fixes
+
+   The following script programming bugs were fixed in C-Kermit 7.0:
+
+     * IF EXIST and IF DIRECTORY were fixed to properly strip braces from
+       around their arguments, so "if directory {C:\Program Files}", etc,
+       would work as expected. However, this means that if the file or
+       directory name is actually enclosed in braces, the braces must be
+       doubled.
+     * The READ command did not fail if the READ file wasn't open; now it
+       does.
+     * The READ command refused to read the last or only line of a file if
+       it did not end with a proper line terminator; now it does.
+     * The END command, when given from within a SWITCH statement, did not
+       exit from the current macro or command file; instead it just
+       terminated the SWITCH.
+
+  7.1. The INPUT Command
+
+   7.1.1. INPUT Timeouts
+
+   The description of the INPUT command on page 422 fails to mention the
+   following two points about the timeout (which apply to C-Kermit 6.0 and
+   later):
+
+    1. "INPUT -1 text" (or "INPUT \%x text", where \%x is any variable
+       whose value is -1 or less) means "wait forever". This form of the
+       INPUT command fails only if it is interrupted, since it will never
+       time out.
+    2. INPUT 0 performs a nonblocking read of material that has already
+       arrived but has not yet been read, and succeeds immediately if the
+       target string is found, or fails immediately if it is not found.
+
+   The same points apply to MINPUT. REINPUT ignores its timeout parameter.
+
+    7.1.2. New INPUT Controls
+
+   The following new INPUT controls were added in version 7.0:
+
+   SET INPUT AUTODOWNLOAD { ON, OFF }
+          Explained in [559]Section 7.7.
+
+   SET INPUT CANCELLATION { ON, OFF }
+          This governs whether an INPUT command can be canceled by
+          "pressing any key" on the keyboard. Normally it can be, in which
+          case the INPUT command fails immediately and \v(instatus) is set
+          to 2, indicating interruption. SET INPUT CANCELLATION OFF
+          disables keyboard cancellations; thus if the search text is not
+          encountered, the INPUT command will run for its entire timeout
+          interval. SET INPUT CANCELLATION OFF does not disable
+          interruption by Ctrl-C, however; every command needs an
+          emergency exit. (If you really want to disable interruption by
+          Ctrl-C, use SET COMMAND INTERRUPTION OFF.)
+
+   Also see [560]Section 7.2 for any new variables related to INPUT.
+
+    7.1.3. INPUT with Pattern Matching
+
+   C-Kermit 7.0 allows INPUT, MINPUT, and REINPUT targets to be a pattern
+   (explained in [561]Sections 1.19 and [562]4.9). This solves a
+   long-standing problem illustrated by the following scenario: a certain
+   company has a bank of TCP/IP modem servers, with hostnames server1,
+   server2, server3, and so on. Each server's prompt is its name, followed
+   by a colon (:), for example "Server72:". Without INPUT patterns, it
+   would be rather difficult to wait for the prompt. The brute force
+   approach:
+
+  minput 20 Server1: Server2: Server3: ... (enumerating each one)
+
+   is subject to failure whenever a new server is added. A more subtle
+   approach:
+
+  input 20 Server
+  if fail ...
+  input 2 :
+
+   is liable to false positives, e.g. "Welcome to the XYZ Corp Modem
+   Server. Please read the following message:"...
+
+   With patterns, you can match the prompt with "Server*:" (which doesn't
+   solve the "false positives" problem, but certainly is more compact than
+   the brute force method), or with more specific patterns such as
+   "Server[1-9]:" and "Server[1-9][0-9]:", or equivalently:
+
+  Server{[1-9],[1-9][0-9]}:
+
+   meaning the word "Server" followed by a single digit (1-9) or by two
+   digits representing a number from 1 to 99, followed by a colon.
+
+   INPUT pattern matching has been added in a way that does not interfere
+   with existing scripts. No new commands or switches are used. The simple
+   rule is: if an INPUT search target is the argument of the (new)
+   \fpattern() function, it is a pattern. Otherwise it is taken literally,
+   as before. For example:
+
+  input 5 a*b
+
+   searches for an 'a' followed by an asterisk ('*'), followed by a 'b'.
+   But:
+
+  input 5 \fpattern(a*b)
+
+   searches for an 'a' followed by anything at all up to and including the
+   first 'b'. This means that any search target to INPUT, MINPUT, or
+   REINPUT can be a pattern or a literal string, and in particular that
+   MINPUT can accommodate any mixture of patterns and literal strings.
+
+   In selecting patterns, note that:
+
+     * A leading '*' is always implied so there is no need to include one.
+     * A trailing '*' is meaningless and ignored.
+     * A '*' by itself matches the first character that arrives.
+
+   A syntax note: If your pattern is a selection list, meaning a list of
+   alternatives separated by commas and enclosed in braces, then the outer
+   braces will be stripped by various levels of parsers, so you must
+   include three of each:
+
+  input 10 \fpattern({{{abc,mno,xyz}}})
+
+   Note that this is equivalent to:
+
+  minput 10 abc mno xyz
+
+   except for the setting of the \v(minput) variable.
+
+   And a caution: INPUT pattern matching has a limitation that you
+   probably never noticed with literal-string matching, namely that there
+   is a limit on the size of the match. For example, if the pattern is
+   "a*b", the match will succeed if the 'a' and 'b' are not separated by
+   more than (say) 8K bytes, but will fail if they are farther apart than
+   that. In such cases, it better to use two INPUTs (e.g. "input 10 a" and
+   then "input 100 b").
+
+    7.1.4. The INPUT Match Result
+
+   The result of any INPUT, MINPUT, or REINPUT command, no matter whether
+   the search targets are patterns or literal strings, is available in the
+   new \v(inmatch) variable. For example:
+
+  minput 10 cat \fpattern([dh]og)
+  if success echo MINPUT matched "\v(inmatch)"
+
+   This is especially useful when a pattern was matched, since it makes
+   the string that matched the pattern available to Kermit; there would be
+   no way to get it otherwise.
+
+   After an INPUT command, you can view all the INPUT-related variables by
+   typing "show variables in" (abbreviate as "sho var in"), which shows
+   the values of all built-in variables whose names start with "in".
+
+  7.2. New or Improved Built-In Variables
+
+   \v(blockcheck)
+          Current BLOCK-CHECK setting, 1, 2, 3, or 4. 4 is the code for
+          BLANK-FREE-2.
+
+   \v(byteorder)
+          The machine's byte order: 0 = Big Endian, 1 = Little Endian.
+
+   \v(cmdbufsize)
+          The length of the command buffer, which is the maximum size for
+          a macro, a command, a variable, or anything else in C-Kermit's
+          script language.
+
+   \v(ctty)
+          The device name of C-Kermit's controlling (login) terminal.
+
+   \v(filename)
+          Described in [563]Sections 4.1 and [564]4.2.
+
+   \v(filenumber)
+          Described in [565]Sections 4.1 and [566]4.2.
+
+   \v(filespec)
+          As of C-Kermit 7.0, contains fully qualified filenames rather
+          than (usually) relative ones.
+
+   \v(return)
+          Now holds the END n value of the macro that most recently
+          returned, in case END was used rather than RETURN.
+
+   \v(editor)
+          Pathname of preferred text editor
+
+   \v(editopts)
+          Command-line options for editor
+
+   \v(editfile)
+          File most recently edited
+
+   \v(browser)
+          Pathname of preferred Web browser
+
+   \v(browsopts)
+          Command-line options for Web browser
+
+   \v(browsurl)
+          URL most recently given to Web browser
+
+   \v(dialtype)
+          Type of call most recently placed (see [567]Section 2.1.11).
+
+   \v(kbchar)
+          The character, if any, that was typed at the keyboard to to
+          interrupt the most recent PAUSE, SLEEP, WAIT, MSLEEP, or INPUT
+          command; empty if the most recent such command was not
+          interrupted from the keyboard.
+
+   \v(lockdir)
+          UNIX only - The name of the UUCP lockfile directory, if known,
+          otherwise "(unknown)".
+
+   \v(lockpid)
+          UNIX only - PID of process that owns the communication port that
+          you tried to open with a SET LINE command that failed because
+          the port was in use, otherwise empty. This variable is set with
+          every SET LINE command.
+
+   \v(cx_time)
+          If no connection (SET HOST, SET LINE, DIAL, TELNET, etc) is
+          active, this is 0. If a connection is active, this is the number
+          of seconds since the connection was made.
+
+   \v(hwparity)
+          If hardware parity is in effect, this variable gives its value,
+          such as "even" or "odd" (in which case, the \v(parity) variable
+          will be "none"). Otherwise this variable is empty.
+
+   \v(serial)
+          Current serial port settings in 8N1 format ([568]Section 2.10).
+
+   \v(errno)
+          In UNIX, the current value of the C runtime errno variable,
+          which is quite volatile (meaning that often an "interesting"
+          error code can be overwritten by some other library call or
+          system service that sets errno before you have a chance to look
+          at it). In VMS, the error code returned by the system or library
+          call that most recently failed (success codes are not saved).
+          Not available in other operating systems.
+
+   \v(errstring)
+          The UNIX or VMS system error message that corresponds to
+          \v(errno). Not available in all OS's. Also see
+          [569]\ferrstring().
+
+   \v(setlinemsg)
+          The error message, if any, from the most recent SET LINE, SET
+          PORT, SET HOST, TELNET, or other connection-making command. This
+          is not necessarily the same as \v(errstring) since these
+          commands might fail without generating a system error code, for
+          example (in UNIX) because a lockfile existed indicating the
+          device was assigned by another user.
+
+   \v(exitstatus)
+          The exit status C-Kermit would return if it exited now.
+
+   \v(pexitstat)
+          The exit status of the inferior process most recently invoked by
+          C-Kermit (by RUN, !, REDIRECT, SEND /COMMAND, etc). In VMS, this
+          code can be given to \ferrstring() to get the corresponding
+          error message (in UNIX, program/command return codes are not the
+          same as system error codes). Not available in operating systems
+          other than UNIX and VMS. See [570]Section 4.2.5 for details.
+
+   \v(inmatch)
+          The incoming string of characters, if any, that matched the most
+          recent INPUT, REINPUT, or MINPUT command.
+
+   \v(intime)
+          The number of milliseconds (thousandths of seconds) it took for
+          the most recent INPUT command to find its match, or -1 if no
+          INPUT command has been given yet. If the INPUT command timed
+          out, the value is approximately equal to 1000 times the INPUT
+          timeout. If INPUT failed for some other reason, the value is
+          undefined (\v(instatus) gives INPUT completion status). If your
+          version of C-Kermit is built without high-precision
+          floating-point timers, this number will always be a multiple of
+          1000.
+
+   \v(inwait)
+          The number of seconds specified as the timeout in the most
+          recent INPUT command.
+
+   \v(dialsuffix)
+          Dialing suffix for use during PDIAL sequence; see [571]Section
+          2.1.10.
+
+   \v(pid)
+          UNIX, VMS, and K95 only. C-Kermit's primary process ID, numeric,
+          decimal. If you want to show it in hex, use \fn2hex(\v(pid)) If
+          you want to show it in octal, use \fn2octal(\v(pid)).
+
+   \v(printer)
+          Current printer name or SET PRINTER value.
+
+   \v(p_ctl)
+          Control prefix char \v(p_8bit) 8-bit prefix char (if parity not
+          none)
+
+   \v(p_rpt)
+          Repeat prefix char (if repeat compression enabled)
+
+   \v(herald)
+          Kermit's version herald
+
+   \v(test)
+          Kermit's test version, if any, or 0 if this is not a test
+          version. Typical values for test versions are "Alpha.03" or
+          "Beta.14".
+
+   \v(sendlist)
+          The number of entries in the SEND-LIST, 0 if none. Note: entries
+          do not necessarily correspond to files, since an entry might
+          contain wildcards. Also note that the value does not go back to
+          0 after the files in the list are sent. To reset this variable,
+          use CLEAR SEND-LIST. The purpose of this variable is to
+          determine if a SEND command, when given without any filenames,
+          will be legal. Example:
+
+  xif \v(sendlist) { send } else { send oofa.txt }
+
+   \v(trigger)
+          If the most recent CONNECT session was terminated automatically
+          by a trigger, this variable contains the trigger value.
+
+   \v(ty_ln)
+          TYPE line number (during TYPE)
+
+   \v(ty_lc)
+          TYPE line count (after TYPE)
+
+   \v(ty_mc)
+          TYPE match count (after TYPE)
+
+   \v(xferstat)
+          Status of most recent file transfer:
+
+-1: No transfer yet
+ 0: Succeeded
+ 1: Failed
+
+   \v(xfermsg)
+          If the most recent file transfer failed, this is the reason. If
+          it succeeded, \v(xfermsg) is an empty string.
+
+   \v(tftime)
+          Total elapsed time of most recent file transfer operation, in
+          seconds.
+
+   \v(textdir)
+          Directory that holds (or is supposed to hold) Kermit text files
+          such as installation instructions, release notes, update notes,
+          read-me files, "beware" files, etc.
+
+   \v(name)
+          The name with which the Kermit program was invoked, e.g.
+          "kermit", "wermit", "k95", "k2", etc (see [572]Section 9.1).
+
+   \v(osname)
+          Name of operating system on computer where C-Kermit is running,
+          obtained at runtime (from uname or equivalent).
+
+   \v(osversion)
+          Version of operating system on computer where C-Kermit is
+          running, obtained at runtime (from uname or equivalent).
+
+   \v(osrelease)
+          Release of operating system on computer where C-Kermit is
+          running, obtained at runtime (from uname or equivalent).
+
+   \v(model)
+          The specific hardware model of the computer where C-Kermit is
+          running, if known.
+
+   \v(math_pi)
+          The value of Pi (see [573]Section 7.23)
+
+   \v(math_e)
+          The value of e (see [574]Section 7.23)
+
+   \v(math_precision)
+          How many significant digits in a floating-point number.
+
+   \v(f_count)
+          Result of the most recent FILE COUNT (FCOUNT) command.
+
+   \v(f_error)
+          Numeric error code of most recent FILE command.
+
+   \v(f_max)
+          Maximum number of files open simultaneously.
+
+   The math constants are given in the precision of underlying computer's
+   floating-point arithmetic.
+
+   Note the distinction between \v(osname), \v(osversion), and
+   \v(platform); the latter refers to the platform for which and/or upon
+   which C-Kermit was built, as opposed to the one on which it is actually
+   running. Also note that each operating system can, and probably will,
+   interpret and fill in the os* variables differently, or not at all.
+
+   The SHOW VARIABLES command now accepts a variable name, prefix, or
+   pattern:
+
+  show variables         Shows all variables.
+  show variables t       Shows all variables that start with "t".
+  show variables *ver*   Shows all variables whose names contain "ver".
+  show variables *ver    Ditto (an implied "*" is appended).
+
+  7.3. New or Improved Built-In Functions
+
+   The following new file-i/o functions are explained in [575]Section
+   1.22.
+
+  \f_status(channel)           Status of file open on channel
+  \f_pos(channel)              Read/write (byte) pointer of given file
+  \f_line(channel)             Current line of file
+  \f_handle(channel)           Handle of file
+  \f_eof(channel)              Whether given file is at EOF
+  \f_getchar(channel)          Read a char from given file
+  \f_getline(channel)          Read a line from given file
+  \f_getblock(channel,n)       Read a block from given file
+  \f_putchar(channel,c)        Write a char to given file
+  \f_putline(channel,string)   Write a line to given file
+  \f_putblock(channel,string)  Write a block to given file
+
+   The following new date-time-related functions are explained in
+   [576]Section 1.6:
+
+  \fday()                Returns day of week of given date
+  \fnday()               Returns numeric day of week of given date
+  \ftime()               Returns time portion of given date-time
+  \fntime()              Converts time to seconds since midnight
+  \fn2time()             Converts seconds since midnight to hh:mm:ss
+  \fcvtdate(date-time)   Converts free-format date to yyyymmdd hh:mm:ss
+  \fdayofyear(date-time) Converts date to yyyyddd (day-of-year) format
+  \fdoy(date-time)       Synonym for \fdayofyear()
+  \fdoy2date(dayofyear)  Converts yyyyddd to yyyymmdd
+  \fmjd(date-time)       Converts free-format date to Modified Julian Date
+  \fmjd2date(mjd)        Converts modified Julian date to yyyymmdd
+
+   The new floating-point arithmetic functions are explained in
+   [577]Section 7.23. f1 and f2 are floating-point (real) numbers; d is
+   the number of decimal places to show:
+
+  \ffpabsolute(f1,d)     Absolute value of f1
+  \ffpadd(f1,f2,d)       f1 + f1
+  \ffpcosine(f1,d)       Cosine of f1
+  \ffpdivide(f1,f2,d)    f1 divided by f2
+  \ffpexp(f1,d)          e to the f1 power
+  \ffpint(f1)            Integer part of f1
+  \ffplog10(f1,d)        Log base 10 of f1
+  \ffplogn(f1,d)         Natural log of f1
+  \ffpmaximum(f1,f2,d)   Maximum of f1 and f2
+  \ffpminimum(f1,f2,d)   Minimum of f1 and f2
+  \ffpmodulus(f1,f2,d)   Modulus of f1 and f2
+  \ffpmultiply(f1,f2,d)  Product of f1 and f2
+  \ffpraise(f1,f2,d)     Raise f1 to power f2
+  \ffpround(f1,d)        Round f1 to d places
+  \ffpsine(f1,d)         Sine of f1
+  \ffpsqrt(f1,d)         Square root of f1
+  \ffpsubtract(f1,f2,d)  f2 - f1
+  \ffptangent(f1,d)      Tangent of f1
+
+   Integer number functions:
+
+   \fabsolute(n)
+          Absolute value of integer n.
+
+   \frandom(n)
+          Returns a random integer between 0 and n-1.
+
+   \fradix(s,n1,n2)
+          If the string s is an integer in radix n1, the result is the
+          same number expressed in radix n2, where n1 and n2 may be any
+          number from 2 through 36, expressed as decimal numbers, or
+          variables (etc) that evaluate to decimal numbers. For the source
+          and result, the digits of any radix, r, are the first r
+          characters in the sequence 0-9,a-z (case doesn't matter for the
+          letters). The string s may have a sign, + or -; if it starts
+          with a minus (-) sign, the result also has a minus sign.
+
+   The \fradix() function does not work with floating-point numbers. It
+   does not reveal the internal storage format of a number; for example,
+   \fradix(-1,10,16) is -1, not something like FFFFFFFFFF. If all three
+   arguments are not given, or if n1 or n2 are not numbers between 2 and
+   36 inclusive, or s is not a number in radix n1, an error occurs and the
+   empty string is returned. \fradix() also does not offer
+   extended-precision arithmetic; number values are limited to those
+   expressed as a long integer in the architecture of the underlying
+   computer, usually 32 or 64 bits. If you give it an argument whose
+   absolute value is larger than can be held in an unsigned long, the
+   result is -1.
+
+   The next four are shorthand functions for decimal/hexadecimal and
+   decimal/octal number conversion:
+
+   \fn2hex(n)
+          Returns the hexadecimal (base 16) representation of the integer
+          n. This is different from \fhexify(s), which treats its argument
+          as a string rather than a number. The result is always
+          left-padded with 0's to make its length even. Examples:
+
+  \n2hex(0)   = "00"                    \fhexify(0)   = "30"
+  \n2hex(255) = "ff"                    \fhexify(255) = "323535"
+  \n2hex(256) = "0100"                  \fhexify(256) = "323536"
+
+   \fhex2n(x)
+          Converts hexadecimal number x to decimal equivalent decimal
+          number. This is the inverse of \fn2hex(). Equivalent to
+          \fradix(s,16,10).
+
+   \fn2octal(n)
+          Returns the octal (base 8) representation of the number n.
+          Examples:
+
+  \n2octal(0) = "0"
+  \n2oct(255) = "377"
+  \n2oct(256) = "400"
+  Equivalent to \fradix(n,10,8).
+
+   \foct2n(n)
+          Returns the decimal representation of the given octal number, n.
+          The inverse of \fn2octal(). Equivalent to \fradix(n,8,10).
+
+   String functions:
+
+   \s(name[n:m])
+          Equivalent to \fsubstring(\m(name),n,m) ([578]Section 7.24).
+
+   \:(name[n:m])
+          Equivalent to \fsubstring(name,n,m) (where "name" is any
+          \-quantity) ([579]Section 7.24).
+
+   \fleft(s,n)
+          The leftmost ncharacters of string s; equivalent to
+          \fsubstring(s,1,n).
+
+   \fstripx(string,char)
+          Returns the part of the string up to the rightmost occurrence,
+          if any, of the given character. The default character is period
+          (.) Examples:
+
+  \fstripx(foo/bar,/)                 = "foo"
+  \fstripx(foo/bar/baz,/)             = "foo/bar"
+  \fstripx(autoexec.bat,.)            = "autoexec"
+  \fstripx(autoexec.bat)              = "autoexec"
+  \fstripx(fstripx(foo/bar/baz,/),/)  = "foo"
+
+   \flop(string,character)
+          Returns the portion of the string starting after the first
+          occurrence of the given character. The default character is
+          period (.) Examples:
+
+  \flop(autoexec.bat)                 = "bat"
+  \flop(baz.foo/bar)                  = "foo/bar"
+  \flop(baz.foo/bar,/)                = "bar
+
+   \fstripn(string,n)
+          Returns the string with ncharacters removed from the end.
+          Example:
+
+  \fstripn(12345678,3)                = "12345"
+
+          (For more discussion of \fstripx(), \fstripn(), and \flop() see
+          [580]Section 4.2.3).
+
+   \fb64encode(s)
+          Returns the Base-64 encoding of the string s.
+
+   \fb64decode(s)
+          Returns the decoding of the Base-64 string s. Fails if s is not
+          a Base-64 string, or if its length is not a multiple of 4. Note
+          that if any of the result bytes are null (0), the result string
+          stops there. There is no way to represent strings that contain
+          null bytes in C-Kermit (the same is true for \funhexify()).
+
+   \fword(s1,n,s2,s3)
+          Extracts word number nfrom string s1. By default, a "word" is
+          any sequence of ASCII letters or digits; nis 1-based. If n is
+          omitted, "1" is used. Examples:
+
+  \fword(one two three)    = "one"
+  \fword(one two three,1)  = "one"
+  \fword(one two three,2)  = "two"
+  \fword(one two three,3)  = "three"
+
+          and:
+
+    \fword(\v(dialresult),2) = "31200"
+
+          is "31200" if \v(dialresult) is (e.g.) "CONNECT
+          31200/ARQ/V32/LAPM/V42BIS".
+
+          If you include s2, this replaces the default break set. For
+          example, suppose you have a string \%a whose value is:
+
+  $150.00 $300.00 $39.95
+
+          and you want each dollar amount to be a word; use:
+
+  \fword(\%a,\%n,{ })
+
+          This returns dollar amount number \%n, e.g. "$300.00" for \%n =
+          2. "{ }" denotes a space (you must enclose it in braces,
+          otherwise it is squeezed out). Note that ASCII control
+          characters are always included in the break set; you don't have
+          to specify them (and you can't not specify them).
+
+          The optional s3 argument lists characters (even control
+          characters) that normally would be considered separators that
+          you want included in words. So the dollars-and-cents example
+          could also be handled this way:
+
+  \fword(\%a,\%n,,$.)
+
+          in other words, use the default separator list, but remove "$"
+          and "." from it so they will be considered part of a word.
+
+          Note that since 8-bit characters are not ASCII, they act as
+          break characters unless you put them in the include list.
+          Suppose, for example, you have a file in which each line is a
+          Tab-separated list of words, numbers, or phrases that might
+          contain puncuation, special characters like $ and @, 8-bit bit
+          characters, etc (like something that might have been exported
+          from a spreadsheet or database), and you want to split only on
+          Tab; here is a way (\m(line) is a line read from the file):
+
+undef keep
+for \%i 1 255 1 {
+    if == \%i 9 continue
+    .keep := \m(keep)\fchar(\%i)
+}
+while true {
+    fread /line \%c line
+    if fail break
+    .\%n := \fsplit(\m(line),&a,\9,\m(keep))
+    ...
+}
+
+          This problem is addressed in [581]C-Kermit 9.0.
+
+   \fsplit(s1,&a,s2,s3)
+          This is like \fword(), except instead of extracting and
+          returning a particular word from string s1, it counts the words
+          and optionally assigns them to the array whose identifying
+          letter, a-z, is given after the "&" in the second argument, with
+          the first word going into element 1, the second into element 2,
+          and so on. The rules regarding break and include lists (s2 and
+          s3) are exactly the same as for \fword(). \fsplit() returns the
+          number of words that were assigned, which is either the number
+          of words in the string, or the dimension of the array, whichever
+          is less. If the array is not declared, \fsplit() creates it and
+          returns a number which is both the number of words in s1 and the
+          dimension of the new array. Examples:
+
+  declare \&w[20]        ; (Optional.)
+  ...
+  read \%s               ; \%s is "This is a sentence with seven words."
+  ...
+  echo "\fsplit(\%s)"    ; This would print "7".
+  echo "\fsplit(\%s,&w)" ; Ditto, and also assigns them to array \&w[].
+
+  echo "\&w[7]"          ; This would print "words".
+
+          If the line contained fields that were delimited by colon (:),
+          you would use \fsplit(\%s,&w,:). If the fields were delimited by
+          comma, then you would use \fsplit(\%s,&w,{,}); in this case the
+          literal comma must be enclosed in braces to distinguish it from
+          the comma that separates function arguments. To get a word count
+          without loading an array, but still specify break and/or include
+          lists, leave the array argument empty:
+
+   echo "\fsplit(\%s,,:)" ; Use colon as the separator.
+
+          WARNINGS:
+
+         1. If you use the same array repeatedly, \fsplit() leaves any
+            trailing members undisturbed. For example:
+  dcl \&w[10]
+  \fsplit(1 2 3 4 5,&w) ; Sets \&w[1] thru \&w[5].
+  \fsplit(a b c,&w)     ; Sets \&w[1]-[3] leaving [4]-[5] as they were.
+
+         2. If you allow \fsplit to create the array (by not declaring it
+            first), it is dimensioned to the number of elements it was
+            created with:
+  \fsplit(1 2 3,&x)     ; Creates an array \&x[] with 3 elements.
+  \fsplit(a b c d e,&x) ; This overflows the array.
+
+          Thus if you want to use \fsplit() repeatedly on the same array,
+          either dimension it in advance to the maximum expected size (and
+          then some -- more efficient), or else destroy it after each use
+          (to allow for unexpectedly large arguments). Example using a
+          dynamic array:
+
+  fopen /read \%c some-file
+  if fail ...
+  set function error on    ; See [582]Section 7.12
+  while true {
+      dcl \&w[]            ; Destroy \&[w] each time thru the loop
+      fread /line \%c \%a
+      if fail break
+      asg \%x \fsplit(\%a,&w)
+      if fail ...
+      ; (do what you want with \&w[] here...)
+  }
+  fclose \%c
+
+   \frindex(s1,s2,n)
+          The "n" argument to \frindex() now works consistently (in mirror
+          image) with the corresponding \findex() argument. In each case,
+          the (n-1)-most characters of s2 are ignored in the search; for
+          findex, this means the starting position of the search is n (the
+          default n is 1, and 0 is treated like 1). For \frindex() it
+          means the default starting point is:
+
+  length(s2) - length(s1) - n (with the same defaults for n).
+
+   \fsearch(pattern,string[,position])
+          Exactly like \findex(), except with a pattern (see [583]Section
+          7.9) rather than a literal string.
+
+   \frsearch(pattern,string[,position])
+          Exactly like \frindex(), except with a pattern rather than a
+          literal string.
+
+          File Functions:
+
+   \ffiles(), \fnextfile()
+          It is no longer necessary to copy the file list to an array
+          before use, as shown on p.398 of [584]Using C-Kermit 2nd
+          Edition. \ffiles() and friends now make their own safe copies of
+          the file list. Thus constructions like the following are now
+          possible:
+
+  for \%i 1 \ffiles(*.txt) 1 { send \fnextfile() }
+
+          The same is true for the new function \frfiles(),
+          \fdirectories(), and \frdirectories(), described in [585]Section
+          4.11.3.
+
+          But note that each reference to \fnextfile() still gets you the
+          next file. So "if newer \fnextfile() foo.txt send \fnextfile()"
+          compares one file's age with that of foo.txt, and then sends an
+          entirely different file. If you're going to refer to the same
+          file more than once, assign it to a variable:
+
+  asg \%f \fnextfile()
+  if newer \%f foo.txt send \%f
+
+          (note: assign, not define).
+
+          Also note that \ffiles(), \frfiles(), \fdirectories(), and
+          \frdirectories() all now accept on optional 2nd argument: the
+          name of an array to load with the resulting file or directory
+          list, explained in [586]Section 4.11.3. So you can also load an
+          array with the filelist when you need to refer to the same file
+          more than once:
+
+  for \%i 1 \ffiles(*,&a) 1 { if newer \&a[\%i] foo.txt send \&a[\%i] }
+
+   \fpermissions(file)
+          Returns the platform-specific permissions string for the file,
+          such as "-rw-rw-r--" in UNIX or "(RWE,RWE,RE,E)" in VMS.
+
+   \fdirname(f)
+          Given a file specification f, this function returns the complete
+          pathname of directory the file is in.
+
+   Array Functions:
+
+   \fdimension(&a)
+          Returns the dimension declared for the array whose identifying
+          letter, a-z, or special character "_" or "@", is given after the
+          "&" in the argument. If the array is not declared, 0 is
+          returned. Note that when used with the macro argument vector
+          array, \&_[] (see [587]Section 7.5), the value of this function
+          is one less than \v(argc), and when used with the C-Kermit
+          command-line argument vector array, \&@[], it is equal to the
+          \v(args) variable. Examples:
+
+  echo \fdimension(&a)       ; Not declared.
+  0
+  declare \&a[12]            ; Now it's declared.
+  echo \fdim(&a)
+  12
+
+   \farraylook(pattern,arrayname)
+          Looks in the given array for the pattern and returns the index
+          of the first element that matches, if any, or -1 if none match.
+          The arrayname can include a range specifier to restrict to
+          search to a segment of the array, e.g.
+          \farraylook(*xyz*,&a[32:63]). For greater detail see
+          [588]Section 7.10.7.
+
+   \ftablelook(keyword,arrayname[,delimiter])
+          Looks in the given "table", which must be sorted, for the given
+          keyword. Returns the index of the table element that uniquely
+          matches the given keyword, or -1 if none match, or -2 if more
+          than 1 match. For greater detail see [589]Section 7.10.7.
+
+   Other new functions:
+
+   \fip2hex(s)
+          Converts a dotted decimal IP address to an 8-digit hexadecimal
+          number. \fip2hex(128.59.39.2) = 803b2702.
+
+   \fhex2ip(x)
+          Converts an 8-digit hexadecimal IP address to dotted decimal
+          form, e.g. \fhex2ip(803b2702) = 128.59.39.2. The inverse of
+          \fip2hex().
+
+   \fcommand()
+   \frawcommand()
+          These run an external command and return its output; see
+          [590]Section 4.2.8.4.
+
+   \fdialconvert(s)
+          s is a phone number in either literal or portable format (not a
+          dialing directory entry name). The function returns the dial
+          string that would actually be used when dialing from the current
+          location (after processing country code, area code, and other
+          SET DIAL values).
+
+   \ferrstring(n)
+          Returns the system error message associated with the (numeric)
+          error code n. UNIX and VMS only. Use in conjunction with
+          \v(errno) or \v(pexitstat). See [591]Section 4.2.5 for a usage
+          example. Note: This function doesn't work in Windows because
+          there is not a consistent error-code-to-message mapping; error
+          code "x" means something completely different depending on
+          whether it comes from the C runtime library, Winsock, a
+          Windows-32 API, TAPI, etc,
+
+   \fpattern(s)
+          Used in INPUT, REINPUT, and MINPUT commands to denote search
+          strings that are to be treated as patterns rather than
+          literally.
+
+   Also see [592]Section 7.8 on built-in help for functions.
+
+  7.4. New IF Conditions
+
+   IF AVAILABLE feature command
+          Executes the command if the given feature is available.
+          Presently used only to determine if specific authentication and
+          encryption options are available. Type "if available ?" to see
+          which features may be tested.
+
+   IF FLOAT f1 command
+          Executes command if f1 is a legal floating point number (which
+          includes integers). Use this to preverify arguments for the
+          \ffp...() floating-point arithmetic functions, e.g. "if float
+          \%1 echo \ffpint(\%1)".
+
+   IF == n1 n2 command
+          Synonym for "if =" (numeric equality). Note that as of C-Kermit
+          7.0, this and all other numeric comparison operators also work
+          for floating-point numbers.
+
+   IF != n1 n2 command
+          Executes the command if n1 and n2 are both numbers or variables
+          containing numbers and the value of n1 is not equal to the value
+          of n2. This is equivalent to "if not = n1 n2".
+
+   IF <= n1 n2 command
+          Executes the command if n1 and n2 are both numbers or variables
+          containing numbers and the value of n1 is less than or equal to
+          the value of n2. This is equivalent to "if not > n1 n2".
+
+   IF >= n1 n2 command
+          Executes the command if n1 and n2 are both numbers or variables
+          containing numbers and the value of n1 is greater than or equal
+          to the value of n2. Equivalent to "if not < n1 n2".
+
+   IF COMMAND word command
+          Executes the command if word is a built-in C-Kermit command.
+          Example:
+
+  if not command copy define { copy run copy \%1 \%2 }".
+
+          This defines a COPY macro that runs an external COPY command if
+          COPY is not already a built-in command.
+
+   IF LOCAL command
+          Executes the command if Kermit is in local mode, i.e. if it has
+          a SET LINE, SET PORT, or SET HOST (TELNET, RLOGIN, etc) device
+          or connection open. Does not execute the command if in remote
+          mode.
+
+   IF MATCH string pattern command
+          Executes the command if the string matches the pattern. For a
+          description of the syntax for the pattern, see [593]Section
+          4.9.1. If you want to test if the string contains pattern, use
+          IF \fsearch(pattern,string).
+
+   IF OPEN { DEBUG-LOG, SESSION-LOG, TRANSACTION-LOG, ... } command
+          Executes the command if the given file is open, fails if it is
+          not open. Type IF OPEN ? for a complete list of files that can
+          be checked (all the files that can be opened with the OPEN or
+          LOG commands).
+
+   IF QUIET command
+          Executes the command if SET QUIET is ON, and does not execute it
+          if SET QUIET is OFF. Example: IF NOT QUIET ECHO { This is a
+          message.}.
+
+   IF READABLE name
+          Succeeds if name is the name of an existing file or directory
+          that is readable.
+
+   IF WRITEABLE name
+          Succeeds if name is the name of an existing file or directory
+          that is writeable, e.g.:
+
+  if not writeable \v(lockdir) echo Please read installation instructions!
+
+   IF FLAG command
+          This tests a user-settable condition, which can mean anything
+          you like. SET FLAG ON causes subsequent IF FLAG commands to
+          succeed; SET FLAG OFF causes them to fail. One way to use it
+          would be for debugging your scripts; precede any debugging
+          statements with IF FLAG. Then SET FLAG on to debug your script,
+          SET FLAG OFF to run it without debugging. Another common use is
+          for causing an inner loop to cause an outer loop to exit.
+
+   IF C-KERMIT command
+          C-Kermit, but not Kermit 95 or MS-DOS Kermit, executes the
+          command.
+
+   IF K-95 command
+          Kermit 95, but not C-Kermit or MS-DOS Kermit, executes the
+          command.
+
+   IF MS-KERMIT command
+          MS-DOS Kermit, but not C-Kermit or Kermit 95, executes the
+          command.
+
+  7.5. Using More than Ten Macro Arguments
+
+   The \v(argc) variable now gives the actual number of arguments, even if
+   the number is greater than 9:
+
+  C-Kermit> define xx echo \v(argc)
+  C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z
+  27
+
+   Remember that \v(argc) includes the name of the macro itself, so it is
+   always at least 1, and is always 1 greater than the actual number of
+   arguments. As in versions 6.0 and earlier, if more than 9 arguments are
+   given, only the first nine are assigned to the variables \%1..\%9.
+
+   The \&_[] array, discussed on page 353 of [594]Using C-Kermit, 2nd ed,
+   now holds all the arguments, up to some implementation-dependent limit
+   (64 or greater), rather than only the first 9. To illustrate: the
+   following macro tells the number of arguments it was called with and
+   then prints them:
+
+  define show_all_args {
+      local \%i
+      echo \&_[0] - Number of arguments: \feval(\v(argc)-1)
+      for \%i 1 \v(argc)-1 1 { echo \flpad(\%i,3). "\&_[\%i]" }
+  }
+
+   Within a macro \&_[0], like \%0, contains the name of the macro.
+
+   At top level, the \&_[] array is filled as follows:
+
+     * If the first argument on the C-Kermit command line was a filename,
+       or C-Kermit was invoked from a "Kerbang" script ([595]Section
+       7.19), element 0 contains the filename, and elements 1 through
+       \v(argc)-1 hold the remaining command-line arguments.
+     * Otherwise the program name goes in element 0, and elements 1
+       through \v(argc)-1 hold any arguments that were included after "--"
+       or "="
+
+   The new \%* variable, when used within a macro, is replaced by the text
+   that followed the macro name in the macro invocation. If no arguments
+   were given, \%* is replaced by the empty string. Examples:
+
+  C-Kermit> define xx echo [\%*]
+  C-Kermit> define \%a oofa
+  C-Kermit> xx
+  []
+  C-Kermit> xx \%a
+  [oofa]
+  C-Kermit> xx a
+  [a]
+  C-Kermit> xx a b
+  [a b]
+  C-Kermit> xx a b c
+  [a b c]
+  C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z
+  [a b c d e f g h i j k l m n o p q r s t u v w x y z]
+
+   Note that \%* can not be used at top level, since Kermit does not have
+   access to the raw command line (only to its elements separately, after
+   they have been processed by the shell and the C library).
+
+   C-Kermit 7.0 also adds a SHIFT command:
+
+   SHIFT [ number ]
+          Shifts the macro arguments (except argument 0) the given number
+          of places to the left and adjusts \v(argc) accordingly. The
+          default number is 1.
+
+   To illustrate, suppose macro XXX is invoked as follows:
+
+  xxx arg1 arg2 arg3
+
+   Then inside XXX, \%1 is "arg1", \%2 is "arg2", and \%3 is "arg3". After
+   a SHIFT command is given inside XXX, then \%1 is "arg2", \%2 is "arg3",
+   and \%3 is empty. \%0 (the name of the macro) remains unchanged.
+
+   If more than 9 arguments were given, then arguments are shifted into
+   the \%1..9 variables from the argument vector array.
+
+   At top level, the SHIFT command operates on the \&_[] array and \%1..9
+   variables; the \&@[] array is not affected. See [596]Section 7.16 for
+   details.
+
+   The \%* variable is not affected by the SHIFT command.
+
+  7.6. Clarification of Function Call Syntax
+
+   Spaces are normally stripped from the front and back of each function
+   argument; to prevent this enclose the argument in braces:
+
+  \fsplit(\%a,&a,{ })
+
+   However, function calls that contain spaces can make trouble when the
+   function is to be used in a "word" field, since space separates words.
+   For example:
+
+  for \%i 1 \fsplit(\%a,&a,{ }) 1 {
+    echo \%i. "\&a[\%i]"
+  }
+
+   In most cases, the trouble can be averted by enclosing the function
+   reference in braces:
+
+  for \%i 1 {\fsplit(\%a,&a,{ })} 1 {
+    echo \%i. "\&a[\%i]"
+  }
+
+   or by replacing spaces with \32 (the ASCII code for space):
+
+  for \%i 1 \fsplit(\%a,&a,\32) 1 {
+    echo \%i. "\&a[\%i]"
+  }
+
+   Braces are also used in function calls to indicate grouping. For
+   example:
+
+  \fsubstring(abcd,2,2) = "bc"
+
+   But suppose "abcd" needed to contain a comma:
+
+  \fsubstring(ab,cd,2,2)
+
+   This would cause an error, since "cd" appears to be the second
+   argument, when really you want the first "2" to be the second argument.
+   Braces to the rescue:
+
+  \fsubstring({ab,cd},2,2) = "b,"
+
+   Similarly, leading and trailing spaces are stripped from each argument,
+   so:
+
+  \fsubstring( abcd ,2,2) = "bc"
+
+   but braces preserve them:
+
+  \fsubstring({ abcd },2,2) = "ab"
+
+   Given these special uses for braces, there is no way to pass literal
+   braces to the function itself. For example:
+
+  \fsubstring(ab{cd,2,2)
+
+   causes an error.
+
+   So if you need a function to include braces, define a variable
+   containing the string that has braces. Example:
+
+  define \%a ab{cd
+  \fsubstring(\%a,2,2) = "b{"
+
+   If the string is to start with a leading brace and end with a closing
+   brace, then double braces must appear around the string (which itself
+   is enclosed in braces):
+
+  define \%a {{{foo}}}
+  \fsubstring(\%a) = "{foo}"
+
+   This also works for any other kind of string:
+
+  define \%a {{ab{cd}}
+  echo \fsubstring(\%a) = "ab{cd"
+
+  7.7. Autodownload during INPUT Command Execution
+
+   As of 6.1 / 1.1.12, C-Kermit can be told to look for incoming Kermit
+   (or Zmodem) packets during execution of an INPUT command. By default
+   (for consistency with earlier releases), this is not done. You can
+   enable this feature with:
+
+  SET INPUT AUTODOWNLOAD ON
+
+   (and disable it again with OFF.)
+
+   One possible use for this feature is as a server mode with a time
+   limit:
+
+  INPUT 3600 secret-string-to-end-the-INPUT-command
+
+   In this example, any GET, SEND, or REMOTE commands received within one
+   hour (3600 seconds) of when the INPUT command was issued will be
+   executed. Here's another example, in which we want to stay open until
+   11:30pm, or until interrupted by seven consecutive Ctrl-C (\3)
+   characters:
+
+  INPUT 23:30:00 \3\3\3\3\3\3\3
+
+   The INPUT AUTODOWNLOAD setting is displayed by SHOW SCRIPTS or SHOW
+   INPUT.
+
+  7.8. Built-in Help for Functions.
+
+   Beginning in C-Kermit 7.0, you may obtain a description of the calling
+   conventions and return values of any built-in function, such as
+   \fsubstring(), with the new HELP FUNCTION command; give the function's
+   name without the leading "\f", e.g. "help func substring". You can use
+   ?, completion, and abbreviation in the normal manner.
+
+  7.9. Variable Assignments
+
+    7.9.1. Assignment Operators
+
+   Programmers accustomed to languages such as C or Fortran might find
+   Kermit's method of assigning values to variables unnatural or awkward.
+   Beginning in C-Kermit 7.0, you can use the following alternative
+   notation:
+
+ .name = value    is equivalent to   DEFINE name value
+ .name := value   is equivalent to   ASSIGN name value
+ .name ::= value  is equivalent to   ASSIGN name \feval(value)
+
+   When the command begins with a period (.), this indicates an
+   assignment. The name can be a macro name, a \%{digit,letter} variable,
+   or an array element. There can be space(s) between "." and the name.
+   Examples:
+
+  .\%a = This is a string  ; Same as "define \%a This is a string"
+  echo \%a
+  This is a string
+
+  .xxx = \%a               ; Same as "define xxx \%a"
+  echo \m(xxx)
+  \%a
+
+  .xxx := \%a              ; Same as "assign xxx \%a"
+  echo \m(xxx)
+  This is a string
+
+  declare \&a[2]           ; Use with arrays...
+  define \%i 2
+  .\&a[1] = first
+  .\&a[\%i] = second
+
+   The following sequence illustrates the differences among three levels
+   of evaluation:
+
+  .\%x = 2          ; Define a variable to have a numeric value
+  .\%y = (3 + \%x)  ; Define another variable as an arithmetic expression
+
+  .xxx = 4 * \%y    ; "=" simply copies the right-hand side.
+  echo \m(xxx)
+  4 * \%y
+
+  .xxx := 4 * \%y   ; ":=" evaluates the variables first, then copies.
+  echo \m(xxx)
+  4 * (3 + 2)
+
+  .xxx ::= 4 * \%y  ; "::=" evaluates the expression, then copies.
+  echo \m(xxx)
+  20
+
+   You can also use this syntax to clear (undefine) a variable:
+
+  .\%a = oofa       ; Define the variable
+  echo "\%a"
+  "oofa"
+  .\%a              ; Clear the variable
+  echo "\%a"
+  ""
+
+   Extra credit: Can you guess what happens below when the file "abc" does
+   not exist?
+
+  fopen /read \%c abc
+  if fail ...
+
+    7.9.2. New Assignment Commands
+
+   Recall the DEFINE and ASSIGN commands, and their hidden counterparts,
+   _DEFINE and _ASSIGN. The former take the variable name literally, the
+   latter evaluate the variable-name field to form the variable name
+   dynamically. Examples:
+
+  DEFINE \%x foo    ; Sets the value of the variable \%x to "foo".
+  DEFINE \%a \%x    ; Sets the value of the variable \%a to "\%x".
+  _DEFINE x_\%a \%x ; Sets the value of the variable x_foo to "\%x".
+  ASSIGN \%a \%x    ; Sets the value of the variable \%a to the "foo".
+  _ASSIGN x_\%a \%x ; Sets the value of the variable x_foo to "foo".
+
+   This concept has been carried over to the remaining variable-assignment
+   commands: EVALUATE, INCREMENT, and DECREMENT:
+
+   EVALUATE variablename expression
+          Evaluates the arithmetic expression and assigns its value to the
+          variable whose name is given. Example: "eval \%a 1+1" assigns
+          "2" to \%a.
+
+   _EVALUATE metaname expression
+          Evaluates the arithmetic expression and assigns its value to the
+          variable whose name is computed from the given metaname.
+          Example: "eval foo<\%a>::\%1 \%2 * (\%3 + \%4)" assigns the
+          value of "\%2 * (\%3 + \%4)" to the variable whose name is
+          computed from "foo<\%a>::\%1".
+
+   INCREMENT variablename [ expression ]
+          Evaluates the arithmetic expression and adds its value to the
+          value of the variable whose name is given. Example: "increment
+          \%a".
+
+   _INCREMENT metaname [ expression ]
+          Evaluates the arithmetic expression and adds its value to the
+          value of the variable whose name is computed from the given
+          metaname. Example: "_increment Words::\%1.count[\%2]".
+
+   DECREMENT variablename [ expression ]
+          Evaluates the arithmetic expression and subtracts its value from
+          the value of the variable whose name is given.
+
+   _DECREMENT metaname [ expression ]
+          Evaluates the arithmetic expression and subtracts its value from
+          the value of the variable whose name is computed from the given
+          metaname.
+
+   WARNING: The syntax of the EVALUATE command has changed since C-Kermit
+   6.0 and K95 1.1.17. Previously, it did not include a variable name,
+   only an expression. To restore the old behavior, use SET EVALUATE OLD.
+   To return to the new behavior after restoring the old behavior, use SET
+   EVALUATE NEW.
+
+   NOTE: There are no analogs to the "_" commands for the operators
+   described in [597]Section 7.9.1; those operators can not be used to
+   assign values to variables whose names must be computed.
+
+  7.10. Arrays
+
+   C-Kermit 7.0 adds lots of new array-related features, and groups them
+   together under the NEW ARRAY command:
+
+   ARRAY { CLEAR, COPY, DECLARE, DESTROY, RESIZE, SHOW, SORT }
+
+   In each of the ARRAY commands, wherever an array name is expected,
+   "short forms" may be used. For example, all of the following are
+   acceptable:
+
+  array show \&a[]  (or SHOW ARRAY...)
+  array show &a[]
+  array show a[]
+  array show &a
+  array show a
+
+   In addition, ranges are accepted in the ARRAY COPY, ARRAY CLEAR, ARRAY
+   SET, ARRAY SHOW, and ARRAY SORT commands:
+
+  array clear \&a[16]     ; Clears 16 thru end
+  array clear &a[16]      ; Ditto
+  array clear a[16]       ; Ditto
+
+  array clear \&a[16:32]  ; Clears 16 thru 32
+  array clear &a[16:32]   ; Ditto
+  array clear a[16:32]    ; Ditto
+
+   When using array names as function arguments, you must omit the "\" and
+   you must include the "&". You may optionally include empty brackets.
+   Examples:
+
+  \fsplit(\%a,a)          ; Bad
+  \fsplit(\%a,\&a)        ; Bad
+  \fsplit(\%a,&a[3])      ; Bad
+
+  \fsplit(\%a,&a)         ; Good
+  \fsplit(\%a,&a[])       ; Good
+
+    7.10.1. Array Initializers
+
+   Beginning in C-Kermit 7.0, you may initialize an array -- in whole or
+   in part -- in its declaration:
+
+   [ ARRAY ] DECLARE array-name[size] [ = ] [ value1 [ value2 [...] ] ]
+
+   For compatibility with versions 5A and 6.0, the ARRAY keyword is
+   optional. DECLARE can also be spelled DCL.
+
+   Initializers are (a) optional, (b) start with element 1, (c) must be
+   enclosed in braces if they contain spaces, and (d) are evaluated
+   according to normal rules by the DECLARE command prior to assignment.
+   Thus the assignments made here are the same as those made by the ASSIGN
+   command. This allows you to initialize array elements from the values
+   of other variables. If you actually want to initialize an array element
+   to variable's name, as opposed to its value, use double backslashes (as
+   in "\\&a", "\\v(time)", etc).
+
+   The size (dimension) of the array is optional. If the size is omitted,
+   as in "\&a[]", then the array sizes itself to the number of
+   initializers; if there are no initializers the array is not declared
+   or, if it was declared previously, it is destroyed. If a size is given,
+   any extra elements in the initialization list are discarded and
+   ignored.
+
+   NOTE: Unlike in C, the list of initializers is NOT enclosed in braces.
+   Instead, braces are used to group multiple words together. So:
+
+  ARRAY DECLARE \&a[] = { one two three }
+
+   would create an array with two elements (0 and 1), with element 1
+   having the value " one two three ".
+
+   Examples:
+
+   ARRAY DECLARE \&a[16]
+          Declares the array \&a with 17 elements (0 through 16), in which
+          all elements are initially empty. If the array \&a[] existed
+          before, the earlier copy is destroyed.
+
+   ARRAY DECLARE &a[16]
+   ARRAY DECLARE a[16]
+   ARRAY DCL \&a[16]
+   ARRAY DCL &a[16]
+   ARRAY DCL a[16]
+   DECLARE \&a[16]
+   DECLARE &a[16]
+   DECLARE a[16]
+   DCL \&a[16]
+   DCL &a[16]
+   DCL a[16]
+          All of the above are the same as the first example.
+
+   ARRAY DECLARE \&a[16] = alpha beta {gamma delta}
+          Declares the array \&a with 17 elements (0 through 16),
+          initializing \&a[1] to "alpha", \&a[2] to "beta", and \&a[3] to
+          "gamma delta". The remaining elements are empty.
+
+   ARRAY DECLARE \&a[] = alpha beta {gamma delta}
+          Same as the previous example, but the array is automatically
+          dimensioned to 3.
+
+   ARRAY DECLARE \&a[3] = alpha beta {gamma delta} epsilon zeta
+          Too many initializers; only the first three are kept.
+
+   ARRAY DECLARE \&a[0]
+   ARRAY DECLARE \&a[]
+   ARRAY DECLARE &a[]
+   ARRAY DECLARE &a
+   ARRAY DECLARE a
+   DECLARE \&[0]
+   DECLARE a
+   DCL a
+          All of these are equivalent. Each destroys \&a[] if it exists.
+          Declaring an array with a dimension of 0 is the same as ARRAY
+          DESTROY arrayname.
+
+   ARRAY DECLARE \&a[] = \%1 \%2 \%3
+          Declares the array \&a with 3 elements (0 through 3),
+          initializing \&a[1] to the value of \%1, \&a[2] to the value of
+          \%2, and \&a[3] to the value of \%3. In this case, any reference
+          to one of these array elements is replaced by the value of the
+          corresponding \%n variable at the time the declaration was
+          executed (immediate evaluation; the array element's value does
+          not change if the initializer variable's value changes).
+
+   ARRAY DECLARE \&a[] = \\%1 \\%2 \\%3
+          Declares the array \&a with 3 elements (0 through 3),
+          initializing \&a[1] to the string "\%1", \&a[2] to "\%2", and
+          \&a[3] to "\%3". In this case any reference to one of these
+          array elements is replaced by the CURRENT value of the
+          corresponding \%n variable (deferred evaluation -- the array
+          element's value follows the value of the initializer variable).
+
+   The equal sign (=) preceding the initializer list is optional, but is
+   recommended for clarity. If you need to initialize element 1 to a
+   literal equal sign, use two of them, separated by a space, as in this
+   example:
+
+  ARRAY DECLARE \&a[] = = + - * /
+
+   Remember, element 0 is not initialized by the DECLARE command. To
+   initialize element 0, use a regular DEFINE or ASSIGN command:
+
+  ARRAY DECLARE \&a[] one two three four five six seven eight nine
+  DEFINE \&a[0] zero
+
+   Finally, remember that every command level has its own local array,
+   \&_[], containing all the macro arguments (\%0, \%1, ...) for that
+   level. See [598]Section 7.5 for details.
+
+    7.10.2. Turning a String into an Array of Words
+
+   The \fsplit(s1,&a,s2,s3) function assigns the words of string s1 to
+   successive elements of the array (beginning with element 1) whose
+   identifying letter, a-z, is given after the "&" in the second argument,
+   using break and include characters given in s2 and s3. See [599]Section
+   7.3 for details.
+
+    7.10.3. Arrays of Filenames
+
+   See [600]Section 4.11.3 for news about how \ffiles() and related
+   functions can assign a list of filenames to an array. To recapitulate
+   briefly here:
+
+  \ffiles(*,&a)
+
+   assigns all files that match the first argument to the array denoted by
+   the second argument. If the array has not been declared, it is declared
+   automatically, with exactly the number of elements needed to hold the
+   file list; if it was previously declared, it is destroyed and reused.
+   The filenames are assigned starting at array element 1. Element 0 holds
+   the number of files in the list.
+
+   The DIRECTORY command ([601]Section 4.5.1) can also create filename
+   arrays if you give it the /ARRAY: switch; this allows selection
+   criteria beyond whether the filename matches the given pattern.
+
+   All functions and commands that create filename arrays store the number
+   of filenames, n, as element 0 of the array, and the filenames as
+   elements 1 through n.
+
+    7.10.4. Automatic Arrays
+
+   In a command file or macro, you can now have local (automatic) arrays.
+   Just give the name followed by empty subscript brackets (no spaces
+   inside the brackets please) in a LOCAL command, and then declare the
+   array:
+
+  LOCAL \%a \&a[] oofa
+  ARRAY DECLARE \&a[32] = value1 value2 value3 ...
+
+   This declares the scalar variable \%a, the array \&a[], and the macro
+   name "oofa" to be local, and then declares the new local copy of \&a[]
+   with 32 elements, perhaps assigning some initial values. When C-Kermit
+   exits from the command file or macro containing these command, the
+   previous \&a[] array is restored (and if there was no \&a[] at any
+   higher level, this will still be true). The process can be repeated to
+   any level. Thus it is now safe to write scripts or macros containing
+   arrays without danger of interfering with global arrays of the same
+   name.
+
+   Just as scalars are inherited by lower command levels, so are arrays.
+   So, for example, if \&a[] is declared at top level, all lower levels
+   will see it unless they include a "local \&a[]" statement, in which
+   case all levels at and beneath the level where the LOCAL statement was
+   executed will see the local copy. This too can be repeated to any
+   level.
+
+   On the other hand, if you DECLARE an array at a lower command level
+   without also making it LOCAL, this replaces the copy that was declared
+   at the lowest command level above this one.
+
+    7.10.5. Sorting Arrays
+
+   Although arrays can be sorted using FOR loops as shown on page 383 of
+   Using C-Kermit, 2nd Ed., this involves quite a bit of repetitive
+   interpretation by the command parser, and so can be slow for large
+   arrays. For this reason, C-Kermit 7.0 adds a built-in SORT command:
+
+   ARRAY SORT [ switches ] array [ array2 ]
+          Sorts the given array in place. Sorting is strictly lexical
+          (string based). The array name can be given fully, e.g. "\&a[]",
+          or the "\" and/or "&" and/or brackets can be omitted, e.g.
+          "array sort \&a[]", "sort &a", "sort a". Also, a range can be
+          indicated in the brackets as noted in [602]Section 7.10, to
+          restrict the sort to a range of elements (equivalent to the
+          /RANGE switch, described just below), e.g. "array sort
+          &a[20:30]".
+
+   A second array may be specified. If it is, and if it is at least as big
+   as the first array, it is sorted according to the first array. For a
+   sample application, see [603]Section 7.10.10.
+
+   See [604]Section 1.5 for an explanation of switches. The optional
+   switches are:
+
+   /CASE:{ON,OFF}
+          /CASE:ON means that alphabetic case is significant in
+          comparisons; uppercase letters are sorted before lowercase ones.
+          /CASE:OFF means case is ignored, e.g. "A" is the same as "a". If
+          this switch is not given, sorting is according the current SET
+          CASE setting.
+
+   /KEY:n
+          Comparison begins at position n(1-based) in each string. If no
+          key is given, the entire strings are compared. Only one key can
+          be given. If an array element is shorter than the key value, n,
+          that element is considered empty for comparison purposes, and
+          therefore lexically less than any element at least ncharacters
+          long.
+
+   /NUMERIC
+          If this switch is included, it means sorting should be numeric,
+          rather than lexical. The sort key is the string starting at the
+          key position, skipping any leading blanks or tabs, and then as
+          much of the string from that point on that fits the definition
+          of "numeric", terminating at the first character that does not
+          qualify. A numeric string has an optional sign (+ or -) followed
+          by one or more digits, and (if your version of Kermit was built
+          with floating-point support; see [605]Section 7.23 ) zero or one
+          decimal point (period). If both /CASE and /NUMERIC are given,
+          /NUMERIC takes precedence.
+
+   /RANGE:n[:m]
+          Sort elements nthrough m of the array. By default, the entire
+          array from element 1 to its dimensioned size is sorted, which
+          might produce surprising results if the array is not full; see
+          example in [606]Section 7.10.7. If ":m" is omitted from the
+          range, the dimensioned size is used. Thus, to sort an entire
+          array, \&a[], including its 0th element, use "sort /range:0 &a".
+          You can also sort any desired section of an array, e.g. "sort
+          /range:10:20 &a" or "sort /range:\%i:\%j-1 &b". As noted above,
+          you can also specify a range in the array-name brackets. If you
+          specify a range in the array-name brackets AND with a /RANGE
+          switch, the ones in the brackets take precedence.
+
+   /REVERSE
+          Sort in reverse order. If this switch is not given, the array is
+          sorted in ascending order.
+
+   Remember that numeric switch arguments can be numbers, arithmetic
+   expressions, or variables whose values are numbers or expressions, as
+   illustrated in the /RANGE examples above.
+
+   A typical sorting application might be to list students' test scores in
+   descending order. Suppose you had the following records:
+
+  olaf      65
+  olga      98
+  ivan      83
+  xena     100
+
+   (and so on) stored in array \&s[] (e.g. by reading them from a file as
+   illustrated in [607]section 7.10.7). In these records, the student's
+   name is in columns 1-9 and the score in 10-12. So to rearrange the list
+   in descending order of score:
+
+  sort /key:10 /reverse &s
+
+   Then to list your top five students:
+
+  for \%i 1 5 1 { echo \&s[\%i] }
+
+   Or more simply (see next section):
+
+  show array a[1:5]
+
+   To illustrate the difference between a lexical and a numeric sort,
+   suppose you have the following records (the lines that are numbered,
+   starting at column 1) in array \&a[]:
+
+    Column   1         2
+    12345678901234567890
+
+   1. Ivan 10.0 2. Olaf 9.95 3. Olga 101.5
+
+   ARRAY SORT /KEY:10 &a[] would order them 3,1,2, but ARRAY SORT /KEY:10
+   /NUMERIC &a[] would order them 2,1,3.
+
+    7.10.6. Displaying Arrays
+
+   The SHOW ARRAY command (or ARRAY SHOW) now accepts an optional
+   array-name argument:
+
+  SHOW ARRAY \&a[]
+
+   (you can leave off the \, the \&, and/or the []'s if you like; "show
+   array a" is equivalent to "show array \&a[]"). When an array is
+   specified, its dimension is shown and all defined (non-empty) elements
+   are listed.
+
+   Example:
+
+  assign \%n \ffiles(*,&a)  ; Fill an array with filenames ([608]Section 4.11.3)
+  show array \&a[]          ; Show the array we just read
+  array show \&a[]          ; Same as previous
+  array sort \&a[]          ; Sort the array
+  array show \&a[]          ; Show it after sorting
+  array show \&a            ; Show it again
+  array show &a             ; Show it again
+  array show a              ; Show it again
+
+   (The final four commands demonstrate the alternative forms that are
+   accepted for the array name.)
+
+   If you SHOW ARRAY without giving an array name, all defined arrays are
+   listed by name and dimension, but their contents are not shown.
+
+   You can also show a piece of an array by including a subscript or range
+   within the array brackets:
+
+  array show \&a[5]         ; Shows \&a[5]
+  array show &a[3:8]        ; Shows \&a[3] through \&a[8]
+  array show a[:\%n-1]      ; Shows \&a[0] through \&a[\%n-1]
+
+    7.10.7. Other Array Operations
+
+   ARRAY DESTROY arrayname
+          Destroys and undeclares the named array. Subscripts or ranges
+          are not accepted in this command.
+
+   ARRAY COPY array1 array2
+          Copies the first array to the second array. If the target array
+          has not been declared, it is created automatically with the same
+          size as the first. If it has been declared, it will be used as
+          declared; if the source array is larger, only as much of it as
+          will fit is copied to the target array. Syntax for array1 and
+          array2 is as in ARRAY SHOW (SHOW ARRAY). Example:
+
+  .\%n := \ffiles(*,&a)  ; Create and load array A with a file list.
+  array copy &a &b       ; Copy array A to array B.
+
+          The ARRAY COPY command also lets you copy pieces of arrays by
+          including range specifiers, as in these examples:
+
+        ARRAY COPY \&a[4:27] \&b
+                This copies \&a[] elements 4-27 to \&b[] elements 1-23,
+                creating \&b[] if necessary or, if \&b[] is already
+                declared, stopping early if its size is less than 23.
+
+        ARRAY COPY \&a[4:27] \&b[12]
+                This copies \&a[] elements 4-27 to \&b[] elements 12-35,
+                creating \&b[] if necessary or, if \&b[] is already
+                declared, stopping early if its size is less than 35.
+
+        ARRAY COPY \&a[4:27] \&b[12:14]
+                This copies \&a[] elements 4-6 to \&b[] elements 12-14,
+                creating \&b[] if necessary or, if \&b[] is already
+                declared, stopping early if its size is less than 14.
+
+        ARRAY COPY \&a[17] \&b
+                This copies all the elements of \&a[] starting with 17
+                until the last to \&b[], creating \&b[] if necessary or,
+                if \&b[] is already declared, stopping early if \&b[] is
+                not big enough.
+
+   ARRAY CLEAR arrayname
+          Sets all the elements of the array to the empty value. You may
+          also include a range specifier to clear only a selected portion
+          of the array; for example "array clear \&a[37:214]". If the
+          range is out of bounds, only the part of the array that is in
+          bounds is cleared.
+
+   ARRAY SET arrayname [ value ]
+          Sets all the elements of the array to the given value. If no
+          value is given, the array is cleared. You may also include a
+          range specifier to set only a selected portion of the array; for
+          example "array set \&a[1:9] -1". If the range is out of bounds,
+          only the part of the array that is in bounds is set.
+
+   ARRAY RESIZE arrayname size
+          Resizes the given array. If the size is greater than the array's
+          current dimension, new empty elements are added to the end. If
+          the size is less than the current dimension, the extra elements
+          are discarded. Note: If you have stored the array size in
+          element 0, ARRAY RESIZE does not change this value. Alternative
+          notation: ARRAY RESIZE arrayname[size]. For a practical example,
+          see [609]Section 7.10.11.
+
+   \farraylook(pattern,arrayname)
+          This function returns the index of the first element of the
+          given array that matches the given pattern (for details about
+          pattern syntax, see [610]section 4.9). The array name can
+          include a range specification to restrict the search to a given
+          segment of the array. If no elements match the pattern, -1 is
+          returned.
+
+   \ftablelook(keyword,arrayname[,delimiter])
+          Looks in the given "table", which must be sorted, for the given
+          keyword. The keyword need not be spelled out in full.
+          Pattern-matching characters should not be included as part of
+          the keyword. The function returns the index of the table element
+          that uniquely matches the given keyword, or -1 if none match, or
+          -2 if more than 1 match.
+
+   A "table" is an array that is sorted in lexical order; each of its
+   elements may contain multiple fields, delimited by the given delimiter
+   character or, if no delimiter is specified, a colon (:).
+
+   The \farraylook() function does exactly what you tell it. If you give
+   it a pattern that does not include wildcard characters (such as *, ?,
+   etc), it requires an exact match. For example:
+
+  \farraylook(oofa,&a)
+
+   searches for the first element of \&a[] whose value is "oofa". But:
+
+  \farraylook(oofa*,&a)
+
+   finds the first element whose value starts with "oofa", and;
+
+  \farraylook(*oofa,&a)
+
+   finds the first element whose value ends with "oofa", and;
+
+  \farraylook(*oofa*,&a)
+
+   finds the first element whose value contains "oofa".
+
+   Here's a simple demonstration of looking up patterns in arrays:
+
+  local \&a[] \%x \%n
+  declare \&a[] = zero one two three four five six seven eight nine ten
+  while true {
+      .\%x = 1
+      .\%n = 0
+      ask \%a { Pattern? }
+      if not def \%a exit 0 Done.
+      while <= \%x \fdim(&a) {
+          .\%x := \farraylook(\%a,&a[\%x])
+          if ( < \%x 0 ) break
+          echo \flpad(\%x,3). \&a[\%x]
+          increment \%x
+          increment \%n
+      }
+      if ( < \%n 1 ) echo Pattern not found - "\%a"
+  }
+
+   The array need not be sorted. When a pattern is given, a search is
+   performed; if there is a match, the matching element's index and the
+   element itself are printed, and the search begins again at the next
+   element. Thus each matching element is printed. If none match, the
+   "Pattern not found" message is printed. The process repeats for as many
+   patterns as the user wants to type, and terminates when the user types
+   an empty pattern.
+
+   Now let's build a little command parser, consisting of a keyword table,
+   and a loop to look up the user's commands in it with \ftablelook(). In
+   this case the array elements have "fields" separated by colon (:) -- a
+   keyword and a value. Keyword tables must be sorted if \tablelook() is
+   to work right, so after declaring and initializing the table array, we
+   sort it.
+
+  local \&k[] \%a \%i \%n
+
+  array declare \&k[] = drive:9 do:8 discuss:7 live:6 spend:5 help:4 quit:0
+
+  array sort &k                             ; Make sure array is sorted
+  echo Type "help" for help.                ; Print greeting & instructions
+
+  while true {                              ; Loop to get commands
+      undefine \%a
+      while not defined \%a {               ; Get a command
+          ask \%a { Command? }
+      }
+      .\%n := \ftablelook(\%a,&k)           ; Look up the command
+      switch \%n {                          ; Handle errors
+        :-1, echo Not found - "\%a"         ; Doesn't match
+             continue
+        :-2, echo Ambiguous - "\%a"         ; Matches too many
+             continue
+      }
+      switch \fword(\&k[\%n],2) {           ; Dispatch according to value
+         :9, echo Driving..., break
+         :8, echo Doing..., break
+         :7, echo Discussing..., break
+         :6, echo Living..., break
+         :5, echo Spending..., break
+         :4, echo { Commands (may be abbreviated):}
+             for \%i 1 \fdim(&k) 1 {
+                echo {  \%i. \fword(\&k[\%i],1) }
+             }
+             break
+         :0, exit 0 Bye!
+         :default, stop 1 Internal error
+      }
+  }
+
+   In this example, keywords are "drive", "do", "discuss", etc, and their
+   values are unique numbers (values need not be numbers, and there need
+   not be only one value -- there can be 0, 1, 2, or more of them). The
+   user types a command, which can be the whole word (like "help") or any
+   abbreviation (like "hel", "he", or just "h"). If this does not match
+   any keywords, \ftablelook() returns -1; if it matches more than one (as
+   would "d"), it returns -2. Otherwise the array index is returned, 1 or
+   higher.
+
+   Given the array index \%n, we can get the table values as follows:
+
+  \fword(\&k[\%n],1) is the keyword (first field)
+  \fword(\&k[\%n],2) is the value (second field, in this case a number)
+
+   In our example, we use the value (number) as the SWITCH variable. As
+   noted, \fablelook() expects the array elements to contain multiple
+   fields separated by colon (:) (or other character that you specify,
+   e.g. \ftablelook(\%a,&a,^)) and when matching the keyword, ignores the
+   first delimiter and everything after it.
+
+    7.10.8. Hints for Using Arrays
+
+   C programmers are accustomed to out-of-bounds array references causing
+   core dumps or worse. In C-Kermit:
+
+     * A reference to an an out-of-bounds array element returns the empty
+       string.
+     * An attempt to set the value of an array element that is out of
+       bounds or that has not been declared simply fails.
+
+   C programmers expect an array of size nto have elements 0 through n-1.
+   Fortran programmers expect the same array to have elements 1 through n.
+   C-Kermit accommodates both styles; when you declare an array of size n,
+   it has n=1 elements, 0 through n, and you can use the array in your
+   accustomed manner, 0-based or 1-based.
+
+   However, note that C-Kermit has certain biases towards 1-based arrays:
+
+     * Assignment of file lists starts with element 1 ([611]Section
+       7.10.3).
+     * Assignment by \fsplit() starts with element 1 ([612]Section 7.3).
+     * Array initialization skips the 0th element. To initialize a 0-based
+       array, use something like this:
+  declare \&a[3] = one two three
+  .\&a[0] = zero
+
+     * The ARRAY SORT command skips the 0th element unless you include
+       /RANGE:0
+     * The SHIFT command ignores element 0 of the \&_[] array.
+
+   The distinction between an array's dimensioned size and the number of
+   elements in the array is important when sorting. To illustrate:
+
+  declare \&a[100]                  ; Declare array &a with 100 elements
+  fopen /read \%c oofa.txt          ; Open a file
+  if fail...
+  for \%i 1 \fdim(&a) 1 {           ; Read the file into the array
+      fread \%c \&a[\%i]
+      if fail break
+  }
+  fclose \%c
+  if > \%i \fdim(&a) end 1 File has too many lines for array.
+  .\%n ::= \%i - 1
+  echo File has \%n line(s).
+
+   Let's say the file had 95 lines. This leaves elements 96-100 of the
+   array empty. Now suppose you sort the array and write out the result:
+
+  sort &a                           ; Sort the whole array
+  fopen /write \%o oofa.txt.sorted  ; Open an output file
+  if fail ...
+  for \%i 1 \%n 1 {                 ; Write out 95 records
+      fwrite /line \%o \&a[\%i]
+      if fail end 1 Write error
+  }
+  close write
+
+   You might be surprised at the contents of "oofa.txt.sorted" -- five
+   empty elements, 96-100, floated to the top of the array in the sort,
+   and since your write loop only had 95 iterations, the final 5 lines of
+   the sorted file are lost.
+
+   Therefore, when dealing with partially filled arrays -- especially when
+   sorting them -- remember to specify the number of elements. A handy way
+   of recording an array's "true" size is to put it in the 0th element.
+   That way, it "travels with the array". To illustrate (continuing the
+   previous example at the "close read" statement):
+
+  close read
+  if > \%i \fdim(&a) end 1 File has too many lines for array.
+  .\&a[0] ::= \%i - 1     ; Assign number of lines to \&a[0].
+  echo File has \&a[0] line(s).
+  sort /range:1:\&a[0] &a
+  open write oofa.txt.sorted
+  if fail ...
+  for \%i 1 \&a[0] 1 {
+      writeln file \&a[\%j]
+      if fail end 1 Write error
+  }
+  close write
+
+   Note the SORT switch, /RANGE:1:\&a[0]. This keeps the sort 1-based, and
+   uses element 0 of the array as its size indicator.
+
+   Finally, note that even though some commands or functions might put a
+   size in array element 0, no built-in functions or commands depend on a
+   size actually being there. Thus you are perfectly free to replace the
+   size with something else and treat the array as 0-based.
+
+    7.10.9. Do-It-Yourself Arrays
+
+   Kermit's \&x[] arrays are nice because of the accompanying built-in
+   functionality -- ARRAY commands, built-in functions that load and
+   search arrays, automatic evaluation of arithmetic expressions within
+   the subscript brackets, and so on. Yet they also have certain
+   limitations:
+
+    1. Except when created by dynamic loading (e.g. by \ffiles()) they
+       must be declared and dimensioned in advance.
+    2. Indices must be numeric, positive, and in range.
+    3. There can be only one dimension. Matrices or other
+       higher-dimensioned arrays are not available.
+
+   But none of this is to say you can't invent any kind of data structure
+   you like. In [613]Section 7.9.2 you can see some examples. Here's
+   another (courtesy of Dat Thuc Nguyen), in which a pair of matrices is
+   created and then added: no dimensioning necessary.
+
+  .row = 4
+  .col = 9
+
+  ; MACRO TO PRINT A MATRIX
+  define PMATRIX {
+      echo Matrix \%1:
+      for \%r 1 \m(row) 1 {
+          for \%c 1 \m(col) 1 {
+              xecho \flpad(\m(\%1[\%r][\%c]),4)
+          }
+          echo
+      }
+      echo
+  }
+  ; CREATE MATRICES A AND B
+  for \%r 1 \m(row) 1 {
+      for \%c 1 \m(col) 1 {
+          _eval A[\%r][\%c] \%r + \%c
+          _eval B[\%r][\%c] \%r * \%c
+      }
+  }
+  ; CREATE MATRIX C = SUM OF MATRIX A AND MATRIX B
+  for \%r 1 \m(row) 1 {
+      for \%c 1 \m(col) 1 {
+          _eval C[\%r][\%c] \m(A[\%r][\%c]) + \m(B[\%r][\%c])
+      }
+  }
+  pmatrix A  ; Print Matrix A
+  pmatrix B  ; Print Matrix B
+  pmatrix C  ; Print Matrix C
+
+   In the example, we use matrix-like notation to create macros with names
+   like "A[1][1]", "B[3][7]", and so on.
+
+    7.10.10. Associative Arrays
+
+   An associative array is a special kind of Do-It-Yourself array. It
+   differs from a regular array in that its indices need not be numbers --
+   they can be anything at all -- words, filenames, names of months, any
+   character string at all, and that it doesn't have to be (and in fact
+   can't be) declared. An associative array element is simply a macro
+   whose name ends with an index enclosed in angle brackets, for example:
+
+  file<oofa.txt>
+
+   More formally:
+
+  basename<index>
+
+   An associative array is a collection of all associative array elements
+   that have the same basename. Any number of associative arrays, each
+   with any number of elements, can exist at the same time.
+
+   An associative array element can be assigned a value, such as "1", just
+   like any other macro:
+
+  define file<oofa.txt> 1     ; Give "file<oofa.txt>" the value "1".
+
+   or:
+
+  assign file<oofa.txt> \%a   ; Give it the value of the variable \%a.
+
+   However, since an associative array element is a macro, it may not have
+   an empty (null) value, since assigning an empty value to a macro
+   undefines the macro.
+
+   You can refer to the value of an associative array element using the
+   familiar notation for macro values:
+
+  echo \m(file<oofa.txt>)     ; Echo the value of "file<oofa.txt>".
+
+   Associative arrays are most useful, however, when the value of the
+   index is a variable. In that case, you must use the "hidden" forms of
+   the DEFINE or ASSIGN commands that evaluate the macro name before
+   making the assignment (see [614]Using C-Kermit, page 457). Example:
+
+  define \%f oofa.txt
+  _define file<\%f> 1
+  echo file<\%f> = \m(file<\%f>)
+
+   prints:
+
+  file<oofa.txt> = 1
+
+   and then:
+
+  _increment file<\%f>
+  echo file<\%f> = \m(file<\%f>)
+
+   prints:
+
+  file<oofa.txt> = 2
+
+   What are associative arrays good for? The classic example is "word
+   counts": finding the number of times each word is used in a text
+   without knowing in advance what the words are. Without associative
+   arrays, your program would have to build a table of some kind, and
+   every time a word was encountered, look it up in the table to find its
+   position and counter, or add it to the table if it wasn't found -- a
+   time-consuming and laborious process. Associative arrays, however, let
+   you use the word itself as the table index and therefore sidestep all
+   the table building and lookups.
+
+   Let's work through a practical example. Suppose you have a
+   file-transfer log in which each line is composed of a number of
+   blank-separated fields, and the 9th field is a filename (which happens
+   to be the format of certain FTP server logs, as well as of C-Kermit's
+   new FTP-format transaction log, described in [615]Section 4.17.2), for
+   example:
+
+  Wed Jul 14 09:35:31 1999 22 xx.mit.edu 13412 /pub/ftp/mm/intro.txt ....
+
+   and you want to find out how many times each file was transferred. The
+   following code builds an associative array, file<>, containing the
+   counts for each file:
+
+  local name line max \%c \%n          ; Declare local variables
+  fopen /read \%c /var/log/ftpd.log    ; Open the log file ([616]Section 1.22)
+  if fail exit 1 Can't open log        ; Check
+  while true {                         ; Loop for each record
+      fread /line \%c line             ; Read a line
+      if fail break                    ; Check for end of file
+      .name := \fword(\m(line),9,{ })  ; Get 9th field = filename (Sec 7.3)
+      _increment file<\m(name)>        ; Increment its counter (Sec 7.9.2)
+  }
+  fclose \%c                           ; Close file when done.
+
+   Note that _INCREMENT (and INCREMENT, and [_]DECREMENT) treat an empty
+   (i.e. nonexistent) variable as having a value of 0, and therefore
+   creates the variable with a value of 1.
+
+   At this point, if you told Kermit to "show macro file<", it would list
+   the associative array. But since you don't necessarily know the names
+   of the files in the array, or even how many elements are in the array,
+   how can you use it in a script program?
+
+   The idea of creating macro names that include character-string indices
+   enclosed in angle brackets is perfectly arbitrary and doesn't depend on
+   any Kermit features that weren't already there -- we could just as
+   easily have used some other notation, such as "file[index]",
+   "file:index", or "file.index", and the code above would have worked
+   just as well (with the corresponding syntax adjustments). But to be
+   able to use an associative array in a program after the array is built,
+   we need a method of accessing all its elements without knowing in
+   advance what they are. That's where the chosen notation comes in.
+
+   First of all, any macro name that ends with "<xxx>" (where "xxx" is any
+   string) is case sensitive, unlike all other macro names, which are case
+   independent. To illustrate, "file<oofa.txt>" and "file<OOFA.TXT>" are
+   two distinct macros, whereas "OOFA", "Oofa", and "oofa", when used as
+   macro names, are all the same.
+
+   Second, the new \faaconvert() function converts an associative array
+   (that is, all macros with names of the form "base<index>" that have the
+   same "base" part) into a pair of regular arrays and returns the number
+   of elements:
+
+  \faaconvert(name,&a[,&b])
+
+   "name" is the name of the associative array, without the angle brackets
+   or index ("file" in our example).
+
+   The second argument is the name of a regular array in which to store
+   the indices of the associative array (filenames in our example); if an
+   array of this name already exists, it is destroyed unless the array is
+   LOCAL. The third argument is the name of another regular array in which
+   to store the values (the counts in our example), with the same rules
+   about array name collisions. If you care only about the indices and not
+   the values, you can omit the third argument to \faaconvert(). In any
+   case, the associative array is converted, not copied: its elements are
+   moved to the specified regular arrays, so after conversion the original
+   associative array is gone.
+
+   As with other array-loading functions, \faaconvert() sets element 0 of
+   each array to the number of elements in the array.
+
+   To continue our example:
+
+  .max := 0                                   ; Maximum count
+  .\%n := \faaconvert(file,&a,&b)             ; Convert
+  for \%i 1 \%n 1 {                           ; Loop through values
+      echo \flpad(\%i,3). \&a[\%i]: \&b[\%i]  ; Echo this pair
+      if ( > \&b[\%i] \m(max) ) {             ; Check for new maximum
+          .name := \&a[\%i]
+          .max  := \&b[\%i]
+      }
+  }
+  echo Most popular file: \m(name), accesses: \m(max)
+
+   This lists the files and counts and then announces which file has the
+   highest count.
+
+   Now suppose you want to sort the array pair created from an associative
+   array. In our example, \&a[] contains filenames, and \&b[] contains the
+   associated counts. Here we take advantage of the ARRAY SORT command's
+   ability to sort a second array according to the first one:
+
+  array sort /reverse /numeric &b &a          ; Descending sort by count
+
+   Now to see the top five files and their counts:
+
+  echo The top 5 files are:
+  for \%i 1 5 1 {                             ; Loop through top 5 values
+      echo \flpad(\%i,3). \&a[\%i]: \&b[\%i]  ; Echo this pair
+  }
+
+    7.10.11. Transferring Array Contents to Other Computers
+
+   The SEND /ARRAY:arrayname command ([617]Section 4.7.1) allows you to
+   send the contents of any array, or any contiguous segment of it, in
+   either text or binary mode to another computer, using Kermit protocol.
+   When used in conjunction with C-Kermit's other features (the array
+   features described in this section; the file i/o package from
+   [618]Section 1.22; its decision-making, pattern-matching, and string
+   manipulation capabilities, and so on) the possibilities are endless:
+   extracts of large files, remote database queries, ..., all without
+   recourse to system-dependent mechanisms such UNIX pipes and filters,
+   thus ensuring cross-platform portability of scripts that use these
+   features.
+
+   When sending an array in text mode, Kermit appends a line terminator to
+   each array element, even empty ones, and it also converts the character
+   set from your current FILE character-set to your current TRANSFER
+   character-set, if any. No conversions are made or line terminations
+   added in binary mode. For example, the following array:
+
+  dcl \&a[] = One Two Three Four Five Six
+
+   is sent as six lines, one word per line, in text mode, and as the bare
+   unterminated string "OneTwoThreeFourFiveSix" in binary mode.
+
+   You should always include a /TEXT or /BINARY switch in any SEND /ARRAY
+   command to force the desired transfer mode, otherwise you're likely to
+   be surprised by the effects described in [619]Section 4.3.
+
+   Here are some examples:
+
+   send /text /array:\&a[]
+          Sends the entire contents of the array \&a[] in text mode. Since
+          an as-name is not included, the receiver is told the filename is
+          _array_a_.
+
+   send /text /array:&a[]
+   send /text /array:a[]
+   send /text /array:&a
+   send /text /array:a
+          These are all equivalent to the previous example.
+
+   send /text /array:&a /as-name:foo.bar
+          As above, but the array is sent under the name foo.bar.
+
+   send /text /array:&a[100:199] /as:foo.bar
+          As above, but only the elements from 100 through 199 are sent.
+
+   In text-mode transfers, character sets are translated according to your
+   current settings, just as for text files. In binary mode, of course,
+   there is no character-set translation or other conversion of any kind.
+   But remember that array elements can not contain the NUL (ASCII 0)
+   character, since they are implemented as NUL-terminated strings.
+
+   Here's an example that shows how to send all the lines (up to 1000 of
+   them) from a file animals.txt that contain the words "cat", "dog", or
+   "hog" (see [620]Section 4.9 about pattern matching):
+
+  declare \&a[1000]
+  fopen /read \%c animals.txt
+  if fail exit 1
+  .\%i = 0
+  while true {
+      fread \%c line
+      if fail break
+      if match {\m(line)} {*{cat,[dh]og}*} {
+          increment \%i
+          if ( > \%i \fdim(&a) ) break
+          .\&a[\%i] := \m(line)
+      }
+  }
+  fclose \%c
+  send /array:a[1:\%i] /text
+
+   Note that we are careful to send only the part of the array that was
+   filled, not the entire array, because there are likely to be lots of
+   unused elements at the end, and these would be sent as blank lines
+   otherwise.
+
+   This example raises an interesting question: what if we want to send
+   ALL the matching lines, even if there are more than 1000 of them, but
+   we don't know the number in advance? Clearly the problem is limited by
+   Kermit's (and the computer's) memory. If there are a thousand trillion
+   matching lines, they most likely will not fit in memory, and in this
+   case the only solution is to write them first to a temporary file on
+   mass storage and then send the temporary file and delete it afterwards.
+
+   However, when the selection is likely to fit in memory, the
+   once-familiar technique of initial allocation with extents can be used:
+
+  if match {\m(line)} {*{cat,[dh]og}*} {
+      increment \%i
+      if ( > \%i \fdim(&a) ) {
+          array resize a \fdim(&a)+100
+          if fail stop 1 MEMORY FULL
+          echo NEW DIMENSION: \fdim(&a)
+      }
+      .\&a[\%i] := \m(line)
+  }
+
+   This grows the array in chunks of 100 as needed.
+
+  7.11. OUTPUT Command Improvements
+
+   LINEOUT [ text ]
+          This command is exactly like OUTPUT, except it supplies a
+          carriage return at the end of the text. "lineout exit" is
+          exactly the same as "output exit\13".
+
+   SET OUTPUT SPECIAL-ESCAPES { ON, OFF }
+          This command lets you tell C-Kermit whether to process \N, \L,
+          and \B specially in an OUTPUT command, as distinct from other \
+          sequences (such as \%a, \13, \v(time), etc). Normally the
+          special escapes are handled. Use SET OUTPUT SPECIAL-ESCAPES OFF
+          to disable them.
+
+   Disabling special escapes is necessary in situations when you need to
+   transmit lines of data and you have no control over what is in the
+   lines. For example, a file oofa.txt that contains:
+
+  This is a file
+  It has \%a variables in it
+  And it has \B in it.
+  And it has \L in it.
+  And it has \N in it.
+  And this is the last line.
+
+   can be sent like this:
+
+  local line
+  set output special-escapes off
+  fopen /read \%c oofa.txt
+  if fail stop 1 Can't open oofa.txt
+  while success {
+      fread \%c line
+      if fail break
+      ; Add filtering or processing commands here...
+      output \m(line)\13
+  }
+
+  7.12. Function and Variable Diagnostics
+
+   In C-Kermit 6.0 and earlier, the only diagnostic returned by a failing
+   function call was an empty value, which (a) could not be distinguished
+   from an empty value returned by a successful function call; (b) did not
+   give any indication of the cause of failure; and (c) did not cause the
+   enclosing statement to fail. C-Kermit 7.0 corrects these deficiencies.
+
+   SET FUNCTION DIAGNOSTICS { ON, OFF }
+          when ON, allows built-in functions to return diagnostic messages
+          when improperly referenced, instead of an empty string. FUNCTION
+          DIAGNOSTICS are ON by default. When OFF, improperly referenced
+          functions continue to return an empty string. This command also
+          affects built-in variables; in this case, an error message is
+          returned only if the variable does not exist. When FUNCTION
+          DIAGNOSTICS are ON, the error message is also printed.
+
+   For variables, the only message is:
+
+  <ERROR:NO_SUCH_VARIABLE:\v(name)>
+
+   where "name" is the name of the nonexistent variable.
+
+   For functions, the diagnostic message is:
+
+  <ERROR:message:\fname()>
+
+   where "message" is replaced by a message, and "name" is replaced by the
+   function name, e.g. <ERROR:ARG_NOT_NUMERIC:\fmod()>. Messages include:
+
+  ARG_BAD_ARRAY       An argument contains a malformed array reference.
+  ARG_BAD_DATE        An argument contains a malformed date and/or time.
+  ARG_BAD_PHONENUM    An argument contains a malformed telephone number.
+  ARG_BAD_VARIABLE    An argument contains a malformed \%x variable.
+  ARG_INCOMPLETE      An argument is incomplete (e.g. a broken Base64 string).
+  ARG_EVAL_FAILURE    An argument could not be evaluated (internal error).
+  ARG_NOT_ARRAY       An argument references an array that is not declared.
+  ARG_NOT_NUMERIC     An argument that must be integer contains non-digits.
+  ARG_NOT_FLOAT       An argument has bad floating-point number format.
+  ARG_NOT_VARIABLE    An argument that must be a variable is not a variable.
+  ARG_OUT_OF_RANGE    An argument's numeric value is too big or too small,
+                      or an argument contains illegal characters (e.g. a hex
+                      or Base-64 string).
+  ARG_TOO_LONG        An argument's value is too long.
+  ARRAY_FAILURE       Failure to create an array.
+  DIVIDE_BY_ZERO      Execution of the function would cause division by zero.
+  FLOATING_POINT_OP   Execution error in a floating-point operation.
+  FILE_NOT_FOUND      Filename argument names a file that can't be found.
+  FILE_NOT_READABLE   Filename argument is not a regular file.
+  FILE_NOT_ACCESSIBLE Filename argument names a file that is read-protected.
+  FILE_ERROR          Other error with filename argument.
+  FILE_NOT_OPEN       A file function was given a channel that is not open.
+  FILE_ERROR_-n       A file function got error -n ([621]Section 1.22).
+  LOOKUP_FAILURE      Error looking up function (shouldn't happen).
+  MALLOC_FAILURE      Failure to allocate needed memory (shouldn't happen).
+  NAME_AMBIGUOUS      The function is not uniquely identified.
+  MISSING_ARG         A required argument is missing.
+  NO_SUCH_FUNCTION    An argument references a function that is not defined.
+  NO_SUCH_MACRO       An argument references a macro that is not defined.
+  RESULT_TOO_LONG     The result of a function is too long.
+  UNKNOWN_FUNCTION    Internal error locating function (shouldn't happen).
+
+   Examples:
+
+  assign \%m \fmod()
+  ?<ERROR:MISSING_ARG:\fmod()>
+  echo "\fcontents(\%m)"
+  "<ERROR:MISSING_ARG:\fmod()>"
+  echo \fmod(3,x)
+  ?<ERROR:ARG_NOT_NUMERIC:\fmod()>
+  echo \fmod(3,4-2*2)
+  ?<ERROR:DIVIDE_BY_ZERO:\fmod()>
+
+   Notice the use of \fcontents() in echoing the value of a variable that
+   contains a returned error message. That's because the error message
+   includes the name of the variable or function that failed, so you must
+   use \fcontents() to prevent it from being evaluated again -- otherwise
+   the same error will occur.
+
+   The handling of function and variable errors is controlled by:
+
+   SET FUNCTION ERROR { ON, OFF }
+          Tells whether invalid function calls or variable references
+          should cause command errors. FUNCTION ERROR is ON by default.
+          When ON, and an error is diagnosed in a built-in function or
+          variable, the command that includes the function call or
+          variable reference fails. The failing command can be handled in
+          the normal way with IF FAILURE / IF SUCCESS, SET TAKE ERROR, or
+          SET MACRO ERROR.
+
+   When FUNCTION DIAGNOSTICS is OFF, there is no error message.
+
+   SHOW SCRIPTS displays the current FUNCTION DIAGNOSTICS and ERROR
+   settings.
+
+  7.13. Return Value of Macros
+
+   In C-Kermit 5A and 6.0, there are two ways to return one level from a
+   macro: RETURN value and END number text. When RETURN is used, the
+   value, which can be a number or a text string, is assigned to
+   \v(return). When END was used, however, \v(return) was not set.
+   SUCCESS/FAILURE was set according to whether the number was zero, and
+   the text was printed, but the actual value of the number was lost.
+
+   In C-Kermit 7.0, the END number is available in the \v(return)
+   variable.
+
+  7.14. The ASSERT, FAIL, and SUCCEED Commands.
+
+   The ASSERT command is just like the IF command, but without a command
+   to execute. It simply succeeds or fails, and this can be tested by a
+   subsequent IF SUCCESS or IF FAILURE command. Example:
+
+  ASSERT = 1 1
+  IF SUCCESS echo 1 = 1.
+
+   The FAIL command does nothing, but always fails. The SUCCEED command
+   does nothing, but always succeeds.
+
+   These commands are handy in debugging scripts when you want to induce a
+   failure (or success) that normally would not occur, e.g. for testing
+   blocks of code that normally are not executed.
+
+  7.15. Using Alarms
+
+   Alarms may be set in two ways:
+
+   SET ALARM number
+          Sets an alarm for the given number of seconds "from now", i.e.
+          in the future, relative to when the SET ALARM command was given.
+          Examples:
+
+  set alarm 60        ; 60 seconds from now
+  set alarm +60       ; The same as "60"
+  set alarm -60       ; Not legal - you can't set an alarm in the past.
+  set alarm 60*60     ; 60 minutes from now.
+  set alarm \%a+10    ; You can use variables, etc.
+
+   SET ALARM hh:mm:ss
+          Sets an alarm for the specified time. If the given time is
+          earlier than the current time, the alarm is set for the given
+          time in the next day. You may give the time in various formats:
+
+  set alarm 15:00:00  ; 3:00:00pm
+  set alarm 3:00:00pm ; 3:00:00pm
+  set alarm 3:00pm    ; 3:00:00pm
+  set alarm 3pm       ; 3:00:00pm
+
+   SHOW ALARM
+          Displays the current alarm, if any, in standard date-time format
+          (see [622]Section 1.6): yyyymmdd hh:mm:ss.
+
+   IF ALARM command
+          Executes the command if an alarm has been set and the alarm time
+          has passed.
+
+   IF ALARM { command-list } [ ELSE { command-list } ]
+          Executes the command-list if an alarm has been set and the alarm
+          time has passed. Otherwise, if an ELSE part is given, its
+          command-list is executed.
+
+   CLEAR ALARM
+          Clears the alarm.
+
+   Only one alarm may be set at a time.
+
+   Example: Suppose you have a script that is always running, and that
+   transfers files periodically, and that keeps a transaction log. Suppose
+   you want to start a new transaction log each day:
+
+  log transactions \v(date).log
+  set alarm 00:00:00                     ; Set an alarm for midnight
+  while true {                           ; Main script loop
+      xif alarm {                        ; If the alarm time is past...
+          close transactions             ; Close current log
+          log transactions \v(date).log  ; Start new one
+          pause 1                        ; To make sure 00:00:00 is past
+          set alarm 00:00:00             ; Set a new alarm
+      }
+      ; put the rest of the script here...
+  }
+
+   Note that IF ALARM -- no matter whether it succeeds or fails -- does
+   NOT clear an expired alarm. Thus, once an alarm has expired, every IF
+   ALARM will succeed until the alarm is cleared (with the CLEAR ALARM
+   command) or reset with a new SET ALARM command.
+
+  7.16. Passing Arguments to Command Files
+
+   Beginning in version 7.0, C-Kermit accepts arguments on the TAKE
+   command line, for example:
+
+  C-Kermit> take oofa.ksc one two {this is three} four
+
+   This automatically sets the variables \%1 through \%9 to the arguments,
+   and \%0 to the name of the file, in this case:
+
+  \%0 = /usr/olga/oofa.ksc
+  \%1 = one
+  \%2 = two
+  \%3 = this is three
+  \%4 = four
+
+   and \%5..\%9 are undefined (empty). Arguments past the ninth are
+   available in the \&_[] argument-vector array ( [623]Section 7.5).
+
+   The variables are those at the current macro level. Thus, if the TAKE
+   command is executed from within a macro, the macro's arguments are
+   replaced by those given on the TAKE command line (but only if at least
+   one argument is given). The command shown above is exactly equivalent
+   to:
+
+  assign \%0 /usr/olga/oofa.ksc
+  assign \%1 one
+  assign \%2 two
+  assign \%3 this is three
+  assign \%4 four
+  assign \%5
+  assign \%6
+  assign \%7
+  assign \%8
+  assign \%9
+  take oofa.ksc
+
+   Remember, the variables \%0..\%9 are on the macro call stack, and
+   command files are independent of the macro stack. Thus, if a command
+   file TAKEs another command file and passes arguments to it, the
+   variables are changed from that point on for both files, and so forth
+   for all levels of nested command files without intervening macro
+   invocations.
+
+   It would have been possible to change C-Kermit to use the overall
+   command stack, rather than the macro stack, for arguments -- this would
+   have made TAKE work exactly like DO, which is "nicer", but it would
+   also have broken countless existing scripts. However, the new SHIFT
+   command ([624]Section 7.5) makes it possible to create an alternative
+   TAKE command that does indeed save and restore the argument variables
+   at its own level around execution of a command file:
+
+  define mtake {
+     local \%f
+     assign \%f \fcontents(\%1)
+     shift
+     take \%f
+  }
+
+   C-Kermit 7.0 also supports a new, easier way to pass arguments to
+   scripts from the system command line:
+
+  kermit filename arg1 arg2 arg3 ...
+
+   in which arg1, arg2, arg3 (etc) are arguments for the script (whose
+   filename is given), and are assigned to \%1, \%2, ... \%9. The filename
+   is assigned to \%0. This applies equally to "Kerbang" scripts in UNIX
+   ([625]Section 7.19). For example, suppose you have a file called
+   "showargs" containing the following lines:
+
+  #!/usr/local/bin/kermit +
+  echo Hello from \%0
+  show args
+  exit
+
+   (except not indented, since the "#!" line must be on the left margin).
+   If you give this file execute permission:
+
+  chmod +x showargs
+
+   then you can run it exactly as you would run a UNIX shell script, e.g.:
+
+  $ showargs one two three
+  Hello from /usr/olga/showargs
+  Top-level arguments (\v(argc) = 4):
+   \&_[0] = /usr/olga/showargs
+   \&_[1] = one
+   \&_[2] = two
+   \&_[3] = three
+
+   Furthermore, the \&_[] array now contains the filename, if one was
+   given as the first command line argument, or it is a "Kerbang" script,
+   in element 0.
+
+   Otherwise element 0 is program name, and elements 1 through \v(argc)-1
+   contain the command-line arguments, if any, that appear after "--" or
+   "=", if any. This array is saved and restored around macro calls;
+   recall that inside macros it contains the macro argument vector
+   (allowing you to access arguments programmatically, and to have more
+   than 9 of them).
+
+   At top level, notice the difference between the \&@[] and \&_[] arrays.
+   The former includes C-Kermit options; the latter omits them.
+
+  7.17. Dialogs with Timed Responses
+
+   The ASK, ASKQ, GETOK, and GETC commands (let's call them the "ASK-class
+   commands") let you write scripts that carry on dialogs with the user,
+   asking them for text, a Yes/No answer, or a character, respectively.
+   Prior to C-Kermit 7.0, these questions would always wait forever for an
+   answer. In C-Kermit 7.0, you may specify a time limit for them with the
+   new command:
+
+   SET ASK-TIMER number
+          Sets a time-limit on ASK-CLASS commands to the given number of
+          seconds. If the number is 0 or less, there is no time limit and
+          these commands wait forever for a response. Any timer that is
+          established by this command remains in effect for all future
+          ASK-class commands until another SET ASK-TIMER command is given
+          (e.g. with a value of 0 to disable ASK timeouts).
+
+   IF ASKTIMEOUT command
+          An ASK-class command that times out returns a failure status.
+          You can test explicitly for a timeout with:
+
+  7.18. Increased Flexibility of SWITCH Case Labels
+
+   Prior to C-Kermit 7.0 / K95 1.1.19, the case labels in SWITCH
+   statements were string constants.
+
+   Now case labels can be variables, function calls, or any mixture of
+   these with each other and/or with regular characters.
+
+   Furthermore, after the case label is evaluated, it is treated not as a
+   string constant, but as a pattern against which the SWITCH variable is
+   matched ([626]Section 4.9.1).
+
+   This introduces a possible incompatibility with previous releases,
+   since the following characters in case labels are no longer taken
+   literally:
+
+  \ * ? [ {
+
+   Any scripts that previously included any of these characters in case
+   labels must now quote them with backslash (\).
+
+  7.19. "Kerbang" Scripts
+
+   In UNIX only, Kermit scripts can be stored in files and run "directly",
+   without starting Kermit first (as noted on page 467 of the manual),
+   just as a shell script can be "run" as if it were a program. This
+   section amplifies on that idea a bit, and presents some new aspects of
+   version 7.0 that make it easier to write and run Kermit scripts
+   directly.
+
+     NOTE: On non-UNIX platforms, such as VMS or Windows, Kerbang scripts
+     can be run as "kermit + scriptfilename arg1 arg2 arg3 ...". Windows
+     95/98/NT file associations do not allow for the passing of
+     parameters. In VMS, however, you can achieve the Kerbang effect by
+     defining a symbol, as in this example:
+
+  $ autotelnet :== "$SYS$TOOLS:KERMIT.EXE + AUTOTELNET.KSC"
+
+     and then running the script like any other command:
+
+  $ autotelnet xyzcorp.com myuserid
+
+     See [627]Section 9.3 for an explanation of the "+" symbol.
+
+   UNIX shell scripts can specify which shell should run them by including
+   a "shebang" line at the top, e.g.:
+
+  #!/bin/sh
+
+   (but not indented; the shebang line must be on the left margin). The
+   term "shebang" is a contraction of "shell" and "bang". "Bang" is a
+   slang word for the exclamation mark ("!"); "shebang" itself is an
+   American slang word used in in the phrase "the whole shebang".
+
+   We can run Kermit scripts directly too, by including a "shebang" line
+   that names Kermit as the "shell"; thus we call these "Kerbang" scripts.
+   This mechanism has been considerably simplified in C-Kermit 7.0 to
+   facilitate C-Kermit's use a scripting tool just like any of the UNIX
+   shells or scripting languages. The rules are the same as for shell
+   scripts:
+
+    1. The first line of the Kermit script must begin with "#!"
+       immediately followed by the full pathname of the program that will
+       execute the script (in this case, C-Kermit rather than a UNIX
+       shell), followed by any Kermit command-line options. To suppress
+       execution of the C-Kermit initialization file and to make command
+       line arguments available to the script, the final option should be
+       "+":
+  #!/usr/local/bin/kermit +
+
+       Some users have reported that in some circumstances a space might
+       be necessary after the plus sign; this depends on your shell -- it
+       has nothing to do with Kermit. In most cases, no space is needed.
+    2. The file must have execute permission (granted via "chmod +x
+       filename").
+
+   When C-Kermit is invoked from a Kerbang script (or from the system
+   prompt with a "+" command-line argument, which amounts to the same
+   thing), the following special rules apply:
+
+    1. The C-Kermit initialization file is NOT executed automatically. If
+       you want it to be executed, include a TAKE command for it in the
+       script, e.g. "take \v(home).kermrc". (In previous releases, the
+       initialization file was always executed, with no way to prevent it
+       except for the user to include Kermit-specific command line options
+       which had nothing to do with the script). Many scripts have no need
+       for the standard Kermit initialization file, which is quite lengthy
+       and not only delays startup of the script, but also spews forth
+       numerous messages that are most likely unrelated to the script.
+    2. If the initialization file is not executed, neither is your
+       customization file, since the initialization file is the command
+       file from which the customization file is TAKEn. Again, you can
+       include a TAKE command for the initialization file if desired, or
+       for the customization file by itself, or for any other file.
+    3. C-Kermit does not process command-line arguments at all. Instead,
+       it passes all words on the command line after the "+" to the script
+       as \%0 (the script name), \%1..\%9 (the first nine arguments), as
+       well as in the argument vector array \&_[]. The variable \v(argc)
+       is set to the total number of "words" (as passed by the shell to
+       Kermit) including the script name. Quoting and grouping rules are
+       those of the shell.
+    4. At any point where the script terminates, it must include an EXIT
+       command if you want it to exit back to the shell; otherwise
+       C-Kermit enters interactive prompting mode when the script
+       terminates. The EXIT command can include a numeric status to be
+       returned to the shell (0, 1, etc), plus an optional message.
+
+   Here is a simple Kerbang script that prints its arguments:
+
+  #/usr/local/bin/kermit +
+  echo Hello from \%0
+  for \%i 0 \v(argc)-1 1 {
+      echo \%i. "\&_[\%i]"
+  }
+  exit 0
+
+   Save this file as (say) "showargs", then give it execute permission and
+   run it (the \&_[] array is the same as \%0..\%9, but allows you to
+   refer to argument variables programmatically; see [628]Section 7.5).
+   (Yes, you could substitute SHOW ARGUMENTS for the loop.)
+
+  $ chmod +x showargs
+  $ ./showargs one "this is two" three
+
+   The script displays its arguments:
+
+  Hello from /usr/olga/showargs
+  0. "/usr/olga/showargs"
+  1. "one"
+  2. "this is two"
+  3. "three"
+  $
+
+   Notice that no banners or greetings are printed and that startup is
+   instantaneous, just like a shell script. Also notice that grouping of
+   arguments is determined by *shell* quoting rules, not Kermit ones,
+   since the command line is parsed by the shell before Kermit ever sees
+   it.
+
+   Of course you can put any commands at all into a Kerbang script. It can
+   read and write files, make connections, transfer files, anything that
+   Kermit can do -- because it *is* Kermit. And of course, Kerbang scripts
+   can also be executed from the Kermit prompt (or from another script)
+   with a TAKE command; the Kerbang line is ignored since it starts with
+   "#", which is a comment introducer to Kermit just as it is to the UNIX
+   shell. In VMS and other non-UNIX platforms, the Kerbang line has no
+   effect and can be omitted.
+
+   It might be desireable for a script to know whether it has been invoked
+   directly from the shell (as a Kerbang script) or by a TAKE command
+   given to the Kermit prompt or in a Kermit command file or macro. This
+   can be done as in this example:
+
+  #!/usr/local/bin/kermit +
+  assign \%m \fbasename(\%0)
+  define usage { exit 1 {usage: \%m phonenumber message} }
+  define apage { (definition of APAGE...) } ; (See [629]book pp.454-456)
+  xif equal "\%0" "\v(cmdfil)" {
+      if not def \%1 usage
+      if not def \%2 usage
+      apage {\%1} {\%2}
+      exit \v(status)
+  }
+
+   In a Kerbang script, \%0 and \v(cmdfile) are the same; both of them are
+   the name of the script. When a script is invoked by a Kermit TAKE
+   command, \%0 is the name of the Kermit program, but \v(cmdfile) is the
+   name of the script. In the example above, a macro called APAGE is
+   defined. If the script was invoked directly, the APAGE macro is also
+   executed. Otherwise, it is available for subsequent and perhaps
+   repeated use later in the Kermit session.
+
+   An especially handy use for Kerbang scripts is to have the
+   initialization file itself be one. Since the standard initialization
+   file is rather long and time-consuming to execute, it is often overkill
+   if you want to start Kermit just to transfer a file. Of course there
+   are command-line switches to suppress initialization-file execution,
+   etc, but another approach is to "run" the initialization file when you
+   want its features (notably the services directory), and run C-Kermit
+   directly when you don't. A setup like this requires that (a) the
+   C-Kermit initialization file is configured as a Kerbang script (has
+   #!/path.../kermit as first line), has execute permission, and is in
+   your PATH; and (b) that you don't have a .kermrc file in your login
+   directory.
+
+  7.20. IF and XIF Statement Syntax
+
+   The IF command has been improved in two significant ways in C-Kermit
+   7.0, described in the following subsections. All changes are backwards
+   compatible.
+
+    7.20.1. The IF/XIF Distinction
+
+   The distinction between IF and XIF is no longer important as of
+   C-Kermit 7.0. You should be able to use IF in all cases (and of course,
+   also XIF for backwards compatibility). In the past, IF was used for
+   single-command THEN parts, followed optionally by a separate ELSE
+   command:
+
+  IF condition command1    ; THEN part
+  ELSE command2            ; ELSE part
+
+   whereas XIF was required if either part had multiple commands:
+
+  XIF condition { command, command, ... } ELSE { command, command, ... }
+
+   The syntactic differences were primarily that IF / ELSE was two
+   commands on two separate lines, whereas XIF was one command on one
+   line, and that XIF allowed (and in fact required) braces around its
+   command lists, whereas IF did not allow them.
+
+   Furthermore, the chaining or nesting of parts and conditions was
+   inconsistent. For example, the IF command could be used like this:
+
+  IF condition command
+  ELSE IF condition command
+  ELSE IF condition command
+  ELSE IF condition command
+  ...
+
+   but XIF could not. C-Kermit 7.0 accepts the old syntax and executes it
+   the same as previous versions, but also accepts a new unified and more
+   convenient syntax:
+
+   IF condition command-list [ ELSE command-list ]
+
+   or:
+
+IF condition command-list
+ELSE command-list
+
+   in which the ELSE part is optional, and where command-list can be a
+   single command (with or without braces around it) or a list of commands
+   enclosed in braces. Examples:
+
+   Example 1:
+
+  IF condition { command1, command2 } ELSE { command3, command4 }
+
+   Example 2 (same as Example 1):
+
+  IF condition {
+     command1
+     command2
+  } ELSE {
+     command3
+     command4
+  }
+
+   Example 3 (same as 1 and 2):
+
+  IF condition {
+     command1
+     command2
+  }
+  ELSE { command3, command4 }
+
+   Example 4 (same as 1-3):
+
+  IF condition {
+     command1
+     command2
+  }
+  ELSE {
+     command3
+     command4
+  }
+
+   Example 5 (ELSE can be followed by another command):
+
+  IF condition1 {
+     command1
+     command2
+  } ELSE IF condition2 {
+     command3
+     command4
+  } ELSE {
+     command5
+     command6
+  }
+
+   Example 5 suggests other possibilities:
+
+  IF condition {
+     command1
+     command2
+  } ELSE FOR variable initial final increment {
+     command3
+     command4
+  }
+
+   And this too is possible, except for some non-obvious quoting
+   considerations:
+
+  dcl \&a[6] = one two three four five six
+
+  IF < \%n 3 {
+      echo \\%n is too small: \%n
+  } ELSE FOR \\%i 1 \\%n 1 {
+      echo \\%i. \\&a[\\%i]
+  }
+
+   (The loop variable must be quoted in this context to prevent premature
+   evaluation.)
+
+   Many C programmers prefer to code IF-ELSE, WHILE, FOR, and SWITCH with
+   the block-open bracket on its own line. This does not work in Kermit:
+
+  IF condition        ; THIS FORMAT DOES NOT NOT WORK
+  {
+     command1
+     command2
+  }
+  ELSE
+  {
+     command3
+     command4
+  }
+
+   Explanation: the Kermit command language is line oriented; each line is
+   a command, each command is a line. The first line above, having no hint
+   of continuation, is an incomplete command, yet syntactically correct --
+   an IF statement with an empty THEN part. Interestingly enough, since
+   the next line begins with "{" it is a block that (in [630]C-Kermit 8.0
+   and later) is a block that is executed unconditionally. Thus the
+   commands in the THEN part are executed regardless of whether the
+   condition is true -- not what you wanted!
+
+   The new block syntax used in the IF, WHILE, FOR, and SWITCH commands
+   employs certain tricks to allow multiple lines to be treated as a
+   single line:
+
+     * Any line ending with "{" (ignoring whitespace and comments) marks
+       the beginning of a block;
+     * Any line beginning with "}" (ignoring whitespace) marks the end of
+       a block;
+     * Line breaks within a block separate commands; the comma is implied
+       by the line end.
+
+   Thus:
+
+  IF condition {
+     command1
+     command2
+  } ELSE {
+     command3
+     command4
+  }
+
+   is "assembled" into:
+
+  IF condition { command1, command2 } ELSE { command3, command4 }
+
+   Note the addition of commas to separate commands within blocks. As
+   always, if you need continue a command onto additional lines, you can
+   end the continued lines with the continuation character, "-". You can
+   also do this if you want to put opening brackets on their own line:
+
+  IF condition -
+  {
+     command1
+     command2
+  }
+  ELSE -
+  {
+     command3
+     command4
+  }
+
+    7.20.2. Boolean Expressions (The IF/WHILE Condition)
+
+   Prior to C-Kermit 7.0, the IF and WHILE commands accepted only a single
+   Boolean ("true or false") assertion, e.g. "if > \%m 0 command" or "if
+   exist filename command". There was no way to form Boolean expressions
+   and, in particular, nothing that approached a Boolean OR function (AND
+   could be simulated by concatenating IF statements: "if condition1 if
+   condition2..").
+
+   C-Kermit 7.0 (and K95 1.1.19) allow grouping of Boolean assertions
+   using parentheses and combining them using AND (or &&) and OR (or ||).
+   Each of these operators -- including the parentheses -- is a field and
+   must be set off by spaces. AND has higher precedence than OR, NOT has
+   higher precedence than AND, but parentheses can be used to force any
+   desired order of evaluation. The old syntax is still accepted.
+
+   Here are some examples:
+
+  define \%z 0                          ; Define some variables
+  define \%n 1                          ; for use in the examples.
+
+  if > \%n \%z echo \%n is greater.     ; Original format - still accepted.
+  if ( > \%n \%z ) echo \%n is greater. ; Parentheses may be used in 7.0.
+  if ( > \%n \%z && not = \%z 0 ) ...   ; Two assertions combined with AND.
+  if ( > \%n \%z and not = \%z 0 ) ...  ; Same as previous ("and" = "&&").
+  if ( > \%n \%z || not = \%z 0 ) ...   ; Two assertions combined with OR.
+  if ( > \%n \%z or not = \%z 0 ) ...   ; Same as previous ("or" = "||").
+  if ( > \%n \%z || != \%z 0 ) ...      ; Ditto ("!=" = "not =").
+  while ( 1 ) { ... }                   ; Just like C.
+
+   Notice the spaces around all operators including the parentheses --
+   these are required. The following examples show how parentheses can be
+   used to alter the precedence of the AND and OR operators:
+
+  if ( false || false && false || true ) ,..         ; True
+  if ( false || ( false && false ) || true ) ...     ; Same as previous
+  if ( ( false || false ) && ( false || true ) ) ... ; False
+
+   Similarly for NOT:
+
+  if ( not true && false ) ...          ; False (NOT binds to TRUE only)
+  if ( ( not true ) && false ) ...      ; Same as previous
+  if ( not ( true && false ) ) ...      ; True (NOT binds to (TRUE && FALSE))
+
+   Notes:
+
+    1. The syntax of the Boolean expression itself has not changed; each
+       expression begins with a keyword or token such as "EXIST", ">", or
+       "=", etc; operators such as "<", "=", and ">" do not go between
+       their operands but precede them as before; this might be called
+       "reverse reverse Polish notation"; it allows deterministic
+       on-the-fly parsing of these expressions at the C-Kermit> prompt as
+       well as in scripts, and allows ?-help to be given for each item
+       when IF or WHILE commands are typed at the prompt.
+    2. Parentheses are required when there is more than one Boolean
+       assertion.
+    3. Parentheses are not required, but are allowed, when there is only
+       one Boolean assertion.
+    4. Evaluation of Boolean assertions occurs left to right, but the
+       resulting Boolean expression is evaluated afterwards according to
+       the rules of precedence. All Boolean assertions are always
+       evaluated; there is no "early stopping" property and therefore no
+       question about when or if side effects will occur -- if any Boolean
+       assertion has side effects, they will always occur.
+
+   Constructions of arbitrary complexity are possible, within reason.
+
+   Also see [631]Section 7.4 for new IF / WHILE conditions.
+
+  7.21. Screen Formatting and Cursor Control
+
+   C-Kermit 7.0 adds a simple way to create formatted screens, the SCREEN
+   command:
+
+   SCREEN { CLEAR, CLEOL, MOVE-TO row [ column ] }
+          Performs screen-formatting actions. Correct operation of these
+          commands depends on proper terminal setup on both ends of the
+          connection -- mainly that the host terminal type is set to agree
+          with the kind of terminal or the emulation you are viewing
+          C-Kermit through. The UNIX version uses terminfo or termcap (not
+          curses); the VMS version uses SMG; K-95 uses its built in screen
+          manager.
+
+   SCREEN CLEAR
+          Moves the cursor to home position and clears the entire screen.
+          Synonyms: CLEAR COMMAND-SCREEN ALL (K-95 only), CLS, CLEAR
+          SCREEN.
+
+   SCREEN CLEOL
+          Clears from the current cursor position to the end of the line.
+          Synonym: CLEAR COMMAND-SCREEN EOL (K-95 only)
+
+   SCREEN MOVE-TO row column
+          Moves the cursor to the indicated row and column. The row and
+          column numbers are 1-based, so on a 24x80 screen the home
+          position is 1 1 and the lower right corner is 24 80. If a row or
+          column number is given that too large for what Kermit or the
+          operating system thinks is your screen size, the appropriate
+          number is substituted.
+
+   These escape sequences used by these commands depends on the platform.
+   In UNIX, your TERM environment variable is used to query the
+   terminfo/termcap database; if the query fails, ANSI/VT100 sequences are
+   used. In VMS, the SMG library is used, which sends sequences based on
+   your VMS terminal type. K95 does its own screen control. On other
+   platforms (such as AOS/VS, VOS, etc), screen formatting is not
+   supported, and the SCREEN command does nothing.
+
+   The three SCREEN actions can be used in scripts to produce menus,
+   formatted screens, dynamic displays, etc. Related variables include:
+
+  \v(terminal)     The type terminal C-Kermit thinks you have.
+  \v(rows)         The number of rows C-Kermit thinks your terminal has.
+  \v(columns)      The number of columns C-Kermit thinks your terminal has.
+
+   And functions:
+
+  \fscrncurx()     The current X coordinate of the cursor (K-95 only).
+  \fscrncury()     The current Y coordinate of the cursor (K-95 only).
+  \fscrnstr(x,y,n) The string of length nat position (x,y) (K-95 only).
+
+   And commands:
+
+  ECHO string      Writes string + CRLF at the current cursor position.
+  XECHO string     Writes string at current cursor position; CRLF not supplied.
+  GETC v prompt    Issues prompt, reads one character into variable v, no echo.
+
+   And special characters:
+
+  Ctrl-L           At the C-Kermit> command prompt, or in a C-Kermit command,
+                   works like Return or Enter, but also clears the screen
+
+   Example 1: A macro that prints a message \%1 at cursor position
+   (\%2,\%3):
+
+  define MSG {
+      if not def \%3 def \%3 0             ; Default column to 0
+      if > \v(argc) 2 screen move \%2 \%3  ; Move to given row/col (if any)
+      screen cleol                         ; Clear to end of line
+      if def \%1 xecho \fcontents(\%1)     ; Print message (if any)
+  }
+
+   Example 2: A macro put the cursor on the bottom screen line, left
+   margin:
+
+  define BOT {
+      screen move \v(rows) 0
+  }
+
+   Example 3: A macro to center message \%1 on line \%2.
+
+  define CENTER {
+      if not def \%2 def \%2 1
+      .\%x ::= (\v(cols)-\flen(\%1))/2
+      msg {\%1} {\%2} {\%x}
+  }
+
+   Example 4: A simple menu (building on Examples 1-3):
+
+  def \%c 0                             ; Menu choice variable
+  screen clear                          ; Clear the screen
+  center {Welcome to This Menu} 2       ; Display the menu
+  msg {Choices:} 4
+  msg { 1. File} 6
+  msg { 2. Edit} 7
+  msg { 3. Exit} 8
+  while ( != \%c 3 ) {                  ; Read and verify choice
+      while true {                      ; Keep trying till we get a good one
+          screen move 10                ; Move to line 10
+          screen cleol                  ; Clear this line
+          getc \%c {Your choice: }      ; Prompt and get and echo 1 character
+          xecho \%c
+          if ( not numeric \%c ) { msg {Not numeric - "\%c"} 12, continue }
+          if ( >= \%c 1 && <= \%c 3 ) break
+          msg {Out of range - "\%c"} 12
+      }
+      switch \%c {                      ; Valid choice - execute it.
+        :1, msg {Filing... } 12, break
+        :2, msg {Editing...} 12, break
+        :3, msg {Exiting...} 12, break
+      }
+  }
+  echo Bye                              ; Exit chosen - say goodbye.
+  bot                                   ; Leave cursor at screen bottom.
+  exit                                  ; And exit.
+
+   Similar scripts can work over the communication connection; substitute
+   INPUT and OUTPUT for GETC and ECHO/XECHO.
+
+  7.22. Evaluating Arithmetic Expressions
+
+   A new arithmetic operator was added to the list recognized by the
+   EVALUATE command, the \feval() function, and which can also be used
+   anywhere else arithmetic expressions are accepted (numeric command
+   fields, array subscripts, etc):
+
+   Prefix "!"
+          This operator inverts the "truth value" of the number or
+          arithmetic expression that follows. If the value of the operand
+          is 0, the result is 1. If the value is nonzero, the result is 0.
+
+   Examples:
+
+  set eval old
+  evaluate 0
+  0
+
+  evaluate !0
+  1
+
+  evaluate !3
+  0
+
+  evaluate !(-3)
+  0
+
+  .\%a = 1
+  .\%b = 0
+  evaluate !(\%a|\%b)
+  0
+
+  evaluate !(\%a&\%b)
+  1
+
+  evaluate !(!(\%a&\%b))
+  0
+
+   Note the distinction between Prefix ! (invert truth value) and Suffix !
+   (factorial). Also the distinction between Prefix ! and Prefix ~ (which
+   inverts all the bits in its operand). Also note that prefix operators
+   (!, -, and ~) can not be adjacent unless you use parentheses to
+   separate them, as shown in the final example above.
+
+  7.23. Floating-Point Arithmetic
+
+   C-Kermit 7.0 adds limited support for floating-point numbers (numbers
+   that have fractional parts, like 3.141592653). This support is provided
+   through a small repertoire of functions and in Boolean expressions that
+   compare numbers, but does not apply to number parsing in general, or to
+   expression evaluation, array subscripts, the INCREMENT and DECREMENT
+   commands, or in any context other than those listed in this section.
+
+   A floating point number has an optional sign (+ or -), followed by a
+   series of decimal digits containing either zero or one period (.)
+   character, which is the decimal point. The use of comma or any other
+   character besides period as a decimal point is not supported.
+   Scientific notation is not supported either. Examples of legal
+   floating-point numbers:
+
+  0                Integers can be used
+  1                Ditto
+  2.               A decimal point without decimal digits
+  3.0              A decimal point with decimal digits
+  3.141592653      Ditto
+ -4.0              A negative sign can be included
+ +5.0              A positive sign can be included
+
+   Examples of notations that are not accepted:
+
+  1,000,000        Separators can not be used
+  1.000.000        Ditto (or multiple decimal points)
+  6.022137E23      No scientific notation
+  6.62606868e-34   Ditto
+  12.5+6.25        No "bare" expressions
+
+   You can use IF FLOAT test a string or variable to see if it's in
+   acceptable floating-point format. Example:
+
+  ask \%f { Type a number: }
+  if not def \%f .\%f = 0.0
+  if not float \%f stop 1 Invalid floating-point number: "\%f"
+
+   C-Kermit's floating-point support, like its support for whole numbers
+   (integers), relies on the capabilities of the underlying computer. Your
+   computer has only a limited amount of precision for numbers, depending
+   on its architecture. Thus floating-point numbers that have too many
+   digits will not be accurate; adding a very small number to a very large
+   one might have no effect at all; and so on. For details, read a text on
+   numerical analysis. Example:
+
+  .\%a = 11111111111111111111  ; A long number
+  .\%b = 22222222222222222222  ; Another one
+  echo \ffpadd(\%a,\%b)        ; Add them - the result should be all 3's
+  33333333333333330000.0       ; See the result
+
+   In this example, the computer has 16 digits of precision; after that,
+   the (low-order) digits are set to 0, since the computer doesn't know
+   what they really are. In fact, the computer returns random digits, but
+   Kermit sets all digits beyond the computer's precision to 0.
+
+   C-Kermit's floating-point functions have names of the form
+   "\ffpxxx(args)" ("\f" for function, "fp" for floating-point), where
+   "xxx" is replaced by the name of the function, such as "sqrt", and
+   "args" is the argument list, consisting of one or two floating-point
+   numbers (depending on the function), and an optional "d" argument that
+   says now many decimal places should be shown in the result. Example:
+
+  \ffpdiv(10,3,1) returns "3.3"
+  \ffpdiv(10,3,2) returns "3.33"
+  \ffpdiv(10,3,3) returns "3.333"
+
+   and so on, up to the precision of the computer. If the decimal-places
+   argument is less than zero, the fractional part of the result is
+   truncated:
+
+  \ffpdiv(10,3,-1) returns "3".
+
+   If the decimal-places argument is 0, or is omitted, C-Kermit returns as
+   many decimal places as are meaningful in the computer's floating-point
+   precision, truncating any extraneous trailing 0's:
+
+  \ffpdiv(10,8) returns "1.25".
+  \ffpdiv(10,4) returns "2.5".
+  \ffpdiv(10,2) returns "5.0".
+  \ffpdiv(10,3) returns "3.333333333333333" (for 16-digit precision).
+
+   There is no way to request that a floating-point function return a
+   decimal point but no decimal places. However, this is easy enough to
+   accomplish in other ways, for example by supplying it outside the
+   function call:
+
+  echo \ffpadd(\%a,\%b,-1).
+
+   Kermit's floating-point functions always round the result for the
+   requested number of decimal places when the "d" argument is given and
+   has a value greater than 0 (see the description of \ffpround() just
+   below).
+
+   Floating-point arguments can be constants in floating-point format or
+   variables whose values are floating-point numbers. If a floating-point
+   argument is omitted, or is a variable with no value, 0.0 is supplied
+   automatically. Example:
+
+  def \%x 999.999
+  undef \%y
+  echo \ffpmin(\%x,\%y)
+  0.0
+
+   Or equivalently:
+
+  echo \ffpmin(999.999)
+  0.0
+
+   The floating-point functions are:
+
+   \ffpround(f1,d)
+          Returns f1 rounded to d decimal places. For this function only,
+          d = 0 (or d omitted) has a special meaning: return the integer
+          part of f1 rounded according to the fractional part. Examples:
+
+  \ffpround(2.74653,-1) returns "2" (fraction truncated, no rounding).
+  \ffpround(2.74653,0)  returns "3" (integer part is rounded).
+  \ffpround(2.74653)    returns "3" (d omitted same as d = 0).
+  \ffpround(2.74653,1)  returns "2.7".
+  \ffpround(2.74653,2)  returns "2.75".
+  \ffpround(2.74653,3)  returns "2.747".
+  \ffpround(2.74653,4)  returns "2.7465", etc.
+
+   \ffpadd(f1,f2,d)
+          Returns the sum of f1 and f2.
+
+   \ffpsubtract(f1,f2,d)
+          Subtracts f2 from f1 and returns the result.
+
+   \ffpmultiply(f1,f2,d)
+          Returns the product of f1 and f2.
+
+   \ffpdivide(f1,f2,d)
+          If f2 is not 0, divides f1 by f2 and returns the quotient.
+          If f2 is 0, a DIVIDE_BY_ZERO error occurs.
+
+   \ffpraise(f1,f2,d)
+          If f1 = 0 and f2 <= 0, or if f1 < 0 and f2 has a fractional
+          part, an ARG_OUT_OF_RANGE error occurs; otherwise f1 raised to
+          the f2 power is returned.
+
+   \ffpsqrt(f1,d)
+          If f1 >= 0, returns the square root of f1; otherwise
+          ARG_OUT_OF_RANGE.
+
+   \ffpabsolute(f1,d)
+          Returns the absolute value of f1 (i.e. f1 without a sign). This
+          is the floating-point analog of \fabsolute(n1).
+
+   \ffpint(f1)
+          Returns the integer part of f1. Equivalent to \ffpround(f1,-1).
+
+   \ffpexp(f1,d)
+          The base of natural logarithms, e (2.718282...), raised to the
+          f1 power.
+
+   \ffplogn(f1,d)
+          The natural logarithm of f1 (the power to which e must be raised
+          to obtain f1).
+
+   \ffplog10(f1,d)
+          The base-10 logarithm of f1 (the power to which 10 must be
+          raised to obtain f1).
+
+   \ffpmodulus(f1,f2,d)
+          If f2 is not 0, the remainder after dividing f1 by f2.
+          If f2 is 0, a DIVIDE_BY_ZERO error occurs.
+          This is the floating-point analog of \fmod(n1,n2).
+
+   \ffpmaximum(f1,f2,d)
+          Returns the maximum of f1 and f2. This is the floating-point
+          analog of \fmax(n1,n2).
+
+   \ffpminimum(f1,f2,d)
+          Returns the minimum of f1 and f2. This is the floating-point
+          analog of \fmin(n1,n2).
+
+   \ffpsine(f1,d)
+          Returns the sine of f1 radians.
+
+   \ffpcosine(f1,d)
+          Returns the cosine of f1 radians.
+
+   \ffptangent(f1,d)
+          Returns the tangent of f1 radians.
+
+   Note that all of these functions can be used with integer arguments. If
+   you want an integer result, specify d = -1 (to truncate) or feed the
+   result to \ffpround(xxx,0) (to round).
+
+   Floating-point numbers (or variables or functions that return them) can
+   be used in Boolean expressions (see [632]Section 7.20.2) that compare
+   numbers:
+
+  = x y
+  != x y
+  < x y
+  > x y
+  <= x y
+  >= x y
+
+   In these examples, x and y can be either integers or floating-point
+   numbers in any combination. In an arithmetic comparison of an integer
+   and a floating-point number, the integer is converted to floating-point
+   before the comparison is made. Examples:
+
+  .\%t = 3.000000000
+  .\%f = 3.141592653
+  .\%i = 3
+
+  if > \%f \%i echo Pi is greater.
+  if = \%t \%i echo "\%i" = "\%t".
+
+   A floating-point number can also be used in:
+
+  IF number command
+
+   where the command is executed if the number is nonzero. If the number
+   is floating-point, the command is not executed if the number is 0.0,
+   and is executed otherwise.
+
+   Floating-point numbers can be sorted using ARRAY SORT /NUMERIC (see
+   [633]Section 7.10.5 ).
+
+   Two floating-point constants are provided:
+
+  \v(math_pi) = Pi (3.141592653...)
+  \v(math_e)  = e, the base of natural logarithms (2.71828...)
+
+   These are given to the computer's precision, e.g. 16 digits. This
+   number itself is available in a variable:
+
+   \v(math_precision)
+          How many significant digits in a floating-point number.
+
+  7.24. Tracing Script Execution
+
+   The TRACE command is handy for debugging scripts.
+
+   TRACE [ { /ON, /OFF } ] [ { ASSIGNMENTS, COMMAND-LEVEL, ALL } ]
+          Selects tracing of the given object.
+
+   Optional switches are /ON and /OFF. If no switch is given, /ON is
+   implied. The trace objects are ASSIGNMENTS, COMMAND-LEVEL, and ALL. The
+   default object is ALL, meaning to select all trace objects (besides
+   ALL). Thus TRACE by itself selects tracing of everything, as does TRACE
+   /ON, and TRACE /OFF turns off all tracing.
+
+   When tracing of ASSIGNMENTS is on, every time the value of any
+   user-defined variable or macro changes, C-Kermit prints one of the
+   following:
+
+   >>> name: "value"
+          The name of the variable or macro followed by the new value in
+          quotes. This includes implicit macro-parameter assignments
+          during macro invocation.
+
+   >>> name: (undef)
+          This indicates that the variable or macro has been undefined.
+
+   <<< name: "value"
+          For RETURN statements: the name of the macro and the return
+          value.
+
+   <<< name: (null)
+          For RETURN statements that include no value or an empty value.
+
+   When tracing of COMMAND-LEVEL is on, C-Kermit prints:
+
+   [n] +F: "name"
+          Whenever a command file is entered, where "n" is the command
+          level (0 = top); the name of the command file is shown in
+          quotes.
+
+   [n] +M: "name"
+          Whenever a macro is entered; "n" is the command level. The name
+          of the macro is shown in quotes.
+
+   [n] -F: "name"
+          Whenever a command file is reentered from below, when a macro or
+          command file that it has invoked has returned.
+
+   [n] -M: "name"
+          Whenever a macro is reentered from below.
+
+   For other debugging tools, see SHOW ARGS, SHOW STACK, SET TAKE, SET
+   MACRO, and of course, ECHO.
+
+  7.25. Compact Substring Notation
+
+   It is often desirable to extract a substring from a string which is
+   stored in a variable, and for this we have the \fsubstring() function,
+   which is used like this:
+
+  define \%a 1234567890
+  echo \fsubstring(\%a,3,4) ; substring from 3rd character length 4
+  3456
+
+   or like this with macro-named variables:
+
+  define string 1234567890
+  echo \fsubstring(\m(string),3,4)
+  3456
+
+   C-Kermit 7.0 adds a pair of alternative compact notations:
+
+\:(variablename[start:length])  <-- Substring of variable's value
+\s(macroname[start:length])     <-- Substring of macro's definition
+
+   These are exactly equivalent to using \fsubstring(), except more
+   compact to write and also faster since evaluation is in one step
+   instead of two.
+
+   The "\:()" notation can be used with any Kermit variable, that is,
+   almost anything that starts with a backslash:
+
+  \:(\%a[2:6])      <-- equivalent to \fsubstring(\%a,2,6)
+  \:(\&x[1][2:6])   <-- equivalent to \fsubstring(\&x[1],2,6)
+  \:(\m(foo)[2:6])  <-- equivalent to \fsubstring(\m(foo),2,6)
+  \:(\v(time)[2:6]) <-- equivalent to \fsubstring(\v(time),2,6)
+  \:(\$(TERM)[2:6]) <-- equivalent to \fsubstring(\$(TERM),2,6)
+  \:(ABCDEFGH[2:6]) <-- equivalent to \fsubstring(ABCDEFGH,2,6)
+
+   Whatever appears between the left parenthesis and the left bracket is
+   evaluated and then the indicated substring of the result is returned.
+
+   The "\s()" notation is the same, except after evaluating the variable,
+   the result is treated as a macro name and is looked up in the macro
+   table. Then the indicated substring of the macro definition is
+   returned. Example:
+
+  define testing abcdefghijklmnopqrstuvwxyz
+  define \%a testing
+
+  \s(testing[2:6])  -->  bcdefg
+  \:(testing[2:6])  -->  esting
+  \:(\%a[2:6])      -->  esting
+  \s(\%a[2:6])      -->  bcdefg
+
+   Note that the following two examples are equivalent:
+
+  \:(\m(foo)[2:6])
+  \s(foo[2:6])
+
+   The first number in the brackets is the 1-based starting position. If
+   it is omitted, or less than 1, it is treated as 1. If it is greater
+   than the length of the string, an empty string is returned.
+
+   The second number is the length of the desired substring. If the second
+   number is omitted, is less than 0, or would be past the end of the
+   string, then "through the end of the string" is assumed. If it is 0,
+   the empty string is returned.
+
+   If the brackets are empty or omitted, the original string is returned.
+
+   The starting position and length need not be literal numbers; they can
+   also be variables, functions, arithmetic expressions, or even other
+   \s() or \:() quantities; anything that evaluates to a number, for
+   example:
+
+  \s(block[1025:\fhex2n(\s(block[\%b:\%n+4]))/2])
+
+   Syntactically, \m(name) and \s(name) differ only in that the sequence
+   [*] at the end of the name (where * is any sequence of 0 or more
+   characters) is treated as substring notation in \s(name), but is
+   considered part of the name in \m(name) (to see why, see [634]Section
+   7.10.9).
+
+  7.26. New WAIT Command Options
+
+   The WAIT command has been extended to allow waiting for different kinds
+   of things (formerly it only waited for modem signals). Now it also can
+   wait for file events.
+
+    7.26.1. Waiting for Modem Signals
+
+   The previous syntax:
+
+  WAIT time { CD, DSR, RTS, RI, ... }
+
+   has changed to:
+
+  WAIT time MODEM-SIGNALS { CD, DSR, RTS, RI, ... }
+
+   However, the previous syntax is still accepted. The behavior is the
+   same in either case.
+
+    7.26.2. Waiting for File Events
+
+   The new WAIT option:
+
+  WAIT time FILE { CREATION, DELETION, MODIFICATION } filename
+
+   lets you tell Kermit to wait the given amount of time (or until the
+   given time of day) for a file whose name is filename to be created,
+   deleted, or modified, respectively. The filename may not contain
+   wildcards. If the specified event does not occur within the time limit,
+   or if WAIT CANCELLATION is ON and you interrupt from the keyboard
+   before the time is up, the WAIT command fails. If the event is
+   MODIFICATION and the file does not exist, the command fails. Otherwise,
+   if the given event occurs within the time limit, the command succeeds.
+   Examples:
+
+   WAIT 600 FILE DELETION oofa.tmp
+          Wait up to 10 minutes for file oofa.tmp to disappear.
+
+   WAIT 23:59:59 FILE MOD orders.db
+          Wait until just before midnight for the orders.db file to be
+          changed.
+
+   Example: Suppose you want to have the current copy of /etc/motd on your
+   screen at all times, and you want to hear a bell whenever it changes:
+
+  def \%f /etc/motd                      ; The file of interest.
+  while 1 {                              ; Loop forever...
+      cls                                ; Clear the screen.
+      echo \%f: \v(date) \v(time)...     ; Print 2-line heading...
+      echo
+      if ( not exist \%f ) {             ; If file doesn't exist,
+          echo \%f does not exist...     ; print message,
+          wait 600 file creat \%f        ; and wait for it to appear.
+          continue
+      }
+      beep                               ; Something new - beep.
+      type /head:\v(rows-2) \%f          ; Display the file
+      if fail exit 1 \%f: \ferrstring()  ; (checking for errors).
+      wait 999 file mod \%f              ; Wait for it to change.
+  }
+
+   This notices when the file is created, deleted, or modified, and acts
+   only then (or when you interrupt it with); the time shown in the
+   heading is the time of the most recent event (including when the
+   program started).
+
+   See [635]Section 1.10, where the \v(kbchar) variable is explained. This
+   lets you modify a loop like the one above to also accept
+   single-character commands, which interrupt the WAIT, and dispatch
+   accordingly. For example:
+
+  wait 999 file mod \%f              ; Wait for the file to change.
+  if defined \v(kbchar) {            ; Interrupted from keyboard?
+      switch \v(kbchar) {            ; Handle the keystroke...
+        :q, exit                     ; Q to Quit
+        :h, echo blah blah, break    ; H for Help
+        :default, beep, continue     ; Anything else beep and ignore
+      }
+  }
+
+   This lets you write event-driven applications that wait for up to three
+   events at once: a file or modem event, a timeout, and a keystroke.
+
+  7.27. Relaxed FOR and SWITCH Syntax
+
+   For consistency with the extended IF and WHILE syntax, the FOR and
+   SWITCH control lists may (but need not be) enclosed in parentheses:
+
+  FOR ( \%i 1 \%n 1 ) { command-list... }
+  SWITCH ( \%c ) { command-list... }
+
+   In the FOR command, the increment item can be omitted if the control
+   list is enclosed in parentheses, in which case the increment defaults
+   appropriately to 1 or -1, depending on the values of the first two
+   variables.
+
+   As with IF, the parentheses around the FOR-command control list must be
+   set off by spaces (in the SWITCH command, the spaces are not required
+   since the SWITCH expression is a single arithmetic expression).
+
+   Also, outer braces around the command list are supplied automatically
+   if you omit them, e.g.:
+
+  FOR ( \%i 1 %n 1 ) echo \%i
+
+  8. USING OTHER FILE TRANSFER PROTOCOLS
+
+   In C-Kermit 7.0, alternative protocols can be selected using switches.
+   Switches are described in [636]Section 1.5; the use of
+   protocol-selection switches is described in [637]Section 4.7.1.
+   Example:
+
+  send /binary /protocol:zmodem x.tar.gz
+
+   Note that file transfer recovery works only with Kermit and Zmodem
+   protocols. With Zmodem, recovery can be initiated only by the sender.
+
+   Only pre-1988 versions of the publicly-distributed sz/rz programs use
+   Standard I/O; those released later than that do not use Standard I/O
+   and therefore do not work with REDIRECT. However, Omen Technology does
+   offer an up-to-date redirectable version called crzsz, which must be
+   licensed for use:
+
+     "Unix Crz and Csz support XMODEM, YMODEM, and ZMODEM transfers when
+     called by dial-out programs such as Kermit and certain versions of
+     cu(1). They are clients designed for this use.
+
+     "Crz and Csz are Copyrighted shareware programs. Use of these
+     programs beyond a brief evaluation period requires registration.
+     Please print the "mailer.rz" file, fill out the form and return same
+     with your registration."
+
+   To use the crzsz programs as your external XYZMODEM programs in
+   C-Kermit, follow the instructions in the book, but put a "c" before
+   each command, e.g.:
+
+  set protocol zmodem {csz %s} {csz -a %s} crz crz crz crz
+
+   To use Zmodem protocol over Telnet or other non-transparent
+   connections, you might need to add the -e (Escape) option:
+
+  set protocol zmodem {csz -e %s} {csz -e -a %s} crz crz crz crz
+
+  9. COMMAND-LINE OPTIONS
+
+  9.0. Extended-Format Command-Line Options
+
+   Standard UNIX command line options are a single letter. C-Kermit has
+   run out of letters, so new options are in a new extended format:
+
+ --word[:arg]
+
+   where a keyword (rather than a single letter) specifies the function,
+   and if an argument is to be included, it is separated by a colon (or
+   equal sign). Most of the new extended-format command-line options are
+   only for use with the Internet Kermit Service Daemon; see the [638]IKSD
+   Administration Guide for details. However, several of them are also
+   general in nature:
+
+   --nointerrupts
+          Disables keyboard interrupts that are normally enabled, which
+          are usually Ctrl-C (to interrupt a command) and Ctrl-Z (UNIX
+          only, to suspend C-Kermit).
+
+   --help
+          Lists the extended command-line options that are available in
+          your version of C-Kermit. If any options seem to be missing,
+          that is because your copy of C-Kermit was built with
+          compile-time options to deselect them.
+
+   --helpfile:filename
+          Specifies the name of a file to be displayed if the user types
+          HELP (not followed by a specific command or topic), in place of
+          the built-in top-level help text. The file need not fit on one
+          screen; more-prompting is used if the file is more than one
+          screen long if COMMAND MORE-PROMPTING is ON, as it is by
+          default.
+
+   --bannerfile:filename
+          The name of a file containing a message to be printed after the
+          user logs in, in place of the normal message (Copyright notice,
+          "Type HELP or ? for help", "Default transfer mode is...", etc).
+
+   --cdmessage:{on,off,0,1,2}
+          For use in the Server-Side Server configuration; whenever the
+          client tells the server to change directory, the server sends
+          the contents of a "read me" file to the client's screen. This
+          feature is On by default, and operates only in client/server
+          mode when ON or 1. If set to 2 or higher, it also operates when
+          the CD command is given at the IKSD> prompt. Synonym: --cdmsg.
+
+   --cdfile:filename
+          When cdmessage is on, this is the name of the "read me" file to
+          be sent. Normally you would specify a relative (not absolute)
+          name, since the file is opened using the literal name you
+          specified, after changing to the new directory. Example:
+
+  --cdfile:READ.ME
+
+          You can also give a list of up to 8 filenames by (a) enclosing
+          each filename in braces, and (b) enclosing the entire list in
+          braces. Example:
+          --cdfile:{{./.readme}{READ.ME}{aaareadme.txt}{README}{read-this-
+          first}} When a list is given, it is searched from left to right
+          and the first file found is displayed. The default list for UNIX
+          is:
+
+  {{./.readme}{README.TXT}{READ.ME}}
+
+  9.1. Command Line Personalities
+
+   Beginning in version 7.0, if the C-Kermit binary is renamed to "telnet"
+   (or TELNET.EXE, telnet.pr, etc, depending on the platform), it accepts
+   the Telnet command line:
+
+  telnet [ host [ port ] ]
+
+   In Unix, you can achieve the same effect with a symlink:
+
+  cd /usr/bin
+  mv telnet oldtelnet
+  ln -ls /usr/local/bin/kermit telnet
+
+   When installed in this manner, C-Kermit always reads its initialization
+   file. If no host (and therefore no port) is given, C-Kermit starts in
+   interactive prompting mode. If a host is given as the first
+   command-line argument, C-Kermit makes a connection to it. The host
+   argument can be an IP host name or address, or the name of a TCP/IP
+   entry in your C-Kermit network directory.
+
+   If a port is given, it is used. If a port is not given, then if the
+   hostname was found in your network directory and port was also listed
+   there, then that port is used. Otherwise port 23 (the Telnet port) is
+   used.
+
+   When C-Kermit is called "telnet" and it is invoked with a hostname on
+   the command line, it exits automatically when the connection is closed.
+   While the connection is open, however, you may escape back and forth as
+   many times as you like, transfer files, etc.
+
+   An rlogin personality is also available, but it is less useful, at
+   least in UNIX and VMS, where the Rlogin TCP port is privileged.
+
+   The new variable \v(name) indicates the name with which C-Kermit was
+   invoked ("kermit", "wermit", "k95", "telnet", etc).
+
+  9.2. Built-in Help for Command Line Options
+
+   "kermit -h", given from the system prompt, lists as many command-line
+   options as will fit on a standard 24x80 screen. For more comprehensive
+   help, use the interactive HELP OPTIONS command that was added in
+   C-Kermit 7.0:
+
+   HELP OPTIONS
+   Explains how command-line options work, their syntax, etc.
+
+   HELP OPTIONS ALL
+   Lists all command-line options and gives brief help about each one.
+
+   HELP OPTION x
+   Gives brief help about option "x".
+
+   HELP EXTENDED-OPTIONS
+   Lists the available extended-format command-line options.
+
+   HELP EXTENDED-OPTION xxx
+   Gives help for the specified extended option.
+
+  9.3. New Command-Line Options
+
+   Command-line options added since C-Kermit 6.0 are:
+
+   +
+          (plus sign by itself): The next argument is the name of a script
+          to execute; all subsequent arguments are ignored by C-Kermit
+          itself, but passed to the script as top-level copies of \%1,
+          \%2, etc; the \&_[] is also set accordingly. \%0 and \&_[0]
+          become the name of the script file, rather than the pathname of
+          the C-Kermit program, which is its normal value. Primarily for
+          use in the top line of "Kerbang" scripts in UNIX (see
+          [639]Section 7.19). Example from UNIX command line:
+
+  $ kermit [ regular kermit args ] + filename
+
+          Sample first line of Kerbang script:
+
+  #!/usr/local/bin/kermit +
+
+   --
+          (two hyphens surrounded by whitespace) Equivalent to "=", for
+          compatibility with UNIX getopt(1,3).
+
+   -G
+          GET (like -g), but send the incoming file to standard output.
+          Example: "kermit -G oofa.txt | lpr" retrieves a file from your
+          local computer (providing it is running a Kermit program that
+          supports the autodownload feature and has it enabled) and prints
+          it.
+
+   -O
+          equivalent to -x (start up in server mode), but exits after the
+          first client command has been executed (mnemonic: O = Only One).
+          This one is handy replacing "kermit -x" in the "automatically
+          start Kermit on the other end" string:
+
+  set protocol kermit {kermit -ir} {kermit -r} {kermit -x}
+
+          since -x leaves the remote Kermit in server mode after the
+          transfer, which can be confusing, whereas -O makes it go away
+          automatically after the transfer.
+
+   -L
+          Recursive, when used in combination with -s (mnemonic: L =
+          Levels). In UNIX or other environments where the shell expands
+          wildcards itself, the -s argument, if it contains wildcards,
+          must be quoted to prevent this, e.g.:
+
+  kermit -L -s "*.c"
+
+          In UNIX only, "kermit -L -s ." means to send the current
+          directory tree. See [640]Sections 4.10 and [641]4.11 about
+          recursive file transfer.
+
+   -V
+          Equivalent to SET FILE PATTERNS OFF ([642]Section 4.3) and SET
+          TRANSFER MODE MANUAL. In other words, take the FILE TYPE setting
+          literally. For example, "kermit -VT oofa.bin" means send the
+          file in Text mode, no matter what its name is and no matter
+          whether a kindred spirit is recognized at the other end of the
+          connection.
+
+   -0
+          (digit zero) means "be 100% transparent in CONNECT mode". This
+          is equivalent to the following series of commands: SET PARITY
+          NONE, SET COMMAND BYTESIZE 8, SET TERMINAL BYTESIZE 8, SET FLOW
+          NONE, SET TERM ESCAPE DISABLED, SET TERM CHAR TRANSPARENT, SET
+          TERM AUTODOWNLOAD OFF, SET TERM APC OFF, SET TELOPT KERMIT
+          REFUSE REFUSE.
+
+  10. C-KERMIT AND G-KERMIT
+
+   Every multifunctioned and long-lived software program grows in
+   complexity and size over time to meet the needs and requests of its
+   users and the demands of the underlying technology as it changes.
+
+   Eventually users begin to notice how big the application has grown, how
+   much disk space it occupies, how long it takes to load, and they start
+   to long for the good old days when it was lean and mean. Not long after
+   that they begin asking for a "light" version that only does the basics
+   with no frills.
+
+   And so it is with C-Kermit. A "light" version of Kermit was released
+   (for UNIX only) in December 1999 under the GNU General Public License;
+   thus it is called G-Kermit (for GNU Kermit). All it does is send and
+   receive files, period. You can find it at:
+
+  [643]http://www.columbia.edu/kermit/gkermit.html
+
+   Where the C-Kermit 7.0 binary might be anywhere from 1 to 3 million
+   bytes in size, the G-Kermit binary ranges from 30K to 100K, depending
+   on the underlying architecture (RISC vs CISC, etc).
+
+   G-Kermit and C-Kermit may reside side-by-side on the same computer.
+   G-Kermit does not make connections; it does not have a script language;
+   it does not translate character sets. G-Kermit may be used instead of
+   C-Kermit when:
+
+     * It is on the remote end.
+     * Files are to be transferred in binary mode or in text mode without
+       character-set translation.
+     * File timestamps don't need to be preserved.
+
+   In such cases G-Kermit might be preferred since it generally starts up
+   faster, and yet transfers files just as fast on most (but not
+   necessarily all) kinds of connections; for example, it supports
+   streaming ([644]Section 4.20).
+
+   G-Kermit is also handy for bootstrapping. It is easier to load on a new
+   computer than C-Kermit -- it fits on a floppy diskette with plenty of
+   room to spare. Thus if you have (say) an old PC running (say) SCO Xenix
+   and no network connection, you can download the Xenix version of
+   G-Kermit to (say) a DOS or Windows PC, copy it to diskette, read the
+   diskette on Xenix with "dosread", and then use G-Kermit to receive
+   C-Kermit (which does not fit on a diskette). If diskettes aren't an
+   option, other bootstrapping methods are possible too -- see the
+   [645]G-Kermit web page for details.
+
+III. APPENDICES
+
+  III.1. Character Set Tables
+
+    III.1.1. The Hewlett Packard Roman8 Character Set
+
+dec col/row oct hex  description
+160  10/00  240  A0  (Undefined)
+161  10/01  241  A1  A grave
+162  10/02  242  A2  A circumflex
+163  10/03  243  A3  E grave
+164  10/04  244  A4  E circumflex
+165  10/05  245  A5  E diaeresis
+166  10/06  246  A6  I circumflex
+167  10/07  247  A7  I diaeresis
+168  10/08  250  A8  Acute accent
+169  10/09  251  A9  Grave accent
+170  10/10  252  AA  Circumflex accent
+171  10/11  253  AB  Diaeresis
+172  10/12  254  AC  Tilde accent
+173  10/13  255  AD  U grave
+174  10/14  256  AE  U circumflex
+175  10/15  257  AF  Lira symbol
+176  11/00  260  B0  Top bar (macron)
+177  11/01  261  B1  Y acute
+178  11/02  262  B2  y acute
+179  11/03  263  B3  Degree Sign
+180  11/04  264  B4  C cedilla
+181  11/05  265  B5  c cedilla
+182  11/06  266  B6  N tilde
+183  11/07  267  B7  n tilde
+184  11/08  270  B8  Inverted exclamation mark
+185  11/09  271  B9  Inverted question mark
+186  11/10  272  BA  Currency symbol
+187  11/11  273  BB  Pound sterling symbol
+188  11/12  274  BC  Yen symbol
+189  11/13  275  BD  Paragraph
+190  11/14  276  BE  Florin (Guilder) symbol
+191  11/15  277  BF  Cent symbol
+192  12/00  300  C0  a circumflex
+193  12/01  301  C1  e circumflex
+194  12/02  302  C2  o circumflex
+195  12/03  303  C3  u circumflex
+196  12/04  304  C4  a acute
+197  12/05  305  C5  e acute
+198  12/06  306  C6  o acute
+199  12/07  307  C7  u acute
+200  12/08  310  C8  a grave
+201  12/09  311  C9  e grave
+202  12/10  312  CA  o grave
+203  12/11  313  CB  u grave
+204  12/12  314  CC  a diaeresis
+205  12/13  315  CD  e diaeresis
+206  12/14  316  CE  o diaeresis
+207  12/15  317  CF  u diaeresis
+208  13/00  320  D0  A ring
+209  13/01  321  D1  i circumflex
+210  13/02  322  D2  O with stroke
+211  13/03  323  D3  AE digraph
+212  13/04  324  D4  a ring
+213  13/05  325  D5  i acute
+214  13/06  326  D6  o with stroke
+215  13/07  327  D7  ae digraph
+216  13/08  330  D8  A diaeresis
+217  13/09  331  D9  i grave
+218  13/10  332  DA  O diaeresis
+219  13/11  333  DB  U diaeresis
+220  13/12  334  DC  E acute
+221  13/13  335  DD  i diaeresis
+222  13/14  336  DE  German sharp s
+223  13/15  337  DF  O circumflex
+224  14/00  340  E0  A acute
+225  14/01  341  E1  A tilde
+226  14/02  342  E2  a tilde
+227  14/03  343  E3  Icelandic Eth
+228  14/04  344  E4  Icelandic eth
+229  14/05  345  E5  I acute
+230  14/06  346  E6  I grave
+231  14/07  347  E7  O acute
+232  14/08  350  E8  O grave
+233  14/09  351  E9  O tilde
+234  14/10  352  EA  o tilde
+235  14/11  353  EB  S caron
+236  14/12  354  EC  s caron
+237  14/13  355  ED  U acute
+238  14/14  356  EE  Y diaeresis
+239  14/15  357  EF  y diaeresis
+240  15/00  360  F0  Icelandic Thorn
+241  15/01  361  F1  Icelandic thorn
+242  15/02  362  F2  Middle dot
+243  15/03  363  F3  Greek mu
+244  15/04  364  F4  Pilcrow sign
+245  15/05  365  F5  Fraction 3/4
+246  15/06  366  F6  Long dash, horizontal bar
+247  15/07  367  F7  Fraction 1/4
+248  15/08  370  F8  Fraction 1/2
+249  15/09  371  F9  Feminine ordinal
+250  15/10  372  FA  Masculine ordinal
+251  15/11  373  FB  Left guillemot
+252  15/12  374  FC  Solid box
+253  15/13  375  FD  Right guillemot
+254  15/14  376  FE  Plus or minus sign
+255  15/15  377  FF  (Undefined)
+
+    III.1.2. Greek Character Sets
+
+    III.1.2.1. The ISO 8859-7 Latin / Greek Alphabet = ELOT 928
+
+dec col/row oct hex  description
+160  10/00  240  A0  No-break space
+161  10/01  241  A1  Left single quotation mark
+162  10/02  242  A2  right single quotation mark
+163  10/03  243  A3  Pound sign
+164  10/04  244  A4  (UNUSED)
+165  10/05  245  A5  (UNUSED)
+166  10/06  246  A6  Broken bar
+167  10/07  247  A7  Paragraph sign
+168  10/08  250  A8  Diaeresis (Dialytika)
+169  10/09  251  A9  Copyright sign
+170  10/10  252  AA  (UNUSED)
+171  10/11  253  AB  Left angle quotation
+172  10/12  254  AC  Not sign
+173  10/13  255  AD  Soft hyphen
+174  10/14  256  AE  (UNUSED)
+175  10/15  257  AF  Horizontal bar (Parenthetiki pavla)
+176  11/00  260  B0  Degree sign
+177  11/01  261  B1  Plus-minus sign
+178  11/02  262  B2  Superscript two
+179  11/03  263  B3  Superscript three
+180  11/04  264  B4  Accent (tonos)
+181  11/05  265  B5  Diaeresis and accent (Dialytika and Tonos)
+182  11/06  266  B6  Alpha with accent
+183  11/07  267  B7  Middle dot (Ano Teleia)
+184  11/08  270  B8  Epsilon with accent
+185  11/09  271  B9  Eta with accent
+186  11/10  272  BA  Iota with accent
+187  11/11  273  BB  Right angle quotation
+188  11/12  274  BC  Omicron with accent
+189  11/13  275  BD  One half
+190  11/14  276  BE  Upsilon with accent
+191  11/15  277  BF  Omega with accent
+192  12/00  300  C0  iota with diaeresis and accent
+193  12/01  301  C1  Alpha
+194  12/02  302  C2  Beta
+195  12/03  303  C3  Gamma
+196  12/04  304  C4  Delta
+197  12/05  305  C5  Epsilon
+198  12/06  306  C6  Zeta
+199  12/07  307  C7  Eta
+200  12/08  310  C8  Theta
+201  12/09  311  C9  Iota
+202  12/10  312  CA  Kappa
+203  12/11  313  CB  Lamda
+204  12/12  314  CC  Mu
+205  12/13  315  CD  Nu
+206  12/14  316  CE  Ksi
+207  12/15  317  CF  Omicron
+208  13/00  320  D0  Pi
+209  13/01  321  D1  Rho
+210  13/02  322  D2  (UNUSED)
+211  13/03  323  D3  Sigma
+212  13/04  324  D4  Tau
+213  13/05  325  D5  Upsilon
+214  13/06  326  D6  Phi
+215  13/07  327  D7  Khi
+216  13/08  330  D8  Psi
+217  13/09  331  D9  Omega
+218  13/10  332  DA  Iota with diaeresis
+219  13/11  333  DB  Upsilon with diaeresis
+220  13/12  334  DC  alpha with accent
+221  13/13  335  DD  epsilon with accent
+222  13/14  336  DE  eta with accent
+223  13/15  337  DF  iota with accent
+224  14/00  340  E0  upsilon with diaeresis and accent
+225  14/01  341  E1  alpha
+226  14/02  342  E2  beta
+227  14/03  343  E3  gamma
+228  14/04  344  E4  delta
+229  14/05  345  E5  epsilon
+230  14/06  346  E6  zeta
+231  14/07  347  E7  eta
+232  14/08  350  E8  theta
+233  14/09  351  E9  iota
+234  14/10  352  EA  kappa
+235  14/11  353  EB  lamda
+236  14/12  354  EC  mu
+237  14/13  355  ED  nu
+238  14/14  356  EE  ksi
+239  14/15  357  EF  omicron
+240  15/00  360  F0  pi
+241  15/01  361  F1  rho
+242  15/02  362  F2  terminal sigma
+243  15/03  363  F3  sigma
+244  15/04  364  F4  tau
+245  15/05  365  F5  upsilon
+246  15/06  366  F6  phi
+247  15/07  367  F7  khi
+248  15/08  370  F8  psi
+249  15/09  371  F9  omega
+250  15/10  372  FA  iota with diaeresis
+251  15/11  373  FB  upsilon with diaeresis
+252  15/12  374  FC  omicron with diaeresis
+253  15/13  375  FD  upsilon with accent
+254  15/14  376  FE  omega with accent
+255  15/15  377  FF  (UNUSED)
+
+    III.1.2.2. The ELOT 927 Character Set
+
+dec col/row oct hex  description
+ 32  02/00   40  20  SPACE
+ 33  02/01   41  21  EXCLAMATION MARK
+ 34  02/02   42  22  QUOTATION MARK
+ 35  02/03   43  23  NUMBER SIGN
+ 36  02/04   44  24  DOLLAR SIGN
+ 37  02/05   45  25  PERCENT SIGN
+ 38  02/06   46  26  AMPERSAND
+ 39  02/07   47  27  APOSTROPHE
+ 40  02/08   50  28  LEFT PARENTHESIS
+ 41  02/09   51  29  RIGHT PARENTHESIS
+ 42  02/10   52  2A  ASTERISK
+ 43  02/11   53  2B  PLUS SIGN
+ 44  02/12   54  2C  COMMA
+ 45  02/13   55  2D  HYPHEN, MINUS SIGN
+ 46  02/14   56  2E  PERIOD, FULL STOP
+ 47  02/15   57  2F  SOLIDUS, SLASH
+ 48  03/00   60  30  DIGIT ZERO
+ 49  03/01   61  31  DIGIT ONE
+ 50  03/02   62  32  DIGIT TWO
+ 51  03/03   63  33  DIGIT THREE
+ 52  03/04   64  34  DIGIT FOUR
+ 53  03/05   65  35  DIGIT FIVE
+ 54  03/06   66  36  DIGIT SIX
+ 55  03/07   67  37  DIGIT SEVEN
+ 56  03/08   70  38  DIGIT EIGHT
+ 57  03/09   71  39  DIGIT NINE
+ 58  03/10   72  3A  COLON
+ 59  03/11   73  3B  SEMICOLON
+ 60  03/12   74  3C  LESS-THAN SIGN, LEFT ANGLE BRACKET
+ 61  03/13   75  3D  EQUALS SIGN
+ 62  03/14   76  3E  GREATER-THAN SIGN, RIGHT ANGLE BRACKET
+ 63  03/15   77  3F  QUESTION MARK
+ 64  04/00  100  40  COMMERCIAL AT SIGN
+ 65  04/01  101  41  CAPITAL LETTER A
+ 66  04/02  102  42  CAPITAL LETTER B
+ 67  04/03  103  43  CAPITAL LETTER C
+ 68  04/04  104  44  CAPITAL LETTER D
+ 69  04/05  105  45  CAPITAL LETTER E
+ 70  04/06  106  46  CAPITAL LETTER F
+ 71  04/07  107  47  CAPITAL LETTER G
+ 72  04/08  110  48  CAPITAL LETTER H
+ 73  04/09  111  49  CAPITAL LETTER I
+ 74  04/10  112  4A  CAPITAL LETTER J
+ 75  04/11  113  4B  CAPITAL LETTER K
+ 76  04/12  114  4C  CAPITAL LETTER L
+ 77  04/13  115  4D  CAPITAL LETTER M
+ 78  04/14  116  4E  CAPITAL LETTER N
+ 79  04/15  117  4F  CAPITAL LETTER O
+ 80  05/00  120  50  CAPITAL LETTER P
+ 81  05/01  121  51  CAPITAL LETTER Q
+ 82  05/02  122  52  CAPITAL LETTER R
+ 83  05/03  123  53  CAPITAL LETTER S
+ 84  05/04  124  54  CAPITAL LETTER T
+ 85  05/05  125  55  CAPITAL LETTER U
+ 86  05/06  126  56  CAPITAL LETTER V
+ 87  05/07  127  57  CAPITAL LETTER W
+ 88  05/08  130  58  CAPITAL LETTER X
+ 89  05/09  131  59  CAPITAL LETTER Y
+ 90  05/10  132  5A  CAPITAL LETTER Z
+ 91  05/11  133  5B  LEFT SQUARE BRACKET
+ 92  05/12  134  5C  REVERSE SOLIDUS, BACKSLASH
+ 93  05/13  135  5D  RIGHT SQUARE BRACKET
+ 94  05/14  136  5E  CIRCUMFLEX ACCENT
+ 95  05/15  137  5F  UNDERSCORE
+ 96  06/00  140  60  ACCENT GRAVE
+ 97  06/01  141  61  GREEK LETTER ALPHA
+ 98  06/02  142  62  GREEK LETTER BETA
+ 99  06/03  143  63  GREEK LETTER GAMMA
+100  06/04  144  64  GREEK LETTER DELTA
+101  06/05  145  65  GREEK LETTER EPSILON
+102  06/06  146  66  GREEK LETTER ZETA
+103  06/07  147  67  GREEK LETTER ETA
+104  06/08  150  68  GREEK LETTER THETA
+105  06/09  151  69  GREEK LETTER IOTA
+106  06/10  152  6A  GREEK LETTER KAPPA
+107  06/11  153  6B  GREEK LETTER LAMDA
+108  06/12  154  6C  GREEK LETTER MU
+109  06/13  155  6D  GREEK LETTER NU
+110  06/14  156  6E  GREEK LETTER KSI
+111  06/15  157  6F  GREEK LETTER OMICRON
+112  07/00  160  70  GREEK LETTER PI
+113  07/01  161  71  GREEK LETTER RHO
+114  07/02  162  72  GREEK LETTER SIGMA
+115  07/03  163  73  GREEK LETTER TAU
+116  07/04  164  74  GREEK LETTER UPSILON
+117  07/05  165  75  GREEK LETTER FI
+118  07/06  166  76  GREEK LETTER XI
+119  07/07  167  77  GREEK LETTER PSI
+120  07/08  170  78  GREEK LETTER OMEGA
+121  07/09  171  79  SPACE
+122  07/10  172  7A  SPACE
+123  07/11  173  7B  LEFT CURLY BRACKET, LEFT BRACE
+124  07/12  174  7C  VERTICAL LINE, VERTICAL BAR
+125  07/13  175  7D  RIGHT CURLY BRACKET, RIGHT BRACE
+126  07/14  176  7E  TILDE
+127  07/15  177  7F  RUBOUT, DELETE
+
+    III.1.2.3. PC Code Page 869
+
+   (to be filled in...)
+
+    III.2. Updated Country Codes
+
+   Date: Mon, 7 Apr 1997 23:23:49 EDT
+   From: Dave Leibold <dleibold@else.net>
+   Newsgroups: comp.dcom.telecom
+   Subject: Ex-USSR Country Codes Profile
+   Organization: TELECOM Digest
+
+   Ex-USSR Country Codes Profile
+   4 April 1997
+
+   Below is a summary of the country codes that have formed in the wake of
+   the USSR dissolution, along with some updated findings and reports.
+   Additional or corrected information on any of these nations would be
+   welcome (c/o dleibold@else.net).
+     * Kyrgyz Republic country code 996 will take effect, at least in
+       Canada, effective 1 May 1997, according to CRTC Telecom Order
+       97-464, based on Stentor Tariff Notice 433. There is no indication
+       whether there will be a permissive dialing period involved or for
+       how long such a permissive operation would remain.
+     * Country code 992 was reported as a recent assignment for
+       Tajikistan, which will be moving from country code 7 at some
+       unknown time.
+     * Uzbekistan has its own country code assignment, but I have no
+       information if this is in service yet or what implementation dates
+       have been set.
+     * Kazakstan does not have a known separate country code assignment at
+       present. It remains in country code 7 for the time being.
+     * Russia seems destined to keep country code 7.
+     * Recent news reports speak of some agreements forming between Russia
+       and Belarus. While there is no outright reunification yet, there is
+       expected to be much closer ties between the two nations. Whether
+       this will lead to a reunification of telephone codes remains to be
+       seen.
+
+   In the table, "Effective" means the date at which the country code
+   began service (which could vary according to the nation). "Mandatory"
+   means the date at which the country code 7 is invalid for calls to that
+   nation. There are a number of question marks since exact dates have not
+   been collected in all cases.
+
+CC  Nation            Effective     Mandatory    Notes
+
+370 Lithuania         1993?         ???          Announced Jan 1993
+371 Latvia            1993?         ???
+372 Estonia           1 Feb 1993?   March 1993?
+373 Moldova           1993?         ???          Announced Jan 1993
+374 Armenia           1 May 1995    1 July 1995  Announced Jan 1995 (ITU)
+375 Belarus           16 Apr 1995   1997?
+380 Ukraine           16 Apr 1995   Oct 1995?
+7   Kazakstan         (no known changes)
+7   Russia            (presumably not changing)
+992 Tajikistan        ???           ???          Announced 1996-7?
+993 Turkmenistan      3 Jan 1997    3 Apr 1997   Canada as of 29 Nov 1996
+994 Azerbaijan        Sept 1994?    ???          Announced 1992
+995 Georgia           1994?         ???          ref: Telecom Digest Oct 1994
+996 Kyrgyz Republic   1 May 1997    ???          ref: Stentor Canada/CRTC
+998 Uzbekistan        ???           ???          Announced 1996? (ITU)
+
+   Details courtesy Toby Nixon, ITU, Stentor (Canada), CRTC (Canada),
+   TELECOM Digest (including information collected for the country code
+   listings).
+
+IV. ERRATA & CORRIGENDA
+
+   The following errors in [646]Using C-Kermit, Second Edition, first
+   printing, have been noted.
+
+   First, some missing acknowledgements for C-Kermit 6.0: JE Jones of
+   Microware for help with OS-9, Nigel Roles for his help with Plan 9,
+   Lucas Hart for help with VMS and Digital UNIX, Igor Kovalenko for his
+   help with QNX. And later, to Susan Kleinmann for her help with Debian
+   Linux packaging; Patrick Volkerding for his help with Slackware Linux
+   packaging; Jim Knoble for his help with Red Hat Linux packaging; and to
+   dozens of others for sending individual C-Kermit binaries for varied
+   and diverse platforms.
+
+   Thanks to James Spath for both binaries and reporting many of the typos
+   noted below. Also to Dat Thuc Nguyen for spotting several typos.
+
+PAGE    REMARKS
+COVER   "COS" is a misprint.  There is no COS.  Pretend it says "SCO" or "VOS".
+        (This is fixed in the second printing.)
+ xxi    Second line: Fred Smith's affiliation should be Computrition.
+ 83     Change "commands other" to "commands as other" (1st paragraph)
+ 87     Change "The the" to "The" (2nd paragraph)
+ 92     "set modem-type user-defined supra" should be "set modem type ..."
+ 95     Change "VI" to "vi" (1st paragraph)
+ 96     Change "it it" to "it is" (1st paragraph)
+ 97     Change "advantage a literal" to "advantage of a literal" (2nd
+        paragraph)
+102     The call-waiting example would be better as SET DIAL PREFIX *70W
+        (rather than "*70,") because the former will not cause an incorrect
+        call to be placed with pulse dialing.
+123     Third paragraph from bottom: "..otherwise if a your local username.."
+        should be "..otherwise your local username..".
+160     Delete the "it" between "and" and "to" (2nd paragraph)
+185     In "When TRANSFER DISPLAY is OFF, C-Kermit skips the display...",
+        "OFF" should be "NONE".
+187     The last paragraph says the "A command" is ignored, should be "S".
+194     Change "it known" to "it is known" (4th paragraph).
+235     In C-Kermit 7.0, the syntax of the GET command changed.  MGET now
+        must be used to get a list of files and there is no more multiline
+        GET command.
+268     Last paragraph: "effect" should be "affect".
+275     In the SET PROTOCOL KERMIT description, the following sentence is
+        incorrect and should be removed: 'If you omit the commands, the
+        default ones are restored: "kermit -ir" and "kermit -r" respectively".
+        The correct information is given at the bottom of page 281.
+279     9th line.  The decimal value of ST is 156, not 155.
+295     In the stepping stones, skip ahead to Chapter 17 on p. 327.
+298     Table 16-2, Portuguese entry.  Column 4/00 should show section sign,
+        not acute accent.
+316     Other languages written in the Hebrew alphabet include Karaim (a Turkic
+        language spoken in Lithuania and Poland), Judeo-Kurdish, and Judeo-
+        Georgian.
+332     UNDEFINE definition, change "This just" to "This is just".
+344     It might be necessary to set the modem's pulse generation rate when
+        sending numeric pages; most Hayes compatible modems use the S11
+        register for this.
+350     Delete "is" from between "It" and "ceases" (4th paragraph)
+351     Top - both occurrences of "print \%a" should be "echo \%a".
+364     \v(input) and \v(query) out of alphabetical order.
+378     In the MYSEND macro, "if not \m(rc) goto bad" should be:
+        "if \m(rc) goto bad" (remove the "not").
+382-383 It should be stated that the loop control variable must be of the \%a
+        type, or else an array element; macro names can not be used for this.
+383     In line 3, "\%f[\%i]" should be "\&f[\%i]".
+383     In the sort example, it should be stated that the array is 1-based.
+387     Change "You can list" to "You can get a list" (5th paragraph)
+393     \Fverify() description.  The 3rd sentence could be stated more clearly
+        as "If all characters in string2 are also in string1, 0 is returned."
+398     Copying \ffiles() results to an array before is not required as of
+        C-Kermit 7.0 (see [647]Section 7.3).
+403     In "(\%a + 3) * (\%b  5)", a minus sign is missing between b and 5.
+407     C-Kermit 7.0 no longer supports multiline GET.  Change
+        "get, \%1, \%2" to "get {\%1} {\%2}" or "get /as:{\%2} {\%1}".
+409     READ example while loop should be:
+        while success { echo \m(line), read line }
+409     "WRITE file" should be "WRITE keyword" (you can't put a filename there)
+        (The same applies to WRITE-LINE / WRITELN).
+414     \Funhexify() missing from Table 18-3.
+425     MINPUT definition, change 2nd "text2" to "text3".
+436     Several lines are missing from the UNIXLOGIN macro listing.
+        After the "xif fail" block, insert:
+
+          out \%1\13                    ; Send username, carriage return
+          inp 5 Password:               ; Wait 5 sec for this prompt
+          if fail end 1 No password prompt
+          pause                         ; Wait a sec
+          out \%2\13                    ; Send password
+
+440     Change "set terminal byteszie" to "set terminal bytesize".
+        Change "input Password:" to "input 10 Password".
+448     Franchise script: "access line" should be "access \m(line)".
+453     There are two incorrectly coded IF statements in the DELIVER macro
+        definition.  Replace both occurrences of "if > \%1 \%3 {" with
+        "xif > \%i \%3 {" (replace "if" by "xif" and "\%1" with "\%i").
+453     "the the" (last paragraph) should be "the".
+454     EOT (last paragraph) is End of Transmission, not End of Text.
+457     _DEFINE definition: "name constructed" should be "name is constructed".
+457     "macro for and" (last paragraph) should be "macro and".
+459     Should explain that \v(user) is a legal abbreviation of \v(userid).
+480     Figure II-2 is backwards; the least-significant bit is transmitted
+        first, then up to the highest, and the parity bit last.
+534     The VMS Appendix section on Odd Record Lengths no longer applies;
+        C-Kermit 7.0 handles odd record lengths as well as even ones.
+559     Table VIII-3, Portuguese entry.  Column 4/00 should show section sign,
+        not acute accent.
+560-563 HP-Roman8 missing from Table VII-4; there wasn't room to squeeze it in.
+        It is listed in section II(6).
+565     "d stroke" in Table VII-5 has the wrong appearance; the stem should
+        be upright.  The letter shown in the table is actually a lowercase
+        Icelandic eth, which has a curved stem.
+601-604 BeBox, BeOS, Plan 9, and probably others not listed in trademarks.
+604     The words "SCRIBE TEXT FORMATTER" appear at the end of the last
+        sentence of the first paragraph of the Colophon.  They should have
+        been in the Index.
+Index:  Missing entries: SET { SEND, RECEIVE } PATHNAMES, Call waiting, ...
+        \F()            Page 605, add also 413-414
+        \Fbreak         389
+        \Fcapitalize    390
+        \Fchecksum      414
+        \Fcrc16         414
+        \Fexecute       414
+        \Fhexify        390
+        \Fltrim         391
+        \Frepeat        392
+        \Fspawn         392
+        \Ftod2secs      399
+        \v() built_in   Page 606, add also 361-364
+        \v(_line)       354, 361
+        \v(apcactive)   361
+        \v(charset)     362
+        \v(cpu)         362
+        \v(crc16)       357, 362
+        \v(d$xxx)       add page 362
+        \v(dialnumber)  362
+        \v(dialresult)  362
+        \v(errno)       362
+        \v(errstring)   362
+        \v(exedir)      362
+        \v(inidir)      363
+        \v(ipaddress)   363
+        \v(keyboard)    363
+        \v(macro)       363
+        \v(minput)      363
+        \v(m_xxx)       94, 363
+        \v(password)    364
+        \v(query)       364
+        \v(prompt)      364
+        \v(speed)       356, 364
+        \v(startup)     364
+        \v(status)      364
+        \v(sysid)       364
+        \v(system)      364
+        \v(fsize)       at lower half page 606 should read \v(tfsize)
+        \v(xversion)    364
+        BEEP Command    40
+        SET FLOW        62, 212
+
+   Figure II-5 on page 493. The pin assignments of the Mini Din-8
+   connector are not described anywhere. As noted in the text, these tend
+   to vary from vendor to vendor. One common arrangement is:
+
+  1. HSKout (Handshake out -- definition depends on software)
+  2. HSKin  (Handshake in or external clock)
+  3. TxD-
+  4. Not used
+  5. RxD-
+  6. TxD+
+  7. Not used
+  8. RxD+
+
+   Note the "balanced pairs" for Receive Data (RxD) and Transmit Data
+   (TxD), and the utter lack of modem signals. These connectors follow the
+   RS-423 standard, rather than RS-232. In some arrangements, Pin 1 is
+   used for DTR and Pin 2 for CD; in others Pin 1 is RTS and Pin 2 is CTS.
+
+   Please send reports of other errors to the authors, as well as
+   suggestions for improvements, additional index entries, and any other
+   comments:
+
+   [648]kermit@columbia.edu
+
+APPENDIX V. ADDITIONAL COPYRIGHT NOTICES
+
+   The following copyrights cover some of the source code used in the
+   development of C-Kermit, Kermit 95, or Kermit 95 support libraries.
+
+/*****************************************************************************/
+/*                                                                           */
+/*              Copyright (c) 1995 by Oy Online Solutions Ltd.               */
+/*                                                                           */
+/*   Distribution of this source code is strictly forbbidden. Use of this    */
+/*   source code is granted to the University of Columbia C-Kermit project   */
+/*   to be distributed in binary format only. Please familiarize yourself    */
+/*   with the accompanying LICENSE.P file.                                   */
+/*                                                                           */
+/*****************************************************************************/
+
+   used for Xmodem, Ymodem, and Zmodem protocol in Kermit 95 (p95.dll,
+   p2.dll)
+
+   Copyright (c) 1997 Stanford University
+
+   The use of this software for revenue-generating purposes may require a
+   license from the owners of the underlying intellectual property.
+   Specifically, the SRP-3 protocol may not be used for revenue-generating
+   purposes without a license.
+
+   Within that constraint, permission to use, copy, modify, and distribute
+   this software and its documentation for any purpose is hereby granted
+   without fee, provided that the above copyright notices and this
+   permission notice appear in all copies of the software and related
+   documentation.
+
+   THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+   WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+   IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+   INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
+   ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
+   ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+   SOFTWARE.
+
+   Used for Secure Remote Password (TM) protocol (SRP) in C-Kermit, Kermit
+   95 (k95.exe, k2.exe, k95crypt.dll, k2crypt.dll)
+
+   Copyright 1990 by the Massachusetts Institute of Technology. All Rights
+   Reserved.
+
+   Export of this software from the United States of America may require a
+   specific license from the United States Government. It is the
+   responsibility of any person or organization contemplating export to
+   obtain such a license before exporting.
+
+   WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+   this software and its documentation for any purpose and without fee is
+   hereby granted, provided that the above copyright notice appear in all
+   copies and that both that copyright notice and this permission notice
+   appear in supporting documentation, and that the name of M.I.T. not be
+   used in advertising or publicity pertaining to distribution of the
+   software without specific, written prior permission. M.I.T. makes no
+   representations about the suitability of this software for any purpose.
+   It is provided "as is" without express or implied warranty.
+
+   Used for Telnet Authentication Option, Telnet Encryption Option, and
+   Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
+   k95crypt.dll, k2crypt.dll)
+
+   Copyright (c) 1991, 1993 The Regents of the University of California.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are
+   met:
+    1. Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the
+       distribution.
+    3. All advertising materials mentioning features or use of this
+       software must display the following acknowledgement:
+
+     This product includes software developed by the University of
+     California, Berkeley and its contributors.
+    4. Neither the name of the University nor the names of its
+       contributors may be used to endorse or promote products derived
+       from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+   BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+   Used for Telnet Authentication Option, Telnet Encryption Option, and
+   Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
+   k95crypt.dll, k2crypt.dll)
+
+   Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) All rights
+   reserved.
+
+   This package is an DES implementation written by Eric Young
+   (eay@cryptsoft.com). The implementation was written so as to conform
+   with MIT's libdes.
+
+   This library is free for commercial and non-commercial use as long as
+   the following conditions are aheared to. The following conditions apply
+   to all code found in this distribution.
+
+   Copyright remains Eric Young's, and as such any Copyright notices in
+   the code are not to be removed. If this package is used in a product,
+   Eric Young should be given attribution as the author of that the SSL
+   library. This can be in the form of a textual message at program
+   startup or in documentation (online or textual) provided with the
+   package.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are
+   met:
+    1. Redistributions of source code must retain the copyright notice,
+       this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the
+       distribution.
+    3. All advertising materials mentioning features or use of this
+       software must display the following acknowledgement: This product
+       includes software developed by Eric Young (eay@cryptsoft.com)
+
+   THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND ANY EXPRESS OR
+   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+
+   The license and distribution terms for any publically available version
+   or derivative of this code cannot be changed. i.e. this code cannot
+   simply be copied and put under another distrubution license [including
+   the GNU Public License.]
+
+   The reason behind this being stated in this direct manner is past
+   experience in code simply being copied and the attribution removed from
+   it and then being distributed as part of other packages. This
+   implementation was a non-trivial and unpaid effort.
+
+   Used DES encryption in Kermit 95 (k95crypt.dll, k2crypt.dll)
+     __________________________________________________________________
+
+ * This is version 1.1 of CryptoLib
+ *
+ * The authors of this software are Jack Lacy, Don Mitchell and Matt Blaze
+ *              Copyright (c) 1991, 1992, 1993, 1994, 1995 by AT&T.
+ * Permission to use, copy, and modify this software without fee
+ * is hereby granted, provided that this entire notice is included in
+ * all copies of any software which is or includes a copy or
+ * modification of this software and in all copies of the supporting
+ * documentation for such software.
+ *
+ * NOTE:
+ * Some of the algorithms in cryptolib may be covered by patents.
+ * It is the responsibility of the user to ensure that any required
+ * licenses are obtained.
+ *
+ *
+ * SOME PARTS OF CRYPTOLIB MAY BE RESTRICTED UNDER UNITED STATES EXPORT
+ * REGULATIONS.
+ *
+ *
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+
+   Used for Big Number library in Kermit 95 (k95crypt.dll, k2crypt.dll).
+
+   [ [649]Top ] [ [650]C-Kermit ] [ [651]Kermit Home ]
+     __________________________________________________________________
+     __________________________________________________________________
+
+   CKERMIT70.HTM / The Kermit Project / Columbia University / 8 Feb 2000
+
+References
+
+   1. http://www.columbia.edu/
+   2. mailto:kermit@columbia.edu
+   3. http://www.columbia.edu/kermit/index.html
+   4. http://www.columbia.edu/kermit/k95.html
+   5. http://www.columbia.edu/kermit/ckermit.html
+   6. http://www.columbia.edu/kermit/ckscripts.html
+   7. http://www.columbia.edu/kermit/current.html
+   8. http://www.columbia.edu/kermit/whatsnew.html
+   9. http://www.columbia.edu/kermit/faq.html
+  10. http://www.columbia.edu/kermit/support.html
+  11. http://www.amazon.com/gp/product/1555581641?ie=UTF8&tag=aleidmoreldom-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1555581641
+  12. mailto:kermit-support@columbia.edu
+  13. http://www.columbia.edu/kermit/
+  14. http://www.kermit-project.org/
+  15. http://www.columbia.nyc.ny.us/kermit/
+  16. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT
+  17. ftp://kermit.columbia.edu/kermit/f/ckcmai.c
+  18. http://www.columbia.edu/kermit/ckermit70.html#xv
+  19. http://www.columbia.edu/kermit/ckb2.htm
+  20. ftp://kermit.columbia.edu/kermit/f/ckcbwr.txt
+  21. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+  22. ftp://kermit.columbia.edu/kermit/f/ckvbwr.txt
+  23. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+  24. ftp://kermit.columbia.edu/kermit/f/ckermit70.txt
+  25. ftp://kermit.columbia.edu/kermit/f/security.txt
+  26. http://www.columbia.edu/kermit/security.htm
+  27. ftp://kermit.columbia.edu/kermit/f/iksd.txt
+  28. http://www.columbia.edu/kermit/iksd.htm
+  29. http://www.columbia.edu/kermit/cuiksd.htm
+  30. ftp://kermit.columbia.edu/kermit/f/telnet.txt
+  31. http://www.columbia.edu/kermit/telnet.htm
+  32. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT
+  33. http://www.columbia.edu/kermit/k95.html
+  34. http://www.opensource.org/
+  35. http://www.columbia.edu/kermit/ckb2.htm
+  36. http://www.columbia.edu/kermit/ckermit70.html#xi
+  37. http://www.columbia.edu/kermit/ckermit70.html#xii
+  38. http://www.columbia.edu/kermit/ckermit70.html#x0
+  39. http://www.columbia.edu/kermit/ckermit70.html#x1
+  40. http://www.columbia.edu/kermit/ckermit70.html#x1.0
+  41. http://www.columbia.edu/kermit/ckermit70.html#x1.1
+  42. http://www.columbia.edu/kermit/ckermit70.html#x1.2
+  43. http://www.columbia.edu/kermit/ckermit70.html#x1.3
+  44. http://www.columbia.edu/kermit/ckermit70.html#x1.4
+  45. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+  46. http://www.columbia.edu/kermit/ckermit70.html#x1.5.1
+  47. http://www.columbia.edu/kermit/ckermit70.html#x1.5.2
+  48. http://www.columbia.edu/kermit/ckermit70.html#x1.5.3
+  49. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+  50. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5
+  51. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+  52. http://www.columbia.edu/kermit/ckermit70.html#x1.7
+  53. http://www.columbia.edu/kermit/ckermit70.html#x1.8
+  54. http://www.columbia.edu/kermit/ckermit70.html#x1.9
+  55. http://www.columbia.edu/kermit/ckermit70.html#x1.10
+  56. http://www.columbia.edu/kermit/ckermit70.html#x1.11
+  57. http://www.columbia.edu/kermit/ckermit70.html#x1.11.1
+  58. http://www.columbia.edu/kermit/ckermit70.html#x1.11.2
+  59. http://www.columbia.edu/kermit/ckermit70.html#x1.11.3
+  60. http://www.columbia.edu/kermit/ckermit70.html#x1.11.4
+  61. http://www.columbia.edu/kermit/ckermit70.html#x1.11.5
+  62. http://www.columbia.edu/kermit/ckermit70.html#x1.11.6
+  63. http://www.columbia.edu/kermit/ckermit70.html#x1.11.7
+  64. http://www.columbia.edu/kermit/ckermit70.html#x1.12
+  65. http://www.columbia.edu/kermit/ckermit70.html#x1.13
+  66. http://www.columbia.edu/kermit/ckermit70.html#x1.14
+  67. http://www.columbia.edu/kermit/ckermit70.html#x1.15
+  68. http://www.columbia.edu/kermit/ckermit70.html#x1.16
+  69. http://www.columbia.edu/kermit/ckermit70.html#x1.17
+  70. http://www.columbia.edu/kermit/ckermit70.html#x1.18
+  71. http://www.columbia.edu/kermit/ckermit70.html#x1.19
+  72. http://www.columbia.edu/kermit/ckermit70.html#x1.20
+  73. http://www.columbia.edu/kermit/ckermit70.html#x1.21
+  74. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+  75. http://www.columbia.edu/kermit/ckermit70.html#x1.22.1
+  76. http://www.columbia.edu/kermit/ckermit70.html#x1.22.2
+  77. http://www.columbia.edu/kermit/ckermit70.html#x1.22.3
+  78. http://www.columbia.edu/kermit/ckermit70.html#x1.22.4
+  79. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5
+  80. http://www.columbia.edu/kermit/ckermit70.html#x1.22.6
+  81. http://www.columbia.edu/kermit/ckermit70.html#x1.22.7
+  82. http://www.columbia.edu/kermit/ckermit70.html#x1.22.8
+  83. http://www.columbia.edu/kermit/ckermit70.html#x1.23
+  84. http://www.columbia.edu/kermit/ckermit70.html#x1.24
+  85. http://www.columbia.edu/kermit/ckermit70.html#x2
+  86. http://www.columbia.edu/kermit/ckermit70.html#x2.0
+  87. http://www.columbia.edu/kermit/ckermit70.html#x2.1
+  88. http://www.columbia.edu/kermit/ckermit70.html#x2.1.1
+  89. http://www.columbia.edu/kermit/ckermit70.html#x2.1.2
+  90. http://www.columbia.edu/kermit/ckermit70.html#x2.1.3
+  91. http://www.columbia.edu/kermit/ckermit70.html#x2.1.4
+  92. http://www.columbia.edu/kermit/ckermit70.html#x2.1.5
+  93. http://www.columbia.edu/kermit/ckermit70.html#x2.1.6
+  94. http://www.columbia.edu/kermit/ckermit70.html#x2.1.7
+  95. http://www.columbia.edu/kermit/ckermit70.html#x2.1.8
+  96. http://www.columbia.edu/kermit/ckermit70.html#x2.1.9
+  97. http://www.columbia.edu/kermit/ckermit70.html#x2.1.10
+  98. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11
+  99. http://www.columbia.edu/kermit/ckermit70.html#x2.1.12
+ 100. http://www.columbia.edu/kermit/ckermit70.html#x2.1.13
+ 101. http://www.columbia.edu/kermit/ckermit70.html#x2.1.14
+ 102. http://www.columbia.edu/kermit/ckermit70.html#x2.1.15
+ 103. http://www.columbia.edu/kermit/ckermit70.html#x2.1.16
+ 104. http://www.columbia.edu/kermit/ckermit70.html#x2.2
+ 105. http://www.columbia.edu/kermit/ckermit70.html#x2.2.1
+ 106. http://www.columbia.edu/kermit/ckermit70.html#x2.2.2
+ 107. http://www.columbia.edu/kermit/ckermit70.html#x2.3
+ 108. http://www.columbia.edu/kermit/ckermit70.html#x2.3.0
+ 109. http://www.columbia.edu/kermit/ckermit70.html#x2.3.1
+ 110. http://www.columbia.edu/kermit/ckermit70.html#x2.3.2
+ 111. http://www.columbia.edu/kermit/ckermit70.html#x2.3.3
+ 112. http://www.columbia.edu/kermit/ckermit70.html#x2.3.4
+ 113. http://www.columbia.edu/kermit/ckermit70.html#x2.3.5
+ 114. http://www.columbia.edu/kermit/ckermit70.html#x2.3.6
+ 115. http://www.columbia.edu/kermit/ckermit70.html#x2.4
+ 116. http://www.columbia.edu/kermit/ckermit70.html#x2.5
+ 117. http://www.columbia.edu/kermit/ckermit70.html#x2.6
+ 118. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 119. http://www.columbia.edu/kermit/ckermit70.html#x2.7.0
+ 120. http://www.columbia.edu/kermit/ckermit70.html#x2.7.1
+ 121. http://www.columbia.edu/kermit/ckermit70.html#x2.7.2
+ 122. http://www.columbia.edu/kermit/ckermit70.html#x2.7.3
+ 123. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4
+ 124. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.1
+ 125. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.2
+ 126. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.3
+ 127. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.4
+ 128. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.5
+ 129. http://www.columbia.edu/kermit/ckermit70.html#x2.8
+ 130. http://www.columbia.edu/kermit/ckermit70.html#x2.9
+ 131. http://www.columbia.edu/kermit/ckermit70.html#x2.9.1
+ 132. http://www.columbia.edu/kermit/ckermit70.html#x2.9.2
+ 133. http://www.columbia.edu/kermit/ckermit70.html#x2.10
+ 134. http://www.columbia.edu/kermit/ckermit70.html#x2.11
+ 135. http://www.columbia.edu/kermit/ckermit70.html#x2.12
+ 136. http://www.columbia.edu/kermit/ckermit70.html#x2.13
+ 137. http://www.columbia.edu/kermit/ckermit70.html#x2.14
+ 138. http://www.columbia.edu/kermit/ckermit70.html#x2.15
+ 139. http://www.columbia.edu/kermit/ckermit70.html#x3
+ 140. http://www.columbia.edu/kermit/ckermit70.html#x3.1
+ 141. http://www.columbia.edu/kermit/ckermit70.html#x3.2
+ 142. http://www.columbia.edu/kermit/ckermit70.html#x3.3
+ 143. http://www.columbia.edu/kermit/ckermit70.html#x3.4
+ 144. http://www.columbia.edu/kermit/ckermit70.html#x4
+ 145. http://www.columbia.edu/kermit/ckermit70.html#x4.0
+ 146. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 147. http://www.columbia.edu/kermit/ckermit70.html#x4.1.1
+ 148. http://www.columbia.edu/kermit/ckermit70.html#x4.1.2
+ 149. http://www.columbia.edu/kermit/ckermit70.html#x4.1.3
+ 150. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 151. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1
+ 152. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.1
+ 153. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.2
+ 154. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.3
+ 155. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 156. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2.1
+ 157. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2.2
+ 158. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3
+ 159. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3.1
+ 160. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3.2
+ 161. http://www.columbia.edu/kermit/ckermit70.html#x4.2.4
+ 162. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5
+ 163. http://www.columbia.edu/kermit/ckermit70.html#x4.2.6
+ 164. http://www.columbia.edu/kermit/ckermit70.html#x4.2.7
+ 165. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8
+ 166. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.1
+ 167. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.2
+ 168. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.3
+ 169. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.4
+ 170. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 171. http://www.columbia.edu/kermit/ckermit70.html#x4.3.1
+ 172. http://www.columbia.edu/kermit/ckermit70.html#x4.3.2
+ 173. http://www.columbia.edu/kermit/ckermit70.html#x4.3.3
+ 174. http://www.columbia.edu/kermit/ckermit70.html#x4.3.4
+ 175. http://www.columbia.edu/kermit/ckermit70.html#x4.4
+ 176. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1
+ 177. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1.1
+ 178. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1.2
+ 179. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2
+ 180. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1
+ 181. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1.1
+ 182. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1.2
+ 183. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.2
+ 184. http://www.columbia.edu/kermit/ckermit70.html#x4.5
+ 185. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 186. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2
+ 187. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2.1
+ 188. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2.2
+ 189. http://www.columbia.edu/kermit/ckermit70.html#x4.5.3
+ 190. http://www.columbia.edu/kermit/ckermit70.html#x4.5.4
+ 191. http://www.columbia.edu/kermit/ckermit70.html#x4.6
+ 192. http://www.columbia.edu/kermit/ckermit70.html#x4.7
+ 193. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 194. http://www.columbia.edu/kermit/ckermit70.html#x4.7.2
+ 195. http://www.columbia.edu/kermit/ckermit70.html#x4.7.3
+ 196. http://www.columbia.edu/kermit/ckermit70.html#x4.8
+ 197. http://www.columbia.edu/kermit/ckermit70.html#x4.8.1
+ 198. http://www.columbia.edu/kermit/ckermit70.html#x4.8.2
+ 199. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 200. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 201. http://www.columbia.edu/kermit/ckermit70.html#x4.9.2
+ 202. http://www.columbia.edu/kermit/ckermit70.html#x4.9.3
+ 203. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 204. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 205. http://www.columbia.edu/kermit/ckermit70.html#x4.11.1
+ 206. http://www.columbia.edu/kermit/ckermit70.html#x4.11.2
+ 207. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 208. http://www.columbia.edu/kermit/ckermit70.html#x4.11.4
+ 209. http://www.columbia.edu/kermit/ckermit70.html#x4.11.5
+ 210. http://www.columbia.edu/kermit/ckermit70.html#x4.11.6
+ 211. http://www.columbia.edu/kermit/ckermit70.html#x4.12
+ 212. http://www.columbia.edu/kermit/ckermit70.html#x4.13
+ 213. http://www.columbia.edu/kermit/ckermit70.html#x4.14
+ 214. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 215. http://www.columbia.edu/kermit/ckermit70.html#x4.16
+ 216. http://www.columbia.edu/kermit/ckermit70.html#x4.17
+ 217. http://www.columbia.edu/kermit/ckermit70.html#x4.17.1
+ 218. http://www.columbia.edu/kermit/ckermit70.html#x4.17.2
+ 219. http://www.columbia.edu/kermit/ckermit70.html#x4.18
+ 220. http://www.columbia.edu/kermit/ckermit70.html#x4.19
+ 221. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 222. http://www.columbia.edu/kermit/ckermit70.html#x4.20.1
+ 223. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2
+ 224. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.1
+ 225. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.2
+ 226. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.3
+ 227. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.4
+ 228. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.5
+ 229. http://www.columbia.edu/kermit/ckermit70.html#x4.20.3
+ 230. http://www.columbia.edu/kermit/ckermit70.html#x4.21
+ 231. http://www.columbia.edu/kermit/ckermit70.html#x4.22
+ 232. http://www.columbia.edu/kermit/ckermit70.html#x4.22.1
+ 233. http://www.columbia.edu/kermit/ckermit70.html#x4.22.2
+ 234. http://www.columbia.edu/kermit/ckermit70.html#x4.22.3
+ 235. http://www.columbia.edu/kermit/ckermit70.html#x4.22.4
+ 236. http://www.columbia.edu/kermit/ckermit70.html#x4.22.5
+ 237. http://www.columbia.edu/kermit/ckermit70.html#x4.22.6
+ 238. http://www.columbia.edu/kermit/ckermit70.html#x4.22.7
+ 239. http://www.columbia.edu/kermit/ckermit70.html#x4.22.8
+ 240. http://www.columbia.edu/kermit/ckermit70.html#x4.23
+ 241. http://www.columbia.edu/kermit/ckermit70.html#x4.24
+ 242. http://www.columbia.edu/kermit/ckermit70.html#x4.25
+ 243. http://www.columbia.edu/kermit/ckermit70.html#x5
+ 244. http://www.columbia.edu/kermit/ckermit70.html#x5.0
+ 245. http://www.columbia.edu/kermit/ckermit70.html#x5.1
+ 246. http://www.columbia.edu/kermit/ckermit70.html#x5.2
+ 247. http://www.columbia.edu/kermit/ckermit70.html#x5.3
+ 248. http://www.columbia.edu/kermit/ckermit70.html#x5.3.1
+ 249. http://www.columbia.edu/kermit/ckermit70.html#x5.3.2
+ 250. http://www.columbia.edu/kermit/ckermit70.html#x5.4
+ 251. http://www.columbia.edu/kermit/ckermit70.html#x5.5
+ 252. http://www.columbia.edu/kermit/ckermit70.html#x5.6
+ 253. http://www.columbia.edu/kermit/ckermit70.html#x5.7
+ 254. http://www.columbia.edu/kermit/ckermit70.html#x6
+ 255. http://www.columbia.edu/kermit/ckermit70.html#x6.0
+ 256. http://www.columbia.edu/kermit/ckermit70.html#x6.1
+ 257. http://www.columbia.edu/kermit/ckermit70.html#x6.2
+ 258. http://www.columbia.edu/kermit/ckermit70.html#x6.3
+ 259. http://www.columbia.edu/kermit/ckermit70.html#x6.4
+ 260. http://www.columbia.edu/kermit/ckermit70.html#x6.5
+ 261. http://www.columbia.edu/kermit/ckermit70.html#x6.6
+ 262. http://www.columbia.edu/kermit/ckermit70.html#x6.6.1
+ 263. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 264. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 265. http://www.columbia.edu/kermit/ckermit70.html#x6.6.3
+ 266. http://www.columbia.edu/kermit/ckermit70.html#x6.6.4
+ 267. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5
+ 268. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.1
+ 269. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.2
+ 270. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.3
+ 271. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.4
+ 272. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.5
+ 273. http://www.columbia.edu/kermit/ckermit70.html#x6.7
+ 274. http://www.columbia.edu/kermit/ckermit70.html#x7
+ 275. http://www.columbia.edu/kermit/ckermit70.html#x7.0
+ 276. http://www.columbia.edu/kermit/ckermit70.html#x7.1
+ 277. http://www.columbia.edu/kermit/ckermit70.html#x7.1.1
+ 278. http://www.columbia.edu/kermit/ckermit70.html#x7.1.2
+ 279. http://www.columbia.edu/kermit/ckermit70.html#x7.1.3
+ 280. http://www.columbia.edu/kermit/ckermit70.html#x7.1.4
+ 281. http://www.columbia.edu/kermit/ckermit70.html#x7.2
+ 282. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 283. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 284. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 285. http://www.columbia.edu/kermit/ckermit70.html#x7.6
+ 286. http://www.columbia.edu/kermit/ckermit70.html#x7.7
+ 287. http://www.columbia.edu/kermit/ckermit70.html#x7.8
+ 288. http://www.columbia.edu/kermit/ckermit70.html#x7.9
+ 289. http://www.columbia.edu/kermit/ckermit70.html#x7.9.1
+ 290. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2
+ 291. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 292. http://www.columbia.edu/kermit/ckermit70.html#x7.10.1
+ 293. http://www.columbia.edu/kermit/ckermit70.html#x7.10.2
+ 294. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3
+ 295. http://www.columbia.edu/kermit/ckermit70.html#x7.10.4
+ 296. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 297. http://www.columbia.edu/kermit/ckermit70.html#x7.10.6
+ 298. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 299. http://www.columbia.edu/kermit/ckermit70.html#x7.10.8
+ 300. http://www.columbia.edu/kermit/ckermit70.html#x7.10.9
+ 301. http://www.columbia.edu/kermit/ckermit70.html#x7.10.10
+ 302. http://www.columbia.edu/kermit/ckermit70.html#x7.11
+ 303. http://www.columbia.edu/kermit/ckermit70.html#x7.12
+ 304. http://www.columbia.edu/kermit/ckermit70.html#x7.13
+ 305. http://www.columbia.edu/kermit/ckermit70.html#x7.14
+ 306. http://www.columbia.edu/kermit/ckermit70.html#x7.15
+ 307. http://www.columbia.edu/kermit/ckermit70.html#x7.16
+ 308. http://www.columbia.edu/kermit/ckermit70.html#x7.17
+ 309. http://www.columbia.edu/kermit/ckermit70.html#x7.18
+ 310. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 311. http://www.columbia.edu/kermit/ckermit70.html#x7.20
+ 312. http://www.columbia.edu/kermit/ckermit70.html#x7.20.1
+ 313. http://www.columbia.edu/kermit/ckermit70.html#x7.20.2
+ 314. http://www.columbia.edu/kermit/ckermit70.html#x7.21
+ 315. http://www.columbia.edu/kermit/ckermit70.html#x7.22
+ 316. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 317. http://www.columbia.edu/kermit/ckermit70.html#x7.24
+ 318. http://www.columbia.edu/kermit/ckermit70.html#x7.25
+ 319. http://www.columbia.edu/kermit/ckermit70.html#x7.26
+ 320. http://www.columbia.edu/kermit/ckermit70.html#x7.26.1
+ 321. http://www.columbia.edu/kermit/ckermit70.html#x7.26.2
+ 322. http://www.columbia.edu/kermit/ckermit70.html#x7.27
+ 323. http://www.columbia.edu/kermit/ckermit70.html#x8
+ 324. http://www.columbia.edu/kermit/ckermit70.html#x9
+ 325. http://www.columbia.edu/kermit/ckermit70.html#x9.0
+ 326. http://www.columbia.edu/kermit/ckermit70.html#x9.1
+ 327. http://www.columbia.edu/kermit/ckermit70.html#x9.2
+ 328. http://www.columbia.edu/kermit/ckermit70.html#x9.3
+ 329. http://www.columbia.edu/kermit/ckermit70.html#x10
+ 330. http://www.columbia.edu/kermit/ckermit70.html#xiii
+ 331. http://www.columbia.edu/kermit/ckermit70.html#xiii.1
+ 332. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.1
+ 333. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2
+ 334. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.1
+ 335. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.2
+ 336. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.3
+ 337. http://www.columbia.edu/kermit/ckermit70.html#xiii.2
+ 338. http://www.columbia.edu/kermit/ckermit70.html#xiv
+ 339. http://www.columbia.edu/kermit/ckermit70.html#xv
+ 340. http://www.columbia.edu/kermit/ckb2.htm
+ 341. http://www.columbia.edu/kermit/ckbreviews.html
+ 342. http://www.bhusa.com/
+ 343. http://www.columbia.edu/kermit/manuals.html#ckde
+ 344. http://www.columbia.edu/kermit/manuals.html#ktb
+ 345. http://www.columbia.edu/kermit/news.html
+ 346. news:comp.protocols.kermit.announce
+ 347. news:comp.protocols.kermit.misc
+ 348. http://www.columbia.edu/kermit/ckb2.htm
+ 349. http://www.columbia.edu/kermit/ckermit70.html#x4
+ 350. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 351. http://www.columbia.edu/kermit/ckermit70.html#x4.23
+ 352. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 353. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 354. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 355. http://www.columbia.edu/kermit/ckermit70.html#x4.9.
+ 356. http://www.columbia.edu/kermit/ckb2.htm
+ 357. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2
+ 358. http://www.columbia.edu/kermit/ckermit70.html#x2.15
+ 359. http://www.columbia.edu/kermit/ckermit70.html#x9.1
+ 360. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 361. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 362. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 363. http://www.columbia.edu/kermit/ckermit70.html#mjd
+ 364. http://www.columbia.edu/kermit/ckermit70.html#mjd
+ 365. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 366. http://www.columbia.edu/kermit/ckb2.htm
+ 367. http://www.columbia.edu/kermit/ckb2.htm
+ 368. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 369. http://www.columbia.edu/kermit/ckermit70.html#x2.12
+ 370. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 371. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 372. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5
+ 373. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 374. http://www.columbia.edu/kermit/ckermit70.html#x7.18
+ 375. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 376. http://www.columbia.edu/kermit/ckermit70.html#x1.15
+ 377. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 378. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 379. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 380. http://www.columbia.edu/kermit/ckermit70.html#x7.1
+ 381. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 382. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
+ 383. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
+ 384. http://www.columbia.edu/kermit/ckermit70.html#x1.22.4
+ 385. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5
+ 386. http://www.columbia.edu/kermit/ckb2.htm
+ 387. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5
+ 388. http://www.columbia.edu/kermit/ckermit70.html#x7.12
+ 389. http://www.columbia.edu/kermit/ckermit70.html#x2.1.16
+ 390. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 391. http://www.columbia.edu/kermit/ckermit70.html#x2.3.5
+ 392. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 393. http://www.telefonica.es/cambiodenumeracion/
+ 394. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 395. http://www.columbia.edu/kermit/ckb2.htm
+ 396. http://www.columbia.edu/kermit/ckermit70.html#x2.2.2
+ 397. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11
+ 398. http://www.columbia.edu/kermit/ckermit70.html#x2.1.13
+ 399. http://www.columbia.edu/kermit/ckermit70.html#x2.1.12
+ 400. http://www.columbia.edu/kermit/ckb2.htm
+ 401. http://www.columbia.edu/kermit/ckermit70.html#x2.1.1
+ 402. http://www.columbia.edu/kermit/ckb2.htm
+ 403. http://www.columbia.edu/kermit/ckb2.htm
+ 404. http://www.columbia.edu/kermit/ckermit70.html#x2.1.7
+ 405. http://www.columbia.edu/kermit/ckermit70.html#x2.1.6
+ 406. http://www.columbia.edu/kermit/ckb2.htm
+ 407. ftp://kermit.columbia.edu/kermit/f/telnet.txt
+ 408. http://www.columbia.edu/kermit/telnet.htm
+ 409. ftp://kermit.columbia.edu/kermit/f/telnet.txt
+ 410. http://www.columbia.edu/kermit/telnet.htm
+ 411. ftp://ftp.isi.edu/in-notes/rfc1572.txt
+ 412. ftp://ftp.isi.edu/in-notes/rfc779.txt
+ 413. http://www.columbia.edu/kermit/ckb2.htm
+ 414. http://www.columbia.edu/kermit/ckermit70.html#x2.10
+ 415. http://www.columbia.edu/kermit/ckermit70.html#x2.8
+ 416. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 417. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 418. http://www.psy.uq.oz.au/~ftp/Crypto/
+ 419. http://www.columbia.edu/kermit/security.htm
+ 420. http://srp.stanford.edu/srp/
+ 421. http://www.columbia.edu/kermit/ckermit70.html#x2.7.1,
+ 422. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
+ 423. http://www.columbia.edu/kermit/security.htm
+ 424. http://www.columbia.edu/kermit/ckb2.htm
+ 425. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 426. http://www.columbia.edu/kermit/ckermit70.html#x2.0
+ 427. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
+ 428. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+ 429. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
+ 430. http://www.columbia.edu/kermit/iksd.html#x4.2
+ 431. http://www.columbia.edu/kermit/iksd.html
+ 432. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.1
+ 433. ftp://ftp.isi.edu/in-notes/rfc1945.txt
+ 434. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 435. http://www.columbia.edu/kermit/ckermit70.html#x3.2
+ 436. http://www.columbia.edu/kermit/ckermit70.html#x3.2
+ 437. http://www.columbia.edu/kermit/ckb2.htm
+ 438. http://www.columbia.edu/kermit/ckb2.htm
+ 439. http://www.columbia.edu/kermit/ckermit70.html#x5.4
+ 440. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+ 441. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 442. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 443. http://www.columbia.edu/kermit/ckermit70.html#x4.7.3
+ 444. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 445. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 446. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 447. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 448. http://www.columbia.edu/kermit/ckermit70.html#x4.2.4
+ 449. http://www.columbia.edu/kermit/ckermit70.html#x4.7
+ 450. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3
+ 451. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.3
+ 452. http://www.columbia.edu/kermit/ckb2.htm
+ 453. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 454. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 455. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.2
+ 456. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 457. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 458. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 459. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 460. http://www.telstra.com.au/docs/PGP/
+ 461. http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html
+ 462. http://www.columbia.edu/kermit/security.htm
+ 463. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 464. http://www.columbia.edu/kermit/ckb2.htm
+ 465. http://www.columbia.edu/kermit/ckermit70.html#x2.14
+ 466. http://www.columbia.edu/kermit/ckermit70.html#x1.23
+ 467. http://www.columbia.edu/kermit/ckermit70.html#x4.7
+ 468. http://www.columbia.edu/kermit/ckb2.htm
+ 469. http://www.columbia.edu/kermit/ckb2.htm
+ 470. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 471. http://www.columbia.edu/kermit/ckb2.htm
+ 472. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 473. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 474. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5
+ 475. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 476. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 477. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 478. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 479. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 480. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5
+ 481. http://www.columbia.edu/kermit/ckb2.htm
+ 482. http://www.columbia.edu/kermit/ckb2.htm
+ 483. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 484. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 485. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 486. http://www.columbia.edu/kermit/ckermit70.html#x7.10.11
+ 487. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 488. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 489. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 490. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 491. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 492. http://www.columbia.edu/kermit/ckermit70.html#x4.0.6
+ 493. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 494. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 495. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 496. http://www.columbia.edu/kermit/ckb2.htm
+ 497. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 498. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 499. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 500. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 501. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 502. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 503. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 504. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 505. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 506. http://www.columbia.edu/kermit/ckermit70.html#x1.11.5
+ 507. http://www.columbia.edu/kermit/ckermit70.html#x4.0.6
+ 508. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 509. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 510. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 511. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 512. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 513. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 514. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 515. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 516. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3
+ 517. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 518. http://www.columbia.edu/kermit/ckb2.htm
+ 519. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 520. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 521. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 522. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 523. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 524. http://www.columbia.edu/kermit/ckermit70.html#x4.18
+ 525. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 526. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 527. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 528. http://www.columbia.edu/kermit/ckermit70.html#x4.19
+ 529. http://www.columbia.edu/kermit/ckermit70.html#x4.16
+ 530. http://www.columbia.edu/kermit/ckermit70.html#x4.19
+ 531. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.3
+ 532. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 533. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.4
+ 534. http://www.columbia.edu/kermit/ckermit70.html#x4.22.2
+ 535. http://www.columbia.edu/kermit/ckermit70.html#x4.22.3
+ 536. http://www.columbia.edu/kermit/ckb2.htm
+ 537. http://www.columbia.edu/kermit/ckb2.htm
+ 538. http://www.columbia.edu/kermit/ckermit70.html#x9.3
+ 539. http://www.columbia.edu/kermit/ckermit70.html#x5.2.1
+ 540. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 541. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2
+ 542. http://www.columbia.edu/kermit/ckermit70.html#x6.6
+ 543. http://www.columbia.edu/kermit/ckermit70.html#xiii
+ 544. http://www.columbia.edu/kermit/ckermit70.html#xiii
+ 545. ftp://ftp.isi.edu/in-notes/rfc1489.txt
+ 546. ftp://ftp.isi.edu/in-notes/rfc2319.txt
+ 547. http://www.unicode.org/
+ 548. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 549. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.1
+ 550. ftp://ftp.isi.edu/in-notes/rfc2640.txt
+ 551. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 552. http://www.columbia.edu/kermit/ckermit70.html#x6.0
+ 553. http://www.columbia.edu/kermit/ckermit70.html#x6.5
+ 554. http://www.columbia.edu/kermit/ckermit70.html#x6.4
+ 555. http://www.columbia.edu/kermit/ckb2.htm
+ 556. http://www.columbia.edu/kermit/ckermit70.html#x4.21
+ 557. http://www.columbia.edu/kermit/ckermit70.html#x6.5
+ 558. http://www.columbia.edu/kermit/ckermit70.html#x2.8
+ 559. http://www.columbia.edu/kermit/ckermit70.html#x7.7
+ 560. http://www.columbia.edu/kermit/ckermit70.html#x7.2
+ 561. http://www.columbia.edu/kermit/ckermit70.html#x1.19
+ 562. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 563. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 564. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 565. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 566. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 567. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11
+ 568. http://www.columbia.edu/kermit/ckermit70.html#x2.10
+ 569. http://www.columbia.edu/kermit/ckermit70.html#ferrstring
+ 570. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5
+ 571. http://www.columbia.edu/kermit/ckermit70.html#x2.1.10
+ 572. http://www.columbia.edu/kermit/ckermit70.html#x9.1
+ 573. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 574. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 575. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 576. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 577. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 578. http://www.columbia.edu/kermit/ckermit70.html#x7.24
+ 579. http://www.columbia.edu/kermit/ckermit70.html#x7.24
+ 580. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3
+ 581. http://www.columbia.edu/kermit/ck90.html
+ 582. http://www.columbia.edu/kermit/ckermit70.html#x7.12
+ 583. http://www.columbia.edu/kermit/ckermit70.html#x7.9
+ 584. http://www.columbia.edu/kermit/ckb2.htm
+ 585. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 586. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 587. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 588. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 589. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 590. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.4
+ 591. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5
+ 592. http://www.columbia.edu/kermit/ckermit70.html#x7.8
+ 593. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 594. http://www.columbia.edu/kermit/ckb2.htm
+ 595. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 596. http://www.columbia.edu/kermit/ckermit70.html#x7.16
+ 597. http://www.columbia.edu/kermit/ckermit70.html#x7.9.1
+ 598. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 599. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 600. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 601. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 602. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 603. http://www.columbia.edu/kermit/ckermit70.html#x7.10.10
+ 604. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 605. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 606. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 607. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 608. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 609. http://www.columbia.edu/kermit/ckermit70.html#x7.10.11
+ 610. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 611. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3
+ 612. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 613. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2
+ 614. http://www.columbia.edu/kermit/ckb2.htm
+ 615. http://www.columbia.edu/kermit/ckermit70.html#x4.17.2
+ 616. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 617. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 618. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 619. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 620. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 621. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 622. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 623. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 624. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 625. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 626. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 627. http://www.columbia.edu/kermit/ckermit70.html#x9.3
+ 628. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 629. http://www.columbia.edu/kermit/ckb2.htm
+ 630. http://www.columbia.edu/kermit/ckermit80.html
+ 631. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 632. http://www.columbia.edu/kermit/ckermit70.html#x7.20.2
+ 633. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 634. http://www.columbia.edu/kermit/ckermit70.html#x7.10.9
+ 635. http://www.columbia.edu/kermit/ckermit70.html#x1.10
+ 636. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 637. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 638. http://www.columbia.edu/kermit/iksd.html
+ 639. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 640. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 641. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 642. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 643. http://www.columbia.edu/kermit/gkermit.html
+ 644. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 645. http://www.columbia.edu/kermit/gkermit.html
+ 646. http://www.columbia.edu/kermit/ckb2.htm
+ 647. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 648. mailto:kermit@columbia.edu
+ 649. http://www.columbia.edu/kermit/ckermit70.html#top
+ 650. http://www.columbia.edu/kermit/ckermit.html
+ 651. http://www.columbia.edu/kermit/index.html