$Id: CHANGES,v 1.75 2024-01-01 04:06:59 phil Exp $

For detailed revision history see History file

CSNOBOL4 version 2.3.2 released 1/1/2024
On the 60th anniversary of first published article on SNOBOL in JACM 1/1/1964:
   https://dl.acm.org/doi/10.1145/321203.321207
In Honor of Mike Radow, a SNOBOL4 fan, who died 1/19/2023.

Changes since 2.3.1 release;
===========================

	Documentation fixes:
		snobol4host formatting
		snobol4load missing module.h include
	Portability:
		Clean up warnings from gcc v11
	Windows changes:
		Fix use of setupuptil.sno from non-distribution directories
		Change default install directory to C:\SNOBOL4
	Other:
		Fix Makefile2 dependencies: may allow parallel make?
		Quiet test/bench.sno output

Version 2.3.1

Changes since 2.3.0 release;
===========================

	Fix 32-bit compilation.
	Update snolib(3) man page

Version 2.3.0

Changes since 2.1.6 release;
===========================
	Compilation now requires an ANSI/ISO (C89/C90) C compiler,
	    will use C99 language extensions (available soon in MSC!)
	Text input no longer limited by "record length" (K flag obsolete).
	I/O code cleanup/refactor (wish list item since / last attempted 2002!)
	    read/write gzip/bzip2/xz format compressed files.
	    TLS (SSL) network connection I/O.
	Switch back to less precise MSTIME (runtime) reports of JUST user time.
	    This will effect timing reports.
	All output unbuffered with -U option, or SNOBOL4UNBUFFERED set in env.
	Library files:
	    json.sno -- JSON subset
	    tcp.sno, http.sno, url.sno: support TLS, https, https URLs
	Modules:
	    base64 (new): base64 encode/decode.
	    digest (new): Message Digest algorithms, using OpenSSL
	    fork: add GETPID, GETPPID functions
	    stat: fixed.
	       added "btime" (birth time), available on BSDs/MacOS/Cygwin/MSYS2
	    time: GETTIMEOFDAY return now has TV_NSEC member
	    zlib (new): (un)compress & checksum strings
	    EXTERNAL_DATATYPE and EXTERNAL_MODULE_{NAME,PATH} functions
	configure changes:
	    --force-pml removed (must use modules)
	    --without-modules added
	    more strict about feature tests
	MacOS: can now build modules w/ MacPorts libraries.
	Windows:
	    Builds by default with Winsock2 library
		for IPv6 support (available since in WinXP)
	    Fixed test for C++ compiler under cygwin
	    Experimental support for "Pseudo Consoles" on Windows 10
		(output will contain ANSI escape sequences)
	    Executable manifested for Windows 10
		(previously HOST() only showed "Win8" on Windows 10)
	    Implement EXIT('command to run')
	    Decode and format 64-bit integers on 64-bit MSVC compiles
	Portability fixes for Android, illumos (Solaris), MSYS2.
	Can build libsnobol4.so shared library / snobol4.dll;
	    EXPERIMENTAL
	    ssnobol4 executable using it is up to 8% slower
	    (likely due to position independent code
	     except perhaps on MacOS, where PIC is the default).
	    tlib.c is a small demo of invoking interpreter from a C
	     program.  (I'm not sure I see the point, since it's easy
	     enough to write temporary files, and invoke a subprocess!?)
	    Shared library API is in include/snobol4.h
	    No promises on future availability or stability!
	Changes to loadable function module API:
	    Allows return of strings in malloc'ed memory
		No longer copies into persistent malloc'ed memory.
	    Each handle pool can register a cleanup function when
		using new new_handle2() function
		(needed for shared library cleanup)

Changes since 2.0 release;
=========================
	Debugger improvements:
		added "run", "save" and "source" commands
		loads .sdbinit file, writes and reads .sdb_history file
		works correctly when readline not available
	New I/O options:
		E: close on exec (where supported by fopen)
		K: break up long lines
		X: exclusive open (where supported by fopen)
	Added "ezio" library (look!! no unit numbers!)
	Added ST_TYPE_STR to stat module (does what ST_TYPE was supposed to do!)
	LABELCODE() function returns CODE for a LABEL (ala SITBOL)
	Portability fixes (Solaris, 32-bit systems, DJGPP, Cygwin)
	Documentation improvements
	Supply READLINE stub if readline library not available (for sdb)
	Removed debug output from stcl

