diff --git a/Doc/lib.tex b/Doc/lib.tex
index 8e36427..f0b649a 100644
--- a/Doc/lib.tex
+++ b/Doc/lib.tex
@@ -55,2094 +55,8 @@
 
 \pagenumbering{arabic}
 
-\section{Introduction}
-
-The {\Python} library consists of three parts, with different levels of
-integration with the interpreter.
-Closest to the interpreter are built-in types, exceptions and functions.
-Next are built-in modules, which are written in C and linked statically
-with the interpreter.
-Finally there are standard modules that are implemented entirely in
-{\Python}, but are always available.
-For efficiency, some standard modules may become built-in modules in
-future versions of the interpreter.
-
-\section{Built-in Types, Exceptions and Functions}
-
-Names for built-in exceptions and functions are found in a separate
-read-only symbol table which cannot be modified.
-This table is searched last, so local and global user-defined names can
-override built-in names.
-Built-in types have no names but are created by syntactic constructs
-(such as constants) or built-in functions.
-They are described together here for easy reference.%
-\footnote{
-The descriptions sorely lack explanations of the exceptions that
-may be raised---this will be fixed in a future version of this
-document.
-}
-
-\subsection{Built-in Types}
-
-The following sections describe the standard types that are built into the
-interpreter.
-\subsubsection{Numeric Types}
-
-There are two numeric types: integers and floating point numbers.
-Integers are implemented using {\tt long} in C, so they have at least 32
-bits of precision.
-Floating point numbers are implemented using {\tt double} in C.
-All bets on precision are off.
-Numbers are created by numeric constants or as the result of built-in
-functions and operators.
-
-Numeric types support the following operations:
-
-\begin{center}
-\begin{tabular}{|c|l|c|}
-\hline
-Operation & Result & Notes \\
-\hline
-{\tt abs}({\em x}) & absolute value of {\em x} & \\
-{\tt int}({\em x}) & {\em x} converted to integer & (1) \\
-{\tt float}({\em x}) & {\em x} converted to floating point & \\
-{\tt -}{\em x} & {\em x} negated & \\
-{\tt +}{\em x} & {\em x} unchanged & \\
-{\em x}{\tt +}{\em y} & sum of {\em x} and {\em y} & \\
-{\em x}{\tt -}{\em y} & difference of {\em x} and {\em y} & \\
-{\em x}{\tt *}{\em y} & product of {\em x} and {\em y} & \\
-{\em x}{\tt /}{\em y} & quotient of {\em x} and {\em y} & (2) \\
-{\em x}{\tt \%}{\em y} & remainder of {\em x}{\tt /}{\em y} & (3) \\
-\hline
-\end{tabular}
-\end{center}
-
-\noindent
-Notes:
-\begin{description}
-\item[(1)]
-This may round or truncate as in C; see functions {\tt floor} and
-{\tt ceil} in module {\tt math}.
-\item[(2)]
-Integer division is defined as in C: the result is an integer; with
-positive operands, it truncates towards zero; with a negative operand,
-the result is unspecified.
-\item[(3)]
-Only defined for integers.
-\end{description}
-
-Mixed arithmetic is not supported; both operands must have the same type.
-Mixed comparisons return the wrong result (floats always compare smaller
-than integers).%
-\footnote{
-These restrictions are bugs in the language definitions and will be
-fixed in the future.
-}
-\subsubsection{Sequence Types}
-
-There are three sequence types: strings, lists and tuples.
-Strings constants are written in single quotes: {\tt 'xyzzy'}.
-Lists are constructed with square brackets: {\tt [a,~b,~c]}.
-Tuples are constructed by the comma operator or with an empty set of
-parentheses: {\tt a,~b,~c} or {\tt ()}.
-
-Sequence types support the following operations ({\em s} and {\em t} are
-sequences of the same type; {\em n}, {\em i} and {\em j} are integers):
-
-\begin{center}
-\begin{tabular}{|c|l|c|}
-\hline
-Operation & Result & Notes \\
-\hline
-{\tt len}({\em s}) & length of {\em s} & \\
-{\tt min}({\em s}) & smallest item of {\em s} & \\
-{\tt max}({\em s}) & largest item of {\em s} & \\
-{\em x} {\tt in} {\em s} &
-	true if an item of {\em s} is equal to {\em x} & \\
-{\em x} {\tt not} {\tt in} {\em s} &
-	false if an item of {\em s} is equal to {\em x} & \\
-{\em s}{\tt +}{\em t} & the concatenation of {\em s} and {\em t} & \\
-{\em s}{\tt *}{\em n}, {\em n}*{\em s} &
-	{\em n} copies of {\em s} concatenated & (1) \\
-{\em s}[{\em i}] & {\em i}'th item of {\em s} & \\
-{\em s}[{\em i}:{\em j}] &
-	slice of {\em s} from {\em i} to {\em j} & (2) \\
-\hline
-\end{tabular}
-\end{center}
-
-\noindent
-Notes:
-\begin{description}
-\item[(1)]
-Sequence repetition is only supported for strings.
-\item[(2)]
-The slice of $s$ from $i$ to $j$ is defined as the sequence
-of items with index $k$ such that $i \leq k < j$.
-Special rules apply for negative and omitted indices; see the Tutorial
-or the Reference Manual.
-\end{description}
-
-\paragraph{Mutable Sequence Types.}
-
-List objects support additional operations that allow in-place
-modification of the object.
-These operations would be supported by other mutable sequence types
-(when added to the language) as well.
-Strings and tuples are immutable sequence types and such objects cannot
-be modified once created.
-The following operations are defined on mutable sequence types (where
-{\em x} is an arbitrary object):
-
-\begin{center}
-\begin{tabular}{|c|l|}
-\hline
-Operation & Result \\
-\hline
-{\em s}[{\em i}] = {\em x} &
-	item {\em i} of {\em s} is replaced by {\em x} \\
-{\em s}[{\em i}:{\em j}] = {\em t} &
-	slice of {\em s} from {\em i} to {\em j} is replaced by {\em t} \\
-{\tt del} {\em s}[{\em i}:{\em j}] &
-	same as {\em s}[{\em i}:{\em j}] = [] \\
-{\em s}.{\tt append}({\em x}) &
-	same as {\em s}[{\tt len}({\em x}):{\tt len}({\em x})] = [{\em x}] \\
-{\em s}.{\tt insert}({\em i}, {\em x}) &
-	same as {\em s}[{\em i}:{\em i}] = [{\em x}] \\
-{\em s}.{\tt sort}() &
-	the items of {\em s} are permuted to satisfy \\
-	&
-	$s[i] \leq s[j]$ for $i < j$\\
-\hline
-\end{tabular}
-\end{center}
-
-\subsubsection{Mapping Types}
-
-A
-{\em mapping}
-object maps values of one type (the key type) to arbitrary objects.
-Mappings are mutable objects.
-There is currently only one mapping type, the
-{\em dictionary}.
-A dictionary's keys are strings.
-An empty dictionary is created by the expression \verb"{}".
-An extension of this notation is used to display dictionaries when
-written (see the example below).
-
-The following operations are defined on mappings (where {\em a} is a
-mapping, {\em k} is a key and {\em x} is an arbitrary object):
-
-\begin{center}
-\begin{tabular}{|c|l|c|}
-\hline
-Operation & Result & Notes\\
-\hline
-{\tt len}({\em a}) & the number of elements in {\em a} & \\
-{\em a}[{\em k}] & the item of {\em a} with key {\em k} & \\
-{\em a}[{\em k}] = {\em x} & set {\em a}[{\em k}] to {\em x} & \\
-{\tt del} {\em a}[{\em k}] & remove {\em a}[{\em k}] from {\em a} & \\
-{\em a}.{\tt keys}() & a copy of {\em a}'s list of keys & (1) \\
-{\em a}.{\tt has\_key}({\em k}) & true if {\em a} has a key {\em k} & \\
-\hline
-\end{tabular}
-\end{center}
-
-\noindent
-Notes:
-\begin{description}
-\item[(1)]
-Keys are listed in random order.
-\end{description}
-
-A small example using a dictionary:
-\bcode\begin{verbatim}
->>> tel = {}
->>> tel['jack'] = 4098
->>> tel['sape'] = 4139
->>> tel['guido'] = 4127
->>> tel['jack']
-4098
->>> tel
-{'sape': 4139; 'guido': 4127; 'jack': 4098}
->>> del tel['sape']
->>> tel['irv'] = 4127
->>> tel
-{'guido': 4127; 'irv': 4127; 'jack': 4098}
->>> tel.keys()
-['guido', 'irv', 'jack']
->>> tel.has_key('guido')
-1
->>> 
-\end{verbatim}\ecode
-\subsubsection{Other Built-in Types}
-
-The interpreter supports several other kinds of objects.
-Most of these support only one or two operations.
-
-\paragraph{Modules.}
-
-The only operation on a module is member acces: {\em m}{\tt .}{\em name},
-where {\em m} is a module and {\em name} accesses a name defined in
-{\em m}'s symbol table.
-Module members can be assigned to.
-
-\paragraph{Classes and Class Objects.}
-
-XXX Classes will be explained at length in a later version of this
-document.
-
-\paragraph{Functions.}
-
-Function objects are created by function definitions.
-The only operation on a function object is to call it:
-{\em func}({\em optional-arguments}).
-
-Built-in functions have a different type than user-defined functions,
-but they support the same operation.
-
-\paragraph{Methods.}
-
-Methods are functions that are called using the member acces notation.
-There are two flavors: built-in methods (such as {\tt append()} on
-lists) and class member methods.
-Built-in methods are described with the types that support them.
-XXX Class member methods will be described in a later version of this
-document.
-
-\paragraph{Type Objects.}
-
-Type objects represent the various object types.
-An object's type is accessed by the built-in function
-{\tt type()}.
-There are no operations on type objects.
-
-\paragraph{The Null Object.}
-
-This object is returned by functions that don't explicitly return a
-value.
-It supports no operations.
-There is exactly one null object, named {\tt None}
-(a built-in name).
-
-\paragraph{File Objects.}
-
-File objects are implemented using C's
-{\em stdio}
-package and can be created with the built-in function
-{\tt open()}.
-They have the following methods:
-\begin{description}
-\funcitem{close}{}
-Closes the file.
-A closed file cannot be read or written anymore.
-\funcitem{read}{size}
-Reads at most
-{\tt size}
-bytes from the file (less if the read hits EOF).
-The bytes are returned as a string object.
-An empty string is returned when EOF is hit immediately.
-(For certain files, like ttys, it makes sense to continue reading after
-an EOF is hit.)
-\funcitem{readline}{size}
-Reads a line of at most
-{\tt size}
-bytes from the file.
-A trailing newline character, if present, is kept in the string.
-The size is optional and defaults to a large number (but not infinity).
-EOF is reported as by
-{\tt read().}
-\funcitem{write}{str}
-Writes a string to the file.
-Returns no value.
-\end{description}
-
-\subsection{Built-in Exceptions}
-
-The following exceptions can be generated by the interpreter or
-built-in functions.
-Except where mentioned, they have a string argument (also known as the
-`associated value' of an exception) indicating the detailed cause of the
-error.
-The strings listed with the exception names are their values when used
-in an expression or printed.
-\begin{description}
-\excitem{EOFError}{end-of-file read}
-(No argument.)
-Raised when a built-in function ({\tt input()} or {\tt raw\_input()})
-hits an end-of-file condition (EOF) without reading any data.
-(N.B.: the {\tt read()} and {\tt readline()} methods of file objects
-return an empty string when they hit EOF.)
-\excitem{KeyboardInterrupt}{end-of-file read}
-(No argument.)
-Raised when the user hits the interrupt key (normally Control-C or DEL).
-During execution, a check for interrupts is made regularly.
-Interrupts typed when a built-in function ({\tt input()} or
-{\tt raw\_input()}) is waiting for input also raise this exception.
-\excitem{MemoryError}{out of memory}
-%.br
-Raised when an operation runs out of memory but the situation
-may still be rescued (by deleting some objects).
-\excitem{NameError}{undefined name}
-%.br
-Raised when a name is not found.
-This applies to unqualified names, module names (on {\tt import}),
-module members and object methods.
-The string argument is the name that could not be found.
-\excitem{RuntimeError}{run-time error}
-%.br
-Raised for a variety of reasons, e.g., division by zero or index out of
-range.
-\excitem{SystemError}{system error}
-%.br
-Raised when the interpreter finds an internal error, but the situation
-does not look so serious to cause it to abandon all hope.
-\excitem{TypeError}{type error}
-%.br
-Raised when an operation or built-in function is applied to an object of
-inappropriate type.
-\end{description}
-
-\subsection{Built-in Functions}
-
-The {\Python} interpreter has a small number of functions built into it that
-are always available.
-They are listed here in alphabetical order.
-\begin{description}
-\funcitem{abs}{x}
-Returns the absolute value of a number.
-The argument may be an integer or floating point number.
-\funcitem{chr}{i}
-Returns a string of one character
-whose ASCII code is the integer {\tt i},
-e.g., {\tt chr(97)} returns the string {\tt 'a'}.
-This is the inverse of {\tt ord()}.
-\funcitem{dir}{}
-Without arguments, this function returns the list of names in the
-current local symbol table, sorted alphabetically.
-With a module object as argument, it returns the sorted list of names in
-that module's global symbol table.
-For example:
-\bcode\begin{verbatim}
->>> import sys
->>> dir()
-['sys']
->>> dir(sys)
-['argv', 'exit', 'modules', 'path', 'stderr', 'stdin', 'stdout']
->>> 
-\end{verbatim}\ecode
-\funcitem{divmod}{a, b}
-%.br
-Takes two integers as arguments and returns a pair of integers
-consisting of their quotient and remainder.
-For
-\bcode\begin{verbatim}
-q, r = divmod(a, b)
-\end{verbatim}\ecode
-the invariants are:
-\bcode\begin{verbatim}
-a = q*b + r
-abs(r) < abs(b)
-r has the same sign as b
-\end{verbatim}\ecode
-For example:
-\bcode\begin{verbatim}
->>> divmod(100, 7)
-(14, 2)
->>> divmod(-100, 7)
-(-15, 5)
->>> divmod(100, -7)
-(-15, -5)
->>> divmod(-100, -7)
-(14, -2)
->>> 
-\end{verbatim}\ecode
-\funcitem{eval}{s}
-Takes a string as argument and parses and evaluates it as a {\Python}
-expression.
-The expression is executed using the current local and global symbol
-tables.
-Syntax errors are reported as exceptions.
-For example:
-\bcode\begin{verbatim}
->>> x = 1
->>> eval('x+1')
-2
->>> 
-\end{verbatim}\ecode
-\funcitem{exec}{s}
-Takes a string as argument and parses and evaluates it as a sequence of
-{\Python} statements.
-The string should end with a newline (\verb"'\n'").
-The statement is executed using the current local and global symbol
-tables.
-Syntax errors are reported as exceptions.
-For example:
-\bcode\begin{verbatim}
->>> x = 1
->>> exec('x = x+1\n')
->>> x
-2
->>> 
-\end{verbatim}\ecode
-\funcitem{float}{x}
-Converts a number to floating point.
-The argument may be an integer or floating point number.
-\funcitem{input}{s}
-Equivalent to
-{\tt eval(raw\_input(s))}.
-As for
-{\tt raw\_input()},
-the argument is optional.
-\funcitem{int}{x}
-Converts a number to integer.
-The argument may be an integer or floating point number.
-\funcitem{len}{s}
-Returns the length (the number of items) of an object.
-The argument may be a sequence (string, tuple or list) or a mapping
-(dictionary).
-\funcitem{max}{s}
-Returns the largest item of a non-empty sequence (string, tuple or list).
-\funcitem{min}{s}
-Returns the smallest item of a non-empty sequence (string, tuple or list).
-\funcitem{open}{name, mode}
-%.br
-Returns a file object (described earlier under Built-in Types).
-The string arguments are the same as for stdio's
-{\tt fopen()}:
-{\tt 'r'}
-opens the file for reading,
-{\tt 'w'}
-opens it for writing (truncating an existing file),
-{\tt 'a'}
-opens it for appending.%
-\footnote{
-This function should go into a built-in module
-{\tt io}.
-}
-\funcitem{ord}{c}
-Takes a string of one character and returns its
-ASCII value, e.g., {\tt ord('a')} returns the integer {\tt 97}.
-This is the inverse of {\tt chr()}.
-\funcitem{range}{}
-This is a versatile function to create lists containing arithmetic
-progressions of integers.
-With two integer arguments, it returns the ascending sequence of
-integers starting at the first and ending one before the second
-argument.
-A single argument is used as the end point of the sequence, with 0 used
-as the starting point.
-A third argument specifies the step size; negative steps are allowed and
-work as expected, but don't specify a zero step.
-The resulting list may be empty.
-For example:
-\bcode\begin{verbatim}
->>> range(10)
-[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
->>> range(1, 1+10)
-[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
->>> range(0, 30, 5)
-[0, 5, 10, 15, 20, 25]
->>> range(0, 10, 3)
-[0, 3, 6, 9]
->>> range(0, -10, -1)
-[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
->>> range(0)
-[]
->>> range(1, 0)
-[]
->>> 
-\end{verbatim}\ecode
-\funcitem{raw\_input}{s}
-%.br
-The argument is optional; if present, it is written to standard output
-without a trailing newline.
-The function then reads a line from input, converts it to a string
-(stripping a trailing newline), and returns that.
-EOF is reported as an exception.
-For example:
-\bcode\begin{verbatim}
->>> raw_input('Type anything: ')
-Type anything: Mutant Teenage Ninja Turtles
-'Mutant Teenage Ninja Turtles'
->>> 
-\end{verbatim}\ecode
-\funcitem{reload}{module}
-Causes an already imported module to be re-parsed and re-initialized.
-This is useful if you have edited the module source file and want to
-try out the new version without leaving {\Python}.
-\funcitem{type}{x}
-Returns the type of an object.
-Types are objects themselves:
-the type of a type object is its own type.
-\end{description}
-
-\section{Built-in Modules}
-
-The modules described in this section are built into the interpreter.
-They must be imported using
-{\tt import}.
-Some modules are not always available; it is a configuration option to
-provide them.
-Details are listed with the descriptions, but the best way to see if
-a module exists in a particular implementation is to attempt to import
-it.
-
-\subsection{Built-in Module {\tt sys}}
-
-This module provides access to some variables used or maintained by the
-interpreter and to functions that interact strongly with the interpreter.
-It is always available.
-\begin{description}
-\funcitem{argv}
-The list of command line arguments passed to a {\Python} script.
-{\tt sys.argv[0]}
-is the script name.
-If no script name was passed to the {\Python} interpreter,
-{\tt sys.argv}
-is empty.
-\funcitem{exit}{n}
-Exits from {\Python} with numeric exit status
-{\tt n}.
-This closes all open files and performs other cleanup-actions required by
-the interpreter (but
-{\em finally clauses}
-of
-{\tt try}
-statements are not executed!).
-\funcitem{modules}
-Gives the list of modules that have already been loaded.
-This can be manipulated to force reloading of modules and other tricks.
-\funcitem{path}
-A list of strings that specifies the search path for modules.
-Initialized from the environment variable {\tt PYTHONPATH}, or an
-installation-dependent default.
-\funcitem{ps1,~ps2}
-Strings specifying the primary and secondary prompt of the interpreter.
-These are only defined if the interpreter is in interactive mode.
-Their initial values in this case are
-{\tt '>>> '}
-and
-{\tt '... '}.
-\funcitem{stdin, stdout, stderr}
-%.br
-File objects corresponding to the interpreter's standard input, output
-and error streams.
-{\tt sys.stdin}
-is used for all interpreter input except for scripts but including calls
-to
-{\tt input()}
-and
-{\tt raw\_input()}.
-{\tt sys.stdout}
-is used for the output of
-{\tt print} and expression statements
-and for the prompts of
-{\tt input()}
-and
-{\tt raw\_input()}.
-The interpreter's own prompts and its error messages are written to
-stderr.
-Assigning to
-{\tt sys.stderr}
-has no effect on the interpreter; it can be used to write error messages
-to stderr using
-{\tt print}.
-\end{description}
-
-\subsection{Built-in Module {\tt math}}
-
-This module is always available.
-It provides access to the mathematical functions defined by the C
-standard.
-They are:
-{\tt acos(x)},
-{\tt asin(x)},
-{\tt atan(x)},
-{\tt atan2(x,y)},
-{\tt ceil(x)},
-{\tt cos(x)},
-{\tt cosh(x)},
-{\tt exp(x)},
-{\tt fabs(x)},
-{\tt floor(x)},
-%{\tt fmod(...)}  XXX not yet
-%{\tt frexp(...)} XXX not yet
-%{\tt ldexp(...)} XXX not yet
-{\tt log(x)},
-{\tt log10(x)},
-%{\tt modf(...)}  XXX not yet
-{\tt pow(x,y)},
-{\tt sin(x)},
-{\tt sinh(x)},
-{\tt sqrt(x)},
-{\tt tan(x)},
-{\tt tanh(x)}.
-
-It also defines two mathematical constants:
-{\tt pi}
-and
-{\tt e}.
-
-\subsection{Built-in Module {\tt time}}
-
-This module provides various time-related functions.
-It is always available.
-Functions are:
-\begin{description}
-\funcitem{sleep}{secs}
-Suspends execution for the given number of seconds.
-\funcitem{time}{}
-Returns the time in seconds since the Epoch (Thursday January 1,
-00:00:00, 1970 UCT on \UNIX\ machines).
-\end{description}
-
-\noindent
-In some versions (Amoeba, Mac) the following functions also exist:
-\begin{description}
-\funcitem{millisleep}{msecs}
-Suspends execution for the given number of milliseconds.
-\funcitem{millitimer}{}
-Returns the number of milliseconds of real time elapsed since some point
-in the past that is fixed per execution of the python interpreter (but
-may change in each following run).
-\end{description}
-
-\noindent
-The granularity of the milliseconds functions may be more than a
-millisecond (100 msecs on Amoeba, 1/60 sec on the Mac).
-
-\subsection{Built-in Module {\tt regexp}}
-
-This module provides a regular expression matching operation.
-It is always available.
-
-The module defines a function and an exception:
-
-\begin{description}
-
-\funcitem{compile}{pattern}
-
-Compile a regular expression given as a string into a regular
-expression object.
-The string must be an egrep-style regular expression;
-this means that the characters {\tt '(' ')' '*' '+' '?' '|' '^' '$'}
-are special.
-(It is implemented using Henry Spencer's regular expression matching
-functions.)
-
-excitem{error}{regexp.error}
-
-Exception raised when a string passed to {\tt compile()} is not a
-valid regular expression (e.g., unmatched parentheses) or when some other
-error occurs during compilation or matching
-(``no match found'' is not an error).
-
-\end{description}
-
-Compiled regular expression objects support a single method:
-
-\begin{description}
-
-\funcitem{exec}{str}
-
-Find the first occurrence of the compiled regular expression in the
-string {\tt str}.
-The return value is a tuple of pairs specifying where a match was
-found and where matches were found for subpatterns specified with
-{\tt '('} and {\tt ')'} in the pattern.
-If no match is found, an empty tuple is returned; otherwise the first
-item of the tuple is a pair of slice indices into the search string
-giving the match found.
-If there were any subpatterns in the pattern, the returned tuple has an
-additional item for each subpattern, giving the slice indices into the
-search string where that subpattern was found.
-
-\end{description}
-
-For example:
-\bcode\begin{verbatim}
->>> import regexp
->>> r = regexp.compile('--(.*)--')
->>> s = 'a--b--c'
->>> r.exec(s)
-((1, 6), (3, 4))
->>> s[1:6] # The entire match
-'--b--'
->>> s[3:4] # The subpattern
-'b'
->>> 
-\end{verbatim}\ecode
-
-\subsection{Built-in Module {\tt posix}}
-
-This module provides access to operating system functionality that is
-standardized by the C Standard and the POSIX standard (a thinly diguised
-{\UNIX} interface).
-It is available in all {\Python} versions except on the Macintosh.
-Errors are reported exceptions.
-It defines the following items:
-\begin{description}
-\funcitem{chdir}{path}
-Changes the current directory to
-{\tt path}.
-\funcitem{chmod}{path, mode}
-Change the mode of
-{\tt path}
-to the numeric
-{\tt mode}.
-\funcitem{environ}
-A dictionary representing the string environment at the time
-the interpreter was started.
-(Modifying this dictionary does not affect the string environment of the
-interpreter.)
-For example,
-{\tt posix.environ['HOME']}
-is the pathname of your home directory, equivalent to
-{\tt getenv("HOME")}
-in C.
-\excitem{error}{posix.error}
-%.br
-The exception raised when an POSIX function returns an error.
-The value accompanying this exception is a pair containing the numeric
-error code from
-{\tt errno}
-and the corresponding string, as would be printed by the C function
-{\tt perror()}.
-\funcitem{getcwd}{}
-Returns a string representing the current working directory.
-\funcitem{link}{src, dst}
-Creates a hard link pointing to
-{\tt src}
-named
-{\tt dst}.
-\funcitem{listdir}{path}
-Returns a list containing the names of the entries in the
-directory.
-The list is in arbitrary order.
-It includes the special entries
-{\tt '.'}
-and
-{\tt '..'}
-if they are present in the directory.
-\funcitem{mkdir}{path, mode}
-Creates a directory named
-{\tt path}
-with numeric mode
-{\tt mode}.
-\funcitem{rename}{src, dst}
-Renames the file or directory
-{\tt src}
-to
-{\tt dst}.
-\funcitem{rmdir}{path}
-Removes the directory
-{\tt path}.
-\funcitem{stat}{path}
-Performs a
-{\em stat}
-system call on the given path.
-The return value is a tuple of at least 10 integers giving the most
-important (and portable) members of the
-{\em stat}
-structure, in the order
-{\tt st\_mode},
-{\tt st\_ino},
-{\tt st\_dev},
-{\tt st\_nlink},
-{\tt st\_uid},
-{\tt st\_gid},
-{\tt st\_size},
-{\tt st\_atime},
-{\tt st\_mtime},
-{\tt st\_ctime}.
-More items may be added at the end by some implementations.
-\funcitem{system}{command}
-Executes the command (a string) in a subshell.
-This is implemented by calling the Standard C function
-{\tt system()},
-and has the same limitations.
-Changes to
-{\tt posix.environ},
-{\tt sys.stdin}
-etc. are not reflected in the environment of the executed command.
-The return value is the exit status of the process as returned by
-Standard C
-{\tt system()}.
-\funcitem{umask}{mask}
-Sets the current numeric umask and returns the previous umask.
-\funcitem{unlink}{path}
-Unlinks the file
-{\tt path}.
-\funcitem{utimes(path, }{atime, mtime)}
-%.br
-Sets the access and modified time of the file to the given values.
-(The second argument is a tuple of two items.)
-\end{description}
-
-The following functions are only available on systems that support
-symbolic links:
-\begin{description}
-\funcitem{lstat}{path}
-Like
-{\tt stat()},
-but does not follow symbolic links.
-\funcitem{readlink}{path}
-Returns a string representing the path to which the symbolic link
-points.
-\funcitem{symlink}{src, dst}
-Creates a symbolic link pointing to
-{\tt src}
-named
-{\tt dst}.
-\end{description}
-
-\subsection{Built-in Module {\tt stdwin}}
-
-This module defines several new object types and functions that
-provide access to the functionality of the Standard Window System
-Interface, STDWIN [CWI report CR-R8817].
-It is available on systems to which STDWIN has been ported (which is
-most systems).
-It is only available if the {\tt DISPLAY} environment variable is set
-or an explicit `{\tt -display \it displayname}' argument is passed to
-the interpreter.
-
-Functions have names that usually resemble their C STDWIN counterparts
-with the initial `w' dropped.
-Points are represented by pairs of integers; rectangles
-by pairs of points.
-For a complete description of STDWIN please refer to the documentation
-of STDWIN for C programmers (aforementioned CWI report).
-\subsubsection{Functions Defined in Module {\tt stdwin}}
-
-The following functions are defined in the {\tt stdwin} module:
-\begin{description}
-\funcitem{open}{title}
-%.br
-Opens a new window whose initial title is given by the string argument.
-Returns a window object; window object methods are described below.%
-\footnote{
-The {\Python} version of STDWIN does not support draw procedures; all
-drawing requests are reported as draw events.
-}
-\funcitem{getevent}{}
-%.br
-Waits for and returns the next event.
-An event is returned as a triple: the first element is the event
-type, a small integer; the second element is the window object to which
-the event applies, or
-{\tt None}
-if it applies to no window in particular;
-the third element is type-dependent.
-Names for event types and command codes are defined in the standard
-module
-{\tt stdwinevent}.
-\funcitem{setdefwinpos}{h, v}
-%.br
-Sets the default window position.
-\funcitem{setdefwinsize}{width, height}
-%.br
-Sets the default window size.
-\funcitem{menucreate}{title}
-%.br
-Creates a menu object referring to a global menu (a menu that appears in
-all windows).
-Methods of menu objects are described below.
-\funcitem{fleep}{}
-%.br
-Causes a beep or bell (or perhaps a `visual bell' or flash, hence the
-name).
-\funcitem{message}{string}
-%.br
-Displays a dialog box containing the string.
-The user must click OK before the function returns.
-\funcitem{askync}{prompt, default}
-%.br
-Displays a dialog that prompts the user to answer a question with yes or
-no.
-The function returns 0 for no, 1 for yes.
-If the user hits the Return key, the default (which must be 0 or 1) is
-returned.
-If the user cancels the dialog, the
-{\tt KeyboardInterrupt}
-exception is raised.
-\funcitem{askstr}{prompt, default}
-%.br
-Displays a dialog that prompts the user for a string.
-If the user hits the Return key, the default string is returned.
-If the user cancels the dialog, the
-{\tt KeyboardInterrupt}
-exception is raised.
-\funcitem{askfile}{prompt, default, new}
-%.br
-Asks the user to specify a filename.
-If
-{\tt new}
-is zero it must be an existing file; otherwise, it must be a new file.
-If the user cancels the dialog, the
-{\tt KeyboardInterrupt}
-exception is raised.
-\funcitem{setcutbuffer}{i, string}
-%.br
-Stores the string in the system's cut buffer number
-{\tt i},
-where it can be found (for pasting) by other applications.
-On X11, there are 8 cut buffers (numbered 0..7).
-Cut buffer number 0 is the `clipboard' on the Macintosh.
-\funcitem{getcutbuffer}{i}
-%.br
-Returns the contents of the system's cut buffer number
-{\tt i}.
-\funcitem{rotatebutbuffers}{n}
-%.br
-On X11, this rotates the 8 cut buffers by
-{\tt n}.
-Ignored on the Macintosh.
-\funcitem{getselection}{i}
-%.br
-Returns X11 selection number
-{\tt i.}
-Selections are not cut buffers.
-Selection numbers are defined in module
-{\tt stdwinevents}.
-Selection {\tt WS\_PRIMARY} is the
-{\em primary}
-selection (used by
-xterm,
-for instance);
-selection {\tt WS\_SECONDARY} is the
-{\em secondary}
-selection; selection {\tt WS\_CLIPBOARD} is the
-{\em clipboard}
-selection (used by
-xclipboard).
-On the Macintosh, this always returns an empty string.
-\funcitem{resetselection}{i}
-%.br
-Resets selection number
-{\tt i},
-if this process owns it.
-(See window method
-{\tt setselection()}).
-\funcitem{baseline}{}
-%.br
-Return the baseline of the current font (defined by STDWIN as the
-vertical distance between the baseline and the top of the
-characters).%
-\footnote{
-There is no way yet to set the current font.
-This will change in a future version.
-}
-\funcitem{lineheight}{}
-%.br
-Return the total line height of the current font.
-\funcitem{textbreak}{str, width}
-%.br
-Return the number of characters of the string that fit into a space of
-{\tt width}
-bits wide when drawn in the curent font.
-\funcitem{textwidth}{str}
-%.br
-Return the width in bits of the string when drawn in the current font.
-\end{description}
-
-\subsubsection{Window Object Methods}
-
-Window objects are created by
-{\tt stdwin.open()}.
-There is no explicit function to close a window; windows are closed when
-they are garbage-collected.
-Window objects have the following methods:
-\begin{description}
-\funcitem{begindrawing}{}
-Returns a drawing object, whose methods (described below) allow drawing
-in the window.
-\funcitem{change}{rect}
-Invalidates the given rectangle; this may cause a draw event.
-\funcitem{gettitle}{}
-Returns the window's title string.
-\funcitem{getdocsize}{}
-\begin{sloppypar}
-Returns a pair of integers giving the size of the document as set by
-{\tt setdocsize()}.
-\end{sloppypar}
-\funcitem{getorigin}{}
-Returns a pair of integers giving the origin of the window with respect
-to the document.
-\funcitem{getwinsize}{}
-Returns a pair of integers giving the size of the window.
-\funcitem{menucreate}{title}
-Creates a menu object referring to a local menu (a menu that appears
-only in this window).
-Methods menu objects are described below.
-\funcitem{scroll}{rect,~point}
-Scrolls the given rectangle by the vector given by the point.
-\funcitem{setwincursor}{name}
-\begin{sloppypar}
-Sets the window cursor to a cursor of the given name.
-It raises the
-{\tt Runtime\-Error}
-exception if no cursor of the given name exists.
-Suitable names are
-{\tt 'ibeam'},
-{\tt 'arrow'},
-{\tt 'cross'},
-{\tt 'watch'}
-and
-{\tt 'plus'}.
-On X11, there are many more (see
-{\tt <X11/cursorfont.h>}).
-\end{sloppypar}
-\funcitem{setdocsize}{point}
-Sets the size of the drawing document.
-\funcitem{setorigin}{point}
-Moves the origin of the window to the given point in the document.
-\funcitem{setselection}{i, str}
-Attempts to set X11 selection number
-{\tt i}
-to the string
-{\tt str}.
-(See stdwin method
-{\tt getselection()}
-for the meaning of
-{\tt i}.)
-Returns true if it succeeds.
-If it succeeds, the window ``owns'' the selection until
-(a) another applications takes ownership of the selection; or
-(b) the window is deleted; or
-(c) the application clears ownership by calling
-{\tt stdwin.resetselection(i)}.
-When another application takes ownership of the selection, a
-{\tt WE\_LOST\_SEL}
-event is received for no particular window and with the selection number
-as detail.
-Ignored on the Macintosh.
-\funcitem{settitle}{title}
-Sets the window's title string.
-\funcitem{settimer}{dsecs}
-Schedules a timer event for the window in
-{\tt dsecs/10}
-seconds.
-\funcitem{show}{rect}
-Tries to ensure that the given rectangle of the document is visible in
-the window.
-\funcitem{textcreate}{rect}
-Creates a text-edit object in the document at the given rectangle.
-Methods of text-edit objects are described below.
-\end{description}
-
-\subsubsection{Drawing Object Methods}
-
-Drawing objects are created exclusively by the window method
-{\tt begindrawing()}.
-Only one drawing object can exist at any given time; the drawing object
-must be deleted to finish drawing.
-No drawing object may exist when
-{\tt stdwin.getevent()}
-is called.
-Drawing objects have the following methods:
-\begin{description}
-\funcitem{box}{rect}
-Draws a box around a rectangle.
-\funcitem{circle}{center, radius}
-%.br
-Draws a circle with given center point and radius.
-\funcitem{elarc(center, (rh, rv), }{a1, a2)}
-%.br
-Draws an elliptical arc with given center point.
-{\tt (rh, rv)}
-gives the half sizes of the horizontal and vertical radii.
-{\tt (a1, a2)}
-gives the angles (in degrees) of the begin and end points.
-0 degrees is at 3 o'clock, 90 degrees is at 12 o'clock.
-\funcitem{erase}{rect}
-Erases a rectangle.
-\funcitem{invert}{rect}
-Inverts a rectangle.
-\funcitem{line}{p1, p2}
-Draws a line from point
-{\tt p1}
-to
-{\tt p2}.
-\funcitem{paint}{rect}
-Fills a rectangle.
-\funcitem{text}{p, str}
-Draws a string starting at point p (the point specifies the
-top left coordinate of the string).
-\funcitem{shade}{rect, percent}
-%.br
-Fills a rectangle with a shading pattern that is about
-{\tt percent}
-percent filled.
-\funcitem{xorline}{p1, p2}
-Draws a line in XOR mode.
-\funcitem{baseline(), lineheight(), textbreak(), textwidth}{}
-%.br
-These functions are similar to the corresponding functions described
-above for the
-{\tt stdwin}
-module, but use the current font of the window instead of the (global)
-default font.
-\end{description}
-
-\subsubsection{Menu Object Methods}
-
-A menu object represents a menu.
-The menu is destroyed when the menu object is deleted.
-The following methods are defined:
-\begin{description}
-\funcitem{additem}{text, shortcut}
-%.br
-Adds a menu item with given text.
-The shortcut must be a string of length 1, or omitted (to specify no
-shortcut).
-\funcitem{setitem}{i, text}
-Sets the text of item number
-{\tt i}.
-\funcitem{enable}{i, flag}
-Enables or disables item
-{\tt i}.
-\funcitem{check}{i, flag}
-Sets or clears the
-{\em check mark}
-for item
-{\tt i}.
-\end{description}
-
-\subsubsection{Text-edit Object Methods}
-
-A text-edit object represents a text-edit block.
-For semantics, see the STDWIN documentation for C programmers.
-The following methods exist:
-\begin{description}
-\funcitem{arrow}{code}
-Passes an arrow event to the text-edit block.
-The
-{\tt code}
-must be one of
-{\tt WC\_LEFT},
-{\tt WC\_RIGHT},
-{\tt WC\_UP}
-or
-{\tt WC\_DOWN}
-(see module
-{\tt stdwinevents}).
-\funcitem{draw}{rect}
-Passes a draw event to the text-edit block.
-The rectangle specifies the redraw area.
-\funcitem{event}{type, window, detail}
-%.br
-Passes an event gotten from
-{\tt stdwin.getevent()}
-to the text-edit block.
-Returns true if the event was handled.
-\funcitem{getfocus}{}
-Returns 2 integers representing the start and end positions of the
-focus, usable as slice indices on the string returned by
-{\tt getfocustext()}.
-\funcitem{getfocustext}{}
-Returns the text in the focus.
-\funcitem{getrect}{}
-Returns a rectangle giving the actual position of the text-edit block.
-(The bottom coordinate may differ from the initial position because
-the block automatically shrinks or grows to fit.)
-\funcitem{gettext}{}
-Returns the entire text buffer.
-\funcitem{move}{rect}
-Specifies a new position for the text-edit block in the document.
-\funcitem{replace}{str}
-Replaces the focus by the given string.
-The new focus is an insert point at the end of the string.
-\funcitem{setfocus}{i,~j}
-Specifies the new focus.
-Out-of-bounds values are silently clipped.
-\end{description}
-
-\subsubsection{Example}
-
-Here is a simple example of using STDWIN in Python.
-It creates a window and draws the string ``Hello world'' in the top
-left corner of the window.
-The window will be correctly redrawn when covered and re-exposed.
-The program quits when the close icon or menu item is requested.
-\bcode\begin{verbatim}
-import stdwin
-from stdwinevents import *
-
-def main():
-    mywin = stdwin.open('Hello')
-    #
-    while 1:
-        (type, win, detail) = stdwin.getevent()
-        if type = WE_DRAW:
-            draw = win.begindrawing()
-            draw.text((0, 0), 'Hello, world')
-            del draw
-        elif type = WE_CLOSE:
-            break
-
-main()
-\end{verbatim}\ecode
-
-\subsection{Built-in Module {\tt amoeba}}
-
-This module provides some object types and operations useful for
-Amoeba applications.
-It is only available on systems that support Amoeba operations.
-RPC errors and other Amoeba errors are reported as the exception
-{\tt amoeba.error = 'amoeba.error'}.
-The module
-{\tt amoeba}
-defines the following items:
-\begin{description}
-\funcitem{name\_append}{path,~cap}
-%.br
-Stores a capability in the Amoeba directory tree.
-Arguments are the pathname (a string) and the capability (a capability
-object as returned by
-{\tt name\_lookup()}).
-\funcitem{name\_delete}{path}
-%.br
-Deletes a capability from the Amoeba directory tree.
-Argument is the pathname.
-\funcitem{name\_lookup}{path}
-%.br
-Looks up a capability.
-Argument is the pathname.
-Returns a
-{\em capability}
-object, to which various interesting operations apply, described below.
-\funcitem{name\_replace}{path,~cap}
-%.br
-Replaces a capability in the Amoeba directory tree.
-Arguments are the pathname and the new capability.
-(This differs from
-{\tt name\_append()}
-in the behavior when the pathname already exists:
-{\tt name\_append()}
-finds this an error while
-{\tt name\_replace()}
-allows it, as its name suggests.)
-\funcitem{capv}
-A table representing the capability environment at the time the
-interpreter was started.
-(Alas, modifying this table does not affect the capability environment
-of the interpreter.)
-For example,
-{\tt amoeba.capv['ROOT']}
-is the capability of your root directory, similar to
-{\tt getcap("ROOT")}
-in C.
-\excitem{error}{amoeba.error}
-%.br
-The exception raised when an Amoeba function returns an error.
-The value accompanying this exception is a pair containing the numeric
-error code and the corresponding string, as returned by the C function
-{\tt err\_why()}.
-\funcitem{timeout}{msecs}
-%.br
-Sets the transaction timeout, in milliseconds.
-Returns the previous timeout.
-Initially, the timeout is set to 2 seconds by the {\Python} interpreter.
-\end{description}
-
-\subsubsection{Capability Operations}
-
-Capabilities are written in a convenient ASCII format, also used by the
-Amoeba utilities
-{\em c2a}(U)
-and
-{\em a2c}(U).
-For example:
-\bcode\begin{verbatim}
->>> amoeba.name_lookup('/profile/cap')
-aa:1c:95:52:6a:fa/14(ff)/8e:ba:5b:8:11:1a
->>> 
-\end{verbatim}\ecode
-The following methods are defined for capability objects.
-\begin{description}
-\funcitem{dir\_list}{}
-Returns a list of the names of the entries in an Amoeba directory.
-\funcitem{b\_read}{offset, maxsize}
-%.br
-Reads (at most)
-{\tt maxsize}
-bytes from a bullet file at offset
-{\tt offset.}
-The data is returned as a string.
-EOF is reported as an empty string.
-\funcitem{b\_size}{}
-Returns the size of a bullet file.
-\funcitem{dir\_append(), dir\_delete(), dir\_lookup(), dir\_replace}{}
-%.br
-\itembreak
-Like the corresponding
-{\tt name\_*}
-functions, but with a path relative to the capability.
-(For paths beginning with a slash the capability is ignored, since this
-is the defined semantics for Amoeba.)
-\funcitem{std\_info}{}
-Returns the standard info string of the object.
-\funcitem{tod\_gettime}{}
-Returns the time (in seconds since the Epoch, in UCT, as for POSIX) from
-a time server.
-\funcitem{tod\_settime}{t}
-Sets the time kept by a time server.
-\end{description}
-
-\subsection{Built-in Module {\tt audio}}
-
-This module provides rudimentary access to the audio I/O device
-{\tt /dev/audio}
-on the Silicon Graphics Personal IRIS; see audio(7).
-It supports the following operations:
-\begin{description}
-\funcitem{setoutgain}{n}
-Sets the output gain (0-255).
-\funcitem{getoutgain}{}
-Returns the output gain.
-\funcitem{setrate}{n}
-Sets the sampling rate: 1=32K/sec, 2=16K/sec, 3=8K/sec.
-\funcitem{setduration}{n}
-Sets the `sound duration' in units of 1/100 seconds.
-\funcitem{read}{n}
-Reads a chunk of
-{\tt n}
-sampled bytes from the audio input (line in or microphone).
-The chunk is returned as a string of length n.
-Each byte encodes one sample as a signed 8-bit quantity using linear
-encoding.
-This string can be converted to numbers using {\tt chr2num()} described
-below.
-\funcitem{write}{buf}
-Writes a chunk of samples to the audio output (speaker).
-\end{description}
-
-These operations support asynchronous audio I/O:
-\begin{description}
-\funcitem{start\_recording}{n}
-%.br
-Starts a second thread (a process with shared memory) that begins reading
-{\tt n}
-bytes from the audio device.
-The main thread immediately continues.
-\funcitem{wait\_recording}{}
-%.br
-Waits for the second thread to finish and returns the data read.
-\funcitem{stop\_recording}{}
-%.br
-Makes the second thread stop reading as soon as possible.
-Returns the data read so far.
-\funcitem{poll\_recording}{}
-%.br
-Returns true if the second thread has finished reading (so
-{\tt wait\_recording()} would return the data without delay).
-\item[{\tt start\_playing(chunk)}, {\tt wait\_playing()},
-{\tt stop\_playing()}, {\tt poll\_playing()}]
-%.br
-\begin{sloppypar}
-Similar but for output.
-{\tt stop\_playing()}
-returns a lower bound for the number of bytes actually played (not very
-accurate).
-\end{sloppypar}
-\end{description}
-
-The following operations do not affect the audio device but are
-implemented in C for efficiency:
-\begin{description}
-\funcitem{amplify}{buf, f1, f2}
-%.br
-Amplifies a chunk of samples by a variable factor changing from
-{\tt f1}/256 to {\tt f2}/256.
-Negative factors are allowed.
-Resulting values that are to large to fit in a byte are clipped.         
-\funcitem{reverse}{buf}
-%.br
-Returns a chunk of samples backwards.
-\funcitem{add}{buf1, buf2}
-%.br
-Bytewise adds two chunks of samples.
-Bytes that exceed the range are clipped.
-If one buffer shorter, it is assumed to be padded with zeros.
-\funcitem{chr2num}{buf}
-%.br
-Converts a string of sampled bytes as returned by {\tt read()} into
-a list containing the numeric values of the samples.
-\funcitem{num2chr}{list}
-%.br
-\begin{sloppypar}
-Converts a list as returned by
-{\tt chr2num()}
-back to a buffer acceptable by
-{\tt write()}.
-\end{sloppypar}
-\end{description}
-
-\subsection{Built-in Module {\tt gl}}
-
-This module provides access to the Silicon Graphics
-{\em Graphics Library}.
-It is available only on Silicon Graphics machines.
-
-{\bf Warning:}
-Some illegal calls to the GL library cause the {\Python} interpreter to dump
-core.
-In particular, the use of most GL calls is unsafe before the first
-window is opened.
-
-The module is too large to document here in its entirety, but the
-following should help you to get started.
-The parameter conventions for the C functions are translated to {\Python} as
-follows:
-
-\begin{itemize}
-\item
-All (short, long, unsigned) int values are represented by {\Python}
-integers.
-\item
-All float and double values are represented by {\Python} floating point
-numbers.
-In most cases, {\Python} integers are also allowed.
-\item
-All arrays are represented by one-dimensional {\Python} lists.
-In most cases, tuples are also allowed.
-\item
-\begin{sloppypar}
-All string and character arguments are represented by {\Python} strings,
-for instance,
-{\tt winopen('Hi~There!')}
-and
-{\tt rotate(900,~'z')}.
-\end{sloppypar}
-\item
-All (short, long, unsigned) integer arguments or return values that are
-only used to specify the length of an array argument are omitted.
-For example, the C call
-\bcode\begin{verbatim}
-lmdef(deftype, index, np, props)
-\end{verbatim}\ecode
-is translated to {\Python} as
-\bcode\begin{verbatim}
-lmdef(deftype, index, props)
-\end{verbatim}\ecode
-\item
-Output arguments are omitted from the argument list; they are
-transmitted as function return values instead.
-If more than one value must be returned, the return value is a tuple.
-If the C function has both a regular return value (that is not omitted
-because of the previous rule) and an output argument, the return value
-comes first in the tuple.
-Examples: the C call
-\bcode\begin{verbatim}
-getmcolor(i, &red, &green, &blue)
-\end{verbatim}\ecode
-is translated to {\Python} as
-\bcode\begin{verbatim}
-red, green, blue = getmcolor(i)
-\end{verbatim}\ecode
-\end{itemize}
-
-The following functions are non-standard or have special argument
-conventions:
-\begin{description}
-\funcitem{varray}{}
-Equivalent to but faster than a number of
-{\tt v3d()}
-calls.
-The argument is a list (or tuple) of points.
-Each point must be a tuple of coordinates (x, y, z) or (x, y).
-The points may be 2- or 3-dimensional but must all have the
-same dimension.
-Float and int values may be mixed however.
-The points are always converted to 3D double precision points
-by assuming z=0.0 if necessary (as indicated in the man page),
-and for each point
-{\tt v3d()}
-is called.
-\funcitem{nvarray}{}
-Equivalent to but faster than a number of
-{\tt n3f}
-and
-{\tt v3f}
-calls.
-The argument is an array (list or tuple) of pairs of normals and points.
-Each pair is a tuple of a point and a normal for that point.
-Each point or normal must be a tuple of coordinates (x, y, z).
-Three coordinates must be given.
-Float and int values may be mixed.
-For each pair,
-{\tt n3f()}
-is called for the normal, and then
-{\tt v3f()}
-is called for the point.
-\funcitem{vnarray}{}
-Similar to 
-{\tt nvarray()}
-but the pairs have the point first and the normal second.
-\funcitem{nurbssurface}{s\_k[], t\_k[], ctl[][], s\_ord, t\_ord, type}
-%.br
-\itembreak
-Defines a nurbs surface.
-The dimensions of
-{\tt ctl[][]}
-are computed as follows:
-{\tt [len(s\_k)~-~s\_ord]},
-{\tt [len(t\_k)~-~t\_ord]}.
-\funcitem{nurbscurve}{knots, ctlpoints, order, type}
-%.br
-Defines a nurbs curve.
-The length of ctlpoints is
-{\tt len(knots)~-~order}.
-\funcitem{pwlcurve}{points, type}
-%.br
-Defines a piecewise-linear curve.
-{\tt points}
-is a list of points.
-{\tt type}
-must be
-{\tt N\_ST}.
-\funcitem{pick(n), select}{n}
-%.br
-The only argument to these functions specifies the desired size of the
-pick or select buffer.
-\funcitem{endpick(), endselect}{}
-%.br
-These functions have no arguments.
-They return a list of integers representing the used part of the
-pick/select buffer.
-No method is provided to detect buffer overrun.
-\end{description}
-
-Here is a tiny but complete example GL program in {\Python}:
-\bcode\begin{verbatim}
-import gl, GL, time
-
-def main():
-    gl.foreground()
-    gl.prefposition(500, 900, 500, 900)
-    w = gl.winopen('CrissCross')
-    gl.ortho2(0.0, 400.0, 0.0, 400.0)
-    gl.color(GL.WHITE)
-    gl.clear()
-    gl.color(GL.RED)
-    gl.bgnline()
-    gl.v2f(0.0, 0.0)
-    gl.v2f(400.0, 400.0)
-    gl.endline()
-    gl.bgnline()
-    gl.v2f(400.0, 0.0)
-    gl.v2f(0.0, 400.0)
-    gl.endline()
-    time.sleep(5)
-
-main()
-\end{verbatim}\ecode
-
-\subsection{Built-in Module {\tt pnl}}
-
-This module provides access to the
-{\em Panel Library}
-built by NASA Ames (to get it, send e-mail to
-{\tt panel-request@nas.nasa.gov}).
-All access to it should be done through the standard module
-{\tt panel},
-which transparantly exports most functions from
-{\tt pnl}
-but redefines
-{\tt pnl.dopanel()}.
-
-{\bf Warning:}
-the {\Python} interpreter will dump core if you don't create a GL window
-before calling
-{\tt pnl.mkpanel()}.
-
-The module is too large to document here in its entirety.
-
-\section{Standard Modules}
-
-The following standard modules are defined.
-They are available in one of the directories in the default module
-search path (try printing
-{\tt sys.path}
-to find out the default search path.)
-
-\subsection{Standard Module {\tt string}}
-
-This module defines some constants useful for checking character
-classes, some exceptions, and some useful string functions.
-The constants are:
-\begin{description}
-\funcitem{digits}
-The string
-{\tt '0123456789'}.
-\funcitem{hexdigits}
-The string
-{\tt '0123456789abcdefABCDEF'}.
-\funcitem{letters}
-The concatenation of the strings
-{\tt lowercase}
-and
-{\tt uppercase}
-described below.
-\funcitem{lowercase}
-The string
-{\tt 'abcdefghijklmnopqrstuvwxyz'}.
-\funcitem{octdigits}
-The string
-{\tt '01234567'}.
-\funcitem{uppercase}
-The string
-{\tt 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.
-\funcitem{whitespace}
-A string containing all characters that are considered whitespace,
-i.e.,
-space, tab and newline.
-This definition is used by
-{\tt split()}
-and
-{\tt strip()}.
-\end{description}
-
-The exceptions are:
-\begin{description}
-\excitem{atoi\_error}{non-numeric argument to string.atoi}
-%.br
-Exception raised by
-{\tt atoi}
-when a non-numeric string argument is detected.
-The exception argument is the offending string.
-\excitem{index\_error}{substring not found in string.index}
-%.br
-Exception raised by
-{\tt index}
-when
-{\tt sub}
-is not found.
-The argument are the offending arguments to index: {\tt (s, sub)}.
-\end{description}
-
-The functions are:
-\begin{description}
-\funcitem{atoi}{s}
-Converts a string to a number.
-The string must consist of one or more digits, optionally preceded by a
-sign ({\tt '+'} or {\tt '-'}).
-\funcitem{index}{s, sub}
-Returns the lowest index in
-{\tt s}
-where the substring
-{\tt sub}
-is found.
-\funcitem{lower}{s}
-Convert letters to lower case.
-\funcitem{split}{s}
-Returns a list of the whitespace-delimited words of the string
-{\tt s}.
-\funcitem{splitfields}{s, sep}
-%.br
-Returns a list containing the fields of the string
-{\tt s},
-using the string
-{\tt sep}
-as a separator.
-The list will have one more items than the number of non-overlapping
-occurrences of the separator in the string.
-Thus,
-{\tt string.splitfields(s, ' ')}
-is not the same as
-{\tt string.split(s)},
-as the latter only returns non-empty words.
-\funcitem{strip}{s}
-Removes leading and trailing whitespace from the string
-{\tt s}.
-\funcitem{swapcase}{s}
-Converts lower case letters to upper case and vice versa.
-\funcitem{upper}{s}
-Convert letters to upper case.
-\funcitem{ljust(s, width), rjust(s, width),  center}{s, width}
-%.br
-These functions respectively left-justify, right-justify and center a
-string in a field of given width.
-They return a string that is at least
-{\tt width}
-characters wide, created by padding the string
-{\tt s}
-with spaces until the given width on the right, left or both sides.
-The string is never truncated.
-\end{description}
-
-\subsection{Standard Module {\tt path}}
-
-This module implements some useful functions on POSIX pathnames.
-\begin{description}
-\funcitem{basename}{p}
-Returns the base name of pathname
-{\tt p}.
-This is the second half of the pair returned by
-{\tt path.split(p)}.
-\funcitem{cat}{p, q}
-Performs intelligent pathname concatenation on paths
-{\tt p}
-and
-{\tt q}:
-If
-{\tt q}
-is an absolute path, the return value is
-{\tt q}.
-Otherwise, the concatenation of
-{\tt p}
-and
-{\tt q}
-is returned, with a slash ({\tt '/'}) inserted unless
-{\tt p}
-is empty or ends in a slash.
-\funcitem{commonprefix}{list}
-%.br
-Returns the longest string that is a prefix of all strings in
-{\tt list}.
-If
-{\tt list}
-is empty, the empty string ({\tt ''}) is returned.
-\funcitem{exists}{p}
-Returns true if
-{\tt p}
-refers to an existing path.
-\funcitem{isdir}{p}
-Returns true if
-{\tt p}
-refers to an existing directory.
-\funcitem{islink}{p}
-Returns true if
-{\tt p}
-refers to a directory entry that is a symbolic link.
-Always false if symbolic links are not supported.
-\funcitem{ismount}{p}
-Returns true if
-{\tt p}
-is an absolute path that occurs in the mount table as output by the
-{\tt /etc/mount}
-utility.
-This output is read once when the function is used for the first
-time.%
-\footnote{
-Is there a better way to check for mount points?
-}
-\funcitem{split}{p}
-Returns a pair
-{\tt (head,~tail)}
-such that
-{\tt tail}
-contains no slashes and
-{\tt path.cat(head, tail)}
-is equal to
-{\tt p}.
-\funcitem{walk}{p, visit, arg}
-%.br
-Calls the function
-{\tt visit}
-with arguments
-{\tt (arg, dirname, names)}
-for each directory in the directory tree rooted at
-{\tt p}
-(including
-{\tt p}
-itself, if it is a directory).
-The argument
-{\tt dirname}
-specifies the visited directory, the argument
-{\tt names}
-lists the files in the directory (gotten from
-{\tt posix.listdir(dirname)}).
-The
-{\tt visit}
-function may modify
-{\tt names}
-to influence the set of directories visited below
-{\tt dirname},
-e.g.,
-to avoid visiting certain parts of the tree.
-(The object referred to by
-{\tt names}
-must be modified in place, using
-{\tt del}
-or slice assignment.)
-\end{description}
-
-\subsection{Standard Module {\tt getopt}}
-
-This module helps scripts to parse the command line arguments in
-{\tt sys.argv}.
-It uses the same conventions as the {\UNIX}
-{\tt getopt()}
-function.
-It defines the function
-{\tt getopt.getopt(args, options)}
-and the exception
-{\tt getopt.error}.
-
-The first argument to
-{\tt getopt()}
-is the argument list passed to the script with its first element
-chopped off (i.e.,
-{\tt sys.argv[1:]}).
-The second argument is the string of option letters that the
-script wants to recognize, with options that require an argument
-followed by a colon (i.e., the same format that {\UNIX}
-{\tt getopt()}
-uses).
-The return value consists of two elements: the first is a list of
-option-and-value pairs; the second is the list of program arguments
-left after the option list was stripped (this is a trailing slice of the
-first argument).
-Each option-and-value pair returned has the option as its first element,
-prefixed with a hyphen (e.g.,
-{\tt '-x'}),
-and the option argument as its second element, or an empty string if the
-option has no argument.
-The options occur in the list in the same order in which they were
-found, thus allowing multiple occurrences.
-Example:
-\bcode\begin{verbatim}
->>> import getopt, string
->>> args = string.split('-a -b -cfoo -d bar a1 a2')
->>> args
-['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
->>> optlist, args = getopt.getopt(args, 'abc:d:')
->>> optlist
-[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
->>> args
-['a1', 'a2']
->>> 
-\end{verbatim}\ecode
-The exception
-{\tt getopt.error = 'getopt error'}
-is raised when an unrecognized option is found in the argument list or
-when an option requiring an argument is given none.
-The argument to the exception is a string indicating the cause of the
-error.
-
-\subsection{Standard Module {\tt rand}}
-
-This module implements a pseudo-random number generator similar to
-{\tt rand()}
-in C.
-It defines the following functions:
-\begin{description}
-\funcitem{rand}{}
-Returns an integer random number in the range [0 ... 32768).
-\funcitem{choice}{s}
-Returns a random element from the sequence (string, tuple or list)
-{\tt s.}
-\funcitem{srand}{seed}
-Initializes the random number generator with the given integral seed.
-When the module is first imported, the random number is initialized with
-the current time.
-\end{description}
-
-\subsection{Standard Module {\tt whrandom}}
-
-This module implements a Wichmann-Hill pseudo-random number generator.
-It defines the following functions:
-\begin{description}
-\funcitem{random}{}
-Returns the next random floating point number in the range [0.0 ... 1.0).
-\funcitem{seed}{x, y, z}
-Initializes the random number generator from the integers
-{\tt x},
-{\tt y}
-and
-{\tt z}.
-When the module is first imported, the random number is initialized
-using values derived from the current time.
-\end{description}
-
-\subsection{Standard Module {\tt stdwinevents}}
-
-This module defines constants used by STDWIN for event types
-({\tt WE\_ACTIVATE} etc.), command codes ({\tt WC\_LEFT} etc.)
-and selection types ({\tt WS\_PRIMARY} etc.).
-Read the file for details.
-Suggested usage is
-\bcode\begin{verbatim}
->>> from stdwinevents import *
->>> 
-\end{verbatim}\ecode
-
-\subsection{Standard Module {\tt rect}}
-
-This module contains useful operations on rectangles.
-A rectangle is defined as in module
-{\tt stdwin}:
-a pair of points, where a point is a pair of integers.
-For example, the rectangle
-\bcode\begin{verbatim}
-(10, 20), (90, 80)
-\end{verbatim}\ecode
-is a rectangle whose left, top, right and bottom edges are 10, 20, 90
-and 80, respectively.
-Note that the positive vertical axis points down (as in
-{\tt stdwin}).
-
-The module defines the following objects:
-\begin{description}
-\excitem{error}{rect.error}
-%.br
-The exception raised by functions in this module when they detect an
-error.
-The exception argument is a string describing the problem in more
-detail.
-\funcitem{empty}
-%.br
-The rectangle returned when some operations return an empty result.
-This makes it possible to quickly check whether a result is empty:
-\bcode\begin{verbatim}
->>> import rect
->>> r1 = (10, 20), (90, 80)
->>> r2 = (0, 0), (10, 20)
->>> r3 = rect.intersect(r1, r2)
->>> if r3 is rect.empty: print 'Empty intersection'
-Empty intersection
->>> 
-\end{verbatim}\ecode
-\funcitem{is\_empty}{r}
-%.br
-Returns true if the given rectangle is empty.
-A rectangle
-{\em (left,~top), (right,~bottom)}
-is empty if
-{\em left~$\geq$~right}
-or
-{\em top~$\leq$~bottom}.
-\funcitem{intersect}{list}
-%.br
-Returns the intersection of all rectangles in the list argument.
-It may also be called with a tuple argument or with two or more
-rectangles as arguments.
-Raises
-{\tt rect.error}
-if the list is empty.
-Returns
-{\tt rect.empty}
-if the intersection of the rectangles is empty.
-\funcitem{union}{list}
-%.br
-Returns the smallest rectangle that contains all non-empty rectangles in
-the list argument.
-It may also be called with a tuple argument or with two or more
-rectangles as arguments.
-Returns
-{\tt rect.empty}
-if the list is empty or all its rectangles are empty.
-\funcitem{pointinrect}{point, rect}
-%.br
-Returns true if the point is inside the rectangle.
-By definition, a point
-{\em (h,~v)}
-is inside a rectangle
-{\em (left,~top),}
-{\em (right,~bottom)}
-if
-{\em left~$\leq$~h~$<$~right}
-and
-{\em top~$\leq$~v~$<$~bottom}.
-\funcitem{inset(rect, }{dh, dv)}
-%.br
-Returns a rectangle that lies inside the
-{\tt rect}
-argument by
-{\tt dh}
-pixels horizontally
-and
-{\tt dv}
-pixels
-vertically.
-If
-{\tt dh}
-or
-{\tt dv}
-is negative, the result lies outside
-{\tt rect}.
-\funcitem{rect2geom}{rect}
-%.br
-Converts a rectangle to geometry representation:
-{\em (left,~top),}
-{\em (width,~height)}.
-\funcitem{geom2rect}{geom}
-%.br
-Converts a rectangle given in geometry representation back to the
-standard rectangle representation
-{\em (left,~top),}
-{\em (right,~bottom)}.
-\end{description}
-
-\subsection{Standard Modules {\tt GL} and {\tt DEVICE}}
-
-These modules define the constants used by the Silicon Graphics
-{\em Graphics Library}
-that C programmers find in the header files
-{\tt <gl/gl.h>}
-and
-{\tt <gl/device.h>}.
-Read the module files for details.
-
-\subsection{Standard Module {\tt panel}}
-
-This module should be used instead of the built-in module
-{\tt pnl}
-to interface with the
-{\em Panel Library}.
-
-The module is too large to document here in its entirety.
-One interesting function:
-\begin{description}
-\funcitem{defpanellist}{filename}
-%.br
-Parses a panel description file containing S-expressions written by the
-{\em Panel Editor}
-that accompanies the Panel Library and creates the described panels.
-It returns a list of panel objects.
-\end{description}
-
-{\bf Warning:}
-the {\Python} interpreter will dump core if you don't create a GL window
-before calling
-{\tt panel.mkpanel()}
-or
-{\tt panel.defpanellist()}.
-
-\subsection{Standard Module {\tt panelparser}}
-
-This module defines a self-contained parser for S-expressions as output
-by the Panel Editor (which is written in Scheme so it can't help writing
-S-expressions).
-The relevant function is
-{\tt panelparser.parse\_file(file)}
-which has a file object (not a filename!) as argument and returns a list
-of parsed S-expressions.
-Each S-expression is converted into a {\Python} list, with atoms converted
-to {\Python} strings and sub-expressions (recursively) to {\Python} lists.
-For more details, read the module file.
-
-\section{P.M.}
-
-\begin{verse}
-
-commands
-
-cmp?
-
-*cache?
-
-localtime?
-
-calendar?
-
-\_\_dict?
-
-mac?
-
-\end{verse}
+\input{mod1.tex}
+\input{mod2.tex}
+\input{mod3.tex}
 
 \end{document}
diff --git a/Doc/lib/lib.tex b/Doc/lib/lib.tex
index 8e36427..f0b649a 100644
--- a/Doc/lib/lib.tex
+++ b/Doc/lib/lib.tex
@@ -55,2094 +55,8 @@
 
 \pagenumbering{arabic}
 
-\section{Introduction}
-
-The {\Python} library consists of three parts, with different levels of
-integration with the interpreter.
-Closest to the interpreter are built-in types, exceptions and functions.
-Next are built-in modules, which are written in C and linked statically
-with the interpreter.
-Finally there are standard modules that are implemented entirely in
-{\Python}, but are always available.
-For efficiency, some standard modules may become built-in modules in
-future versions of the interpreter.
-
-\section{Built-in Types, Exceptions and Functions}
-
-Names for built-in exceptions and functions are found in a separate
-read-only symbol table which cannot be modified.
-This table is searched last, so local and global user-defined names can
-override built-in names.
-Built-in types have no names but are created by syntactic constructs
-(such as constants) or built-in functions.
-They are described together here for easy reference.%
-\footnote{
-The descriptions sorely lack explanations of the exceptions that
-may be raised---this will be fixed in a future version of this
-document.
-}
-
-\subsection{Built-in Types}
-
-The following sections describe the standard types that are built into the
-interpreter.
-\subsubsection{Numeric Types}
-
-There are two numeric types: integers and floating point numbers.
-Integers are implemented using {\tt long} in C, so they have at least 32
-bits of precision.
-Floating point numbers are implemented using {\tt double} in C.
-All bets on precision are off.
-Numbers are created by numeric constants or as the result of built-in
-functions and operators.
-
-Numeric types support the following operations:
-
-\begin{center}
-\begin{tabular}{|c|l|c|}
-\hline
-Operation & Result & Notes \\
-\hline
-{\tt abs}({\em x}) & absolute value of {\em x} & \\
-{\tt int}({\em x}) & {\em x} converted to integer & (1) \\
-{\tt float}({\em x}) & {\em x} converted to floating point & \\
-{\tt -}{\em x} & {\em x} negated & \\
-{\tt +}{\em x} & {\em x} unchanged & \\
-{\em x}{\tt +}{\em y} & sum of {\em x} and {\em y} & \\
-{\em x}{\tt -}{\em y} & difference of {\em x} and {\em y} & \\
-{\em x}{\tt *}{\em y} & product of {\em x} and {\em y} & \\
-{\em x}{\tt /}{\em y} & quotient of {\em x} and {\em y} & (2) \\
-{\em x}{\tt \%}{\em y} & remainder of {\em x}{\tt /}{\em y} & (3) \\
-\hline
-\end{tabular}
-\end{center}
-
-\noindent
-Notes:
-\begin{description}
-\item[(1)]
-This may round or truncate as in C; see functions {\tt floor} and
-{\tt ceil} in module {\tt math}.
-\item[(2)]
-Integer division is defined as in C: the result is an integer; with
-positive operands, it truncates towards zero; with a negative operand,
-the result is unspecified.
-\item[(3)]
-Only defined for integers.
-\end{description}
-
-Mixed arithmetic is not supported; both operands must have the same type.
-Mixed comparisons return the wrong result (floats always compare smaller
-than integers).%
-\footnote{
-These restrictions are bugs in the language definitions and will be
-fixed in the future.
-}
-\subsubsection{Sequence Types}
-
-There are three sequence types: strings, lists and tuples.
-Strings constants are written in single quotes: {\tt 'xyzzy'}.
-Lists are constructed with square brackets: {\tt [a,~b,~c]}.
-Tuples are constructed by the comma operator or with an empty set of
-parentheses: {\tt a,~b,~c} or {\tt ()}.
-
-Sequence types support the following operations ({\em s} and {\em t} are
-sequences of the same type; {\em n}, {\em i} and {\em j} are integers):
-
-\begin{center}
-\begin{tabular}{|c|l|c|}
-\hline
-Operation & Result & Notes \\
-\hline
-{\tt len}({\em s}) & length of {\em s} & \\
-{\tt min}({\em s}) & smallest item of {\em s} & \\
-{\tt max}({\em s}) & largest item of {\em s} & \\
-{\em x} {\tt in} {\em s} &
-	true if an item of {\em s} is equal to {\em x} & \\
-{\em x} {\tt not} {\tt in} {\em s} &
-	false if an item of {\em s} is equal to {\em x} & \\
-{\em s}{\tt +}{\em t} & the concatenation of {\em s} and {\em t} & \\
-{\em s}{\tt *}{\em n}, {\em n}*{\em s} &
-	{\em n} copies of {\em s} concatenated & (1) \\
-{\em s}[{\em i}] & {\em i}'th item of {\em s} & \\
-{\em s}[{\em i}:{\em j}] &
-	slice of {\em s} from {\em i} to {\em j} & (2) \\
-\hline
-\end{tabular}
-\end{center}
-
-\noindent
-Notes:
-\begin{description}
-\item[(1)]
-Sequence repetition is only supported for strings.
-\item[(2)]
-The slice of $s$ from $i$ to $j$ is defined as the sequence
-of items with index $k$ such that $i \leq k < j$.
-Special rules apply for negative and omitted indices; see the Tutorial
-or the Reference Manual.
-\end{description}
-
-\paragraph{Mutable Sequence Types.}
-
-List objects support additional operations that allow in-place
-modification of the object.
-These operations would be supported by other mutable sequence types
-(when added to the language) as well.
-Strings and tuples are immutable sequence types and such objects cannot
-be modified once created.
-The following operations are defined on mutable sequence types (where
-{\em x} is an arbitrary object):
-
-\begin{center}
-\begin{tabular}{|c|l|}
-\hline
-Operation & Result \\
-\hline
-{\em s}[{\em i}] = {\em x} &
-	item {\em i} of {\em s} is replaced by {\em x} \\
-{\em s}[{\em i}:{\em j}] = {\em t} &
-	slice of {\em s} from {\em i} to {\em j} is replaced by {\em t} \\
-{\tt del} {\em s}[{\em i}:{\em j}] &
-	same as {\em s}[{\em i}:{\em j}] = [] \\
-{\em s}.{\tt append}({\em x}) &
-	same as {\em s}[{\tt len}({\em x}):{\tt len}({\em x})] = [{\em x}] \\
-{\em s}.{\tt insert}({\em i}, {\em x}) &
-	same as {\em s}[{\em i}:{\em i}] = [{\em x}] \\
-{\em s}.{\tt sort}() &
-	the items of {\em s} are permuted to satisfy \\
-	&
-	$s[i] \leq s[j]$ for $i < j$\\
-\hline
-\end{tabular}
-\end{center}
-
-\subsubsection{Mapping Types}
-
-A
-{\em mapping}
-object maps values of one type (the key type) to arbitrary objects.
-Mappings are mutable objects.
-There is currently only one mapping type, the
-{\em dictionary}.
-A dictionary's keys are strings.
-An empty dictionary is created by the expression \verb"{}".
-An extension of this notation is used to display dictionaries when
-written (see the example below).
-
-The following operations are defined on mappings (where {\em a} is a
-mapping, {\em k} is a key and {\em x} is an arbitrary object):
-
-\begin{center}
-\begin{tabular}{|c|l|c|}
-\hline
-Operation & Result & Notes\\
-\hline
-{\tt len}({\em a}) & the number of elements in {\em a} & \\
-{\em a}[{\em k}] & the item of {\em a} with key {\em k} & \\
-{\em a}[{\em k}] = {\em x} & set {\em a}[{\em k}] to {\em x} & \\
-{\tt del} {\em a}[{\em k}] & remove {\em a}[{\em k}] from {\em a} & \\
-{\em a}.{\tt keys}() & a copy of {\em a}'s list of keys & (1) \\
-{\em a}.{\tt has\_key}({\em k}) & true if {\em a} has a key {\em k} & \\
-\hline
-\end{tabular}
-\end{center}
-
-\noindent
-Notes:
-\begin{description}
-\item[(1)]
-Keys are listed in random order.
-\end{description}
-
-A small example using a dictionary:
-\bcode\begin{verbatim}
->>> tel = {}
->>> tel['jack'] = 4098
->>> tel['sape'] = 4139
->>> tel['guido'] = 4127
->>> tel['jack']
-4098
->>> tel
-{'sape': 4139; 'guido': 4127; 'jack': 4098}
->>> del tel['sape']
->>> tel['irv'] = 4127
->>> tel
-{'guido': 4127; 'irv': 4127; 'jack': 4098}
->>> tel.keys()
-['guido', 'irv', 'jack']
->>> tel.has_key('guido')
-1
->>> 
-\end{verbatim}\ecode
-\subsubsection{Other Built-in Types}
-
-The interpreter supports several other kinds of objects.
-Most of these support only one or two operations.
-
-\paragraph{Modules.}
-
-The only operation on a module is member acces: {\em m}{\tt .}{\em name},
-where {\em m} is a module and {\em name} accesses a name defined in
-{\em m}'s symbol table.
-Module members can be assigned to.
-
-\paragraph{Classes and Class Objects.}
-
-XXX Classes will be explained at length in a later version of this
-document.
-
-\paragraph{Functions.}
-
-Function objects are created by function definitions.
-The only operation on a function object is to call it:
-{\em func}({\em optional-arguments}).
-
-Built-in functions have a different type than user-defined functions,
-but they support the same operation.
-
-\paragraph{Methods.}
-
-Methods are functions that are called using the member acces notation.
-There are two flavors: built-in methods (such as {\tt append()} on
-lists) and class member methods.
-Built-in methods are described with the types that support them.
-XXX Class member methods will be described in a later version of this
-document.
-
-\paragraph{Type Objects.}
-
-Type objects represent the various object types.
-An object's type is accessed by the built-in function
-{\tt type()}.
-There are no operations on type objects.
-
-\paragraph{The Null Object.}
-
-This object is returned by functions that don't explicitly return a
-value.
-It supports no operations.
-There is exactly one null object, named {\tt None}
-(a built-in name).
-
-\paragraph{File Objects.}
-
-File objects are implemented using C's
-{\em stdio}
-package and can be created with the built-in function
-{\tt open()}.
-They have the following methods:
-\begin{description}
-\funcitem{close}{}
-Closes the file.
-A closed file cannot be read or written anymore.
-\funcitem{read}{size}
-Reads at most
-{\tt size}
-bytes from the file (less if the read hits EOF).
-The bytes are returned as a string object.
-An empty string is returned when EOF is hit immediately.
-(For certain files, like ttys, it makes sense to continue reading after
-an EOF is hit.)
-\funcitem{readline}{size}
-Reads a line of at most
-{\tt size}
-bytes from the file.
-A trailing newline character, if present, is kept in the string.
-The size is optional and defaults to a large number (but not infinity).
-EOF is reported as by
-{\tt read().}
-\funcitem{write}{str}
-Writes a string to the file.
-Returns no value.
-\end{description}
-
-\subsection{Built-in Exceptions}
-
-The following exceptions can be generated by the interpreter or
-built-in functions.
-Except where mentioned, they have a string argument (also known as the
-`associated value' of an exception) indicating the detailed cause of the
-error.
-The strings listed with the exception names are their values when used
-in an expression or printed.
-\begin{description}
-\excitem{EOFError}{end-of-file read}
-(No argument.)
-Raised when a built-in function ({\tt input()} or {\tt raw\_input()})
-hits an end-of-file condition (EOF) without reading any data.
-(N.B.: the {\tt read()} and {\tt readline()} methods of file objects
-return an empty string when they hit EOF.)
-\excitem{KeyboardInterrupt}{end-of-file read}
-(No argument.)
-Raised when the user hits the interrupt key (normally Control-C or DEL).
-During execution, a check for interrupts is made regularly.
-Interrupts typed when a built-in function ({\tt input()} or
-{\tt raw\_input()}) is waiting for input also raise this exception.
-\excitem{MemoryError}{out of memory}
-%.br
-Raised when an operation runs out of memory but the situation
-may still be rescued (by deleting some objects).
-\excitem{NameError}{undefined name}
-%.br
-Raised when a name is not found.
-This applies to unqualified names, module names (on {\tt import}),
-module members and object methods.
-The string argument is the name that could not be found.
-\excitem{RuntimeError}{run-time error}
-%.br
-Raised for a variety of reasons, e.g., division by zero or index out of
-range.
-\excitem{SystemError}{system error}
-%.br
-Raised when the interpreter finds an internal error, but the situation
-does not look so serious to cause it to abandon all hope.
-\excitem{TypeError}{type error}
-%.br
-Raised when an operation or built-in function is applied to an object of
-inappropriate type.
-\end{description}
-
-\subsection{Built-in Functions}
-
-The {\Python} interpreter has a small number of functions built into it that
-are always available.
-They are listed here in alphabetical order.
-\begin{description}
-\funcitem{abs}{x}
-Returns the absolute value of a number.
-The argument may be an integer or floating point number.
-\funcitem{chr}{i}
-Returns a string of one character
-whose ASCII code is the integer {\tt i},
-e.g., {\tt chr(97)} returns the string {\tt 'a'}.
-This is the inverse of {\tt ord()}.
-\funcitem{dir}{}
-Without arguments, this function returns the list of names in the
-current local symbol table, sorted alphabetically.
-With a module object as argument, it returns the sorted list of names in
-that module's global symbol table.
-For example:
-\bcode\begin{verbatim}
->>> import sys
->>> dir()
-['sys']
->>> dir(sys)
-['argv', 'exit', 'modules', 'path', 'stderr', 'stdin', 'stdout']
->>> 
-\end{verbatim}\ecode
-\funcitem{divmod}{a, b}
-%.br
-Takes two integers as arguments and returns a pair of integers
-consisting of their quotient and remainder.
-For
-\bcode\begin{verbatim}
-q, r = divmod(a, b)
-\end{verbatim}\ecode
-the invariants are:
-\bcode\begin{verbatim}
-a = q*b + r
-abs(r) < abs(b)
-r has the same sign as b
-\end{verbatim}\ecode
-For example:
-\bcode\begin{verbatim}
->>> divmod(100, 7)
-(14, 2)
->>> divmod(-100, 7)
-(-15, 5)
->>> divmod(100, -7)
-(-15, -5)
->>> divmod(-100, -7)
-(14, -2)
->>> 
-\end{verbatim}\ecode
-\funcitem{eval}{s}
-Takes a string as argument and parses and evaluates it as a {\Python}
-expression.
-The expression is executed using the current local and global symbol
-tables.
-Syntax errors are reported as exceptions.
-For example:
-\bcode\begin{verbatim}
->>> x = 1
->>> eval('x+1')
-2
->>> 
-\end{verbatim}\ecode
-\funcitem{exec}{s}
-Takes a string as argument and parses and evaluates it as a sequence of
-{\Python} statements.
-The string should end with a newline (\verb"'\n'").
-The statement is executed using the current local and global symbol
-tables.
-Syntax errors are reported as exceptions.
-For example:
-\bcode\begin{verbatim}
->>> x = 1
->>> exec('x = x+1\n')
->>> x
-2
->>> 
-\end{verbatim}\ecode
-\funcitem{float}{x}
-Converts a number to floating point.
-The argument may be an integer or floating point number.
-\funcitem{input}{s}
-Equivalent to
-{\tt eval(raw\_input(s))}.
-As for
-{\tt raw\_input()},
-the argument is optional.
-\funcitem{int}{x}
-Converts a number to integer.
-The argument may be an integer or floating point number.
-\funcitem{len}{s}
-Returns the length (the number of items) of an object.
-The argument may be a sequence (string, tuple or list) or a mapping
-(dictionary).
-\funcitem{max}{s}
-Returns the largest item of a non-empty sequence (string, tuple or list).
-\funcitem{min}{s}
-Returns the smallest item of a non-empty sequence (string, tuple or list).
-\funcitem{open}{name, mode}
-%.br
-Returns a file object (described earlier under Built-in Types).
-The string arguments are the same as for stdio's
-{\tt fopen()}:
-{\tt 'r'}
-opens the file for reading,
-{\tt 'w'}
-opens it for writing (truncating an existing file),
-{\tt 'a'}
-opens it for appending.%
-\footnote{
-This function should go into a built-in module
-{\tt io}.
-}
-\funcitem{ord}{c}
-Takes a string of one character and returns its
-ASCII value, e.g., {\tt ord('a')} returns the integer {\tt 97}.
-This is the inverse of {\tt chr()}.
-\funcitem{range}{}
-This is a versatile function to create lists containing arithmetic
-progressions of integers.
-With two integer arguments, it returns the ascending sequence of
-integers starting at the first and ending one before the second
-argument.
-A single argument is used as the end point of the sequence, with 0 used
-as the starting point.
-A third argument specifies the step size; negative steps are allowed and
-work as expected, but don't specify a zero step.
-The resulting list may be empty.
-For example:
-\bcode\begin{verbatim}
->>> range(10)
-[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
->>> range(1, 1+10)
-[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
->>> range(0, 30, 5)
-[0, 5, 10, 15, 20, 25]
->>> range(0, 10, 3)
-[0, 3, 6, 9]
->>> range(0, -10, -1)
-[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
->>> range(0)
-[]
->>> range(1, 0)
-[]
->>> 
-\end{verbatim}\ecode
-\funcitem{raw\_input}{s}
-%.br
-The argument is optional; if present, it is written to standard output
-without a trailing newline.
-The function then reads a line from input, converts it to a string
-(stripping a trailing newline), and returns that.
-EOF is reported as an exception.
-For example:
-\bcode\begin{verbatim}
->>> raw_input('Type anything: ')
-Type anything: Mutant Teenage Ninja Turtles
-'Mutant Teenage Ninja Turtles'
->>> 
-\end{verbatim}\ecode
-\funcitem{reload}{module}
-Causes an already imported module to be re-parsed and re-initialized.
-This is useful if you have edited the module source file and want to
-try out the new version without leaving {\Python}.
-\funcitem{type}{x}
-Returns the type of an object.
-Types are objects themselves:
-the type of a type object is its own type.
-\end{description}
-
-\section{Built-in Modules}
-
-The modules described in this section are built into the interpreter.
-They must be imported using
-{\tt import}.
-Some modules are not always available; it is a configuration option to
-provide them.
-Details are listed with the descriptions, but the best way to see if
-a module exists in a particular implementation is to attempt to import
-it.
-
-\subsection{Built-in Module {\tt sys}}
-
-This module provides access to some variables used or maintained by the
-interpreter and to functions that interact strongly with the interpreter.
-It is always available.
-\begin{description}
-\funcitem{argv}
-The list of command line arguments passed to a {\Python} script.
-{\tt sys.argv[0]}
-is the script name.
-If no script name was passed to the {\Python} interpreter,
-{\tt sys.argv}
-is empty.
-\funcitem{exit}{n}
-Exits from {\Python} with numeric exit status
-{\tt n}.
-This closes all open files and performs other cleanup-actions required by
-the interpreter (but
-{\em finally clauses}
-of
-{\tt try}
-statements are not executed!).
-\funcitem{modules}
-Gives the list of modules that have already been loaded.
-This can be manipulated to force reloading of modules and other tricks.
-\funcitem{path}
-A list of strings that specifies the search path for modules.
-Initialized from the environment variable {\tt PYTHONPATH}, or an
-installation-dependent default.
-\funcitem{ps1,~ps2}
-Strings specifying the primary and secondary prompt of the interpreter.
-These are only defined if the interpreter is in interactive mode.
-Their initial values in this case are
-{\tt '>>> '}
-and
-{\tt '... '}.
-\funcitem{stdin, stdout, stderr}
-%.br
-File objects corresponding to the interpreter's standard input, output
-and error streams.
-{\tt sys.stdin}
-is used for all interpreter input except for scripts but including calls
-to
-{\tt input()}
-and
-{\tt raw\_input()}.
-{\tt sys.stdout}
-is used for the output of
-{\tt print} and expression statements
-and for the prompts of
-{\tt input()}
-and
-{\tt raw\_input()}.
-The interpreter's own prompts and its error messages are written to
-stderr.
-Assigning to
-{\tt sys.stderr}
-has no effect on the interpreter; it can be used to write error messages
-to stderr using
-{\tt print}.
-\end{description}
-
-\subsection{Built-in Module {\tt math}}
-
-This module is always available.
-It provides access to the mathematical functions defined by the C
-standard.
-They are:
-{\tt acos(x)},
-{\tt asin(x)},
-{\tt atan(x)},
-{\tt atan2(x,y)},
-{\tt ceil(x)},
-{\tt cos(x)},
-{\tt cosh(x)},
-{\tt exp(x)},
-{\tt fabs(x)},
-{\tt floor(x)},
-%{\tt fmod(...)}  XXX not yet
-%{\tt frexp(...)} XXX not yet
-%{\tt ldexp(...)} XXX not yet
-{\tt log(x)},
-{\tt log10(x)},
-%{\tt modf(...)}  XXX not yet
-{\tt pow(x,y)},
-{\tt sin(x)},
-{\tt sinh(x)},
-{\tt sqrt(x)},
-{\tt tan(x)},
-{\tt tanh(x)}.
-
-It also defines two mathematical constants:
-{\tt pi}
-and
-{\tt e}.
-
-\subsection{Built-in Module {\tt time}}
-
-This module provides various time-related functions.
-It is always available.
-Functions are:
-\begin{description}
-\funcitem{sleep}{secs}
-Suspends execution for the given number of seconds.
-\funcitem{time}{}
-Returns the time in seconds since the Epoch (Thursday January 1,
-00:00:00, 1970 UCT on \UNIX\ machines).
-\end{description}
-
-\noindent
-In some versions (Amoeba, Mac) the following functions also exist:
-\begin{description}
-\funcitem{millisleep}{msecs}
-Suspends execution for the given number of milliseconds.
-\funcitem{millitimer}{}
-Returns the number of milliseconds of real time elapsed since some point
-in the past that is fixed per execution of the python interpreter (but
-may change in each following run).
-\end{description}
-
-\noindent
-The granularity of the milliseconds functions may be more than a
-millisecond (100 msecs on Amoeba, 1/60 sec on the Mac).
-
-\subsection{Built-in Module {\tt regexp}}
-
-This module provides a regular expression matching operation.
-It is always available.
-
-The module defines a function and an exception:
-
-\begin{description}
-
-\funcitem{compile}{pattern}
-
-Compile a regular expression given as a string into a regular
-expression object.
-The string must be an egrep-style regular expression;
-this means that the characters {\tt '(' ')' '*' '+' '?' '|' '^' '$'}
-are special.
-(It is implemented using Henry Spencer's regular expression matching
-functions.)
-
-excitem{error}{regexp.error}
-
-Exception raised when a string passed to {\tt compile()} is not a
-valid regular expression (e.g., unmatched parentheses) or when some other
-error occurs during compilation or matching
-(``no match found'' is not an error).
-
-\end{description}
-
-Compiled regular expression objects support a single method:
-
-\begin{description}
-
-\funcitem{exec}{str}
-
-Find the first occurrence of the compiled regular expression in the
-string {\tt str}.
-The return value is a tuple of pairs specifying where a match was
-found and where matches were found for subpatterns specified with
-{\tt '('} and {\tt ')'} in the pattern.
-If no match is found, an empty tuple is returned; otherwise the first
-item of the tuple is a pair of slice indices into the search string
-giving the match found.
-If there were any subpatterns in the pattern, the returned tuple has an
-additional item for each subpattern, giving the slice indices into the
-search string where that subpattern was found.
-
-\end{description}
-
-For example:
-\bcode\begin{verbatim}
->>> import regexp
->>> r = regexp.compile('--(.*)--')
->>> s = 'a--b--c'
->>> r.exec(s)
-((1, 6), (3, 4))
->>> s[1:6] # The entire match
-'--b--'
->>> s[3:4] # The subpattern
-'b'
->>> 
-\end{verbatim}\ecode
-
-\subsection{Built-in Module {\tt posix}}
-
-This module provides access to operating system functionality that is
-standardized by the C Standard and the POSIX standard (a thinly diguised
-{\UNIX} interface).
-It is available in all {\Python} versions except on the Macintosh.
-Errors are reported exceptions.
-It defines the following items:
-\begin{description}
-\funcitem{chdir}{path}
-Changes the current directory to
-{\tt path}.
-\funcitem{chmod}{path, mode}
-Change the mode of
-{\tt path}
-to the numeric
-{\tt mode}.
-\funcitem{environ}
-A dictionary representing the string environment at the time
-the interpreter was started.
-(Modifying this dictionary does not affect the string environment of the
-interpreter.)
-For example,
-{\tt posix.environ['HOME']}
-is the pathname of your home directory, equivalent to
-{\tt getenv("HOME")}
-in C.
-\excitem{error}{posix.error}
-%.br
-The exception raised when an POSIX function returns an error.
-The value accompanying this exception is a pair containing the numeric
-error code from
-{\tt errno}
-and the corresponding string, as would be printed by the C function
-{\tt perror()}.
-\funcitem{getcwd}{}
-Returns a string representing the current working directory.
-\funcitem{link}{src, dst}
-Creates a hard link pointing to
-{\tt src}
-named
-{\tt dst}.
-\funcitem{listdir}{path}
-Returns a list containing the names of the entries in the
-directory.
-The list is in arbitrary order.
-It includes the special entries
-{\tt '.'}
-and
-{\tt '..'}
-if they are present in the directory.
-\funcitem{mkdir}{path, mode}
-Creates a directory named
-{\tt path}
-with numeric mode
-{\tt mode}.
-\funcitem{rename}{src, dst}
-Renames the file or directory
-{\tt src}
-to
-{\tt dst}.
-\funcitem{rmdir}{path}
-Removes the directory
-{\tt path}.
-\funcitem{stat}{path}
-Performs a
-{\em stat}
-system call on the given path.
-The return value is a tuple of at least 10 integers giving the most
-important (and portable) members of the
-{\em stat}
-structure, in the order
-{\tt st\_mode},
-{\tt st\_ino},
-{\tt st\_dev},
-{\tt st\_nlink},
-{\tt st\_uid},
-{\tt st\_gid},
-{\tt st\_size},
-{\tt st\_atime},
-{\tt st\_mtime},
-{\tt st\_ctime}.
-More items may be added at the end by some implementations.
-\funcitem{system}{command}
-Executes the command (a string) in a subshell.
-This is implemented by calling the Standard C function
-{\tt system()},
-and has the same limitations.
-Changes to
-{\tt posix.environ},
-{\tt sys.stdin}
-etc. are not reflected in the environment of the executed command.
-The return value is the exit status of the process as returned by
-Standard C
-{\tt system()}.
-\funcitem{umask}{mask}
-Sets the current numeric umask and returns the previous umask.
-\funcitem{unlink}{path}
-Unlinks the file
-{\tt path}.
-\funcitem{utimes(path, }{atime, mtime)}
-%.br
-Sets the access and modified time of the file to the given values.
-(The second argument is a tuple of two items.)
-\end{description}
-
-The following functions are only available on systems that support
-symbolic links:
-\begin{description}
-\funcitem{lstat}{path}
-Like
-{\tt stat()},
-but does not follow symbolic links.
-\funcitem{readlink}{path}
-Returns a string representing the path to which the symbolic link
-points.
-\funcitem{symlink}{src, dst}
-Creates a symbolic link pointing to
-{\tt src}
-named
-{\tt dst}.
-\end{description}
-
-\subsection{Built-in Module {\tt stdwin}}
-
-This module defines several new object types and functions that
-provide access to the functionality of the Standard Window System
-Interface, STDWIN [CWI report CR-R8817].
-It is available on systems to which STDWIN has been ported (which is
-most systems).
-It is only available if the {\tt DISPLAY} environment variable is set
-or an explicit `{\tt -display \it displayname}' argument is passed to
-the interpreter.
-
-Functions have names that usually resemble their C STDWIN counterparts
-with the initial `w' dropped.
-Points are represented by pairs of integers; rectangles
-by pairs of points.
-For a complete description of STDWIN please refer to the documentation
-of STDWIN for C programmers (aforementioned CWI report).
-\subsubsection{Functions Defined in Module {\tt stdwin}}
-
-The following functions are defined in the {\tt stdwin} module:
-\begin{description}
-\funcitem{open}{title}
-%.br
-Opens a new window whose initial title is given by the string argument.
-Returns a window object; window object methods are described below.%
-\footnote{
-The {\Python} version of STDWIN does not support draw procedures; all
-drawing requests are reported as draw events.
-}
-\funcitem{getevent}{}
-%.br
-Waits for and returns the next event.
-An event is returned as a triple: the first element is the event
-type, a small integer; the second element is the window object to which
-the event applies, or
-{\tt None}
-if it applies to no window in particular;
-the third element is type-dependent.
-Names for event types and command codes are defined in the standard
-module
-{\tt stdwinevent}.
-\funcitem{setdefwinpos}{h, v}
-%.br
-Sets the default window position.
-\funcitem{setdefwinsize}{width, height}
-%.br
-Sets the default window size.
-\funcitem{menucreate}{title}
-%.br
-Creates a menu object referring to a global menu (a menu that appears in
-all windows).
-Methods of menu objects are described below.
-\funcitem{fleep}{}
-%.br
-Causes a beep or bell (or perhaps a `visual bell' or flash, hence the
-name).
-\funcitem{message}{string}
-%.br
-Displays a dialog box containing the string.
-The user must click OK before the function returns.
-\funcitem{askync}{prompt, default}
-%.br
-Displays a dialog that prompts the user to answer a question with yes or
-no.
-The function returns 0 for no, 1 for yes.
-If the user hits the Return key, the default (which must be 0 or 1) is
-returned.
-If the user cancels the dialog, the
-{\tt KeyboardInterrupt}
-exception is raised.
-\funcitem{askstr}{prompt, default}
-%.br
-Displays a dialog that prompts the user for a string.
-If the user hits the Return key, the default string is returned.
-If the user cancels the dialog, the
-{\tt KeyboardInterrupt}
-exception is raised.
-\funcitem{askfile}{prompt, default, new}
-%.br
-Asks the user to specify a filename.
-If
-{\tt new}
-is zero it must be an existing file; otherwise, it must be a new file.
-If the user cancels the dialog, the
-{\tt KeyboardInterrupt}
-exception is raised.
-\funcitem{setcutbuffer}{i, string}
-%.br
-Stores the string in the system's cut buffer number
-{\tt i},
-where it can be found (for pasting) by other applications.
-On X11, there are 8 cut buffers (numbered 0..7).
-Cut buffer number 0 is the `clipboard' on the Macintosh.
-\funcitem{getcutbuffer}{i}
-%.br
-Returns the contents of the system's cut buffer number
-{\tt i}.
-\funcitem{rotatebutbuffers}{n}
-%.br
-On X11, this rotates the 8 cut buffers by
-{\tt n}.
-Ignored on the Macintosh.
-\funcitem{getselection}{i}
-%.br
-Returns X11 selection number
-{\tt i.}
-Selections are not cut buffers.
-Selection numbers are defined in module
-{\tt stdwinevents}.
-Selection {\tt WS\_PRIMARY} is the
-{\em primary}
-selection (used by
-xterm,
-for instance);
-selection {\tt WS\_SECONDARY} is the
-{\em secondary}
-selection; selection {\tt WS\_CLIPBOARD} is the
-{\em clipboard}
-selection (used by
-xclipboard).
-On the Macintosh, this always returns an empty string.
-\funcitem{resetselection}{i}
-%.br
-Resets selection number
-{\tt i},
-if this process owns it.
-(See window method
-{\tt setselection()}).
-\funcitem{baseline}{}
-%.br
-Return the baseline of the current font (defined by STDWIN as the
-vertical distance between the baseline and the top of the
-characters).%
-\footnote{
-There is no way yet to set the current font.
-This will change in a future version.
-}
-\funcitem{lineheight}{}
-%.br
-Return the total line height of the current font.
-\funcitem{textbreak}{str, width}
-%.br
-Return the number of characters of the string that fit into a space of
-{\tt width}
-bits wide when drawn in the curent font.
-\funcitem{textwidth}{str}
-%.br
-Return the width in bits of the string when drawn in the current font.
-\end{description}
-
-\subsubsection{Window Object Methods}
-
-Window objects are created by
-{\tt stdwin.open()}.
-There is no explicit function to close a window; windows are closed when
-they are garbage-collected.
-Window objects have the following methods:
-\begin{description}
-\funcitem{begindrawing}{}
-Returns a drawing object, whose methods (described below) allow drawing
-in the window.
-\funcitem{change}{rect}
-Invalidates the given rectangle; this may cause a draw event.
-\funcitem{gettitle}{}
-Returns the window's title string.
-\funcitem{getdocsize}{}
-\begin{sloppypar}
-Returns a pair of integers giving the size of the document as set by
-{\tt setdocsize()}.
-\end{sloppypar}
-\funcitem{getorigin}{}
-Returns a pair of integers giving the origin of the window with respect
-to the document.
-\funcitem{getwinsize}{}
-Returns a pair of integers giving the size of the window.
-\funcitem{menucreate}{title}
-Creates a menu object referring to a local menu (a menu that appears
-only in this window).
-Methods menu objects are described below.
-\funcitem{scroll}{rect,~point}
-Scrolls the given rectangle by the vector given by the point.
-\funcitem{setwincursor}{name}
-\begin{sloppypar}
-Sets the window cursor to a cursor of the given name.
-It raises the
-{\tt Runtime\-Error}
-exception if no cursor of the given name exists.
-Suitable names are
-{\tt 'ibeam'},
-{\tt 'arrow'},
-{\tt 'cross'},
-{\tt 'watch'}
-and
-{\tt 'plus'}.
-On X11, there are many more (see
-{\tt <X11/cursorfont.h>}).
-\end{sloppypar}
-\funcitem{setdocsize}{point}
-Sets the size of the drawing document.
-\funcitem{setorigin}{point}
-Moves the origin of the window to the given point in the document.
-\funcitem{setselection}{i, str}
-Attempts to set X11 selection number
-{\tt i}
-to the string
-{\tt str}.
-(See stdwin method
-{\tt getselection()}
-for the meaning of
-{\tt i}.)
-Returns true if it succeeds.
-If it succeeds, the window ``owns'' the selection until
-(a) another applications takes ownership of the selection; or
-(b) the window is deleted; or
-(c) the application clears ownership by calling
-{\tt stdwin.resetselection(i)}.
-When another application takes ownership of the selection, a
-{\tt WE\_LOST\_SEL}
-event is received for no particular window and with the selection number
-as detail.
-Ignored on the Macintosh.
-\funcitem{settitle}{title}
-Sets the window's title string.
-\funcitem{settimer}{dsecs}
-Schedules a timer event for the window in
-{\tt dsecs/10}
-seconds.
-\funcitem{show}{rect}
-Tries to ensure that the given rectangle of the document is visible in
-the window.
-\funcitem{textcreate}{rect}
-Creates a text-edit object in the document at the given rectangle.
-Methods of text-edit objects are described below.
-\end{description}
-
-\subsubsection{Drawing Object Methods}
-
-Drawing objects are created exclusively by the window method
-{\tt begindrawing()}.
-Only one drawing object can exist at any given time; the drawing object
-must be deleted to finish drawing.
-No drawing object may exist when
-{\tt stdwin.getevent()}
-is called.
-Drawing objects have the following methods:
-\begin{description}
-\funcitem{box}{rect}
-Draws a box around a rectangle.
-\funcitem{circle}{center, radius}
-%.br
-Draws a circle with given center point and radius.
-\funcitem{elarc(center, (rh, rv), }{a1, a2)}
-%.br
-Draws an elliptical arc with given center point.
-{\tt (rh, rv)}
-gives the half sizes of the horizontal and vertical radii.
-{\tt (a1, a2)}
-gives the angles (in degrees) of the begin and end points.
-0 degrees is at 3 o'clock, 90 degrees is at 12 o'clock.
-\funcitem{erase}{rect}
-Erases a rectangle.
-\funcitem{invert}{rect}
-Inverts a rectangle.
-\funcitem{line}{p1, p2}
-Draws a line from point
-{\tt p1}
-to
-{\tt p2}.
-\funcitem{paint}{rect}
-Fills a rectangle.
-\funcitem{text}{p, str}
-Draws a string starting at point p (the point specifies the
-top left coordinate of the string).
-\funcitem{shade}{rect, percent}
-%.br
-Fills a rectangle with a shading pattern that is about
-{\tt percent}
-percent filled.
-\funcitem{xorline}{p1, p2}
-Draws a line in XOR mode.
-\funcitem{baseline(), lineheight(), textbreak(), textwidth}{}
-%.br
-These functions are similar to the corresponding functions described
-above for the
-{\tt stdwin}
-module, but use the current font of the window instead of the (global)
-default font.
-\end{description}
-
-\subsubsection{Menu Object Methods}
-
-A menu object represents a menu.
-The menu is destroyed when the menu object is deleted.
-The following methods are defined:
-\begin{description}
-\funcitem{additem}{text, shortcut}
-%.br
-Adds a menu item with given text.
-The shortcut must be a string of length 1, or omitted (to specify no
-shortcut).
-\funcitem{setitem}{i, text}
-Sets the text of item number
-{\tt i}.
-\funcitem{enable}{i, flag}
-Enables or disables item
-{\tt i}.
-\funcitem{check}{i, flag}
-Sets or clears the
-{\em check mark}
-for item
-{\tt i}.
-\end{description}
-
-\subsubsection{Text-edit Object Methods}
-
-A text-edit object represents a text-edit block.
-For semantics, see the STDWIN documentation for C programmers.
-The following methods exist:
-\begin{description}
-\funcitem{arrow}{code}
-Passes an arrow event to the text-edit block.
-The
-{\tt code}
-must be one of
-{\tt WC\_LEFT},
-{\tt WC\_RIGHT},
-{\tt WC\_UP}
-or
-{\tt WC\_DOWN}
-(see module
-{\tt stdwinevents}).
-\funcitem{draw}{rect}
-Passes a draw event to the text-edit block.
-The rectangle specifies the redraw area.
-\funcitem{event}{type, window, detail}
-%.br
-Passes an event gotten from
-{\tt stdwin.getevent()}
-to the text-edit block.
-Returns true if the event was handled.
-\funcitem{getfocus}{}
-Returns 2 integers representing the start and end positions of the
-focus, usable as slice indices on the string returned by
-{\tt getfocustext()}.
-\funcitem{getfocustext}{}
-Returns the text in the focus.
-\funcitem{getrect}{}
-Returns a rectangle giving the actual position of the text-edit block.
-(The bottom coordinate may differ from the initial position because
-the block automatically shrinks or grows to fit.)
-\funcitem{gettext}{}
-Returns the entire text buffer.
-\funcitem{move}{rect}
-Specifies a new position for the text-edit block in the document.
-\funcitem{replace}{str}
-Replaces the focus by the given string.
-The new focus is an insert point at the end of the string.
-\funcitem{setfocus}{i,~j}
-Specifies the new focus.
-Out-of-bounds values are silently clipped.
-\end{description}
-
-\subsubsection{Example}
-
-Here is a simple example of using STDWIN in Python.
-It creates a window and draws the string ``Hello world'' in the top
-left corner of the window.
-The window will be correctly redrawn when covered and re-exposed.
-The program quits when the close icon or menu item is requested.
-\bcode\begin{verbatim}
-import stdwin
-from stdwinevents import *
-
-def main():
-    mywin = stdwin.open('Hello')
-    #
-    while 1:
-        (type, win, detail) = stdwin.getevent()
-        if type = WE_DRAW:
-            draw = win.begindrawing()
-            draw.text((0, 0), 'Hello, world')
-            del draw
-        elif type = WE_CLOSE:
-            break
-
-main()
-\end{verbatim}\ecode
-
-\subsection{Built-in Module {\tt amoeba}}
-
-This module provides some object types and operations useful for
-Amoeba applications.
-It is only available on systems that support Amoeba operations.
-RPC errors and other Amoeba errors are reported as the exception
-{\tt amoeba.error = 'amoeba.error'}.
-The module
-{\tt amoeba}
-defines the following items:
-\begin{description}
-\funcitem{name\_append}{path,~cap}
-%.br
-Stores a capability in the Amoeba directory tree.
-Arguments are the pathname (a string) and the capability (a capability
-object as returned by
-{\tt name\_lookup()}).
-\funcitem{name\_delete}{path}
-%.br
-Deletes a capability from the Amoeba directory tree.
-Argument is the pathname.
-\funcitem{name\_lookup}{path}
-%.br
-Looks up a capability.
-Argument is the pathname.
-Returns a
-{\em capability}
-object, to which various interesting operations apply, described below.
-\funcitem{name\_replace}{path,~cap}
-%.br
-Replaces a capability in the Amoeba directory tree.
-Arguments are the pathname and the new capability.
-(This differs from
-{\tt name\_append()}
-in the behavior when the pathname already exists:
-{\tt name\_append()}
-finds this an error while
-{\tt name\_replace()}
-allows it, as its name suggests.)
-\funcitem{capv}
-A table representing the capability environment at the time the
-interpreter was started.
-(Alas, modifying this table does not affect the capability environment
-of the interpreter.)
-For example,
-{\tt amoeba.capv['ROOT']}
-is the capability of your root directory, similar to
-{\tt getcap("ROOT")}
-in C.
-\excitem{error}{amoeba.error}
-%.br
-The exception raised when an Amoeba function returns an error.
-The value accompanying this exception is a pair containing the numeric
-error code and the corresponding string, as returned by the C function
-{\tt err\_why()}.
-\funcitem{timeout}{msecs}
-%.br
-Sets the transaction timeout, in milliseconds.
-Returns the previous timeout.
-Initially, the timeout is set to 2 seconds by the {\Python} interpreter.
-\end{description}
-
-\subsubsection{Capability Operations}
-
-Capabilities are written in a convenient ASCII format, also used by the
-Amoeba utilities
-{\em c2a}(U)
-and
-{\em a2c}(U).
-For example:
-\bcode\begin{verbatim}
->>> amoeba.name_lookup('/profile/cap')
-aa:1c:95:52:6a:fa/14(ff)/8e:ba:5b:8:11:1a
->>> 
-\end{verbatim}\ecode
-The following methods are defined for capability objects.
-\begin{description}
-\funcitem{dir\_list}{}
-Returns a list of the names of the entries in an Amoeba directory.
-\funcitem{b\_read}{offset, maxsize}
-%.br
-Reads (at most)
-{\tt maxsize}
-bytes from a bullet file at offset
-{\tt offset.}
-The data is returned as a string.
-EOF is reported as an empty string.
-\funcitem{b\_size}{}
-Returns the size of a bullet file.
-\funcitem{dir\_append(), dir\_delete(), dir\_lookup(), dir\_replace}{}
-%.br
-\itembreak
-Like the corresponding
-{\tt name\_*}
-functions, but with a path relative to the capability.
-(For paths beginning with a slash the capability is ignored, since this
-is the defined semantics for Amoeba.)
-\funcitem{std\_info}{}
-Returns the standard info string of the object.
-\funcitem{tod\_gettime}{}
-Returns the time (in seconds since the Epoch, in UCT, as for POSIX) from
-a time server.
-\funcitem{tod\_settime}{t}
-Sets the time kept by a time server.
-\end{description}
-
-\subsection{Built-in Module {\tt audio}}
-
-This module provides rudimentary access to the audio I/O device
-{\tt /dev/audio}
-on the Silicon Graphics Personal IRIS; see audio(7).
-It supports the following operations:
-\begin{description}
-\funcitem{setoutgain}{n}
-Sets the output gain (0-255).
-\funcitem{getoutgain}{}
-Returns the output gain.
-\funcitem{setrate}{n}
-Sets the sampling rate: 1=32K/sec, 2=16K/sec, 3=8K/sec.
-\funcitem{setduration}{n}
-Sets the `sound duration' in units of 1/100 seconds.
-\funcitem{read}{n}
-Reads a chunk of
-{\tt n}
-sampled bytes from the audio input (line in or microphone).
-The chunk is returned as a string of length n.
-Each byte encodes one sample as a signed 8-bit quantity using linear
-encoding.
-This string can be converted to numbers using {\tt chr2num()} described
-below.
-\funcitem{write}{buf}
-Writes a chunk of samples to the audio output (speaker).
-\end{description}
-
-These operations support asynchronous audio I/O:
-\begin{description}
-\funcitem{start\_recording}{n}
-%.br
-Starts a second thread (a process with shared memory) that begins reading
-{\tt n}
-bytes from the audio device.
-The main thread immediately continues.
-\funcitem{wait\_recording}{}
-%.br
-Waits for the second thread to finish and returns the data read.
-\funcitem{stop\_recording}{}
-%.br
-Makes the second thread stop reading as soon as possible.
-Returns the data read so far.
-\funcitem{poll\_recording}{}
-%.br
-Returns true if the second thread has finished reading (so
-{\tt wait\_recording()} would return the data without delay).
-\item[{\tt start\_playing(chunk)}, {\tt wait\_playing()},
-{\tt stop\_playing()}, {\tt poll\_playing()}]
-%.br
-\begin{sloppypar}
-Similar but for output.
-{\tt stop\_playing()}
-returns a lower bound for the number of bytes actually played (not very
-accurate).
-\end{sloppypar}
-\end{description}
-
-The following operations do not affect the audio device but are
-implemented in C for efficiency:
-\begin{description}
-\funcitem{amplify}{buf, f1, f2}
-%.br
-Amplifies a chunk of samples by a variable factor changing from
-{\tt f1}/256 to {\tt f2}/256.
-Negative factors are allowed.
-Resulting values that are to large to fit in a byte are clipped.         
-\funcitem{reverse}{buf}
-%.br
-Returns a chunk of samples backwards.
-\funcitem{add}{buf1, buf2}
-%.br
-Bytewise adds two chunks of samples.
-Bytes that exceed the range are clipped.
-If one buffer shorter, it is assumed to be padded with zeros.
-\funcitem{chr2num}{buf}
-%.br
-Converts a string of sampled bytes as returned by {\tt read()} into
-a list containing the numeric values of the samples.
-\funcitem{num2chr}{list}
-%.br
-\begin{sloppypar}
-Converts a list as returned by
-{\tt chr2num()}
-back to a buffer acceptable by
-{\tt write()}.
-\end{sloppypar}
-\end{description}
-
-\subsection{Built-in Module {\tt gl}}
-
-This module provides access to the Silicon Graphics
-{\em Graphics Library}.
-It is available only on Silicon Graphics machines.
-
-{\bf Warning:}
-Some illegal calls to the GL library cause the {\Python} interpreter to dump
-core.
-In particular, the use of most GL calls is unsafe before the first
-window is opened.
-
-The module is too large to document here in its entirety, but the
-following should help you to get started.
-The parameter conventions for the C functions are translated to {\Python} as
-follows:
-
-\begin{itemize}
-\item
-All (short, long, unsigned) int values are represented by {\Python}
-integers.
-\item
-All float and double values are represented by {\Python} floating point
-numbers.
-In most cases, {\Python} integers are also allowed.
-\item
-All arrays are represented by one-dimensional {\Python} lists.
-In most cases, tuples are also allowed.
-\item
-\begin{sloppypar}
-All string and character arguments are represented by {\Python} strings,
-for instance,
-{\tt winopen('Hi~There!')}
-and
-{\tt rotate(900,~'z')}.
-\end{sloppypar}
-\item
-All (short, long, unsigned) integer arguments or return values that are
-only used to specify the length of an array argument are omitted.
-For example, the C call
-\bcode\begin{verbatim}
-lmdef(deftype, index, np, props)
-\end{verbatim}\ecode
-is translated to {\Python} as
-\bcode\begin{verbatim}
-lmdef(deftype, index, props)
-\end{verbatim}\ecode
-\item
-Output arguments are omitted from the argument list; they are
-transmitted as function return values instead.
-If more than one value must be returned, the return value is a tuple.
-If the C function has both a regular return value (that is not omitted
-because of the previous rule) and an output argument, the return value
-comes first in the tuple.
-Examples: the C call
-\bcode\begin{verbatim}
-getmcolor(i, &red, &green, &blue)
-\end{verbatim}\ecode
-is translated to {\Python} as
-\bcode\begin{verbatim}
-red, green, blue = getmcolor(i)
-\end{verbatim}\ecode
-\end{itemize}
-
-The following functions are non-standard or have special argument
-conventions:
-\begin{description}
-\funcitem{varray}{}
-Equivalent to but faster than a number of
-{\tt v3d()}
-calls.
-The argument is a list (or tuple) of points.
-Each point must be a tuple of coordinates (x, y, z) or (x, y).
-The points may be 2- or 3-dimensional but must all have the
-same dimension.
-Float and int values may be mixed however.
-The points are always converted to 3D double precision points
-by assuming z=0.0 if necessary (as indicated in the man page),
-and for each point
-{\tt v3d()}
-is called.
-\funcitem{nvarray}{}
-Equivalent to but faster than a number of
-{\tt n3f}
-and
-{\tt v3f}
-calls.
-The argument is an array (list or tuple) of pairs of normals and points.
-Each pair is a tuple of a point and a normal for that point.
-Each point or normal must be a tuple of coordinates (x, y, z).
-Three coordinates must be given.
-Float and int values may be mixed.
-For each pair,
-{\tt n3f()}
-is called for the normal, and then
-{\tt v3f()}
-is called for the point.
-\funcitem{vnarray}{}
-Similar to 
-{\tt nvarray()}
-but the pairs have the point first and the normal second.
-\funcitem{nurbssurface}{s\_k[], t\_k[], ctl[][], s\_ord, t\_ord, type}
-%.br
-\itembreak
-Defines a nurbs surface.
-The dimensions of
-{\tt ctl[][]}
-are computed as follows:
-{\tt [len(s\_k)~-~s\_ord]},
-{\tt [len(t\_k)~-~t\_ord]}.
-\funcitem{nurbscurve}{knots, ctlpoints, order, type}
-%.br
-Defines a nurbs curve.
-The length of ctlpoints is
-{\tt len(knots)~-~order}.
-\funcitem{pwlcurve}{points, type}
-%.br
-Defines a piecewise-linear curve.
-{\tt points}
-is a list of points.
-{\tt type}
-must be
-{\tt N\_ST}.
-\funcitem{pick(n), select}{n}
-%.br
-The only argument to these functions specifies the desired size of the
-pick or select buffer.
-\funcitem{endpick(), endselect}{}
-%.br
-These functions have no arguments.
-They return a list of integers representing the used part of the
-pick/select buffer.
-No method is provided to detect buffer overrun.
-\end{description}
-
-Here is a tiny but complete example GL program in {\Python}:
-\bcode\begin{verbatim}
-import gl, GL, time
-
-def main():
-    gl.foreground()
-    gl.prefposition(500, 900, 500, 900)
-    w = gl.winopen('CrissCross')
-    gl.ortho2(0.0, 400.0, 0.0, 400.0)
-    gl.color(GL.WHITE)
-    gl.clear()
-    gl.color(GL.RED)
-    gl.bgnline()
-    gl.v2f(0.0, 0.0)
-    gl.v2f(400.0, 400.0)
-    gl.endline()
-    gl.bgnline()
-    gl.v2f(400.0, 0.0)
-    gl.v2f(0.0, 400.0)
-    gl.endline()
-    time.sleep(5)
-
-main()
-\end{verbatim}\ecode
-
-\subsection{Built-in Module {\tt pnl}}
-
-This module provides access to the
-{\em Panel Library}
-built by NASA Ames (to get it, send e-mail to
-{\tt panel-request@nas.nasa.gov}).
-All access to it should be done through the standard module
-{\tt panel},
-which transparantly exports most functions from
-{\tt pnl}
-but redefines
-{\tt pnl.dopanel()}.
-
-{\bf Warning:}
-the {\Python} interpreter will dump core if you don't create a GL window
-before calling
-{\tt pnl.mkpanel()}.
-
-The module is too large to document here in its entirety.
-
-\section{Standard Modules}
-
-The following standard modules are defined.
-They are available in one of the directories in the default module
-search path (try printing
-{\tt sys.path}
-to find out the default search path.)
-
-\subsection{Standard Module {\tt string}}
-
-This module defines some constants useful for checking character
-classes, some exceptions, and some useful string functions.
-The constants are:
-\begin{description}
-\funcitem{digits}
-The string
-{\tt '0123456789'}.
-\funcitem{hexdigits}
-The string
-{\tt '0123456789abcdefABCDEF'}.
-\funcitem{letters}
-The concatenation of the strings
-{\tt lowercase}
-and
-{\tt uppercase}
-described below.
-\funcitem{lowercase}
-The string
-{\tt 'abcdefghijklmnopqrstuvwxyz'}.
-\funcitem{octdigits}
-The string
-{\tt '01234567'}.
-\funcitem{uppercase}
-The string
-{\tt 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.
-\funcitem{whitespace}
-A string containing all characters that are considered whitespace,
-i.e.,
-space, tab and newline.
-This definition is used by
-{\tt split()}
-and
-{\tt strip()}.
-\end{description}
-
-The exceptions are:
-\begin{description}
-\excitem{atoi\_error}{non-numeric argument to string.atoi}
-%.br
-Exception raised by
-{\tt atoi}
-when a non-numeric string argument is detected.
-The exception argument is the offending string.
-\excitem{index\_error}{substring not found in string.index}
-%.br
-Exception raised by
-{\tt index}
-when
-{\tt sub}
-is not found.
-The argument are the offending arguments to index: {\tt (s, sub)}.
-\end{description}
-
-The functions are:
-\begin{description}
-\funcitem{atoi}{s}
-Converts a string to a number.
-The string must consist of one or more digits, optionally preceded by a
-sign ({\tt '+'} or {\tt '-'}).
-\funcitem{index}{s, sub}
-Returns the lowest index in
-{\tt s}
-where the substring
-{\tt sub}
-is found.
-\funcitem{lower}{s}
-Convert letters to lower case.
-\funcitem{split}{s}
-Returns a list of the whitespace-delimited words of the string
-{\tt s}.
-\funcitem{splitfields}{s, sep}
-%.br
-Returns a list containing the fields of the string
-{\tt s},
-using the string
-{\tt sep}
-as a separator.
-The list will have one more items than the number of non-overlapping
-occurrences of the separator in the string.
-Thus,
-{\tt string.splitfields(s, ' ')}
-is not the same as
-{\tt string.split(s)},
-as the latter only returns non-empty words.
-\funcitem{strip}{s}
-Removes leading and trailing whitespace from the string
-{\tt s}.
-\funcitem{swapcase}{s}
-Converts lower case letters to upper case and vice versa.
-\funcitem{upper}{s}
-Convert letters to upper case.
-\funcitem{ljust(s, width), rjust(s, width),  center}{s, width}
-%.br
-These functions respectively left-justify, right-justify and center a
-string in a field of given width.
-They return a string that is at least
-{\tt width}
-characters wide, created by padding the string
-{\tt s}
-with spaces until the given width on the right, left or both sides.
-The string is never truncated.
-\end{description}
-
-\subsection{Standard Module {\tt path}}
-
-This module implements some useful functions on POSIX pathnames.
-\begin{description}
-\funcitem{basename}{p}
-Returns the base name of pathname
-{\tt p}.
-This is the second half of the pair returned by
-{\tt path.split(p)}.
-\funcitem{cat}{p, q}
-Performs intelligent pathname concatenation on paths
-{\tt p}
-and
-{\tt q}:
-If
-{\tt q}
-is an absolute path, the return value is
-{\tt q}.
-Otherwise, the concatenation of
-{\tt p}
-and
-{\tt q}
-is returned, with a slash ({\tt '/'}) inserted unless
-{\tt p}
-is empty or ends in a slash.
-\funcitem{commonprefix}{list}
-%.br
-Returns the longest string that is a prefix of all strings in
-{\tt list}.
-If
-{\tt list}
-is empty, the empty string ({\tt ''}) is returned.
-\funcitem{exists}{p}
-Returns true if
-{\tt p}
-refers to an existing path.
-\funcitem{isdir}{p}
-Returns true if
-{\tt p}
-refers to an existing directory.
-\funcitem{islink}{p}
-Returns true if
-{\tt p}
-refers to a directory entry that is a symbolic link.
-Always false if symbolic links are not supported.
-\funcitem{ismount}{p}
-Returns true if
-{\tt p}
-is an absolute path that occurs in the mount table as output by the
-{\tt /etc/mount}
-utility.
-This output is read once when the function is used for the first
-time.%
-\footnote{
-Is there a better way to check for mount points?
-}
-\funcitem{split}{p}
-Returns a pair
-{\tt (head,~tail)}
-such that
-{\tt tail}
-contains no slashes and
-{\tt path.cat(head, tail)}
-is equal to
-{\tt p}.
-\funcitem{walk}{p, visit, arg}
-%.br
-Calls the function
-{\tt visit}
-with arguments
-{\tt (arg, dirname, names)}
-for each directory in the directory tree rooted at
-{\tt p}
-(including
-{\tt p}
-itself, if it is a directory).
-The argument
-{\tt dirname}
-specifies the visited directory, the argument
-{\tt names}
-lists the files in the directory (gotten from
-{\tt posix.listdir(dirname)}).
-The
-{\tt visit}
-function may modify
-{\tt names}
-to influence the set of directories visited below
-{\tt dirname},
-e.g.,
-to avoid visiting certain parts of the tree.
-(The object referred to by
-{\tt names}
-must be modified in place, using
-{\tt del}
-or slice assignment.)
-\end{description}
-
-\subsection{Standard Module {\tt getopt}}
-
-This module helps scripts to parse the command line arguments in
-{\tt sys.argv}.
-It uses the same conventions as the {\UNIX}
-{\tt getopt()}
-function.
-It defines the function
-{\tt getopt.getopt(args, options)}
-and the exception
-{\tt getopt.error}.
-
-The first argument to
-{\tt getopt()}
-is the argument list passed to the script with its first element
-chopped off (i.e.,
-{\tt sys.argv[1:]}).
-The second argument is the string of option letters that the
-script wants to recognize, with options that require an argument
-followed by a colon (i.e., the same format that {\UNIX}
-{\tt getopt()}
-uses).
-The return value consists of two elements: the first is a list of
-option-and-value pairs; the second is the list of program arguments
-left after the option list was stripped (this is a trailing slice of the
-first argument).
-Each option-and-value pair returned has the option as its first element,
-prefixed with a hyphen (e.g.,
-{\tt '-x'}),
-and the option argument as its second element, or an empty string if the
-option has no argument.
-The options occur in the list in the same order in which they were
-found, thus allowing multiple occurrences.
-Example:
-\bcode\begin{verbatim}
->>> import getopt, string
->>> args = string.split('-a -b -cfoo -d bar a1 a2')
->>> args
-['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
->>> optlist, args = getopt.getopt(args, 'abc:d:')
->>> optlist
-[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
->>> args
-['a1', 'a2']
->>> 
-\end{verbatim}\ecode
-The exception
-{\tt getopt.error = 'getopt error'}
-is raised when an unrecognized option is found in the argument list or
-when an option requiring an argument is given none.
-The argument to the exception is a string indicating the cause of the
-error.
-
-\subsection{Standard Module {\tt rand}}
-
-This module implements a pseudo-random number generator similar to
-{\tt rand()}
-in C.
-It defines the following functions:
-\begin{description}
-\funcitem{rand}{}
-Returns an integer random number in the range [0 ... 32768).
-\funcitem{choice}{s}
-Returns a random element from the sequence (string, tuple or list)
-{\tt s.}
-\funcitem{srand}{seed}
-Initializes the random number generator with the given integral seed.
-When the module is first imported, the random number is initialized with
-the current time.
-\end{description}
-
-\subsection{Standard Module {\tt whrandom}}
-
-This module implements a Wichmann-Hill pseudo-random number generator.
-It defines the following functions:
-\begin{description}
-\funcitem{random}{}
-Returns the next random floating point number in the range [0.0 ... 1.0).
-\funcitem{seed}{x, y, z}
-Initializes the random number generator from the integers
-{\tt x},
-{\tt y}
-and
-{\tt z}.
-When the module is first imported, the random number is initialized
-using values derived from the current time.
-\end{description}
-
-\subsection{Standard Module {\tt stdwinevents}}
-
-This module defines constants used by STDWIN for event types
-({\tt WE\_ACTIVATE} etc.), command codes ({\tt WC\_LEFT} etc.)
-and selection types ({\tt WS\_PRIMARY} etc.).
-Read the file for details.
-Suggested usage is
-\bcode\begin{verbatim}
->>> from stdwinevents import *
->>> 
-\end{verbatim}\ecode
-
-\subsection{Standard Module {\tt rect}}
-
-This module contains useful operations on rectangles.
-A rectangle is defined as in module
-{\tt stdwin}:
-a pair of points, where a point is a pair of integers.
-For example, the rectangle
-\bcode\begin{verbatim}
-(10, 20), (90, 80)
-\end{verbatim}\ecode
-is a rectangle whose left, top, right and bottom edges are 10, 20, 90
-and 80, respectively.
-Note that the positive vertical axis points down (as in
-{\tt stdwin}).
-
-The module defines the following objects:
-\begin{description}
-\excitem{error}{rect.error}
-%.br
-The exception raised by functions in this module when they detect an
-error.
-The exception argument is a string describing the problem in more
-detail.
-\funcitem{empty}
-%.br
-The rectangle returned when some operations return an empty result.
-This makes it possible to quickly check whether a result is empty:
-\bcode\begin{verbatim}
->>> import rect
->>> r1 = (10, 20), (90, 80)
->>> r2 = (0, 0), (10, 20)
->>> r3 = rect.intersect(r1, r2)
->>> if r3 is rect.empty: print 'Empty intersection'
-Empty intersection
->>> 
-\end{verbatim}\ecode
-\funcitem{is\_empty}{r}
-%.br
-Returns true if the given rectangle is empty.
-A rectangle
-{\em (left,~top), (right,~bottom)}
-is empty if
-{\em left~$\geq$~right}
-or
-{\em top~$\leq$~bottom}.
-\funcitem{intersect}{list}
-%.br
-Returns the intersection of all rectangles in the list argument.
-It may also be called with a tuple argument or with two or more
-rectangles as arguments.
-Raises
-{\tt rect.error}
-if the list is empty.
-Returns
-{\tt rect.empty}
-if the intersection of the rectangles is empty.
-\funcitem{union}{list}
-%.br
-Returns the smallest rectangle that contains all non-empty rectangles in
-the list argument.
-It may also be called with a tuple argument or with two or more
-rectangles as arguments.
-Returns
-{\tt rect.empty}
-if the list is empty or all its rectangles are empty.
-\funcitem{pointinrect}{point, rect}
-%.br
-Returns true if the point is inside the rectangle.
-By definition, a point
-{\em (h,~v)}
-is inside a rectangle
-{\em (left,~top),}
-{\em (right,~bottom)}
-if
-{\em left~$\leq$~h~$<$~right}
-and
-{\em top~$\leq$~v~$<$~bottom}.
-\funcitem{inset(rect, }{dh, dv)}
-%.br
-Returns a rectangle that lies inside the
-{\tt rect}
-argument by
-{\tt dh}
-pixels horizontally
-and
-{\tt dv}
-pixels
-vertically.
-If
-{\tt dh}
-or
-{\tt dv}
-is negative, the result lies outside
-{\tt rect}.
-\funcitem{rect2geom}{rect}
-%.br
-Converts a rectangle to geometry representation:
-{\em (left,~top),}
-{\em (width,~height)}.
-\funcitem{geom2rect}{geom}
-%.br
-Converts a rectangle given in geometry representation back to the
-standard rectangle representation
-{\em (left,~top),}
-{\em (right,~bottom)}.
-\end{description}
-
-\subsection{Standard Modules {\tt GL} and {\tt DEVICE}}
-
-These modules define the constants used by the Silicon Graphics
-{\em Graphics Library}
-that C programmers find in the header files
-{\tt <gl/gl.h>}
-and
-{\tt <gl/device.h>}.
-Read the module files for details.
-
-\subsection{Standard Module {\tt panel}}
-
-This module should be used instead of the built-in module
-{\tt pnl}
-to interface with the
-{\em Panel Library}.
-
-The module is too large to document here in its entirety.
-One interesting function:
-\begin{description}
-\funcitem{defpanellist}{filename}
-%.br
-Parses a panel description file containing S-expressions written by the
-{\em Panel Editor}
-that accompanies the Panel Library and creates the described panels.
-It returns a list of panel objects.
-\end{description}
-
-{\bf Warning:}
-the {\Python} interpreter will dump core if you don't create a GL window
-before calling
-{\tt panel.mkpanel()}
-or
-{\tt panel.defpanellist()}.
-
-\subsection{Standard Module {\tt panelparser}}
-
-This module defines a self-contained parser for S-expressions as output
-by the Panel Editor (which is written in Scheme so it can't help writing
-S-expressions).
-The relevant function is
-{\tt panelparser.parse\_file(file)}
-which has a file object (not a filename!) as argument and returns a list
-of parsed S-expressions.
-Each S-expression is converted into a {\Python} list, with atoms converted
-to {\Python} strings and sub-expressions (recursively) to {\Python} lists.
-For more details, read the module file.
-
-\section{P.M.}
-
-\begin{verse}
-
-commands
-
-cmp?
-
-*cache?
-
-localtime?
-
-calendar?
-
-\_\_dict?
-
-mac?
-
-\end{verse}
+\input{mod1.tex}
+\input{mod2.tex}
+\input{mod3.tex}
 
 \end{document}
