aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 11:01:20 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:40 +1000
commitd3ccac54f2880de57002009daa7cceda069454fd (patch)
tree47cbbad7e54b7b5a743b98f3c8eb1edd3470a58d
parentc5f4f3547c0dde01c51ec1b79f53e635d1351f0b (diff)
downloadjimtcl-d3ccac54f2880de57002009daa7cceda069454fd.zip
jimtcl-d3ccac54f2880de57002009daa7cceda069454fd.tar.gz
jimtcl-d3ccac54f2880de57002009daa7cceda069454fd.tar.bz2
jimsh improvements plus documentation
Add /lib/jim to the default auto_path *: Otherwise there is no 'standard' location to install packages Prompt should show name for all non-zero return types Initial documentation for Jim ------------------------------------------------------------------------
-rw-r--r--doc/Makefile2
-rw-r--r--doc/jim_tcl.txt2865
-rw-r--r--jim-interactive.c2
-rw-r--r--jim.c4
4 files changed, 2868 insertions, 5 deletions
diff --git a/doc/Makefile b/doc/Makefile
index ae38ddc..00c7ce7 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -1,4 +1,4 @@
all: Tcl.html
-Tcl.html: jim_man.txt
+Tcl.html: jim_tcl.txt
asciidoc -o $@ -d manpage $^ || cp Tcl.html.supplied $@
diff --git a/doc/jim_tcl.txt b/doc/jim_tcl.txt
new file mode 100644
index 0000000..d733d50
--- /dev/null
+++ b/doc/jim_tcl.txt
@@ -0,0 +1,2865 @@
+Jim Tcl(n)
+==========
+
+NAME
+----
+Jim Tcl - overview of the Jim tool command language facilities
+
+SYNOPSIS
+--------
+
+ cc <source> -ljim
+
+or
+
+ jimsh <script>
+
+INTRODUCTION
+------------
+Jim is a reimplementation of Tcl, combining some features from
+earlier, smaller versions of Tcl (6.x) as well as more modern
+features from later versions of Tcl (7.x, 8.x). It also has some some
+entirely new features not available in any version of Tcl.
+
+This version is approximately the same size as "tinytcl" (6.8) but
+is faster and has more features.
+
+Note that most of this man page is the original 6.8 Tcl man page, with
+changes made for differences with Jim.
+
+The major differences are:
+1. Object-based I/O (aio) with backward compatibility wrapper
+2. I/O: Support for sockets (client and server)
+3. I/O: Support for readable/writable event handlers
+4. Integers are 64bit
+5. Support for references (ref/getref/setref) and garbage collection
+6. Builtin dictionary type (dict)
+7. file mkdir, file rename (Tcl 7.x)
+8. env command to access environment variables
+9. List: lmap, lset, lreverse (Tcl 8.x)
+10. os.fork
+11. rand
+12. string map (Tcl 7.x)
+13. subst (Tcl 7.x)
+14. switch (Tcl 7.x) (note that case is provided for compatibility)
+15. Must better error reporting. info stacktrace as a replacement for errorInfo, errorCode
+17. Support for "static" variables in procedures
+16. Significantly faster for many scripts/operations
+17. Command pipelines via open "|..." are not supported
+18. Variable traces are not supported
+19. The history command is not supported
+
+TCL INTRODUCTION
+-----------------
+Tcl stands for 'tool command language' and is pronounced 'tickle.'
+It is actually two things: a language and a library.
+
+First, Tcl is a simple textual language, intended primarily for
+issuing commands to interactive programs such as text editors,
+debuggers, illustrators, and shells. It has a simple syntax and is also
+programmable, so Tcl users can write command procedures to provide more
+powerful commands than those in the built-in set.
+
+Second, Tcl is a library package that can be embedded in application
+programs. The Tcl library consists of a parser for the Tcl language,
+routines to implement the Tcl built-in commands, and procedures that
+allow each application to extend Tcl with additional commands specific
+to that application. The application program generates Tcl commands and
+passes them to the Tcl parser for execution. Commands may be generated
+by reading characters from an input source, or by associating command
+strings with elements of the application's user interface, such as menu
+entries, buttons, or keystrokes.
+
+When the Tcl library receives commands it parses them into component
+fields and executes built-in commands directly. For commands implemented
+by the application, Tcl calls back to the application to execute the
+commands. In many cases commands will invoke recursive invocations of the
+Tcl interpreter by passing in additional strings to execute (procedures,
+looping commands, and conditional commands all work in this way).
+
+An application program gains three advantages by using Tcl for its command
+language. First, Tcl provides a standard syntax: once users know Tcl,
+they will be able to issue commands easily to any Tcl-based application.
+Second, Tcl provides programmability. All a Tcl application needs
+to do is to implement a few application-specific low-level commands.
+Tcl provides many utility commands plus a general programming interface
+for building up complex command procedures. By using Tcl, applications
+need not re-implement these features.
+
+Third, Tcl can be used as a common language for communicating between
+applications. Inter-application communication is not built into the
+Tcl core described here, but various add-on libraries, such as the Tk
+toolkit, allow applications to issue commands to each other. This makes
+it possible for applications to work together in much more powerful ways
+than was previously possible.
+
+This manual page focuses primarily on the Tcl language. It describes
+the language syntax and the built-in commands that will be available
+in any application based on Tcl. The individual library procedures are
+described in more detail in separate manual pages, one per procedure.
+
+INTERPRETERS
+------------
+The central data structure in Tcl is an interpreter (C type 'Jim_Interp').
+An interpreter consists of a set of command bindings, a set of variable
+values, and a few other miscellaneous pieces of state. Each Tcl command
+is interpreted in the context of a particular interpreter.
+
+Some Tcl-based applications will maintain multiple interpreters
+simultaneously, each associated with a different widget or portion of
+the application. Interpreters are relatively lightweight structures.
+They can be created and deleted quickly, so application programmers should
+feel free to use multiple interpreters if that simplifies the application.
+
+DATA TYPES
+----------
+Tcl supports only one type of data: strings. All commands, all arguments
+to commands, all command results, and all variable values are strings.
+
+Where commands require numeric arguments or return numeric results,
+the arguments and results are passed as strings. Many commands expect
+their string arguments to have certain formats, but this interpretation
+is up to the individual commands. For example, arguments often contain
+Tcl command strings, which may get executed as part of the commands.
+The easiest way to understand the Tcl interpreter is to remember that
+everything is just an operation on a string. In many cases Tcl constructs
+will look similar to more structured constructs from other languages.
+However, the Tcl constructs are not structured at all; they are just
+strings of characters, and this gives them a different behavior than
+the structures they may look like.
+
+Although the exact interpretation of a Tcl string depends on who is doing
+the interpretation, there are three common forms that strings take:
+commands, expressions, and lists. The major sections below discuss
+these three forms in more detail.
+
+BASIC COMMAND SYNTAX
+--------------------
+The Tcl language has syntactic similarities to both the Unix shells
+and Lisp. However, the interpretation of commands is different
+in Tcl than in either of those other two systems.
+A Tcl command string consists of one or more commands separated
+by newline characters or semi-colons.
+Each command consists of a collection of fields separated by
+white space (spaces or tabs).
+The first field must be the name of a command, and the
+additional fields, if any, are arguments that will be passed to
+that command. For example, the command:
+
+ set a 22
+
+has three fields: the first, 'set', is the name of a Tcl command, and
+the last two, 'a' and '22', will be passed as arguments to
+the 'set' command. The command name may refer either to a built-in
+Tcl command, an application-specific command bound in with the library
+procedure 'Jim_CreateCommand', or a command procedure defined with the
+'proc' built-in command.
+
+Arguments are passed literally as text strings. Individual commands may
+interpret those strings in any fashion they wish. The 'set' command,
+for example, will treat its first argument as the name of a variable
+and its second argument as a string value to assign to that variable.
+For other commands arguments may be interpreted as integers, lists,
+file names, or Tcl commands.
+
+Command names should normally be typed completely (e.g. no abbreviations).
+However, if the Tcl interpreter cannot locate a command it invokes a
+special command named 'unknown' which attempts to find or create the
+command.
+
+For example, at many sites 'unknown' will search through library
+directories for the desired command and create it as a Tcl procedure if
+it is found. The 'unknown' command often provides automatic completion
+of abbreviated commands, but usually only for commands that were typed
+interactively.
+
+It's probably a bad idea to use abbreviations in command scripts and
+other forms that will be re-used over time: changes to the command set
+may cause abbreviations to become ambiguous, resulting in scripts that
+no longer work.
+
+COMMENTS
+--------
+If the first non-blank character in a command is '\#', then everything
+from the '\#' up through the next newline character is treated as
+a comment and ignored. When comments are embedded inside nested
+commands (e.g. fields enclosed in braces) they must have properly-matched
+braces (this is necessary because when Tcl parses the top-level command
+it doesn't yet know that the nested field will be used as a command so
+it cannot process the nested comment character as a comment).
+
+GROUPING ARGUMENTS WITH DOUBLE-QUOTES
+-------------------------------------
+Normally each argument field ends at the next white space, but
+double-quotes may be used to create arguments with embedded space.
+
+If an argument field begins with a double-quote, then the argument isn't
+terminated by white space (including newlines) or a semi-colon (see below
+for information on semi-colons); instead it ends at the next double-quote
+character. The double-quotes are not included in the resulting argument.
+For example, the command
+
+ set a "This is a single argument"
+
+will pass two arguments to 'set': 'a' and 'This is a single argument'.
+
+Within double-quotes, command substitutions, variable substitutions,
+and backslash substitutions still occur, as described below. If the
+first character of a command field is not a quote, then quotes receive
+no special interpretation in the parsing of that field.
+
+GROUPING ARGUMENTS WITH BRACES
+------------------------------
+Curly braces may also be used for grouping arguments. They are similar
+to quotes except for two differences. First, they nest; this makes them
+easier to use for complicated arguments like nested Tcl command strings.
+Second, the substitutions described below for commands, variables, and
+backslashes do *not* occur in arguments enclosed in braces, so braces
+can be used to prevent substitutions where they are undesirable.
+
+If an argument field begins with a left brace, then the argument ends
+at the matching right brace. Tcl will strip off the outermost layer
+of braces and pass the information between the braces to the command
+without any further modification. For example, in the command
+
+ set a {xyz a {b c d}}
+
+the 'set' command will receive two arguments: 'a'
+and 'xyz a {b c d}'.
+
+When braces or quotes are in effect, the matching brace or quote need
+not be on the same line as the starting quote or brace; in this case
+the newline will be included in the argument field along with any other
+characters up to the matching brace or quote. For example, the 'eval'
+command takes one argument, which is a command string; 'eval' invokes
+the Tcl interpreter to execute the command string. The command
+
+ eval {
+ set a 22
+ set b 33
+ }
+
+will assign the value '22' to 'a' and '33' to 'b'.
+
+If the first character of a command field is not a left
+brace, then neither left nor right
+braces in the field will be treated specially (except as part of
+variable substitution; see below).
+
+COMMAND SUBSTITUTION WITH BRACKETS
+----------------------------------
+If an open bracket occurs in a field of a command, then command
+substitution occurs (except for fields enclosed in braces). All of the
+text up to the matching close bracket is treated as a Tcl command and
+executed immediately. Then the result of that command is substituted
+for the bracketed text. For example, consider the command
+
+ set a [set b]
+
+When the 'set' command has only a single argument, it is the name of a
+variable and 'set' returns the contents of that variable. In this case,
+if variable 'b' has the value 'foo', then the command above is equivalent
+to the command
+
+ set a foo
+
+Brackets can be used in more complex ways. For example, if the variable
+'b' has the value 'foo' and the variable 'c' has the value 'gorp',
+then the command
+
+ set a xyz[set b].[set c]
+
+is equivalent to the command
+
+ set a xyzfoo.gorp
+
+
+A bracketed command may contain multiple commands separated by newlines
+or semi-colons in the usual fashion. In this case the value of the last
+command is used for substitution. For example, the command
+
+ set a x[set b 22
+ expr $b+2]x
+
+is equivalent to the command
+
+ set a x24x
+
+
+If a field is enclosed in braces then the brackets and the characters
+between them are not interpreted specially; they are passed through to
+the argument verbatim.
+
+VARIABLE SUBSTITUTION WITH $
+----------------------------
+The dollar sign ('$') may be used as a special shorthand form for
+substituting variable values. If '$' appears in an argument that isn't
+enclosed in braces then variable substitution will occur. The characters
+after the '$', up to the first character that isn't a number, letter,
+or underscore, are taken as a variable name and the string value of that
+variable is substituted for the name.
+
+For example, if variable 'foo' has the value 'test', then the command
+
+ set a $foo.c
+
+is equivalent to the command
+
+ set a test.c
+
+There are two special forms for variable substitution. If the next
+character after the name of the variable is an open parenthesis, then
+the variable is assumed to be an array name, and all of the characters
+between the open parenthesis and the next close parenthesis are taken as
+an index into the array. Command substitutions and variable substitutions
+are performed on the information between the parentheses before it is
+used as an index.
+
+For example, if the variable 'x' is an array with one element named
+'first' and value '87' and another element named '14' and value 'more',
+then the command
+
+ set a xyz$x(first)zyx
+
+is equivalent to the command
+
+ set a xyz87zyx
+
+If the variable 'index' has the value '14', then the command
+
+ set a xyz$x($index)zyx
+
+is equivalent to the command
+
+ set a xyzmorezyx
+
+For more information on arrays, see VARIABLES AND ARRAYS below.
+
+The second special form for variables occurs when the dollar sign is
+followed by an open curly brace. In this case the variable name consists
+of all the characters up to the next curly brace.
+
+Array references are not possible in this form: the name between braces
+is assumed to refer to a scalar variable. For example, if variable
+'foo' has the value 'test', then the command
+
+ set a abc${foo}bar
+
+is equivalent to the command
+
+ set a abctestbar
+
+
+Variable substitution does not occur in arguments that are enclosed in
+braces: the dollar sign and variable name are passed through to the
+argument verbatim.
+
+The dollar sign abbreviation is simply a shorthand form. '$a' is
+completely equivalent to '[set a]'; it is provided as a convenience
+to reduce typing.
+
+SEPARATING COMMANDS WITH SEMI-COLONS
+------------------------------------
+Normally, each command occupies one line (the command is terminated by a
+newline character). However, semi-colon (';') is treated as a command
+separator character; multiple commands may be placed on one line by
+separating them with a semi-colon. Semi-colons are not treated as
+command separators if they appear within curly braces or double-quotes.
+
+BACKSLASH SUBSTITUTION
+----------------------
+Backslashes may be used to insert non-printing characters into command
+fields and also to insert special characters like braces and brackets
+into fields without them being interpreted specially as described above.
+
+The backslash sequences understood by the Tcl interpreter are
+listed below. In each case, the backslash
+sequence is replaced by the given character:
+
++{backslash}b+::
+ Backspace (0x8)
+
++{backslash}f+::
+ Form feed (0xc)
+
++{backslash}n+::
+ Newline (0xa)
+
++{backslash}r+::
+ Carriage-return (0xd).
+
++{backslash}t+::
+ Tab (0x9).
+
++{backslash}v+::
+ Vertical tab (0xb).
+
++{backslash}{+::
+ Left brace ({).
+
++{backslash}}+::
+ Right brace (}).
+
++{backslash}[+::
+ Open bracket ([).
+
++{backslash}]+::
+ Close bracket (]).
+
++{backslash}$+::
+ Dollar sign ($).
+
++{backslash}<space>+::
+ Space ( ): doesn't terminate argument.
+
++{backslash};+::
+ Semi-colon: doesn't terminate command.
+
++{backslash}"+::
+ Double-quote.
+
++{backslash}<newline>+::
+ Nothing: this joins two lines together
+ into a single line. This backslash feature is unique in that
+ it will be applied even when the sequence occurs within braces.
+
++{backslash}{backslash}+::
+ Backslash ('{backslash}').
+
++{backslash}*ddd*+::
+ The digits *ddd* (one, two, or three of them) give the octal value of
+ the character. Note that Jim supports null characters in strings.
+
+For example, in the command
+
+ set a \{x\[\ yz\141
+
+the second argument to 'set' will be '{x[ yza'.
+
+If a backslash is followed by something other than one of the options
+described above, then the backslash is transmitted to the argument
+field without any special processing, and the Tcl scanner continues
+normal processing with the next character. For example, in the
+command
+
+ set \*a \\\{foo
+
+The first argument to 'set' will be '{backslash}*a' and the second
+argument will be '{backslash}{foo'.
+
+If an argument is enclosed in braces, then backslash sequences inside
+the argument are parsed but no substitution occurs (except for
+backslash-newline): the backslash
+sequence is passed through to the argument as is, without making
+any special interpretation of the characters in the backslash sequence.
+In particular, backslashed braces are not counted in locating the
+matching right brace that terminates the argument.
+For example, in the
+command
+
+ set a {\{abc}
+
+the second argument to 'set' will be '{backslash}{abc'.
+
+This backslash mechanism is not sufficient to generate absolutely
+any argument structure; it only covers the
+most common cases. To produce particularly complicated arguments
+it is probably easiest to use the 'format' command along with
+command substitution.
+
+COMMAND SUMMARY
+---------------
+1. A command is just a string.
+2. Within a string commands are separated by newlines or semi-colons
+ (unless the newline or semi-colon is within braces or brackets
+ or is backslashed).
+3. A command consists of fields. The first field is the name of the command.
+ The other fields are strings that are passed to that command as arguments.
+4. Fields are normally separated by white space.
+5. Double-quotes allow white space and semi-colons to appear within
+ a single argument.
+ Command substitution, variable substitution, and backslash substitution
+ still occur inside quotes.
+6. Braces defer interpretation of special characters.
+ If a field begins with a left brace, then it consists of everything
+ between the left brace and the matching right brace. The
+ braces themselves are not included in the argument.
+ No further processing is done on the information between the braces
+ except that backslash-newline sequences are eliminated.
+7. If a field doesn't begin with a brace then backslash,
+ variable, and command substitution are done on the field. Only a
+ single level of processing is done: the results of one substitution
+ are not scanned again for further substitutions or any other
+ special treatment. Substitution can
+ occur on any field of a command, including the command name
+ as well as the arguments.
+8. If the first non-blank character of a command is a '\#', everything
+ from the '\#' up through the next newline is treated as a comment
+ and ignored.
+
+EXPRESSIONS
+-----------
+The second major interpretation applied to strings in Tcl is
+as expressions. Several commands, such as 'expr', 'for',
+and 'if', treat one or more of their arguments as expressions
+and call the Tcl expression processors ('Jim_ExprLong',
+'Jim_ExprBoolean', etc.) to evaluate them.
+
+The operators permitted in Tcl expressions are a subset of
+the operators permitted in C expressions, and they have the
+same meaning and precedence as the corresponding C operators.
+Expressions almost always yield numeric results
+(integer or floating-point values).
+For example, the expression
+
+ 8.2 + 6
+
+evaluates to 14.2.
+
+Tcl expressions differ from C expressions in the way that
+operands are specified, and in that Tcl expressions support
+non-numeric operands and string comparisons.
+
+A Tcl expression consists of a combination of operands, operators,
+and parentheses.
+
+White space may be used between the operands and operators and
+parentheses; it is ignored by the expression processor.
+Where possible, operands are interpreted as integer values.
+
+Integer values may be specified in decimal (the normal case), in octal (if the
+first character of the operand is '0'), or in hexadecimal (if the first
+two characters of the operand are '0x').
+
+If an operand does not have one of the integer formats given
+above, then it is treated as a floating-point number if that is
+possible. Floating-point numbers may be specified in any of the
+ways accepted by an ANSI-compliant C compiler (except that the
+'f', 'F', 'l', and 'L' suffixes will not be permitted in
+most installations). For example, all of the
+following are valid floating-point numbers: 2.1, 3., 6e4, 7.91e+16.
+
+If no numeric interpretation is possible, then an operand is left
+as a string (and only a limited set of operators may be applied to
+it).
+
+1. Operands may be specified in any of the following ways:
+
+2. As a numeric value, either integer or floating-point.
+
+3. As a Tcl variable, using standard '$' notation.
+The variable's value will be used as the operand.
+
+4. As a string enclosed in double-quotes.
+The expression parser will perform backslash, variable, and
+command substitutions on the information between the quotes,
+and use the resulting value as the operand
+
+5. As a string enclosed in braces.
+The characters between the open brace and matching close brace
+will be used as the operand without any substitutions.
+
+6. As a Tcl command enclosed in brackets.
+The command will be executed and its result will be used as
+the operand.
+
+Where substitutions occur above (e.g. inside quoted strings), they
+are performed by the expression processor.
+However, an additional layer of substitution may already have
+been performed by the command parser before the expression
+processor was called.
+
+As discussed below, it is usually best to enclose expressions
+in braces to prevent the command parser from performing substitutions
+on the contents.
+
+For some examples of simple expressions, suppose the variable 'a' has
+the value 3 and the variable 'b' has the value 6. Then the expression
+on the left side of each of the lines below will evaluate to the value
+on the right side of the line:
+
+ $a + 3.1 6.1
+ 2 + "$a.$b" 5.6
+ 4*[llength "6 2"] 8
+ {word one} < "word $a" 0
+
+The valid operators are listed below, grouped in decreasing order
+of precedence:
+
+`- ~ !`::
+ Unary minus, bit-wise NOT, logical NOT. None of these operands
+ may be applied to string operands, and bit-wise NOT may be
+ applied only to integers.
+
+`**`::
+ Power. e.g. pow(). Numbers only.
+
+`* / %`::
+ Multiply, divide, remainder. None of these operands may be
+ applied to string operands, and remainder may be applied only
+ to integers.
+
+`+ -`::
+ Add and subtract. Valid for any numeric operands.
+
+`<< >>`::
+ Left and right shift. Valid for integer operands only.
+
+`< > \<= >=`::
+ Boolean less, greater, less than or equal, and greater than or equal.
+ Each operator produces 1 if the condition is true, 0 otherwise.
+ These operators may be applied to strings as well as numeric operands,
+ in which case string comparison is used.
+
+`eq ne`::
+ String equal and not equal. Uses the string value directly without
+ attempting to convert to a number first.
+
+`== !=`::
+ Boolean equal and not equal. Each operator produces a zero/one result.
+ Valid for all operand types. Note that values will be converted to integers
+ if possible, then floating point types, and finally strings will be compared.
+
+`&`::
+ Bit-wise AND. Valid for integer operands only.
+
+`^`::
+ Bit-wise exclusive OR. Valid for integer operands only.
+
+`|`::
+ Bit-wise OR. Valid for integer operands only.
+
+`&&`::
+ Logical AND. Produces a 1 result if both operands are non-zero, 0 otherwise.
+ Valid for numeric operands only (integers or floating-point).
+
+`||`::
+ Logical OR. Produces a 0 result if both operands are zero, 1 otherwise.
+ Valid for numeric operands only (integers or floating-point).
+
+`x ? y : z`::
+ If-then-else, as in C. If *x*
+ evaluates to non-zero, then the result is the value of *y*.
+ Otherwise the result is the value of *z*.
+ The *x* operand must have a numeric value.
+ Note that Jim currently evaluates *both* sides of the expression regardless
+ of the value of *x*.
+
+See the C manual for more details on the results
+produced by each operator.
+All of the binary operators group left-to-right within the same
+precedence level. For example, the expression
+
+ 4*2 < 7
+
+evaluates to 0.
+
+The '&&', '||', and '?:' operators have 'lazy
+evaluation', just as in C,
+which means that operands are not evaluated if they are
+not needed to determine the outcome. For example, in
+
+ $v ? [a] : [b]
+
+only one of '[a]' or '[b]' will actually be evaluated,
+depending on the value of '$v'.
+
+*NOTE* This is currently not true of the ?: operator for Jim.
+
+All internal computations involving integers are done with the C type
+'long long', and all internal computations involving floating-point are
+done with the C type 'double'.
+When converting a string to floating-point, exponent overflow is
+detected and results in a Tcl error.
+For conversion to integer from string, detection of overflow depends
+on the behavior of some routines in the local C library, so it should
+be regarded as unreliable.
+In any case, overflow and underflow are generally not detected
+reliably for intermediate results.
+
+Conversion among internal representations for integer, floating-point,
+and string operands is done automatically as needed.
+For arithmetic computations, integers are used until some
+floating-point number is introduced, after which floating-point is used.
+For example,
+
+ 5 / 4
+
+yields the result 1, while
+
+ 5 / 4.0
+ 5 / ( [string length "abcd"] + 0.0 )
+
+both yield the result 1.25.
+
+String values may be used as operands of the comparison operators,
+although the expression evaluator tries to do comparisons as integer
+or floating-point when it can.
+If one of the operands of a comparison is a string and the other
+has a numeric value, the numeric operand is converted back to
+a string using the C 'sprintf' format specifier
+'%d' for integers and '%g' for floating-point values.
+For example, the expressions
+
+ "0x03" > "2"
+ "0y" < "0x12"
+
+both evaluate to 1. The first comparison is done using integer
+comparison, and the second is done using string comparison after
+the second operand is converted to the string '18'.
+
+
+In general it is safest to enclose an expression in braces when
+entering it in a command: otherwise, if the expression contains
+any white space then the Tcl interpreter will split it
+among several arguments. For example, the command
+
+ expr $a + $b
+
+results in three arguments being passed to 'expr': '$a',
+'+', and '$b'. In addition, if the expression isn't in braces
+then the Tcl interpreter will perform variable and command substitution
+immediately (it will happen in the command parser rather than in
+the expression parser). In many cases the expression is being
+passed to a command that will evaluate the expression later (or
+even many times if, for example, the expression is to be used to
+decide when to exit a loop). Usually the desired goal is to re-do
+the variable or command substitutions each time the expression is
+evaluated, rather than once and for all at the beginning. For example,
+the command
+
+ for {set i 1} $i<=10 {incr i} {...} *** WRONG ***
+
+is probably intended to iterate over all values of `i` from 1 to 10.
+After each iteration of the body of the loop, 'for' will pass
+its second argument to the expression evaluator to see whether or not
+to continue processing. Unfortunately, in this case the value of `i`
+in the second argument will be substituted once and for all when the
+'for' command is parsed. If `i` was 0 before the 'for'
+command was invoked then for's second argument will be `0\<=10`
+which will always evaluate to 1, even though `i` eventually
+becomes greater than 10. In the above case the loop will never
+terminate. Instead, the expression should be placed in braces:
+
+ for {set i 1} {$i<=10} {incr i} {...} *** RIGHT ***
+
+This causes the substitution of 'i'
+to be delayed; it will be re-done each time the expression is
+evaluated, which is the desired result.
+
+LISTS
+-----
+The third major way that strings are interpreted in Tcl is as lists.
+A list is just a string with a list-like structure
+consisting of fields separated by white space. For example, the
+string
+
+ Al Sue Anne John
+
+is a list with four elements or fields.
+Lists have the same basic structure as command strings, except
+that a newline character in a list is treated as a field separator
+just like space or tab. Conventions for braces and quotes
+and backslashes are the same for lists as for commands. For example,
+the string
+
+ a b\ c {d e {f g h}}
+
+is a list with three elements: 'a', 'b c', and 'd e {f g h}'.
+
+Whenever an element is extracted from a list, the same rules about
+braces and quotes and backslashes are applied as for commands. Thus in
+the example above when the third element is extracted from the list,
+the result is
+
+ d e {f g h}
+
+(when the field was extracted, all that happened was to strip off
+the outermost layer of braces). Command substitution and
+variable substitution are never
+made on a list (at least, not by the list-processing commands; the
+list can always be passed to the Tcl interpreter for evaluation).
+
+The Tcl commands 'concat', 'foreach', 'lappend', 'lindex', 'linsert',
+'list', 'llength', 'lrange', 'lreplace', 'lsearch', and 'lsort' allow
+you to build lists, extract elements from them, search them, and perform
+other list-related functions.
+
+REGULAR EXPRESSIONS
+-------------------
+Tcl provides two commands that support string matching using
+'egrep'-style regular expressions: 'regexp' and 'regsub'.
+
+Regular expressions are implemented using the system's C library as
+Extended Regular Expressions (EREs) rather than Basic Regular Expressions (BREs).
+
+See regex(3) and regex(7) for full details.
+
+*NOTE* Tcl 7.x and 8.x use perl-style Advanced Regular Expressions (AREs).
+
+COMMAND RESULTS
+---------------
+Each command produces two results: a code and a string. The
+code indicates whether the command completed successfully or not,
+and the string gives additional information. The valid codes are
+defined in jim.h, and are:
+
+JIM_OK::
+ This is the normal return code, and indicates that the command completed
+ successfully. The string gives the command's return value.
+
+JIM_ERROR::
+ Indicates that an error occurred; the string gives a message describing
+ the error.
+
+JIM_RETURN::
+ Indicates that the 'return' command has been invoked, and that the
+ current procedure (or top-level command or 'source' command)
+ should return immediately. The
+ string gives the return value for the procedure or command.
+
+JIM_BREAK::
+ Indicates that the 'break' command has been invoked, so the
+ innermost loop should abort immediately. The string should always
+ be empty.
+
+JIM_CONTINUE::
+ Indicates that the 'continue' command has been invoked, so the
+ innermost loop should go on to the next iteration. The string
+ should always be empty.
+
+JIM_EXIT::
+ Indicates that the command called the 'exit' command.
+ The string contains the exit code.
+
+JIM_SIGNAL::
+ Indicates that a signal was caught while executing a commands.
+ The string contains the name of the signal caught.
+ See the 'signal' and 'catch' commands.
+
+Tcl programmers do not normally need to think about return codes,
+since JIM_OK is almost always returned. If anything else is returned
+by a command, then the Tcl interpreter immediately stops processing
+commands and returns to its caller. If there are several nested
+invocations of the Tcl interpreter in progress, then each nested
+command will usually return the error to its caller, until eventually
+the error is reported to the top-level application code. The
+application will then display the error message for the user.
+
+In a few cases, some commands will handle certain 'error' conditions
+themselves and not return them upwards. For example, the 'for'
+command checks for the JIM_BREAK code; if it occurs, then 'for'
+stops executing the body of the loop and returns JIM_OK to its
+caller. The 'for' command also handles JIM_CONTINUE codes and the
+procedure interpreter handles JIM_RETURN codes. The 'catch'
+command allows Tcl programs to catch errors and handle them without
+aborting command interpretation any further.
+
+PROCEDURES
+----------
+Tcl allows you to extend the command interface by defining
+procedures. A Tcl procedure can be invoked just like any other Tcl
+command (it has a name and it receives one or more arguments).
+The only difference is that its body isn't a piece of C code linked
+into the program; it is a string containing one or more other
+Tcl commands. See the 'proc' command for information on
+how to define procedures and what happens when they are invoked.
+
+VARIABLES - SCALARS AND ARRAYS
+------------------------------
+Tcl allows the definition of variables and the use of their values
+either through '$'-style variable substitution, the 'set'
+command, or a few other mechanisms.
+
+Variables need not be declared: a new variable will automatically
+be created each time a new variable name is used.
+
+Tcl supports two types of variables: scalars and arrays.
+A scalar variable has a single value, whereas an array variable
+can have any number of elements, each with a name (called
+its 'index') and a value.
+
+Array indexes may be arbitrary strings; they need not be numeric.
+Parentheses are used refer to array elements in Tcl commands.
+For example, the command
+
+ set x(first) 44
+
+will modify the element of 'x' whose index is 'first'
+so that its new value is '44'.
+
+Two-dimensional arrays can be simulated in Tcl by using indexes
+that contain multiple concatenated values.
+For example, the commands
+
+ set a(2,3) 1
+ set a(3,6) 2
+
+set the elements of 'a' whose indexes are '2,3' and '3,6'.
+
+In general, array elements may be used anywhere in Tcl that scalar
+variables may be used.
+
+If an array is defined with a particular name, then there may
+not be a scalar variable with the same name.
+
+Similarly, if there is a scalar variable with a particular
+name then it is not possible to make array references to the
+variable.
+
+To convert a scalar variable to an array or vice versa, remove
+the existing variable with the 'unset' command.
+
+The 'array' command provides several features for dealing
+with arrays, such as querying the names of all the elements of
+the array and converting between an array and a list.
+
+Variables may be either global or local. If a variable
+name is used when a procedure isn't being executed, then it
+automatically refers to a global variable. Variable names used
+within a procedure normally refer to local variables associated with that
+invocation of the procedure. Local variables are deleted whenever
+a procedure exits. Either 'global' command may be used to request
+that a name refer to a global variable for the duration of the current
+procedure (this is somewhat analogous to 'extern' in C), or the variable
+may be explicitly scoped with the '::' prefix. For example
+
+ set a 1
+ set b 2
+ proc p {} {
+ set c 3
+ global a
+
+ puts "$a $::b $c"
+ }
+ p
+
+will output:
+
+ 1 2 3
+
+ARRAYS AS LISTS IN JIM
+----------------------
+Unlike Tcl, Jim can automatically convert between a list (with an even
+number of elements) and an array value. This is similar to the way Tcl
+can convert between a string and a list.
+
+For example:
+
+ set a {1 one 2 two}
+ puts $a(2)
+
+will output:
+
+ two
+
+Thus 'array set' is equivalent to 'set' when the variable does no
+exist or is empty.
+
+BUILT-IN COMMANDS
+-----------------
+The Tcl library provides the following built-in commands, which will
+be available in any application using Tcl. In addition to these
+built-in commands, there may be additional commands defined by each
+application, plus commands defined as Tcl procedures.
+
+In the command syntax descriptions below, words in +*boldface*+ are
+literals that you type verbatim to Tcl.
+
+Words in +'italics'+ are meta-symbols; they serve as names for any of
+a range of values that you can type.
+
+Optional arguments or groups of arguments are indicated by enclosing them
+in +?question-marks?+.
+
+Ellipses (+...+) indicate that any number of additional
+arguments or groups of arguments may appear, in the same format
+as the preceding argument(s).
+
+alarm
+~~~~~
++*alarm* 'seconds'+
+
+Delivers the 'SIGALRM' signal to the process after the given
+number of seconds. If the platform supports 'ularm(3)' then
+the argument may be a floating point value. Otherwise it must
+be an integer.
+
+Note that unless a signal handler for 'SIGALRM' has been installed
+(see 'signal'), the process will exit on this signal.
+
+append
+~~~~~~
++*append* 'varName value ?value value ...?'+
+
+Append all of the *value* arguments to the current value
+of variable *varName*. If *varName* doesn't exist,
+it is given a value equal to the concatenation of all the
+*value* arguments.
+
+This command provides an efficient way to build up long
+variables incrementally.
+For example, 'append a $b' is much more efficient than
+'set a $a$b' if '$a' is long.
+
+array
+~~~~~
++*array* 'option arrayName ?arg arg ...?'+
+
+This command performs one of several operations on the
+variable given by *arrayName*.
+
+Note that in general, if the named array does not exist, the *array* command behaves
+as though the array exists but is empty.
+
+The *option* argument determines what action is carried out by the
+command. The legal *options* (which may be abbreviated) are:
+
++array exists arrayName+::
+ Returns 1 if arrayName is an array variable, 0 if there is
+ no variable by that name. This command is essentially
+ identical to 'info exists'
+
++array get arrayName ?pattern?+::
+ Returns a list containing pairs of elements. The first
+ element in each pair is the name of an element in arrayName
+ and the second element of each pair is the value of the
+ array element. The order of the pairs is undefined. If
+ pattern is not specified, then all of the elements of the
+ array are included in the result. If pattern is specified,
+ then only those elements whose names match pattern (using
+ the matching rules of string match) are included. If arrayName
+ isn't the name of an array variable, or if the array contains
+ no elements, then an empty list is returned.
+
++array names arrayName ?pattern?+::
+ Returns a list containing the names of all of the elements
+ in the array that match pattern. If pattern is omitted then
+ the command returns all of the element names in the array.
+ If pattern is specified, then only those elements whose
+ names match pattern (using the matching rules of string
+ match) are included. If there are no (matching) elements
+ in the array, or if arrayName isn't the name of an array
+ variable, then an empty string is returned.
+
++array set arrayName list+::
+ Sets the values of one or more elements in arrayName. list
+ must have a form like that returned by array get, consisting
+ of an even number of elements. Each odd-numbered element
+ in list is treated as an element name within arrayName, and
+ the following element in list is used as a new value for
+ that array element. If the variable arrayName does not
+ already exist and list is empty, arrayName is created with
+ an empty array value.
+
++array size arrayName+::
+ Returns the number of elements in the array. If arrayName
+ isn't the name of an array then 0 is returned.
+
++array unset arrayName ?pattern?+::
+ Unsets all of the elements in the array that match pattern
+ (using the matching rules of string match). If arrayName
+ isn't the name of an array variable or there are no matching
+ elements in the array, no error will be raised. If pattern
+ is omitted and arrayName is an array variable, then the
+ command unsets the entire array. The command always returns
+ an empty string.
+
+break
+~~~~~
++*break*+
+
+This command may be invoked only inside the body of a loop command
+such as 'for' or 'foreach' or 'while'. It returns a JIM_BREAK code
+to signal the innermost containing loop command to return immediately.
+
+case
+~~~~
++*case* 'string' ?*in*? 'patList body ?patList body ...?'+
+
++*case* 'string' ?*in*? {'patList body ?patList body ...?'}+
+
+*Note* that the switch command should generally be preferred unless compatibility
+with Tcl 6.x is desired.
+
+Match *string* against each of the *patList* arguments
+in order. If one matches, then evaluate the following *body* argument
+by passing it recursively to the Tcl interpreter, and return the result
+of that evaluation. Each *patList* argument consists of a single
+pattern or list of patterns. Each pattern may contain any of the wild-cards
+described under 'string match'.
+
+If a *patList* argument is 'default', the corresponding body will be
+evaluated if no *patList* matches *string*. If no *patList* argument
+matches *string* and no default is given, then the 'case' command returns
+an empty string.
+
+Two syntaxes are provided.
+
+The first uses a separate argument for each of the patterns and commands;
+this form is convenient if substitutions are desired on some of the
+patterns or commands.
+
+The second form places all of the patterns and commands together into
+a single argument; the argument must have proper list structure, with
+the elements of the list being the patterns and commands.
+
+The second form makes it easy to construct multi-line case commands,
+since the braces around the whole list make it unnecessary to include a
+backslash at the end of each line.
+
+Since the *patList* arguments are in braces in the second form,
+no command or variable substitutions are performed on them; this makes
+the behavior of the second form different than the first form in some
+cases.
+
+Below are some examples of 'case' commands:
+
+ case abc in {a b} {format 1} default {format 2} a* {format 3}
+
+will return '3',
+
+ case a in {
+ {a b} {format 1}
+ default {format 2}
+ a* {format 3}
+ }
+
+will return '1', and
+
+ case xyz {
+ {a b}
+ {format 1}
+ default
+ {format 2}
+ a*
+ {format 3}
+ }
+
+will return '2'.
+
+catch
+~~~~~
++*catch* ?*-signal*? 'command' ?'varName'?+
+
+The 'catch' command may be used to prevent errors from aborting command
+interpretation. 'Catch' calls the Tcl interpreter recursively to execute
+*command*, and always returns a JIM_OK code, regardless of any errors
+that might occur while executing *command* (with the possible exception
+of JIM_SIGNAL - see below).
+
+The return value from 'catch' is a decimal string giving the code returned
+by the Tcl interpreter after executing *command*. This will be '0'
+(JIM_OK) if there were no errors in *command*; otherwise it will have
+a non-zero value corresponding to one of the exceptional return codes
+(see tcl.h for the definitions of code values).
+
+If the *varName* argument is given, then it gives the name of a variable;
+'catch' will set the value of the variable to the string returned from
+*command* (either a result or an error message).
+
+Normally 'catch' will *not* catch any signal. However if *-signal* is specified,
+any signals marked as *handle* by 'signal' will be caught and 'catch' will return
+JIM_SIGNAL (5). In this case, the return values is the name of the signal caught.
+
+cd
+~~
++*cd* 'dirName'+
+
+Change the current working directory to *dirName*.
+
+Returns an empty string.
+
+This command can potentially be disruptive to an application, so it may
+be removed in some applications.
+
+clock
+~~~~~
++*clock seconds*+
+
+Returns the current time as seconds since the epoch.
+
++*clock format* 'seconds ?-format format?'*+
+
+Format the given time (seconds since the epock) according to the given
+format. See strftime(3) for supported formats.
+
+If no format is supplied, "%c" is used.
+
++*clock scan* 'str -format format'+
+
+Scan the given time string using the given format string.
+See strptime(3) for supported formats.
+
+close
+~~~~~
++*close* 'fileId'+ or
++'fileId' *close*+
+
+Closes the file given by *fileId*.
+*FileId* must be the return value from a previous invocation
+of the 'open' command; after this command, it should not be
+used anymore.
+
+concat
+~~~~~~
++*concat* 'arg ?arg ...?'+
+
+This command treats each argument as a list and concatenates them
+into a single list. It permits any number of arguments. For example,
+the command
+
+ concat a b {c d e} {f {g h}}
+
+will return
+
+ a b c d e f {g h}
+
+as its result.
+
+continue
+~~~~~~~~
++*continue*+
+
+This command may be invoked only inside the body of a loop command such
+as 'for' or 'foreach' or 'while'. It returns a JIM_CONTINUE code to
+signal the innermost containing loop command to skip the remainder of
+the loop's body but continue with the next iteration of the loop.
+
+eof
+~~~
++*eof* 'fileId'+ or
++'fileId' *eof*+
+
+Returns 1 if an end-of-file condition has occurred on *fileId*,
+0 otherwise.
+
+*FileId* must have been the return value from a previous call to 'open',
+or it may be 'stdin', 'stdout', or 'stderr' to refer to one of the
+standard I/O channels.
+
+error
+~~~~~
++*error* 'message ?stacktrace?'+
+
+Returns a JIM_ERROR code, which causes command interpretation to be
+unwound. *Message* is a string that is returned to the application
+to indicate what went wrong.
+
+If the *stacktrace* argument is provided and is non-empty,
+it is used to initialize the stacktrace.
+
+This feature is most useful in conjunction with the 'catch' command:
+if a caught error cannot be handled successfully, *stacktrace* can be used
+to return a stack trace reflecting the original point of occurrence
+of the error:
+
+ catch {...} errMsg
+ ...
+ error $errMsg [info stacktrace]
+
+
+eval
+~~~~
++*eval* 'arg ?arg ...?'+
+
+'Eval' takes one or more arguments, which together comprise a Tcl
+command (or collection of Tcl commands separated by newlines in the
+usual way). 'Eval' concatenates all its arguments in the same
+fashion as the 'concat' command, passes the concatenated string to the
+Tcl interpreter recursively, and returns the result of that
+evaluation (or any error generated by it).
+
+exec
+~~~~
++*exec* 'arg ?arg ...?'+
+
+This command treats its arguments as the specification
+of one or more UNIX commands to execute as subprocesses.
+The commands take the form of a standard shell pipeline;
+'|' arguments separate commands in the
+pipeline and cause standard output of the preceding command
+to be piped into standard input of the next command.
+
+Under normal conditions the result of the 'exec' command
+consists of the standard output produced by the last command
+in the pipeline.
+
+If any of the commands in the pipeline exit abnormally or
+are killed or suspended, then 'exec' will return an error
+and the error message will include the pipeline's output followed by
+error messages describing the abnormal terminations.
+
+If any of the commands writes to its standard error file,
+then 'exec' will return an error, and the error message
+will include the pipeline's output, followed by messages
+about abnormal terminations (if any), followed by the standard error
+output.
+
+If the last character of the result or error message
+is a newline then that character is deleted from the result
+or error message for consistency with normal
+Tcl return values.
+
+An *arg* may have one of the following special forms:
+
++>filename+::
+ The standard output of the last command in the pipeline
+ is redirected to the file. In this situation 'exec'
+ will normally return an empty string.
+
++>>filename+::
+ As above, but append to the file.
+
++>@fileId+::
+ The standard output of the last command in the pipeline is
+ redirected to the given (writable) file descriptor (e.g. stdout,
+ stderr, or the result of 'open'). In this situation 'exec'
+ will normally return an empty string.
+
++2>filename+::
+ The standard error of the last command in the pipeline
+ is redirected to the file.
+
++2>>filename+::
+ As above, but append to the file.
+
++2>@fileId+::
+ The standard error of the last command in the pipeline is
+ redirected to the given (writable) file descriptor.
+
++<filename+::
+ The standard input of the first command in the pipeline
+ is taken from the file.
+
++<<string+::
+ The standard input of the first command is taken as the
+ given immediate value.
+
++<@fileId+::
+ The standard input of the first command in the pipeline
+ is taken from the given (readable) file descriptor.
+
+If there is no redirection of standard input, standard error
+or standard output, these are connected to the corresponding
+input or output of the application.
+
+If the last *arg* is '&' then the command will be
+executed in background.
+In this case the standard output from the last command
+in the pipeline will
+go to the application's standard output unless
+redirected in the command, and error output from all
+the commands in the pipeline will go to the application's
+standard error file.
+
+Each *arg* becomes one word for a command, except for
+'|', '<', '<<', '>', and '&' arguments, and the
+arguments that follow '<', '<<', and '>'.
+
+The first word in each command is taken as the command name;
+the directories in the PATH environment variable are searched for
+an executable by the given name.
+
+No 'glob' expansion or other shell-like substitutions
+are performed on the arguments to commands.
+
+exit
+~~~~
++*exit* '?returnCode?'+
+
+Terminate the process, returning *returnCode* to the
+parent as the exit status.
+
+If *returnCode* isn't specified then it defaults
+to 0.
+
+Note that exit can be caught with *catch*.
+
+expr
+~~~~
++*expr* 'arg'+
+
+Calls the expression processor to evaluate *arg*, and returns
+the result as a string. See the section EXPRESSIONS above.
+
+file
+~~~~
++*file* 'option name ?arg arg ...?'+
+
+Operate on a file or a file name. *Name* is the name of a file;
+if it starts with a tilde, then tilde substitution is done before
+executing the command (see the manual entry for 'Jim_TildeSubst'
+for details).
+
+*Option* indicates what to do with the file name. Any unique
+abbreviation for *option* is acceptable. The valid options are:
+
++*file atime* 'name'+::
+ Return a decimal string giving the time at which file *name*
+ was last accessed. The time is measured in the standard UNIX
+ fashion as seconds from a fixed starting time (often January 1, 1970).
+ If the file doesn't exist or its access time cannot be queried then an
+ error is generated.
+
++*file delete* 'name'+::
+ Deletes file *name*. If the file doesn't exist, nothing happens.
+ If the file can't be deleted, an error is generated.
+
++*file dirname* 'name'+::
+ Return all of the characters in *name* up to but not including
+ the last slash character. If there are no slashes in *name*
+ then return '.'. If the last slash in *name* is its first
+ character, then return '/'.
+
++*file executable* 'name'+::
+ Return '1' if file *name* is executable by
+ the current user, '0' otherwise.
+
++*file exists* 'name'+::
+ Return '1' if file *name* exists and the current user has
+ search privileges for the directories leading to it, '0' otherwise.
+
++*file extension* 'name'+::
+ Return all of the characters in *name* after and including the
+ last dot in *name*. If there is no dot in *name* then return
+ the empty string.
+
++*file isdirectory* 'name'+::
+ Return '1' if file *name* is a directory,
+ '0' otherwise.
+
++*file isfile* 'name'+::
+ Return '1' if file *name* is a regular file,
+ '0' otherwise.
+
++*file lstat* 'name varName'+::
+ Same as 'stat' option (see below) except uses the *lstat*
+ kernel call instead of *stat*. This means that if *name*
+ refers to a symbolic link the information returned in *varName*
+ is for the link rather than the file it refers to. On systems that
+ don't support symbolic links this option behaves exactly the same
+ as the 'stat' option.
+
++*file mkdir* 'dir1 ?dir2? ...'+::
+ Creates the given directories. Intermediate directories are
+ created as necessary.
+
++*file mtime* 'name'+::
+ Return a decimal string giving the time at which file *name*
+ was last modified. The time is measured in the standard UNIX
+ fashion as seconds from a fixed starting time (often January 1, 1970).
+ If the file doesn't exist or its modified time cannot be queried then an
+ error is generated.
+
++*file normalize* 'name'+::
+ Return the normalized path of *name*
+
++*file owned* 'name'+::
+ Return '1' if file *name* is owned by the current user,
+ '0' otherwise.
+
++*file readable* 'name'+::
+ Return '1' if file *name* is readable by
+ the current user, '0' otherwise.
+
++*file readlink* 'name'+::
+ Returns the value of the symbolic link given by *name* (i.e. the
+ name of the file it points to). If
+ *name* isn't a symbolic link or its value cannot be read, then
+ an error is returned. On systems that don't support symbolic links
+ this option is undefined.
+
++*file rename* 'oldname' 'newname'+::
+ Renames the file from the old name to the new name.
+
++*file rootname* 'name'+::
+ Return all of the characters in *name* up to but not including
+ the last '.' character in the name. If *name* doesn't contain
+ a dot, then return *name*.
+
++*file size* 'name'+::
+ Return a decimal string giving the size of file *name* in bytes.
+ If the file doesn't exist or its size cannot be queried then an
+ error is generated.
+
++*file stat* 'name varName'+::
+ Invoke the 'stat' kernel call on *name*, and use the
+ variable given by *varName* to hold information returned from
+ the kernel call.
+ *VarName* is treated as an array variable,
+ and the following elements of that variable are set: 'atime',
+ 'ctime', 'dev', 'gid', 'ino', 'mode', 'mtime',
+ 'nlink', 'size', 'type', 'uid'.
+ Each element except 'type' is a decimal string with the value of
+ the corresponding field from the 'stat' return structure; see the
+ manual entry for 'stat' for details on the meanings of the values.
+ The 'type' element gives the type of the file in the same form
+ returned by the command 'file type'.
+ This command returns an empty string.
+
++*file tail* 'name'+::
+ Return all of the characters in *name* after the last slash.
+ If *name* contains no slashes then return *name*.
+
++*file type* 'name'+::
+ Returns a string giving the type of file *name*, which will be
+ one of 'file', 'directory', 'characterSpecial',
+ 'blockSpecial', 'fifo', 'link', or 'socket'.
+
++*file writable* 'name'+::
+ Return '1' if file *name* is writable by
+ the current user, '0' otherwise.
+
+The 'file' commands that return 0/1 results are often used in
+conditional or looping commands, for example:
+
+ if {![file exists foo]} then {error {bad file name}} else {...}
+
+flush
+~~~~~
++*flush* 'fileId'+ or
++'fileId' *flush*+
+
+Flushes any output that has been buffered for *fileId*. *FileId* must
+have been the return value from a previous call to 'open', or it may be
+'stdout' or 'stderr' to access one of the standard I/O streams; it must
+refer to a file that was opened for writing. This command returns an
+empty string.
+
+for
+~~~
++*for* 'start test next body'+
+
+'For' is a looping command, similar in structure to the C 'for' statement.
+The *start*, *next*, and *body* arguments must be Tcl command strings,
+and *test* is an expression string.
+
+The 'for' command first invokes the Tcl interpreter to execute *start*.
+Then it repeatedly evaluates *test* as an expression; if the result is
+non-zero it invokes the Tcl interpreter on *body*, then invokes the Tcl
+interpreter on *next*, then repeats the loop. The command terminates
+when *test* evaluates to 0.
+
+If a 'continue' command is invoked within *body* then any remaining
+commands in the current execution of *body* are skipped; processing
+continues by invoking the Tcl interpreter on *next*, then evaluating
+*test*, and so on.
+
+If a 'break' command is invoked within *body* or *next*, then the 'for'
+command will return immediately.
+
+The operation of 'break' and 'continue' are similar to the corresponding
+statements in C.
+
+'For' returns an empty string.
+
+foreach
+~~~~~~~
++*foreach* 'varname list body'+
+
++*foreach* 'varlist list ?varlist2 list2 ...? body'+
+
+In this command, *varname* is the name of a variable, *list*
+is a list of values to assign to *varname*, and *body* is a
+collection of Tcl commands.
+
+For each field in *list* (in order from left to right),'foreach' assigns
+the contents of the field to *varname* (as if the 'lindex' command
+had been used to extract the field), then calls the Tcl interpreter to
+execute *body*.
+
+If instead of being a simple name, *varlist* is used, multiple assignments
+are made each time through the loop, one for each element of *varlist*.
+
+For example, if there are two elements in *varlist* and six elements in
+the list, the loop will be executed three times.
+
+If the length of the list doesn't evenly divide by the number of elements
+in *varlist*, the value of the remaining variables in the last iteration
+of the loop are undefined.
+
+The 'break' and 'continue' statements may be invoked inside *body*,
+with the same effect as in the 'for' command.
+
+'Foreach' returns an empty string.
+
+format
+~~~~~~
++*format* 'formatString ?arg arg ...?'+
+
+This command generates a formatted string in the same way as the
+C 'sprintf' procedure (it uses 'sprintf' in its
+implementation). *FormatString* indicates how to format
+the result, using '%' fields as in 'sprintf', and the additional
+arguments, if any, provide values to be substituted into the result.
+
+All of the 'sprintf' options are valid; see the 'sprintf'
+man page for details. Each *arg* must match the expected type
+from the '%' field in *formatString*; the 'format' command
+converts each argument to the correct type (floating, integer, etc.)
+before passing it to 'sprintf' for formatting.
+
+The only unusual conversion is for '%c'; in this case the argument
+must be a decimal string, which will then be converted to the corresponding
+ASCII character value.
+
+'Format' does backslash substitution on its *formatString*
+argument, so backslash sequences in *formatString* will be handled
+correctly even if the argument is in braces.
+
+The return value from 'format' is the formatted string.
+
+gets
+~~~~
++*gets* 'fileId ?varName?'+ or
++'fileId' *gets* '?varName?'+
+
+Reads the next line from the file given by *fileId* and discards
+the terminating newline character.
+
+If *varName* is specified, then the line is placed in the variable
+by that name and the return value is a count of the number of characters
+read (not including the newline).
+
+If the end of the file is reached before reading
+any characters then -1 is returned and *varName* is set to an
+empty string.
+
+If *varName* is not specified then the return value will be
+the line (minus the newline character) or an empty string if
+the end of the file is reached before reading any characters.
+
+An empty string will also be returned if a line contains no characters
+except the newline, so 'eof' may have to be used to determine
+what really happened.
+
+If the last character in the file is not a newline character, then
+'gets' behaves as if there were an additional newline character
+at the end of the file.
+
+*FileId* must be 'stdin' or the return value from a previous
+call to 'open'; it must refer to a file that was opened
+for reading.
+
+glob
+~~~~
++*glob* ?*-nocomplain*? 'pattern ?pattern ...?'+
+
+This command performs filename globbing, using csh rules. The returned
+value from 'glob' is the list of expanded filenames.
+
+If '-nocomplain' is specified as the first argument then an empty
+list may be returned; otherwise an error is returned if the expanded
+list is empty. The '-nocomplain' argument must be provided
+exactly: an abbreviation will not be accepted.
+
+global
+~~~~~~
+
++*global* 'varname ?varname ...?'+
+
+This command is ignored unless a Tcl procedure is being interpreted.
+If so, then it declares each given *varname* to be a global variable
+rather than a local one. For the duration of the current procedure
+(and only while executing in the current procedure), any reference to
+*varname* will be bound to a global variable instead
+of a local one.
+
+An alternative to using 'global' is to use the '::' prefix
+to explicitly name a variable in the global scope.
+
+if
+~~
++*if* 'expr1' ?*then*? 'body1' *elseif* 'expr2' ?*then*? 'body2' *elseif* ... ?*else*? ?'bodyN'?+
+
+The *if* command evaluates *expr1* as an expression (in the same way
+that 'expr' evaluates its argument). The value of the expression must
+be numeric; if it is non-zero then *body1* is executed by passing it to
+the Tcl interpreter.
+
+Otherwise *expr2* is evaluated as an expression and if it is non-zero
+then 'body2' is executed, and so on.
+
+If none of the expressions evaluates to non-zero then *bodyN* is executed.
+
+The 'then' and 'else' arguments are optional 'noise words' to make the
+command easier to read.
+
+There may be any number of 'elseif' clauses, including zero. *BodyN*
+may also be omitted as long as 'else' is omitted too.
+
+The return value from the command is the result of the body script that
+was executed, or an empty string if none of the expressions was non-zero
+and there was no *bodyN*.
+
+incr
+~~~~
++*incr* 'varName ?increment?'
+
+Increment the value stored in the variable whose name is *varName*.
+The value of the variable must be integral.
+
+If *increment* is supplied then its value (which must be an
+integer) is added to the value of variable *varName*; otherwise
+1 is added to *varName*.
+
+The new value is stored as a decimal string in variable *varName*
+and also returned as result.
+
+info
+~~~~
+
++*info* 'option ?arg arg ...?'+::
+ Provide information about various internals to the Tcl interpreter.
+ The legal **option**'s (which may be abbreviated) are:
+
++*info args* 'procname'+::
+ Returns a list containing the names of the arguments to procedure
+ *procname*, in order. *Procname* must be the name of a
+ Tcl command procedure.
+
++*info body* 'procname'+::
+ Returns the body of procedure *procname*. *Procname* must be
+ the name of a Tcl command procedure.
+
++*info commands* ?'pattern'?+::
+ If *pattern* isn't specified, returns a list of names of all the
+ Tcl commands, including both the built-in commands written in C and
+ the command procedures defined using the 'proc' command.
+ If *pattern* is specified, only those names matching *pattern*
+ are returned. Matching is determined using the same rules as for
+ 'string match'.
+
++*info complete* 'command'+::
+ Returns 1 if *command* is a complete Tcl command in the sense of
+ having no unclosed quotes, braces, brackets or array element names,
+ If the command doesn't appear to be complete then 0 is returned.
+ This command is typically used in line-oriented input environments
+ to allow users to type in commands that span multiple lines; if the
+ command isn't complete, the script can delay evaluating it until additional
+ lines have been typed to complete the command.
+
++*info exists* 'varName'+::
+ Returns '1' if the variable named *varName* exists in the
+ current context (either as a global or local variable), returns '0'
+ otherwise.
+
++*info globals* ?'pattern'?+::
+ If *pattern* isn't specified, returns a list of all the names
+ of currently-defined global variables.
+ If *pattern* is specified, only those names matching *pattern*
+ are returned. Matching is determined using the same rules as for
+ 'string match'.
+
++*info level* ?'number'?+::
+ If *number* is not specified, this command returns a number
+ giving the stack level of the invoking procedure, or 0 if the
+ command is invoked at top-level. If *number* is specified,
+ then the result is a list consisting of the name and arguments for the
+ procedure call at level *number* on the stack. If *number*
+ is positive then it selects a particular stack level (1 refers
+ to the top-most active procedure, 2 to the procedure it called, and
+ so on); otherwise it gives a level relative to the current level
+ (0 refers to the current procedure, -1 to its caller, and so on).
+ See the 'uplevel' command for more information on what stack
+ levels mean.
+
++*info locals* ?'pattern'?+::
+ If *pattern* isn't specified, returns a list of all the names
+ of currently-defined local variables, including arguments to the
+ current procedure, if any. Variables defined with the 'global'
+ and 'upvar' commands will not be returned. If *pattern* is
+ specified, only those names matching *pattern* are returned.
+ Matching is determined using the same rules as for 'string match'.
+
++*info procs* ?'pattern'?+::
+ If *pattern* isn't specified, returns a list of all the
+ names of Tcl command procedures.
+ If *pattern* is specified, only those names matching *pattern*
+ are returned. Matching is determined using the same rules as for
+ 'string match'.
+
++*info script*+::
+ If a Tcl script file is currently being evaluated (i.e. there is a
+ call to 'Jim_EvalFile' active or there is an active invocation
+ of the 'source' command), then this command returns the name
+ of the innermost file being processed. Otherwise the command returns an
+ empty string.
+
++*info source 'script'*+::
+ Returns the original source location of the given script as a list of
+ {filename linenumber}. If the source location can't be determined, the
+ list {{} 0} is returned.
+
++*info stacktrace*+::
+ After an error is caught with 'catch', returns the stack trace as a list
+ of {procedure filename line ...}.
+
++*info version*+::
+ Returns the version number for this version of Jim in the form *x.yy*.
+
++*info vars* ?'pattern'?+::
+ If *pattern* isn't specified,
+ returns a list of all the names of currently-visible variables, including
+ both locals and currently-visible globals.
+ If *pattern* is specified, only those names matching *pattern*
+ are returned. Matching is determined using the same rules as for
+ 'string match'.
+
+join
+~~~~
++*join* 'list ?joinString?'+
+
+The *list* argument must be a valid Tcl list. This command returns the
+string formed by joining all of the elements of *list* together with
+*joinString* separating each adjacent pair of elements.
+
+The *joinString* argument defaults to a space character.
+
+kill
+~~~~
++*kill* '?SIG|-0? pid'+
+
+Sends the given signal to the process identified by *pid*.
+
+The signal may be specified by name or number in one of the following forms:
+* +TERM+
+* +SIGTERM+
+* +-TERM+
+* 15
+* -15
+
+The signal name may be in either upper or lower case.
+
+The special signal name '-0' simply checks that a signal *could* be sent.
+
+If no signal is specified, SIGTERM is used.
+
+An error is raised if the signal could not be delivered.
+
+lappend
+~~~~~~~
++*lappend* 'varName value ?value value ...?'+
+
+Treat the variable given by *varName* as a list and append each of
+the *value* arguments to that list as a separate element, with spaces
+between elements.
+
+If *varName* doesn't exist, it is created as a list with elements given
+by the *value* arguments. 'Lappend' is similar to 'append' except that
+each *value* is appended as a list element rather than raw text.
+
+This command provides a relatively efficient way to build up large lists.
+For example, 'lappend a $b' is much more efficient than
+
+ set a [concat $a [list $b]]
+
+when '$a' is long.
+
+lindex
+~~~~~~
++*lindex* 'list index'+
+
+Treats *list* as a Tcl list and returns element 'index' from it
+(0 refers to the first element of the list). *Index* may be 'end' or
+'end-<n>' (where '<n>' is an integer) to refer to the last element of
+the list or the 'nth-from-last' element of the list.
+
+In extracting the element, *lindex* observes the same rules concerning
+braces and quotes and backslashes as the Tcl command interpreter; however,
+variable substitution and command substitution do not occur.
+
+If *index* is negative or greater than or equal to the number of elements
+in *value*, then an empty string is returned.
+
+linsert
+~~~~~~~
++*linsert* 'list index element ?element element ...?'+
+
+This command produces a new list from *list* by inserting all
+of the *element* arguments just before the element *index*
+of *list*. Each *element* argument will become
+a separate element of the new list. If *index* is less than
+or equal to zero, then the new elements are inserted at the
+beginning of the list. If *index* is greater than or equal
+to the number of elements in the list, then the new elements are
+appended to the list.
+
+*index* may also be 'end' or 'end-<n>' -- see 'lindex'
+
+list
+~~~~
+
++*list* 'arg ?arg ...?'+
+
+This command returns a list comprised of all the arguments, *arg*. Braces
+and backslashes get added as necessary, so that the 'index' command
+may be used on the result to re-extract the original arguments, and also
+so that 'eval' may be used to execute the resulting list, with
+*arg1* comprising the command's name and the other args comprising
+its arguments. 'List' produces slightly different results than
+'concat': 'concat' removes one level of grouping before forming
+the list, while 'list' works directly from the original arguments.
+For example, the command
+
+ list a b {c d e} {f {g h}}
+
+will return
+
+ a b {c d e} {f {g h}}
+
+while 'concat' with the same arguments will return
+
+ a b c d e f {g h}
+
+llength
+~~~~~~~
++*llength* 'list'+
+
+Treats *list* as a list and returns a decimal string giving
+the number of elements in it.
+
+lset
+~~~~
+
+REVISIT:
+
+lmap
+~~~~
+
+REVISIT:
+
+loop
+~~~~
++*loop* 'var first limit ?incr? command'+
+
+A shorthand form of:
+
+ for {set var first} {var < limit} {incr var incr} command
+
+If *incr* is not specified, 1 is used.
+
+lrange
+~~~~~~
++*lrange* 'list first last'+
+
+*List* must be a valid Tcl list. This command will
+return a new list consisting of elements
+*first* through *last*, inclusive.
+
+*first* or *last* may also be 'end' or 'end-<n>' -- see 'lindex'
+
+If *last* is greater than or equal to the number of elements
+in the list, then it is treated as if it were 'end'.
+
+If *first* is greater than *last* then an empty string
+is returned.
+
+Note: 'lrange *list first first*' does not always produce the
+same result as 'lindex *list first*' (although it often does
+for simple fields that aren't enclosed in braces); it does, however,
+produce exactly the same results as 'list [lindex *list first*]'
+
+lreplace
+~~~~~~~~
+
++*lreplace* 'list first last ?element element ...?'+
+
+Returns a new list formed by replacing one or more elements of
+*list* with the *element* arguments.
+
+*First* gives the index in *list* of the first element
+to be replaced.
+
+If *first* is less than zero then it refers to the first
+element of *list*; the element indicated by *first*
+must exist in the list.
+
+*Last* gives the index in *list* of the last element
+to be replaced; it must be greater than or equal to *first*.
+
+*first* or *last* may also be 'end' or 'end-<n>' -- see 'lindex'
+
+The *element* arguments specify zero or more new arguments to
+be added to the list in place of those that were deleted.
+
+Each *element* argument will become a separate element of
+the list.
+
+If no *element* arguments are specified, then the elements
+between *first* and *last* are simply deleted.
+
+lsearch
+~~~~~~~
++*lsearch* 'list value'+
+
+Search the elements of *list* to see if one of them matches
+*value*.
+
+If so, the command returns the index of the first matching
+element.
+
+If not, the command returns '-1'.
+
+*Note* that this command is different from Tcl in that an exact
+match is done rather than a pattern match.
+
+lsort
+~~~~~
++*lsort* ?*-integer*|*-command* 'cmdname'? ?*-decreasing*|*-increasing*? 'list'+
+
+Sort the elements of *list*, returning a new list in sorted order.
+By default, ASCII sorting is used, with the result in increasing order.
+
+If *-integer* is specified, numeric sorting is used.
+
+If *-command cmdname* is specified, *cmdname* is treated as a
+command name. For each comparison, *cmdname $value1 $value2* is called
+which should return '-1' if *$value1* is less than *$value2*, '0' if
+they are equal, or '1' otherwise.
+
+If *-decreasing* is specified, the resulting list is in the opposite
+order to what it would be otherwise. *-increasing* is the default.
+
+open
+~~~~
++*open* 'fileName ?access?'+ or
++*aio.open* 'fileName ?access?'+
+
+Opens a file and returns an identifier
+that may be used in future invocations
+of commands like 'read', 'puts', and 'close'.
+*FileName* gives the name of the file to open.
+
+The *access* argument indicates the way in which the file
+(or command pipeline) is to be accessed.
+It may have any of the following values:
+
++r+::
+ Open the file for reading only; the file must already exist.
+
++r++::
+ Open the file for both reading and writing; the file must
+ already exist.
+
++w+::
+ Open the file for writing only. Truncate it if it exists. If it doesn't
+ exist, create a new file.
+
++w++::
+ Open the file for reading and writing. Truncate it if it exists.
+ If it doesn't exist, create a new file.
+
++a+::
+ Open the file for writing only. The file must already exist, and the file
+ is positioned so that new data is appended to the file.
+
++a++::
+ Open the file for reading and writing. If the file doesn't
+ exist, create a new empty file. Set the initial access position
+ to the end of the file.
+
+*Access* defaults to 'r'.
+
+If a file is opened for both reading and writing, then 'seek'
+must be invoked between a read and a write, or vice versa (this
+restriction does not apply to command pipelines opened with 'open').
+
+package
+~~~~~~~
++*package provide* 'name ?version?'+
+
+Indicates that the current script provides the package named *name*.
+If no version is specified, '1.0' is used.
+
+Any script which provides a package may include this statement
+as the first statement, although it is not required.
+
++*package require* 'name ?version?'*+
+
+Searches for the package with the given *name* by examining each path
+in '$::auto_path' and trying to load '$path/$name.tcl'.
+
+If either file exists, it is loaded with 'source'.
+
+Typically '$::auto_path' contains the paths '.' and '/lib/jim'.
+
+pid
+~~~
++*pid*+
+
+Returns the process identifier of the current process.
+
+proc
+~~~~
++*proc* 'name args ?statics? body'+
+
+The 'proc' command creates a new Tcl command procedure, *name*, replacing
+any existing command there may have been by that name. Whenever the
+new command is invoked, the contents of *body* will be executed by the
+Tcl interpreter. *Args* specifies the formal arguments to the procedure.
+It consists of a list, possibly empty, each of whose elements specifies
+one argument. Each argument specifier is also a list with either one or
+two fields. If there is only a single field in the specifier, then it is
+the name of the argument; if there are two fields, then the first is the
+argument name and the second is its default value. braces and backslashes
+may be used in the usual way to specify complex default values.
+
+REVISIT: Explain static variables
+
+When *name* is invoked, a local variable will be created for each of
+the formal arguments to the procedure; its value will be the value
+of corresponding argument in the invoking command or the argument's
+default value. Arguments with default values need not be specified in
+a procedure invocation. However, there must be enough actual arguments
+for all the formal arguments that don't have defaults, and there must
+not be any extra actual arguments. There is one special case to permit
+procedures with variable numbers of arguments. If the last formal
+argument has the name 'args', then a call to the procedure may contain
+more actual arguments than the procedure has formals. In this case,
+all of the actual arguments starting at the one that would be assigned to
+'args' are combined into a list (as if the 'list' command had been used);
+this combined value is assigned to the local variable 'args'.
+
+When *body* is being executed, variable names normally refer to local
+variables, which are created automatically when referenced and deleted
+when the procedure returns. One local variable is automatically created
+for each of the procedure's arguments. Global variables can be
+accessed by invoking the 'global' command or via the '::' prefix.
+
+The 'proc' command returns the null string. When a procedure is invoked,
+the procedure's return value is the value specified in a 'return' command.
+If the procedure doesn't execute an explicit 'return', then its return
+value is the value of the last command executed in the procedure's body.
+
+If an error occurs while executing the procedure body, then the
+procedure-as-a-whole will return that same error.
+
+puts
+~~~~
++*puts* ?*-nonewline*? '?fileId? string'+ or
++'fileId' *puts* ?*-nonewline*? 'string'+
+
+Writes the characters given by *string* to the file given
+by *fileId*. *FileId* must have been the return
+value from a previous call to 'open', or it may be
+'stdout' or 'stderr' to refer to one of the standard I/O
+channels; it must refer to a file that was opened for
+writing.
+
+In the first form, if no *fileId* is specified then it defaults to 'stdout'.
+'Puts' normally outputs a newline character after *string*,
+but this feature may be suppressed by specifying the '-nonewline'
+switch.
+
+Output to files is buffered internally by Tcl; the 'flush'
+command may be used to force buffered characters to be output.
+
+pwd
+~~~
++*pwd*+
+
+Returns the path name of the current working directory.
+
+read
+~~~~
++*read* ?*-nonewline*? 'fileId'+ or
++'fileId' *read* ?*-nonewline*?+
+
++*read* 'fileId numBytes'+ or
++'fileId' *read* 'numBytes'+
+
+
+In the first form, all of the remaining bytes are read from the file
+given by *fileId*; they are returned as the result of the command.
+If the '-nonewline' switch is specified then the last
+character of the file is discarded if it is a newline.
+
+In the second form, the extra argument specifies how many bytes to read;
+exactly this many bytes will be read and returned, unless there are fewer than
+*numBytes* bytes left in the file; in this case, all the remaining
+bytes are returned.
+
+*FileId* must be 'stdin' or the return value from a previous call
+to 'open'; it must refer to a file that was opened for reading.
+
+regexp
+~~~~~~
++*regexp ?-indices? ?-nocase?* ?*-start* 'offset'? 'exp string ?matchVar? ?subMatchVar subMatchVar ...?'+
+
+Determines whether the regular expression *exp* matches part or
+all of *string* and returns 1 if it does, 0 if it doesn't.
+
+See REGULAR EXPRESSIONS above for complete information on the
+syntax of *exp* and how it is matched against *string*.
+
+If additional arguments are specified after *string* then they
+are treated as the names of variables to use to return
+information about which part(s) of *string* matched *exp*.
+*MatchVar* will be set to the range of *string* that
+matched all of *exp*. The first *subMatchVar* will contain
+the characters in *string* that matched the leftmost parenthesized
+subexpression within *exp*, the next *subMatchVar* will
+contain the characters that matched the next parenthesized
+subexpression to the right in *exp*, and so on.
+
+Normally, *matchVar* and the each *subMatchVar* are set to hold
+the matching characters from 'string', however see '-indices' below.
+
+If there are more values for *subMatchVar* than parenthesized subexpressions
+within *exp*, or if a particular subexpression in *exp* doesn't
+match the string (e.g. because it was in a portion of the expression
+that wasn't matched), then the corresponding *subMatchVar* will be
+set to '"-1 -1"' if '-indices' has been specified or to an empty
+string otherwise.
+
+The following switches modify the behaviour of *regexp*
+
++*-nocase*+::
+ Causes upper-case characters in string to be treated as
+ lower case during the
+ matching process.
+
++*-indices*+::
+ Changes what is stored in the subMatchVars. Instead of
+ storing the matching characters from string, each variable
+ will contain a list of two decimal strings giving the indices
+ in string of the first and last characters in the matching
+ range of characters.
+
++*-start* 'index'+::
+ Specifies a character index offset into the string to start
+ matching the regular expression at. If '-indices' is
+ specified, the indices will be indexed starting from the
+ absolute beginning of the input string. index will be
+ constrained to the bounds of the input string.
+
+regsub
+~~~~~~
++*regsub ?-all? ?-nocase?* 'exp string subSpec varName'
+
+This command matches the regular expression *exp* against
+*string* using the rules described in REGULAR EXPRESSIONS
+above.
+
+If there is no match, then the command returns 0 and does nothing else.
+
+If there is a match, then the command returns 1 and also copies
+*string* to the variable whose name is given by *varName*.
+
+When copying *string*, the portion of *string* that
+matched *exp* is replaced with *subSpec*.
+If *subSpec* contains a '&' or '{backslash}0', then it is replaced
+in the substitution with the portion of *string* that
+matched *exp*.
+
+If *subSpec* contains a '{backslash}*n*', where *n* is a digit
+between 1 and 9, then it is replaced in the substitution with
+the portion of *string* that matched the **n**-th
+parenthesized subexpression of *exp*.
+Additional backslashes may be used in *subSpec* to prevent special
+interpretation of '&' or '{backslash}0' or '{backslash}*n*' or
+backslash.
+
+The use of backslashes in *subSpec* tends to interact badly
+with the Tcl parser's use of backslashes, so it's generally
+safest to enclose *subSpec* in braces if it includes
+backslashes.
+
+The following switches modify the behaviour of *regsub*
+
++*-nocase*+::
+ Upper-case characters in *string* are converted to lower-case
+ before matching against *exp*; however, substitutions
+ specified by *subSpec* use the original unconverted form
+ of *string*.
+
++*-all*+::
+ All ranges in
+ *string* that match *exp* are found and substitution is
+ performed for each of these ranges, rather than only the first.
+ The '&' and '{backslash}*n*'
+ sequences are handled for each substitution using the information
+ from the corresponding match.
+
+rename
+~~~~~~
++*rename* 'oldName newName'+
+
+Rename the command that used to be called *oldName* so that it
+is now called *newName*. If *newName* is an empty string
+(e.g. {}) then *oldName* is deleted. The 'rename' command
+returns an empty string as result.
+
+return
+~~~~~~
++*return* ?-code *code*? ?'value'?+
+
+Return immediately from the current procedure (or top-level command
+or 'source' command), with *value* as the return value. If *value*
+is not specified, an empty string will be returned as result.
+
+If *code* is specified (as either a number or ok, error, break,
+continue, signal, return or exit), this code will be used instead
+of JIM_OK. This is generally useful when implementing flow of control
+commands.
+
+scan
+~~~~
++*scan* 'string format varname1 ?varname2 ...?'+
+
+This command parses fields from an input string in the same fashion
+as the C 'sscanf' procedure. *String* gives the input to be parsed
+and *format* indicates how to parse it, using '%' fields as in
+'sscanf'. All of the 'sscanf' options are valid; see the 'sscanf'
+man page for details. Each *varname* gives the name of a variable;
+when a field is scanned from *string*, the result is converted back
+into a string and assigned to the corresponding *varname*. The
+only unusual conversion is for '%c'. For '%c' conversions a single
+character value is converted to a decimal string, which is then
+assigned to the corresponding *varname*; no field width may be
+specified for this conversion.
+
+seek
+~~~~
++*seek* 'fileId offset ?origin?'+ or
++'fileId' *seek* 'offset ?origin?'+
+
+Change the current access position for *fileId*.
+The *offset* and *origin* arguments specify the position at
+which the next read or write will occur for *fileId*.
+*Offset* must be a number (which may be negative) and *origin*
+must be one of the following:
+
++*start*+::
+ The new access position will be *offset* bytes from the start
+ of the file.
+
++*current*+::
+ The new access position will be *offset* bytes from the current
+ access position; a negative *offset* moves the access position
+ backwards in the file.
+
++*end*+::
+ The new access position will be *offset* bytes from the end of
+ the file. A negative *offset* places the access position before
+ the end-of-file, and a positive *offset* places the access position
+ after the end-of-file.
+
+The *origin* argument defaults to 'start'.
+
+*FileId* must have been the return value from a previous call to
+'open', or it may be 'stdin', 'stdout', or 'stderr' to refer to one
+of the standard I/O channels.
+
+This command returns an empty string.
+
+set
+~~~
++*set* 'varname ?value?'+
+
+Returns the value of variable *varname*.
+
+If *value* is specified, then set the value of *varname* to *value*,
+creating a new variable if one doesn't already exist, and return
+its value.
+
+If *varName* contains an open parenthesis and ends with a
+close parenthesis, then it refers to an array element: the characters
+before the open parenthesis are the name of the array, and the characters
+between the parentheses are the index within the array.
+Otherwise *varName* refers to a scalar variable.
+
+If no procedure is active, then *varname* refers to a global
+variable.
+
+If a procedure is active, then *varname* refers to a parameter
+or local variable of the procedure, unless the *global* command
+has been invoked to declare *varname* to be global.
+
+The '::' prefix may also be used to explicitly reference a variable
+in the global scope.
+
+signal
+~~~~~~
+
+Command for signal handling.
+
+See 'kill' for the different forms which may be used to specify signals.
+
+Commands which return a list of signal names do so using the canonical form:
+"SIGINT SIGTERM".
+
++*signal handle* ?'signals ...'?+
+
+If no signals are given, returns a list of all signals which are currently
+being handled.
+
+If signals are specified, these are added to the list of signals currently
+being handled.
+
++*signal ignore* ?'signals ...'?+
+
+If no signals are given, returns a lists all signals which are currently being
+ignored.
+
+If signals are specified, these are added to the list of signals currently
+being ignored.
+
++*signal default* ?'signals ...'?+
+
+If no signals are given, returns a lists all signals which are currently have
+the default behaviour.
+
+If signals are specified, these are added to the list of signals which have
+the default behaviour.
+
++*signal throw* ?'signal'?+
+
+Raises the given signal, which defaults to SIGINT if not specified.
+
+The behaviour is identical to:
+
+ kill signal [pid]
+
+sleep
+~~~~~
++*sleep* 'seconds'+
+
+Pauses for the given number of seconds, which may be a floating
+point value less than one to sleep for less than a second, or an
+integer to sleep for one or more seconds.
+
+source
+~~~~~~
++*source* 'fileName'+
+
+Read file *fileName* and pass the contents to the Tcl interpreter
+as a sequence of commands to execute in the normal fashion. The return
+value of 'source' is the return value of the last command executed
+from the file. If an error occurs in executing the contents of the
+file, then the 'source' command will return that error.
+
+If a 'return' command is invoked from within the file, the remainder of
+the file will be skipped and the 'source' command will return
+normally with the result from the 'return' command.
+
+split
+~~~~~
++*split* 'string ?splitChars?'+
+
+Returns a list created by splitting *string* at each character
+that is in the *splitChars* argument.
+
+Each element of the result list will consist of the
+characters from *string* between instances of the
+characters in *splitChars*.
+
+Empty list elements will be generated if *string* contains
+adjacent characters in *splitChars*, or if the first or last
+character of *string* is in *splitChars*.
+
+If *splitChars* is an empty string then each character of
+*string* becomes a separate element of the result list.
+
+*SplitChars* defaults to the standard white-space characters.
+For example,
+
+ split "comp.unix.misc" .
+
+returns +'"comp unix misc"'+ and
+
+ split "Hello world" {}
+
+returns +'"H e l l o { } w o r l d"'+.
+
+string
+~~~~~~
+
++*string* 'option arg ?arg ...?'+
+
+Perform one of several string operations, depending on *option*.
+The legal options (which may be abbreviated) are:
+
++*string compare* 'string1 string2'+::
+ Perform a character-by-character comparison of strings *string1* and
+ *string2* in the same way as the C 'strcmp' procedure. Return
+ -1, 0, or 1, depending on whether *string1* is lexicographically
+ less than, equal to, or greater than *string2*.
+
++*string equal ?-nocase?* 'string1 string2'+::
+ Returns 1 if the strings are equal, or 0 otherwise.
+ Performs a case-insensitive comparison if '-nocase' is specified.
+
++*string first* 'string1 string2'+::
+ Search *string2* for a sequence of characters that exactly match
+ the characters in *string1*. If found, return the index of the
+ first character in the first such match within *string2*. If not
+ found, return -1.
+
++*string index* 'string charIndex'+::
+ Returns the *charIndex*'th character of the *string*
+ argument. A *charIndex* of 0 corresponds to the first
+ character of the string.
+ If *charIndex* is less than 0 or greater than
+ or equal to the length of the string then an empty string is
+ returned.
+
++*string last* 'string1 string2'+::
+ Search *string2* for a sequence of characters that exactly match
+ the characters in *string1*. If found, return the index of the
+ first character in the last such match within *string2*. If there
+ is no match, then return -1.
+
++*string length* 'string'+::
+ Returns a decimal string giving the number of characters in *string*.
+
++*string match* 'pattern string'+::
+ See if *pattern* matches *string*; return 1 if it does, 0
+ if it doesn't. Matching is done in a fashion similar to that
+ used by the C-shell. For the two strings to match, their contents
+ must be identical except that the following special sequences
+ may appear in *pattern*:
+
+ +*+;;
+ Matches any sequence of characters in *string*,
+ including a null string.
+
+ +?+;;
+ Matches any single character in *string*.
+
+ +[*chars*]+;;
+ Matches any character in the set given by *chars*.
+ If a sequence of the form *x*-*y* appears in *chars*,
+ then any character between *x* and *y*, inclusive,
+ will match.
+
+ +\x+;;
+ Matches the single character *x*. This provides a way of
+ avoiding the special interpretation of the characters `\*?[]\`
+ in **pattern**.
+
++*string range* 'string first last'+::
+ Returns a range of consecutive characters from *string*, starting
+ with the character whose index is *first* and ending with the
+ character whose index is *last*. An index of 0 refers to the
+ first character of the string. Either *first* or *last* may be 'end'
+ or 'end-<n>' (where '<n>' is an integer) to refer to the last character of
+ the string or the 'nth-from-last' character of the string.
+ If *first* is less than zero then it is treated as if it were zero, and
+ if *last* is greater than or equal to the length of the string then
+ it is treated as if it were 'end'. If *first* is greater than
+ *last* then an empty string is returned.
+
++*string repeat* 'string count'+::
+ Returns a new string consisting of *string* repeated *count* times.
+
++*string tolower* 'string'+::
+ Returns a value equal to *string* except that all upper case
+ letters have been converted to lower case.
+
++*string toupper* 'string'+::
+ Returns a value equal to *string* except that all lower case
+ letters have been converted to upper case.
+
++*string trim* 'string ?chars?'+::
+ Returns a value equal to *string* except that any leading
+ or trailing characters from the set given by *chars* are
+ removed.
+ If *chars* is not specified then white space is removed
+ (spaces, tabs, newlines, and carriage returns).
+
++*string trimleft* 'string ?chars?'+::
+ Returns a value equal to *string* except that any
+ leading characters from the set given by *chars* are
+ removed.
+ If *chars* is not specified then white space is removed
+ (spaces, tabs, newlines, and carriage returns).
+
++*string trimright* 'string ?chars?'+::
+ Returns a value equal to *string* except that any
+ trailing characters from the set given by *chars* are
+ removed.
+ If *chars* is not specified then white space is removed
+ (spaces, tabs, newlines, and carriage returns).
+
+tell
+~~~~
++*tell* 'fileId'+ or
++'fileId' *tell*+
+
+Returns a decimal string giving the current access position in
+*fileId*.
+
+*FileId* must have been the return value from a previous call to
+'open', or it may be 'stdin', 'stdout', or 'stderr' to refer to one
+of the standard I/O channels.
+
+time
+~~~~
++*time* 'command ?count?'+
+
+This command will call the Tcl interpreter *count*
+times to execute *command* (or once if *count* isn't
+specified). It will then return a string of the form
+
+ 503 microseconds per iteration
+
+which indicates the average amount of time required per iteration,
+in microseconds.
+
+Time is measured in elapsed time, not CPU time.
+
+unknown
+~~~~~~~
++*unknown* 'cmdName ?arg arg ...?'+
+
+This command doesn't actually exist as part of Tcl, but Tcl will
+invoke it if it does exist.
+
+If the Tcl interpreter encounters a command name for which there
+is not a defined command, then Tcl checks for the existence of
+a command named 'unknown'.
+
+If there is no such command, then the interpeter returns an
+error.
+
+If the 'unknown' command exists, then it is invoked with
+arguments consisting of the fully-substituted name and arguments
+for the original non-existent command.
+
+The 'unknown' command typically does things like searching
+through library directories for a command procedure with the name
+*cmdName*, or expanding abbreviated command names to full-length,
+or automatically executing unknown commands as UNIX sub-processes.
+
+In some cases (such as expanding abbreviations) 'unknown' will
+change the original command slightly and then (re-)execute it.
+The result of the 'unknown' command is used as the result for
+the original non-existent command.
+
+unset
+~~~~~
++*unset* 'name ?name name ...?'+
+
+Remove one or more variables.
+Each *name* is a variable name, specified in any of the
+ways acceptable to the 'set' command.
+
+If a *name* refers to an element of an array, then that
+element is removed without affecting the rest of the array.
+
+If a *name* consists of an array name with no parenthesized
+index, then the entire array is deleted.
+
+The 'unset' command returns an empty string as result.
+
+An error occurs if any of the variables doesn't exist.
+
+uplevel
+~~~~~~~
++*uplevel* '?level? command ?command ...?'+
+
+All of the *command* arguments are concatenated as if they had
+been passed to 'concat'; the result is then evaluated in the
+variable context indicated by *level*. 'Uplevel' returns
+the result of that evaluation. If *level* is an integer, then
+it gives a distance (up the procedure calling stack) to move before
+executing the command. If *level* consists of '\#' followed by
+a number then the number gives an absolute level number. If *level*
+is omitted then it defaults to '1'. *Level* cannot be
+defaulted if the first *command* argument starts with a digit or '\#'.
+
+For example, suppose that procedure 'a' was invoked
+from top-level, and that it called 'b', and that 'b' called 'c'.
+Suppose that 'c' invokes the 'uplevel' command. If *level*
+is '1' or '\#2' or omitted, then the command will be executed
+in the variable context of 'b'. If *level* is '2' or '\#1'
+then the command will be executed in the variable context of 'a'.
+
+If *level* is '3' or '\#0' then the command will be executed
+at top-level (only global variables will be visible).
+The 'uplevel' command causes the invoking procedure to disappear
+from the procedure calling stack while the command is being executed.
+In the above example, suppose 'c' invokes the command
+
+ uplevel 1 {set x 43; d}
+
+where 'd' is another Tcl procedure. The 'set' command will
+modify the variable 'x' in 'b's context, and 'd' will execute
+at level 3, as if called from 'b'. If it in turn executes
+the command
+
+ uplevel {set x 42}
+
+then the 'set' command will modify the same variable 'x' in 'b's
+context: the procedure 'c' does not appear to be on the call stack
+when 'd' is executing. The command 'info level' may
+be used to obtain the level of the current procedure.
+
+'Uplevel' makes it possible to implement new control
+constructs as Tcl procedures (for example, 'uplevel' could
+be used to implement the 'while' construct as a Tcl procedure).
+
+upvar
+~~~~~
++*upvar* '?level? otherVar myVar ?otherVar myVar ...?'+
+
+This command arranges for one or more local variables in the current
+procedure to refer to variables in an enclosing procedure call or
+to global variables.
+
+*Level* may have any of the forms permitted for the 'uplevel'
+command, and may be omitted if the first letter of the first *otherVar*
+isn't '\#' or a digit (it defaults to '1').
+
+For each *otherVar* argument, 'upvar' makes the variable
+by that name in the procedure frame given by *level* (or at
+global level, if *level* is '\#0') accessible
+in the current procedure by the name given in the corresponding
+*myVar* argument.
+
+The variable named by *otherVar* need not exist at the time of the
+call; it will be created the first time *myVar* is referenced, just like
+an ordinary variable.
+
+'Upvar' may only be invoked from within procedures.
+
+'Upvar' returns an empty string.
+
+The 'upvar' command simplifies the implementation of call-by-name
+procedure calling and also makes it easier to build new control constructs
+as Tcl procedures.
+For example, consider the following procedure:
+
+ proc add2 name {
+ upvar $name x
+ set x [expr $x+2]
+ }
+
+'Add2' is invoked with an argument giving the name of a variable,
+and it adds two to the value of that variable.
+Although 'add2' could have been implemented using 'uplevel'
+instead of 'upvar', 'upvar' makes it simpler for 'add2'
+to access the variable in the caller's procedure frame.
+
+while
+~~~~~
++*while* 'test body'+
+
+The *while* command evaluates *test* as an expression
+(in the same way that 'expr' evaluates its argument).
+The value of the expression must be numeric; if it is non-zero
+then *body* is executed by passing it to the Tcl interpreter.
+
+Once *body* has been executed then *test* is evaluated
+again, and the process repeats until eventually *test*
+evaluates to a zero numeric value. 'Continue'
+commands may be executed inside *body* to terminate the current
+iteration of the loop, and 'break'
+commands may be executed inside *body* to cause immediate
+termination of the 'while' command.
+
+The 'while' command always returns an empty string.
+
+OPTIONAL-EXTENSIONS
+-------------------
+
+The following extensions may or may not be available depending upon
+what options were selected when Tcl was built.
+
+bio
+~~~
+The bio command provides a way to read and write binary files
+from within Tcl. Note that since Jim supports binary strings, the
+main use of this command is 'bio copy' to easily copy between file
+descriptors.
+
++*bio read* '?-hex? fd var numbytes'+::
+ Read bytes from a file descriptor. By default the data is not encoded.
+ Using *-hex* encodes the data as ascii hex instead. Returns
+ the number of bytes actually read.
+
++*bio write* '?-hex? fd buf'+::
+ Write a string to a file descriptor. If *-hex* is specified, the
+ string is expected to be in ascii hexx format. Returns the number
+ of bytes actually written.
+
++*bio copy* 'fromfd tofd ?numbytes?'+::
+ Copy binary data from the file descriptor *fromfd* to the
+ file descriptor *tofd*. If *numbytes* is specified, at most that many
+ bytes will be copied. Otherwise copying continues until the end
+ of the input file. Returns the number of bytes actually copied.
+
+syslog
+~~~~~~
++*syslog* '?options? ?priority? message'+
+
+This command sends message to system syslog facility with given
+priority. Valid priorities are:
+
+ emerg, alert, crit, err, error, warning, notice, info, debug
+
+If a message is specified, but no priority is specified, then a
+priority of info is used.
+
+By default, facility user is used and the value of global tcl variable
+argv0 is used as ident string. However, any of the following options
+may be specified before priority to control these parameters:
+
++*-facility* 'value'+::
+ Use specified facility instead of user. Following
+ facility are recognized:
+
+ authpriv, cron, daemon, kernel, lpr, mail, news, syslog, user,
+ uucp, local0-local7
+
++*-ident* 'string'+::
+ Use given string instead of argv0 variable for ident string.
+
++*-options* 'integer'+::
+ Set syslog options such as LOG_CONS, LOG_NDELAY You should
+ use numeric values of those from your system syslog.h file,
+ because I haven't got time to implement yet another hash
+ table.
+
+BUILT-IN VARIABLES
+------------------
+
+The following global variables are created automatically
+by the Tcl library.
+
++env+::
+ This variable is set by Jim as an array
+ whose elements are the environment variables for the process.
+ Reading an element will return the value of the corresponding
+ environment variable.
+ This array is initialised at startup from the 'env' command.
+
++auto_path+::
+ This variable contains a list of paths to search for packages.
+ It contains {. /lib/jim} by default.
+
+The following global variables are set by jimsh.
+
++tcl_interactive+::
+ This variable is set to 1 if jimsh is started in interactive mode
+ or 0 otherwise.
+
++argexpand: stdin: Illegal byte sequence
+v0+::
+ If jimsh is invoked to run a script, this variable contains the name
+ of the script.
+
++argv+::
+ If jimsh is invoked to run a script, this variable contains a list
+ of any arguments supplied to the script.
+
+LICENCE
+-------
+
+Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
+Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
+Copyright 2005 patthoyts - Pat Thoyts <patthoyts@users.sf.net>
+Copyright 2008 oharboe -
diff --git a/jim-interactive.c b/jim-interactive.c
index d1108ae..695afd6 100644
--- a/jim-interactive.c
+++ b/jim-interactive.c
@@ -18,7 +18,7 @@ int Jim_InteractivePrompt(Jim_Interp *interp)
int reslen;
if (retcode != 0) {
- if (retcode >= 2 && retcode <= 6)
+ if (retcode >= 1 && retcode < sizeof(retcodestr) / sizeof(*retcodestr))
printf("[%s] . ", retcodestr[retcode]);
else
printf("[%d] . ", retcode);
diff --git a/jim.c b/jim.c
index f45153f..8d6230d 100644
--- a/jim.c
+++ b/jim.c
@@ -4428,7 +4428,6 @@ void Jim_CollectIfNeeded(Jim_Interp *interp)
Jim_Interp *Jim_CreateInterp(void)
{
Jim_Interp *i = Jim_Alloc(sizeof(*i));
- Jim_Obj *pathPtr;
i->errorLine = 0;
i->errorFileName = Jim_StrDup("");
@@ -4475,8 +4474,7 @@ Jim_Interp *Jim_CreateInterp(void)
Jim_IncrRefCount(i->errorProc);
/* Initialize key variables every interpreter should contain */
- pathPtr = Jim_NewStringObj(i, ".", -1);
- Jim_SetVariableStr(i, JIM_LIBPATH, pathPtr);
+ Jim_SetVariableStrWithStr(i, JIM_LIBPATH, ". /lib/jim");
Jim_SetVariableStrWithStr(i, JIM_INTERACTIVE, "0");
return i;