$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 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 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, >RACE 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.