Changes since 1.5 release;
=========================
	Gimpel's BLOCKS extension (thanks to Mike Alexander for the files!)
	Split up man page:
		snobol4		Main page, references all pages
		snobol4cmd	Command line options
		snobol4blocks	BLOCKS functions
		snobol4ctrl	Compiler control lines
		snobol4error	Error codes
		snobol4ext	List of extensions to SNOBOL4
		snobol4func	List of all (non-BLOCKS) functions implemented
		snobol4io	Input/Output details
		snobol4key	List of keywords implemented
	Add &COMPNO (from SITBOL/SNOBOL4B)
	Added framework/utility "setuputil" for building loadable extensions
	Added new loadable extensions (all with snobol4<thing> man pages):
		dirs		Directory scanning
		ffi		Foreign Function Interface
		fork		Un*x/POSIX fork/waitpid
		sprintf		Numeric formatting function
		sqlite3		SQL database
		stat		File meta info
	Moved existing facilities into loadable extensions:
	    all already required use of an -INCLUDE file,
	    all with snobol4<thing> man pages:
		logic, ndbm, random, stcl, time, com
	All "handles" returned by loadable modules are now opaque (EXTERNAL)
	All documentation in "snopea" format (a small POD for SNOBOL)
		allows embedded documentation
		used to generate both man and HTML pages
	Added -N option (disable standard search directories)
	Added TIMEGM function to time module.
	Startup banner disabled when source files given on command line:
		-b always disables (used to toggle)
		-x always enables (new)
	sdb debugger: "ignore" command can now clear ignore count
	Fixed man page installation directory (reported by Mike Greenberg)
	Fixed FUNCTION TRACE (reported by Dani Richard)
	Fixed "finite", stcl & icc warnings (reported by Clem Cole)
	Fixed R(ETURN) TRACE

Changes since 1.4.1 release;
===========================
	Debugger (sdb) improvements:
	    At least 10 times faster!! no longer single steps all execution.
	    ^C, fatal errors and END statement return user to (sdb) prompt
	    sdb source lines no longer visible in debugger
	    "what" command
	    fixed "silent" commands
	Larger default stack and dynamic regions
	Extensions:
	    protected keywords: &DIGITS &PI &STEXEC &GCTIME &MAXINT
	    functions: FILE_ISDIR() FILE_ABSPATH()
	    single letters accepted for TRACE types. 
	    I/O w/ programs running under a pseudo-terminal (pty)
	    ^C (SIGINT) catchable w/ &ERRLIMIT/SETEXIT() as "User Interrupt"
	    Add include/library path:
		SNOPATH environment variable
		-I DIR command line option
	    Add "preloading"
		SNOBOL4_PRELOAD_PATH environment variable
		-L FILE command line option
	Document default INPUT record length
	manual page now includes all &ERRTYPE/&ERRTEXT values
	Fixes:
	    Display more digits for 64-bit REALs
	    READLINE() fixes on OS X / NetBSD
	    Fix compilation with Tcl 8.6
	    Allow new SETEXIT() trap w/o [S]CONTINUE
	    Allow command line -l - to mean list to stdout
	    Keyword TRACE output
	Portability:
	    Get more precise CPU times on Linux
	    Fix compilation on OpenBSD/MIPS
	    Display Window Server 2012
	    timing.bat sdb.bat files for Windows
	    Fixes for Beaglebone "Angstrom" Linux distribution
	    Allow full/development build on 64-bit platforms
	Timing changes:
	    Stats/timings show K (1000) lines per sec
	    Stats/timings show nanoseconds (ns) per statement
	    New benchmark: loops for better accuracy
		no longer depends on per-release input/code
	LOAD() improvements:
	    Fixed bug (name modified on LOAD() failure)
	    Most versions respect library path

Changes since 1.4 release;
=========================
	Install sdb man page
	Fix sdb test for readline
	Add random number regression test
	Fix Tcl search on Ubuntu
	Fix compilation on Solaris

