--- /dev/null
+This is the long-form history of the project. For the short form used
+to generate release announcements, see NEWS.
+
+== Release 0.29 (by Alex Smith, Eric S. Raymond) ==
+
+=== Changes by Eric S. Raymond ===
+
+1. There is now a compiler regression-test suite, invoked through the test
+ production in the pit makefile.
+
+2. There are two new compiler error messages, E990 and E994.
+
+3. A new program for the pit: Brendan Gregg's guess game.
+
+4. The floating-point library is now automatically included if
+ a program NEXTs to labels in the range 5000-5999. Internally,
+ line-range to system library mappings are no longer hardcoded but
+ rather declared as an array of associations that can be easily
+ modified.
+
+5. The source now uses explicit bool, rather than using int everywhere.
+
+6. README, HISTORY, and BUGS are now mastered in asciidoc for easier
+ web-page generation.
+
+=== Bugs reported and changes patched by Arvid Norlander ===
+
+7. Fixed a typo in the perpet.c version of the help information.
+
+8. Fixed the CREATE statement to work on 64-bit architectures.
+
+9. The availability of variable argument list mechanisms is now determined
+ automatically by the configure script, rather than relying on the old
+ method of checking which usually gets the wrong answer with modern
+ compilers, leading to build failures on many modern systems (previously
+ this was patched just for DJGPP, the patch now applies to all operating
+ systems and platforms). This bug is known to have affected the build on
+ DOS, FreeBSD and Mac OS X, and possibly affects other platforms. (also
+ reported independently by Elliott Hird)
+
+10. Fixed some nonsense in the -@ help screen that was generated by an errant
+ search-and-replace.
+
+11. Made several changes to bring the new Befunge-98 interface code (see
+ below) in line with changes in the Befunge-98 interpreter in use.
+
+12. Added consts and statics in the code, hopefully to make bugs easier to
+ notice.
+
+13. Refactored main(). It needed it, badly.
+
+=== Bugs reported by Elliott Hird ===
+
+14. Fixed the configure script to work with the default Debian shell dash.
+ (also reported independently by Debian)
+
+15. Actually fixed unlambda.i; the fix was meant to be in 0.28, and is
+ described in its changelog, but for some reason never made it to
+ the distributed tarball.
+
+16. The -F option again works. (AIS: I accidentally broke it in the preceding
+ version, making it basically a no-op by mistake.)
+
+17. The build now succeeds (with warnings) when lex or yacc are missing,
+ rather than failing with mysterious error messages that seem to have
+ nothing to do with the problems. (The success is made possible by using
+ the prebuilt versions; see change 11 of version 0.26, this is finishing
+ what that started.)
+
+=== Bugs reported, changes requested, and patches by Joris Huizer ===
+
+18. The [xoritself] optimiser idiom has been generalised to handle some
+ situations where the redundant XOR operands are on different grouping
+ levels; this helps to optimise some heavily inlined greater-than tests.
+
+19. Fixed unary operators applied to constants (AIS: it seems that my patch to
+ solve this issue earlier was itself buggy).
+
+20. The -g option now causes optimisation of the output compiled C to be
+ turned off, and adds comments to the output file the same way -c does.
+
+21. Added more optimiser idioms: [cxorand16], [cxorand32], [cfoldintoorinand],
+ [or16and], [xor16and], [lshift32half], [rshiftoutofneg], [andoutofneg];
+ also generalised the idiom-matching code to compare 16-bit and 32-bit
+ constants as equal if they have the same value, and fixed some typos in
+ the current 16-bit complement idioms.
+
+22. ABSTAINING or REINSTATING are now a lot more efficient, taking an amount
+ of time proportional to the number of commands effected, rather than the
+ number of commands in the program. (AIS: I implemented this with the
+ algorithm in the patch Joris provided, but with different code, to make it
+ easier to maintain.)
+
+=== Changes by Stefan O'Rear ===
+
+23. Added INTERCAL syntax highlighting information for vim. Why should Emacs
+ have all the fun?
+
+=== Changes reported by Phantom Hoover ===
+
+24. Fixed a nasty documentation typo.
+
+=== Changes reported by the Debian autobuilders and Joey Hess ===
+
+25. The build of the optimiser idioms is now split over many files, to reduce
+ the memory usage of gcc when it tries to compile the giant output C file.
+ This was a problem on ia64. (The ulimit method of preventing thrashing has
+ been removed, as this method works better; likewise, the optimiser
+ optimisation now works again.)
+
+=== Changes by Alex Smith ===
+
+26. The build system has been completely redone, again; it now uses automake
+ as well as a much newer version of autoconf. This means that there is now
+ one build system that works the same way on all systems, and that all
+ sorts of clever tricks like out-of-tree builds, a self-rebuilding build
+ system, and building the distribution directly from the Makefile, are
+ possible. As a side effect, the directory structure looks somewhat
+ different to how it looked in previous versions; src, doc, etc and pit are
+ still there, but now there's prebuilt instead of temp, an extra directory
+ buildaux, and bin, lib and include have disappeared.
+
+27. The distribution now comes in compressed pax format. (Before anyone
+ complains that they have no idea what that is, or that I'm using something
+ strange and nonstandard, I'd like to point out that tar is no longer part
+ of POSIX, but that pax is. (See man 5 tar on a recent Linux system for
+ details of the whole mess.) Luckily, pax is forward-compatible with tar
+ so tar readers should be able to read it just fine, if you can't get your
+ hands on a pax reader.)
+
+28. convickt can now produce its output as INTERCAL initialisation of a tail
+ array. (This doesn't auto-offset between the different characters; it is
+ therefore mostly useful for producing Baudot arrays for CLC-INTERCAL-style
+ IO.)
+
+29. The function clock_gettime is now supported by the yuk profiler as an
+ alternative method of getting a high-resolution clock for profiling (it
+ is available on at least Linux).
+
+30. The profiler now autodetects the same profiling mechanism at compile
+ time and at run time. (It was getting confused as to what mechanism it was
+ using, causing some really weird bugs.)
+
+31. Added support for computed CREATE (the computation is done at create-time,
+ rather than when the unknown statement is encountered); partly because
+ this was rather easy, but mostly because it can be used to simulate a
+ computed NEXT, thus making the example expansion library compunex (which I
+ forgot to mention in the 0.28 release notes) redundant. Because it was
+ deprecated when I added it, compunex is now doubly deprecated, and anyone
+ tempted to use it should use computed CREATE instead. (I have always
+ maintained that if computed NEXT were ever added to C-INTERCAL, it would
+ be deprecated on arrival; the computed CREATE method implements all
+ features of NEXT, anyway, rather than the small subset COMPUNEX could
+ manage.)
+
+32. Plugged a couple of small memory leaks; however, there are still several
+ much bigger memory leaks that could do with being fixed.
+
+33. Added support for CREATING operators, with similar syntax to the CREATION
+ of commands. This requires the -ea options to be set to work properly.
+
+34. More file extensions are now supported by the external calls system. The
+ .c99 extension indicates a C99 (rather than C89) file; all .c99 files are
+ preprocessed as C99, and if any C99 files are used the final compilation
+ which compiles and links everything will be done as C99 rather than C89
+ (this causes no problems for C-INTERCAL's output which is both legal C89
+ and legal C99). Also, libraries can be linked in; to link in the maths
+ library for instance (i.e. pass -lm to gcc), write libm.a as a filename at
+ the end of the command line. (The file's real name is libm.a; if a
+ filename is in lib*.a format, then ick will look in the normal library
+ locations instead of the current directory.) Other .a files can be linked
+ in from the current directory.
+
+35. Fixed the handling of division by zero in the syslibc expansion library.
+ (The Revamped Manual states 'In all cases, division by 0 returns 0'.)
+
+36. Made several changes to the documentation, including fixes for some rather
+ nasty typos (two of the worst were specifying variables as IGNORED by
+ default, and stating that select acts like OR in TriIntercal!).
+
+37. Fixed a bug in the external calls system that made it impossible to write
+ a COME FROM in more than one file at a time whilst still having the
+ resulting program work reliably.
+
+38. Added support for external calls to Befunge-98 programs; however, this
+ distribution does not ship with a Funge-98 interpreter, so in order to use
+ this feature you will first have to compile a Funge-98 interpreter into a
+ library for use with C-INTERCAL (see README.txt or the Revamped Manual for
+ information on this). Also added a test program for this to the pit.
+
+39. Fixed some bugs in the go-away command in interfunge.i.
+
+40. Fixed many bugs in the optimiser, and added a fuzz-tester ("make fuzz") for
+ the optimiser which has a chance at finding any new optimiser bugs that may
+ be introduced, or any that the maintainers don't know about.
+
+== Release 0.28 (by Alex Smith) 1 Apr 2008 ==
+
+=== Patches, suggestions and bugs found by Joris Huizer ===
+
+1. Fixed a typo in the [noopxor] optimiser idiom.
+
+2. Added a [redundantdoublenot] optimiser idiom (a generalisation of Joris'
+ suggestion of and code for [triplenot]).
+
+3. Fixed a typo that caused the flow optimiser to optimise some errors into
+ non-erroring code.
+
+4. Fixed the [lshift16] optimiser idiom; previously it was giving incorrect
+ values in some cases where the bits being selected from the original
+ number weren't contiguous.
+
+5. There is now no longer a segfault when the unusual option combination -f
+ (without specifying -O) is used.
+
+6. It is again possible to recompile more than one source file at a time.
+
+7. The flow optimiser now recognises that comments can be reinstated in
+ programs where they can be reinstated.
+
+=== Changes by Alex Smith ===
+
+8. Fixed some typos in the documentation.
+
+9. Applying an infix unary operator to a constant (as in ) now returns
+ the correct value; previously it returned the unary operator applied to a
+ sequence number that was 0 for the first unique constant that was the
+ argument of a unary operator, 1 for the second unique constant, and so
+ on. (This was a bug in the parser.)
+
+10. Added doc/THEORY.txt back in. (It seems that it went missing some time
+ between 1.26 and 0.27.) Updated it to describe the current compiler.
+
+11. Turned off optimisation of the optimiser, and also placed a 128MB limit on
+ the data segment and virtual memory it was allowed to use. This is to
+ prevent Linux thrashing and/or invoking the dreaded oom-killer when
+ recompiling idiotism.c. (This happened only rarely, but it happened to me
+ twice, each time making my computer unusable for about half an hour.
+ Therefore, a fix to prevent the situation happening again was added,
+ assuming your computer has at least 128MB free memory and disk space.) As
+ a bonus, the build process is now considerably faster, because the
+ optimisation of the optimiser was the slowest step of the process.
+
+12. Internally, all symbols that are visible globally are now name-mangled (by
+ using the prefix ick_). This allows other files to be linked with files
+ compiled from INTERCAL without namespace collisions. This does not include
+ symbols that are only useful in multithreading (as INTERCAL's
+ multithreading model is incompatible with other programs), only for the
+ debugger (because linking yuk into a program causes all sorts of chaos if
+ non-INTERCAL programs are involved), or only used by the compiler (which
+ hopefully should never be linked to another program that isn't
+ specifically designed to be linked to it).
+
+13. Thoroughly delinted the code, using Splint; the code is now annotated to
+ show Splint what is being done where (and all the non-obvious annotations
+ are explained so that humans can figure out what is going on as well);
+ over 800 warnings have been fixed, including some which identified bugs in
+ the original program (many of which were to do with edge cases involving
+ unusually long strings, and some of which were buffer overflows). All
+ comments from /*@ to @*/ are mine, and are annotations for Splint.
+
+14. Implemented external calls, which allow multiple INTERCAL programs to be
+ linked to each other, and/or to C programs, via the -e option and NEXT /
+ COME FROM / NEXT FROM / FORGET / RESUME statements. See the manual for
+ more details. (Note that external calls require you to use gcc, GNU cpp,
+ and GNU ld, because they rely on features of those programs to work.)
+
+15. Two other new compiler options have been added: -E (don't link system
+ library), and -w (enable +printflow debugging even for non-multithread
+ programs). +printflow has been enhanced to show what's going on in
+ externally-called programs to some extent, too.
+
+16. Added a version of the INTERCAL system library written in C, as
+ pit/lib/syslibc.c. A new compiler feature allows the inclusion of such
+ expansion libraries via the command line; to include this library, you
+ would write the command line as ick -eE yourprogram.i syslibc (possibly
+ adding other options than -eE). The main advantage of the C-based system
+ library is speed; also, note that an implemented-in-a-faster-language-
+ than-INTERCAL system library existed in the Princeton compiler (which is
+ possibly how the INTERCAL version managed to stay buggy for decades
+ without anyone noticing), so this is another case of catching up with
+ historically available features. (The feature is also somewhat reminicent
+ of CLC-INTERCAL's 'preloads', but is implemented differently, and is
+ useful for different things, as it doesn't affect the compiler.)
+ Expansion libraries are included via -e, like non-INTERCAL programs are,
+ but are distinguished by not having an extension.
+
+17. The handling of syntax errors has been improved; many lines that
+ previously caused E017 at compile time are now correctly interpreted as
+ run-time errors. The only way to cause E017 nowadays is to write a
+ constant out of the onespot range, and the manual description of the error
+ has been changed accordingly. (Note that I caused several regressions
+ while implementing this; I hope they're all fixed now, but there may be
+ some left. Please report any remaining parsing problems caused by this;
+ they mostly manifest as either the line after a comment being corrupted or
+ ignored, or as the line before a comment being taken to be part of the
+ comment.)
+
+18. A new 'just-in-case' compilation method is used for syntax errors. If a
+ syntax error is encountered at compile-time, and contains just capital
+ letters with no other meaning (i.e. they don't form keywords and none of
+ them is the letter V), variables, and expressions, and there are no two
+ consecutive expressions or variables involved (i.e. they are separated by
+ keywords), the compiler will compile it anyway, just in case it happens to
+ gain a meaning later (see the next changelog entry). This is sort of the
+ converse of the way CLC-INTERCAL goes about compiling things that don't
+ have a meaning yet (it uses a 'just-too-late' compiler which waits for the
+ offending statement to error out, then recompiles it to see if it's gained
+ a meaning in the meantime), and this difference in handling typifies the
+ difference between the compilers quite well.
+
+19. Implemented the CREATE statement, because I could (see point 18). This
+ allows new syntax to be created at runtime. CLC-INTERCAL also has a CREATE
+ statement, but its syntax is totally different (it specifies the bytecode
+ for the command, whereas C-INTERCAL's CREATE statement allows you to
+ specify what the new command does in INTERCAL itself.) A function call
+ ick_create is also available; it's usable from externally-called programs
+ and from expansion libraries, and means that INTERCAL commands can now be
+ defined to do things which were previously well out of INTERCAL's
+ reach. This makes expansion libraries act even more like CLC-INTERCAL
+ preloads.
+
+20. Fixed a strange bug in yuk when the basename of the INTERCAL program was
+ the same as that of a shell builtin or command on the user's path.
+
+21. Programs accept a new option +instapipe that causes output to be output
+ immediately, even if not followed by a newline, by flushing the output
+ after every character. This is most useful with binary output into pipes,
+ and occasionally useful for getting the output to very slow programs
+ faster.
+
+22. Fixed an error in an optimiser idiom that could optimise erroring code
+ involving mingles into non-erroring code (which is of course incorrect);
+ also edited unlambda.i in the pit, which was taking advantage of this
+ error (and erroring out if optimisation was turned off).
+
+23. Fixed a bug with the ON THE WAY TO line number displayed when COME FROMs
+ are involved that I accidentally introduced in 0.25.
+
+=== Changes from elsewhere ===
+
+24. Added yet another nontrivial INTERCAL program to the pit; interfunge.i
+ (written by Jeffrey Lee) is a Befunge-93 interpreter written in INTERCAL.
+ (It appears to conform to the standard (I actually ran it against a
+ testsuite, and it passed); its only pecularities, apart from the language
+ in which it's written, appear to be the need for a blank line at the end
+ of the program, but no blank lines earlier (because INTERCAL can't sense
+ EOF, although there are plans to change that), the restriction to 80x25 is
+ enforced (this seems to be an implied requirement in the standard, but
+ most Befunge-93 interpreters don't enforce it), and numeric output is in
+ Roman numerals (what did you expect?).)
+
+== Release 0.27 (by Alex Smith) 22 Dec 2007 ==
+
+1. Joris Huizer pointed out that the manual nowhere says that a GIVE UP line
+ can't be abstained from by line number. This was probably a mistake in the
+ INTERCAL-72 manual, but the behaviour specified by the original manual is
+ now implemented; after all, it wouldn't do to violate the original de facto
+ standard. (Note that if a GIVE UP line is abstained by line number, there
+ is then no way to reinstate it; also, if the -X switch for CLC-INTERCAL
+ compatibility is used, ABSTAINING FROM a GIVE UP line by line number is
+ also silently ignored.)
+
+2. Rewrote the optimizer in a language (OIL) invented specifically for the
+ purpose; the set of optimizer idioms is now in idiotism.oil, and translated
+ into C and linked with the rest of the compiler at metacompile time (that
+ is, when the compiler itself is being compiled). It contains many of the
+ same idioms, but some have been generalised or reduced into smaller parts
+ and some new ones were added. Documentation for OIL has been added as part
+ of the documentation for the distribution as a whole.
+
+3. Joris Huizer submitted a patch to fix a memory allocation bug which
+ occasionally caused memory corruption when a program had a number of
+ commands that was 1 less than a multiple of 256.
+
+4. Completely redid the autoconfiguration. The install should now progress
+ with less user interaction than before. As a bonus, if you have a range of
+ GNU utilities including make, sed, tr, and bash (and possibly others), it's
+ now possible to compile using 'sh configdj.sh' followed by 'make' under
+ DJGPP. (To be specific, some settings that previously sometimes had to be
+ set by the user, such as whether lex provided yylineno and yyrestart, are
+ now either detected by config.sh or no longer relevant. Other settings that
+ were not previously detected, such as what extension executables have, are
+ now detected so that the config script works on DJGPP as well, now;
+ compiling the config script on a non-DJGPP system seems to result in a
+ script that fails on DJGPP, and likewise compiling the script on DJGPP
+ seems to result on a script that fails on other systems, so both scripts
+ are provided. The autoconfigurer now also adapts coopt.sh so that -F works
+ on DJGPP too, sort of (or else detects that it won't work and disables it).
+
+5. Improved the action of 'make install', so that it actually installs
+ everything in the right place. It works under DJGPP, now, too, as long as
+ you have the programs installed that allow configdj.sh and make to work.
+
+6. Fixed a bug involving COME FROM in multithreaded programs; now, if a line
+ COMEs FROM itself (either because this is written explicitly or because it
+ is a computed COME FROM computing to its own line number), the loop this
+ creates doesn't block all the other threads in the program.
+
+7. Added support for statement WHILE statement, with similar semantics to CLC-
+ INTERCAL. (The second statement is repeated for as long as the first
+ statement is executing; NEXTing to the statement nexts to the first
+ statement and doesn't set off the loop, and COMING or NEXTING FROM the
+ first statement leaves the loop running until the NEXT FROM returns.) With
+ the current implementation, strange things happen if the same WHILE is
+ simultaneously run by multiple threads, although I decided to work out
+ exactly what the rules were anyway and document them, so those strange
+ things are now official.
+
+8. Fixed some weird bugs in the multithreader that could cause segfaults in
+ several situations involving backtracking; it's kind of surprising that
+ they didn't turn up sooner.
+
+9. Prevented a segfault in some situations where a syntax error was the
+ target of a noncomputed COME FROM or NEXT FROM.
+
+10. CALCULATING now includes array dimensioning. (There previously was no
+ gerund for this situation; the original manual doesn't say what to do but
+ implies that this is a special case of calculate.)
+
+11. Made operand overloading interact more sensibly with multithreading.
+ Previously, overloading information was shared between all threads, but the
+ stashes for operand overloading were separate in each thread. Now, the
+ overloading is not shared between threads, except when they are woven by a
+ WHILE statement.
+
+12. There's no longer a need to set or modify copyloc in the makefile by hand;
+ COPYING.txt is now found the same way as syslib and the skeleton. It's also
+ now copied out of the distribution to the same place as the other data
+ files when installing, preventing the need to keep the original
+ installation directory around.
+
+13. The compiler now actually looks for a temporary directory to place a file
+ in when creating a temporary file; this was meant to be fixed in 1.26, but
+ the fix didn't actually work.
+
+14. Added a new program to the pit: an Unlambda interpreter written by Oerjan
+ Johansen in 2001, and also a commented version as documentation.
+
+15. Section 23 of the release notes for version 0.26 is wrong; I was obviously
+ confused when I wrote them because they were speaking nonsense. For the
+ record: no, there is nothing special about NEXT in connection with
+ backtracking. It should have said "NEXT", not "choicepoint". Instead of
+ rewriting history, this changelog entry is added as a fix.
+
+16. Added an entirely new set of documentation, the Revamped Manual, which is
+ available in a wide range of formats and documents recent language changes,
+ as well as many other things INTERCAL. The Revised Manual has been
+ preserved, but it seems unlikely to be updated in the near future (it is
+ still well worth a read anyway).
+
+17. For compatibility, the COMMENT gerund can now be spelt COMMENTS or
+ COMMENTING.
+
+18. Corrected the Emacs INTERCAL mode to work with more recent versions of
+ Emacs than it previously worked with, hopefully without sacrificing too
+ much backward compatibility.
+
+19. Added a conversion program 'convickt'; it can convert between the Latin-1,
+ Baudot and EBCDIC character sets used by CLC-INTERCAL (Latin-1 is also
+ accepted by C-INTERCAL, so this gives a practical way to run CLC-INTERCAL
+ programs in unusual character sets on C-INTERCAL), and can also attempt to
+ convert into the 'Atari character set' (which uses $ instead of the cent
+ sign, ? instead of yen, and so on for the other characters that differ
+ between C-INTERCAL and CLC-INTERCAL).
+
+20. Reorganised the Makefile and environment variable system for finding
+ locations to make more logical sense; various definitions and environment
+ variables now do what their name suggests rather than something completely
+ different, a situation which confused the programmers previously. The new
+ version should be better at finding files that it needs, and also cuts
+ down on the amount of useless copying that the Makefile did (such copying
+ is now only done if the destination file doesn't already exist or is out
+ of date).
+
+21. Fixed some problems in the PIC-INTERCAL code: one problem with finding the
+ correct location for the skeleton, and some code duplication between the
+ two header files. Also clarified one of the comments.
+
+22. Added support for CLC-INTERCAL-style Baudot I/O (generalised array I/O is
+ currently unimplemented, though). This has a two minor differences to the
+ CLC-INTERCAL version: unrecognised characters, instead of causing an
+ error, become 0 when WRITING IN (except that tabs are translated to single
+ spaces) and ASCII code 26 when READING OUT. (Baudot characters not in
+ ASCII will be translated to Latin-1; there are more of these than might be
+ expected, because the CLC-INTERCAL extended Baudot is being used).
+
+23. The man pages and some fixes for the documentation Makefile from the
+ Debian package were copied into the main distribution. The man page was
+ written originally by Mark W. Eichin and later modified by Joey Hess (and
+ was further modified by me prior to placing it in the distribution); the
+ Makefile fixes are due to Joey Hess. Strangely, many of the changes I made
+ to the Makefile for this version have much the same effect as fixes that
+ the Debian package maintainers had come up with earlier; a new Makefile
+ variable ick_specific_subdir has been added to hopefully make the Debian
+ maintainer's job easier (it allows elimination of versioned
+ subdirectories, replacing them with versionless subdirectories).
+
+24. Added a new test program to the pit, tests/ignorret.i, that demonstrates
+ how the interaction between IGNORE and RETRIEVE is different between
+ C-INTERCAL, CLC-INTERCAL, and J-INTERCAL, and documentation showing the
+ results on each version.
+
+ Release 1.26 (by Alex Smith) [a bugfix of 0.26] 3 Sep 2007
+
+1. Fixed an optimizer bug (thanks to Joris Huizer for pointing it out),
+ relating to active-bits deduction in some expressions involving select.
+
+2. Fixed a bug in the flow optimizer that caused it to occasionally confuse
+ ABSTAIN with REINSTATE when gerunds were used.
+
+3. Simplified the compilation of INTERCAL files to .exe under DJGPP, to avoid
+ some temporary files (hopefully solving some problems users may be having
+ with finding which directory the temporary files are in under DJGPP);
+ when under DJGPP a temporary file other than .c or .exe is needed, the
+ compiler now looks for a directory reserved for temporary files to place it
+ in rather than just using the current directory.
+
+4. The original INTERCAL manual specifies that GIVE UP cannot be REINSTATED
+ or ABSTAINED FROM; this is now implemented, by taking only the original
+ DO/DO NOT status into account when executing a GIVE UP statement.
+
+5. Dealt with problems with what happens with the 'original' stdin (this
+ information was previously lost, making it hard for the debugger to accept
+ input because it had no obvious place to accept it from), and removed the
+ previous hacky workarounds for this problem (which were my fault).
+
+6. Made several improvements to the documentation, especially with respect to
+ installing and running under DJGPP.
+
+7. Modified the version number scheme, so that minor revisions and bugfixes
+ now increment the major version number rather than the minor version number
+ (it was getting a little bored stuck at 0). The next major release will be
+ version 0.27.
+
+== Release 0.26 (by Alex Smith) 1 Apr 2007 ==
+
+1. Fixed a few bugs in the previous release (some bugfixed by Joris Huizer).
+
+2. Ported to DJGPP. The compiler now works on both POSIX and DJGPP systems.
+
+3. Reorganized the directory structure.
+
+4. Added support for cross-compiling to the PIC microcontroller.
+
+5. Added a simple test program for PIC cross-compilation.
+
+6. Improved further searching for skeletons and executables.
+
+7. Delinted some of the code, and turned up the default gcc warning level.
+
+8. Reformatted some of the documentation.
+
+9. Renamed and split files; all files used in the build now have 8.3
+ filenames, to prevent any problems using DJGPP on 8.3 systems. The
+ optimizer was split from the code degeneration into dekludge.c (optimizer)
+ and feh2.c (degeneration), because feh.c was getting too large.
+
+10. The text documentation (README, COPYING, NEWS, and BUGS) was renamed to
+ end .txt (again for DJGPP compatibility); formatting changes were made to
+ README in addition to the addition of extra readme information.
+
+11. Included precompiled-to-C versions of the parser and the lexer so that
+ DJGPP (or I suppose, POSIX if you hacked the makefile) implementations
+ without bison or flex could still compile the rest of C-INTERCAL and give
+ a running program.
+
+12. Fixed a bug involving optimization of Tri-INTERCAL programs.
+
+13. Added to the lexer, so that it supports CLC-INTERCAL syntax for operators
+ that were already present in C-INTERCAL, as long as they don't conflict
+ with C-INTERCAL syntax. (Using the -X switch will support CLC-INTERCAL
+ syntax for operators that were already present in C-INTERCAL even if they
+ conflict with C-INTERCAL syntax.) For the symbols present in the
+ CLC-INTERCAL character set but not in ASCII, ISO-8859-1 is supported as an
+ encoding as well as UTF-8 (to increase the chance that CLC-INTERCAL
+ programs will run without modification); it was meant to be supported to
+ some extent before, but seemed not to be working.
+
+14. Added the COMMENT gerund, with the same semantics as in CLC-INTERCAL.
+
+15. Added COME FROM gerund. This suffers from the same restrictions as
+ computed COME FROM, in that it can't be used in PIC programs and causes
+ the program to end up substantially less efficient.
+
+16. Added support for prefix as well as infix unary operators. The rule is
+ that any number of prefix unary operators, but only one infix unary
+ operator, is allowed on each group, variable, and/or mesh. (Previously,
+ only infix operators were supported, and then only one per mesh.)
+
+17. Added positional precedences to the parser. INTERCAL still doesn't have
+ operator precedences (that would be completely contrary to the spirit of
+ INTERCAL) but it now has rules for deciding on the meaning of previously
+ ambiguous expressions. Chains of select and mingle operations right-
+ associate, and when a unary operator could legitimately be in either a
+ prefix or infix position, the infix position is assumed (although remember
+ that only one infix operator is allowed for each group, variable, and/or
+ mesh).
+
+18. Added the not character as a synonym for NOT.
+
+19. Added operand overloading, for onespot and twospot variables. This uses
+ the slat operator in almost, but not quite, the same way as
+ CLC-INTERCAL. Note that the width of unary operations will mostly depend
+ on the type a variable appears to have in an expression, rather than on
+ its actual bitwidth (if a onespot is overloaded to a twospot or vice
+ versa). Note that meshes won't change as the result of operand overloading
+ unless the -v option is used (an error will be generated instead).
+
+20. Added an option for generalised assignments. With the -v option,
+ expressions (rather than just variables) can appear on the left of an
+ assignment. Any meshes on the left of an assignment (even if in apparently
+ inoccuous positions) may change value as a result. (Note that such
+ assignments aren't always possible.) If the left-hand-side of an
+ expression is anything other than simply a variable or a constant, the
+ compiler will try to change the values of meshes and non-ignored variables
+ in the expression to make it fit. (In bases other than 2, it will nearly
+ always fail.) Unlike CLC-INTERCAL, assigning to a mesh only changes that
+ mesh, not line labels or other uses of the number.
+
+21. Restricted the compiler to just one input file at a time (it used to break
+ if this wasn't done anyway).
+
+22. Fixed a nonportability involving stdin and stdout in cesspool.c.
+
+23. Added support for the NEXT FROM command, with the same semantics as COME
+ FROM (including computed NEXT FROM and NEXT FROM gerund), except that it
+ saves the line that was NEXTed FROM on the choicepoint stack.
+
+24. Fixed a bug where the yuk debugger accessed unallocated memory.
+
+== Release 0.25 (by Alex Smith) 21 Jun 2006 ==
+
+1. Added support for computed ABSTAIN and TRY AGAIN.
+
+2. Added support for computed COME FROM.
+
+3. Added support for multithread programs. This includes ONCE and AGAIN,
+which also work in singlethread programs.
+
+4. Expanded intercal.el to support Font Lock and some utilities for
+ generating INTERCAL-style constants. It also works with the
+ compilation routines of Emacs to compile INTERCAL programs without
+ the need for make. Degenerated C code now has a mode line to help
+ with Emacs compatibility.
+
+5. Added a rudimentary debugger and profiler for singlethread programs. The
+ debugger's features include useful things like 'write out INTERCAL expression
+ in simpler terms' (which is only possible if -O is on). The profiler works
+ much like gcov, counting the length of time spent in and number of executions
+ of each command in the code.
+
+6. Changed searching for includes, libraries, syslib, skeleton. This
+ is so that non-root users, or people who want to evaluate ick, can
+ do so more simply. The compiler will search for the above files in
+ the directory they should have been installed in, the current
+ directory, and the directory in which ick's executable resides (in
+ that order). Skeleton problems, in particular, seem to have been a
+ major problem for unfamiliar users trying out ick.
+
+7. Added several new test programs to the Pit.
+
+8. Greatly expanded the original optimizer (which optimizes
+ expressions). It can now recognize most of the idioms in syslib,
+ and many idioms in other Pit programs. Also added a new optimizer,
+ to try to optimize program flow, which is important because
+ otherwise INTERCAL wouldn't have any rudimentary optimizers. There
+ is also the -F optimizer, which I hope will become infamous. It
+ creates object code which is close to maximally fast in some
+ specialized situations, at the expense of compile time (compilation
+ can take a very long time when -F is active) and object file
+ size. I suggest checking its effect on primes.i.
+
+9. Fixed the grammar (again) in a spark/ears situation involving array
+ subscripts, after proving that the previous fixes weren't adequate.
+
+10. Added support for backtracking (MAYBE, GO AHEAD, GO BACK). Note
+ that it is possible for multithreading, backtracking, computed
+ ABSTAIN, and computed COME FROM to all be used simultaneously in
+ the same program, to help maximize obfuscation.
+
+11. Added an option (-l) for generating warnings. To prevent this
+ actually being useful, it is designed to generate far too many
+ warnings, which all have to be trawled through to find the
+ important ones, and has no way to turn the unimportant ones off.
+
+12. Added the +printflow and +mystery options for executing INTERCAL programs.
+ Note that it is not entirely obvious what either of them do (+printflow is a
+ debugging aid, but the output is somewhat obfuscated, and I am not going to
+ explain what +mystery does in this document).
+
+== Release 0.24 (by Eric S. Raymond) 31 Dec 2003 ==
+
+1. RPMs can now be built by non-root users.
+
+== Release 0.23 (by Eric S. Raymond) 9 Mar 2003 ==
+
+1. More fixes by Don Knuth. He found a bug in the type-propagation logic.
+
+== Release 0.22 (by Eric S. Raymond) 4 Mar 2003 ==
+
+1. Incorporated a minor fix patch from Donald Knuth. Yes, *the*
+Donald Knuth. Seems he found a weakness in the code for handling
+comments, and fixed it to do multiline comments properly. He also made
+some improvements to intercal.el, and contributed a test program.
+
+2. Updated build machinery. This package now uses GNU autoconf.
+
+== Release 0.21 (by Eric S. Raymond) 30 July 2002 ==
+
+1. Jonathan Nieder sent a grammar fix for BLR's old bug #5 (a bad spark-ears
+ interaction.)
+
+2. Latin-1 support and makefile fixes from Magnus Bodin.
+
+== Release 0.20 (by Eric S. Raymond) 16 September 1999 ==
+
+ (The following changes are due to John Cowan <cowan@ccil.org>)
+
+1. In addition to Latin-1, UTF-8 is now acceptable in source code as well.
+ All the numerous currency symbols of Unicode (ISO 10646) can be used as
+ big-money alternatives in their UTF-8 format. Indeed, a random mixture of
+ Latin-1 and UTF-8 also works fine; this seems very much in the spirit of
+ Intercal.
+
+2. Intercal has now been localized for the Ancient Roman as well as the
+ Posix/C locale. You may input numbers in Latin and write Intercal programs
+ using Latin keywords. See lexer.l for a list of equivalences.
+
+3. The Makefile in the pit directory now works like a real Makefile, and
+ won't compile anything that's already been compiled.
+
+== Release 0.19 (by Eric S. Raymond) 16 August 1998 ==
+
+1. Fixed a code-generation error in assignments from tail and hybrid
+ variables. (Error pointed out by Malcom Ryan.)
+
+== Release 0.18 (by Eric S. Raymond) 29 April 1998 ==
+
+(The following changes are due to John Cowan <cowan@ccil.org>)
+
+1. The source code is now POSIXly correct. By making the POSIX
+ variable in the Makefile undefined, you can restore the use of
+ <varargs.h>, but otherwise <stdarg.h> is now used.
+
+2. Latin-1 (ISO 8859-1) is now the standard input charset of C-INTERCAL.
+ This means that the change operator (0xA2) has returned as an alternative to
+ big money ($). Furthermore, the quid (0xA3) and zlotnik (0xA4) are also
+ acceptable. For those using Latin-9 (ISO 8859-15), the euro (0xA4) will also
+ work. ("Euro", like "ampersand", cannot be sillified further.)
+ New names have been added to intercal.mm.
+
+3. A fortiori, input of Volap\"uk digits may now be in Latin-1 or TeX format.
+
+4. Yacc is now deprecated in favor of bison; some old yaccs don't do proper
+ error recovery, and lines like "DO ~ ERROR" failed at compile time.
+
+5. Some minor portability bugs on systems where ptr_diff is not the same
+ as int were removed by casting expressions of the form (ptr - ptr) to int.
+
+== Release 0.17 (by Eric S. Raymond) 27 Feb 1998 ==
+
+Incorporates a minor bug fix by Jeff Uphoff <juphoff@tarsier.cv.nrao.edu>.
+
+== Release 0.16 (by Brian Raiter and Eric S. Raymond) 26 May 1997 ==
+
+This is the 25th-anniversary release of INTERCAL. This language, conceived
+in irony a quarter century ago today, has outlasted many more serious and
+high-minded essays in computer language design. This fact should give us
+pause to reflect, or possibly frighten the crap out of us. Or both.
+
+1. Corrected manual bugs.
+
+2. Fixed over-enthusiastic install production in the Makefile.
+
+3. DO PLEASE is no longer accepted (Brian Raiter pointed out that the
+ manual does not sanction it).
+
+4. Fixed various bugs in the optimizer.
+
+5. Incorporated fixes made by William Walter Patterson for bugs that
+ appeared when multiple files are given on the command line.
+
+(The following changes are due to Brian Raiter)
+
+6. The system library is now available for TriINTERCAL (all bases, 3 to 7).
+ The compiler has been updated to use the right library automagically.
+
+7. The error 774 feature has been brought into conformance with the
+ Princeton compiler. The odds are now a flat 10% (but still 0% with -b).
+
+8. The compiler has been modified to allocate memory dynamically, and
+ the hard-coded limits on program size and number of variables has
+ been removed. Programs are now only limited by the amount of
+ available memory.
+
+9. Array output now fflushes after outputting newlines.
+
+10. Two minor bug fixes: one in wimpmode input, which was clamping
+ input to the signed integer range, and one in politesse checking.
+ The latter was causing programs to be recognized as impolite only
+ if their ratio was less that one-sixth, not one-fifth. (Fixing this
+ also necessitated adding a few PLEASEs to pit/rot13.i.)
+
+11. Several new programs have been tossed into the pit.
+
+== Release 0.15 (by Eric S. Raymond) 20 Jun 1996 ==
+
+1. Switched the INTERCAL manual master to mgm in order to be able to handle
+ section crossreferences properly. The manual has now been carefully
+ proofread against the paper version by ESR and seems to match. It's
+ also been independently proofread for typos by Brian Raiter.
+
+2. The optimizer now does complete analysis and evaluation of constant
+ expressions at compile time.
+
+3. Added optimization templates for ~, |, &, ^ expressions. Also added
+ |, &, ^ idioms to the system library, and documented them.
+
+(The following changes are due to Brian Raiter)
+
+4. Every one of the INTERCAL-72 messages is now emitted when appropriate.
+ including the previously un-emitted E000, E197, and E200 (and see below).
+
+5. A close reading (while proofing) of the sections of the manual on
+ error messages seems to indicate that splatted lines were only
+ splatted in the default listing printed after a successful
+ compile. (This seems to be a standard feature of IBM compilers; I
+ remember that RPG did this as well.) My understanding of the manual is
+ when the syntactically offensive line is encountered at runtime, it is
+ printed as error E000. I have modified the code to do this.
+
+6. I have fixed INTERCAL in order to add another bug. Namely, I have
+ implemented the BUG/NOBUG option in the Princeton compiler. By
+ default, there is a chance that INTERCAL will randomly insert error
+ E774 into your executable. (The odds are 1/128 per statement, not
+ counting COME FROMs. Is there any way to find out what the
+ Princeton compiler's odds were?) The new option -b turns this
+ feature off.
+
+7. The new file pit/lib/numio.i contains routines for wimpmode I/O.
+ These routines are documented in the file pit/lib/numio.doc.
+ It is my earnest hope that C-INTERCAL programmers everywhere will
+ flock to these handy routines, and C-INTERCAL users will thus no
+ longer need to fear that they might succumb to the foul and awful
+ temptation to use the dastardly +wimpmode option.
+
+== Release 0.14 (by Eric S. Raymond) 9 Jun 1996 ==
+
+1. The documentation has been reorganized and cleaned up (you can now
+ format either a C-INTERCAL or INTERCAL-72 manual from the same master).
+ The diagrams in the paper original have been transcribed as pic figures.
+ See doc/READ.ME for details.
+
+2. Yet more code. The pit now includes a second random-number generator,
+ a ROT13 filter, and even two programs in TriINTERCAL!
+
+3. Louis Howell's corrected system library is now included.
+
+4. The distribution is now formally GPLed.
+
+== Release 0.13 (by Eric S. Raymond) 5 Jun 1996 ==
+
+1. I folded in patches by Brian Raiter <breadbox@muppetlabs.com> that port
+ this code to Linux, ANSIfies it, and enables it to use flex. Note: This
+ version has been tested on Linux and SunOS but not yet elsewhere.
+
+2. Another piece of nontrivial INTERCAL code has been found! (Doubtless
+ hell is freezing over even as I write.) We've added to the pit the
+ `beer' program by Matt DiMeo <mdimeo@brooktree.com>, courtesy of the
+ infamous Beer List (URL:http://www.ionet.net/~timtroyr/funhouse/beer.html).
+
+== Release 0.12 (by Eric S. Raymond) 22 Mar 1995 ==
+
+1. The code now compiles and runs under Linux, using bison and lex. It does
+ *not* yet work with flex; C.P. Osborne's patches for 0.11 turned out not
+ to be sufficient (at least for flex 2.4.6 under Linux using the -l option).
+ See the BUGS list.
+
+2. Note 3 under 0.11 was incorrect. We're in conformance after all.
+
+3. The politesse check is a little smarter about programs too small to
+ conform to the 1/5-to-1/3 criterion. All the pit programs have been
+ checked for conformance. Also, the politesse error message now tells
+ you the offending program's line count.
+
+== Release 0.11 (by Eric S. Raymond) 24 Sep 1994 ==
+
+1. Incorporated changes by Jan-Pieter Cornet <cornet@OTech.fgg.EUR.nl> for
+ magical inclusion of the system library. These address an outstanding bug
+
+ 2. (SS) The `system library' should be precompiled and `linked' to user
+ written code, at least optionally. Doing this with the current compiler
+ presents a few problems.
+
+ which has accordingly been removed from the BUGS file. They also fix a
+ previously unknown bug; due to a minor oversight in the lexer, it was not
+ possible to ABSTAIN FROM WRITING IN or READING OUT. Jan also contributed
+ a test program that demonstrates gerund abstention.
+
+2. Despite the obvious appeal of the idea, and much discussion on
+ alt.lang.intercal, I decided *not* to add Klingon; maintaining two parallel
+ grammars just so the compiler could support SVO and OSV languages would be
+ too painful. There was also a minor mess near case-sensitivity in the
+ digits. The workaround kluges I was offered instead failed to satisfy.
+
+3. We fess up to a violation of the INTERCAL-72 standard. That implementation,
+ instead of accepting an entire multiple-digit number per line of input,
+ expected one digit per *card image* (input line). It is unclear how
+ INTERCAL-72 programs ever managed to input more than one number.
+
+4. Added patches by C.P.Osborne <boris@ibmpcug.co.uk> to make the lexer work
+ using flex, for Linux and BSD/386 support. I didn't use his error-reporting
+ patch, though; instead, I changed the parser to catch errors at logical-line
+ level. I also kept the N in `RESUBNIT'; this is a carefully preserved
+ feature of INTERCAL-72.
+
+5. Volapuk digits are now recognized on input. TO DO: Recognize Volapuk
+ keywords, including gerunds.
+
+== Release 0.10 (by Eric S. Raymond) 9 Sep 1994 ==
+
+1. It is now possible to undo a line-number abstention with a gerund
+ reinstatement, or undo a gerund abstention with a line-number
+ reinstatement. In previous versions, gerund abstention/reinstatements and
+ line-number abstention/reinstatements were independent of each other.
+
+2. After release 0.5, I wrote in the TO DO list as follows:
+
+ 2. (ESR) Input format internationalization -- allow WRITE IN input digits in
+ major languages such as Nahuatl, Tagalog, Sanskrit, and Basque.
+
+ The twisted loons in the alt.folklore.computers crowd loved this idea,
+ and I actually got sent digit lists for Nahuatl, Tagalog, Sanskrit, and
+ Basque -- also, Kwakiutl, Georgian, Ojibwe, and Albanian. I've left
+ out Albanian (didn't want to keep track of the dipthong diacritical)
+ and Ojibwe (no zero digit). So: Nahuatl, Tagalog, Sanskrit, Basque,
+ Georgian, and Kwakiutl are now supported in addition to English.
+
+3. The THEORY document has been significantly revised.
+
+== Release 0.9 (by Eric S. Raymond) 5 Mar 1993 ==
+
+1. An embarrassing port bug in the INTERCAL skeleton has been fixed
+
+2. Jamie Zawinski's suggestion for an improved E333 error message has
+ been accepted.
+
+3. Added and improved documentation for pit programs.
+
+4. The install production in the Makefile now puts lose.h in place
+ as well as cesspool.h.
+
+5. You can now set the C compiler to be used as a back end by INTERCAL
+ by setting the environment variable CC. The default is cc.
+
+== Release 0.8 (many hacks on 0.7 by Eric Raymond) 21 Jan 1992 ==
+
+1. A previously undocumented `feature' of the Princeton compiler,
+ revealed by Don Woods, is now emulated. If fewer than 1/5 or more
+ than 1/3 of a program's statements contain the qualifier `PLEASE', the
+ program is rejected with an entertaining error message. Programs in pit
+ have been hacked to pass the politesse test.
+
+2. The `sample' program now works correctly, thanks to Louis Howell. Also,
+ he has contributed new programs to calculate pi and to search for prime
+ numbers.
+
+3. An intercal mode for GNU Emacs is included. It helps programmers deal with
+ the new politesse check by randomly expanding the abbrev "do" to DO PLEASE
+ or PLEASE DO about 1/4 of the time.
+
+4. Improvements in code generation for NEXT/RESUME.
+
+5. Fixes to the optimizer; it handles the results of optimized MINGLEs
+ correctly now. Also, added a rewrite rule that checks for the
+ equality-test idiom using XOR.
+
+6. The original error messages from the Princeton compiler have been restored.
+
+The documentation has been updated to reflect these changes.
+
+== Release 0.7 (by Louis Howell) 21 Dec 1991 ==
+
+In addition to bug fixes, new features in this version include arrays,
+character I/O, modified (hopefully improved!) semantics for the COME
+FROM statement, extensions to bases other than 2, new INTERCAL programs,
+and new documentation.
+
+== Release 0.6 (by Steve Swales) 5 Jan 1991 ==
+
+1. Restored Princeton documentation (courtesy of Michael Ernst).
+
+2. Added -@ usage option to ick.
+
+3. Added [+/-]help, [+/-]traditional, and [+/-]wimpmode options for
+generated programs; [+/-]traditional is a no-op at this point.
+
+4. Various bug fixes, esp. in lexical analysis.
+
+== Release 0.5 (ESR's second pre-release) 5 Jun 1990 ==
+
+1. As a convenience to all you junior birdmen out there, `NINER' is accepted as
+ a synonym for `NINE' in INTERCAL input.
+
+2. The COME FROM statement is now compiled.
+
+== Release 0.3 (ESR's original pre-release) ==
+
+The resurrection of INTERCAL from its grave took place on 12 May 1990
+when ESR released 0.3 on an unsuspecting USENET.
-= New In This Release =
+ This is the short-form history of the project,
+ used mainly for generating release announcements
+ via shipper. For the long form, see the file HISTORY.
-== Release 0.29 (by Alex Smith, Eric S. Raymond) ==
+* 0.29: 2010-11-28
+ The first merged release from ESR and Alex Smith, with encouragement from
+ Donald Knuth. The compiler new has a regression-test suite. More error
+ checks (E990 and E004) hace been added. A new program, guess.i, writhes
+ in the pit.
-=== Changes by Eric S. Raymond ===
-
-1. There is now a compiler regression-test suite, invoked through the test
- production in the pit makefile.
-
-2. There are two new compiler error messages, E990 and E994.
-
-3. A new program for the pit: Brendan Gregg's guess game.
-
-4. The floating-point library is now automatically included if
- a program NEXTs to labels in the range 5000-5999. Internally,
- line-range to system library mappings are no longer hardcoded but
- rather declared as an array of associations that can be easily
- modified.
-
-5. The source now uses explicit bool, rather than using int everywhere.
-
-6. README, NEWS, and BUGS are now mastered in asciidoc for easier
- web-page generation.
-
-=== Bugs reported and changes patched by Arvid Norlander ===
-
-7. Fixed a typo in the perpet.c version of the help information.
-
-8. Fixed the CREATE statement to work on 64-bit architectures.
-
-9. The availability of variable argument list mechanisms is now determined
- automatically by the configure script, rather than relying on the old
- method of checking which usually gets the wrong answer with modern
- compilers, leading to build failures on many modern systems (previously
- this was patched just for DJGPP, the patch now applies to all operating
- systems and platforms). This bug is known to have affected the build on
- DOS, FreeBSD and Mac OS X, and possibly affects other platforms. (also
- reported independently by Elliott Hird)
-
-10. Fixed some nonsense in the -@ help screen that was generated by an errant
- search-and-replace.
-
-11. Made several changes to bring the new Befunge-98 interface code (see
- below) in line with changes in the Befunge-98 interpreter in use.
-
-12. Added consts and statics in the code, hopefully to make bugs easier to
- notice.
-
-13. Refactored main(). It needed it, badly.
-
-=== Bugs reported by Elliott Hird ===
-
-14. Fixed the configure script to work with the default Debian shell dash.
- (also reported independently by Debian)
-
-15. Actually fixed unlambda.i; the fix was meant to be in 0.28, and is
- described in its changelog, but for some reason never made it to
- the distributed tarball.
-
-16. The -F option again works. (AIS: I accidentally broke it in the preceding
- version, making it basically a no-op by mistake.)
-
-17. The build now succeeds (with warnings) when lex or yacc are missing,
- rather than failing with mysterious error messages that seem to have
- nothing to do with the problems. (The success is made possible by using
- the prebuilt versions; see change 11 of version 0.26, this is finishing
- what that started.)
-
-=== Bugs reported, changes requested, and patches by Joris Huizer ===
-
-18. The [xoritself] optimiser idiom has been generalised to handle some
- situations where the redundant XOR operands are on different grouping
- levels; this helps to optimise some heavily inlined greater-than tests.
-
-19. Fixed unary operators applied to constants (AIS: it seems that my patch to
- solve this issue earlier was itself buggy).
-
-20. The -g option now causes optimisation of the output compiled C to be
- turned off, and adds comments to the output file the same way -c does.
-
-21. Added more optimiser idioms: [cxorand16], [cxorand32], [cfoldintoorinand],
- [or16and], [xor16and], [lshift32half], [rshiftoutofneg], [andoutofneg];
- also generalised the idiom-matching code to compare 16-bit and 32-bit
- constants as equal if they have the same value, and fixed some typos in
- the current 16-bit complement idioms.
-
-22. ABSTAINING or REINSTATING are now a lot more efficient, taking an amount
- of time proportional to the number of commands effected, rather than the
- number of commands in the program. (AIS: I implemented this with the
- algorithm in the patch Joris provided, but with different code, to make it
- easier to maintain.)
-
-=== Changes by Stefan O'Rear ===
-
-23. Added INTERCAL syntax highlighting information for vim. Why should Emacs
- have all the fun?
-
-=== Changes reported by Phantom Hoover ===
-
-24. Fixed a nasty documentation typo.
-
-=== Changes reported by the Debian autobuilders and Joey Hess ===
-
-25. The build of the optimiser idioms is now split over many files, to reduce
- the memory usage of gcc when it tries to compile the giant output C file.
- This was a problem on ia64. (The ulimit method of preventing thrashing has
- been removed, as this method works better; likewise, the optimiser
- optimisation now works again.)
-
-=== Changes by Alex Smith ===
-
-26. The build system has been completely redone, again; it now uses automake
- as well as a much newer version of autoconf. This means that there is now
- one build system that works the same way on all systems, and that all
- sorts of clever tricks like out-of-tree builds, a self-rebuilding build
- system, and building the distribution directly from the Makefile, are
- possible. As a side effect, the directory structure looks somewhat
- different to how it looked in previous versions; src, doc, etc and pit are
- still there, but now there's prebuilt instead of temp, an extra directory
- buildaux, and bin, lib and include have disappeared.
-
-27. The distribution now comes in compressed pax format. (Before anyone
- complains that they have no idea what that is, or that I'm using something
- strange and nonstandard, I'd like to point out that tar is no longer part
- of POSIX, but that pax is. (See man 5 tar on a recent Linux system for
- details of the whole mess.) Luckily, pax is forward-compatible with tar
- so tar readers should be able to read it just fine, if you can't get your
- hands on a pax reader.)
-
-28. convickt can now produce its output as INTERCAL initialisation of a tail
- array. (This doesn't auto-offset between the different characters; it is
- therefore mostly useful for producing Baudot arrays for CLC-INTERCAL-style
- IO.)
-
-29. The function clock_gettime is now supported by the yuk profiler as an
- alternative method of getting a high-resolution clock for profiling (it
- is available on at least Linux).
-
-30. The profiler now autodetects the same profiling mechanism at compile
- time and at run time. (It was getting confused as to what mechanism it was
- using, causing some really weird bugs.)
-
-31. Added support for computed CREATE (the computation is done at create-time,
- rather than when the unknown statement is encountered); partly because
- this was rather easy, but mostly because it can be used to simulate a
- computed NEXT, thus making the example expansion library compunex (which I
- forgot to mention in the 0.28 release notes) redundant. Because it was
- deprecated when I added it, compunex is now doubly deprecated, and anyone
- tempted to use it should use computed CREATE instead. (I have always
- maintained that if computed NEXT were ever added to C-INTERCAL, it would
- be deprecated on arrival; the computed CREATE method implements all
- features of NEXT, anyway, rather than the small subset COMPUNEX could
- manage.)
-
-32. Plugged a couple of small memory leaks; however, there are still several
- much bigger memory leaks that could do with being fixed.
-
-33. Added support for CREATING operators, with similar syntax to the CREATION
- of commands. This requires the -ea options to be set to work properly.
-
-34. More file extensions are now supported by the external calls system. The
- .c99 extension indicates a C99 (rather than C89) file; all .c99 files are
- preprocessed as C99, and if any C99 files are used the final compilation
- which compiles and links everything will be done as C99 rather than C89
- (this causes no problems for C-INTERCAL's output which is both legal C89
- and legal C99). Also, libraries can be linked in; to link in the maths
- library for instance (i.e. pass -lm to gcc), write libm.a as a filename at
- the end of the command line. (The file's real name is libm.a; if a
- filename is in lib*.a format, then ick will look in the normal library
- locations instead of the current directory.) Other .a files can be linked
- in from the current directory.
-
-35. Fixed the handling of division by zero in the syslibc expansion library.
- (The Revamped Manual states 'In all cases, division by 0 returns 0'.)
-
-36. Made several changes to the documentation, including fixes for some rather
- nasty typos (two of the worst were specifying variables as IGNORED by
- default, and stating that select acts like OR in TriIntercal!).
-
-37. Fixed a bug in the external calls system that made it impossible to write
- a COME FROM in more than one file at a time whilst still having the
- resulting program work reliably.
-
-38. Added support for external calls to Befunge-98 programs; however, this
- distribution does not ship with a Funge-98 interpreter, so in order to use
- this feature you will first have to compile a Funge-98 interpreter into a
- library for use with C-INTERCAL (see README.txt or the Revamped Manual for
- information on this). Also added a test program for this to the pit.
-
-39. Fixed some bugs in the go-away command in interfunge.i.
-
-40. Fixed many bugs in the optimiser, and added a fuzz-tester ("make fuzz") for
- the optimiser which has a chance at finding any new optimiser bugs that may
- be introduced, or any that the maintainers don't know about.
-
-== Release 0.28 (by Alex Smith) 1 Apr 2008 ==
-
-=== Patches, suggestions and bugs found by Joris Huizer ===
-
-1. Fixed a typo in the [noopxor] optimiser idiom.
-
-2. Added a [redundantdoublenot] optimiser idiom (a generalisation of Joris'
- suggestion of and code for [triplenot]).
-
-3. Fixed a typo that caused the flow optimiser to optimise some errors into
- non-erroring code.
-
-4. Fixed the [lshift16] optimiser idiom; previously it was giving incorrect
- values in some cases where the bits being selected from the original
- number weren't contiguous.
-
-5. There is now no longer a segfault when the unusual option combination -f
- (without specifying -O) is used.
-
-6. It is again possible to recompile more than one source file at a time.
-
-7. The flow optimiser now recognises that comments can be reinstated in
- programs where they can be reinstated.
-
-=== Changes by Alex Smith ===
-
-8. Fixed some typos in the documentation.
-
-9. Applying an infix unary operator to a constant (as in ) now returns
- the correct value; previously it returned the unary operator applied to a
- sequence number that was 0 for the first unique constant that was the
- argument of a unary operator, 1 for the second unique constant, and so
- on. (This was a bug in the parser.)
-
-10. Added doc/THEORY.txt back in. (It seems that it went missing some time
- between 1.26 and 0.27.) Updated it to describe the current compiler.
-
-11. Turned off optimisation of the optimiser, and also placed a 128MB limit on
- the data segment and virtual memory it was allowed to use. This is to
- prevent Linux thrashing and/or invoking the dreaded oom-killer when
- recompiling idiotism.c. (This happened only rarely, but it happened to me
- twice, each time making my computer unusable for about half an hour.
- Therefore, a fix to prevent the situation happening again was added,
- assuming your computer has at least 128MB free memory and disk space.) As
- a bonus, the build process is now considerably faster, because the
- optimisation of the optimiser was the slowest step of the process.
-
-12. Internally, all symbols that are visible globally are now name-mangled (by
- using the prefix ick_). This allows other files to be linked with files
- compiled from INTERCAL without namespace collisions. This does not include
- symbols that are only useful in multithreading (as INTERCAL's
- multithreading model is incompatible with other programs), only for the
- debugger (because linking yuk into a program causes all sorts of chaos if
- non-INTERCAL programs are involved), or only used by the compiler (which
- hopefully should never be linked to another program that isn't
- specifically designed to be linked to it).
-
-13. Thoroughly delinted the code, using Splint; the code is now annotated to
- show Splint what is being done where (and all the non-obvious annotations
- are explained so that humans can figure out what is going on as well);
- over 800 warnings have been fixed, including some which identified bugs in
- the original program (many of which were to do with edge cases involving
- unusually long strings, and some of which were buffer overflows). All
- comments from /*@ to @*/ are mine, and are annotations for Splint.
-
-14. Implemented external calls, which allow multiple INTERCAL programs to be
- linked to each other, and/or to C programs, via the -e option and NEXT /
- COME FROM / NEXT FROM / FORGET / RESUME statements. See the manual for
- more details. (Note that external calls require you to use gcc, GNU cpp,
- and GNU ld, because they rely on features of those programs to work.)
-
-15. Two other new compiler options have been added: -E (don't link system
- library), and -w (enable +printflow debugging even for non-multithread
- programs). +printflow has been enhanced to show what's going on in
- externally-called programs to some extent, too.
-
-16. Added a version of the INTERCAL system library written in C, as
- pit/lib/syslibc.c. A new compiler feature allows the inclusion of such
- expansion libraries via the command line; to include this library, you
- would write the command line as ick -eE yourprogram.i syslibc (possibly
- adding other options than -eE). The main advantage of the C-based system
- library is speed; also, note that an implemented-in-a-faster-language-
- than-INTERCAL system library existed in the Princeton compiler (which is
- possibly how the INTERCAL version managed to stay buggy for decades
- without anyone noticing), so this is another case of catching up with
- historically available features. (The feature is also somewhat reminicent
- of CLC-INTERCAL's 'preloads', but is implemented differently, and is
- useful for different things, as it doesn't affect the compiler.)
- Expansion libraries are included via -e, like non-INTERCAL programs are,
- but are distinguished by not having an extension.
-
-17. The handling of syntax errors has been improved; many lines that
- previously caused E017 at compile time are now correctly interpreted as
- run-time errors. The only way to cause E017 nowadays is to write a
- constant out of the onespot range, and the manual description of the error
- has been changed accordingly. (Note that I caused several regressions
- while implementing this; I hope they're all fixed now, but there may be
- some left. Please report any remaining parsing problems caused by this;
- they mostly manifest as either the line after a comment being corrupted or
- ignored, or as the line before a comment being taken to be part of the
- comment.)
-
-18. A new 'just-in-case' compilation method is used for syntax errors. If a
- syntax error is encountered at compile-time, and contains just capital
- letters with no other meaning (i.e. they don't form keywords and none of
- them is the letter V), variables, and expressions, and there are no two
- consecutive expressions or variables involved (i.e. they are separated by
- keywords), the compiler will compile it anyway, just in case it happens to
- gain a meaning later (see the next changelog entry). This is sort of the
- converse of the way CLC-INTERCAL goes about compiling things that don't
- have a meaning yet (it uses a 'just-too-late' compiler which waits for the
- offending statement to error out, then recompiles it to see if it's gained
- a meaning in the meantime), and this difference in handling typifies the
- difference between the compilers quite well.
-
-19. Implemented the CREATE statement, because I could (see point 18). This
- allows new syntax to be created at runtime. CLC-INTERCAL also has a CREATE
- statement, but its syntax is totally different (it specifies the bytecode
- for the command, whereas C-INTERCAL's CREATE statement allows you to
- specify what the new command does in INTERCAL itself.) A function call
- ick_create is also available; it's usable from externally-called programs
- and from expansion libraries, and means that INTERCAL commands can now be
- defined to do things which were previously well out of INTERCAL's
- reach. This makes expansion libraries act even more like CLC-INTERCAL
- preloads.
-
-20. Fixed a strange bug in yuk when the basename of the INTERCAL program was
- the same as that of a shell builtin or command on the user's path.
-
-21. Programs accept a new option +instapipe that causes output to be output
- immediately, even if not followed by a newline, by flushing the output
- after every character. This is most useful with binary output into pipes,
- and occasionally useful for getting the output to very slow programs
- faster.
-
-22. Fixed an error in an optimiser idiom that could optimise erroring code
- involving mingles into non-erroring code (which is of course incorrect);
- also edited unlambda.i in the pit, which was taking advantage of this
- error (and erroring out if optimisation was turned off).
-
-23. Fixed a bug with the ON THE WAY TO line number displayed when COME FROMs
- are involved that I accidentally introduced in 0.25.
-
-=== Changes from elsewhere ===
-
-24. Added yet another nontrivial INTERCAL program to the pit; interfunge.i
- (written by Jeffrey Lee) is a Befunge-93 interpreter written in INTERCAL.
- (It appears to conform to the standard (I actually ran it against a
- testsuite, and it passed); its only pecularities, apart from the language
- in which it's written, appear to be the need for a blank line at the end
- of the program, but no blank lines earlier (because INTERCAL can't sense
- EOF, although there are plans to change that), the restriction to 80x25 is
- enforced (this seems to be an implied requirement in the standard, but
- most Befunge-93 interpreters don't enforce it), and numeric output is in
- Roman numerals (what did you expect?).)
-
-== Release 0.27 (by Alex Smith) 22 Dec 2007 ==
-
-1. Joris Huizer pointed out that the manual nowhere says that a GIVE UP line
- can't be abstained from by line number. This was probably a mistake in the
- INTERCAL-72 manual, but the behaviour specified by the original manual is
- now implemented; after all, it wouldn't do to violate the original de facto
- standard. (Note that if a GIVE UP line is abstained by line number, there
- is then no way to reinstate it; also, if the -X switch for CLC-INTERCAL
- compatibility is used, ABSTAINING FROM a GIVE UP line by line number is
- also silently ignored.)
-
-2. Rewrote the optimizer in a language (OIL) invented specifically for the
- purpose; the set of optimizer idioms is now in idiotism.oil, and translated
- into C and linked with the rest of the compiler at metacompile time (that
- is, when the compiler itself is being compiled). It contains many of the
- same idioms, but some have been generalised or reduced into smaller parts
- and some new ones were added. Documentation for OIL has been added as part
- of the documentation for the distribution as a whole.
-
-3. Joris Huizer submitted a patch to fix a memory allocation bug which
- occasionally caused memory corruption when a program had a number of
- commands that was 1 less than a multiple of 256.
-
-4. Completely redid the autoconfiguration. The install should now progress
- with less user interaction than before. As a bonus, if you have a range of
- GNU utilities including make, sed, tr, and bash (and possibly others), it's
- now possible to compile using 'sh configdj.sh' followed by 'make' under
- DJGPP. (To be specific, some settings that previously sometimes had to be
- set by the user, such as whether lex provided yylineno and yyrestart, are
- now either detected by config.sh or no longer relevant. Other settings that
- were not previously detected, such as what extension executables have, are
- now detected so that the config script works on DJGPP as well, now;
- compiling the config script on a non-DJGPP system seems to result in a
- script that fails on DJGPP, and likewise compiling the script on DJGPP
- seems to result on a script that fails on other systems, so both scripts
- are provided. The autoconfigurer now also adapts coopt.sh so that -F works
- on DJGPP too, sort of (or else detects that it won't work and disables it).
-
-5. Improved the action of 'make install', so that it actually installs
- everything in the right place. It works under DJGPP, now, too, as long as
- you have the programs installed that allow configdj.sh and make to work.
-
-6. Fixed a bug involving COME FROM in multithreaded programs; now, if a line
- COMEs FROM itself (either because this is written explicitly or because it
- is a computed COME FROM computing to its own line number), the loop this
- creates doesn't block all the other threads in the program.
-
-7. Added support for statement WHILE statement, with similar semantics to CLC-
- INTERCAL. (The second statement is repeated for as long as the first
- statement is executing; NEXTing to the statement nexts to the first
- statement and doesn't set off the loop, and COMING or NEXTING FROM the
- first statement leaves the loop running until the NEXT FROM returns.) With
- the current implementation, strange things happen if the same WHILE is
- simultaneously run by multiple threads, although I decided to work out
- exactly what the rules were anyway and document them, so those strange
- things are now official.
-
-8. Fixed some weird bugs in the multithreader that could cause segfaults in
- several situations involving backtracking; it's kind of surprising that
- they didn't turn up sooner.
-
-9. Prevented a segfault in some situations where a syntax error was the
- target of a noncomputed COME FROM or NEXT FROM.
-
-10. CALCULATING now includes array dimensioning. (There previously was no
- gerund for this situation; the original manual doesn't say what to do but
- implies that this is a special case of calculate.)
-
-11. Made operand overloading interact more sensibly with multithreading.
- Previously, overloading information was shared between all threads, but the
- stashes for operand overloading were separate in each thread. Now, the
- overloading is not shared between threads, except when they are woven by a
- WHILE statement.
-
-12. There's no longer a need to set or modify copyloc in the makefile by hand;
- COPYING.txt is now found the same way as syslib and the skeleton. It's also
- now copied out of the distribution to the same place as the other data
- files when installing, preventing the need to keep the original
- installation directory around.
-
-13. The compiler now actually looks for a temporary directory to place a file
- in when creating a temporary file; this was meant to be fixed in 1.26, but
- the fix didn't actually work.
-
-14. Added a new program to the pit: an Unlambda interpreter written by Oerjan
- Johansen in 2001, and also a commented version as documentation.
-
-15. Section 23 of the release notes for version 0.26 is wrong; I was obviously
- confused when I wrote them because they were speaking nonsense. For the
- record: no, there is nothing special about NEXT in connection with
- backtracking. It should have said "NEXT", not "choicepoint". Instead of
- rewriting history, this changelog entry is added as a fix.
-
-16. Added an entirely new set of documentation, the Revamped Manual, which is
- available in a wide range of formats and documents recent language changes,
- as well as many other things INTERCAL. The Revised Manual has been
- preserved, but it seems unlikely to be updated in the near future (it is
- still well worth a read anyway).
-
-17. For compatibility, the COMMENT gerund can now be spelt COMMENTS or
- COMMENTING.
-
-18. Corrected the Emacs INTERCAL mode to work with more recent versions of
- Emacs than it previously worked with, hopefully without sacrificing too
- much backward compatibility.
-
-19. Added a conversion program 'convickt'; it can convert between the Latin-1,
- Baudot and EBCDIC character sets used by CLC-INTERCAL (Latin-1 is also
- accepted by C-INTERCAL, so this gives a practical way to run CLC-INTERCAL
- programs in unusual character sets on C-INTERCAL), and can also attempt to
- convert into the 'Atari character set' (which uses $ instead of the cent
- sign, ? instead of yen, and so on for the other characters that differ
- between C-INTERCAL and CLC-INTERCAL).
-
-20. Reorganised the Makefile and environment variable system for finding
- locations to make more logical sense; various definitions and environment
- variables now do what their name suggests rather than something completely
- different, a situation which confused the programmers previously. The new
- version should be better at finding files that it needs, and also cuts
- down on the amount of useless copying that the Makefile did (such copying
- is now only done if the destination file doesn't already exist or is out
- of date).
-
-21. Fixed some problems in the PIC-INTERCAL code: one problem with finding the
- correct location for the skeleton, and some code duplication between the
- two header files. Also clarified one of the comments.
-
-22. Added support for CLC-INTERCAL-style Baudot I/O (generalised array I/O is
- currently unimplemented, though). This has a two minor differences to the
- CLC-INTERCAL version: unrecognised characters, instead of causing an
- error, become 0 when WRITING IN (except that tabs are translated to single
- spaces) and ASCII code 26 when READING OUT. (Baudot characters not in
- ASCII will be translated to Latin-1; there are more of these than might be
- expected, because the CLC-INTERCAL extended Baudot is being used).
-
-23. The man pages and some fixes for the documentation Makefile from the
- Debian package were copied into the main distribution. The man page was
- written originally by Mark W. Eichin and later modified by Joey Hess (and
- was further modified by me prior to placing it in the distribution); the
- Makefile fixes are due to Joey Hess. Strangely, many of the changes I made
- to the Makefile for this version have much the same effect as fixes that
- the Debian package maintainers had come up with earlier; a new Makefile
- variable ick_specific_subdir has been added to hopefully make the Debian
- maintainer's job easier (it allows elimination of versioned
- subdirectories, replacing them with versionless subdirectories).
-
-24. Added a new test program to the pit, tests/ignorret.i, that demonstrates
- how the interaction between IGNORE and RETRIEVE is different between
- C-INTERCAL, CLC-INTERCAL, and J-INTERCAL, and documentation showing the
- results on each version.
-
- Release 1.26 (by Alex Smith) [a bugfix of 0.26] 3 Sep 2007
-
-1. Fixed an optimizer bug (thanks to Joris Huizer for pointing it out),
- relating to active-bits deduction in some expressions involving select.
-
-2. Fixed a bug in the flow optimizer that caused it to occasionally confuse
- ABSTAIN with REINSTATE when gerunds were used.
-
-3. Simplified the compilation of INTERCAL files to .exe under DJGPP, to avoid
- some temporary files (hopefully solving some problems users may be having
- with finding which directory the temporary files are in under DJGPP);
- when under DJGPP a temporary file other than .c or .exe is needed, the
- compiler now looks for a directory reserved for temporary files to place it
- in rather than just using the current directory.
-
-4. The original INTERCAL manual specifies that GIVE UP cannot be REINSTATED
- or ABSTAINED FROM; this is now implemented, by taking only the original
- DO/DO NOT status into account when executing a GIVE UP statement.
-
-5. Dealt with problems with what happens with the 'original' stdin (this
- information was previously lost, making it hard for the debugger to accept
- input because it had no obvious place to accept it from), and removed the
- previous hacky workarounds for this problem (which were my fault).
-
-6. Made several improvements to the documentation, especially with respect to
- installing and running under DJGPP.
-
-7. Modified the version number scheme, so that minor revisions and bugfixes
- now increment the major version number rather than the minor version number
- (it was getting a little bored stuck at 0). The next major release will be
- version 0.27.
-
-== Release 0.26 (by Alex Smith) 1 Apr 2007 ==
-
-1. Fixed a few bugs in the previous release (some bugfixed by Joris Huizer).
-
-2. Ported to DJGPP. The compiler now works on both POSIX and DJGPP systems.
-
-3. Reorganized the directory structure.
-
-4. Added support for cross-compiling to the PIC microcontroller.
-
-5. Added a simple test program for PIC cross-compilation.
-
-6. Improved further searching for skeletons and executables.
-
-7. Delinted some of the code, and turned up the default gcc warning level.
-
-8. Reformatted some of the documentation.
-
-9. Renamed and split files; all files used in the build now have 8.3
- filenames, to prevent any problems using DJGPP on 8.3 systems. The
- optimizer was split from the code degeneration into dekludge.c (optimizer)
- and feh2.c (degeneration), because feh.c was getting too large.
-
-10. The text documentation (README, COPYING, NEWS, and BUGS) was renamed to
- end .txt (again for DJGPP compatibility); formatting changes were made to
- README in addition to the addition of extra readme information.
-
-11. Included precompiled-to-C versions of the parser and the lexer so that
- DJGPP (or I suppose, POSIX if you hacked the makefile) implementations
- without bison or flex could still compile the rest of C-INTERCAL and give
- a running program.
-
-12. Fixed a bug involving optimization of Tri-INTERCAL programs.
-
-13. Added to the lexer, so that it supports CLC-INTERCAL syntax for operators
- that were already present in C-INTERCAL, as long as they don't conflict
- with C-INTERCAL syntax. (Using the -X switch will support CLC-INTERCAL
- syntax for operators that were already present in C-INTERCAL even if they
- conflict with C-INTERCAL syntax.) For the symbols present in the
- CLC-INTERCAL character set but not in ASCII, ISO-8859-1 is supported as an
- encoding as well as UTF-8 (to increase the chance that CLC-INTERCAL
- programs will run without modification); it was meant to be supported to
- some extent before, but seemed not to be working.
-
-14. Added the COMMENT gerund, with the same semantics as in CLC-INTERCAL.
-
-15. Added COME FROM gerund. This suffers from the same restrictions as
- computed COME FROM, in that it can't be used in PIC programs and causes
- the program to end up substantially less efficient.
-
-16. Added support for prefix as well as infix unary operators. The rule is
- that any number of prefix unary operators, but only one infix unary
- operator, is allowed on each group, variable, and/or mesh. (Previously,
- only infix operators were supported, and then only one per mesh.)
-
-17. Added positional precedences to the parser. INTERCAL still doesn't have
- operator precedences (that would be completely contrary to the spirit of
- INTERCAL) but it now has rules for deciding on the meaning of previously
- ambiguous expressions. Chains of select and mingle operations right-
- associate, and when a unary operator could legitimately be in either a
- prefix or infix position, the infix position is assumed (although remember
- that only one infix operator is allowed for each group, variable, and/or
- mesh).
-
-18. Added the not character as a synonym for NOT.
-
-19. Added operand overloading, for onespot and twospot variables. This uses
- the slat operator in almost, but not quite, the same way as
- CLC-INTERCAL. Note that the width of unary operations will mostly depend
- on the type a variable appears to have in an expression, rather than on
- its actual bitwidth (if a onespot is overloaded to a twospot or vice
- versa). Note that meshes won't change as the result of operand overloading
- unless the -v option is used (an error will be generated instead).
-
-20. Added an option for generalised assignments. With the -v option,
- expressions (rather than just variables) can appear on the left of an
- assignment. Any meshes on the left of an assignment (even if in apparently
- inoccuous positions) may change value as a result. (Note that such
- assignments aren't always possible.) If the left-hand-side of an
- expression is anything other than simply a variable or a constant, the
- compiler will try to change the values of meshes and non-ignored variables
- in the expression to make it fit. (In bases other than 2, it will nearly
- always fail.) Unlike CLC-INTERCAL, assigning to a mesh only changes that
- mesh, not line labels or other uses of the number.
-
-21. Restricted the compiler to just one input file at a time (it used to break
- if this wasn't done anyway).
-
-22. Fixed a nonportability involving stdin and stdout in cesspool.c.
-
-23. Added support for the NEXT FROM command, with the same semantics as COME
- FROM (including computed NEXT FROM and NEXT FROM gerund), except that it
- saves the line that was NEXTed FROM on the choicepoint stack.
-
-24. Fixed a bug where the yuk debugger accessed unallocated memory.
-
-== Release 0.25 (by Alex Smith) 21 Jun 2006 ==
-
-1. Added support for computed ABSTAIN and TRY AGAIN.
-
-2. Added support for computed COME FROM.
-
-3. Added support for multithread programs. This includes ONCE and AGAIN,
-which also work in singlethread programs.
-
-4. Expanded intercal.el to support Font Lock and some utilities for
- generating INTERCAL-style constants. It also works with the
- compilation routines of Emacs to compile INTERCAL programs without
- the need for make. Degenerated C code now has a mode line to help
- with Emacs compatibility.
-
-5. Added a rudimentary debugger and profiler for singlethread programs. The
- debugger's features include useful things like 'write out INTERCAL expression
- in simpler terms' (which is only possible if -O is on). The profiler works
- much like gcov, counting the length of time spent in and number of executions
- of each command in the code.
-
-6. Changed searching for includes, libraries, syslib, skeleton. This
- is so that non-root users, or people who want to evaluate ick, can
- do so more simply. The compiler will search for the above files in
- the directory they should have been installed in, the current
- directory, and the directory in which ick's executable resides (in
- that order). Skeleton problems, in particular, seem to have been a
- major problem for unfamiliar users trying out ick.
-
-7. Added several new test programs to the Pit.
-
-8. Greatly expanded the original optimizer (which optimizes
- expressions). It can now recognize most of the idioms in syslib,
- and many idioms in other Pit programs. Also added a new optimizer,
- to try to optimize program flow, which is important because
- otherwise INTERCAL wouldn't have any rudimentary optimizers. There
- is also the -F optimizer, which I hope will become infamous. It
- creates object code which is close to maximally fast in some
- specialized situations, at the expense of compile time (compilation
- can take a very long time when -F is active) and object file
- size. I suggest checking its effect on primes.i.
-
-9. Fixed the grammar (again) in a spark/ears situation involving array
- subscripts, after proving that the previous fixes weren't adequate.
-
-10. Added support for backtracking (MAYBE, GO AHEAD, GO BACK). Note
- that it is possible for multithreading, backtracking, computed
- ABSTAIN, and computed COME FROM to all be used simultaneously in
- the same program, to help maximize obfuscation.
-
-11. Added an option (-l) for generating warnings. To prevent this
- actually being useful, it is designed to generate far too many
- warnings, which all have to be trawled through to find the
- important ones, and has no way to turn the unimportant ones off.
-
-12. Added the +printflow and +mystery options for executing INTERCAL programs.
- Note that it is not entirely obvious what either of them do (+printflow is a
- debugging aid, but the output is somewhat obfuscated, and I am not going to
- explain what +mystery does in this document).
-
-== Release 0.24 (by Eric S. Raymond) 31 Dec 2003 ==
-
-1. RPMs can now be built by non-root users.
-
-== Release 0.23 (by Eric S. Raymond) 9 Mar 2003 ==
-
-1. More fixes by Don Knuth. He found a bug in the type-propagation logic.
-
-== Release 0.22 (by Eric S. Raymond) 4 Mar 2003 ==
-
-1. Incorporated a minor fix patch from Donald Knuth. Yes, *the*
-Donald Knuth. Seems he found a weakness in the code for handling
-comments, and fixed it to do multiline comments properly. He also made
-some improvements to intercal.el, and contributed a test program.
-
-2. Updated build machinery. This package now uses GNU autoconf.
-
-== Release 0.21 (by Eric S. Raymond) 30 July 2002 ==
-
-1. Jonathan Nieder sent a grammar fix for BLR's old bug #5 (a bad spark-ears
- interaction.)
-
-2. Latin-1 support and makefile fixes from Magnus Bodin.
-
-== Release 0.20 (by Eric S. Raymond) 16 September 1999 ==
-
- (The following changes are due to John Cowan <cowan@ccil.org>)
-
-1. In addition to Latin-1, UTF-8 is now acceptable in source code as well.
- All the numerous currency symbols of Unicode (ISO 10646) can be used as
- big-money alternatives in their UTF-8 format. Indeed, a random mixture of
- Latin-1 and UTF-8 also works fine; this seems very much in the spirit of
- Intercal.
-
-2. Intercal has now been localized for the Ancient Roman as well as the
- Posix/C locale. You may input numbers in Latin and write Intercal programs
- using Latin keywords. See lexer.l for a list of equivalences.
-
-3. The Makefile in the pit directory now works like a real Makefile, and
- won't compile anything that's already been compiled.
-
-== Release 0.19 (by Eric S. Raymond) 16 August 1998 ==
-
-1. Fixed a code-generation error in assignments from tail and hybrid
- variables. (Error pointed out by Malcom Ryan.)
-
-== Release 0.18 (by Eric S. Raymond) 29 April 1998 ==
-
-(The following changes are due to John Cowan <cowan@ccil.org>)
-
-1. The source code is now POSIXly correct. By making the POSIX
- variable in the Makefile undefined, you can restore the use of
- <varargs.h>, but otherwise <stdarg.h> is now used.
-
-2. Latin-1 (ISO 8859-1) is now the standard input charset of C-INTERCAL.
- This means that the change operator (0xA2) has returned as an alternative to
- big money ($). Furthermore, the quid (0xA3) and zlotnik (0xA4) are also
- acceptable. For those using Latin-9 (ISO 8859-15), the euro (0xA4) will also
- work. ("Euro", like "ampersand", cannot be sillified further.)
- New names have been added to intercal.mm.
-
-3. A fortiori, input of Volap\"uk digits may now be in Latin-1 or TeX format.
-
-4. Yacc is now deprecated in favor of bison; some old yaccs don't do proper
- error recovery, and lines like "DO ~ ERROR" failed at compile time.
-
-5. Some minor portability bugs on systems where ptr_diff is not the same
- as int were removed by casting expressions of the form (ptr - ptr) to int.
-
-== Release 0.17 (by Eric S. Raymond) 27 Feb 1998 ==
-
-Incorporates a minor bug fix by Jeff Uphoff <juphoff@tarsier.cv.nrao.edu>.
-
-== Release 0.16 (by Brian Raiter and Eric S. Raymond) 26 May 1997 ==
-
-This is the 25th-anniversary release of INTERCAL. This language, conceived
-in irony a quarter century ago today, has outlasted many more serious and
-high-minded essays in computer language design. This fact should give us
-pause to reflect, or possibly frighten the crap out of us. Or both.
-
-1. Corrected manual bugs.
-
-2. Fixed over-enthusiastic install production in the Makefile.
-
-3. DO PLEASE is no longer accepted (Brian Raiter pointed out that the
- manual does not sanction it).
-
-4. Fixed various bugs in the optimizer.
-
-5. Incorporated fixes made by William Walter Patterson for bugs that
- appeared when multiple files are given on the command line.
-
-(The following changes are due to Brian Raiter)
-
-6. The system library is now available for TriINTERCAL (all bases, 3 to 7).
- The compiler has been updated to use the right library automagically.
-
-7. The error 774 feature has been brought into conformance with the
- Princeton compiler. The odds are now a flat 10% (but still 0% with -b).
-
-8. The compiler has been modified to allocate memory dynamically, and
- the hard-coded limits on program size and number of variables has
- been removed. Programs are now only limited by the amount of
- available memory.
-
-9. Array output now fflushes after outputting newlines.
-
-10. Two minor bug fixes: one in wimpmode input, which was clamping
- input to the signed integer range, and one in politesse checking.
- The latter was causing programs to be recognized as impolite only
- if their ratio was less that one-sixth, not one-fifth. (Fixing this
- also necessitated adding a few PLEASEs to pit/rot13.i.)
-
-11. Several new programs have been tossed into the pit.
-
-== Release 0.15 (by Eric S. Raymond) 20 Jun 1996 ==
-
-1. Switched the INTERCAL manual master to mgm in order to be able to handle
- section crossreferences properly. The manual has now been carefully
- proofread against the paper version by ESR and seems to match. It's
- also been independently proofread for typos by Brian Raiter.
-
-2. The optimizer now does complete analysis and evaluation of constant
- expressions at compile time.
-
-3. Added optimization templates for ~, |, &, ^ expressions. Also added
- |, &, ^ idioms to the system library, and documented them.
-
-(The following changes are due to Brian Raiter)
-
-4. Every one of the INTERCAL-72 messages is now emitted when appropriate.
- including the previously un-emitted E000, E197, and E200 (and see below).
-
-5. A close reading (while proofing) of the sections of the manual on
- error messages seems to indicate that splatted lines were only
- splatted in the default listing printed after a successful
- compile. (This seems to be a standard feature of IBM compilers; I
- remember that RPG did this as well.) My understanding of the manual is
- when the syntactically offensive line is encountered at runtime, it is
- printed as error E000. I have modified the code to do this.
-
-6. I have fixed INTERCAL in order to add another bug. Namely, I have
- implemented the BUG/NOBUG option in the Princeton compiler. By
- default, there is a chance that INTERCAL will randomly insert error
- E774 into your executable. (The odds are 1/128 per statement, not
- counting COME FROMs. Is there any way to find out what the
- Princeton compiler's odds were?) The new option -b turns this
- feature off.
-
-7. The new file pit/lib/numio.i contains routines for wimpmode I/O.
- These routines are documented in the file pit/lib/numio.doc.
- It is my earnest hope that C-INTERCAL programmers everywhere will
- flock to these handy routines, and C-INTERCAL users will thus no
- longer need to fear that they might succumb to the foul and awful
- temptation to use the dastardly +wimpmode option.
-
-== Release 0.14 (by Eric S. Raymond) 9 Jun 1996 ==
-
-1. The documentation has been reorganized and cleaned up (you can now
- format either a C-INTERCAL or INTERCAL-72 manual from the same master).
- The diagrams in the paper original have been transcribed as pic figures.
- See doc/READ.ME for details.
-
-2. Yet more code. The pit now includes a second random-number generator,
- a ROT13 filter, and even two programs in TriINTERCAL!
-
-3. Louis Howell's corrected system library is now included.
-
-4. The distribution is now formally GPLed.
-
-== Release 0.13 (by Eric S. Raymond) 5 Jun 1996 ==
-
-1. I folded in patches by Brian Raiter <breadbox@muppetlabs.com> that port
- this code to Linux, ANSIfies it, and enables it to use flex. Note: This
- version has been tested on Linux and SunOS but not yet elsewhere.
-
-2. Another piece of nontrivial INTERCAL code has been found! (Doubtless
- hell is freezing over even as I write.) We've added to the pit the
- `beer' program by Matt DiMeo <mdimeo@brooktree.com>, courtesy of the
- infamous Beer List (URL:http://www.ionet.net/~timtroyr/funhouse/beer.html).
-
-== Release 0.12 (by Eric S. Raymond) 22 Mar 1995 ==
-
-1. The code now compiles and runs under Linux, using bison and lex. It does
- *not* yet work with flex; C.P. Osborne's patches for 0.11 turned out not
- to be sufficient (at least for flex 2.4.6 under Linux using the -l option).
- See the BUGS list.
-
-2. Note 3 under 0.11 was incorrect. We're in conformance after all.
-
-3. The politesse check is a little smarter about programs too small to
- conform to the 1/5-to-1/3 criterion. All the pit programs have been
- checked for conformance. Also, the politesse error message now tells
- you the offending program's line count.
-
-== Release 0.11 (by Eric S. Raymond) 24 Sep 1994 ==
-
-1. Incorporated changes by Jan-Pieter Cornet <cornet@OTech.fgg.EUR.nl> for
- magical inclusion of the system library. These address an outstanding bug
-
- 2. (SS) The `system library' should be precompiled and `linked' to user
- written code, at least optionally. Doing this with the current compiler
- presents a few problems.
-
- which has accordingly been removed from the BUGS file. They also fix a
- previously unknown bug; due to a minor oversight in the lexer, it was not
- possible to ABSTAIN FROM WRITING IN or READING OUT. Jan also contributed
- a test program that demonstrates gerund abstention.
-
-2. Despite the obvious appeal of the idea, and much discussion on
- alt.lang.intercal, I decided *not* to add Klingon; maintaining two parallel
- grammars just so the compiler could support SVO and OSV languages would be
- too painful. There was also a minor mess near case-sensitivity in the
- digits. The workaround kluges I was offered instead failed to satisfy.
-
-3. We fess up to a violation of the INTERCAL-72 standard. That implementation,
- instead of accepting an entire multiple-digit number per line of input,
- expected one digit per *card image* (input line). It is unclear how
- INTERCAL-72 programs ever managed to input more than one number.
-
-4. Added patches by C.P.Osborne <boris@ibmpcug.co.uk> to make the lexer work
- using flex, for Linux and BSD/386 support. I didn't use his error-reporting
- patch, though; instead, I changed the parser to catch errors at logical-line
- level. I also kept the N in `RESUBNIT'; this is a carefully preserved
- feature of INTERCAL-72.
-
-5. Volapuk digits are now recognized on input. TO DO: Recognize Volapuk
- keywords, including gerunds.
-
-== Release 0.10 (by Eric S. Raymond) 9 Sep 1994 ==
-
-1. It is now possible to undo a line-number abstention with a gerund
- reinstatement, or undo a gerund abstention with a line-number
- reinstatement. In previous versions, gerund abstention/reinstatements and
- line-number abstention/reinstatements were independent of each other.
-
-2. After release 0.5, I wrote in the TO DO list as follows:
-
- 2. (ESR) Input format internationalization -- allow WRITE IN input digits in
- major languages such as Nahuatl, Tagalog, Sanskrit, and Basque.
-
- The twisted loons in the alt.folklore.computers crowd loved this idea,
- and I actually got sent digit lists for Nahuatl, Tagalog, Sanskrit, and
- Basque -- also, Kwakiutl, Georgian, Ojibwe, and Albanian. I've left
- out Albanian (didn't want to keep track of the dipthong diacritical)
- and Ojibwe (no zero digit). So: Nahuatl, Tagalog, Sanskrit, Basque,
- Georgian, and Kwakiutl are now supported in addition to English.
-
-3. The THEORY document has been significantly revised.
-
-== Release 0.9 (by Eric S. Raymond) 5 Mar 1993 ==
-
-1. An embarrassing port bug in the INTERCAL skeleton has been fixed
-
-2. Jamie Zawinski's suggestion for an improved E333 error message has
- been accepted.
-
-3. Added and improved documentation for pit programs.
-
-4. The install production in the Makefile now puts lose.h in place
- as well as cesspool.h.
-
-5. You can now set the C compiler to be used as a back end by INTERCAL
- by setting the environment variable CC. The default is cc.
-
-== Release 0.8 (many hacks on 0.7 by Eric Raymond) 21 Jan 1992 ==
-
-1. A previously undocumented `feature' of the Princeton compiler,
- revealed by Don Woods, is now emulated. If fewer than 1/5 or more
- than 1/3 of a program's statements contain the qualifier `PLEASE', the
- program is rejected with an entertaining error message. Programs in pit
- have been hacked to pass the politesse test.
-
-2. The `sample' program now works correctly, thanks to Louis Howell. Also,
- he has contributed new programs to calculate pi and to search for prime
- numbers.
-
-3. An intercal mode for GNU Emacs is included. It helps programmers deal with
- the new politesse check by randomly expanding the abbrev "do" to DO PLEASE
- or PLEASE DO about 1/4 of the time.
-
-4. Improvements in code generation for NEXT/RESUME.
-
-5. Fixes to the optimizer; it handles the results of optimized MINGLEs
- correctly now. Also, added a rewrite rule that checks for the
- equality-test idiom using XOR.
-
-6. The original error messages from the Princeton compiler have been restored.
-
-The documentation has been updated to reflect these changes.
-
-== Release 0.7 (by Louis Howell) 21 Dec 1991 ==
-
-In addition to bug fixes, new features in this version include arrays,
-character I/O, modified (hopefully improved!) semantics for the COME
-FROM statement, extensions to bases other than 2, new INTERCAL programs,
-and new documentation.
-
-== Release 0.6 (by Steve Swales) 5 Jan 1991 ==
-
-1. Restored Princeton documentation (courtesy of Michael Ernst).
-
-2. Added -@ usage option to ick.
-
-3. Added [+/-]help, [+/-]traditional, and [+/-]wimpmode options for
-generated programs; [+/-]traditional is a no-op at this point.
-
-4. Various bug fixes, esp. in lexical analysis.
-
-== Release 0.5 (ESR's second pre-release) 5 Jun 1990 ==
-
-1. As a convenience to all you junior birdmen out there, `NINER' is accepted as
- a synonym for `NINE' in INTERCAL input.
-
-2. The COME FROM statement is now compiled.
-
-== Release 0.3 (ESR's original pre-release) ==
-
-The resurrection of INTERCAL from its grave took place on 12 May 1990
-when ESR released 0.3 on an unsuspecting USENET.
|README | this file
|BUGS | current bug and to-do list
|NEWS | info on features and fixes new in this release
+|HISTORY | Longer-form history of the code tree
|COPYING | copyright and licence information
|MANIFEST | a list of all files in the distribution
|doc/READ.ME | historical notes on the docs
src/sizes.h src/uncommon.h src/yuk.h src/parser.y src/lexer.l \
doc/Makefile doc/fdl-1-2.txi doc/fix83.pl doc/fixtoc.pl \
doc/ickstyle.css doc/ick.txt doc/intercal.mm doc/READ.ME \
- doc/THEORY.txt doc/tidy.cfg parser.c parser.h \
- lexer.c doc/ick.txi doc/ick.txt doc/chipspec.txt NEWS README \
+ doc/THEORY.txt doc/tidy.cfg parser.c parser.h lexer.c control \
+ doc/ick.txi doc/ick.txt doc/chipspec.txt HISTORY NEWS README \
buildaux/buildconfig buildaux/buildconfig.ac \
buildaux/depcomp buildaux/hostmak.in buildaux/install-sh \
buildaux/missing buildaux/ylwrap buildaux/bconfigh.in
--- /dev/null
+# Not a real Debian control file, though the syntax is upward-compatible.
+# It's project metadata for the shipper tool
+
+Package: intercal
+
+Description: a compiler for the INTERCAL language
+ INTERCAL is the original esoteric language, a farrago of features
+ that will test the mettle of any programmer and bend the minds of
+ most. The INTERCAL suite includes not just a compiler and debugger
+ for the language but most of the code ever written for it as well.
+
+Homepage: http://www.catb.org/~esr/intercal
+XBS-Gitorious-URL: http://gitorious.org/intercal
+XBS-Project-Tag-List: language, retrocomputing, parody, hacker culture
+Destinations: mailto:mam@theory.stanford.edu
+ mailto:ais523@bham.ac.uk,
+ mailto:design@adastragames.com,
+ mailto:albaugh@employees.org