                  ========================
                  Revision history of Tela
                  ========================

----------------------------------
Version 1.2 (Forthcoming)
----------------------------------

USER-VISIBLE CHANGES

- Improved helpgiving for t-functions. Added telahelp.sh shell script
  to do the pattern matching. Now help for t-functions works almost
  similarly as help for C-tela functions. (std.ct, telahelp.sh)
- Modified function sort: return index vector if 2 output args,
  sort complex vectors by real parts, disallow inplace sorting (std.ct).
- Added small utility functions limit and nrange (std.t)
- Added functions mapmin, mapmax (std.ct)
- Added functions cumsum, cumprod (std.ct)
- prod(<integer array>) now returns real result if overflow would
  result in integer multiplication (std.ct)
- Added optional second input arg to sum, prod, mapmin, mapmax;
  like sum(A,1): sum only over first dimension (std.ct)
- Added optional second output argument to return min/max position
  to min, max, mapmin, mapmax (intrinsic.C, std.ct)
- mean and stddev also support second argument (std.t)
- zeros, izeros, czeros now support integer vector argument,
  so you can use zeros(size(a)) etc. Also improved error checking
  in these opcodes (prg.C)
- Added function export_RIS8 (files.ct)
- Added function remove (fileio.ct)
- Function length now returns 0 for VOID object
- Added a full set of FFT functions. There are now 12 functions:
  FFT, realFFT, sinFFT, cosFFT, sinqFFT, cosqFFT, and the inverses.
  A test module testfft.t was also added. These functions can take
  the transform along any dimension in a multidimensional array.
  (fft.ct, fftpack.H).

BUG FIXES (-Read carefully. Why so many this time?)