Changes since 1.3 release;
=========================
	Added SPITBOL SETEXIT() function
	Added SNOBOL4 debugger "sdb" see doc/sdb.*, "man sdb"
	Added POSIX date/time handling functions, sleep function:
		see doc/snobol4time.*, "man snobol4time"
	Added high quality RANDOM() function; see "man snobol4random"
	Added GNU Readline/History functions; see "man snobol4readline"
	Added ATAN() and LN() functions
	Changed '-l' command line argument to take listing file name
	Fixed FUNCTION() predicate for referenced (but undefined) functions!
	Fixed problem in http.sno
	Fixed allocations of more than 4GB(!)
	Fixed compilation on Ubuntu 11.04, 11.10
	Fixed compilation with MS VS10
	Fixed compilation on CygWIN
	Report hypervisor name, if available
	Simplified tcl configuration
	
Changes since 1.2 release;
=========================
	Try to fetch X86 CPU identification using "cpuid" instruction
	Detect Ubuntu version
	Only use 64-bit libraries when running on 64-bit kernel
	Fixes for builds with older versions of Visual C
	Dectect Windows 7
	Fix Garbage Collection crashes after calling an external function
	Fix HTTP w/ DOC/WatTCP
	Fix MinGW compliation

Changes since 1.1 release;
=========================
	Support for new platforms:
		add "universal" (PPC and x86) configure option for MacOS X
		report CPU model name on "MacIntel"
		report "CPU CHIP TYPE" on HP-UX
		detect Windows on Windows64
		detect amd64 architecture on Windows
		detect Windows Server 2008
	Use $(MAKE) for all recursive make invocations
	Add --force-sdbm configure option
	Fix UTFLEN() to handle zero
	fix timing script to deal with AFS

Changes since 1.0 release;
=========================
	Added new (experimental) builtin function groups:
		"DBM" -- "ndbm" keyed database access
		"COM" -- COM/OLE Automation on Win32
		"STCL" -- SNOBOL/Tcl interface (optional)
	New library "dynamic.sno" to help compile/link
		dynamicly loadable extensions.
	Added HTTP.POST function to http.sno
	Handle environments where pointers can have high order bit set
		Linux 2.6 kernels in Fedora Core, SuSE 10 distributions
	Avoid broken "install" utilities
	autoconf compatibility: Honor CC, CFLAGS, CPPFLAGS,
		LDFLAGS, DESTDIR environment variables.
	Fix compilation on pre-panther OSX
	Fix second argument to DEFINE(): was not case folded!
	Fix backtracking over unevaluated expressions
	Source &FILE and &LINE shown in TRACE output
	Experimental: GC stats & tracing (-g on command line, &GTRACE keyword)
	Completed support for "memory I/O" when CSNOBOL4 used as a library!
	Added "PREDICATE" and "SYSPRED" return types in wrapper.sno

Changes since 0.99.44 release;
=============================
	Added snolib(3) man page for SNOBOL4 library routines
	Treat all bytes with 8th bit set as ALPHA on ASCII systems
		allows UTF-8 encoded characters, and national
		character sets to used in labels and identifiers!
	command line:
		-S option to enlarge interpreter stack
	configure:
		added --mandir & --bindir
	IPv6 Support (both client and server)
	bi-directional "pipe" I/O on systems with sockets
	"privileged" port binding for UDP
	Lots of cleanup!
		DJGPP (DOS gcc) fixes
		default to -O3 with gcc
		add C prototypes for all functions
			(function declarations still "K&R" style)
		MINGW (Win32 gcc) fixes
		Fix LOAD() on Darwin (MacOS X)
		Fix timing script on Debian
	Ported to HP-UX/IA64
	VMS:	LOAD() support (not tested)
		Compilation on VMS7.3
		support magic pathnames "/dev/null" and "/dev/tty"
	Win32:	native (low overhead) support for character console I/O
		support magic pathnames "/dev/null" and "/dev/tty"
		fixed UDP I/O
	Fix for parallel make (GNU make, BSD make)
	Compilation under MS Visual Studio .NET 2003
		Make struct descr packable (BITFIELDS_SAME_TYPE)
	Check for oversize integer constants (ERANGE from strtol())

