ckermit2.txt
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:668k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. it "travels with the array".  To illustrate (continuing the previous example
  2. at the "close read" statement):
  3.   close read
  4.   if > %i fdim(&a) end 1 File has too many lines for array.
  5.   .&a[0] ::= %i - 1     ; Assign number of lines to &a[0].
  6.   echo File has &a[0] line(s).
  7.   sort /range:1:&a[0] &a
  8.   open write oofa.txt.sorted
  9.   if fail ...
  10.   for %i 1 &a[0] 1 {
  11.       writeln file &a[%j]
  12.       if fail end 1 Write error
  13.   }
  14.   close write
  15. Note the SORT switch, /RANGE:1:&a[0].  This keeps the sort 1-based, and uses
  16. element 0 of the array as its size indicator.
  17. Finally, note that even though some commands or functions might put a size
  18. in array element 0, no built-in functions or commands depend on a size
  19. actually being there.  Thus you are perfectly free to replace the size with
  20. something else and treat the array as 0-based.
  21. 7.10.9. Do-It-Yourself Arrays
  22. Kermit's &x[] arrays are nice because of the accompanying built-in
  23. functionality -- ARRAY commands, built-in functions that load and search
  24. arrays, automatic evaluation of arithmetic expressions within the subscript
  25. brackets, and so on.  Yet they also have certain limitations:
  26.  a. Except when created by dynamic loading (e.g. by ffiles()) they must
  27.     be declared and dimensioned in advance.
  28.  b. Indices must be numeric, positive, and in range.
  29.  c. There can be only one dimension.  Matrices or other higher-dimensioned
  30.     arrays are not available.
  31. But none of this is to say you can't invent any kind of data structure you
  32. like.  In Section 7.9.2 you can see some examples.  Here's another (courtesy
  33. of Dat Thuc Nguyen), in which a pair of matrices is created and then added: no
  34. dimensioning necessary.
  35.   .row = 4
  36.   .col = 9
  37.   ; MACRO TO PRINT A MATRIX
  38.   define PMATRIX {
  39.       echo Matrix %1:
  40.       for %r 1 m(row) 1 {
  41.   for %c 1 m(col) 1 {
  42.       xecho flpad(m(%1[%r][%c]),4)
  43.   }
  44.   echo
  45.       }
  46.       echo
  47.   }
  48.   ; CREATE MATRICES A AND B
  49.   for %r 1 m(row) 1 {
  50.       for %c 1 m(col) 1 {
  51.   _eval A[%r][%c] %r + %c
  52.   _eval B[%r][%c] %r * %c
  53.       }
  54.   }
  55.   ; CREATE MATRIX C = SUM OF MATRIX A AND MATRIX B
  56.   for %r 1 m(row) 1 {
  57.       for %c 1 m(col) 1 {
  58.   _eval C[%r][%c] m(A[%r][%c]) + m(B[%r][%c])
  59.       }
  60.   }
  61.   pmatrix A  ; Print Matrix A
  62.   pmatrix B  ; Print Matrix B
  63.   pmatrix C  ; Print Matrix C
  64. In the example, we use matrix-like notation to create macros with names
  65. like "A[1][1]", "B[3][7]", and so on.
  66. 7.10.10. Associative Arrays
  67. An associative array is a special kind of Do-It-Yourself array.  It differs
  68. from a regular array in that its indices need not be numbers -- they can be
  69. anything at all -- words, filenames, names of months, any character string at
  70. all, and that it doesn't have to be (and in fact can't be) declared.  An
  71. associative array element is simply a macro whose name ends with an index
  72. enclosed in angle brackets, for example:
  73.   file<oofa.txt>
  74. More formally:
  75.   basename<index>
  76. An associative array is a collection of all associative array elements that
  77. have the same basename.  Any number of associative arrays, each with any
  78. number of elements, can exist at the same time.
  79. An associative array element can be assigned a value, such as "1", just like
  80. any other macro:
  81.   define file<oofa.txt> 1     ; Give "file<oofa.txt>" the value "1".
  82. or:
  83.   assign file<oofa.txt> %a   ; Give it the value of the variable %a.
  84. However, since an associative array element is a macro, it may not have an
  85. empty (null) value, since assigning an empty value to a macro undefines the
  86. macro.
  87. You can refer to the value of an associative array element using the familiar
  88. notation for macro values:
  89.   echo m(file<oofa.txt>)     ; Echo the value of "file<oofa.txt>".
  90. Associative arrays are most useful, however, when the value of the index is
  91. a variable.  In that case, you must use the "hidden" forms of the DEFINE or
  92. ASSIGN commands that evaluate the macro name before making the assignment (see
  93. "Using C-Kermit", page 457).  Example:
  94.   define %f oofa.txt
  95.   _define file<%f> 1
  96.   echo file<%f> = m(file<%f>)
  97. prints:
  98.   file<oofa.txt> = 1
  99. and then:
  100.   _increment file<%f>
  101.   echo file<%f> = m(file<%f>)
  102. prints:
  103.   file<oofa.txt> = 2
  104. What are associative arrays good for?  The classic example is "word counts":
  105. finding the number of times each word is used in a text without knowing in
  106. advance what the words are.  Without associative arrays, your program would
  107. have to build a table of some kind, and every time a word was encountered,
  108. look it up in the table to find its position and counter, or add it to the
  109. table if it wasn't found -- a time-consuming and laborious process.
  110. Associative arrays, however, let you use the word itself as the table index
  111. and therefore sidestep all the table building and lookups.
  112. Let's work through a practical example.  Suppose you have a file-transfer log
  113. in which each line is composed of a number of blank-separated fields, and the
  114. 9th field is a filename (which happens to be the format of certain FTP server
  115. logs, as well as of C-Kermit's new FTP-format transaction log, described in
  116. Section 4.17.2), for example:
  117.   Wed Jul 14 09:35:31 1999 22 xx.mit.edu 13412 /pub/ftp/mm/intro.txt ....
  118. and you want to find out how many times each file was transferred.  The
  119. following code builds an associative array, file<>, containing the counts for
  120. each file:
  121.   local name line max %c %n          ; Declare local variables
  122.   fopen /read %c /var/log/ftpd.log    ; Open the log file (Section 1.22)
  123.   if fail exit 1 Can't open log        ; Check
  124.   while true {                         ; Loop for each record
  125.       fread /line %c line             ; Read a line
  126.       if fail break                    ; Check for end of file
  127.       .name := fword(m(line),9,{ })  ; Get 9th field = filename (Sec 7.3)
  128.       _increment file<m(name)>        ; Increment its counter (Sec 7.9.2)
  129.   }
  130.   fclose %c                           ; Close file when done.
  131. Note that _INCREMENT (and INCREMENT, and [_]DECREMENT) treat an empty (i.e.
  132. nonexistent) variable as having a value of 0, and therefore creates the
  133. variable with a value of 1.
  134. At this point, if you told Kermit to "show macro file<", it would list the
  135. associative array.  But since you don't necessarily know the names of the
  136. files in the array, or even how many elements are in the array, how can you
  137. use it in a script program?
  138. The idea of creating macro names that include character-string indices
  139. enclosed in angle brackets is perfectly arbitrary and doesn't depend on any
  140. Kermit features that weren't already there -- we could just as easily have
  141. used some other notation, such as "file[index]", "file:index", or
  142. "file.index", and the code above would have worked just as well (with the
  143. corresponding syntax adjustments).  But to be able to use an associative array
  144. in a program after the array is built, we need a method of accessing all its
  145. elements without knowing in advance what they are.  That's where the chosen
  146. notation comes in.
  147. First of all, any macro name that ends with "<xxx>" (where "xxx" is any
  148. string) is case sensitive, unlike all other macro names, which are case
  149. independent.  To illustrate, "file<oofa.txt>" and "file<OOFA.TXT>" are two
  150. distinct macros, whereas "OOFA", "Oofa", and "oofa", when used as macro names,
  151. are all the same.
  152. Second, the new faaconvert() function converts an associative array (that is,
  153. all macros with names of the form "base<index>" that have the same "base"
  154. part) into a pair of regular arrays and returns the number of elements:
  155.   faaconvert(name,&a[,&b])
  156. "name" is the name of the associative array, without the angle brackets or
  157. index ("file" in our example).
  158. The second argument is the name of a regular array in which to store the
  159. indices of the associative array (filenames in our example); if an array of
  160. this name already exists, it is destroyed unless the array is LOCAL.  The
  161. third argument is the name of another regular array in which to store the
  162. values (the counts in our example), with the same rules about array name
  163. collisions.  If you care only about the indices and not the values, you can
  164. omit the third argument to faaconvert().  In any case, the associative array
  165. is converted, not copied: its elements are moved to the specified regular
  166. arrays, so after conversion the original associative array is gone.
  167. As with other array-loading functions, faaconvert() sets element 0 of each
  168. array to the number of elements in the array.
  169. To continue our example:
  170.   .max := 0                                   ; Maximum count
  171.   .%n := faaconvert(file,&a,&b)             ; Convert
  172.   for %i 1 %n 1 {                           ; Loop through values
  173.       echo flpad(%i,3). &a[%i]: &b[%i]  ; Echo this pair
  174.       if ( > &b[%i] m(max) ) {             ; Check for new maximum
  175.           .name := &a[%i]
  176.           .max  := &b[%i]
  177.       }
  178.   }
  179.   echo Most popular file: m(name), accesses: m(max)
  180. This lists the files and counts and then announces which file has the highest
  181. count.
  182. Now suppose you want to sort the array pair created from an associative array.
  183. In our example, &a[] contains filenames, and &b[] contains the associated
  184. counts.  Here we take advantage of the ARRAY SORT command's ability to sort a
  185. second array according to the first one:
  186.   array sort /reverse /numeric &b &a          ; Descending sort by count
  187. Now to see the top five files and their counts:
  188.   echo The top 5 files are:
  189.   for %i 1 5 1 {                             ; Loop through top 5 values
  190.       echo flpad(%i,3). &a[%i]: &b[%i]  ; Echo this pair
  191.   }
  192. 7.10.11. Transferring Array Contents to Other Computers
  193. The SEND /ARRAY:arrayname command (Section 4.7.1) allows you to send the
  194. contents of any array, or any contiguous segment of it, in either text or
  195. binary mode to another computer, using Kermit protocol.  When used in
  196. conjunction with C-Kermit's other features (the array features described in
  197. this section; the file i/o package from Section 1.22; its decision-making,
  198. pattern-matching, and string manipulation capabilities, and so on) the
  199. possibilities are endless: extracts of large files, remote database queries,
  200. ..., all without recourse to system-dependent mechanisms such UNIX pipes and
  201. filters, thus ensuring cross-platform portability of scripts that use these
  202. features.
  203. When sending an array in text mode, Kermit appends a line terminator to each
  204. array element, even empty ones, and it also converts the character set from
  205. your current FILE character-set to your current TRANSFER character-set, if
  206. any.  No conversions are made or line terminations added in binary mode.  For
  207. example, the following array:
  208.   dcl &a[] = One Two Three Four Five Six
  209. is sent as six lines, one word per line, in text mode, and as the bare
  210. unterminated string "OneTwoThreeFourFiveSix" in binary mode.
  211. You should always include a /TEXT or /BINARY switch in any SEND /ARRAY command
  212. to force the desired transfer mode, otherwise you're likely to be surprised
  213. by the effects described in Section 4.3.
  214. Here are some examples:
  215. send /text /array:&a[]
  216.   Sends the entire contents of the array &a[] in text mode.  Since an
  217.   as-name is not included, the receiver is told the filename is _array_a_.
  218. send /text /array:&a[]
  219. send /text /array:a[]
  220. send /text /array:&a
  221. send /text /array:a
  222.   These are all equivalent to the previous example.
  223. send /text /array:&a /as-name:foo.bar
  224.   As above, but the array is sent under the name foo.bar.
  225. send /text /array:&a[100:199] /as:foo.bar
  226.   As above, but only the elements from 100 through 199 are sent.
  227. In text-mode transfers, character sets are translated according to your
  228. current settings, just as for text files.  In binary mode, of course, there
  229. is no character-set translation or other conversion of any kind.  But
  230. remember that array elements can not contain the NUL (ASCII 0) character,
  231. since they are implemented as NUL-terminated strings.
  232. Here's an example that shows how to send all the lines (up to 1000 of them)
  233. from a file animals.txt that contain the words "cat", "dog", or "hog" (see
  234. section 4.9 about pattern matching):
  235.   declare &a[1000]
  236.   fopen /read %c animals.txt
  237.   if fail exit 1
  238.   .%i = 0
  239.   while true {
  240.       fread %c line
  241.       if fail break
  242.       if match {m(line)} {*{cat,[dh]og}*} {
  243.           increment %i
  244.           if ( > %i fdim(&a) ) break
  245.           .&a[%i] := m(line)
  246.       }
  247.   }
  248.   fclose %c
  249.   send /array:a[1:%i] /text
  250. Note that we are careful to send only the part of the array that was filled,
  251. not the entire array, because there are likely to be lots of unused elements
  252. at the end, and these would be sent as blank lines otherwise.
  253. This example raises an interesting question: what if we want to send ALL the
  254. matching lines, even if there are more than 1000 of them, but we don't know
  255. the number in advance?  Clearly the problem is limited by Kermit's (and the
  256. computer's) memory.  If there are a thousand trillion matching lines, they
  257. most likely will not fit in memory, and in this case the only solution is to
  258. write them first to a temporary file on mass storage and then send the
  259. temporary file and delete it afterwards.
  260. However, when the selection is likely to fit in memory, the once-familiar
  261. technique of initial allocation with extents can be used:
  262.       if match {m(line)} {*{cat,[dh]og}*} {
  263.           increment %i
  264.   if ( > %i fdim(&a) ) {
  265.       array resize a fdim(&a)+100
  266.       if fail stop 1 MEMORY FULL
  267.       echo NEW DIMENSION: fdim(&a)
  268.   }
  269.           .&a[%i] := m(line)
  270.       }
  271. This grows the array in chunks of 100 as needed.
  272. 7.11. OUTPUT Command Improvements
  273. LINEOUT [ <text> ]
  274.   This command is exactly like OUTPUT, except it supplies a carriage return
  275.   at the end of the <text>.  "lineout exit" is exactly the same as
  276.   "output exit13".
  277. SET OUTPUT SPECIAL-ESCAPES { ON, OFF }
  278.   This command lets you tell C-Kermit whether to process N, L, and B
  279.   specially in an OUTPUT command, as distinct from other -sequences (such
  280.   as %a, 13, v(time), etc).  Normally the special escapes are handled.
  281.   Use SET OUTPUT SPECIAL-ESCAPES OFF to disable them.
  282. Disabling special escapes is necessary in situations when you need to transmit
  283. lines of data and you have no control over what is in the lines.  For example,
  284. a file oofa.txt that contains:
  285.   This is a file
  286.   It has %a variables in it
  287.   And it has B in it.
  288.   And it has L in it.
  289.   And it has N in it.
  290.   And this is the last line.
  291. can be sent like this:
  292.   local line
  293.   set output special-escapes off
  294.   fopen /read %c oofa.txt
  295.   if fail stop 1 Can't open oofa.txt
  296.   while success {
  297.       fread %c line
  298.       if fail break
  299.       ; Add filtering or processing commands here...
  300.       output m(line)13
  301.   }
  302. 7.12. Function and Variable Diagnostics
  303. In C-Kermit 6.0 and earlier, the only diagnostic returned by a failing
  304. function call was an empty value, which (a) could not be distinguished from
  305. an empty value returned by a successful function call; (b) did not give any
  306. indication of the cause of failure; and (c) did not cause the enclosing
  307. statement to fail.  C-Kermit 7.0 corrects these deficiencies.
  308. SET FUNCTION DIAGNOSTICS { ON, OFF }
  309.   when ON, allows built-in functions to return diagnostic messages when
  310.   improperly referenced, instead of an empty string.  FUNCTION DIAGNOSTICS are
  311.   ON by default.  When OFF, improperly referenced functions continue to return
  312.   an empty string.  This command also affects built-in variables; in this case,
  313.   an error message is returned only if the variable does not exist.  When
  314.   FUNCTION DIAGNOSTICS are ON, the error message is also printed.
  315. For variables, the only message is:
  316.   <ERROR:NO_SUCH_VARIABLE:v(name)>
  317. where "name" is the name of the nonexistent variable.
  318. For functions, the diagnostic message is:
  319.   <ERROR:message:fname()>
  320. where "message" is replaced by a message, and "name" is replaced by the
  321. function name, e.g. <ERROR:ARG_NOT_NUMERIC:fmod()>.  Messages include:
  322.   ARG_BAD_ARRAY       An argument contains a malformed array reference.
  323.   ARG_BAD_DATE        An argument contains a malformed date and/or time.
  324.   ARG_BAD_PHONENUM    An argument contains a malformed telephone number.
  325.   ARG_BAD_VARIABLE    An argument contains a malformed %x variable.
  326.   ARG_INCOMPLETE      An argument is incomplete (e.g. a broken Base64 string).
  327.   ARG_EVAL_FAILURE    An argument could not be evaluated (internal error).
  328.   ARG_NOT_ARRAY       An argument references an array that is not declared.
  329.   ARG_NOT_NUMERIC     An argument that must be integer contains non-digits.
  330.   ARG_NOT_FLOAT       An argument has bad floating-point number format.
  331.   ARG_NOT_VARIABLE    An argument that must be a variable is not a variable.
  332.   ARG_OUT_OF_RANGE    An argument's numeric value is too big or too small,
  333.                       or an argument contains illegal characters (e.g. a hex
  334.                       or Base-64 string).
  335.   ARG_TOO_LONG        An argument's value is too long.
  336.   ARRAY_FAILURE       Failure to create an array.
  337.   DIVIDE_BY_ZERO      Execution of the function would cause division by zero.
  338.   FLOATING_POINT_OP   Execution error in a floating-point operation.
  339.   FILE_NOT_FOUND      Filename argument names a file that can't be found.
  340.   FILE_NOT_READABLE   Filename argument is not a regular file.
  341.   FILE_NOT_ACCESSIBLE Filename argument names a file that is read-protected.
  342.   FILE_ERROR          Other error with filename argument.
  343.   FILE_NOT_OPEN       A file function was given a channel that is not open.
  344.   FILE_ERROR_-n       A file function got error -<n> (Section 1.22).
  345.   LOOKUP_FAILURE      Error looking up function (shouldn't happen).
  346.   MALLOC_FAILURE      Failure to allocate needed memory (shouldn't happen).
  347.   NAME_AMBIGUOUS      The function is not uniquely identified.
  348.   MISSING_ARG         A required argument is missing.
  349.   NO_SUCH_FUNCTION    An argument references a function that is not defined.
  350.   NO_SUCH_MACRO       An argument references a macro that is not defined.
  351.   RESULT_TOO_LONG     The result of a function is too long.
  352.   UNKNOWN_FUNCTION    Internal error locating function (shouldn't happen).
  353. Examples:
  354.   assign %m fmod()
  355.   ?<ERROR:MISSING_ARG:fmod()>
  356.   echo "fcontents(%m)"
  357.   "<ERROR:MISSING_ARG:fmod()>"
  358.   echo fmod(3,x)
  359.   ?<ERROR:ARG_NOT_NUMERIC:fmod()>
  360.   echo fmod(3,4-2*2)
  361.   ?<ERROR:DIVIDE_BY_ZERO:fmod()>
  362. Notice the use of fcontents() in echoing the value of a variable that
  363. contains a returned error message.  That's because the error message includes
  364. the name of the variable or function that failed, so you must use fcontents()
  365. to prevent it from being evaluated again -- otherwise the same error will
  366. occur.
  367. The handling of function and variable errors is controlled by:
  368. SET FUNCTION ERROR { ON, OFF }
  369.   Tells whether invalid function calls or variable references should cause
  370.   command errors.  FUNCTION ERROR is ON by default.  When ON, and an error is
  371.   diagnosed in a built-in function or variable, the command that includes the
  372.   function call or variable reference fails.  The failing command can be
  373.   handled in the normal way with IF FAILURE / IF SUCCESS, SET TAKE ERROR, or
  374.   SET MACRO ERROR.
  375. When FUNCTION DIAGNOSTICS is OFF, there is no error message.
  376. SHOW SCRIPTS displays the current FUNCTION DIAGNOSTICS and ERROR settings.
  377. 7.13. Return Value of Macros
  378. In C-Kermit 5A and 6.0, there are two ways to return one level from a macro:
  379. RETURN <value> and END <number> <text>.  When RETURN is used, the <value>,
  380. which can be a number or a text string, is assigned to v(return).  When
  381. END was used, however, v(return) was not set.  SUCCESS/FAILURE was set
  382. according to whether the <number> was zero, and the <text> was printed, but
  383. the actual value of the <number> was lost.
  384. In C-Kermit 7.0, the END <number> is available in the v(return) variable.
  385. 7.14. The ASSERT, FAIL, and SUCCEED Commands.
  386. The ASSERT command is just like the IF command, but without a command to
  387. execute.  It simply succeeds or fails, and this can be tested by a subsequent
  388. IF SUCCESS or IF FAILURE command.  Example:
  389.   ASSERT = 1 1
  390.   IF SUCCESS echo 1 = 1.
  391. The FAIL command does nothing, but always fails.
  392. The SUCCEED command does nothing, but always succeeds.
  393. These commands are handy in debugging scripts when you want to induce a
  394. failure (or success) that normally would not occur, e.g. for testing blocks
  395. of code that normally are not executed.
  396. 7.15. Using Alarms
  397. Alarms may be set in two ways:
  398.   SET ALARM <number>
  399.     Sets an alarm for the given number of seconds "from now", i.e. in the
  400.     future, relative to when the SET ALARM command was given.  Examples:
  401.       set alarm 60        ; 60 seconds from now
  402.       set alarm +60       ; The same as "60"
  403.       set alarm -60       ; Not legal - you can't set an alarm in the past.
  404.       set alarm 60*60     ; 60 minutes from now.
  405.       set alarm %a+10    ; You can use variables, etc.
  406.   SET ALARM <hh:mm:ss>
  407.     Sets an alarm for the specified time.  If the given time is earlier than
  408.     the current time, the alarm is set for the given time in the next day.
  409.     You may give the time in various formats:
  410.       set alarm 15:00:00  ; 3:00:00pm
  411.       set alarm 3:00:00pm ; 3:00:00pm
  412.       set alarm 3:00pm    ; 3:00:00pm
  413.       set alarm 3pm       ; 3:00:00pm
  414.   SHOW ALARM
  415.     Displays the current alarm, if any, in standard date-time format
  416.     (see Section 1.6): yyyymmdd hh:mm:ss.
  417.   IF ALARM <command>
  418.     Executes the <command> if an alarm has been set and the alarm time
  419.     has passed.
  420.   XIF ALARM { <command-list> } [ else { <command-list> } ]
  421.     Executes the <command-list> if an alarm has been set and the alarm time
  422.     has passed.  Otherwise, if an ELSE part is given, its command-list is
  423.     executed.
  424.   CLEAR ALARM
  425.     Clears the alarm.
  426. Only one alarm may be set at a time.
  427. Example: Suppose you have a script that is always running, and that transfers
  428. files periodically, and that keeps a transaction log.  Suppose you want to
  429. start a new transaction log each day:
  430.   log transactions v(date).log
  431.   set alarm 00:00:00                     ; Set an alarm for midnight
  432.   while true {                           ; Main script loop
  433.       xif alarm {                        ; If the alarm time is past...
  434.           close transactions             ; Close current log
  435.           log transactions v(date).log  ; Start new one
  436.           pause 1                        ; To make sure 00:00:00 is past
  437.           set alarm 00:00:00             ; Set a new alarm
  438.       }
  439.       ; put the rest of the script here...
  440.   }
  441. Note that IF ALARM -- no matter whether it succeeds or fails -- does NOT
  442. clear an expired alarm.  Thus, once an alarm has expired, every IF ALARM will
  443. succeed until the alarm is cleared (with the CLEAR ALARM command) or reset
  444. with a new SET ALARM command.
  445. 7.16. Passing Arguments to Command Files
  446. Beginning in version 7.0, C-Kermit accepts arguments on the TAKE command line,
  447. for example:
  448.   C-Kermit> take oofa.ksc one two {this is three} four
  449. This automatically sets the variables %1 through %9 to the arguments,
  450. and %0 to the name of the file, in this case:
  451.   %0 = /usr/olga/oofa.ksc
  452.   %1 = one
  453.   %2 = two
  454.   %3 = this is three
  455.   %4 = four
  456. and %5..%9 are undefined (empty).  Arguments past the ninth are available in
  457. the &_[] argument-vector array (Section 7.5).
  458. The variables are those at the current macro level.  Thus, if the TAKE command
  459. is executed from within a macro, the macro's arguments are replaced by those
  460. given on the TAKE command line (but only if at least one argument is given).
  461. The command shown above is exactly equivalent to:
  462.   assign %0 /usr/olga/oofa.ksc
  463.   assign %1 one
  464.   assign %2 two
  465.   assign %3 this is three
  466.   assign %4 four
  467.   assign %5
  468.   assign %6
  469.   assign %7
  470.   assign %8
  471.   assign %9
  472.   take oofa.ksc
  473. Remember, the variables %0..%9 are on the macro call stack, and command
  474. files are independent of the macro stack.  Thus, if a command file TAKEs
  475. another command file and passes arguments to it, the variables are changed
  476. from that point on for both files, and so forth for all levels of nested
  477. command files without intervening macro invocations.
  478. It would have been possible to change C-Kermit to use the overall command
  479. stack, rather than the macro stack, for arguments -- this would have made
  480. TAKE work exactly like DO, which is "nicer", but it would also have broken
  481. countless existing scripts.  However, the new SHIFT command (Section 7.5)
  482. makes it possible to create an alternative TAKE command that does indeed
  483. save and restore the argument variables at its own level around execution
  484. of a command file:
  485.   define mtake {
  486.      local %f
  487.      assign %f fcontents(%1)
  488.      shift
  489.      take %f
  490.   }
  491. C-Kermit 7.0 also supports a new, easier way to pass arguments to scripts
  492. from the system command line:
  493.   kermit filename arg1 arg2 arg3 ...
  494. in which arg1, arg2, arg3 (etc) are arguments for the script (whose filename
  495. is given), and are assigned to %1, %2, ... %9.  The filename is assigned to
  496. %0.  This applies equally to "Kerbang" scripts in UNIX (Section 7.19).
  497. For example, suppose you have a file called "showargs" containing the
  498. following lines:
  499.   #!/usr/local/bin/kermit +
  500.   echo Hello from %0
  501.   show args
  502.   exit
  503. (except not indented, since the "#!" line must be on the left margin).  If
  504. you give this file execute permission:
  505.   chmod +x showargs
  506. then you can run it exactly as you would run a UNIX shell script, e.g.:
  507.   $ showargs one two three
  508. $ x one two three
  509. Hello from /usr/olga/showargs
  510. Top-level arguments (v(argc) = 4):
  511.  &_[0] = /usr/olga/showargs
  512.  &_[1] = one
  513.  &_[2] = two
  514.  &_[3] = three
  515. Furthermore, the &_[] array now contains the filename, if one was given as
  516. the first command line argument, or it is a "Kerbang" script, in element 0.
  517. Otherwise element 0 is program name, and elements 1 through v(argc)-1 contain
  518. the command-line arguments, if any, that appear after "--" or "=", if any.
  519. This array is saved and restored around macro calls; recall that inside macros
  520. it contains the macro argument vector (allowing you to access arguments
  521. programmatically, and to have more than 9 of them).
  522. At top level, notice the difference between the &@[] and &_[] arrays.  The
  523. former includes C-Kermit options; the latter omits them.
  524. 7.17. Dialogs with Timed Responses
  525. The ASK, ASKQ, GETOK, and GETC commands (let's call them the "ASK-class
  526. commands") let you write scripts that carry on dialogs with the user, asking
  527. them for text, a Yes/No answer, or a character, respectively.  Prior to
  528. C-Kermit 7.0, these questions would always wait forever for an answer.  In
  529. C-Kermit 7.0, you may specify a time limit for them with the new command:
  530. SET ASK-TIMER number
  531.   Sets a time-limit on ASK-CLASS commands to the given number of seconds.
  532.   If the number is 0 or less, there is no time limit and these commands wait
  533.   forever for a response.  Any timer that is established by this command
  534.   remains in effect for all future ASK-class commands until another SET
  535.   ASK-TIMER command is given (e.g. with a value of 0 to disable ASK timeouts).
  536. An ASK-class command that times out returns a failure status.  You can test
  537. explicitly for a timeout with:
  538.   IF ASKTIMEOUT <command>
  539. 7.18. Increased Flexibility of SWITCH Case Labels
  540. Prior to C-Kermit 7.0 / K95 1.1.18, the case labels in SWITCH statements
  541. were string constants.
  542. Now case labels can be variables, function calls, or any mixture of these
  543. with each other and/or with regular characters.
  544. Furthermore, after the case label is evaluated, it is treated not as a string
  545. constant, but as a pattern against which the SWITCH variable is matched
  546. (Section 4.9.1).
  547. This introduces a possible incompatibility with previous releases, since
  548. the following characters in case labels are no longer taken literally:
  549.    * ? [ {
  550. Any scripts that previously included any of these characters in case labels
  551. must now quote them with backslash ().
  552. 7.19. "Kerbang" Scripts
  553. In UNIX only, Kermit scripts can be stored in files and run "directly",
  554. without starting Kermit first (as noted on page 467 of the manual), just as a
  555. shell script can be "run" as if it were a program.  This section amplifies on
  556. that idea a bit, and presents some new aspects of version 7.0 that make it
  557. easier to write and run Kermit scripts directly.
  558.   NOTE: On non-UNIX platforms, such as VMS or Windows, Kerbang scripts can
  559.   be run as "kermit + scriptfilename arg1 arg2 arg3 ...".  Windows 95/98/NT
  560.   file associations do not allow for the passing of parameters.  In VMS,
  561.   however, you can achieve the Kerbang effect by defining a symbol, as
  562.   in this example:
  563.     $ autotelnet :== "$SYS$TOOLS:KERMIT.EXE + AUTOTELNET.KSC"
  564.   and then running the script like any other command:
  565.     $ autotelnet xyzcorp.com myuserid
  566.   See section 9.3 for an explanation of the "+" symbol.
  567. UNIX shell scripts can specify which shell should run them by including a
  568. "shebang" line at the top, e.g.:
  569.   #!/bin/sh
  570. (but not indented; the shebang line must be on the left margin).  The term
  571. "shebang" is a contraction of "shell" and "bang".  "Bang" is a slang word for
  572. the exclamation mark ("!"); "shebang" itself is an American slang word used in
  573. in the phrase "the whole shebang".
  574. We can run Kermit scripts directly too, by including a "shebang" line that
  575. names Kermit as the "shell"; thus we call these "Kerbang" scripts.  This
  576. mechanism has been considerably simplified in C-Kermit 7.0 to facilitate
  577. C-Kermit's use a scripting tool just like any of the UNIX shells or scripting
  578. languages.  The rules are the same as for shell scripts:
  579.  a. The first line of the Kermit script must begin with "#!" immediately
  580.     followed by the full pathname of the program that will execute the
  581.     script (in this case, C-Kermit rather than a UNIX shell), followed by
  582.     any Kermit command-line options.  To suppress execution of the C-Kermit
  583.     initialization file and to make command line arguments available to the
  584.     script, the final option should be "+":
  585.     #!/usr/local/bin/kermit +
  586.     Some users have reported that in some circumstances a space might be
  587.     necessary after the plus sign; this depends on your shell -- it has
  588.     nothing to do with Kermit.  In most cases, no space is needed.
  589.  b. The file must have execute permission (granted via "chmod +x <filename>").
  590. When C-Kermit is invoked from a Kerbang script (or from the system prompt
  591. with a "+" command-line argument, which amounts to the same thing), the
  592. following special rules apply:
  593.  a. The C-Kermit initialization file is NOT executed automatically.  If you
  594.     want it to be executed, include a TAKE command for it in the script,
  595.     e.g.  "take v(home).kermrc".  (In previous releases, the initialization
  596.     file was always executed, with no way to prevent it except for the user
  597.     to include Kermit-specific command line options which had nothing to do
  598.     with the script).  Many scripts have no need for the standard Kermit
  599.     initialization file, which is quite lengthy and not only delays startup
  600.     of the script, but also spews forth numerous messages that are most
  601.     likely unrelated to the script.
  602.  b. If the initialization file is not executed, neither is your customization
  603.     file, since the initialization file is the command file from which the
  604.     customization file is TAKEn.  Again, you can include a TAKE command for
  605.     the initialization file if desired, or for the customization file by
  606.     itself, or for any other file.
  607.  c. C-Kermit does not process command-line arguments at all.  Instead, it
  608.     passes all words on the command line after the "+" to the script as %0
  609.     (the script name), %1..%9 (the first nine arguments), as well as in
  610.     the argument vector array &_[].  The variable v(argc) is set to the
  611.     total number of "words" (as passed by the shell to Kermit) including the
  612.     script name.  Quoting and grouping rules are those of the shell.
  613.  d. At any point where the script terminates, it must include an EXIT
  614.     command if you want it to exit back to the shell; otherwise C-Kermit
  615.     enters interactive prompting mode when the script terminates.  The EXIT
  616.     command can include a numeric status to be returned to the shell (0, 1,
  617.     etc), plus an optional message.
  618. Here is a simple Kerbang script that prints its arguments:
  619.   #/usr/local/bin/kermit +
  620.   echo Hello from %0
  621.   for %i 0 v(argc)-1 1 {
  622.       echo %i. "&_[%i]"
  623.   }
  624.   exit 0
  625. Save this file as (say) "showargs", then give it execute permission and
  626. run it (the &_[] array is the same as %0..%9, but allows you to refer
  627. to argument variables programmatically; see Section 7.5).  (Yes, you could
  628. substitute SHOW ARGUMENTS for the loop.)
  629.   $ chmod +x showargs
  630.   $ ./showargs one "this is two" three
  631. The script displays its arguments:
  632.   Hello from /usr/olga/showargs
  633.   0. "/usr/olga/showargs"
  634.   1. "one"
  635.   2. "this is two"
  636.   3. "three"
  637.   $
  638. Notice that no banners or greetings are printed and that startup is
  639. instantaneous, just like a shell script.  Also notice that grouping of
  640. arguments is determined by *shell* quoting rules, not Kermit ones, since
  641. the command line is parsed by the shell before Kermit ever sees it.
  642. Of course you can put any commands at all into a Kerbang script.  It can
  643. read and write files, make connections, transfer files, anything that Kermit
  644. can do -- because it *is* Kermit.  And of course, Kerbang scripts can also
  645. be executed from the Kermit prompt (or from another script) with a TAKE
  646. command; the Kerbang line is ignored since it starts with "#", which is a
  647. comment introducer to Kermit just as it is to the UNIX shell.  In VMS and
  648. other non-UNIX platforms, the Kerbang line has no effect and can be omitted.
  649. It might be desireable for a script to know whether it has been invoked
  650. directly from the shell (as a Kerbang script) or by a TAKE command given to
  651. the Kermit prompt or in a Kermit command file or macro.  This can be done
  652. as in this example:
  653.   #!/usr/local/bin/kermit +
  654.   assign %m fbasename(%0)
  655.   define usage { exit 1 {usage: %m <phonenumber> <message>} }
  656.   define apage { (definition of APAGE...) } ; (See book pp.454-456)
  657.   xif equal "%0" "v(cmdfil)" {
  658.       if not def %1 usage
  659.       if not def %2 usage
  660.       apage {%1} {%2}
  661.       exit v(status)
  662.   }
  663. In a Kerbang script, %0 and v(cmdfile) are the same; both of them are the
  664. name of the script.  When a script is invoked by a Kermit TAKE command, %0 is
  665. the name of the Kermit program, but v(cmdfile) is the name of the script.  In
  666. the example above, a macro called APAGE is defined.  If the script was invoked
  667. directly, the APAGE macro is also executed.  Otherwise, it is available for
  668. subsequent and perhaps repeated use later in the Kermit session.
  669. An especially handy use for Kerbang scripts is to have the initialization file
  670. itself be one.  Since the standard initialization file is rather long and
  671. time-consuming to execute, it is often overkill if you want to start Kermit
  672. just to transfer a file.  Of course there are command-line switches to
  673. suppress initialization-file execution, etc, but another approach is to "run"
  674. the initialization file when you want its features (notably the services
  675. directory), and run C-Kermit directly when you don't.  A setup like this
  676. requires that (a) the C-Kermit initialization file is configured as a Kerbang
  677. script (has #!/path.../kermit as first line), has execute permission, and is
  678. in your PATH; and (b) that you don't have a .kermrc file in your login
  679. directory.
  680. 7.20. IF and XIF Statement Syntax
  681. The IF command has been improved in two significant ways in C-Kermit 7.0,
  682. described in the following subsections.  All changes are backwards compatible.
  683. 7.20.1. The IF/XIF Distinction
  684. The distinction between IF and XIF is no longer important as of C-Kermit 7.0.
  685. You should be able to use IF in all cases (and of course, also XIF for
  686. backwards compatibility).  In the past, IF was used for single-command THEN
  687. parts, followed optionally by a separate ELSE command:
  688.   IF <condition> <command1>  ; THEN part
  689.   ELSE <command2>            ; ELSE part
  690. whereas XIF was required if either part had multiple commands:
  691.   XIF <condition> { command, command, ... } ELSE { command, command, ... }
  692. The syntactic differences were primarily that IF / ELSE was two commands on
  693. two separate lines, whereas XIF was one command on one line, and that XIF
  694. allowed (and in fact required) braces around its command lists, whereas IF
  695. did not allow them.
  696. Furthermore, the chaining or nesting of parts and conditions was inconsistent.
  697. For example, the IF command could be used like this:
  698.   IF <condition> <command>
  699.   ELSE IF <condition> <command>
  700.   ELSE IF <condition> <command>
  701.   ELSE IF <condition> <command>
  702.   ...
  703. but XIF could not.  C-Kermit 7.0 accepts the old syntax and executes it the
  704. same as previous versions, but also accepts a new unified and more convenient
  705. syntax:
  706.   IF <condition> <command-list> [ ELSE <command-list> ]
  707. or:
  708.   IF <condition> <command-list>
  709.   ELSE <command-list>
  710. in which the ELSE part is optional, and where <command-list> can be a single
  711. command (with or without braces around it) or a list of commands enclosed in
  712. braces.  Examples:
  713. Example 1:
  714.   IF <condition> { command1, command2 } ELSE { command3, command4 }
  715. Example 2 (same as Example 1):
  716.   IF <condition> {
  717.      command1
  718.      command2
  719.   } ELSE {
  720.      command3
  721.      command4
  722.   }
  723. Example 3 (same as 1 and 2):
  724.   IF <condition> {
  725.      command1
  726.      command2
  727.   }
  728.   ELSE { command3, command4 }
  729. Example 4 (same as 1-3):
  730.   IF <condition> {
  731.      command1
  732.      command2
  733.   }
  734.   ELSE {
  735.      command3
  736.      command4
  737.   }
  738. Example 5 (ELSE can be followed by another command):
  739.   IF <condition> {
  740.      command1
  741.      command2
  742.   } ELSE IF <condition> {
  743.      command3
  744.      command4
  745.   } ELSE {
  746.      command5
  747.      command6
  748.   }
  749. Example 5 suggests other possibilities:
  750.   IF <condition> {
  751.      command1
  752.      command2
  753.   } ELSE FOR <variable> <initial> <final> <increment> {
  754.      command3
  755.      command4
  756.   }
  757. And this too is possible, except for some non-obvious quoting considerations:
  758.   dcl &a[6] = one two three four five six
  759.   IF < %n 3 {
  760.       echo \%n is too small: %n
  761.   } ELSE FOR \%i 1 \%n 1 {
  762.       echo \%i. \&a[\%i]
  763.   }
  764. (The loop variable must be quoted in this context to prevent premature
  765. evaluation.)
  766. 7.20.2. Boolean Expressions (The IF/WHILE Condition)
  767. Prior to C-Kermit 7.0, the IF and WHILE commands accepted only a single
  768. Boolean ("true or false") assertion, e.g. "if > %m 0 <command>" or "if exist
  769. <filename> <command>".  There was no way to form Boolean expressions and, in
  770. particular, nothing that approached a Boolean OR function (AND could be
  771. simulated by concatenating IF statements: "if <condition1> if <condition2>..").
  772. C-Kermit 7.0 (and K95 1.1.18) allow grouping of Boolean assertions using
  773. parentheses and combining them using AND (or &&) and OR (or ||).  Each of
  774. these operators -- including the parentheses -- is a field and must be set off
  775. by spaces.  AND has higher precedence than OR, NOT has higher precedence than
  776. AND, but parentheses can be used to force any desired order of evaluation.
  777. The old syntax is still accepted.
  778. Here are some examples:
  779.   define %z 0                          ; Define some variables
  780.   define %n 1                          ; for use in the examples.
  781.   if > %n %z echo %n is greater.     ; Original format - still accepted.
  782.   if ( > %n %z ) echo %n is greater. ; Parentheses may be used in 7.0.
  783.   if ( > %n %z && not = %z 0 ) ...   ; Two assertions combined with AND.
  784.   if ( > %n %z and not = %z 0 ) ...  ; Same as previous ("and" = "&&").
  785.   if ( > %n %z || not = %z 0 ) ...   ; Two assertions combined with OR.
  786.   if ( > %n %z or not = %z 0 ) ...   ; Same as previous ("or" = "||").
  787.   if ( > %n %z || != %z 0 ) ...      ; Ditto ("!=" = "not =").
  788.   while ( 1 ) { ... }                   ; Just like C.
  789. Notice the spaces around all operators including the parentheses -- these
  790. are required.  The following examples show how parentheses can be used to
  791. alter the precedence of the AND and OR operators:
  792.   if ( false || false && false || true ) ,..         ; True
  793.   if ( false || ( false && false ) || true ) ...     ; Same as previous
  794.   if ( ( false || false ) && ( false || true ) ) ... ; False
  795. Similarly for NOT:
  796.   if ( not true && false ) ...          ; False (NOT binds to TRUE only)
  797.   if ( ( not true ) && false ) ...      ; Same as previous
  798.   if ( not ( true && false ) ) ...      ; True (NOT binds to (TRUE && FALSE))
  799. Notes:
  800.  a. The syntax of the Boolean expression itself has not changed; each
  801.     expression begins with a keyword or token such as "EXIST", ">", or
  802.     "=", etc; operators such as "<", "=", and ">" do not go between their
  803.     operands but precede them as before; this might be called "reverse
  804.     reverse Polish notation"; it allows deterministic on-the-fly parsing
  805.     of these expressions at the C-Kermit> prompt as well as in scripts, and
  806.     allows ?-help to be given for each item when IF or WHILE commands are
  807.     typed at the prompt.
  808.  b. Parentheses are required when there is more than one Boolean assertion.
  809.  c. Parentheses are not required, but are allowed, when there is only one
  810.     Boolean assertion.
  811.  d. Evaluation of Boolean assertions occurs left to right, but the resulting
  812.     Boolean expression is evaluated afterwards according to the rules of
  813.     precedence.  All Boolean assertions are always evaluated; there is no
  814.     "early stopping" property and therefore no question about when or if
  815.     side effects will occur -- if any Boolean assertion has side effects,
  816.     they will always occur.
  817. Constructions of arbitrary complexity are possible, within reason.
  818. Also see Section 7.4 for new IF / WHILE conditions.
  819. 7.21. Screen Formatting and Cursor Control
  820. C-Kermit 7.0 adds a simple way to create formatted screens, the SCREEN
  821. command:
  822. SCREEN { CLEAR, CLEOL, MOVE-TO row [ column ] }
  823.   Performs screen-formatting actions.  Correct operation of these commands
  824.   depends on proper terminal setup on both ends of the connection -- mainly
  825.   that the host terminal type is set to agree with the kind of terminal or
  826.   the emulation you are viewing C-Kermit through.  The UNIX version uses
  827.   terminfo or termcap (not curses); the VMS version uses SMG; K-95 uses its
  828.   built in screen manager.
  829. SCREEN CLEAR
  830.   Moves the cursor to home position and clears the entire screen.
  831.   Synonyms: CLEAR COMMAND-SCREEN ALL (K-95 only), CLS, CLEAR SCREEN.
  832. SCREEN CLEOL
  833.   Clears from the current cursor position to the end of the line.
  834.   Synonym: CLEAR COMMAND-SCREEN EOL (K-95 only)
  835. SCREEN MOVE-TO row column
  836.   Moves the cursor to the indicated row and column.  The row and column
  837.   numbers are 1-based, so on a 24x80 screen the home position is 1 1 and
  838.   the lower right corner is 24 80.  If a row or column number is given that
  839.   too large for what Kermit or the operating system thinks is your screen
  840.   size, the appropriate number is substituted.
  841. These escape sequences used by these commands depends on the platform.
  842. In UNIX, your TERM environment variable is used to query the terminfo/termcap
  843. database; if the query fails, ANSI/VT100 sequences are used.  In VMS, the
  844. SMG library is used, which sends sequences based on your VMS terminal type.
  845. K95 does its own screen control.  On other platforms (such as AOS/VS, VOS,
  846. etc), screen formatting is not supported, and the SCREEN command does nothing.
  847. The three SCREEN actions can be used in scripts to produce menus, formatted
  848. screens, dynamic displays, etc.  Related variables include:
  849.   v(terminal)     The type terminal C-Kermit thinks you have.
  850.   v(rows)         The number of rows C-Kermit thinks your terminal has.
  851.   v(columns)      The number of columns C-Kermit thinks your terminal has.
  852. And functions:
  853.   fscrncurx()     The current X coordinate of the cursor (K-95 only).
  854.   fscrncury()     The current Y coordinate of the cursor (K-95 only).
  855.   fscrnstr(x,y,n) The string of length n at position (x,y) (K-95 only).
  856. And commands:
  857.   ECHO string      Writes string + CRLF at the current cursor position.
  858.   XECHO string     Writes string at current cursor position; CRLF not supplied.
  859.   GETC v prompt    Issues prompt, reads one character into variable v, no echo.
  860. And special characters:
  861.   Ctrl-L           At the C-Kermit> command prompt, or in a C-Kermit command,
  862.                    works like Return or Enter, but also clears the screen
  863. Example 1: A macro that prints a message %1 at cursor position (%2,%3):
  864.   define MSG {
  865.       if not def %3 def %3 0             ; Default column to 0
  866.       if > v(argc) 2 screen move %2 %3  ; Move to given row/col (if any)
  867.       screen cleol                         ; Clear to end of line
  868.       if def %1 xecho fcontents(%1)     ; Print message (if any)
  869.   }
  870. Example 2: A macro put the cursor on the bottom screen line, left margin:
  871.   define BOT {
  872.       screen move v(rows) 0
  873.   }
  874. Example 3: A macro to center message %1 on line %2.
  875.   define CENTER {
  876.       if not def %2 def %2 1
  877.       .%x ::= (v(cols)-flen(%1))/2
  878.       msg {%1} {%2} {%x}
  879.   }
  880. Example 4: A simple menu (building on Examples 1-3):
  881.   def %c 0                             ; Menu choice variable
  882.   screen clear                          ; Clear the screen
  883.   center {Welcome to This Menu} 2       ; Display the menu
  884.   msg {Choices:} 4
  885.   msg { 1. File} 6
  886.   msg { 2. Edit} 7
  887.   msg { 3. Exit} 8
  888.   while ( != %c 3 ) {                  ; Read and verify choice
  889.       while true {                      ; Keep trying till we get a good one
  890.   screen move 10                ; Move to line 10
  891.   screen cleol                  ; Clear this line
  892.   getc %c {Your choice: }      ; Prompt and get and echo 1 character
  893.   xecho %c
  894.   if ( not numeric %c ) { msg {Not numeric - "%c"} 12, continue }
  895.   if ( >= %c 1 && <= %c 3 ) break
  896.   msg {Out of range - "%c"} 12
  897.       }
  898.       switch %c {                      ; Valid choice - execute it.
  899. :1, msg {Filing... } 12, break
  900. :2, msg {Editing...} 12, break
  901. :3, msg {Exiting...} 12, break
  902.       }
  903.   }
  904.   echo Bye                              ; Exit chosen - say goodbye.
  905.   bot                                   ; Leave cursor at screen bottom.
  906.   exit                                  ; And exit.
  907. Similar scripts can work over the communication connection; substitute
  908. INPUT and OUTPUT for GETC and ECHO/XECHO.
  909. 7.22. Evaluating Arithmetic Expressions
  910. A new arithmetic operator was added to the list recognized by the EVALUATE
  911. command, the feval() function, and which can also be used anywhere else
  912. arithmetic expressions are accepted (numeric command fields, array subscripts,
  913. etc):
  914. Prefix "!"
  915.   This operator inverts the "truth value" of the number or arithmetic
  916.   expression that follows.  If the value of the operand is 0, the result is 1.
  917.   If the value is nonzero, the result is 0.
  918. Examples:
  919.   set eval old
  920.   evaluate 0
  921.   0
  922.   evaluate !0
  923.   1
  924.   evaluate !3
  925.   0
  926.   evaluate !(-3)
  927.   0
  928.   .%a = 1
  929.   .%b = 0
  930.   evaluate !(%a|%b)
  931.   0
  932.   evaluate !(%a&%b)
  933.   1
  934.   evaluate !(!(%a&%b))
  935.   0
  936. Note the distinction between Prefix ! (invert truth value) and Suffix !
  937. (factorial).  Also the distinction between Prefix ! and Prefix ~ (which
  938. inverts all the bits in its operand).  Also note that prefix operators
  939. (!, -, and ~) can not be adjacent unless you use parentheses to separate
  940. them, as shown in the final example above.
  941. 7.23. Floating-Point Arithmetic
  942. C-Kermit 7.0 adds limited support for floating-point numbers (numbers that
  943. have fractional parts, like 3.141592653).  This support is provided through a
  944. small repertoire of functions and in Boolean expressions that compare numbers,
  945. but does not apply to number parsing in general, or to expression evaluation,
  946. array subscripts, the INCREMENT and DECREMENT commands, or in any context
  947. other than those listed in this section.
  948. A floating point number has an optional sign (+ or -), followed by a series of
  949. decimal digits containing either zero or one period (.) character, which is
  950. the decimal point.  The use of comma or any other character besides period as
  951. a decimal point is not supported.  Scientific notation is not supported
  952. either.  Examples of legal floating-point numbers:
  953.   0                Integers can be used
  954.   1                Ditto
  955.   2.               A decimal point without decimal digits
  956.   3.0              A decimal point with decimal digits
  957.   3.141592653      Ditto
  958.  -4.0              A negative sign can be included
  959.  +5.0              A positive sign can be included
  960. Examples of notations that are not accepted:
  961.   1,000,000        Separators can not be used
  962.   1.000.000        Ditto (or multiple decimal points)
  963.   6.022137E23      No scientific notation
  964.   6.62606868e-34   Ditto
  965.   12.5+6.25        No "bare" expressions
  966. You can use IF FLOAT test a string or variable to see if it's in acceptable
  967. floating-point format.  Example:
  968.   ask %f { Type a number: }
  969.   if not def %f .%f = 0.0
  970.   if not float %f stop 1 Invalid floating-point number: "%f"
  971. C-Kermit's floating-point support, like its support for whole numbers
  972. (integers), relies on the capabilities of the underlying computer.  Your
  973. computer has only a limited amount of precision for numbers, depending on its
  974. architecture.  Thus floating-point numbers that have too many digits will not
  975. be accurate; adding a very small number to a very large one might have no
  976. effect at all; and so on.  For details, read a text on numerical analysis.
  977. Example:
  978.   .%a = 11111111111111111111  ; A long number
  979.   .%b = 22222222222222222222  ; Another one
  980.   echo ffpadd(%a,%b)        ; Add them - the result should be all 3's
  981.   33333333333333330000.0       ; See the result
  982. In this example, the computer has 16 digits of precision; after that, the
  983. (low-order) digits are set to 0, since the computer doesn't know what they
  984. really are.  In fact, the computer returns random digits, but Kermit sets
  985. all digits beyond the computer's precision to 0.
  986. C-Kermit's floating-point functions have names of the form "ffpxxx(args)"
  987. ("f" for function, "fp" for floating-point), where "xxx" is replaced by the
  988. name of the function, such as "sqrt", and "args" is the argument list,
  989. consisting of one or two floating-point numbers (depending on the function),
  990. and an optional "d" argument that says now many decimal places should be shown
  991. in the result.  Example:
  992.   ffpdiv(10,3,1) returns "3.3"
  993.   ffpdiv(10,3,2) returns "3.33"
  994.   ffpdiv(10,3,3) returns "3.333"
  995. and so on, up to the precision of the computer.  If the decimal-places
  996. argument is less than zero, the fractional part of the result is truncated:
  997.   ffpdiv(10,3,-1) returns "3".
  998. If the decimal-places argument is 0, or is omitted, C-Kermit returns as many
  999. decimal places as are meaningful in the computer's floating-point precision,
  1000. truncating any extraneous trailing 0's:
  1001.   ffpdiv(10,8) returns "1.25".
  1002.   ffpdiv(10,4) returns "2.5".
  1003.   ffpdiv(10,2) returns "5.0".
  1004.   ffpdiv(10,3) returns "3.333333333333333" (for 16-digit precision).
  1005. There is no way to request that a floating-point function return a decimal
  1006. point but no decimal places.  However, this is easy enough to accomplish in
  1007. other ways, for example by supplying it outside the function call:
  1008.   echo ffpadd(%a,%b,-1).
  1009. Kermit's floating-point functions always round the result for the requested
  1010. number of decimal places when the "d" argument is given and has a value
  1011. greater than 0 (see the description of ffpround() just below).
  1012. Floating-point arguments can be constants in floating-point format or
  1013. variables whose values are floating-point numbers.  If a floating-point
  1014. argument is omitted, or is a variable with no value, 0.0 is supplied
  1015. automatically.  Example:
  1016.   def %x 999.999
  1017.   undef %y
  1018.   echo ffpmin(%x,%y)
  1019.   0.0
  1020. Or equivalently:
  1021.   echo ffpmin(999.999)
  1022.   0.0
  1023. The floating-point functions are:
  1024. ffpround(f1,d)
  1025.   Returns f1 rounded to d decimal places.  For this function only, d = 0
  1026.   (or d omitted) has a special meaning: return the integer part of f1
  1027.   rounded according to the fractional part.  Examples:
  1028.     ffpround(2.74653,-1) returns "2" (fraction truncated, no rounding).
  1029.     ffpround(2.74653,0)  returns "3" (integer part is rounded).
  1030.     ffpround(2.74653)    returns "3" (d omitted same as d = 0).
  1031.     ffpround(2.74653,1)  returns "2.7".
  1032.     ffpround(2.74653,2)  returns "2.75".
  1033.     ffpround(2.74653,3)  returns "2.747".
  1034.     ffpround(2.74653,4)  returns "2.7465", etc.
  1035. ffpadd(f1,f2,d)
  1036.   Returns the sum of f1 and f2.
  1037. ffpsubtract(f1,f2,d)
  1038.   Subtracts f2 from f1 and returns the result.
  1039. ffpmultiply(f1,f2,d)
  1040.   Returns the product of f1 and f2.
  1041. ffpdivide(f1,f2,d)
  1042.   If f2 is not 0, divides f1 by f2 and returns the quotient.
  1043.   If f2 is 0, a DIVIDE_BY_ZERO error occurs.
  1044. ffpraise(f1,f2,d)
  1045.   If f1 = 0 and f2 <= 0, or if f1 < 0 and f2 has a fractional part,
  1046.   an ARG_OUT_OF_RANGE error occurs; otherwise f1 raised to the f2 power
  1047.   is returned.
  1048. ffpsqrt(f1,d)
  1049.   If f1 >= 0, returns the square root of f1; otherwise ARG_OUT_OF_RANGE.
  1050. ffpabsolute(f1,d)
  1051.   Returns the absolute value of f1 (i.e. f1 without a sign).
  1052.   This is the floating-point analog of fabsolute(n1).
  1053. ffpint(f1)
  1054.   Returns the integer part of f1.  Equivalent to ffpround(f1,-1).
  1055. ffpexp(f1,d)
  1056.   The base of natural logarithms, e (2.718282...), raised to the f1 power.
  1057. ffplogn(f1,d)
  1058.   The natural logarithm of f1 (the power to which e must be raised to
  1059.   obtain f1).
  1060. ffplog10(f1,d)
  1061.   The base-10 logarithm of f1 (the power to which 10 must be raised to
  1062.   obtain f1).
  1063. ffpmodulus(f1,f2,d)
  1064.   If f2 is not 0, the remainder after dividing f1 by f2.
  1065.   If f2 is 0, a DIVIDE_BY_ZERO error occurs.
  1066.   This is the floating-point analog of fmod(n1,n2).
  1067. ffpmaximum(f1,f2,d)
  1068.   Returns the maximum of f1 and f2.
  1069.   This is the floating-point analog of fmax(n1,n2).
  1070. ffpminimum(f1,f2,d)
  1071.   Returns the minimum of f1 and f2.
  1072.   This is the floating-point analog of fmin(n1,n2).
  1073. ffpsine(f1,d)
  1074.   Returns the sine of f1 radians.
  1075. ffpcosine(f1,d)
  1076.   Returns the cosine of f1 radians.
  1077. ffptangent(f1,d)
  1078.   Returns the tangent of f1 radians.
  1079. Note that all of these functions can be used with integer arguments.  If you
  1080. want an integer result, specify d = -1 (to truncate) or feed the result to
  1081. ffpround(xxx,0) (to round).
  1082. Floating-point numbers (or variables or functions that return them) can be
  1083. used in Boolean expressions (see Section 7.20.2) that compare numbers:
  1084.   = x y
  1085.   != x y
  1086.   < x y
  1087.   > x y
  1088.   <= x y
  1089.   >= x y
  1090. In these examples, x and y can be either integers or floating-point numbers
  1091. in any combination.  In an arithmetic comparison of an integer and a
  1092. floating-point number, the integer is converted to floating-point before the
  1093. comparison is made.  Examples:
  1094.   .%t = 3.000000000
  1095.   .%f = 3.141592653
  1096.   .%i = 3
  1097.   if > %f %i echo Pi is greater.
  1098.   if = %t %i echo "%i" = "%t".
  1099. A floating-point number can also be used in:
  1100.   IF <number> <command>
  1101. where the <command> is executed if the <number> is nonzero.  If the number
  1102. is floating-point, the <command> is not executed if the number is 0.0, and
  1103. is executed otherwise.
  1104. Floating-point numbers can be sorted using ARRAY SORT /NUMERIC (see Section
  1105. 7.10.5).
  1106. Two floating-point constants are provided:
  1107.   v(math_pi) = Pi (3.141592653...)
  1108.   v(math_e)  = e, the base of natural logarithms (2.71828...)
  1109. These are given to the computer's precision, e.g. 16 digits.  This number
  1110. itself is available in a variable:
  1111.   v(math_precision) = How many significant digits in a floating-point number.
  1112. 7.24. Tracing Script Execution
  1113. The TRACE command is handy for debugging scripts.
  1114. Syntax: TRACE [ switch ] [ object ]
  1115. TRACE [ { /ON, /OFF } ] [ { ASSIGNMENTS, COMMAND-LEVEL, ALL } ]
  1116.   Selects tracing of the given object.
  1117. Optional switches are /ON and /OFF.  If no switch is given, /ON is implied.
  1118. The trace objects are ASSIGNMENTS, COMMAND-LEVEL, and ALL.  The default object
  1119. is ALL, meaning to select all trace objects (besides ALL).  Thus TRACE by
  1120. itself selects tracing of everything, as does TRACE /ON, and TRACE /OFF turns
  1121. off all tracing.
  1122. When tracing of ASSIGNMENTS is on, every time the value of any user-defined
  1123. variable or macro changes, C-Kermit prints one of the following:
  1124. >>> name: "value"
  1125.   The name of the variable or macro followed by the new value in quotes.
  1126.   This includes implicit macro-parameter assignments during macro invocation.
  1127. >>> name: (undef)
  1128.   This indicates that the variable or macro has been undefined.
  1129. <<< name: "value"
  1130.   For RETURN statements: the name of the macro and the return value.
  1131. <<< name: (null)
  1132.   For RETURN statements that include no value or an empty value.
  1133. When tracing of COMMAND-LEVEL is on, C-Kermit prints:
  1134. [n] +F: "name"
  1135.   Whenever a command file is entered, where "n" is the command level
  1136.   (0 = top); the name of the command file is shown in quotes.
  1137. [n] +M: "name"
  1138.   Whenever a macro is entered; "n" is the command level.  The name of
  1139.   the macro is shown in quotes.
  1140. [n] -F: "name"
  1141.   Whenever a command file is reentered from below, when a macro or
  1142.   command file that it has invoked has returned.
  1143. [n] -M: "name"
  1144.   Whenever a macro is reentered from below.
  1145. For other debugging tools, see SHOW ARGS, SHOW STACK, SET TAKE, SET MACRO, and
  1146. of course, ECHO.
  1147. 7.25. Compact Substring Notation
  1148. It is often desirable to extract a substring from a string which is stored
  1149. in a variable, and for this we have the fsubstring() function, which is
  1150. used like this:
  1151.   define %a 1234567890
  1152.   echo fsubstring(%a,3,4) ; substring from 3rd character length 4
  1153.   3456
  1154. or like this with macro-named variables:
  1155.   define string 1234567890
  1156.   echo fsubstring(m(string),3,4)
  1157.   3456
  1158. C-Kermit 7.0 adds a pair of alternative compact notations:
  1159.   :(variablename[start:length])  <-- Substring of variable's value
  1160.   s(macroname[start:length])     <-- Substring of macro's definition
  1161. These are exactly equivalent to using fsubstring(), except more compact to
  1162. write and also faster since evaluation is in one step instead of two.
  1163. The ":()" notation can be used with any Kermit variable, that is, almost
  1164. anything that starts with a backslash:
  1165.   :(%a[2:6])      <-- equivalent to fsubstring(%a,2,6)
  1166.   :(&x[1][2:6])   <-- equivalent to fsubstring(&x[1],2,6)
  1167.   :(m(foo)[2:6])  <-- equivalent to fsubstring(m(foo),2,6)
  1168.   :(v(time)[2:6]) <-- equivalent to fsubstring(v(time),2,6)
  1169.   :($(TERM)[2:6]) <-- equivalent to fsubstring($(TERM),2,6)
  1170.   :(ABCDEFGH[2:6]) <-- equivalent to fsubstring(ABCDEFGH,2,6)
  1171. Whatever appears between the left parenthesis and the left bracket is
  1172. evaluated and then the indicated substring of the result is returned.
  1173. The "s()" notation is the same, except after evaluating the variable,
  1174. the result is treated as a macro name and is looked up in the macro table.
  1175. Then the indicated substring of the macro definition is returned.  Example:
  1176.   define testing abcdefghijklmnopqrstuvwxyz
  1177.   define %a testing
  1178.   s(testing[2:6])  -->  bcdefg
  1179.   :(testing[2:6])  -->  esting
  1180.   :(%a[2:6])      -->  esting
  1181.   s(%a[2:6])      -->  bcdefg
  1182. Note that the following two examples are equivalent:
  1183.   :(m(foo)[2:6])
  1184.   s(foo[2:6])
  1185. The first number in the brackets is the 1-based starting position.  If it is
  1186. omitted, or less than 1, it is treated as 1.  If it is greater than the length
  1187. of the string, an empty string is returned.
  1188. The second number is the length of the desired substring.  If the second
  1189. number is omitted, is less than 0, or would be past the end of the string,
  1190. then "through the end of the string" is assumed.  If it is 0, the empty string
  1191. is returned.
  1192. If the brackets are empty or omitted, the original string is returned.
  1193. The starting position and length need not be literal numbers; they can also
  1194. be variables, functions, arithmetic expressions, or even other s() or :()
  1195. quantities; anything that evaluates to a number, for example:
  1196.   s(block[1025:fhex2n(s(block[%b:%n+4]))/2])
  1197. Syntactically, m(name) and s(name) differ only in that the sequence [*]
  1198. at the end of the name (where * is any sequence of 0 or more characters) is
  1199. treated as substring notation in s(name), but is considered part of the name
  1200. in m(name) (to see why, see Section 7.10.9).
  1201. 7.26. New WAIT Command Options
  1202. The WAIT command has been extended to allow waiting for different kinds of
  1203. things (formerly it only waited for modem signals).  Now it also can wait
  1204. for file events.
  1205. 7.26.1. Waiting for Modem Signals
  1206. The previous syntax:
  1207.   WAIT <time> { CD, DSR, RTS, RI, ... }
  1208. has changed to:
  1209.   WAIT <time> MODEM-SIGNALS { CD, DSR, RTS, RI, ... }
  1210. However, the previous syntax is still accepted.  The behavior is the same
  1211. in either case.
  1212. 7.26.2. Waiting for File Events
  1213. The new WAIT option:
  1214.   WAIT <time> FILE { CREATION, DELETION, MODIFICATION } <filename>
  1215. lets you tell Kermit to wait the given amount of time (or until the given time
  1216. of day) for a file whose name is <filename> to be created, deleted, or
  1217. modified, respectively.  The <filename> may not contain wildcards.  If the
  1218. specified event does not occur within the time limit, or if WAIT CANCELLATION
  1219. is ON and you interrupt from the keyboard before the time is up, the WAIT
  1220. command fails.  If the event is MODIFICATION and the file does not exist, the
  1221. command fails.  Otherwise, if the given event occurs within the time limit,
  1222. the command succeeds.  Examples:
  1223.   WAIT 600 FILE DELETION oofa.tmp
  1224.     Wait up to 10 minutes for file oofa.tmp to disappear.
  1225.   WAIT 23:59:59 FILE MOD orders.db
  1226.     Wait until just before midnight for the orders.db file to be changed.
  1227. Example: Suppose you want to have the current copy of /etc/motd on your
  1228. screen at all times, and you want to hear a bell whenever it changes:
  1229.   def %f /etc/motd                      ; The file of interest.
  1230.   while 1 {                              ; Loop forever...
  1231.       cls                                ; Clear the screen.
  1232.       echo %f: v(date) v(time)...     ; Print 2-line heading...
  1233.       echo
  1234.       if ( not exist %f ) {             ; If file doesn't exist,
  1235.           echo %f does not exist...     ; print message,
  1236.           wait 600 file creat %f        ; and wait for it to appear.
  1237.           continue
  1238.       }
  1239.       beep                               ; Something new - beep.
  1240.       type /head:v(rows-2) %f          ; Display the file
  1241.       if fail exit 1 %f: ferrstring()  ; (checking for errors).
  1242.       wait 999 file mod %f              ; Wait for it to change.
  1243.   }
  1244. This notices when the file is created, deleted, or modified, and acts only
  1245. then (or when you interrupt it with); the time shown in the heading is the
  1246. time of the most recent event (including when the program started).
  1247. See Section 1.10, where the v(kbchar) variable is explained.  This lets
  1248. you modify a loop like the one above to also accept single-character commands,
  1249. which interrupt the WAIT, and dispatch accordingly.  For example:
  1250.       wait 999 file mod %f              ; Wait for the file to change.
  1251.       if defined v(kbchar) {            ; Interrupted from keyboard?
  1252.           switch v(kbchar) {            ; Handle the keystroke...
  1253.             :q, exit                     ; Q to Quit
  1254.             :h, echo blah blah, break    ; H for Help
  1255.             :default, beep, continue     ; Anything else beep and ignore
  1256.           }
  1257.       }
  1258. This lets you write event-driven applications that wait for up to three
  1259. events at once: a file or modem event, a timeout, and a keystroke.
  1260. 7.27. Relaxed FOR and SWITCH Syntax
  1261. For consistency with the extended IF and WHILE syntax, the FOR and SWITCH
  1262. control lists may (but need not be) enclosed in parentheses:
  1263.   FOR ( %i 1 %n 1 ) { command-list... }
  1264.   SWITCH ( %c ) { command-list... }
  1265. In the FOR command, the increment item can be omitted if the control list is
  1266. enclosed in parentheses, in which case the increment defaults appropriately to
  1267. 1 or -1, depending on the values of the first two variables.
  1268. As with IF, the parentheses around the FOR-command control list must be set
  1269. off by spaces (in the SWITCH command, the spaces are not required since the
  1270. SWITCH expression is a single arithmetic expression).
  1271. Also, outer braces around the command list are supplied automatically if
  1272. you omit them, e.g.:
  1273.   FOR ( %i 1 %n 1 ) echo %i
  1274. (8) USING OTHER FILE TRANSFER PROTOCOLS
  1275. In C-Kermit 7.0, alternative protocols can be selected using switches.
  1276. Switches are described in section 1.5; the use of protocol-selection switches
  1277. is described in section 4.7.1.  Example:
  1278.   send /binary /protocol:zmodem x.tar.gz
  1279. Note that file transfer recovery works only with Kermit and Zmodem protocols.
  1280. With Zmodem, recovery can be initiated only by the sender.
  1281. Only pre-1988 versions of the publicly-distributed sz/rz programs use
  1282. Standard I/O; those released later than that do not use Standard I/O and
  1283. therefore do not work with REDIRECT.  However, Omen Technology does offer
  1284. an up-to-date redirectable version called crzsz, which must be licensed
  1285. for use:
  1286.   "Unix Crz and Csz support XMODEM, YMODEM, and ZMODEM transfers
  1287.   when called by dial-out programs such as Kermit and certain
  1288.   versions of cu(1).  They are clients designed for this use.
  1289.   "Crz and Csz are Copyrighted shareware programs.  Use of these
  1290.   programs beyond a brief evaluation period requires registration.
  1291.   Please print the "mailer.rz" file, fill out the form and return
  1292.   same with your registration."
  1293. To use the crzsz programs as your external XYZMODEM programs in C-Kermit,
  1294. follow the instructions in the book, but put a "c" before each command,
  1295. e.g.:
  1296.   set protocol zmodem {csz %s} {csz -a %s} crz crz crz crz
  1297. To use Zmodem protocol over Telnet or other non-transparent connections,
  1298. you might need to add the -e (Escape) option:
  1299.   set protocol zmodem {csz -e %s} {csz -e -a %s} crz crz crz crz
  1300. (9) COMMAND-LINE OPTIONS
  1301. 9.0. Extended-Format Command-Line Options
  1302. Standard UNIX command line options are a single letter.  C-Kermit has run
  1303. out of letters, so new options are in a new extended format:
  1304.  --word[:arg]
  1305. where a keyword (rather than a single letter) specifies the function, and if
  1306. an argument is to be included, it is separated by a colon (or equal sign).
  1307. Most of the new extended-format command-line options are only for use with the
  1308. Internet Kermit Service Daemon; see iksd.txt for details.  However, several
  1309. of them are also general in nature:
  1310. --nointerrupts
  1311.   Disables keyboard interrupts that are normally enabled, which are usually
  1312.   Ctrl-C (to interrupt a command) and Ctrl-Z (UNIX only, to suspend C-Kermit).
  1313. --help
  1314.   Lists the extended command-line options that are available in your version
  1315.   of C-Kermit.  If any options seem to be missing, that is because your
  1316.   copy of C-Kermit was built with compile-time options to deselect them.
  1317. --helpfile:<filename>
  1318.   Specifies the name of a file to be displayed if the user types HELP
  1319.   (not followed by a specific command or topic), in place of the built-in
  1320.   top-level help text.  The file need not fit on one screen; more-prompting
  1321.   is used if the file is more than one screen long if COMMAND MORE-PROMPTING
  1322.   is ON, as it is by default.
  1323. --bannerfile:<filename>
  1324.   The name of a file containing a message to be printed after the user logs
  1325.   in, in place of the normal message (Copyright notice, "Type HELP or ? for
  1326.   help", "Default transfer mode is...", etc).
  1327. --cdmessage:{on,off,0,1,2}
  1328.   For use in the Server-Side Server configuration; whenever the client
  1329.   tells the server to change directory, the server sends the contents of a
  1330.   "read me" file to the client's screen.  This feature is On by default,
  1331.   and operates only in client/server mode when ON or 1.  If set to 2 or
  1332.   higher, it also operates when the CD command is given at the IKSD> prompt.
  1333.   Synonym: --cdmsg.
  1334. --cdfile:<filename> (or list)
  1335.   When cdmessage is on, this is the name of the "read me" file to be sent.
  1336.   Normally you would specify a relative (not absolute) name, since the file
  1337.   is opened using the literal name you specified, after changing to the new
  1338.   directory.  Example:
  1339.     --cdfile:READ.ME
  1340.   You can also give a list of up to 8 filenames by (a) enclosing each
  1341.   filename in braces, and (b) enclosing the entire list in braces.  Example:
  1342.   --cdfile:{{./.readme}{READ.ME}{aaareadme.txt}{README}{read-this-first}}
  1343.   When a list is given, it is searched from left to right and the first
  1344.   file found is displayed.  The default list for UNIX is:
  1345.     {{./.readme}{README.TXT}{READ.ME}}
  1346. 9.1. Command Line Personalities
  1347. Beginning in version 7.0, if the C-Kermit binary is renamed to "telnet"
  1348. (or TELNET.EXE, telnet.pr, etc, depending on the platform), it accepts the
  1349. Telnet command line:
  1350.   telnet [ host [ port ] ]
  1351. In Unix, you can achieve the same effect with a symlink:
  1352.   cd /usr/bin
  1353.   mv telnet oldtelnet
  1354.   ln -ls /usr/local/bin/kermit telnet
  1355. When installed in this manner, C-Kermit always reads its initialization file.
  1356. If no host (and therefore no port) is given, C-Kermit starts in interactive
  1357. prompting mode.  If a host is given as the first command-line argument,
  1358. C-Kermit makes a connection to it.  The host argument can be an IP host name
  1359. or address, or the name of a TCP/IP entry in your C-Kermit network directory.
  1360. If a port is given, it is used.  If a port is not given, then if the hostname
  1361. was found in your network directory and port was also listed there, then that
  1362. port is used.  Otherwise port 23 (the Telnet port) is used.
  1363. When C-Kermit is called "telnet" and it is invoked with a hostname on the
  1364. command line, it exits automatically when the connection is closed.  While
  1365. the connection is open, however, you may escape back and forth as many times
  1366. as you like, transfer files, etc.
  1367. An rlogin personality is also available, but it is less useful, at least
  1368. in UNIX and VMS, where the Rlogin TCP port is privileged.
  1369. The new variable v(name) indicates the name with which C-Kermit was invoked
  1370. ("kermit", "wermit", "k95", "telnet", etc).
  1371. 9.2. Built-in Help for Command Line Options
  1372. "kermit -h", given from the system prompt, lists as many command-line options
  1373. as will fit on a standard 24x80 screen.  For more comprehensive help, use the
  1374. interactive HELP OPTIONS command that was added in C-Kermit 7.0:
  1375. HELP OPTIONS
  1376.   Explains how command-line options work, their syntax, etc.
  1377. HELP OPTIONS ALL
  1378.   Lists all command-line options and gives brief help about each one.
  1379. HELP OPTION x
  1380.   Gives brief help about option "x".
  1381. HELP EXTENDED-OPTIONS
  1382.   Lists the available extended-format command-line options.
  1383. HELP EXTENDED-OPTION xxx
  1384.   Gives help for the specified extended option.
  1385. 9.3. New Command-Line Options
  1386. Command-line options added since C-Kermit 6.0 are:
  1387. +:  (plus sign by itself): The next argument is the name of a script to
  1388.     execute; all subsequent arguments are ignored by C-Kermit itself, but
  1389.     passed to the script as top-level copies of %1, %2, etc; the &_[] is
  1390.     also set accordingly.  %0 and &_[0] become the name of the script file,
  1391.     rather than the pathname of the C-Kermit program, which is its normal
  1392.     value.  Primarily for use in the top line of "Kerbang" scripts in UNIX
  1393.     (see Section 7.19).  Example from UNIX command line:
  1394.       $ kermit [ regular kermit args ] + filename
  1395.     Sample first line of Kerbang script:
  1396.       #!/usr/local/bin/kermit +
  1397. --: (two hyphens surrounded by whitespace)  Equivalent to "=", for
  1398.     compatibility with UNIX getopt(1,3).
  1399. -G: GET (like -g), but send the incoming file to standard output.  Example:
  1400.     "kermit -G oofa.txt | lpr" retrieves a file from your local computer
  1401.     (providing it is running a Kermit program that supports the autodownload
  1402.     feature and has it enabled) and prints it.
  1403. -O: equivalent to -x (start up in server mode), but exits after the first
  1404.     client command has been executed (mnemonic: O = Only One).  This one is
  1405.     handy replacing "kermit -x" in the "automatically-start-Kermit-on-the-
  1406.     other-end" string:
  1407.       set protocol kermit {kermit -ir} {kermit -r} {kermit -x}
  1408.     since -x leaves the remote Kermit in server mode after the transfer,
  1409.     which can be confusing, whereas -O makes it go away automatically
  1410.     after the transfer.
  1411. -L: Recursive, when used in combination with -s (mnemonic: L = Levels).
  1412.     In UNIX or other environments where the shell expands wildcards itself,
  1413.     the -s argument, if it contains wildcards, must be quoted to prevent
  1414.     this, e.g.:
  1415.       kermit -L -s "*.c"
  1416.     In UNIX only, "kermit -L -s ." means to send the current directory tree.
  1417.     See sections 4.10-4.11 about recursive file transfer.
  1418. -V: Equivalent to SET FILE PATTERNS OFF (Section 4.3) and SET TRANSFER MODE
  1419.     MANUAL.  In other words, take the FILE TYPE setting literally.  For
  1420.     example, "kermit -VT oofa.bin" means send the file in Text mode, no matter
  1421.     what its name is and no matter whether a kindred spirit is recognized at
  1422.     the other end of the connection.
  1423. -0: (digit zero) means "be 100% transparent in CONNECT mode".  This is
  1424.     equivalent to the following series of commands: SET PARITY NONE, SET
  1425.     COMMAND BYTESIZE 8, SET TERMINAL BYTESIZE 8, SET FLOW NONE, SET
  1426.     TERM ESCAPE DISABLED, SET TERM CHAR TRANSPARENT, SET TERM AUTODOWNLOAD
  1427.     OFF, SET TERM APC OFF, SET TELOPT KERMIT REFUSE REFUSE.
  1428. (10) C-KERMIT AND G-KERMIT
  1429. Every multifunctioned and long-lived software program grows in complexity
  1430. and size over time to meet the needs and requests of its users and the demands
  1431. of the underlying technology as it changes.
  1432. Eventually users begin to notice how big the application has grown, how much
  1433. disk space it occupies, how long it takes to load, and they start to long for
  1434. the good old days when it was lean and mean.  Not long after that they begin
  1435. asking for a "light" version that only does the basics with no frills.
  1436. And so it is with C-Kermit.  A "light" version of Kermit was released (for
  1437. UNIX only) in December 1999 under the GNU General Public License; thus it is
  1438. called G-Kermit (for GNU Kermit).  All it does is send and receive files,
  1439. period.  You can find it at:
  1440.   http://www.columbia.edu/kermit/gkermit.html
  1441. Where the C-Kermit 7.0 binary might be anywhere from 1 to 3 million bytes in
  1442. size, the G-Kermit binary ranges from 30K to 100K, depending on the underlying
  1443. architecture (RISC vs CISC, etc).
  1444. G-Kermit and C-Kermit may reside side-by-side on the same computer.  G-Kermit
  1445. does not make connections; it does not have a script language; it does not
  1446. translate character sets.  G-Kermit may be used instead of C-Kermit when:
  1447.  . It is on the remote end.
  1448.  . Files are to be transferred in binary mode or in text mode without
  1449.    character-set translation.
  1450.  . File timestamps don't need to be preserved.
  1451. In such cases G-Kermit might be preferred since it generally starts up faster,
  1452. and yet transfers files just as fast on most (but not necessarily all) kinds
  1453. of connections; for example, it supports streaming (Section 4.20).
  1454. G-Kermit is also handy for bootstrapping.  It is easier to load on a new
  1455. computer than C-Kermit -- it fits on a floppy diskette with plenty of room to
  1456. spare.  Thus if you have (say) an old PC running (say) SCO Xenix and no
  1457. network connection, you can download the Xenix version of G-Kermit to (say) a
  1458. DOS or Windows PC, copy it to diskette, read the diskette on Xenix with
  1459. "dosread", and then use G-Kermit to receive C-Kermit (which does not fit on a
  1460. diskette).  If diskettes aren't an option, other bootstrapping methods are
  1461. possible too -- see the G-Kermit web page for details.
  1462. III. APPENDICES
  1463. III.1.  Character Set Tables
  1464. III.1.1. The Hewlett Packard Roman8 Character Set
  1465. dec col/row oct hex  description
  1466. 160  10/00  240  A0  (Undefined)
  1467. 161  10/01  241  A1  A grave
  1468. 162  10/02  242  A2  A circumflex
  1469. 163  10/03  243  A3  E grave
  1470. 164  10/04  244  A4  E circumflex
  1471. 165  10/05  245  A5  E diaeresis
  1472. 166  10/06  246  A6  I circumflex
  1473. 167  10/07  247  A7  I diaeresis
  1474. 168  10/08  250  A8  Acute accent
  1475. 169  10/09  251  A9  Grave accent
  1476. 170  10/10  252  AA  Circumflex accent
  1477. 171  10/11  253  AB  Diaeresis
  1478. 172  10/12  254  AC  Tilde accent
  1479. 173  10/13  255  AD  U grave
  1480. 174  10/14  256  AE  U circumflex
  1481. 175  10/15  257  AF  Lira symbol
  1482. 176  11/00  260  B0  Top bar (macron)
  1483. 177  11/01  261  B1  Y acute
  1484. 178  11/02  262  B2  y acute
  1485. 179  11/03  263  B3  Degree Sign
  1486. 180  11/04  264  B4  C cedilla
  1487. 181  11/05  265  B5  c cedilla
  1488. 182  11/06  266  B6  N tilde
  1489. 183  11/07  267  B7  n tilde
  1490. 184  11/08  270  B8  Inverted exclamation mark
  1491. 185  11/09  271  B9  Inverted question mark
  1492. 186  11/10  272  BA  Currency symbol
  1493. 187  11/11  273  BB  Pound sterling symbol
  1494. 188  11/12  274  BC  Yen symbol
  1495. 189  11/13  275  BD  Paragraph
  1496. 190  11/14  276  BE  Florin (Guilder) symbol
  1497. 191  11/15  277  BF  Cent symbol
  1498. 192  12/00  300  C0  a circumflex
  1499. 193  12/01  301  C1  e circumflex
  1500. 194  12/02  302  C2  o circumflex
  1501. 195  12/03  303  C3  u circumflex
  1502. 196  12/04  304  C4  a acute
  1503. 197  12/05  305  C5  e acute
  1504. 198  12/06  306  C6  o acute
  1505. 199  12/07  307  C7  u acute
  1506. 200  12/08  310  C8  a grave
  1507. 201  12/09  311  C9  e grave
  1508. 202  12/10  312  CA  o grave
  1509. 203  12/11  313  CB  u grave
  1510. 204  12/12  314  CC  a diaeresis
  1511. 205  12/13  315  CD  e diaeresis
  1512. 206  12/14  316  CE  o diaeresis
  1513. 207  12/15  317  CF  u diaeresis
  1514. 208  13/00  320  D0  A ring
  1515. 209  13/01  321  D1  i circumflex
  1516. 210  13/02  322  D2  O with stroke
  1517. 211  13/03  323  D3  AE digraph
  1518. 212  13/04  324  D4  a ring
  1519. 213  13/05  325  D5  i acute
  1520. 214  13/06  326  D6  o with stroke
  1521. 215  13/07  327  D7  ae digraph
  1522. 216  13/08  330  D8  A diaeresis
  1523. 217  13/09  331  D9  i grave
  1524. 218  13/10  332  DA  O diaeresis
  1525. 219  13/11  333  DB  U diaeresis
  1526. 220  13/12  334  DC  E acute
  1527. 221  13/13  335  DD  i diaeresis
  1528. 222  13/14  336  DE  German sharp s
  1529. 223  13/15  337  DF  O circumflex
  1530. 224  14/00  340  E0  A acute
  1531. 225  14/01  341  E1  A tilde
  1532. 226  14/02  342  E2  a tilde
  1533. 227  14/03  343  E3  Icelandic Eth
  1534. 228  14/04  344  E4  Icelandic eth
  1535. 229  14/05  345  E5  I acute
  1536. 230  14/06  346  E6  I grave
  1537. 231  14/07  347  E7  O acute
  1538. 232  14/08  350  E8  O grave
  1539. 233  14/09  351  E9  O tilde
  1540. 234  14/10  352  EA  o tilde
  1541. 235  14/11  353  EB  S caron
  1542. 236  14/12  354  EC  s caron
  1543. 237  14/13  355  ED  U acute
  1544. 238  14/14  356  EE  Y diaeresis
  1545. 239  14/15  357  EF  y diaeresis
  1546. 240  15/00  360  F0  Icelandic Thorn
  1547. 241  15/01  361  F1  Icelandic thorn
  1548. 242  15/02  362  F2  Middle dot
  1549. 243  15/03  363  F3  Greek mu
  1550. 244  15/04  364  F4  Pilcrow sign
  1551. 245  15/05  365  F5  Fraction 3/4
  1552. 246  15/06  366  F6  Long dash, horizontal bar
  1553. 247  15/07  367  F7  Fraction 1/4
  1554. 248  15/08  370  F8  Fraction 1/2
  1555. 249  15/09  371  F9  Feminine ordinal
  1556. 250  15/10  372  FA  Masculine ordinal
  1557. 251  15/11  373  FB  Left guillemot
  1558. 252  15/12  374  FC  Solid box
  1559. 253  15/13  375  FD  Right guillemot
  1560. 254  15/14  376  FE  Plus or minus sign
  1561. 255  15/15  377  FF  (Undefined)
  1562. III.1.2. Greek Character Sets
  1563. III.1.2.1. The ISO 8859-7 Latin / Greek Alphabet = ELOT 928
  1564. dec col/row oct hex  description
  1565. 160  10/00  240  A0  No-break space
  1566. 161  10/01  241  A1  Left single quotation mark
  1567. 162  10/02  242  A2  right single quotation mark
  1568. 163  10/03  243  A3  Pound sign
  1569. 164  10/04  244  A4  (UNUSED)
  1570. 165  10/05  245  A5  (UNUSED)
  1571. 166  10/06  246  A6  Broken bar
  1572. 167  10/07  247  A7  Paragraph sign
  1573. 168  10/08  250  A8  Diaeresis (Dialytika)
  1574. 169  10/09  251  A9  Copyright sign
  1575. 170  10/10  252  AA  (UNUSED)
  1576. 171  10/11  253  AB  Left angle quotation
  1577. 172  10/12  254  AC  Not sign
  1578. 173  10/13  255  AD  Soft hyphen
  1579. 174  10/14  256  AE  (UNUSED)
  1580. 175  10/15  257  AF  Horizontal bar (Parenthetiki pavla)
  1581. 176  11/00  260  B0  Degree sign
  1582. 177  11/01  261  B1  Plus-minus sign
  1583. 178  11/02  262  B2  Superscript two
  1584. 179  11/03  263  B3  Superscript three
  1585. 180  11/04  264  B4  Accent (tonos)
  1586. 181  11/05  265  B5  Diaeresis and accent (Dialytika and Tonos)
  1587. 182  11/06  266  B6  Alpha with accent
  1588. 183  11/07  267  B7  Middle dot (Ano Teleia)
  1589. 184  11/08  270  B8  Epsilon with accent
  1590. 185  11/09  271  B9  Eta with accent
  1591. 186  11/10  272  BA  Iota with accent
  1592. 187  11/11  273  BB  Right angle quotation
  1593. 188  11/12  274  BC  Omicron with accent
  1594. 189  11/13  275  BD  One half
  1595. 190  11/14  276  BE  Upsilon with accent
  1596. 191  11/15  277  BF  Omega with accent
  1597. 192  12/00  300  C0  iota with diaeresis and accent
  1598. 193  12/01  301  C1  Alpha
  1599. 194  12/02  302  C2  Beta
  1600. 195  12/03  303  C3  Gamma
  1601. 196  12/04  304  C4  Delta
  1602. 197  12/05  305  C5  Epsilon
  1603. 198  12/06  306  C6  Zeta
  1604. 199  12/07  307  C7  Eta
  1605. 200  12/08  310  C8  Theta
  1606. 201  12/09  311  C9  Iota
  1607. 202  12/10  312  CA  Kappa
  1608. 203  12/11  313  CB  Lamda
  1609. 204  12/12  314  CC  Mu
  1610. 205  12/13  315  CD  Nu
  1611. 206  12/14  316  CE  Ksi
  1612. 207  12/15  317  CF  Omicron
  1613. 208  13/00  320  D0  Pi
  1614. 209  13/01  321  D1  Rho
  1615. 210  13/02  322  D2  (UNUSED)
  1616. 211  13/03  323  D3  Sigma
  1617. 212  13/04  324  D4  Tau
  1618. 213  13/05  325  D5  Upsilon
  1619. 214  13/06  326  D6  Phi
  1620. 215  13/07  327  D7  Khi
  1621. 216  13/08  330  D8  Psi
  1622. 217  13/09  331  D9  Omega
  1623. 218  13/10  332  DA  Iota with diaeresis
  1624. 219  13/11  333  DB  Upsilon with diaeresis
  1625. 220  13/12  334  DC  alpha with accent
  1626. 221  13/13  335  DD  epsilon with accent
  1627. 222  13/14  336  DE  eta with accent
  1628. 223  13/15  337  DF  iota with accent
  1629. 224  14/00  340  E0  upsilon with diaeresis and accent
  1630. 225  14/01  341  E1  alpha
  1631. 226  14/02  342  E2  beta
  1632. 227  14/03  343  E3  gamma
  1633. 228  14/04  344  E4  delta
  1634. 229  14/05  345  E5  epsilon
  1635. 230  14/06  346  E6  zeta
  1636. 231  14/07  347  E7  eta
  1637. 232  14/08  350  E8  theta
  1638. 233  14/09  351  E9  iota
  1639. 234  14/10  352  EA  kappa
  1640. 235  14/11  353  EB  lamda
  1641. 236  14/12  354  EC  mu
  1642. 237  14/13  355  ED  nu
  1643. 238  14/14  356  EE  ksi
  1644. 239  14/15  357  EF  omicron
  1645. 240  15/00  360  F0  pi
  1646. 241  15/01  361  F1  rho
  1647. 242  15/02  362  F2  terminal sigma
  1648. 243  15/03  363  F3  sigma
  1649. 244  15/04  364  F4  tau
  1650. 245  15/05  365  F5  upsilon
  1651. 246  15/06  366  F6  phi
  1652. 247  15/07  367  F7  khi
  1653. 248  15/08  370  F8  psi
  1654. 249  15/09  371  F9  omega
  1655. 250  15/10  372  FA  iota with diaeresis
  1656. 251  15/11  373  FB  upsilon with diaeresis
  1657. 252  15/12  374  FC  omicron with diaeresis
  1658. 253  15/13  375  FD  upsilon with accent
  1659. 254  15/14  376  FE  omega with accent
  1660. 255  15/15  377  FF  (UNUSED)
  1661. III.1.2.2. The ELOT 927 Character Set
  1662. dec col/row oct hex  description
  1663.  32  02/00   40  20  SPACE
  1664.  33  02/01   41  21  EXCLAMATION MARK
  1665.  34  02/02   42  22  QUOTATION MARK
  1666.  35  02/03   43  23  NUMBER SIGN
  1667.  36  02/04   44  24  DOLLAR SIGN
  1668.  37  02/05   45  25  PERCENT SIGN
  1669.  38  02/06   46  26  AMPERSAND
  1670.  39  02/07   47  27  APOSTROPHE
  1671.  40  02/08   50  28  LEFT PARENTHESIS
  1672.  41  02/09   51  29  RIGHT PARENTHESIS
  1673.  42  02/10   52  2A  ASTERISK
  1674.  43  02/11   53  2B  PLUS SIGN
  1675.  44  02/12   54  2C  COMMA
  1676.  45  02/13   55  2D  HYPHEN, MINUS SIGN
  1677.  46  02/14   56  2E  PERIOD, FULL STOP
  1678.  47  02/15   57  2F  SOLIDUS, SLASH
  1679.  48  03/00   60  30  DIGIT ZERO
  1680.  49  03/01   61  31  DIGIT ONE
  1681.  50  03/02   62  32  DIGIT TWO
  1682.  51  03/03   63  33  DIGIT THREE
  1683.  52  03/04   64  34  DIGIT FOUR
  1684.  53  03/05   65  35  DIGIT FIVE
  1685.  54  03/06   66  36  DIGIT SIX
  1686.  55  03/07   67  37  DIGIT SEVEN
  1687.  56  03/08   70  38  DIGIT EIGHT
  1688.  57  03/09   71  39  DIGIT NINE
  1689.  58  03/10   72  3A  COLON
  1690.  59  03/11   73  3B  SEMICOLON
  1691.  60  03/12   74  3C  LESS-THAN SIGN, LEFT ANGLE BRACKET
  1692.  61  03/13   75  3D  EQUALS SIGN
  1693.  62  03/14   76  3E  GREATER-THAN SIGN, RIGHT ANGLE BRACKET
  1694.  63  03/15   77  3F  QUESTION MARK
  1695.  64  04/00  100  40  COMMERCIAL AT SIGN
  1696.  65  04/01  101  41  CAPITAL LETTER A
  1697.  66  04/02  102  42  CAPITAL LETTER B
  1698.  67  04/03  103  43  CAPITAL LETTER C
  1699.  68  04/04  104  44  CAPITAL LETTER D
  1700.  69  04/05  105  45  CAPITAL LETTER E
  1701.  70  04/06  106  46  CAPITAL LETTER F
  1702.  71  04/07  107  47  CAPITAL LETTER G
  1703.  72  04/08  110  48  CAPITAL LETTER H
  1704.  73  04/09  111  49  CAPITAL LETTER I
  1705.  74  04/10  112  4A  CAPITAL LETTER J
  1706.  75  04/11  113  4B  CAPITAL LETTER K
  1707.  76  04/12  114  4C  CAPITAL LETTER L
  1708.  77  04/13  115  4D  CAPITAL LETTER M
  1709.  78  04/14  116  4E  CAPITAL LETTER N
  1710.  79  04/15  117  4F  CAPITAL LETTER O
  1711.  80  05/00  120  50  CAPITAL LETTER P
  1712.  81  05/01  121  51  CAPITAL LETTER Q
  1713.  82  05/02  122  52  CAPITAL LETTER R
  1714.  83  05/03  123  53  CAPITAL LETTER S
  1715.  84  05/04  124  54  CAPITAL LETTER T
  1716.  85  05/05  125  55  CAPITAL LETTER U
  1717.  86  05/06  126  56  CAPITAL LETTER V
  1718.  87  05/07  127  57  CAPITAL LETTER W
  1719.  88  05/08  130  58  CAPITAL LETTER X
  1720.  89  05/09  131  59  CAPITAL LETTER Y
  1721.  90  05/10  132  5A  CAPITAL LETTER Z
  1722.  91  05/11  133  5B  LEFT SQUARE BRACKET
  1723.  92  05/12  134  5C  REVERSE SOLIDUS, BACKSLASH
  1724.  93  05/13  135  5D  RIGHT SQUARE BRACKET
  1725.  94  05/14  136  5E  CIRCUMFLEX ACCENT
  1726.  95  05/15  137  5F  UNDERSCORE
  1727.  96  06/00  140  60  ACCENT GRAVE
  1728.  97  06/01  141  61  GREEK LETTER ALPHA
  1729.  98  06/02  142  62  GREEK LETTER BETA
  1730.  99  06/03  143  63  GREEK LETTER GAMMA
  1731. 100  06/04  144  64  GREEK LETTER DELTA
  1732. 101  06/05  145  65  GREEK LETTER EPSILON
  1733. 102  06/06  146  66  GREEK LETTER ZETA
  1734. 103  06/07  147  67  GREEK LETTER ETA
  1735. 104  06/08  150  68  GREEK LETTER THETA
  1736. 105  06/09  151  69  GREEK LETTER IOTA
  1737. 106  06/10  152  6A  GREEK LETTER KAPPA
  1738. 107  06/11  153  6B  GREEK LETTER LAMDA
  1739. 108  06/12  154  6C  GREEK LETTER MU
  1740. 109  06/13  155  6D  GREEK LETTER NU
  1741. 110  06/14  156  6E  GREEK LETTER KSI
  1742. 111  06/15  157  6F  GREEK LETTER OMICRON
  1743. 112  07/00  160  70  GREEK LETTER PI
  1744. 113  07/01  161  71  GREEK LETTER RHO
  1745. 114  07/02  162  72  GREEK LETTER SIGMA
  1746. 115  07/03  163  73  GREEK LETTER TAU
  1747. 116  07/04  164  74  GREEK LETTER UPSILON
  1748. 117  07/05  165  75  GREEK LETTER FI
  1749. 118  07/06  166  76  GREEK LETTER XI
  1750. 119  07/07  167  77  GREEK LETTER PSI
  1751. 120  07/08  170  78  GREEK LETTER OMEGA
  1752. 121  07/09  171  79  SPACE
  1753. 122  07/10  172  7A  SPACE
  1754. 123  07/11  173  7B  LEFT CURLY BRACKET, LEFT BRACE
  1755. 124  07/12  174  7C  VERTICAL LINE, VERTICAL BAR
  1756. 125  07/13  175  7D  RIGHT CURLY BRACKET, RIGHT BRACE
  1757. 126  07/14  176  7E  TILDE
  1758. 127  07/15  177  7F  RUBOUT, DELETE
  1759. III.1.2.3. PC Code Page 869
  1760. (to be filled in...)
  1761. III.2. Updated Country Codes
  1762. Date: Mon, 7 Apr 1997 23:23:49 EDT
  1763. From: Dave Leibold <dleibold@else.net>
  1764. Newsgroups: comp.dcom.telecom
  1765. Subject: Ex-USSR Country Codes Profile
  1766. Organization: TELECOM Digest
  1767. Ex-USSR Country Codes Profile
  1768. 4 April 1997
  1769. Below is a summary of the country codes that have formed in the wake
  1770. of the USSR dissolution, along with some updated findings and reports.
  1771. Additional or corrected information on any of these nations would be
  1772. welcome (c/o dleibold@else.net).
  1773. * Kyrgyz Republic country code 996 will take effect, at least in
  1774.   Canada, effective 1 May 1997, according to CRTC Telecom Order 97-464,
  1775.   based on Stentor Tariff Notice 433. There is no indication whether
  1776.   there will be a permissive dialing period involved or for how long
  1777.   such a permissive operation would remain.
  1778. * Country code 992 was reported as a recent assignment for Tajikistan,
  1779.   which will be moving from country code 7 at some unknown time.
  1780. * Uzbekistan has its own country code assignment, but I have no
  1781.   information if this is in service yet or what implementation dates
  1782.   have been set.
  1783. * Kazakstan does not have a known separate country code assignment
  1784.   at present. It remains in country code 7 for the time being.
  1785. * Russia seems destined to keep country code 7.
  1786. * Recent news reports speak of some agreements forming between Russia and
  1787. Belarus. While there is no outright reunification yet, there is expected
  1788. to be much closer ties between the two nations. Whether this will lead to
  1789. a reunification of telephone codes remains to be seen.
  1790. In the table, "Effective" means the date at which the country code
  1791. began service (which could vary according to the nation). "Mandatory"
  1792. means the date at which the country code 7 is invalid for calls to
  1793. that nation. There are a number of question marks since exact
  1794. dates have not been collected in all cases.
  1795. CC  Nation            Effective     Mandatory    Notes
  1796. 370 Lithuania         1993?         ???          Announced Jan 1993
  1797. 371 Latvia            1993?         ???
  1798. 372 Estonia           1 Feb 1993?   March 1993?
  1799. 373 Moldova           1993?         ???          Announced Jan 1993
  1800. 374 Armenia           1 May 1995    1 July 1995  Announced Jan 1995 (ITU)
  1801. 375 Belarus           16 Apr 1995   1997?
  1802. 380 Ukraine           16 Apr 1995   Oct 1995?
  1803. 7   Kazakstan         (no known changes)
  1804. 7   Russia            (presumably not changing)
  1805. 992 Tajikistan        ???           ???          Announced 1996-7?
  1806. 993 Turkmenistan      3 Jan 1997    3 Apr 1997   Canada as of 29 Nov 1996
  1807. 994 Azerbaijan        Sept 1994?    ???          Announced 1992
  1808. 995 Georgia           1994?         ???          ref: Telecom Digest Oct 1994
  1809. 996 Kyrgyz Republic   1 May 1997    ???          ref: Stentor Canada/CRTC
  1810. 998 Uzbekistan        ???           ???          Announced 1996? (ITU)
  1811. Details courtesy Toby Nixon, ITU, Stentor (Canada), CRTC (Canada),
  1812. TELECOM Digest (including information collected for the country code
  1813. listings).
  1814. IV. ERRATA & CORRIGENDA
  1815. The following errors in "Using C-Kermit", Second Edition, first printing,
  1816. have been noted.
  1817. First, some missing acknowledgements for C-Kermit 6.0: JE Jones of Microware
  1818. for help with OS-9, Nigel Roles for his help with Plan 9, Lucas Hart for help
  1819. with VMS and Digital UNIX, Igor Kovalenko for his help with QNX.  And later,
  1820. to Susan Kleinmann for her help with Debian Linux packaging; Patrick
  1821. Volkerding for his help with Slackware Linux packaging; Jim Knoble for his
  1822. help with Red Hat Linux packaging; and to dozens of others for sending
  1823. individual C-Kermit binaries for varied and diverse platforms.
  1824. Thanks to James Spath for both binaries and reporting many of the typos
  1825. noted below.  Also to Dat Thuc Nguyen for spotting several typos.
  1826. PAGE    REMARKS
  1827. COVER   "COS" is a misprint.  There is no COS.  Pretend it says "SCO" or "VOS".
  1828.         (This is fixed in the second printing.)
  1829.  xxi    Second line: Fred Smith's affiliation should be Computrition.
  1830.  83     Change "commands other" to "commands as other" (1st paragraph)
  1831.  87     Change "The the" to "The" (2nd paragraph)
  1832.  92     "set modem-type user-defined supra" should be "set modem type ..."
  1833.  95     Change "VI" to "vi" (1st paragraph)
  1834.  96     Change "it it" to "it is" (1st paragraph)
  1835.  97     Change "advantage a literal" to "advantage of a literal" (2nd
  1836.         paragraph)
  1837. 102     The call-waiting example would be better as SET DIAL PREFIX *70W
  1838.         (rather than "*70,") because the former will not cause an incorrect
  1839.         call to be placed with pulse dialing.
  1840. 123     Third paragraph from bottom: "..otherwise if a your local username.."
  1841.         should be "..otherwise your local username..".
  1842. 160     Delete the "it" between "and" and "to" (2nd paragraph)
  1843. 185     In "When TRANSFER DISPLAY is OFF, C-Kermit skips the display...",
  1844.         "OFF" should be "NONE".
  1845. 187     The last paragraph says the "A command" is ignored, should be "S".
  1846. 194     Change "it known" to "it is known" (4th paragraph).
  1847. 235     In C-Kermit 7.0, the syntax of the GET command changed.  MGET now
  1848.         must be used to get a list of files and there is no more multiline
  1849.         GET command.
  1850. 268     Last paragraph: "effect" should be "affect".
  1851. 275     In the SET PROTOCOL KERMIT description, the following sentence is
  1852.         incorrect and should be removed: 'If you omit the commands, the
  1853.         default ones are restored: "kermit -ir" and "kermit -r" respectively".
  1854.         The correct information is given at the bottom of page 281.
  1855. 279     9th line.  The decimal value of ST is 156, not 155.
  1856. 295     In the stepping stones, skip ahead to Chapter 17 on p. 327.
  1857. 298     Table 16-2, Portuguese entry.  Column 4/00 should show section sign,
  1858.         not acute accent.
  1859. 316     Other languages written in the Hebrew alphabet include Karaim (a Turkic
  1860.         language spoken in Lithuania and Poland), Judeo-Kurdish, and Judeo-
  1861.         Georgian.
  1862. 332     UNDEFINE definition, change "This just" to "This is just".
  1863. 344     It might be necessary to set the modem's pulse generation rate when
  1864.         sending numeric pages; most Hayes compatible modems use the S11
  1865.         register for this.
  1866. 350     Delete "is" from between "It" and "ceases" (4th paragraph)
  1867. 351     Top - both occurrences of "print %a" should be "echo %a".
  1868. 364     v(input) and v(query) out of alphabetical order.
  1869. 378     In the MYSEND macro, "if not m(rc) goto bad" should be:
  1870.         "if m(rc) goto bad" (remove the "not").
  1871. 382-383 It should be stated that the loop control variable must be of the %a
  1872.         type, or else an array element; macro names can not be used for this.
  1873. 383     In line 3, "%f[%i]" should be "&f[%i]".
  1874. 383     In the sort example, it should be stated that the array is 1-based.
  1875. 387     Change "You can list" to "You can get a list" (5th paragraph)
  1876. 393     Fverify() description.  The 3rd sentence could be stated more clearly
  1877.         as "If all characters in string2 are also in string1, 0 is returned."
  1878. 398     Copying ffiles() results to an array before is not required as of
  1879.         C-Kermit 7.0 (see section 7.3).
  1880. 403     In "(%a + 3) * (%b  5)", a minus sign is missing between b and 5.
  1881. 407     C-Kermit 7.0 no longer supports multiline GET.  Change
  1882.         "get, %1, %2" to "get {%1} {%2}" or "get /as:{%2} {%1}".
  1883. 409     READ example while loop should be:
  1884.         while success { echo m(line), read line }
  1885. 409     "WRITE file" should be "WRITE keyword" (you can't put a filename there)
  1886.         (The same applies to WRITE-LINE / WRITELN).
  1887. 414     Funhexify() missing from Table 18-3.
  1888. 425     MINPUT definition, change 2nd "text2" to "text3".
  1889. 436     Several lines are missing from the UNIXLOGIN macro listing.
  1890.         After the "xif fail" block, insert:
  1891.   out %113                    ; Send username, carriage return
  1892.   inp 5 Password:               ; Wait 5 sec for this prompt
  1893.   if fail end 1 No password prompt
  1894.   pause                         ; Wait a sec
  1895.   out %213                    ; Send password
  1896. 440     Change "set terminal byteszie" to "set terminal bytesize".
  1897.         Change "input Password:" to "input 10 Password".
  1898. 448     Franchise script: "access line" should be "access m(line)".
  1899. 453     There are two incorrectly coded IF statements in the DELIVER macro
  1900.         definition.  Replace both occurrences of "if > %1 %3 {" with
  1901.         "xif > %i %3 {" (replace "if" by "xif" and "%1" with "%i").
  1902. 453     "the the" (last paragraph) should be "the".
  1903. 454     EOT (last paragraph) is End of Transmission, not End of Text.
  1904. 457     _DEFINE definition: "name constructed" should be "name is constructed".
  1905. 457     "macro for and" (last paragraph) should be "macro and".
  1906. 459     Should explain that v(user) is a legal abbreviation of v(userid).
  1907. 480     Figure II-2 is backwards; the least-significant bit is transmitted
  1908.         first, then up to the highest, and the parity bit last.
  1909. 534     The VMS Appendix section on Odd Record Lengths no longer applies;
  1910.         C-Kermit 7.0 handles odd record lengths as well as even ones.
  1911. 559     Table VIII-3, Portuguese entry.  Column 4/00 should show section sign,
  1912.         not acute accent.
  1913. 560-563 HP-Roman8 missing from Table VII-4; there wasn't room to squeeze it in.
  1914.         It is listed in section II(6).
  1915. 565     "d stroke" in Table VII-5 has the wrong appearance; the stem should
  1916.         be upright.  The letter shown in the table is actually a lowercase
  1917.         Icelandic eth, which has a curved stem.
  1918. 601-604 BeBox, BeOS, Plan 9, and probably others not listed in trademarks.
  1919. 604     The words "SCRIBE TEXT FORMATTER" appear at the end of the last
  1920.         sentence of the first paragraph of the Colophon.  They should have
  1921.         been in the Index.
  1922. Index:  Missing entries: SET { SEND, RECEIVE } PATHNAMES, Call waiting, ...
  1923. F()            Page 605, add also 413-414
  1924. Fbreak         389
  1925. Fcapitalize    390
  1926. Fchecksum      414
  1927. Fcrc16         414
  1928. Fexecute       414
  1929. Fhexify        390
  1930. Fltrim         391
  1931.         Frepeat        392
  1932. Fspawn         392
  1933. Ftod2secs      399
  1934. v() built_in   Page 606, add also 361-364
  1935. v(_line)       354, 361
  1936. v(apcactive)   361
  1937. v(charset)     362
  1938. v(cpu)         362
  1939. v(crc16)       357, 362
  1940. v(d$xxx)       add page 362
  1941. v(dialnumber)  362
  1942. v(dialresult)  362
  1943. v(errno)       362
  1944. v(errstring)   362
  1945. v(exedir)      362
  1946. v(inidir)      363
  1947. v(ipaddress)   363
  1948. v(keyboard)    363
  1949. v(macro)       363
  1950. v(minput)      363
  1951. v(m_xxx)       94, 363
  1952. v(password)    364
  1953. v(query)       364
  1954. v(prompt)      364
  1955. v(speed)       356, 364
  1956. v(startup)     364
  1957. v(status)      364
  1958. v(sysid)       364
  1959. v(system)      364
  1960. v(fsize)       at lower half page 606 should read v(tfsize)
  1961. v(xversion)    364
  1962.         BEEP Command    40
  1963.         SET FLOW        62, 212
  1964. Figure II-5 on page 493.  The pin assignments of the Mini Din-8 connector
  1965. are not described anywhere.  As noted in the text, these tend to vary from
  1966. vendor to vendor.  One common arrangement is:
  1967.   1. HSKout (Handshake out -- definition depends on software)
  1968.   2. HSKin  (Handshake in or external clock)
  1969.   3. TxD-
  1970.   4. Not used
  1971.   5. RxD-
  1972.   6. TxD+
  1973.   7. Not used
  1974.   8. RxD+
  1975. Note the "balanced pairs" for Receive Data (RxD) and Transmit Data (TxD), and
  1976. the utter lack of modem signals.  These connectors follow the RS-423 standard,
  1977. rather than RS-232.  In some arrangements, Pin 1 is used for DTR and Pin 2 for
  1978. CD; in others Pin 1 is RTS and Pin 2 is CTS.
  1979. Please send reports of other errors to the authors, as well as suggestions for
  1980. improvements, additional index entries, and any other comments:
  1981.   kermit@columbia.edu
  1982. APPENDIX V. ADDITIONAL COPYRIGHT NOTICES
  1983. The following copyrights cover some of the source code used in the development
  1984. of C-Kermit, Kermit 95, or Kermit 95 support libraries.
  1985. /*****************************************************************************/
  1986. /*                                                                           */
  1987. /*              Copyright (c) 1995 by Oy Online Solutions Ltd.               */
  1988. /*                                                                           */
  1989. /*   Distribution of this source code is strictly forbbidden. Use of this    */
  1990. /*   source code is granted to the University of Columbia C-Kermit project   */
  1991. /*   to be distributed in binary format only. Please familiarize yourself    */
  1992. /*   with the accompanying LICENSE.P file.                                   */
  1993. /*                                                                           */
  1994. /*****************************************************************************/
  1995. used for Xmodem, Ymodem, and Zmodem protocol in Kermit 95 (p95.dll, p2.dll)
  1996. -----
  1997. Copyright (c) 1997 Stanford University
  1998. The use of this software for revenue-generating purposes may require a
  1999. license from the owners of the underlying intellectual property.
  2000. Specifically, the SRP-3 protocol may not be used for revenue-generating
  2001. purposes without a license.
  2002. Within that constraint, permission to use, copy, modify, and distribute
  2003. this software and its documentation for any purpose is hereby granted
  2004. without fee, provided that the above copyright notices and this permission
  2005. notice appear in all copies of the software and related documentation.
  2006. THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  2007. EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  2008. WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  2009. IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
  2010. INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
  2011. RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
  2012. THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
  2013. OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  2014. Used for Secure Remote Password (TM) protocol (SRP) in C-Kermit,
  2015. Kermit 95 (k95.exe, k2.exe, k95crypt.dll, k2crypt.dll)
  2016. -----
  2017. Copyright 1990 by the Massachusetts Institute of Technology.
  2018. All Rights Reserved.
  2019. Export of this software from the United States of America may
  2020.   require a specific license from the United States Government.
  2021.   It is the responsibility of any person or organization contemplating
  2022.   export to obtain such a license before exporting.
  2023. WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
  2024. distribute this software and its documentation for any purpose and
  2025. without fee is hereby granted, provided that the above copyright
  2026. notice appear in all copies and that both that copyright notice and
  2027. this permission notice appear in supporting documentation, and that
  2028. the name of M.I.T. not be used in advertising or publicity pertaining
  2029. to distribution of the software without specific, written prior
  2030. permission.  M.I.T. makes no representations about the suitability of
  2031. this software for any purpose.  It is provided "as is" without express
  2032. or implied warranty.
  2033. Used for Telnet Authentication Option, Telnet Encryption Option,
  2034. and Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
  2035. k95crypt.dll, k2crypt.dll)
  2036. -----
  2037. Copyright (c) 1991, 1993
  2038. The Regents of the University of California.  All rights reserved.
  2039. Redistribution and use in source and binary forms, with or without
  2040. modification, are permitted provided that the following conditions
  2041. are met:
  2042. 1. Redistributions of source code must retain the above copyright
  2043.    notice, this list of conditions and the following disclaimer.
  2044. 2. Redistributions in binary form must reproduce the above copyright
  2045.    notice, this list of conditions and the following disclaimer in the
  2046.    documentation and/or other materials provided with the distribution.
  2047. 3. All advertising materials mentioning features or use of this software
  2048.    must display the following acknowledgement:
  2049. This product includes software developed by the University of
  2050. California, Berkeley and its contributors.
  2051. 4. Neither the name of the University nor the names of its contributors
  2052.    may be used to endorse or promote products derived from this software
  2053.    without specific prior written permission.
  2054. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  2055. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  2056. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  2057. ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  2058. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  2059. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  2060. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  2061. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  2062. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  2063. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  2064. SUCH DAMAGE.
  2065. Used for Telnet Authentication Option, Telnet Encryption Option,
  2066. and Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
  2067. k95crypt.dll, k2crypt.dll)
  2068. -----
  2069. Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
  2070. All rights reserved.
  2071. This package is an DES implementation written by Eric Young
  2072. (eay@cryptsoft.com).  The implementation was written so as to conform with
  2073. MIT's libdes.
  2074. This library is free for commercial and non-commercial use as long as
  2075. the following conditions are aheared to.  The following conditions
  2076. apply to all code found in this distribution.
  2077. Copyright remains Eric Young's, and as such any Copyright notices in
  2078. the code are not to be removed.
  2079. If this package is used in a product, Eric Young should be given attribution
  2080. as the author of that the SSL library.  This can be in the form of a textual
  2081. message at program startup or in documentation (online or textual) provided
  2082. with the package.
  2083. Redistribution and use in source and binary forms, with or without
  2084. modification, are permitted provided that the following conditions
  2085. are met:
  2086. 1. Redistributions of source code must retain the copyright
  2087.    notice, this list of conditions and the following disclaimer.
  2088. 2. Redistributions in binary form must reproduce the above copyright
  2089.    notice, this list of conditions and the following disclaimer in the
  2090.    documentation and/or other materials provided with the distribution.
  2091. 3. All advertising materials mentioning features or use of this software
  2092.    must display the following acknowledgement:
  2093.    This product includes software developed by Eric Young (eay@cryptsoft.com)
  2094. THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  2095. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  2096. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  2097. ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  2098. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  2099. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  2100. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  2101. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  2102. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  2103. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  2104. SUCH DAMAGE.
  2105. The license and distribution terms for any publically available version or
  2106. derivative of this code cannot be changed.  i.e. this code cannot simply be
  2107. copied and put under another distrubution license
  2108. [including the GNU Public License.]
  2109. The reason behind this being stated in this direct manner is past
  2110. experience in code simply being copied and the attribution removed
  2111. from it and then being distributed as part of other packages. This
  2112. implementation was a non-trivial and unpaid effort.
  2113. Used DES encryption in Kermit 95 (k95crypt.dll, k2crypt.dll)
  2114. ----
  2115.  * This is version 1.1 of CryptoLib
  2116.  *
  2117.  * The authors of this software are Jack Lacy, Don Mitchell and Matt Blaze
  2118.  *              Copyright (c) 1991, 1992, 1993, 1994, 1995 by AT&T.
  2119.  * Permission to use, copy, and modify this software without fee
  2120.  * is hereby granted, provided that this entire notice is included in
  2121.  * all copies of any software which is or includes a copy or
  2122.  * modification of this software and in all copies of the supporting
  2123.  * documentation for such software.
  2124.  *
  2125.  * NOTE:
  2126.  * Some of the algorithms in cryptolib may be covered by patents.
  2127.  * It is the responsibility of the user to ensure that any required
  2128.  * licenses are obtained.
  2129.  *
  2130.  *
  2131.  * SOME PARTS OF CRYPTOLIB MAY BE RESTRICTED UNDER UNITED STATES EXPORT
  2132.  * REGULATIONS.
  2133.  *
  2134.  *
  2135.  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
  2136.  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY
  2137.  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
  2138.  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  2139. Used for Big Number library in Kermit 95 (k95crypt.dll, k2crypt.dll).
  2140. ------------------------------
  2141. END OF CKERMIT2.TXT