- Fixed bugs with arithmetic operations where output operand is the
  same variable as one of the input operands and where the input operands
  would be an illegal combination of noncompatible arrays. Previously Tela
  failed to give an error message and the result was garbage (objarithm.C,
  templ/*.C).
- Fixed bugs with negative real or integer x in x^y, when y is real.
  Previously e.g. (-1)^2.3 produced random garbage, now it produces
  a complex number as it should. This required taking Pow() away from
  template file tbinop.C and incorporating it explicitly in objarithm.C.
- Fixed a major memory leak in the lexical analyzer -- the input buffer
  was never deallocated! There is now fixed by defining an explicit
  destructor in d.l, but this should really be handled by flex++ automatically.
- Assignment x=x produced garbage because object assignment failed to
  check for identical objects being assigned (prg.C)
- As a general rule, operations are only permitted on equal-sized arrays.
  An exeption is that one of the operands may be a vector, e.g.
  rand(3) + rand(1,3) is allowed. Garbage resulted if both operands were
  complex arrays, for example 1i*rand(3)+1i*rand(1,3) (try it!).
  This was fixed at the end of templ/tbinop.C. But I'm not quite sure whether
  a similar bug might still hang out somewhere. A final solution to this
  problem would be to disallow the abovementioned extra liberty, but then
  again I'm not quite sure if something else breaks. Be prepared that someday
  rand(3) + rand(1,3) may be forbidden.
- Made where() to work for scalar arguments also (std.t)
- Mflops rates for complex operations are now somewhat closer to
  reality (objarithm.C, templ/tbinop.C)
- (Minor point) Removed self-overhead in perf() (std.ct)
- prod(<real-or-complex-array>) returned always 0. Fixed (std.ct)

INTERNAL CHANGES

- Added new machine instruction MMPOS (return last MIN/MAX position)
  (machine.H, machine.C, prg.C, Ctgen.C)

OTHER

- Started a special function package (not yet in public)

----------------------------------
Version 1.13 (Released 20.12.1994)
----------------------------------

USER-VISIBLE CHANGES

- Added function chol for Cholesky decomposition (la.ct, lapack.H)
- Added some color and line style definitions (telainit.t)
- Added functions autoglobal and hidesym (std.ct)
- Functions size, length and arg now cause error on undefined argument (std.ct)
- Added function telapath (std.ct)
- Enhanced function hist to handle two output arguments (plotmtv.ct)
- Added function source_silent (std.ct)
- Tries to source (silently) ~/.telainit.t on startup (telainit.t)

BUG FIXES

- export_matlab("f",[variable-list]) actually saved all variables.
  Now it saves only specified ones, as it should (files.ct: missed
  if (DoWrite)... in export_matlab). Thanks to Irix6.0 CC compiler
  for detecting this!!
- export_matlab now saves strings as row vectors, which is usually
  what is wanted.
- A'**B did not work. This was because matprod() did not accept
  int valued third argument but only char-valued (la.ct).
- function run left one file descriptor open if called without inputs (std.ct)
- several m2t fixes

INTERNAL CHANGES

- HPUX support

----------------------------------
Version 1.12 (Released 8.11.1994)
----------------------------------

INTERNAL CHANGES

- AIX support (configure.in; see also grep _AIX *.C *.H; see below)
- changed int->Tint in TDimPack members (object.H, object.C).
  Also in some places in gatscat.C. Should allow more flexibility with Tint.
- configure now tries to detect if pointer size (sizeof(char*) etc.) is longer
  than sizeof(int) and to define TPtrInt accordingly. This is needed in some
  Alpha/OSF systems.

KNOWN PROBLEMS

- To compile under AIX, you have to manually edit file d.y.c.
  Locate the lines

#ifndef __GNUC__
#include <alloca.h>
#endif

   Change these to

#ifndef __GNUC__
#ifdef _AIX
#  include <malloc.h>
#else
#  include <alloca.h>
#endif

   and you are done.

----------------------------------
Version 1.11 (Released 25.10.1994)
----------------------------------

USER-VISIBLE CHANGES

- Parser now recognizes the statements a+=b, a-=b, a*=b, a/=b (d.l, d.y)
- MTV options can be given to any graphics command (plotmtv.ct)
  (for example, plot(x,y,"-3d -landscape") works)
- Started new t-file matmenu.t
- Added functions matmenu, smatmenu (matmenu.t)
- Fixed some HTML link problems in documentation and wrote
  example file (telagraphs.html)

BUG FIXES

- Bugs associated with break and continue statements fixed. Previously worked
  incorrectly if used outside loops (now are ignored with a warning).
- Dividing integer array by integer scalar resulted in crash, for example:
  v = 1:5; v/=5; (objarithm.C:Div(), branch KIntArray,Kint, moved copydimsRealArray
  inside if statement).

INTERNAL CHANGES

- Tidy-up of codegen.C (classes TBreakPoint, TBreakPointList, Tcompilation),
  also fixed the abovementioned break/continue bugs. Thought about syntax
  break n; continue n (n positive integer), this should now be rather easy
  to implement if wanted (just replace LoopLevel-1 by LoopLevel-n in 
  FCONTINUE, FBREAK in codegen.C).

----------------------------------
PLANS FOR FUTURE VERSIONS (>=1.2):
----------------------------------
- Object arrays (lists), plus some new syntax for constructing them.
- Record/struct notation built on object arrays and associated syntax extension.
- Methods to write functions with arbitrary number of args may change.
  If you use the intrinsics argin, argout, SetArgOut a lot, contact the author!
- Current Tela does function definitions in code generation phase.
  Therefore you can use functions in t-files even if they are defined later
  in the file. But this also means that it is impossible to attach function
  definitions to local variables. This practice may change, so it is best to
  use functions only after they are defined in t-files. No severe problems should
  ever result, however, you could always fix them by doing some reordering.
  Ultimately functions should become Group A citizens, and there should
  also be a mechanism for writing pure functions (a'la lambda in lisp).

----------------------------------
Version 1.1 (Released 4.10.1994)
----------------------------------

USER-VISIBLE CHANGES
- Modifying function input arguments now causes a warning (prg.C, codegen.C)
- Added function holdmode (plotmtv.ct)
- Added function bar (plotmtv.ct) and a new demo that uses it
- Added function hist (plotmtv.ct)
- Added functions strmat, strmat2 (std.ct)
- Added function where (std.t)
- Modified tostring to stop on zero and to work for rank>1 also (std.ct)
- Added functions hide, unhide (std.ct)
- Added optional arg to whos to include hidden symbols (std.ct)
- Started new C-tela module fileio.ct
- Added functions fopen, fclose, fformat, printf, fprintf, sprintf (fileio.ct)
  (thus far sprintf only works for two args and may overflow).
  Fformat, sformat were already there.
- Added function export_matlab2 for variable name control (files.ct)
- Started new C-tela module numerics.ct
- Added function intpol for linear interpolation of N-dimensional arrays
  (numerics.ct).
- Added function grid3 (plotmtv.ct)
- Enhanced import1 to read "plain" ASCII files (files.ct)
- Added functions perf, GetInstructionData for telametric measurements (std.ct)
- Started new T-file perf.t
- Added telametric functions Mflops and Mips (perf.t)
- Started new T-file poly.t
- Added functions polyval, roots (poly.t)

BUG FIXES & alterations of weirdish featurings
- f(,x) no longer core dumps but produces syntax error (d.y: arglist_nonempty)
- A = A[i:j,k:l] now works correctly (gatscat.C:introduced Tobject a1
  in Gather) Previously worked incorrectly for rank>1 arrays.
- Made string matrices output as such (object.C). Tobedone: generalize to
  rank>2. Useful?
- Fixed bugs with SysVish CPUSeconds() (Solaris-2) (tela.C, common.H) that was
  introduced in 1.04. Thanks to Antti.J.Tanskanen@helsinki.fi!!
- Extracting part of a integer array carrying string flag now yields
  string flagged array.
- [a[1],b[3]] = f() has never worked correctly, but is now forbidden also (d.y)
  (only identifiers are allowed, as in [a,b] = f()).

INTERNAL CHANGES
- Now uses PlotMTV1.4.0
- 'Hidden' attribute for symbols (symbol.H); make attributes bitfields
- Allows chaining of indexing: a[1][2] etc (d.y)
- New flatcode instruction OZEROS
- New intrinsic function voids() for constructing object arrays.
  It is for now undocumented because object array support is still partial.
- Various documentation and configuration enhancements

----------------------------------
Version 1.04 (Released 8.9.1994)
----------------------------------

USER-VISIBLE CHANGES

- Added LUbacksubst function (la.ct)
- [lu,p] = LU(A) now returns pivot vector in p (previously returned
  the permutation matrix).
- Added function version() (std.ct)
- Added read pipe support (FindAndOpenFile() in tela.C).
  Example: source("!rsh uranus 'cat fyle.t'");
  (Tobedone: now fclose is used also for these -- any harm?)
- Added t-file madala.t (general elliptic solver).
- Added function run (std.ct)

BUG FIXES

- Fixed FindMachineEpsilon() to give correct result also in Linux (tela.C)
- v = rand(10); v[2:5] = -2.3; is now legal. I.e. implicit promotion
  of a scalar (-2.3) to a vector (#(-2.3,-2.3,-2.3,-2.3)) before
  indexed assignment. Before this was only permissible if rank(v)
  was greater than one, which was so bizarre feature that I consider
  it a bug.
- Removed redefinition of YY_READ_BUF_SIZE (d.l). 512bytes is too small.
- Removed exiting after error in argument file (tela.C)
- Removed TObjectStack destructor since it only causes core dumps (prg.C)

INTERNAL CHANGES

- Added SysVish /proc based CPUSeconds() support (for Solaris2)
- Possibility to increase MAXRANK from 4 to 8 by just changing
  a #define in def.H. To go beyond 8-dimensional arrays (!) you
  would have to modify gatscat.C. The default MAXRANK will stay
  at 4. Increasing it from four will increase the memory consumption
  somewhat and may also slightly degrade performance.

----------------------------------
Version 1.03 (Released 23.8.1994):
----------------------------------

USER-VISIBLE CHANGES

- Previously all arithmetic ops for two arrays were allowed, iff the
  LENGTHs of the arrays were equal. This means eg. that A+A' was legal.
  No more. Now the dimensions must agree, unless one of the operands
  is a vector, in which case it is sufficient that the lengths agree.
  For example if A=rand(2,3), B=rand(3,2), V=rand(6), then
  A+V and B+V are legal but A+B is not. The type of the result is the
  type of the first operand, ie. A+V is a matrix but V+A is a vector.
  Internally, this change amounts to introducing TDimPack::iscompatible
  and calling it in objarithm.C and templ/*.C with LengthError.
- Comparison a==b or a!=b where a or b is undefined now leads to error
  (templ/teqop.C, at end).
- Assignment a=b where b is undefined now leads to error (prg.C).
- Added function(al) map (std.ct)
- Added support for TELAPATH_SYSTEM environment variable, which is
  read before TELAPATH

BUG FIXES

- SGI: FFT did not work on Irix5.2 because wrong routines from
  libcomplib_sgimath.a were linked in. The complib_sgimath preceded
  libfftpack.a on link line, when the order was reversed, FFT
  started working again

INTERNAL CHANGES

- Moved some doc files to doc, reorganized local/ directory and
  made corresponding changes in Makefile, makeinc.in and local/makeinc.
  Also needed to change mkdocfile.
- Several ./configure enhancements

-------------
Version 1.02:
-------------
- numerous formal 'const' related changes in source code, to enable
  compilation under g++-2.6.0
- reintroduced ifdef BROKEN_UCHAR_OUTPUTTER in def.H.
  You must define it if your compiler output a hex address in case of
  cout << (const unsigned char*)ptr;

-------------
Version 1.01:
-------------
- enhanced Tobject assignment ops (object.H, object.C)
- telakka.in: can mix options with cc opts; some internal beautification
- other very minor changes

-----------------------------
3.8.94:		Tela-1.0 released
-----------------------------