Changes since 0.99.4 release;
============================

	Command line:
		-d (dynamic region size) and -M (pattern match stack size)
			now take values in descriptors
		-v shows CSNOBOL4 version

	Increased default dynamic space to 64K descriptors

	Fix faulty lexical comparison function optimzations for null string
		
	Performance improvments;
		New string hash function
		(reduced both compilation and run time of genc.sno by 5%)

		Optimized most common case (CONTIN actions) in
		"stream" operation used for lexical analysis.
		(reduced compilation time of genc.sno by 8%)

		Merged all scanner (pattern matching) functions into
		single C function (eliminates mutual recursion, stack
		overflows)
			genc runtime reduced 15%
			atn.sno runtime reduced by 63%!! (2.7x faster)
			worst case (4096 char string) reduced 69% (4.8x faster)
			snocone self-compile runtime reduced 5%

		Made pattern building functions (lib/pat.c) inlinable
			(8% reduction in genc.sno compile time)

		Eliminate space padding on lines read by compiler
			(reduced genc.sno compile time by 65%)

		Raised default C compiler optimization levels

	Default &MAXLNGTH to largest possible string

	Documentation:
		README file describes available includes

		Include PDF of manual page

	Implement fatal "Output error" for output, ENDFILE() errors

	Configuration script re-write;
		Eliminate static config files & autoconf script
		configure generates config.m4 and config.h
		(with all defines) for use by loadable functions

	New configuration options;
	**** see "INSTALL" file for more information ****
	--add-define=
		Add a #define to config.h (visible to external functions)
	--double
		EXPERIMENTAL option to use C "double" for SNOBOL4 REAL data type
	--fast
		Architecture specific optimizations on native compilers
	--longlong
		EXPERIMENTAL!!
		try to use C "long long" (64-bit integer) for INTEGER datatype
		when longs/pointers are only 32-bits (ILP32 data model).
	--lp64
		Request use of 64-bit long/pointer data model
		if available on this architecture, and not the default.
	--no-opt
		Compile without optimization

	New SNOBOL library files (see README);
		compatibility libraries:
			fence.sno, logic.sno, not.sno
			spitbol.sno, snobol4+.sno
		HOST() function codes:
			host.sno
		URL (http:, ftp:, file:) access functions

	Use large files (64-bit offsets) where available.  Allows access
		and creation of files larger than 2GB

	New functions;
		FUNCTION() -- predicate to test if a function is defined
			** EXPERIMENTAL **
		LABEL() -- predicate to test if a label is defined
			idea from Steve Duff's version of Macro SPITBOL
		ORD() -- inverse of CHAR()
		SERV_LISTEN() -- act as TCP server
		SSET() -- scaled SET() allow large files when INTEGER is 32bits
		VDIFFER() -- returns first arg if two arguments DIFFER()
			idea from Steve Duff's version of Macro SPITBOL

	Extended HOST() functions (see host.sno) for system diagnosis

	HOST() function will accept REAL or integer encoded STRING args

	TIME() function now returns REAL datatype allows both better
		resolution (for small values) and larger range.  Using
		32-bit floats, runtimes larger than four and a half
		hours will lose resolution.

	Statistics reports compiler and execution times as REAL numbers
		Average statement runtime reported in microseconds (us).

	Allow a REAL any place an INTEGER is required (from SNOBOL4+)
		Contexts include TABLE(),  ITEM(),  array  indices,
		INPUT(),  OUTPUT(),  SET(), keyword values, CHAR(),
		RPAD(), LPAD(), FIELD(), COLLECT(), DUMP(), DUPL(),
		OPSYN(), and SUBSTR()

	load.h updates;
		all RETxxx macros safe in any context
		RETSTR() takes single argument, allows NULL pointer
		RETSTR2() has old RETSTR() functionality
		RETINT() and RETREAL() always set return data type.

	All include files needed to build loadable functions
		installed in SNOLIB directory

	Include BSD tsort program; allow builds from scratch
		on platforms with GNU tsort (Linux, Cygwin)

	New ports;
		Ported to Darwin (MacOS X)

		Ported to Cygwin (http://cygwin.com), a free Unix emulation
			environment for Windows.

		Attempt at native Win32 port

		Updated Borland C port

		Updated VMS port; pipe open support, attempt at tty support

Changes since 0.99.3 release;
============================

	DATE() function takes an argument (per Catspaw SPITBOL)

	autoconf script takes --add-{cppflags,ldflags,objs,opt,srcs} options

	Support for LOAD() using dynamic libraries
		(works on SunOS4, SunOS5, IRIX, Digital Unix, Linux, NetBSD)
		Tentative support for HP-UX

	Speedups for BREAK(), BREAKX(), SPAN(), ANY(), and NOTANY()

	Cleaned up generated C code for function calls

	Trim tabs as well as spaces (&TRIM and TRIM())

	timing script reports hardware info on BSD, HP, Linux systems

	Floating point I/O;
		exponents allowed without decimals (ie; 1e10)
		'd' exponents removed; did not work
		will now output exponents

	Fixed getstring() with null string

	I/O changes;
		'T' mode implies unbuffered output for terminal prompts
		new magic path /dev/fd/N
		characters in excess of record length discarded on read
		New IO_FINDUNIT() function
		Unit numbers up to 256 now allowed

	Compiler line length uppped from 132 to 1024

	Allow long command lines to be passed via HOST(0) and &PARM

	Allow long strings returned from LOAD()'ed functions

Changes since 0.99.2 release;
============================

	Added OpenBSD to "autoconf"

	Ported back to HP-UX 7, DOS/Borland

	Fixed bug with EVAL() of long strings

	Fixed autoconf to handle bad strings.h (Solaris 2.4)

Changes since 0.99.1 release;
============================

	Portability/autoconfig improvements

	Added magic "/udp" pathname for UDP data

	Debugged "update" I/O

	Added functions to allow writing I/O subroutines to be
		added via "Poor Man's Load" (PML)

Changes since 0.99 release;
==========================

	Added I/O options (binary, noecho, etc)

	Added config file for 64-bit IRIX
		(64-bit integers, double-precision reals)

	Added magic "/tcp" pathname for opening TCP connections

	Fixed bugs with syntax errors detected by CODE() or EVAL()

	Syntax errors in CODE() or EVAL() set &ERRTEXT

	Fixed bugs with REWIND()

Changes since 0.91.2 release;
============================

Command line additions;
	command line arguments available to user (via HOST(2,n) and &PARM)
	-h gives help/usage
	-n toggles EXECUTE/NOEXECUTE setting
	-p toggles SPITBOL operators (enabled by default)
	-u passes argument string (for HOST(0))
	-P controls size of pattern match stack
	-M option required to compile multiple source files

Bugs fixed;
	lexical comparison of a string with a shorter prefix
	ANY() NOTANY() BREAK() SPAN() with 8-bit data
	removed trailing spaces in listings
	case folding handled properly in all contexts requiting NAMEs
	tabs handled properly in error messages

Other Changes;
	case folding always enabled in control card processing
	source file and line included in error messages
	new error messages for bad -INCLUDE lines
	PUNCH I/O variable removed

SPITBOL compatible features added;
	&ERRTEXT system variable
	&LINE, &FILE, &LASTLINE and &LASTFILE system variables
	&STLIMIT defaults to -1 (no limit)
	-EXECUTE/-NOEXECUTE control cards
	-LINE control card
	, alternation construct; (exp1, exp2, ....)
	= (assignment) operator
	? (scan) operator
	BREAKX() function
	CHAR() function
	EXIT() function (partial support)
	HOST() function
	LEQ(), LNE(), LLT(), LLE() and LGE() functions
	LPAD() and RPAD() functions
	NUMERIC type in CONVERT()
	REVERSE() function
	SORT() and RSORT() functions
	SQRT() function
	SUBSTR() function
	TERMINAL I/O variable
	leading spaces ignored when CONVERT()'ing to REAL and INTEGER

SNOBOL4+ compatible features added;
	&PARM system variable
	-PLUSOPS control card
	CHOP() function
	EXP() and LOG() functions
	FREEZE() and THAW() functions

SITBOL compatible features added;
	FILE() DELETE() and RENAME() functions

Other features added;
	Automatic LOAD()'ing of linked-in external C functions available
	REALs are double precision on Alpha under Digital Unix

IMPORTANT for users of versions prior to 0.99;
=============================================
	Configuration is now automatic.  DO NOT create config.m4 by
	hand!  some systems no longer have system specific config files.

	SPITBOL operators are enabled by default, this causes problems
	for the (very) rare program that OPSYN's the "?" binary operator!

	The PUNCH variable is no longer available; use TERMINAL.

	-d option takes size in bytes, not descriptors.
