Summary of changes for version 2.0:
----------------------------------

  * New data types can be added to Octave by writing a C++ class.  On
    systems that support dynamic linking, new data types can be added
    to an already running Octave binary.  A simple example appears in
    the file examples/make_int.cc.  Other examples are the standard
    Octave data types defined in the files src/ov*.{h,cc} and
    src/op-*.cc.  [This feature should be better documented by the
    time 2.0 is released].

  * The configure option --enable-bounds-check turns on bounds
    checking on element references for Octave's internal array and
    matrix classes.  It's enabled by default.  To disable this
    feature, configure Octave with --disable-bounds-check.

  * The C-style I/O functions (fopen, fprintf, etc.) have been
    rewritten to be more compatible with Matlab.  The fputs function
    has also been added.  Usage of the *printf functions that was
    allowed in previous versions of Octave should still work.
    However, there is no way to make the new versions of the *scanf
    functions compatible with Matlab *and* previous versions of
    Octave.  An optional argument to the *scanf functions is now
    available to make them behave in a way that is compatible with
    previous versions of Octave.

  * The interface to the pager has changed.  The new built-in variable
    `page_output_immediately' controls when Octave sends output to the
    pager.  If it is nonzero, Octave sends output to the pager as soon
    as it is available.  Otherwise, Octave buffers its output and
    waits until just before the prompt is printed to flush it to the
    pager.

  * Expressions of the form

      A(i,j) = x

    where X is a scalar and the indices i and j define a matrix of
    elements now work as you would expect rather than giving an error.
    I am told that this is how Matlab 5.0 will behave when it is
    released.

  * Indexing of character strings now works.

  * The echo command has been implemented.

  * The document command is now a regular function.

  * New method for handling errors:

      try
        BODY
      catch
        CLEANUP
      end_try_catch

    Where BODY and CLEANUP are both optional and may contain any
    Octave expressions or commands.  The statements in CLEANUP are
    only executed if an error occurs in BODY.

    No warnings or error messages are printed while BODY is
    executing.  If an error does occur during the execution of BODY,
    CLEANUP can access the text of the message that would have been
    printed in the builtin constant __error_text__.  This is the same
    as eval (TRY, CATCH) (which may now also use __error_text__) but
    it is more efficient since the commands do not need to be parsed
    each time the TRY and CATCH statements are evaluated.

  * Octave no longer parses the help command by grabbing everything
    after the keyword `help' until a newline character is read.  To
    get help for `;' or `,', now, you need to use the command
    `help semicolon' or `help comma'.

  * Octave's parser now does some simple constant folding.  This means
    that expressions like 3*i are now evaluated only once, when a
    function is compiled, and the right hand side of expressions like
    a = [1,2;3,4] are treated as true matrix constants rather than
    lists of elements which must be evaluated each time they are
    needed.

  * Built-in variables that can take values of "true" and "false" can
    now also be set to any nonzero scalar value to indicate "true",
    and 0 to indicate "false".

  * New built-in variables `history_file', `history_size', and
    `saving_history'.

  * New built-in variable `string_fill_char' specifies the character
    to fill with when creating arrays of strings.

  * If the new built-in variable `gnuplot_has_frames' is nonzero,
    Octave assumes that your copy of gnuplot includes support for
    multiple plot windows when using X11.

    If the new built-in variable `gnuplot_has_multiplot' is nonzero,
    Octave assumes that your copy of gnuplot has the multiplot support
    that is included in recent 3.6beta releases.

    The initial values of these variables are determined by configure,
    but can be changed in your startup script or at the command line
    in case configure got it wrong, or if you upgrade your gnuplot
    installation.

  * The new plot function `figure' allows multiple plot windows when
    using newer versions of gnuplot with X11.

  * Octave now notices when the plotter has exited unexpectedly.

  * New built-in variable `warn_missing_semicolon'.  If nonzero, Octave
    will warn when statements in function definitions don't end in
    semicolons.  The default value is 0.

  * Octave now attempts to continue after floating point exceptions
    or out-of-memory errors.

  * If Octave crashes, it now attempts to save all user-defined
    variables in a file named `octave-core' in the current directory
    before exiting.

  * It is now possible to get the values of individual option settings
    for the dassl, fsolve, lsode, npsol, qpsol, and quad functions
    using commands like

      dassl_reltol = dassl_options ("relative tolerance");

  * The svd() function no longer computes the left and right singular
    matrices unnecessarily.  This can significantly improve
    performance for large matrices if you are just looking for the  
    singular values.

  * The filter() function is now a built-in function.

  * New function randn() returns a pseudo-random number from a normal
    distribution.  The rand() and randn() functions have separate
    seeds and generators.

  * Octave's command-line arguments are now available in the built-in
    variable `argv'.  The program name is also available in the
    variables `program_invocation_name' and `program_name'.  If
    executing a script from the command line (e.g., octave foo.m) or
    using the `#! /bin/octave' hack, the program name is set to the
    name of the script.

  * New built-in variable `completion_append_char' used as the
    character to append to successful command-line completion
    attempts.  The default is " " (a single space).

  * Octave now uses a modified copy of the readline library from
    version 1.14.5 of GNU bash.

  * In prompt strings, `\H' expands to the whole host name.

  * New built-in variable `beep_on_error'.  If nonzero, Octave will try
    to ring your terminal's bell before printing an error message.
    The default value is 0.

  * New command-line argument --traditional sets the following
    preference variables for compatibility with Matlab:

      PS1                           = ">> "
      PS2                           = ""
      beep_on_error                 = 1
      default_save_format           = "mat-binary"
      define_all_return_values      = 1
      do_fortran_indexing           = 1
      empty_list_elements_ok        = 1
      implicit_str_to_num_ok        = 1
      ok_to_lose_imaginary_part     = 1
      page_screen_output            = 0
      prefer_column_vectors         = 0
      prefer_zero_one_indexing      = 1
      print_empty_dimensions        = 0
      treat_neg_dim_as_zero         = 1
      warn_function_name_clash      = 0
      whitespace_in_literal_matrix  = "traditional"

  * New functions:

      readdir  -- returns names of files in directory as array of strings
      mkdir    -- create a directory
      rmdir    -- remove a directory
      rename   -- rename a file
      unlink   -- delete a file
      umask    -- set permission mask for file creation
      stat     -- get information about a file
      lstat    -- get information about a symbolic link
      more     -- turn the pager on or off
      gammaln  -- alias for lgamma

  * New audio functions from Andreas Weingessel
    <Andreas.Weingessel@ci.tuwien.ac.at>.

      lin2mu     -- linear to mu-law encoding
      loadaudio  -- load an audio file to a vector
      mu2lin     -- mu-law to linear encoding
      playaudio  -- play an audio file
      record     -- record sound and store in vector
      saveaudio  -- save a vector as an audio file
      setaudio   -- executes mixer shell command

  * New plotting functions from Vinayak Dutt.  Ones dealing with
    multiple plots on one page require features from gnuplot 3.6beta
    (or later).

      bottom_title  -- put title at the bottom of the plot
      mplot         -- multiplot version of plot
      multiplot     -- switch multiple-plot mode on or off
      oneplot       -- return to one plot per page
      plot_border   -- put a border around plots
      subplot       -- position multiple plots on a single page
      subwindow     -- set subwindow position for next plot
      top_title     -- put title at the top of the plot
      zlabel        -- put a label on the z-axis

  * New string functions

      bin2dec  -- convert a string of ones and zeros to an integer
      blanks   -- create a string of blanks
      deblank  -- delete trailing blanks
      dec2bin  -- convert an integer to a string of ones and zeros
      dec2hex  -- convert an integer to a hexadecimal string
      findstr  -- locate occurrences of one string in another
      hex2dec  -- convert a hexadecimal string to an integer
      index    -- return position of first occurrence a string in another
      rindex   -- return position of last occurrence a string in another
      split    -- divide one string into pieces separated by another
      str2mat  -- create a string matrix from a list of strings
      strrep   -- replace substrings in a string
      substr   -- extract a substring

    The following functions return a matrix of ones and zeros.
    Elements that are nonzero indicate that the condition was true for
    the corresponding character in the string array.

      isalnum   -- letter or a digit
      isalpha   -- letter
      isascii   -- ascii
      iscntrl   -- control character
      isdigit   -- digit
      isgraph   -- printable (but not space character)
      islower   -- lower case
      isprint   -- printable (including space character)
      ispunct   -- punctuation
      isspace   -- whitespace
      isupper   -- upper case
      isxdigit  -- hexadecimal digit

    These functions return new strings.

      tolower  -- convert to lower case
      toupper  -- convert to upper case

  * New function, fgetl.  Both fgetl and fgets accept an optional
    second argument that specifies a maximum number of characters to
    read, and the function fgets is now compatible with Matlab.

  * Printing in hexadecimal format now works (format hex).  It is also
    possible to print the internal bit representation of a value
    (format bit).  Note that these formats are only implemented for
    numeric values.

  * Additional structure features:

    -- Name completion now works for structures.

    -- Values and names of structure elements are now printed by
       default.  The new built-in variable `struct_levels_to_print'
       controls the depth of nested structures to print.  The default
       value is 2.

    -- New functions:

       struct_contains (S, NAME) -- returns 1 if S is a structure with
                                    element NAME; otherwise returns 0.

       struct_elements (S)       -- returns the names of all elements
                                    of structure S in an array of strings. 

  * New io/subprocess functions:

      fputs    -- write a string to a file with no formatting
      popen2   -- start a subprocess with 2-way communication
      mkfifo   -- create a FIFO special file
      popen    -- open a pipe to a subprocess
      pclose   -- close a pipe from a subprocess
      waitpid  -- check the status of or wait for subprocesses

  * New time functions:

      asctime    -- format time structure according to local format
      ctime      -- equivalent to `asctime (localtime (TMSTRUCT))'
      gmtime     -- return time structure corresponding to UTC
      localtime  -- return time structure corresponding to local time zone
      strftime   -- print given time structure using specified format
      time       -- return current time

    The `clock' and `date' functions are now implemented in M-files
    using these basic functions.

  * Access to additional Unix system calls:

      dup2     -- duplicate a file descriptor
      exec     -- replace current process with a new process
      fcntl    -- control open file descriptors
      fork     -- create a copy of the current process
      getpgrp  -- return the process group id of the current process
      getpid   -- return the process id of the current process
      getppid  -- return the process id of the parent process
      getuid   -- return the real user id of the current process
      getgid   -- return the real group id of the current process
      geteuid  -- return the effective user id of the current process
      getegid  -- return the effective group id of the current process
      pipe     -- create an interprocess channel

  * Other new functions:

      tmpnam              -- replaces octave_tmp_file_name
      atexit              -- register functions to be called when Octave exits
      putenv              -- define an environment variable
      meshgrid            -- compatible with Matlab's meshgrid function
      tilde_expand        -- perform tilde expansion on string
      completion_matches  -- perform command completion on string

  * Functions for getting info from the password database on Unix systems:

      getpwent  -- read entry from password-file stream, opening if necessary
      getpwuid  -- search for password entry with matching user ID
      getpwnam  -- search for password entry with matching username
      setpwent  -- rewind the password-file stream
      endpwent  -- close the password-file stream

  * Functions for getting info from the group database on Unix systems:

      getgrent  -- read entry from group-file stream, opening if necessary
      getgrgid  -- search for group entry with matching group ID
      getgrnam  -- search for group entry with matching group name
      setgrent  -- rewind the pgroup-file stream
      endgrent  -- close the group-file stream

  * The New function octave_config_info returns a structure containing
    information about how Octave was configured and compiled.

  * New function getrusage returns a structure containing system
    resource usage statistics.  The `cputime' function is now defined
    in an M-file using getrusage.

  * The info reader is now a separate binary that runs as a
    subprocess.  You still need the info reader distributed with
    Octave though, because there are some new command-line arguments
    that are not yet available in the public release of Info.

  * There is a new built-in variable, INFO_PROGRAM, which is used as
    the name of the info program to run.  Its initial value is
    $OCTAVE_HOME/lib/octave/VERSION/exec/ARCH/info, but that value can
    be overridden by the environment variable OCTAVE_INFO_PROGRAM, or
    the command line argument --info-program NAME, or by setting the
    value of INFO_PROGRAM in a startup script.

  * There is a new built-in variable, EXEC_PATH, which is used as
    the list of directories to search when executing subprograms.  Its
    initial value is taken from the environment variable
    OCTAVE_EXEC_PATH (if it exists) or PATH, but that value can be
    overridden by the the command line argument --exec-path PATH, or
    by setting the value of EXEC_PATH in a startup script.  If the
    EXEC_PATH begins (ends) with a colon, the directories
    $OCTAVE_HOME/lib/octave/VERSION/exec/ARCH and $OCTAVE_HOME/bin are
    prepended (appended) to EXEC_PATH (if you don't specify a value
    for EXEC_PATH explicitly, these special directories are prepended
    to your PATH).

  * If it is present, Octave will now use an `ls-R' database file to
    speed up recursive path searching.  Octave looks for a file called
    ls-R in the directory specified by the environment variable
    OCTAVE_DB_DIR.  If that is not set but the environment variable
    OCTAVE_HOME is set, Octave looks in $OCTAVE_HOME/lib/octave.
    Otherwise, Octave looks in the directory $datadir/octave (normally
    /usr/local/lib/octave).

  * New examples directory.

  * There is a new script, mkoctfile, that can be used to create .oct
    files suitable for dynamic linking.

  * Many more bug fixes.

  * ChangeLogs are now kept in each subdirectory.

See NEWS.1 for old news.
