summaryrefslogtreecommitdiffstats
path: root/ChangeLog-2009-2015
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-08-08 21:28:23 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-08-08 21:28:23 -0700
commitac71292135de0f3a18b7d462bcc9379c0fe142d9 (patch)
tree48058d6ac300b56604b9c2241b669209c86047d1 /ChangeLog-2009-2015
parent6bc9935f204d6a79fe4523dd4c1fd287fd240b35 (diff)
downloadtxr-ac71292135de0f3a18b7d462bcc9379c0fe142d9.tar.gz
txr-ac71292135de0f3a18b7d462bcc9379c0fe142d9.tar.bz2
txr-ac71292135de0f3a18b7d462bcc9379c0fe142d9.zip
Discontinuing ChangeLog.
* ChangeLog: renamed to ChangeLog-2009-2015, and discontinued. Changes will be tracked only in the git commit messages from now on and not duplicated into the ChangeLog.
Diffstat (limited to 'ChangeLog-2009-2015')
-rw-r--r--ChangeLog-2009-201522389
1 files changed, 22389 insertions, 0 deletions
diff --git a/ChangeLog-2009-2015 b/ChangeLog-2009-2015
new file mode 100644
index 00000000..08a518a4
--- /dev/null
+++ b/ChangeLog-2009-2015
@@ -0,0 +1,22389 @@
+2015-08-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Discontinuing ChangeLog.
+
+ * ChangeLog: renamed to ChangeLog-2009-2015, and discontinued.
+ Changes will be tracked only in the git commit messages
+ from now on and not duplicated into the ChangeLog.
+
+2015-08-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 111.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version and date.
+
+ * share/txr/stdlib/ver.tl: Likewise.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ C++ upkeep: conversions, clashes, warnings.
+
+ * glob.c (glob_wrap): Fix signed/unsigned comparison.
+
+ * stream.c (make_null_stream): Fix convert beign used
+ where coerce is needed.
+
+ * sysif.c (dup_wrap): Fix use of C++ new keyword.
+
+2015-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ C++ static forward issue.
+
+ * lib.h (static_forward, static_def): New macros
+ for dealing with C++ static forward declaration problem.
+
+ * syslog.c (syslog_strm_ops): Use static
+ forward macros.
+
+2015-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ C++ upkeep: resolve multiple definitions of fun_k.
+
+ * eval.c (fun_k): Global definition removed.
+ (eval_init): Do not initialize fun_k here.
+
+ * filter.c (fun_k): Definition removed.
+ (filter_init): Do not initialize fun_k.
+
+ * filter.h (fun_k): Declaration removed.
+
+ * lib.c (fun_k): Defined in this file now.
+ (obj_init): Initialize fun_k here.
+
+ * lib.h (fun_k): Declare here.
+
+2015-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (SRCS): When top_srcdir is blank, elide the entire
+ --work-tree argument to git. On Cygwin, git throws a strange error
+ message when --work-tree is given a blank argument.
+
+2015-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c: Include <wctype.h> header for iswprint.
+ Needed on Cygwin.
+
+2015-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * sysif.c (w_lstat): If we don't have S_IFLINK, implement
+ w_lstat as an alias to w_stat. This helps build on MinGW.
+
+2015-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Change to different exception for debugger quit.
+
+ * debug.c (debug_quit_s): New global variable.
+ (debug): Throw debug-quit, not query-error.
+ (debug_init): Initialize debug_quit_s.
+
+2015-08-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (help): Rearrange menu. Show missing quit command.
+
+2015-08-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Suppress debug stepping into auto-loaded library code.
+
+ * debug.c (debug_set_state, debug_restore_state): New functions.
+
+ * debug.h (debug_state_t): New type.
+ (debug_set_state, debug_restore_state): Declared, and defined
+ as dummy macros in non-debug-support build.
+
+ * lisplib.c (opt_dbg_autoload): New global variable.
+ (lisplib_try_load): Disable or enable debugging around
+ library loading based on opt_dbg_autoload option.
+
+ * lisplib.h (opt_dbg_autoload): Declared.
+
+ * txr.c (help): List --debug-autoload option.
+ (no_dbg_support): New static function to avoid repeated code.
+ (txr_main): Add debugger-autoload option. Change duplicate no debug
+ support error messages into calls to no_dbg_support.
+
+ * txr.1: Document --debug-autoload
+
+2015-08-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): Bugfix: debugger long option nonfunctional.
+
+2015-08-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Better diagnosis for loose @ forms.
+
+ * eval.c (op_meta_error): New static function.
+ (eval_init): Register sys:var and sys:expr as operators
+ that throw error.
+
+ * parser.y (sym_helper): Take parser_t instead of scanner_t
+ argument so we have access to the name and line number.
+ Obtain scanner internally from parser. Add source location
+ info to (sys:var ...) form.
+ (symhlpr): Retarget macro to pass parser rather than scanner to
+ sm_helper.
+
+2015-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ New filesystem object testing functions.
+
+ * lisplib.c (path_test_set_entries, path_test_instantiate):
+ New static functions.
+ (dlt_register): Registered new functions to dl_table.
+
+ * txr.1: Documented new functions.
+
+ * share/txr/stdlib/path-test.tl: New file.
+
+2015-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding support for uid and gid manipulation.
+
+ * configure: Added check for geteuid and related functions.
+
+ * sysif.c (getuid_wrap, geteuid_wrap, getgid_wrap, getegid_wrap,
+ getgroups_wrap, setuid_wrap, seteuid_wrap, setgid_wrap, setegid_wrap):
+ New static functions.
+ (sysif_init): Register intrinsics getuid, geteuid, getgid,
+ getegid, getgroups, setuid, seteuid, setgid, setegid.
+
+ * txr.1: Documented new functions.
+
+2015-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (system_error_s): New symbol variable.
+ (obj_init): Initialize new variable.
+
+ * lib.h (system_error_s): Declared.
+
+ * unwind.c (uw_init): Register system-error exception type.
+
+2015-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (stream_init): Register get-indent-mode, set-indent-mode,
+ test-set-indent-mode, get-indent, set-indent, inc-indent
+ and width-check intrinsic functions. Register indent-off,
+ indent-data and indent-code variables.
+
+ * txr.1: Documented stream output indentation API.
+
+2015-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (width_check): Just use the public
+ put_char function; no need to manipulate column
+ or call put_indent.
+
+2015-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Better diagnostic in funcall family of functions.
+
+ * lib.c (wrongargs): New static function.
+ (funcall, funcall2, funcall2, funcall3, funcall4):
+ Use wrongargs.
+
+2015-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (do_eval): Bugfix: though last_form_evaled is
+ saved and restored around the execution of a special operator,
+ it is never set the current form.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_args): Use new ~! for proper indentation
+ of multi-line context form.
+ (apply): Use ~! for proper indentation of function code.
+
+ * unwind.c (uw_throw): Use ~! for proper indentation of code.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (put_string): In indent mode, put_string has
+ to process all the characters as if by put_char,
+ (which we now do literally that way).
+ (set_indent_mode): Bugfix: no longer reset the column
+ to zero when turning off indent mode. This is wrong since
+ streams do column counting all the time.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Implement ~! format directive for indentation.
+ Allow negative widths to be specified with a leading minus sign,
+ so that we can indent to the left.
+
+ * txr.1: Document ~! format directive.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (put_string, put_char): Do not put out the indentation
+ immediately after outputting a newline. Rather, delay the output of the
+ indentation until some output occurs at column zero.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (inc_indent): If a negative indentation increment goes below
+ zero, clamp it at zero.
+ (set_indent): Clamp indentation value to zero.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vormat): Bugfix: when width specified as *
+ meets a negative argument, the width should be treated
+ as positive and the field left aligned. Instead, the
+ width is treated as zero.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (string_out_put_string): Do not return nil when
+ buffer calculations overflow, but throw exception.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Remove useless return values and checks.
+
+ * stream.c (vformat_align_pre, vformat_align_post): Change to void
+ return. Do not check return value of put_char.
+ (vformat_num, vformat_str): Change to void return. Do not check return
+ value of vformat_align_pre, vformat_aign_post or put_char.
+ (vformat): Do not check return value of vformat_str or vformat_num.
+ nilout exit point no longer needed.
+ (put_string): Do not intercept return value of ops->put_string.
+ Return t.
+ (put_char): Do not intercept return value of ops->put_char.
+ Do not check return value of put_indent. Return t.
+
+ * txr.1: Document t return of put-char, put-byte and put-string.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (func_get_name): New function.
+ (bind_args): Include the entire context form in argument
+ mismatch errors.
+ (apply): Include the function name, or else source code
+ if it has no name, in argument mismatch erors.
+ (eval_init): Register func-get-name intrinsic.
+
+ * eval.h (func_get_name): Declared.
+
+ * txr.1: Documented func-get-name.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (force): Default the new second argument of source_loc_str.
+ (eval_error): Derive location of error from
+ the last_form_evaled, if form doesn't have it.
+ (eval_init): Re-register source-loc-str as binary with an optional arg.
+
+ * match.c (debuglf, sem_error, file_err, typed_error): Default new
+ argument of source_loc_str.
+
+ * parser.h (source_loc_str): Declaration updated.
+
+ * parser.l (source_loc_str): Take second argument which specifies
+ alternative value if the source loc info is not found.
+
+ * unwind.c (uw_throw): Simplify code thanks to source_loc_str
+ default argument.
+
+ * txr.1: Document new argument of source-loc-str.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_revget): New function.
+
+ * hash.h (hash_revget): Declared.
+
+ * eval.c (eval_init): Registered hash-revget intrinsic.
+
+ * txr.1: Documented hash-revget.
+
+2015-08-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (indent_mode_put_string): Function removed,
+ logic hoisted into put_string.
+ (put_string, put_char): Always count column, indent mode or not.
+
+ * tests/009/json.expected: Updated.
+
+2015-08-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Define TXR_DBG macro when compiling debug build.
+
+ * Makefile (dbg/%.o): Pass $(DBG_ONLY_FLAGS) to COMPILE_C_WITH_DEPS
+ recipe macro.
+
+ * configure (debug_only_flags): New macro.
+ (gen_config_make): Generate DBG_ONLY_FLAGS.
+ Add debug-only-flags to usage help text.
+
+2015-08-03 Christopher Meng <i@cicku.me>
+
+ Custom linker flags support.
+
+ * Makefile (PLATFORM_FLAGS): Rename to PLATFORM_CFLAGS.
+ (LDFLAGS): New variable. Includes -lm and PLATFORM_CFLAGS.
+ (LINK_PROG): Use $(LDFLAGS) instead of -lm.
+
+ * configure (platform_flags): Renamed to platform_cflags.
+ (platform_ldflags): New variable.
+ (gen_config_make): Rename PLATFORM_CFLAGS and generate
+ PLATFORM_LDFLAGS.
+ Usage help text updated.
+
+2015-08-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Switching some globals to lexical and changing some names.
+
+ * arith.c (arith-init): Changing *flo-...* from special to
+ lexical, and adding un-earmuffed variants. The earmuffed
+ versions are obsolescent.
+ Adding %pi% and %e% global lexicals. Earmuffed versions are
+ also made global lexical, and obsolescent.
+
+ * eval.c (lookup_global_var, lookup_global_var_l): New functions.
+ (lookup_var): Uses lookup_global_var.
+ (reg_varl): New function.
+ (reg_var): Uses reg_var.
+ (eval_init): Register global lexicals user-package, system-package
+ and keyword-package. Old symbols with earmuffs are obsoleted,
+ and also turned into global lexicals.
+ (top-vb, top-fb): Changed to lexical.
+
+ * eval.h (lookup_global_var, lookup_global_var_l, reg_varl):
+ Declared.
+
+ * genvim.txr: Scan ver.tl so that the lib-version variable
+ is included. Extract reg_varl calls.
+
+ * glob.c (glob_init): glob-err and other variables made lexical.
+
+ * lib.c (get_user_package, get_system_package, get_keyword_package):
+ Use lookup_global_var_l to avoid searching dynamic scope for
+ lexicals which cannot be dynamically rebound.
+
+ * share/txr/stdlib/ver.tl (lib-version): New global lexical variable.
+ (*lib-version*): Turned lexical. Obsolescent.
+
+ * signal.c (sig-init): sig-* variables turned lexical.
+
+ * sysif.c (sysif-init): s-*, poll-* and w-* variables turned lexical.
+
+ * syslog.c (syslog-init): log-* variables turned lexical.
+
+ * txr.c (sysroot-init): stdlib and *txr-version* variables turned
+ lexical. txr-version variable added, and *txr-version* is
+ obsolescent.
+ (txr-main): self-path variable added. *self-path* turns lexical
+ and is obsolescent.
+
+ * txr.1: Documentation updated. Lexical variables not referred
+ to as special. Special variables referred to as special.
+
+
+2015-08-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): Bugfix: register *args-full*, the variable
+ described in the documentation! We keep *full-args* for backward
+ compatibility, as an obsolescent feature.
+
+2015-08-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Introducing global lexicals: defvarl, defparml.
+
+ * eval.c (defvarl_s, defparm_s, defparml_s, sys_mark_special_s): New
+ symbol variables.
+ (mark_special): Return val rather than void, since it's hoisted
+ into Lisp domain now with func_n1.
+ (op_defvar): Renamed to op_defvarl, and doesn't call mark_special.
+ defvarl is now the special form for defining variables, and special
+ marking is an embellishment added by macros.
+ (me_defparm): Renamed to me_def_variable. Handles defvar, defparm
+ and defparml.
+ (do_expand): Expand defvarl, rather than defvar.
+ (eval_init): Intern defvarl, defparm, defparml and mark-special
+ symbols, and initialize corresponding globals.
+ Register defvarl special operator, retiring defvar.
+ Register defparm to me_def_variable, and register defvar and
+ defparml to the same.
+
+ * txr.1: Document support for global lexical scopes and the
+ new macros.
+
+2015-08-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Support lstat and fstat.
+
+ * stream.h (statf): Declaration removed.
+
+ * sysif.c (w_stat): Function takes val instead of const wchar_t *
+ as leftmost argument.
+ (w_lstat, w_fstat): New static functions, with same interface as w_stat.
+ (stat_to_list, stat_impl): New static functions.
+ (statp, statl): New static functions.
+ (statf): Function removed, name re-used for new static function.
+ (sysif_init): stat intrinsic registered to statp function, not statf.
+ lstat and fstat intrinsics registered to statl and statf.
+
+ * txr.1: Documented lstat and fstat.
+
+2015-08-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Pass pretty flag to cobj print operation.
+
+ * hash.c (hash_print_op): Take third argument,
+ and call cobj_print_impl rather than cobj_print.
+
+ * lib.c (cobj_print_op): Take third argument. The object class is
+ * printed with obj_print_impl.
+ (obj_print_impl): Static function becomes extern. Passes its pretty
+ flag argument to cobj print virtual function.
+
+ * lib.h (cobj_ops): print takes third argument.
+ (cobj_print_op): Declaration updated.
+ (obj_print_impl): Declared.
+
+ * regex.c (regex_print): Takes third argument, and ignores it.
+
+ * stream.c (stream_print_op, stdio_stream_print, cat_stream_print):
+ Take third argument, and ignore it.
+
+ * stream.h (stream_print_op): Declaration updated.
+
+2015-08-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (special_p): Function renamed to special_var_p.
+ (expand_opt_params_rec, expand_vars): Follow rename of special_p.
+ (eval_init): Register special-operator-p and special-var-p
+ intrinsics.
+
+ * txr.1: Document special-operator-p and special-var-p.
+
+2015-08-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Big TXR Lisp documentation rearrangement.
+
+ * txr.1: Numerous sections moved around. Miscellaneous formatting
+ and wording fixes. New sections under TXR Lisp intro section.
+
+2015-07-31 Kaz Kylheku <kaz@kylheku.com>
+
+ string_output renamed to string_out
+
+ * stream.c (struct string_output): Renamed to string_out.
+ (string_out_stream_destroy, string_out_byte_callback,
+ string_out_put_char, strnig_out_put_string, string_out_put_byte,
+ make_string_output_stream, get_string_from_stream): Follow rename.
+
+2015-07-31 Kaz Kylheku <kaz@kylheku.com>
+
+ Simplify type check code in stream module.
+
+ * stream.c (get_string_from_stream, get_list_from_stream,
+ stream_set_prop, stream_get_prop, close_stream, get_line,
+ get_char, get_byte, unget_char, unget_byte, put_string,
+ put_char, put_byte, flush_stream, seek_stream): Use cobj_handle and
+ cobj_ops instead of type_check and type_assert.
+ (get_indent_mode, test_set_indent_mode, set_indent_mode,
+ get_indent, set_indent, inc_indent, width_check): Use cobj_handle
+ and cobj_ops instead of stream->co.handle and stream->co.ops
+ for safety.
+
+ (vformat, format): Use class_check instead of type_check and
+ type_assert.
+
+2015-07-31 Kaz Kylheku <kaz@kylheku.com>
+
+ Multi-line, indented printing of structure.
+
+ * eval.c (op_error): New static function.
+ (macro_form_p, fboundp): Static to external.
+ (special_operator_p): New function.
+ (eval_init): Register macrolet and symacrolet to op_error.
+ These are recognized and processed by expand, but we want
+ them in the op table so they are reported by special_operator_p.
+
+ * eval.h (fboundp, macro_form_p, special_operator_p): Declared.
+
+ * hash.c (print_key_val): Break long lines on spaces
+ between pairs with stream_width_check.
+ (hash_print_op): Implement split and indented printing.
+
+ * lib.c (obj_print_impl): New static function, resulting
+ from a merge of obj_print and obj_pprint. Fixes some
+ wrong-way recursion bugs: obj_pprint recursed into obj_print
+ in some places. Adds support for multi-line printing of
+ vectors and lists, with indentation using the new
+ interfaces in streams.
+
+ * stream.c (strm_base_init): Update initializer.
+ (put_indent, indent_mode_put_string): New static functions.
+ (put_string): Use indent_mode_put_string in either of the
+ two indent modes.
+ (put_char): Implement indent mode.
+ (get_indent_mode, test_set_indent_mode,
+ set_indent_mode, get_indent, set_indent,
+ inc_indent, width_check): New functions.
+
+ * stream.h (enum indent_mode): New.
+ (struct strm_base): indent_on member becomes indent_mode.
+ New members data_width and code_width.
+ (get_indent_mode, test_set_indent_mode,
+ set_indent_mode, get_indent, set_indent,
+ inc_indent, width_check): Declared.
+
+ * tests/009/json.expected: Updated.
+
+ * tests/010/seq.expected: Likewise.
+
+ * tests/011/macros-2.expected: Likewise.
+
+2015-07-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c, utf8.c: Fix bad indentation introduced in whitespace
+ fix on 2013-08-09.
+
+2015-07-30 Kaz Kylheku <kaz@kylheku.com>
+
+ Correction to COBJ initialization pattern.
+
+ In fact, the previosuly documented process is not correct and still
+ leaves a corruption problem under generational GC (which has been the
+ default for some time).
+
+ * HACKING: Document flaw in the initialization pattern previously
+ thought to be correct, and show fix.
+
+ * hash.c (copy_hash): Fix instance of incorrect pattern.
+
+ * regex.c (regex_compile): Likewise.
+
+2015-07-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Restore accidentally deleted document title.
+
+2015-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Deriving streams from the same base, so
+ we can give streams some common slots.
+
+ * stream.c (strm_base_init, strm_base_cleanup, strm_base_mark,
+ stream_destroy_op, stream_mark_op): New functions.
+ (null_ops): Switch to stream_destroy_op and stream_mark_op.
+ (make_null_stream): Associate a strm_base instance with the
+ cobj handle rather than a null pointer.
+ (struct stdio_handle): Inherit struct strm_base.
+ (stdio_stream_destroy): Clean up the strm_base part.
+ (stdio_stream_mark): Mark the strm_base part.
+ (make_stdio_stream_common): Initialize the strm_base part.
+ (struct dir_handle): Inherit struct strm_base.
+ (dir_destroy): Clean up the strm_base part.
+ (dir_mark): Mark the strm_base part.
+ (make_dir_stream): Initialize the strm_base part.
+ (struct string_in): New structure. Replaces ad-hoc cons
+ cell used for string input streams.
+ (string_in_stream_mark): Mark new structure.
+ (string_in_get_line, string_in_get_char, string_in_unget_char,
+ string_in_get_prop, string_in_get_error, make_string_input_stream):
+ Convert to new structure.
+ (string_in_ops): Switch to stream_destroy_op.
+ (struct byte_input): Inherit struct strm_base.
+ (byte_in_stream_destroy): No need to check handle for null.
+ No need to set handle to null after freeing: gc does it.
+ Clean up the strm_base part.
+ (byte_in_ops): Switch to stream_mark_op.
+ (make_string_byte_input_stream): Initialize the strm_base part.
+ (struct string_output): Inherit struct strm_base.
+ (string_out_stream_destroy): No need to check handle for null
+ since the logic elsewhere has changed.
+ Clean up the strm_base part.
+ No need to set handle to null.
+ (string_out_ops): Switch to stream_mark_op.
+ (make_string_output_stream): Initialize the strm_base part.
+ (get_string_from_stream): Don't free the handle.
+ Null out the buffer so->buf whose ownership passes to the string.
+ (struct strlist_out): New structure. Replaces ad-hoc cons cell
+ used for string list output stream.
+ (strlist_mark): Renamed to strlist_out_mark. Mark the strm_base
+ part.
+ (strlist_out_put_string, strlist_out_put_char,
+ make_strlist_output_stream, get_list_from_stream):
+ Convert to new structure.
+ (strlist_out_ops): Switch to stream_destroy_op.
+ Follow rename of strlist_mark.
+ (struct cat_strm): New structure, replacing ad-hoc list pointer
+
+2015-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (finalize): Null out cobj handle after calling the
+ destructor. This can catch some use-after-free errors.
+
+2015-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (common_destroy): Function removed.
+ (stdio_stream_destroy, dir_destroy): Call close_stream directly.
+
+2015-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c: Rearranging definitions and declarations so that
+ code for each stream type is together. Moving catenated
+ streams above utility functions, so they are together with
+ other stream definitions.
+
+2015-07-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Centered fields in format.
+
+ * stream.c (enum align): New enum.
+ (vformat_align_pre, vformat_align_post): New static functions.
+ (vformat_num, vformat_str): Argument left renamed to align, and changed
+ to enum align. vformat_align_pre and vformat_align_post are called to
+ generate the correct padding for left, center and right alignment.
+ (vformat): Two-valued local variable left turned into three-valued
+ align. The ^ prefix on the width field is recognized.
+
+ * txr.1: Documented ^ width prefix.
+
+2015-07-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * share/txr/stdlib/txr-case.tl (txr-case-impl): Bugfix,
+ handle nil case in recursion.
+
+2015-07-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: In introduction of user-defined places, mentioning
+ placelet as a way of writing place update macros.
+ Example added under placelet.
+
+2015-07-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 110.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version and date.
+
+ * share/txr/stdlib/ver.tl: Likewise.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-07-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Improved highlighting of items in quasiquote.
+ Lists can be spliced and quoted. Metanums and metavars can
+ be prefixed by multiple @'s.
+
+2015-07-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Do not refer to installed code via stdlib.
+ Refer to source tree.
+
+2015-07-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Quasiliteral tests.
+
+ * tests/012/quasi.expected: New file.
+
+ * tests/012/quasi.tl: New file.
+
+2015-07-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (tst/tets/012/%): Disable --gc-debug for
+ tests in this directory.
+
+2015-07-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/012/ifa.tl: New test for it being bound to a place.
+
+2015-07-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: place-form-p must expand place macros.
+
+ * share/txr/stdlib/place.tl (place-form-p): Take
+ environment parameter. Expand the place form using sys:pl-expand.
+
+ * share/txr/stdlib/ifa.tl (ifa): Pass environment
+ to place-form-p.
+ (nthcdr): Pass environment down to place-form-p.
+
+2015-07-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_quote): Improved diagnostic.
+
+2015-07-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Set up blank top_srcdir if building in source directory.
+
+ This means short, relative names are used for C source files when
+ compiling in the source directory.
+
+ * Makefile (CFLAGS): Exclude -iquote $(top_srcdir) arguments
+ if top_srcdir is blank. Remove slash after $(top_srcdir),
+ since the variable includes it now, if its value is not blank.
+ (SRCS, ABBREV, opt/%-win.o, lex.yy.c, y.tab.c, install): Remove slash
+ after $(top_srcdir).
+ (dbg/%.o, opt/%.o): Only include rules for depending
+ on $(top_srcdir)%.c prerequisite if top_srcdir is not blank.
+ In the blank case, the rules are redundant.
+
+ * configure: if configuring in the root of the source tree,
+ establish top_srcdir as blank, otherwise establish is as
+ an absolute path with a trailing slash.
+
+2015-07-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Split off test macros from ifa.tl into common file.
+
+ * Makefile (TESTS_OUT): Don't use find to hunt down tests;
+ but rather wildcard. This way common.tl is not mistakenly
+ identified as an independent test file.
+
+ * tests/012/ifa.tl: Removed test code, placed in new file
+ which is loaded.
+
+ * tests/common.tl: New file.
+
+2015-07-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixes for building in separate dir.
+
+ * Makefile (CFLAGS): Search for mpi header in $(top_srcdir).
+ (ABBREV): Remove top_srcdir prefix from source names.
+ (dbg/%.o, opt/%.o): Extra set of pattern rules for searching
+ for prerequisites in $(top_srcdir) where primary C sources
+ are found and in the local dir where some generated C is found.
+ This way we don't rely on VPATH.
+ (opt/%.res): Bogus target removed.
+ (VPATH): Removed in favor of explicitly referencing $(top_srcdir).
+ Was causing problems for tests.
+ (lex.yy.c, y.tab.c): Prerequisites referenced in $(top_srcdir).
+
+2015-07-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (grammar): Do not allow unescaped newline in
+ word list literals and word list quasiliterals, except
+ in <= 109 compatibility mode. An escaped newline in
+ these literals, together with surrounding whitespace,
+ now produces a single space, except in <= 109
+ compatibility mode.
+
+ * txr.1: Documented new rules for WLL's and QLL's,
+ and added compatibility notes.
+
+2015-07-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Scan cadr.c, cadr.tl, with-resources.tl, txr-case.tl.
+ Remove hard-coded txr-case symbols. Recognize operators registered
+ with in-line intern.
+
+2015-07-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding with-resources macro.
+
+ * share/txr/stdlib/with-resources.tl: New file.
+
+ * lisplib.c (with_resource_set_entries, with_resources_instantiate):
+ New static functions.
+ (lisplib_init): Register new functions under dlt_register.
+
+ * txr.1: Document with-resources.
+
+2015-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding nthcdr as accessor.
+
+ * eval.c (eval_init): Register nthcdr function.
+
+ * lib.c (nthcdr): New function.
+
+ * lib.h (nthcdr): Declared.
+
+ * share/txr/stdlib/place.tl (nthcdr): New defplace.
+
+ * txr.1: Documented.
+
+2015-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Improve bad argument diagnosis for place macros.
+
+ * eval.c (op_mac_param_bind): New static function.
+ (eval_init): Register mac-param-bind operator.
+
+ * share/txr/stdlib/place.tl (define-place-macro): Use
+ mac-param-bind inside a lambda instead of tb macro.
+
+ * txr.1: Document mac-param-bind.
+
+2015-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing second through tenth as places.
+
+ * eval.c (eval_init): Register second through tenth as intrinsic.
+
+ * gencadr.txr: New cadr.c changes encoded.
+
+ * lib.c (second, third, fourth, fifth, sixth): Functions
+ reimplemented using ref, so they are much more efficient
+ for vectors and strings.
+ (seventh, eighth, ninth, tenth): New functions.
+
+ * lib.h (seventh, eighth, ninth, tenth): Declared.
+
+ * share/txr/stdlib/place.tl: place macros defined for
+ second through tenth.
+
+ * txr.1: Documented.
+
+2015-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * lisplib.c (place_set_entries): Add *place-macro* and
+ define-place-macro to list of names.
+
+ * share/txr/stdlib/place.tl (*place-macro*): New global hash.
+ (sys:tigger-load, sys:pl-expand): New functions.
+ (call-update-expander, call-clobber-expander, call-delete-expander):
+ Recognize and expand place macros.
+ (define-place-macro): New macro.
+ (first, rest): Places redefined using define-place-macro, replacing
+ the old hack of copying the expanders from one table entry to another.
+
+ * txr.1: Documented place macros.
+
+2015-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_print, obj_pprint): Bugfix: incorrect
+ value returned when printing dwim forms, due to
+ mutating the obj variable.
+
+2015-07-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing caar, cadr, cdar and friends.
+
+ * lib.c (init): Call cadr_init.
+
+ * lisplib.c (dl_table, set_dlt_entries, dlt_register): Externalize.
+
+ * lisplib.h (dl_table, set_dlt_entries, dlt_register): Declared.
+
+ * Makefile (OBJS): Add cadr.o.
+
+ * cadr.c: New file.
+
+ * cadr.h: New file.
+
+ * gencadr.txr: New file.
+
+ * share/txr/stdlib/cadr.tl: New file.
+
+ * txr.1: Document cadr accessors.
+
+2015-07-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * share/txr/stdlib/place.tl (defplace cdr): Change deletion
+ semantics so that (del (cdr x)) is symmetric with (del (car x)).
+
+ * txr.1: Update documentation.
+
+2015-07-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register new split function.
+
+ * lib.c (split_func): New static function.
+ (partition_split_common): New static function, based on
+ on contents of partition function.
+ (partition): Now a wrapper around partition_split_common.
+ (split): New function.
+
+ * lib.h (split): Documented.
+
+ * txr.1: Documented split.
+
+2015-07-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.c (open_txr_file): Bugfix: the name of the parsed
+ stream should be the resolved name, not the abstract original,
+ so that error messages correlate to the file.
+
+2015-07-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * share/txr/stdlib/ifa.tl (ifa): Use placelet to
+ allow "it" to be mutable when it denotes a place form.
+
+2015-07-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * share/txr/stdlib/place.tl (place-form-p): New function.
+
+ * lisplib.c (place_set_entries): Add place-form-p to list of names.
+
+2015-07-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Expand away sys:lisp1-value based on lexical info.
+
+ * eval.c (sys_lisp1_value_s): New global symbol variable.
+ (expand_lisp1_value): New static function.
+ (do_expand): Use expand_lisp1_value.
+ (eval_init): Initialize sys_lisp1_value_s.
+
+2015-07-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Let's have placelet and placelet*.
+
+ * share/txr/stdlib/place.tl (placelet*): New macro.
+
+ * lisplib.c (place_set_entries): Add placelet* to list of names.
+
+ * txr.1: Updated to document placelet* and fix mistakes.
+
+2015-07-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * share/txr/stdlib/place.tl (defplace dwim): Eliminate
+ ogetter-sym variable for caching the sequence; use the getter
+ for the sequence place to access it. Again, this is for placelet,
+ where the caching is visible. Another way to fix this is to
+ clobber the cache variable when updating the sequence place.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register bindable as intrinsic.
+
+ * txr.1: Documented.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ New placelet macro.
+
+ * lisplib.c (place_set_entries): Add placelet to list of names.
+
+ * share/txr/stdlib/place.tl (sys:placelet1, placelet): New macros.
+ (defplace dwim): Do not retrieve the
+ place's value into a local variable and have the getter
+ expand to that variable. Rather, have the getter retrieve the
+ value. A getter that refers to a cached copy breaks
+ the semantics of placelet, and any place operator which can
+ evaluate the location after it is stored.
+
+ * txr.1: Documented placelet.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Handle setting of parse name through prime_parser.
+
+ * parser.c (prime_parser): Take name as argument,
+ and install it into parser.
+ (lisp_parser): Pass name to parse, instead of setting it
+ in the parser object.
+
+ * parser.y (parse): Take name as argument and pass
+ down to prime_parser.
+
+ * parser.h (prime_parser, parse): Declarations updated.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix wrong name reported for errors in first top-level form.
+
+ * parser.c (read_eval_stream): Get name of original stream,
+ and pass that down to lisp_parse as the name argument.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix off by one error line numbers for .tl files.
+
+ * parser.c (read_eval_stream): Add terminating newline to
+ the first line that was examined for hash bang.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Remove unused "primer" member from parser_t.
+
+ * parser.c (parser_mark, parser_common_init): Remove reference to primer.
+ (parser): Don't take primer argument, remove reference to member.
+ (ensure_parser): Don't take primer argument, don't pass to parser
+ function.
+ (lisp_parse): Don't pass primer string to ensure_parser.
+
+ * parser.h (primer_t): Remove primer member.
+ (parser): Declaration updated.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: lexer loses unmatched "hold char" between top-level forms.
+
+ Test case: file containing 4(prinl 3). Scanner consumes 4 and (.
+ The ( is lost when the scanner is reset for the next call to yyparse,
+ resulting in jut prinl being read and interpreted as a variable.
+
+ * parser.c (prime_parser): If present, append hold byte to priming
+ string. Takes parser_t * instead of parser, and returns void now.
+
+ * parser.l (reset_scanner): Now returns int value, the value
+ of the scanner's yy_hold_char variable which is nonzero when
+ the scanner is hanging on to an unmatched byte of input.
+
+ * parser.h (reset_scanner, prime_parser): Declarations updated.
+
+ * parser.y (parse): Pass hold byte returned by reset_scanner to
+ prime_parser.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (byte_in_unget_byte): Wrong function name in error message.
+
+2015-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix unget-byte and unget-char on catenated streams.
+
+ * stream.c (cat_unget_byte, cat_unget_char): Recursive
+ call to unget_byte and unget_char with reversed arguments.
+
+2015-07-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Parser cleanup: embed scanner in parser.
+
+ * parser.c (parser_destroy): New GC finalizer static function.
+ (parser_ops): Register parser_destroy.
+ (parser_common_init): New function, shared by parse and parse_once.
+ Initializes embedded scanner.
+ (parser_cleanup): New function, shared by parse_once and
+ parser_destroy.
+ (parser): Use parser_common_init.
+
+ * parser.h (parser_t): New member, yyscan.
+ (reset_scanner, parser_common_init): Declared.
+
+ * parser.l (reset_scanner): New function.
+
+ * parser.y (parse_once): Use parser_common_init, and
+ thus perform only a few initializations. Do not
+ define scanner as a local variable.
+ (parse): Call reset_scanner instead of
+ yylex_init since the scanner is being reused,
+ and for the same reason do not call yylex_destroy.
+ GC will do that now.
+
+2015-07-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: define-modify-macro not registered for auto-loading.
+
+ * lisplib.c (place_set_entries): Add define-modify-macro to
+ list of names.
+
+2015-07-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: allow @1 in brace variables.
+
+ * parser.l (grammar): Scan a METANUM token in the
+ BRACED state also. This allows us to correctly
+ reference op arguments in a quasiliteral, as in
+ `foo @{@1 [1..2] ","} bar`.
+
+2015-07-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Improved printing of stream objects.
+
+ * stream.c (null_stream_print): Static function removed.
+ (stream_print_op): New function. Prints stream's name and address.
+ (null_get_prop): Pull stream name from strm_ops structure
+ rather than hard-coding to "null-stream".
+ (null_ops, stdio_ops, tail_ops, pipe_ops, string_in_ops,
+ byte_in_ops, string_out_ops, strlist_out_ops, dir_ops,
+ cat_stream_ops): Use stream_print_op in place of cobj_print_op.
+ Initialize name.
+ (stdio_stream_print): Use name from ops structure,
+ and include object address.
+ (string_in_get_prop): Likewise.
+ (cat_stream_print): Likewise.
+
+ * stream.h (struct strm_ops): New member, name.
+ (strm_ops_init): Initialize name.
+ (stream_print_op): Declared.
+
+ * syslog.c (syslog_strm_ops): Use stream_print_op. Initialize name.
+
+2015-07-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix in printed rep of stdio stream.
+
+ * stream.c (stdio_stream_print): Wrong way test on h->pid;
+ if it is nonzero it must be printed. Was printed wrong:
+ argument of integer type passed to ~s which expects a val.
+
+2015-07-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Clarify clear-error and flush return value.
+
+ * stream.c (stdio_clear_error): Return the prior value of h->err.
+ Do not inspect feof(h->f) or ferror(h->f); just clear the error
+ status of the stream.
+ (stdio_close): Set h->err from errno if fclose failed.
+ (dir_clear_error): Return prior value of h->err.
+
+ * txr.1: Document return value convetion for clear-error,
+ and flush-stream.
+
+2015-07-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Tightening behavior for unimplemented stream ops.
+
+ In many cases, if a stream operation is not applicable to a stream, it
+ is not appropriate to just do nothing and return nil. An error
+ must be thrown.
+
+ * stream.c (unimpl, unimpl_put_string, unimpl_put_char,
+ unimpl_put_byte, unimpl_get_line, unimpl_get_char, unimpl_get_byte,
+ unimpl_unget_char, unimpl_unget_byte, unimpl_seek, null_put_string,
+ null_put_char, null_put_byte, null_get_line, null_get_char,
+ null_get_byte, null_close, null_flush, null_seek, null_set_prop,
+ null_get_error, null_get_error_str, null_clear_error): New
+ static functions.
+ (fill_stream_ops): New function.
+ (null_ops): Use null_put_string, etc., instead of null pointers.
+ (stdio_clear_error, dir_clear_error, cat_clear_error): Return value now
+ indicating whether an error was cleared.
+ (stream_set_prop, stream_get_prop, real_time_stream_p, close_stream,
+ get_error, get_error_str, clear_error, get_line, get_char, get_byte,
+ unget_char, unget_byte, put_string, put_char, put_byte,
+ flush_stream): Do not test whether a function in the ops table
+ is defined; just call it, and return its value.
+ (stream_init): Call fill_stream_ops on all stream operation
+ structures so any null pointers are defaulted to appropriate
+ functions.
+
+ * stream.h (struct strm_ops): clear_error gets return value.
+ (fill_stream_ops): Declared.
+
+ * syslog.c (syslog_init): Call fill_stream_ops on syslog_strm_ops.
+
+2015-07-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Reduce regex duplication in genvim.txr.
+
+ * genvim.txr (bs, hex, at, alpha, alnum, dig, oct, chesc, glyph):
+ New variables.
+ *(txr_error, txr_atat, txr_comment, txr_contin, txr_char,
+ txr_regdir, txr_variable, txr_splicevar, txr_stresc, txr_numesc,
+ txr_regesc, txr_chr, txr_num, txr_badnum,txr_ident,
+ txr_braced_ident): Use regex definitions.
+
+2015-07-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Syntax highlighting fixes: characters, variables, identifers.
+
+ * genvim.txr (txr_variable, txr_splicevar, txr_bracevar): Weren't being
+ generated into tl.vim. Moved to a common section.
+ (txr_nested_error): Relocate above other matches.
+ (txr_ident): Fixed not to match tokens starting with #.
+
+2015-07-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Simplify double plass over BODY into single pass.
+
+2015-07-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow op arguments like @1 to be places.
+
+ * share/txr/stdlib/place.tl: Introducing new defplace
+ for (sys:var ...) which is treated as if it were a symbol,
+ in anticipation of the op/do macro placing that syntax
+ with a symbol.
+
+2015-07-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Support trailing semicolon after hex/octal characters.
+
+ * parser.l (%option): Remove nounput option since we need
+ yyunput.
+ (grammar): Rule for matching hex and octal escape in SPECIAL
+ state recognizes optional semicolon. In 109 compatibility,
+ this is pushed back into the stream, otherwise consumed.
+
+ * txr.1: Updated documentation, including compat notes.
+
+ * genvim.txr (txr_char): Include optional semicolon in
+ match. Corrected some errors where 8 and 9 were being
+ included as matches for octal digits.
+ (txr_error): Default match for \x or \o not followed
+ by digits.
+
+2015-07-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Hash-bang support for .tl files.
+
+ * parser.c (read_eval_stream): New boolean argument
+ to request hash bang support.
+
+ * parser.h (read_eval_stream): Declaration updated.
+
+ * eval.c (sys_load): Pass new thid argument to read_eval_stream,
+ to decline hash bang support.
+
+ * match.c (v_load): Likewise.
+
+ * txr.c (txr_main): Request hash bang support from
+ read_eval_stream. Thus files referenced from the txr
+ command line can have a #! line, which is ignored.
+
+2015-07-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Handle escapes accurately in Vim syntax highlighting.
+
+ * genvim.txr (txr_badesc, txr_stresc, txr_numesc, txr_regesc): New
+ match categories.
+ (txr_string, txr_quasilit, txr_regex, txl_regex): No longer use skip=
+ argument, but rather contain escape categories.
+ All escapes are colored as Special rather than String, and
+ unknown or malformed escapes are colored as errors.
+
+2015-07-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Take advantage of \@ escape in quasilit.
+
+ * genvim.txr (txr_escat): New match category containing \@.
+ Colorized a String.
+ (txr_quasilit): Contains txr_escat. Thus, \@ looks like any
+ other escape inside a quasilit.
+
+2015-07-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Bugfix: reproduce the correct opening bracket
+ before a function link.
+
+2015-06-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix issues in configure found by ShellCheck.
+
+ * configure (have_timegm, tm_gmtoff, tm_tmzone): Unused
+ variables removed.
+ (SIZEOF_LONG_LONG_T): Reference to nonexistent variable fixed.
+ Also, fixed two instances of arithmetic expressions using
+ unnecessary $ prefixes on variables.
+
+2015-06-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix TXR 97 regression in quasiliterals.
+
+ * eval.c (expand_quasi): When the modifiers argument of a var
+ item is expanded, the expansion incorrectly places it as the
+ fourth item rather than third. This is effectively a continuation
+ of the incomplete regression fix that was applied on 2014-08-29.
+ The breakage is that `@{(expr) modifier}` ignores modifier
+ whenever (expr) is an expression that undergoes expansion.
+
+2015-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Third round of quasiliteral-related fixes.
+
+ * parser.l (char_esc): Recognize \@ escape.
+ (grammar): Add a rule for a \@ escape in quasiliterals,
+ and quasi word list literals.
+
+ * txr.1: Document \@, and remove the lie that @@
+ encodes for a single @ in quasiliterals.
+
+2015-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Second round of quasiliteral-related fixes.
+
+ * parser.l: Only shift to QSPECIAL state when @ is followed
+ by a trailing context consisting of certain characters.
+ Not every kind of Lisp object syntax can be introduced
+ with @ in a quasiliteral. Adding a rule to produce an
+ error when @ appears that is not followed by an allowed
+ character.
+
+2015-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ First round of quasiliteral-related fixes.
+
+ * parser.l: Do not try to recognize floating-point literals
+ in QSPECIAL state; that is not possible because @134.3
+ in a quasiliteral parses as a METANUM followed by ".3".
+ On the other hand, recognize METANUM literals in QSPECIAL state,
+ so that @@123 scans. Recognize @ as a token in QSPECIAL state,
+ so @@abc will scan. When transitioning from QSILIT and QWLIT
+ states to QSPECIAL upon scanning @, return a @ token, which
+ is now parsed in the grammar.
+
+ * parser.y (quasi_meta_helper): New static function.
+ (q_var): Do not handle SYMTOK any more, only the braced
+ variable syntax. SYMTOK is handled as a n_expr.
+ Braced vars are handled with explicit '@' token, which
+ is now produced by the scanner when it shifts from QSILIT
+ to QSPECIAL.
+ (quasi_item): No longer necessary to recognize various
+ forms here such as quotes and splices. Just recognize a n_expr,
+ preceded by '@'.
+
+2015-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: New filter to add hyperlinks within code in
+ more places such as examples and summary lists.
+
+2015-06-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: partition example: wrong use of where function.
+
+2015-06-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_from_pairs, hash_list): New functions.
+
+ * hash.h (hash_from_pairs, hash_list): Declared.
+
+ * eval.c (eval_init): Registered hash-from-pairs and hash-list
+ intrinsic.
+
+ * txr.1: Documented new functions.
+
+2015-06-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Refactoring n-ary functions to use a single helper.
+
+ * lib.c (nary_op): New function.
+ (plusv, mulv, logandv, logiorv): Use nary_op.
+
+ * lib.h (nary_op): Declared.
+
+2015-06-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Hash subset testing.
+
+ * eval.c (eval_init): Register hash-subset and hash-proper-subset
+ intrinsics.
+
+ * hash.c (hash_subset, hash_proper_subset): New functions.
+
+ * hash.h (hash_subset, hash_proper_subset): Declared.
+
+ * txr.1: New functions documented.
+
+2015-06-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Add ifa.tl library file.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-06-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * share/txr/stdlib/place.tl: Get rid of big progn around the
+ whole module.
+
+ * genvim.txr: Handle (def's not preceded by spaces.
+
+2015-06-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 109.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version and date.
+
+ * share/txr/stdlib/ver.tl: Likewise.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-06-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * lisplib.c (ifa_set_entries): Add conda.
+
+ * share/txr/stdlib/ifa.tl (conda): New macro.
+
+ * tests/012/ifa.tl: Adding test for conda.
+
+ * txr.1: Documenting conda.
+
+2015-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Rewrite the man2html-generated inner name links with hash
+ values derived from the title text, so that when sections are inserted
+ or deleted, the URL's remain stable. The PREAMBLE is gone, and
+ VERSION is collected when processsing the body.
+
+2015-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr (month-name): Filter removed.
+ Page date is converted to a time value, and later formatted.
+
+2015-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Remove places.h generation hack.
+
+ * Makefile (GEN_HDRS, LISP_TO_C_STRING): Variables removed.
+ (%.h: %.tl): Rule removed. The place.h header is no longer
+ generated from place.tl.
+
+ * lisplib.c (place_instantiate): Load place.tl from stdlib directory,
+ rather than obtaining it from a string literal in generated header
+ place.h.
+
+ * place.tl: Moved to share/txr/stdlib directory.
+
+ * genvim.txr: Refer to place.tl in stdlib.
+
+2015-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register have function, synonym of true.
+
+ * txr.1: Document have.
+
+2015-06-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented ifa.
+
+ * share/txr/stdlib/ifa.tl: Tightened up the tests for
+ situations when the macro is ill-formed, following
+ the improved specification. Also, eval-error is thrown
+ instead of just error.
+
+2015-06-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Test ifa macro.
+
+ * Makefile (TEST_OUT): Include .tl files.
+ (tst/%.out): New rule variant, from .tl prerequisite.
+
+ * tests/012/ifa.expected: New file.
+
+ * tests/012/ifa.tl: New file.
+
+2015-06-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.c (parser_mark): Do not mark p->syntax_tree if
+ its value is nao. Introduced on 2015-06-10, "Error handling improvement
+ in read".
+
+2015-06-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (mkstring): Fix neglect to null terminate.
+
+2015-06-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (cat_str): Detect overflow in the total length
+ calculation.
+
+2015-06-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Improvements in equal hashing function.
+
+ * hash.c (equal_hash): For conses and vectors, ensure that
+ distinct permutations lead to different hash codes. This is done by
+ accumulating the partial hash with a multiplier, rather than just
+ adding subhashes.
+
+2015-06-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Library .txr files become .tl and are autoloaded.
+
+ * lisplib.c (ver_set_entries, ver_instantiate,
+ txr_case_set_entries, txr_case_instantiate): New
+ static functions.
+ (lisplib_init): Register new functions.
+
+ * share/txr/stdlib/txr-case.txr: Reduced to a load for the
+ corresponding .tl file, retained for backward compatibility.
+
+ * share/txr/stdlib/ver.txr: Likewise.
+
+ * share/txr/stdlib/txr-case.tl: New file, based on previous
+ contents of corresponding .txr file.
+
+ * share/txr/stdlib/ver.tl: Likewise.
+
+2015-06-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding anaphoric ifa macro.
+
+ * Makefile (install): Install .tl files present in stdlib directory.
+ (INSTALL): Handle argument 2 being a list.
+
+ * eval.c (load): New function.
+
+ * eval.h (load): Declared.
+
+ * lisplib.c (ifa_set_entries, ifa_instantiate): New functions
+ to lazily load ifa.tl.
+ (lisplib_init): Register new functions.
+
+ * txr.c (stdlib_path): New variable.
+ (sysroot_init): Store the stdlib path in stdlib_path.
+
+ * txr.h (stdlib_path): Declared.
+
+ * share/txr/stdlib/ifa.tl: New file.
+
+2015-06-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Refactoring of lisplib.c
+
+ * lisplib.c (set_dlt_entries): New static function.
+ (set_place_dlt_entries): Renamed to place_set_entries.
+ Uses set_dlt_entries as subroutine.
+ (place_instantiate): Argument changes from table to function,
+ which is invoked to null out the hash entries.
+ (dlt_register): New static function.
+ (lisplib_init): Use dlt_register to register dynamic loading
+ of places_tl.
+
+2015-06-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 108.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version and date.
+
+ * share/txr/stdlib/ver.txr: Likewise.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-06-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented Lisp loading.
+
+2015-06-13 Kaz Kylheku <kaz@kylheku.com>
+
+ New --lisp option: treat unsuffixed files as Lisp.
+
+ * txr.c (help): Added help text.
+ (txr_main): Handle lisp option.
+
+2015-06-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): Handle Lisp files.
+
+2015-06-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Lisp load macro.
+
+ * eval.c (sys_load_s): New symbol variable.
+ (sys_load, me_load): New static functions.
+ (eval_init): Initialize sys_load_s, register
+ sys:load intrinsic function and load macro.
+
+2015-06-12 Kaz Kylheku <kaz@kylheku.com>
+
+ @(load) and @(include) now load Lisp code.
+
+ * match.c (v_load): Check txr_lisp_p flag coming out of
+ open_txr_file and handle the Lisp case usin read_eval_stream.
+
+ * parser.c (read_eval_stream, get_parser, parser_errors):
+ New functions.
+
+ * parser.h (read_eval_stream, get_parser, parser_errors):
+ Declared.
+
+2015-06-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Preparing for lisp loading.
+
+ * parser.c (open_txr_file): Rewritten to take new argument
+ which indicates whether to treat an unsuffixed file as
+ TXR or TXR Lisp, and is updated to indicate which is the
+ case by looking at the suffix.
+
+ * parser.h (open_txr_file): Declaration updated.
+
+ * match.c (v_load): Follow change in open_txr_file.
+
+ * txr.c (txr_main): Likewise.
+
+2015-06-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Error handling improvement in read.
+
+ * parser.y (spec): New grammar production to handle the cases
+ that SECRET_ESCAPE_E is not followed by anything (the input
+ ends before any object is scanned, or there is no input
+ token which starts an object).
+
+ * parser.c (lisp_parse): Deal with EOF indication from parser
+ (the syntax_tree member of parser_t set to nao).
+
+2015-06-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (yybadtoken): Print unexpected character
+ literally rather than as a Lisp character literal.
+
+2015-06-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Code simplification.
+
+ * txr.c (txr_main): Replacing two code blocks with single
+ call to existing open_txr_file function.
+
+2015-06-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Critical bugfix for weak hashes.
+
+ * hash.c (hash_mark): Hash tables which have both weak keys
+ and values were not added to the reachable_weak_hashes list,
+ and thus not subject to complete hash processing, leading
+ to corruption.
+
+2015-06-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.h (mkloc): Rename misleading argument from fun to obj.
+
+2015-06-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.c (stream_parser_hash): New static variable.
+ (parser_mark): Mark parser and primer members.
+ (parser, ensure_parser): new argument: primer.
+ (get_parser_impl, ensure_parser): New static
+ functions.
+ (prime_parser): New function.
+ (lisp_parse): Multiple calls to this function on the same stream
+ now logically continue the parse, not resetting the line
+ number to 1.
+ (parse_init): Initialize and gc-protect stream_parser_hash.
+
+ * parser.h (parser_t): New members, primer and parser.
+ (prime_parser): Declared.
+ (parser): Declaration updated.
+
+ * parser.y (parse): Now responsible for calling prime_parser.
+
+2015-06-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_load): Call parse_once rater than parse.
+
+ * parser.c (regex_parse, lisp_parse): Likewise.
+
+ * txr.c (txr_main): Likewise.
+
+ * parser.h (parse): Declaration updated.
+ (parse_once): Declared.
+
+ * parser.y (parse_once): New function, same as old parse implementation.
+ (parse): Becomes one argument function which works with a previously
+ initialized parser and continues the parse.
+
+2015-06-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (catenated_stream_p, catenated_stream_push): New functions.
+ (stream_init): Registered new functions as intrinsics.
+
+ * stream.h (catenated_stream_p, catenated_stream_push): Declared.
+
+ * txr.1: Documented catenated-stream-p and catenated-stream-push.
+
+2015-05-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Document new syntactic places framework and place-mutating macros.
+
+2015-05-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix mismanaged dyn_env variable.
+
+ * eval.c (bindings_helper): In the parallel binding case, only allocate
+ a new dynamic env when it is needed (because a special variable is
+ being bound), rather than unconditionally.
+ Consequently, only modify dyn_env when the dynamic environment actually
+ needs to be extended. Constructs that use bindings_helper are only
+ wrapped in the dynamic environment save/restore form
+ sys:with-saved-vars if they bind special variables.
+
+2015-05-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Ligher weight debug instrumentation.
+
+ This speeds up the TXR Lisp interpreter, because do_eval
+ sets up a debug frame and uses debug_return.
+
+ * debug.c (debug_block_s): Symbol removed.
+ (debug_init): Remove initialization of debug_block_s.
+
+ * debug.h (debug_block_s): Declaration removed.
+ (debug_enter): Do not establish a named block or a catch block;
+ no time-wasting unwind stack manipulation at all.
+ The debug_depth variable is managed by the extended setjmp
+ context now. Provide a return value variable, and a well-defined name to
+ branch to to exit from the debug block.
+ (debug_return): Do not use heavy-weight uw_block_return;
+ simply set the return variable and branch to debug_return_out
+ label.
+
+ * signal.h (EJ_DBG_MEMB, EJ_DBG_SAVE, EJ_DBG_REST,
+ EJ_OPT_MEMB, EJ_OPT_SAVE, EJ_OPT_REST): New macros.
+ (extended_jmp_buf): Define optional global state
+ variables using EJ_OPT_MEMB.
+ (extended_setjmp): Save and restore optional
+ globals using EJ_OPT_SAVE and EJ_OPT_RESTORE.
+ Now debug_depth is saved and restored if
+ debugging support is compiled in.
+
+ * match.c (open_data_source): Remove bogus debug_return
+ invocations which were uncovered here by changes to the macro.
+
+ * eval.c (do_eval, expand_macro): debug_return must now be after
+ debug_end, because it won't dynamically clean up frames that it doesn't
+ know about. The set_dyn_env is no longer unreachable in expand_macro;
+ it is now necessary because debug_return isn't doing the longjmp
+ that previously restored dyn_env.
+
+2015-05-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * place.tl (pushnew): New macro.
+
+ * lisplib.c (set_place_dlt_entries): Add pushnew.
+
+2015-05-22 Kaz Kylheku <kaz@kylheku.com>
+
+ symbol-function, symbol-value and fun become places.
+
+ * eval.c (op_setqf): New function.
+ (eval_init): Register sys:setqf operator. Also expose
+ global variable hash tables via sys:top-vb and sys:top-fb.
+
+ * place.tl (sys:get-fb, sys:get-vb): New functions.
+ (fun, symbol-function, symbol-value): New places defined.
+
+2015-05-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Introduce defparm operator.
+
+ * eval.c (me_defparm): New function.
+ (eval_init): Register defparm.
+
+ * txr.1: Documented defparm together with defvar.
+ defvar documentation is revised.
+
+2015-05-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Represent place.tl more compactly in image.
+
+ The contents of place.tl are now stored as a UTF-8 ordinary literal
+ instead of a wide char literal.
+
+ * Makefile (LISP_TO_C_STRING): Generate plain literal.
+
+ * lisplib.c: Convert plain literal to string.
+
+2015-05-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Variables are now deletable places, if they are global.
+
+ * place.tl (sys:sym-delete-expander): New function.
+ (get-delete-expander): Retrieve delete expander for
+ symbols.
+
+2015-05-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (symbol_value): Retrieve the binding of a symbol
+ macro also.
+ (boundp): Return t for symbol macros.
+ (makunbound, fmakunbound): New functions.
+ (eval_init): Register makunbound and fmakunbound.
+
+ * txr.1: Document changes to symbol-value and boundp.
+
+2015-05-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (replace_list, replace_str, replace_vec): Handle
+ the case when from is a vector, for consistency with the sel
+ function and the dwim operator.
+
+ * txr.1: Document that the third argument of select and replace may be
+ a vector.
+
+2015-05-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Recursive lcons force bug (keep-if*, remove-if*).
+
+ * lib.c (rem_lazy_func): Do not access the cdr field of
+ the lcons that we are in the middle of forcing!
+
+2015-05-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * place.tl (define-modify-macro): New macro.
+
+ * lisplib.c (set_place_dlt_entries): Add define-modify-macro.
+
+2015-05-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * place.tl (push): Ensure left-to-right eval order.
+
+2015-05-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * place.tl (rlet): For the sake of sane evaluation order
+ in the face of unknown side effects, do not thread symbolic references;
+ only propagate constants.
+
+2015-05-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (env_vb_to_fb): Allow null env argument. This
+ case occurs when (flet () ...) is expanded.
+
+2015-05-12 Kaz Kylheku <kaz@kylheku.com>
+
+ DWIM places must use Lisp-1 semantics.
+
+ This really only affects code which does something like
+ (set [f x] y) and f resolves as a function. (The TXR Program
+ bent over backwards to install a mutable object into a function
+ binding.) In this situation, we need to update the function binding
+ f, rather than some variable f.
+
+ * eval.c (op_lisp1_setq, op_lisp1_value): New static functions.
+ (eval_init): Register sys:lisp1-setq and sys:lisp1-value
+ special forms.
+
+ * place.tl (sys:*lisp1*): New special variable.
+ (sys:l1-setq, sys:l1-val): New macros, optimizing
+ versions of sys:lisp1-setq and sys:lisp1-value special operators.
+ (sys:sym-place-update-expander, sys:sym-place-clobber-expander):
+ React to sys:*lisp1* variable by doing symbol access using Lisp-1
+ semantics, with help of newly introduced macros and special forms.
+ (dwim): Bind sys:*lisp1* to true, if main argument is a symbolic place,
+ so that the update is done using Lisp-1 semantics. Use the
+ sys:l1-val operator when evaluating arguments.
+
+2015-05-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (lookup_var_l): Gut this function of its silly
+ reimplementation of lookup_var.
+ (op_setq): Use lookup_var instead of lookup_var_l.
+ Now only outside modules use the lookup_var_l interface.
+ Error message fix: sys:setq, not setvar.
+
+2015-05-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Handle vectors and strings in rplaca and rplacd.
+
+ * lib.c (rplaca, rplacd): Use refset and replace
+ respectively to handle vectors and strings.
+ Adjust type mismatch error message.
+
+2015-05-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (chr_str_set): Check for literal strings.
+
+2015-05-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix argument count checking regression.
+
+ * eval.c (apply): Revert some changes from 2015-03-13
+ which cause the too many arguments case not to be
+ diagnosed.
+
+2015-05-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * place.tl (errno): Support (errno) form as place.
+
+2015-05-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Improve error message related to splice misuse.
+
+ * eval.c (expand_qquote): Corrected awkward error message text
+ which was saying that a splice "cannot occur as an atom".
+
+2015-05-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding pset operator.
+
+ * place.tl (pset): New macro.
+
+ * lisplib.c (set_place_dlt_entries): Add pset.
+
+2015-05-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * place.tl (set): Take multiple place/value pairs. Allow zero
+ arguments.
+
+2015-05-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Crack down on redefinitions of built-ins.
+
+ * eval.c (builtin, eval_initing): New global variable.
+ (op_defun, op_defmacro): During initialization, record functions
+ and macros in builtin hash.
+ (builtin_reject_test): New static function.
+ (expand_macrolet): Perform builtin reject test for fbind, lbind,
+ and macrolet.
+ (regfun, reg_mac): Add symbol to builtin hash.
+ (eval_init): GC-protect new hash table variable and initialize it.
+ Set eval_initing to true over eval initialization.
+ The flip function is renamed fo flipargs.
+ (eval_compat_fixup): New function, for dealing with the
+ operator/function conflict over flip.
+
+ * eval.h (eval_compat_fixup): Declared.
+
+ * lib.c (compat_fixup): Call eval_compat_fixup.
+
+ * tests/011/macros-2.txr: This test was defining a macro called
+ while which is now illegal. Renamed to whilst.
+
+ * tests/011/macros-2.expected: Regenerated.
+
+ * txr.1: Function flip renamed to flipargs and documented in
+ Compatibility section.
+
+2015-05-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (LISP_TO_C_STRING): Strip comments, but not comment lines,
+ so line numbers don't change.
+
+ * eval.c (eval_init): Fix registrations of lisp-parse and read.
+
+ * lisplib.c (place_instantiate): Give name to parsed string stream
+ using new lisp_parse argument.
+
+ * parser.c (lisp_parse): Takes new argument to override name.
+
+ * parser.h (lisp_parse): Declaration updated.
+
+ * txr.c (txr_main): Call lisp_parse with four args, defaulting
+ the new one.
+
+ * txr.1: Documented new argument.
+
+2015-05-06 Kaz Kylheku <kaz@kylheku.com>
+
+ New macro-based framework for assignment places.
+
+ The operators set, inc, dec, pop and others are now macros
+ which generate code, rather than built-in special forms
+ that use "C magic". Moreover, new such macros are easy to write, and
+ several new ones are already available. Moreover, new kinds of
+ assignable places are easy to create.
+
+ * place.tl: New file.
+
+ * lisplib.c, lisplib.h: New files.
+
+ * Makefile (OBJS): New target, lisplib.o.
+ (GEN_HDRS): New variable.
+ (LISP_TO_C_STRING): New recipe macro, with rule.
+ (clean): Remove generated headers named in $(GEN_HDRS).
+
+ * eval.c (dec_s, push_s, pop_s, flip_s, del_s): Variables removed.
+ (setq_s): New variable.
+ (lookup_var, lokup_sym_lisp_1, lookup_var_l, lookup_fun, lookup_mac,
+ lookup_symac, lookup_symac_lisp1): Trigger the delayed loading of
+ libraries for undefined global symbols, and re-try the lookup.
+ (op_modplace, dwim_loc, force_l): Static functions removed.
+ (op_setq): New static function.
+ (eval_init): Initialize setq_s; remove initializations of
+ removed variables; remove registrations for op_modplace;
+ add registration for sys:setq, sys:rplaca, sys:rplacd,
+ sys:dwim-set and sys:dwim-del intrinsics.
+ Call lisplib_init to initialize the dynamic library loading module.
+
+ * lib.c (sys_rplaca, sys_rplacd): New functions, differing
+ in return value from rplaca and rplacd.
+ (ref, refset): Handle hash table.
+ (dwim_set, dwim_del): New functions.
+
+ * lib.h (sys_rplaca, sys_rplacd, dwim_set, dwim_del): Declared.
+
+ * genvim.txr: Include place.tl in scan.
+
+ * tests/010/seq.txr: The del operator test
+ case no longer throws at run-time but at macro-expansion time, so the
+ test case is simply removed.
+
+ * tests/010/seq.expected: Updated output.
+
+ * tests/011/macros-2.txr: Reset *gensym-counter* to zero, because
+ the textual output of the test case includes gensyms, whose numberings
+ fluctuate with the content of the new Lisp library material.
+
+ * tests/011/macros-2.expected: Updated output.
+
+2015-05-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (make_obj, gc): Move resetting of prev_malloc_bytes
+ out of make_obj into gc.
+
+2015-05-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Do some cleanup in progn-like form sequences.
+
+ * eval.c (expand_progn): New function.
+ (do_expand): Use expand_progn for constructs
+ which have an implicit progn body.
+
+2015-05-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Deal with bad quote syntax.
+
+ * eval.c (op_quote): Throw error on bad syntax.
+
+ * lib.c (obj_print, obj_pprint): Do not hide bad quote syntax
+ using ' notation; print it using ordinary notation.
+
+2015-05-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Move initialization calls to more suitable place.
+
+ * lib.c (init): Initialize parser, syslog and glob modules
+ here.
+
+ * txr.c (main): Remove initialization of parser, syslog and glob
+ modules from here.
+
+2015-05-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.h (sig_save_disable): Bugfix: macro enabling
+ rather than disabling async signals.
+
+2015-05-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix corruption triggered by extended gc disabling.
+
+ The issue is that when gc is disabled, the gc function
+ does nothing. But various code depends on calls to gc()
+ doing something, like making space available in various
+ static arrays.
+
+ When gc is disabled for long periods, there are issues,
+ like array overruns.
+
+ * gc.c (gc): Must no longer be called at all if gc_enabled is false,
+ and asserts that it is true. Callers must check the gc_enabled
+ flag and implement appropriate cases.
+ (make_obj): Only call gc when gc_enabled is true.
+ If there is no space in the freshobj array after trying gc,
+ or gc couldn't be tried because it is disabled, then
+ schedule a full gc.
+ (gc_set): If the checkobj array is full, only call gc if gc
+ is enabled, otherwise schedule a full_gc.
+ (gc_mutated): Do not assume that the mutobj array has room
+ for another object; only set the object's generation to -1
+ and put it into the array if there is room. Similarly to
+ gc_set, do a gc if there is no room, but if gc is not enabled, then
+ schedule a full gc.
+ (gc_wrap): Only call gc if gc_enabled is true, and return t in
+ that case rathe than nil.
+
+ * txr.1: Document return value of sys:gc function.
+
+2015-04-30 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix source location for dangling unquotes and splices.
+
+ * parser.y (grammar): Propagate the parser line number to the unquote
+ or splice form, if it has not received location info from its operand
+ (because its operand is an atom). In the quasi_item case, we also use
+ rlcp_tree to make sure the info is propagated through the list being
+ consed up.
+ (rlcp_tree): Bugfix: propagate the source location info to every cons
+ in the list itself, not just into their cars.
+
+2015-04-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Improved syntax checking: defun, flet, labels, lambda.
+
+ * eval.c (check_lambda_list): New static function.
+ (op_defun): Argument list checking moved into
+ check_lambda_list, which is called for defun out of
+ do_expand. Name checks moved into do_expand.
+ Thus, defun is checked earlier, at expansion time.
+ (me_flet_labels): Check the lambda list of each lexical function
+ with check_lambda_list.
+ (do_expand): Check the syntax of the lambda form, and
+ the validity of its argument list.
+ Check the name of a defun or defmacro for validity.
+ Check the validity of the defun argument list.
+
+2015-04-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: cannot print (lambda . 42) structure.
+
+ * lib.c (obj_print, obj_pprint): Fix mistake in the test for
+ properly formed lambda syntax whcih is printed specially.
+
+2015-04-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding poll function.
+
+ * configure: Check for the poll function and set
+ HAVE_POLL accordingly in config.h.
+
+ * stream.h (fd_k): External declaration added.
+
+ * sysif.c (poll_wrap): New function.
+ (sysif_init): Registered poll-in, poll-out, poll-err,
+ poll-pri, poll-rdhup, poll-nval, poll-rdband, poll-wrband
+ variables and poll function.
+
+ * txr.1: Documented poll.
+
+2015-04-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 107.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow (force ...) to be an assignable place.
+
+ This allows mlet variables to be assignable.
+
+ * eval.c (force_s): New global variable.
+ (op_modplace): Handle force form.
+ (me_mlet): Use force_s symbol.
+ (force_l): New static function.
+ (eval_init): Initialize force_s variable. Use it in registration
+ of force function.
+
+ * txr.1: Remove text in mlet definition that variables
+ are not assignable. Replace with note about an unspecified behavior.
+
+2015-04-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Introducing mlet macro.
+
+ * eval.c (me_mlet): New static function.
+ (eval_init): Registered mlet macro.
+
+ * txr.1: Documented mlet.
+
+2015-04-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (symbol_package): If the argument is nil, return
+ the user package directly, not the value of the *user-package*
+ variable.
+
+2015-04-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Remove silly package lookup from keywordp.
+
+ This tiny change yields a 165% (2.65X) speedup in the
+ tst/tests/011/mandel.txr test case.
+
+ * lib.c (keywordp): Use keyword_package_var instead of the
+ keyword_package macro which looks up the global environment.
+
+ * parser.y (sym_helper): Likewise.
+
+2015-04-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Regression: runaway allocation of heaps.
+
+ * gc.c (make_obj): Fix regression introduced on 2014-10-18,
+ released in TXR 100. Because make_obj discontinues
+ placing objects into the freshobj_array when the full_gc
+ flag has been set, it is incorrect to allocate another heap
+ when the free list is exhausted and the freshobj_array
+ has room remaining. It has room remaining because it is
+ disused.
+
+2015-04-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (make_obj, gc): The check for insufficient space in freshobj
+ array after a gc is moved into the gc function.
+
+2015-04-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (gc): Minor off-by-one: compare gc_counter to FULL_GC_INTERVAL
+ rather than FULL_GC_INTERVAL - 1, since it is pre-incremented.
+
+2015-04-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Switch to in-tree mpi directory.
+
+ * Makefile (CFLAGS, MPI_OBJS): Refer to mpi directory without version
+ number.
+ (repatch): Target removed.
+ (distclean): Don't try to remove old unpacked tarball mpi directory.
+
+ * configure (mpi_version, have_quilt, have_patch): Variables removed.
+ (gen_config_make): Do not generate mpi_version make variable.
+ Do not test for quilt or patch. No longer extract MPI tarball or
+ try to apply patches.
+
+ * mpi-1.8.6.tar.gz: File removed.
+
+ * mpi-patches: Directory and all files under it removed.
+
+2015-04-22 Kaz Kylheku <kaz@kylheku.com>
+
+ delay/force overhaul.
+
+ * eval.c (promise_forced_s, promise_inprogress_s): New symbol
+ variables.
+ (me_delay): Change representation of promises so that the
+ original delay form is stashed there for better reporting
+ in the force function. Also, propagate the debug info
+ from the second argument of the form to the entire form;
+ otherwise it will inherit it from elsewhere.
+ (force): Rewritten to follow new three-state representation
+ to detect the recursive case and diagnose it.
+ (eval_init): Register new symbol variables.
+
+2015-04-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 106
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise.
+
+2015-04-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: throwing error when trying to print valid regexps.
+
+ * regex.c (print_rec): Only dianose "bad object in regex syntax"
+ for some atom other than nil, which denotes an empty (sub)expression,
+ like what results from #// or #/a|/ and such.
+
+2015-04-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Do not allow unrecognized escapes in regex.
+
+ * parser.l (REGOP): New regex alias for matching all regex
+ special characters.
+ (grammar): Several rules for regex special characters merged
+ together. New rule introduced to match a special character
+ after a backslash, making it literal. The old rule which makes
+ literal any character after a backslash now throws an error,
+ unless version 105 comaptibility is selected.
+
+ * txr.1: Documented this behavior change.
+
+2015-04-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Improvement in error reporting.
+
+ This fix prevents certain situations when an inappropriate form
+ is reported, in the default unhandled exception handler, as pertaining
+ to an error.
+
+ * eval.c (do_eval): Save and restore the last_form_evaled,
+ in an exception-unsafe way. If we successfully evaluate a form or
+ subform, we can restore the previous one.
+ (expand): Save and restore last_form_expanded similarly. We don't
+ need the unwind block and counter.
+
+2015-04-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding lcons macro.
+
+ * eval.c (me_lcons): New function.
+ (eval_init): Registered lcons macro.
+
+ * txr.1: Documented lcons.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding getenv, setenv and unsetenv.
+
+ * lib.c (setenv, unsetenv): Changed static functions to external.
+ Moved them out of the #if !HAVE_TIMEGM block.
+
+ * lib.h (setenv, unsetenv): Declared.
+
+ * sysif.c (getenv_wrap, setenv_wrap, unsetenv_wrap): New functions.
+ (sysif_init): Registered getenv, setenv and unsetenv.
+
+ * txr.1: Documented getenv, setenv and unsetenv.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix quasistring regression introduced in TXR 81.
+
+ * parser.y (expand_meta): This function must recognize
+ quasistrings, inside (sys:quasi ...) forms, (sys:var ...) forms
+ do not denote TXR Lisp variables. These must not be expanded.
+ Doing so is not only wrong, but the way it was done broke
+ brace variables by stripping their arguments.
+
+2015-04-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding exit* function which calls _exit.
+
+ * sysif.c (exit_star_wrap): New static function.
+ (sysif_init): Registered exit* intrinsic.
+
+ * txr.1: Documented exit*.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Add exec and pipe functions.
+
+ * configure: Check for pipe.
+
+ * sysif.c (exec_wrap, pipe_wrap): New static functions.
+ (sysif_init): Register exec and pipe intrinsics.
+
+ * txr.1: Documented exec and pipe.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding chmod.
+
+ * configure: Detect chmod.
+
+ * sysif.c (chmod_wrap): New function.
+ (sysif_init): Register chmod intrinsic.
+
+ * txr.1: Documented.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding dotimes macro.
+
+ * eval.c (me_dotimes): New function.
+ (eval_init): Registering dotimes macro.
+
+ * txr.1: Documented dotimes.
+
+2015-04-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix escaping issues in open-process on Windows.
+
+ This can now execute programs with spaces in their path names.
+ Arguments can contain embedded double quotes, and other characters
+ that are special to cmd.exe, like &, |, (, ), ^ and others.
+
+ * stream.c (string_extend_count, win_escape_cmd): New static functions.
+ (win_escape_arg): Fix and extend escaping scheme to cover not only
+ the argument processing scheme implemented by programs which use Microsoft's
+ C library, but also to smuggle the command line through cmd.exe.
+ (win_make_cmdline): Use win_escape_cmd to wrap the command.
+ Escape the quotes which are placed around arguments, so cmd.exe
+ doesn't interpret them, which will cause it to suppress its processing
+ of the caret escapes.
+
+2015-04-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow quasiquotes in braces and quasiliterals, and quotes in braces.
+
+ * parser.l: Consolidate rules for recognizing quote, unquote, and
+ quasiquote. An effect of this is that quasiquotes can now occur in
+ braces and in string quasiliterals.
+
+ * parser.y (quasi_item): Support quotes and quasiquotes as quasi items:
+ that is to say, i.e. objects denoted by @ in a quasiliteral.
+
+2015-04-14 Kaz Kylheku <kaz@kylheku.com>
+
+ Diagnose trailing junk in numeric literals.
+
+ * parser.l: Combining the handling of hex, octal and binary numeric
+ literals into a single rule. Implementing an additional rule which
+ diagnoses such tokens that have trailing junk. Thus, something
+ like #x1F2AZ is now invalid syntax.
+
+2015-04-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing while* and until* loops.
+
+ * eval.c (while_star_s, until_star_s): New symbol variables.
+ (me_while_star, me_until_star): New static functions.
+ (eval_init): Initialize new variables. Register while* and
+ until* macros.
+
+ * txr.1: Documented while* and until*.
+
+ * txr.vim, tl.vim: Regenerated.
+
+2015-04-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * sysif.c: Use HAVE_FORK_STUFF to wrap fork, waitpid and dup/dup2.
+
+2015-04-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Exposing dup and dup2.
+
+ * sysif.c (dup_wrap): New static function.
+ (sysif_init): Register dup_wrap as dupfd. The name dup
+ conflicts with an existing function.
+
+ * txr.1: Documented dupfd.
+
+ * txr.vim, tl.vim: Regenerated.
+
+2015-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Functions open-fileno and fileno.
+
+ * stream.c (fd_k): New keyword variable.
+ (stdio_get_prop): Handle the :fd property by returning
+ the file descriptor.
+ (open_fileno): New function.
+ (stream_init): Initialize fd_k, and register fileno and open-fileno.
+
+ * stream.h (open_fileno): Declared.
+
+ * txr.1: Documented open-fileno and fileno.
+
+ * utf8.c (w_fdopen): New function.
+
+ * utf8.h (w_fdopen): Declared.
+
+2015-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (sweep): Fix comment referring to nonexistent identifier.
+
+2015-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): There is an until_s global variable, so
+ no need to intern the symbol when registering me_until.
+
+2015-04-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Fork and wait support.
+
+ * sysif.c (work_wrap, wait_wrap, wifexited, wexitstatus,
+ wifsignaled, wtermsig, wcoredump, wifstopped, wstopsig,
+ wifcontinued): New static functions.
+ (sysif_init): Register new intrinsics: functions fork, wait,
+ w-ifexited, w-exitstatus, w-ifsignaled, w-termsig,
+ w-coredump, w-ifstopped, w-stopsig, w-ifcontinued; and
+ variables w-nohang, w-untraced, w-continued.
+
+ * txr.1: Documented.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (iflet_s, when_s): New global variables.
+ (me_iflet_whenlet): New static function.
+ (eval_init): Initialize when_s, iflet_s. Use
+ when_s for registering me_when.
+ Register me_iflet_whenlet.
+
+ * txr.1: Documented iflet and whenlet.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ New whilet macro.
+
+ * eval.c (while_s): New symbol variable.
+ (me_whilet): New static function.
+ (eval_init): Initialize while_s. Use while_s in registration
+ of while macro. Register new whilet macro.
+
+ * txr.1: whilet is documented.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-01 Kaz Kylheku <kaz@kylheku.com>
+
+ New zap operator.
+
+ * eval.c (zap_s): New global variable.
+ (op_modplace): Support zap.
+ (eval_init): Initialize zap_s, and register as operator.
+
+ * txr.1: Documented zap.
+
+2015-03-31 Kaz Kylheku <kaz@kylheku.com>
+
+ Array overrun fix in apply.
+
+ * eval.c (APPLY_ARGS): New preprocessor symbol, replaces
+ hard-coded 32 inside apply.
+ (apply): Use APPLY_ARGS for argument array.
+ Fix overrun of args array in non-variadic function case when
+ list has more than APPLY_ARGS elements.
+ Eliminate superflous "variadic" local variable.
+
+2015-03-31 Kaz Kylheku <kaz@kylheku.com>
+
+ Deal with spurious retention in function application.
+
+ * gc.h (zap): New inline function.
+ (z): New macro.
+
+ * lib.c (generic_funcall, funcall1, funcall2, funcall4, do_not,
+ do_dup, do_iff): Use z macro to burn funargs with no next use.
+
+ * eval.c (apply, apply_frob_args, iapply, call, do_eval,
+ op_dwim, mapcarv, mappendv, lazy_mapcarv_func, mapdov, do_apf,
+ do_ipf, callf): Use z macro to burn funargs with no next use.
+
+2015-03-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Bugfix: ~X printing in lower case, like ~x,
+ when argument is a bignum integer.
+
+2015-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/eliminate-locale-dependencies: New patch.
+ (s_mp_tovalue): Eliminate use of isupper, islower.
+
+ * mpi-patches/series: Add patch.
+
+2015-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ New -n option. New "i" mode letter in file opening functions.
+
+ * stream.c (struct stdio_mode): New struct type.
+ (stdio_mode_init_trivial): New initializer macro.
+ (parse_mode, format_mode, normalize_mode, set_mode_props):
+ New static functions.
+ (make_stdio_stream_common): the isatty check, and automatic marking
+ of tty device streams as real-time is no longer done, unless
+ backward compatibility 105 or earlier is requested.
+ (open_file, open_tail, open_command, open_process): Use new
+ mode parsing, which supports the "i" flag.
+ (stream_init): If we have isatty, and standard input is a tty,
+ then mark the *std-input* stream as real-time.
+
+ * txr.1: Document -n/--noninteractive option. Fix typo where
+ real-time-stream-p is referred to as stream-real-time-p.
+ Document "i" flag on open-file and others.
+
+ * txr.c (opt_noninteractive): New global.
+ (help): Help text for -n/--noninteractive.
+ (txr_main): Handle new options.
+
+ * txr.h (opt_noninteractive): Declared.
+
+2015-03-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (prinl, pprinl): Become external functions.
+ (tprint): New function.
+ (eval_init): Register tprint as intrinsic.
+
+ * eval.h (prinl, pprinl, tprint): Declared.
+
+ * txr.c (txr_main): New option, -t.
+
+ * txr.1: Documented tprint and -t option.
+
+2015-03-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): register get-lines as having one optional
+ argument.
+
+ * lib.c (lazy_stream_cons): Default the argument to std_input.
+
+ * txr.1: Document that the stream is optional in get-lines.
+
+2015-03-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (enforce): Update error error message.
+
+ * configure (have_git): Don't set this variable if
+ the TXR repository is missing, even if git is installed.
+ I.e. have_git means have have the tool and the repo.
+
+2015-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (int_str): Workaround for wcstol recognizing the 0x prefix when
+ radix is 16. Also, thrown an error if radix is not in the range
+ 0 to 36.
+
+ * txr.1: Document int-str's radix range restriction.
+
+2015-03-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (help): Added missing documentation for -e and -p.
+ Also documented -P.
+ (txr_main): New option implemented, -P.
+
+ * txr.1: Document -P, and clean up -e and -p documentation.
+
+2015-03-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 105.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise.
+
+ * txr.vim, tl.vim: Regenerated.
+
+2015-03-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (run): In Windows version, fix nasty corruption bug:
+ we were freeing C strings that were not duplicated, but only borrowed
+ from string objects.
+
+2015-03-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (open_process, run): Eliminate utf8name local variable
+ and associated memory leak. Correctly allocate only nargs + 1 elements
+ for argv array, not nargs + 2.
+
+2015-03-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * sysif.c (mkdir_nothrow_exists): New static function.
+ (ensure_dir): New function.
+ (sysif_init): ensure_dir registered as intrinsic.
+
+ * txr.1: ensure_dir documented.
+
+2015-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.c (open_txr_file, regex_parse, lisp_parse): Functions
+ moved here from parser.l.
+
+ * parser.l (open_txr_file, regex_parse, lisp_parse): Functions
+ moved from here to parser.c.
+
+2015-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (OBJS): Add parser.o.
+
+ * parser.h (parser_s): Declared.
+ (parse_init): Declaration removed.
+ (parser_l_init): Declared.
+
+ * parser.l (parse_init): Function renamed to parser_l_init.
+
+ * parser.c: New file.
+
+2015-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ New ignerr macro.
+
+ * eval.c (me_ignerr): New static function.
+ (eval_init): Registered ignerr macro.
+
+ * txr.1: Documented.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Introducing persistent error state on streams.
+
+ * lib.c (cobj_ops): New function.
+
+ * lib.h (cobj_ops): Declared.
+
+ * stream.c (null_ops): Initializer updated.
+ (struct stdio_handle): New member, err.
+ (stdio_stream_mark): Mark the err member.
+ (errno_to_string): New static function.
+ (stdio_maybe_read_error, stdio_maybe_error): Set persistent error
+ state. Use errno_to_string_function.
+ (stdio_put_string, stdio_put_char, stdio_put_byte, stdio_seek,
+ stdio_get_line): Set errno to zero, so that if the underlying
+ operations do not set errno on err, we don't misinterpret some pervious
+ errno value as pertaining to the failed stream operation.
+ (stdio_get_error, stdio_get_error_str, stdio_clear_error): New static
+ functions.
+ (stdio_ops, tail_ops, pipe_ops): Update initializer with new functions.
+ (string_in_get_error, string_in_get_error_str): New static functions.
+ (string_in_ops): Update initializer with new functions.
+ (byte_in_get_error, byte_in_get_error_str): New static functions.
+ (byte_in_ops): Update initializer with new functions.
+ (string_out_ops, strlist_out_ops): Update initializer with null
+ pointers for new functions.
+ (struct dir_handle): New struct type.
+ (dir_destroy, dir_mark): New functions.
+ (dir_get_line): Refactor for struct dir_handle context rather than DIR.
+ Persist error state.
+ (dir_close): Refactor for struct dir_handle.
+ (dir_get_error, dir_get_error_str, dir_clear_error): New static functions.
+ (dir_ops): Update initializer with new functions.
+ (make_stdio_stream_common): Initialize new err member.
+ (make_dir_stream): Refactor for struct dir_handle.
+ (get_error, get_error_str, clear_error): New functions.
+ (cat_get_error, cat_get_error_str, cat_clear_error): New static
+ functions.
+ (cat_stream_ops): Update initializer with new functions.
+ (stream_init): Register get-error, get-error-str, clear-error intrinsics.
+
+ * stream.h (struct strm_ops): New function pointer members, get_error,
+ get_error_str and clear_error.
+ (strm_ops_init): Macro extended with new arguments for new function pointers.
+ (get_error, get_error_str, clear_error): Declared.
+
+ * syslog.c (syslog_strm_ops): Update initializer with null
+ pointers for new functions.
+
+ * txr.1: Documented get-error, get-error-str and clear-error.
+
+2015-02-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Improved error reporting, particularly for macro expansion.
+
+ * eval.c (last_form_expanded): New variable.
+ (do_expand): New static function; contains previous expand
+ function.
+ (expand): Becomes a wrapper for do_expand, with re-entry
+ counting.
+ (eval_init): GC-protect last_form_expanded.
+
+ * eval.h (last_form_expanded): Declared.
+
+ * parser.l (regex_parse, lisp_parse): Just use a simple word for
+ the name of the regex or string parse location, not the entire
+ expression itself.
+
+ * unwind.c (uw_throw): Check whether expansion was going on
+ when the unhandled exception was thrown and print additional
+ information.
+
+2015-02-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * regex.c (match_regex_right): Bugfix: zero length matches
+ should return zero length, rather than nil. This is achieved by trying
+ the match at one past the last character.
+
+2015-02-20 Kaz Kylheku <kaz@kylheku.com>
+
+ String-returning wrappers for some regex matching functions.
+
+ * eval.c (eval_init): Register search-regst, match-regst
+ and match-regst-right intrinsics.
+
+ * regex.c (search_regst, match_regst, match_regst_right): New functions.
+
+ * regex.h (search_regst, match_regst, match_regst_right): Declared.
+
+ * txr.1: Documented new variants.
+
+2015-02-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * regex.c (print_rec): A compound must use parentheses for
+ elements which have a higher precedence than catenation.
+
+2015-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (list_collect, list_collect_append): In error
+ messages about bad appends, do not show the list being
+ appended because it may be an infinite lazy list.
+ For instance (append* 3 lazy-list).
+
+2015-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ New functions pad and weave.
+
+ * eval.c (pad_func, pad, weave_while, weave_gen, weavev):
+ New static functions.
+ (eval_init): Registered pad and weave intrisics.
+
+ * txr.1: Documented pad and weave.
+
+2015-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (lazy_appendv_func, lazy_appendv): Bugfix: append*
+ was silently ignoring lists after the first atom, instead of
+ throwing an error. Also, it was not detecting the case that
+ the last argument is a list which should just be returned,
+ and instead trying to find its tail in preparation for the
+ next call to lazy_appendv_func, the consequences being runaway
+ iteration over an infinite list.
+
+2015-02-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (symacro_k, fun_k): New keyword variables.
+ (lexical_lisp1_binding): New static function.
+ (eval_init): Initialize symacro_k and fun_k; register
+ new intrinsic function lexical-lisp1-binding.
+
+ * match.h (var_k): Existing external name declared.
+
+ * txr.1: Documented lexical-lisp1-binding.
+
+2015-02-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: Add dependency froml $(EXTRA_OBJS-y) to header
+ file and config.h, so windows resource file is rebuilt
+ when the version changes.
+
+2015-02-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: Removing bogus eval which refers to nonexistent
+ DEP_INSTANTIATE macro.
+
+2015-02-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (clean): Remove $(EXTRA_OBJS-y) so the Windows .res
+ file is removed.
+
+2015-02-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 104.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+2015-02-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (trunc_rem): New function.
+
+ * eval.c (eval_init): Register trunc-rem intrinsic.
+
+ * lib.h (trunc_rem): Declared.
+
+ * txr.1: Documented trunc-rem.
+
+ * tl.vim, txr.vim: Updated.
+
+2015-02-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (CFLAGS): Removed puzzling, unnecessary definitions
+ of XMALLOC, XCALLOC, XREALLOC and XFREE for $(MPI_OBJS). MPI
+ does not use such macros and the allocator is already retargetted
+ to use the TXR one.
+
+ * mpi-patches/use-txr-allocator: In this patch, we don't need
+ external declaration for chk_malloc or chk_realloc because they
+ are not used. Only chk_calloc is used.
+
+ * mpi-patches/add-bitops: Refreshed.
+
+ * mpi-patches/add-mp-hash: Likewise.
+
+ * mpi-patches/add-mp-set-intptr: Likewise.
+
+ * mpi-patches/add-mpi-toradix-with-case: Likewise.
+
+ * mpi-patches/bit-search-optimizations: Likewise.
+
+ * mpi-patches/export-mp-eq: Likewise.
+
+ * mpi-patches/faster-square-root: Likewise.
+
+ * mpi-patches/fix-bad-shifts: Likewise.
+
+ * mpi-patches/fix-ctype-warnings: Likewise.
+
+ * mpi-patches/fix-mult-bug: Likewise.
+
+ * mpi-patches/mpi-set-double-intptr: Likewise.
+
+ * mpi-patches/mpi-set-mpi-word: Likewise.
+
+ * mpi-patches/mpi-to-double: Likewise.
+
+2015-02-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Support txr-win.exe target which has no console window.
+
+ * Makefile (EACH_CONF): Iterate over arguments.
+ (opt/txr-win.o, dbg/txr-win.o): New special object files.
+ (opt/%-win.o, dbg/%-win.o): New pattern rule to build special object
+ files.
+ ($(PROG)-win, $(PROG)-win-dbg): New program targets.
+
+ * inst.nsi: Install txr-win.exe.
+
+2015-02-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: fixed flurry of phrasing, formatting fumbles.
+
+2015-02-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/011/macros-1.txr: Add test for lexical function
+ shadowing symbol macro.
+
+ * tests/011/macros-1.expected: Updated.
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * unwind.c (uw_throw): Detect invalid re-entry and bail.
+ Cautiously, we use fprintf rather than our streams system, in case some
+ problem with the streams is involved in this mess.
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * unwind.c (uw_throw): Put a txr: prefix on the unhandled
+ exception in early initialization message.
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Slight internal representation change of string-only exceptions.
+
+ One upshot of all this is that (throw 'foo "msg") now
+ does exactly the same thing as (throwf 'foo "msg").
+ A message-only exception really is a one-string exception argument
+ list ("message ..."), like the documentation says.
+
+ * unwind.h (struct uw_catch): exception member renamed to args.
+ (uw_catch): Macro follows structure member rename.
+
+ * eval.c (op_catch): Removed now unnecessary kludge of turning non-list
+ exception argument list into a one-element argument list.
+
+ * match.c (v_try): Similar hack to the one in op_catch
+ removed here.
+
+ * unwind.c (uw_unwind_to_exit_point, uw_push_catch): Follows rename of
+ exception member.
+ (uw_throw): The exception parameter is renamed to args. The kludge
+ removed from op_catch re-appears here, because numerous calls
+ to uw_throw just pass a string as args. It's less of a kludge here
+ because this is the master entry point to exception processing,
+ and it straightens out the representation right away.
+ The exception arguments or message are printed in a clearer way.
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Serious bugfix in the op macro, and derived macro, in
+ the handling of missing meta-numbers (for
+ instance (op ... @1 .. @3): 1 and 3 occur, but not 2.
+
+ * eval.c (supplement_op_syms): Bugfix: loop was testing
+ and updating the wrong variable, causing it to be looking at the first
+ element of the syms list in every iteration.
+ Not a regression: this was implemented wrong when the function
+ was introduced on October 6, 2013.
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (subst_vars): Bugfix. When an ordinary variable
+ occurs in the quasi syntax (which is the result of substitution
+ of metanums like @1 by the op macro), if that variable
+ evaluated to a list form, it was not being converted to
+ a string. The resulting form was then examined for variable
+ substitutions as if it were part of the quasi syntax.
+ This was introduced at the same time as the feature of being
+ able to use metanums in a quasiliteral (Feb 13, 2012:
+ last change before Version 57).
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (transform_op): When expanding @rest and metanums
+ like @1, @2, preserve the (sys:var X args ..) structure
+ if there are args (but of course with X replaced by the appropriate
+ gensym). This allows syntax like `@{1 10}` to work in quasiliterals: in
+ other words, modifiers on interpolated metas, on par with @{a 10}.
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * sysif.c (abort_wrap): New static function.
+ (sysif_init): Registered abort intrinsic.
+
+ * txr.1: Documented abort. Changed Unix Programming heading
+ to System Programming, since exit, abort and errno are not
+ Unix-specific, but C-specific.
+
+ * tl.vim, txr.vim: Updated.
+
+2015-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * unwind.c (unhandled_hook_s): New static variable.
+ (uw_throw): In the unhandled case, check if *unhandled-hook* variable
+ has a function, and use it instead of the default logic. If it's not a
+ function, abort with an error message. Clear it so that if the hook
+ function re-enters this code, it will not be used. Always exit now on
+ unhandled exceptions; do not abort.
+ (uw_late_init): New function.
+
+ * unwind.h (uw_late_init): Declared.
+
+ * lib.c (init): Call uw_late_init.
+
+ * txr.1: Documented *unhandled-hook*.
+
+ * genvim.txr: Scan the unwind.c file, since it has a reg_var now.
+
+ * tl.vim, txr.vim: Updated.
+
+2015-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * win/env.nsh: Before the potentially length SendMessage,
+ print an informative message.
+
+2015-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * win/env.nsh: Improve messages about environment
+ variable modification.
+
+2015-02-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Symbol macros shadowed by functions under dwim.
+
+ * eval.c (lookup_symac_lisp1, expand_lisp1,
+ expand_forms_lisp1): New static functions.
+ (expand): Handle dwim's arguments via
+ expand_forms_lisp1, rather than as a generic
+ compound form.
+
+ * txr.1: Revised text in several places to clarify
+ this expansion rule.
+
+2015-02-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 103
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+2015-02-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Update copyright notices from 2014 to 2015.
+
+ * arith.c, arith.h, combi.c, combi.h, debug.c, debug.h, eval.c, eval.h,
+ filter.c, filter.h, gc.c, gc.h, hash.c, hash.h, lib.c, lib.h,
+ match.c, match.h, parser.h, rand.c, rand.h, regex.c, regex.h,
+ signal.c, signal.h, stream.c, stream.h, sysif.c, sysif.h, syslog.c,
+ syslog.h, txr.c, txr.h, unwind.c, unwind.h, utf8.c, utf8.h:
+ Update.
+
+ * LICENSE, METALICENSE: Likewise.
+
+2015-02-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Windows installer.
+
+ * inst.nsi: New file.
+
+ * win/env.nsh: New file.
+
+2015-01-31 Kaz Kylheku <kaz@kylheku.com>
+
+ On Windows, add icon and identifying meta-data to executable.
+
+ * Makefile (EXTRA_OBJS-y): New variable.
+ (WINDRES): New recipe.
+
+ * configure: Check for presence of windres,
+ and generate add_win_res variable in config.make.
+
+ * win/txr.xcf: New file: GIMP project for icon.
+
+ * win/txr.ico: New file: icon with three sizes generated
+ from GIMP project.
+
+ * win/txr.rc: New file.
+
+2015-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Use macro to initialize strm_ops.
+
+ * stream.h (strm_ops_init): New macro.
+
+ * stream.c (null_ops, stdio_ops, tail_ops, pipe_ops, string_in_ops,
+ byte_in_ops, string_out_ops, strlist_out_ops, dir_ops,
+ cat_stream_ops): Initialize using macro.
+
+ * syslog.c (syslog_strm_ops): Likewise.
+
+2015-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Use macro to initialize cobj_ops.
+
+ * lib.h (cobj_ops_init): New macro.
+
+ * hash.c (hash_ops, hash_iter_ops): Initialize with cobj_ops_init.
+
+ * rand.c (random_state_ops): Likewise.
+
+ * regex.c (char_set_obj_ops, regex_obj_ops): Likewise.
+
+2015-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (make_ubignum): New static function.
+ (sign_extend): New function.
+
+ * eval.c (eval_init): Register sign-extend intrinsic.
+
+ * lib.h (sign_extend): Declared.
+
+ * txr.1: Documented sign-extend.
+
+ * tl.vim, txr.vim: Updated.
+
+2015-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: fixed use of nonexistent str-int in @(require) example;
+ fixed bad formatting under logtrunc and partition.
+
+2015-01-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (get_opt_param_syms): Fix broken function. This
+ was choking on keywords like :env in the lambda list,
+ and failing to handle the nested patterns of macro
+ lambda lists. Failing case: (defmacro x (: opt :env foo)).
+
+2015-01-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_macro_params): Bugfix: the colon argument's special
+ meaning "treat the argument as missing" must apply only to optional
+ parameters.
+
+2015-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (make_like): Fix regression introduced in 102.
+ A one element list being converted to a string
+ treated as an empty list, leading to empty string.
+
+2015-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (width): New function.
+
+ * arith.h (width): Declared.
+
+ * eval.c (eval_init): Width registered as intrisinc.
+
+ * txr.1: Documented width.
+
+2015-01-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (call_f): New global variable.
+ (do_mapf, mapf): New static functions.
+ (eval_init): Protect call_f from gc, and initialize it.
+ Re-register call function using call_f.
+ Register mapf intrinsic.
+
+ * txr.1: Documented mapf.
+
+2015-01-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register dupl and swap_12_21 as
+ the dup and flip intrinsics.
+
+ * lib.c (do_dup): New static function.
+ (dupl): New function.
+
+ * lib.h (dupl): Declared.
+
+ * txr.1: Documented dup and flip.
+
+2015-01-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (callf): New static function.
+ (eval_init): callf registered.
+
+ * txr.1: Documented callf.
+
+2015-01-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Basic implementation of constantp. Does not
+ recognize forms like (+ 2 2) as constant.
+
+ * eval.c (constantp_noex, constantp): New functions.
+ (eval_init): Registered constantp as intrinsic.
+
+ * tl.vim, txr.vim: Updated.
+
+ * txr.1: Documented constantp.
+
+2015-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (get_string): New argument, close_after_p.
+ Close the stream unless close_after_p is specified and is nil,
+ or when it is missing, an there is no compatibility or it's
+ newer than version 102.
+
+ * stream.h (get_string): Updated declartion.
+
+ * txr.1: Documented default closing behavior of get-string
+ and the new optional argument for overriding it.
+
+2015-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Minor fix in split-str-set documentation.
+
+2015-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow macros to tell what symbols have lexical function
+ or variable bindings.
+
+ * eval.c (lexical_var_p, lexical_fun_p): New local functions.
+ (eval_init): Registered as intrinsics.
+
+ * txr.1: Documented lexical-var-p and lexical-fun-p.
+
+ * tl.vim, txr.vim: Updated.
+
+2015-01-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 102
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-01-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (zerop): Handle character arguments.
+ (plusp, minusp): New functions.
+
+ * eval.c (eval_init): Register plusp and minusp.
+
+ * lib.h (plusp, minusp): Declared.
+
+ * txr.1: Documented plusp and minusp, and the
+ handling of characters by zerop.
+
+2015-01-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix for LLVM wchar_t literals not being four byte
+ aligned, affecting OS X port.
+
+ * configure: Detect a SIZEOF_WCHAR_T when detecting integer
+ type that will hold a pointer. In the lit_align test,
+ if we are on Apple Mac OSX, use a lit_align of 2,
+ so the logic kicks in for padding literals and handling
+ misalignment.
+
+ * lib.h (litptr): Add a case for LIT_ALIGN < 4 and
+ SIZEOF_WCHAR_T == 4. In this case we do the arithmetic
+ on the pointer using short *, and then convert to
+ wchar_t.
+
+ * HACKING: New section 2.4.3 about new wchar_t hack.
+
+2015-01-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.h (sig_save_enable, sig_save_disable):
+ Use do;while(0) trick instead of local typedef
+ to cause terminating semicolon to be required.
+ (sig_restore_enable, sig_restore_disable):
+ Remove superfluous do { } while (0).
+ Closing a brace is good enough.
+
+2015-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * glob.c: New file.
+ (glob_wrap, glob_init): New functions.
+ (errfunc_thunk): New static function.
+
+ * glob.h: New file.
+
+ * txr.c (main): call glob_init if HAVE_GLOB is defined.
+
+ * configure (have_glob): New variable.
+ (gen_config_make): Add have_glob to config/config.make.
+ Detect glob function and set have_glob, and add
+ HAVE_GLOB to config/config.h.
+
+ * Makefile (OBJS): Include glob.h if have_glob is "y".
+
+ * genvim.txr: Scan glob.c for functions and variables also.
+
+ * txr.1: Documented glob and glob-related variables.
+
+2015-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (retest): New phony target for convenience.
+
+2015-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (make_like): Bugfix. (make-like nil "abc")
+ must return the empty string, not nil. Only
+ lists of non-characters fail to convert to a string.
+ Since programs may depend on the hitherto wrong,
+ undocumented behavior, this is made subject to
+ compatibility.
+
+ * txr.1: Added compatibility note.
+
+2015-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (merge_wrap): Make generic over sequences.
+
+ * txr.1: Update documentation for merge function.
+
+2015-01-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_trailer): Bugfix: not returning new variable
+ bindings captured in trailer section. Ouch!
+
+2015-01-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 101
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+2015-01-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (rebuild, clean, repatch): Fail these targets if
+ the program is not configured.
+ (distclean): Providing alternative implementation when the
+ program is not configured.
+
+2014-12-31 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (replace_str, replace_vec): Bugfix. The replacement item
+ sequence may be an infinite list in the case that the from argument
+ specifies a list of indices. We must avoid trying to calculate its
+ length before we have detected this case.
+
+2014-12-31 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Fix error. (set [seq index-list] new) corresponds to
+ replace not to refset.
+
+2014-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (stream_init): Register make_catenated_stream in
+ a different form as cat-streams.
+
+ * txr.1: Document cat-streams.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2014-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (simple_lazy_stream_func): Bugfix: close the stream
+ if get_line returns nil.
+
+ * stream.c (cat_get_line, cat_get_char, cat_get_byte): The catenated
+ stream read operations close an exhausted stream before popping
+ to the next one.
+
+ * txr.1: Document closing behavior of catenated streams.
+
+2014-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (ap_s, ret_s, aret_s): New symbol variables.
+ (me_ret): Static function renamed to me_ret_aret.
+ Handles ret and aret macro expansion.
+ (eval_init): Initialize ap_s, ret_s and aret_s.
+ Re-register ret macro using ret_s and bind to me_ret_aret.
+ Register aret macro.
+
+ * txr.1: Documented aret.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2014-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Registered intrinsic function unique.
+
+ * lib.c (unique): New function.
+ (uniq): Becomes wrapper around unique.
+
+ * lib.h (unique): Declared.
+
+ * txr.1: Documented unique, and equivalence between uniq and unique.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2014-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (func_n1ov, func_n2ov, func_n3ov): New functions.
+
+ * lib.h (func_n1ov, func_n2ov, func_n3ov): Declared.
+
+2014-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (func_n0o): Useless, unused function removed.
+
+ * lib.h (func_n0o): Declaration removed.
+
+2014-12-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Syntax highlighting issue: keywords in braced variable syntax
+ not being recognized.
+
+ * genvim.txr (txr_braced_ident): New match kind, specifically
+ for a keyword.
+ (txr_bracevar): Bracevar region contains txr_braced_indent.
+
+ * txr.vim, tl.vim: Regenerated.
+
+2014-12-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (copy): Support copying random state objects
+ vi make_random_state.
+
+ * txr.1: Updated.
+
+2014-12-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (rand32): Bugfix: if the seed object is a random
+ state, we do not want to make the 8 calls to rand32 to
+ mix up the state; we need are making a straight copy.
+
+ * txr.1: Document the possibility that the seed object
+ is a random state. Document the platform-independence of the
+ integer seed.
+
+2014-12-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (struct rand_state): Change cur member to unsigned.
+ This generates better code for rand32.
+
+2014-12-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (rstate): New inline function.
+ (rand32): Use inline function instead of macro.
+ I compared gcc -O2 output on Intel: no difference.
+
+2014-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Factor out some compiling commands into macros.
+
+ * Makefile (COMPILE_C, COMPILE_C_WITH_DEPS, LINK_PROG): New
+ macro strings.
+ (dbg/%.o, opt/*.o, %.o, $(PROG), $(PROG)-dbg, conftest,
+ conftest2): These targets now use these commands.
+
+2014-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Build bugfix: if a config.h header exists in $(top_srcdir),
+ then that header is used when building in a separate directory,
+ instead of the config.h generated in that directory.
+ To fix this, we move config.h into a config/ subdirectory.
+ The $(top_srcdir)/config is not in the include search path
+ when buiding in a separate build directory.
+ While we are at it, let's move all the configure materials
+ generated by the configure script into config/.
+
+ * Makefile: include config/config.make at the top. Removing the
+ rule which asserts the existence of configuration based on
+ the presence of config.make.
+ (CFLAGS): Add $(conf_dir) to include search path with -iquote.
+ (notconfigured): New conditionally-defined target for producing
+ the error message when the build system is not configured.
+ (NL, DEP): New variables.
+ ($(OBJS)): Make dependent on config/config.make and config/config.h
+ with help of DEP macro.
+ (opt/lex.yy.o, dbg/lex.yy.o): Express dependency using DEP.
+ (y.tab.h): Split off as a dependent on y.tab.c rather than
+ a co-target in the rule. The rule has a body to handle
+ the situation when y.tab.h is missing for some reason, but
+ y.tab.c already exists (and so won't be re-made, and so
+ y.tab.h won't be remade).
+
+ * configure: Require GNU Make 3.81 rather than 3.80.
+ (conf_dir): New variable.
+ (config_h, config_make, config_log): New variables. These are used in
+ place of config.h, config.make and config.log. Add conf_dir to
+ config.make variable.
+
+2014-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (have_git): New variable and configure test for git.
+
+ * Makefile (SRCS): Only set if git is available.
+ (enforce): Fail if we don't have git.
+
+2014-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Throwing away old dependency system.
+
+ * Makefile (DEPGEN): New macro variable.
+ (OPT_OBJS, DBG_OBJS): Define with := assignment.
+ (OBJS): New variable.
+ (dbg/%.o, opt/*.o): Use -MMD and -MT options of gcc to generate
+ dependencies. Also use DEPGEN macro to rewrite each dependency
+ makefile's rule into a DEP_ variable assignment.
+ (DEP_INSTANTIATE): New macro variable.
+ (include dep.mk): Removed, replaced by eval hack that
+ includes all the .d files and instantiates the rule from
+ the DEP_ variable in each one.
+ (opt/lex.yy.o, dbg/lex.yy.o): We need to hard code the dependency
+ of these on y.tab.h, to force that header to generate.
+ (DEP_opt/lex.yy.o, DEP_dbg/lex.yy.o): New variables, related
+ to above.
+ (depend): Target removed.
+
+ * dep.mk: File removed.
+
+ * depend.txr: File removed.
+
+2014-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (ABBREV): Rewrite to take advantage of DEP_
+ variables to remove the dependencies from the output.
+ (ABBREV2): No longer needed, removed.
+ (dbg/%.o, opt/%.o, %.o): Just use ABBREV instead of ABBREV2; it does
+ the right thing. Dependency of objects on config.make removed.
+
+2014-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (install-tests): Do not use option -c of
+ cpio (use old ASCII format). This was unintentional.
+ On extract, use -m option to preserve timestamps,
+ like we do in INSTALL.
+
+2014-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Test output goes to tst/ now.
+
+ * Makefile (TESTS_OUT): We don't need to refer to top_srcdir.
+ Add the tst/ prefix to .out paths. Find must be used with -H
+ because tests is a symlink for out-of-tree build directories.
+ (tests/*): All target-specific assignments are moved to tst/tests/*
+ paths, and top_srcdir is no longer used in the right hand side
+ values.
+ (%.out): Becomes (tst/%.out).
+ (%.ok): need to compute .expected name from .out differently to
+ account for tst/ prefix.
+ (tests.clean): Just remove the tst directory.
+ (install-tests): Remove the tst directory first so test commands
+ are forced to run (though it is a dry run).
+ We no longer need to switch to top_srcdir to find the .txr
+ files, nor do we have to filter out .out files from the tests
+ tree. We no longer have to switch to top_srcdir in the recursive
+ make. Also, show the installation of tests using ABBREV3.
+
+ * configure: When configuring in a separate directory, symlink
+ the tests directory back to the source tree. Since there
+ are now three things being symlinked, rewrote that as a loop.
+ The recommendation to build in a separate directory is just a note, not
+ a warning.
+
+2014-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (($TESTS_OUT)): Do not depend on $(PROG).
+ This adds superfluous commands to run.sh under make install-tests,
+ and is also inappropriate if a different txr binary is being tested.
+ (install-tests): Do not override top_srcdir in the recursive make
+ call; instead use -C to change to $(top_srcdir).
+
+2014-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (all): Mark as phony target.
+
+2014-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Condensed make output.
+
+ * Makefile (VERBOSE): New variable.
+ (V, ABBREV, ABBREV1, ABBREV3): New macro variables.
+ (dbg/%.o, opt/%.o): Use V, ABBREV1 for concensed output.
+ ($(PROG), $(PROG)-dbg, lex.yy.c, y.tab.c, %.out,
+ %.ok, INSTALL): Likewise, but use ABBREV.
+ (tests, GREP_CHECK, config.make, conftest.yacc,
+ conftest.clean): Use $(V) instead of @.
+ (tests.clean): Remove @; do not hide remove commands.
+ (INSTALL): Use $(V) instead of @ and use ABBREV3 to
+ provide condensed output.
+ (install): Use $(V) on $(PREINSTALL) so we don't see :
+ in the output.
+ (install-tests): Put $(V) on all steps.
+
+2014-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Debug builds optional with --debug-also config option.
+
+ * Makefile (PROG): Variable removed, now set in config.make.
+ (all): Target now depends on $(BUILD_TARGETS) variable, set
+ in config.make.
+
+ * configure (debug_also) New variable.
+ (gen_config_make): Generate PROG and BUILD_TARGETS variables.
+
+2014-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (tofloat, toint): Handle characters.
+ Fix error message in toint wrongly identifying itself as tofloat.
+
+ * txr.1: Document handling of characters.
+
+2014-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register in function as intrinsic.
+
+ * lib.c (in): New function.
+
+ * lib.h (in): Declared.
+
+ * txr.1: Documented in.
+
+ * txr.vim, tl.vim: Regenerated.
+
+2014-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (set_diff): Bugfix: use member rather than find,
+ so that a nil set element is handled properly.
+
+2014-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (INSTALL): Bugfix: touch -r $(2) does not work
+ right when $(2) is a wildcard like path/to/*.txr. It touches files in
+ the source tree to the timestamp of the argument after -r. Putting in
+ a shell loop to handle this.
+
+2014-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (TESTS_TMP): New variable.
+ (TESTS_OUT): Depends on $(PROG).
+ (TESTS_OK): Does not dependon $(PROG).
+ (tests): Does not depend on tests.clean.
+ (retest): Target removed.
+ (%.out : %.txr): Generate to temporary file,
+ then move to .out.
+ (tests.clean): Remove $(TESTS_TMP).
+
+2014-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (SRCS): Compute from top_srcdir, so we don't get a warning
+ from git, and "make enforce" works from out of three builds.
+
+2014-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Bugfix: the "share" directory has to be
+ symbolically linked. Without this, tests which require txr to have
+ access to its library do not work.
+
+2014-12-04 Kaz Kylheku <kaz@kylheku.com>
+
+ TXR now builds optimized and debug at the same time.
+ Optimized object files are under opt/ and debug
+ object files are under dbg/. The debug txr executable
+ is called txr-dbg.
+
+ * Makefile (CFLAGS): $(OPT_FLAGS) is omitted from CFLAGS,
+ so we can expand it where appropriate.
+ (ADD_CONF, EACH_CONF): New variables, used as macros.
+ (DBG_OBJS, OPT_OBJS): New variables.
+ (dbg/%.o, opt/%.o): New rules.
+ (all): New target.
+ ($(PROG)-dbg): New target.
+ (clean): Remove the object directories with rm -rf.
+ Remove $(PROG)-dbg.
+ (depend): Pass $(OPT_OBJS) and $(DBG_OBJS) to depend.txr
+ Also: various target-specific assignments for object files
+ had to be split for rel and dbg.
+
+ * depend.txr: Updated to handle dbg/ or rel/ prefix on
+ object file paths.
+
+ * dep.mk: Regenerated.
+
+2014-12-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (clean): add tests.clean as prerequisite.
+ (tests): Add tests.clean as prerequiste, remove rm command.
+ (retest, tests.clean): New rules.
+
+2014-12-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (tests/009/json.out): Use eager assignment
+ intead of lazy assignment to set TXR_ARGS.
+
+2014-12-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (TXR): New variable. We use this to run txr
+ rather than ./$(PROG). This way we can override the variable
+ from the command line if necessary.
+ (TESTS): Variable removed.
+ (TESTS_OUT, TESTS_OK): New variables, replace TESTS.
+ (tests): Prerequisites is now $(TESTS_OK), which are
+ actual timestamp files. Also depends on $(PROG).
+ (tests/%/%): Target specific assignments are now for .out
+ targets rather than .ok targets.
+ (%.out): New pattern target, made from half of previous %.ok rule.
+ (%.ok): Smaller rule, only performs diff between .out and .expected,
+ and touches the .ok stamp.
+ (%.expected): Bugfix: this rule now just copies .out to .expected,
+ and its prerequisite is %.out rather than %.txr.
+ Previously it tried to run txr, but it wouldn't use the correct
+ options, which depended on the target-specific assignments for
+ various .ok files.
+ (install-tests): Bugfix: in the "make -s -n" call use the new TXR
+ variable to specify the program's path. This fixes the issue that ./
+ was prepended to the txr commands, resulting in nonworking run.sh.
+ (txr-manpage.html): Use TXR to invoke txr rather than PROG.
+
+2014-12-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: Adding empty .SUFFIXES: to disable built-in suffixes.
+ Also set MAKEFLAGS to disable all built-in rules.
+ The only one rule we used is .c to .o, so we provide it ourselves.
+
+2014-11-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register lequal and gequal.
+
+ * lib.c (lequal, gequal, lequalv, gequalv): New functions.
+
+ * lib.h (lequal, gequal, lequalv, gequalv): Declared.
+
+ * txr.1: Documented lequal and gequal.
+
+ * txr.vim, tl.vim: Regenerated.
+
+2014-11-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register less and greater to
+ the lessv and greaterv functions instead of less and greater.
+
+ * lib.c (lessv, greaterv): New functions.
+
+ * lib.h (lessv, greaterv): Declared.
+
+ * txr.1: Document variadic nature of less and greater.
+
+2014-11-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register sort-group.
+
+ * lib.c (sort_group): New function.
+
+ * lib.h (sort_group): Declared.
+
+ * txr.1: Documented.
+
+2014-11-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (partition_star_func): Bugfix: doing rplaca(env, seq)
+ too early, before the loop which adjusts its value.
+ Restructuring this slightly to avoid duplicated code, by moving the
+ !first check later.
+
+2014-11-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (partition_by_func): Rename one local variable for clarity.
+ Remove unessential variable last, and move the next variable
+ into loop scope.
+
+2014-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (wrap_star, wrap): New functions.
+
+ * eval.c (eval_init): Registered wrap and wrap* intrinsics.
+
+ * lib.h (wrap_star, wrap): Declared.
+
+ * txr.1: wrap and wrap* documented.
+
+2014-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (succ, ssucc, sssucc, pred, ppred, pppred): New functions.
+
+ * eval.c (eval_init): Register new functions as intrinsics.
+
+ * lib.h (succ, ssucc, sssucc, pred, ppred, pppred): Declared.
+
+ * txr.1: Documented.
+
+2014-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (where): Argument order reversed, with compat support.
+
+ * lib.h (where): Declaration updated.
+
+ * txr.1: Documented.
+
+2014-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (sel): Accept a function in place of the index list.
+
+ * txr.1: Documented.
+
+2014-11-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (split_str): If the separator string is empty,
+ then unless opt_compat is 100 or less, provide a more
+ consistent behavior, rather than splitting the string
+ into characters. This latter behavior was never documented.
+
+ * txr.1: Documented.
+
+ * dep.mk: Updated.
+
+2014-11-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (max2, min2): Use the less comparison function
+ for generic semantics.
+
+ * lib.h (max2, min2): Parameter names changed to avoid suggesting
+ that the operands are numbers.
+
+ * txr.1: Documentation for min and max updated.
+
+2014-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (opip_s, oand_s, chain_s, chand_s): New global variables.
+ (macro_form_p): Forward declaration added.
+ (me_opip): New static function.
+ (eval_init): Intern new symbols, register opip and oand macros
+ to me_opip function. Use chain_s and chand_s in registration
+ for chain and chand.
+
+ * txr.1: Document opip and oand
+
+ * tl.vim, txr.vim: Regenerated.
+
+2014-11-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (sub, ref, refset, replace, update, search_list):
+ Fix cut and paste problem: type_mismatch argument expression
+ referring to the C function cons rather than the intended
+ object seq.
+
+2014-11-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register chand intrinsic.
+
+ * lib.c (do_chand): New static function.
+ (chandv): New function.
+
+ * lib.h (chandv): Declared.
+
+ * txr.1: Documented chand.
+
+2014-11-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow then-func to be omitted in iff. Cleanup.
+
+ * eval.c (eval_init): Register iff as requiring only one arg.
+
+ * lib.c (do_iff): Do not check thenfun for nil. Just call it.
+ (iff): Default thenfun to identity.
+
+ * txr.1: Documentation updated.
+
+2014-11-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (iff): Bugfix: forgotten handling of default
+ argument, resulting in : symbol being called as a function.
+
+ * txr.1: Removing description of situation when the then-function
+ argument of iff or iffi is specified as nil. This is deprecated
+ behavior which can be obtained by using the false function.
+
+2014-10-31 Kaz Kylheku <kaz@kylheku.com>
+
+ New macros tb and tc.
+
+ * eval.c (me_tb, me_tc): New static functions.
+ (eval_init): Registered tb and tc macros.
+
+ * txr.1: Documented tb and tc.
+
+2014-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (chk_grow_vec): New function.
+ (string_extend): Use chk_grow_vec.
+ (vec_set_length): Avoid subtractions for comparing numbers.
+
+ * lib.h (chk_grow_vec): Declared.
+
+ * stream.c (snarf_line, string_out_put_string): Use chk_grow_vec.
+
+2014-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing finalization hooks.
+
+ * gc.c (struct fin_reg): New struct type.
+ (final_list, final_tail, mark_makefresh): New static variables.
+ (mark_obj): Under generational GC, if make_makefresh is in
+ effect, set the generation to -1 on all marked objects.
+ (sweep_one): In an EXTRA_DEBUGGING build, call breakpt
+ if the object being swept is the one in break_obj.
+ Under generational GC, place reachable objects that are
+ in generation -1 the freshobj nursery and assign them to generation 0,
+ rather than sticking them into the mature generation 1.
+ (sweep): Under generational gc, reset the freshobj_idx variable
+ here, so that sweep_one has an empty nursery in which
+ to place the generation -1 objects.
+ (prepare_finals, call_finals): New static functions.
+ (gc): Call prepare_finals before sweep, and call call_finals
+ just before re-enabling GC and returning. Do not reset freshobj_idx to
+ zero; this was done in sweep, which may have added entries into it.
+ (gc_finalize): New function.
+ (gc_late_init): Register gc_finalize as intrinsic function finalize.
+
+ * txr.1: Documented finalize.
+
+ * HACKING: Documented finalization, described the additional
+ meaning of the -1 generation, and added a section on debugging with
+ break_obj and breakpt.
+
+2014-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.h (break_obj): Missing extern added on declaration.
+ This broke C++ compilation with -DEXTRA_DEBUGGING turned on.
+
+2014-10-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Vim syntax coloring for standalone TXR Lisp (*.tl) files.
+
+ * genvim.txr (generate): New pattern function, contains
+ generation logic so we can do it twice.
+
+ * txr.vim: Regenerated.
+
+ * tl.vim: New file.
+
+2014-10-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (type_check): Function moved to header file inline.
+ (throw_mismatch): New function.
+
+ * lib.h (throw_mismatch): Declared.
+ (type_mismatch): Declaration turned into inline function.
+
+2014-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_begin): Use coerce macro instead of raw C cast.
+ Use cobj_handle so hash argument is validated.
+
+ * parser.l (YY_INPUT): Use convert macro instead of raw C cast.
+
+2014-10-24 Kaz Kylheku <kaz@kylheku.com>
+
+ GNU Flex's libfl library provides nothing. Let us not refer to it. It
+ only causes build issues on some systems where it is not provided
+ in the standard location, or is not cross-compiled properly.
+
+ * Makefile (LEXLIB): Reference to variable removed.
+
+ * configure (lexlib): Variable removed.
+ (LEXLIB): config.make variable not generated.
+
+ * parser.l (yywrap): Provide this trivial function as inline.
+
+2014-10-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: Removing trailing spaces.
+ (GREP_CHECK): New macro.
+ (enforce): Rewritten using GREP_CHECK, with new checks.
+
+ * arith.c, combi.c, debug.c, eval.c, filter.c, gc.c, hash.c, lib.c,
+ * lib.h, match.c, parser.l, parser.y, rand.c, regex.c, signal.c,
+ * signal.h, stream.c, syslog.c, txr.c, unwind.c, utf8.c: Remove
+ trailing spaces.
+
+2014-10-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Fix incorrect, registration of
+ repeat; it must have one optional argument.
+
+2014-10-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 100.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+2014-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Ensure that a hash reorganization doesn't take place
+ during a traversal, which could cause items to be visited
+ twice or skipped.
+
+ * gc.c (full_gc): Changed from static to exter (full_gc): Changed to
+ internal linkage.
+
+ * gc.h (full_gc): Declared.
+
+ * hash.c (struct hash): New member, usecount.
+ (struct hash_iter): New member, next.
+ (reachable_iters): New static variable.
+ (hash_mark): Reset the usecount of every reachable hash table.
+ (hash_iter_mark): Add every reachable iterator to reachable_iters
+ list.
+ (make_hash, make_similar_hash, copy_hash): Initialize usecount.
+ (gethash_c): Do not call hash_grow if usecount is nonzero.
+ (hash_begin): Initialize next field of hash_iter to null.
+ Increment use count on hash table.
+ (hash_next): When traversal ends, release use count, and
+ null out the hash table reference.
+ (do_weak_tables): New static function.
+ (do_iters): New static function.
+ (hash_process_weak): Weak hash processing logic moved
+ to do_weak_tables. Also calls do_iters.
+
+ * txr.1: Describe hash table traversal, and the assurances
+ and caveats about inserting and deleting items.
+
+2014-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (interp_fun): If the function doesn't have
+ specials, then don't bother saving and restoring dynamic
+ env around the argument binding and evaluation.
+
+2014-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register notf intrinsic function.
+
+ * lib.c (do_not): New static function.
+ (notf): New function.
+
+ * lib.h (notf): Declared.
+
+ * txr.1: Documented notf.
+
+ * share/txr/stdlib/txr-case.txr (bindable): Eliminated.
+ (txr-if): Use functional expression, taking advantage of notf.
+
+ * txr.vim: Regenerated.
+
+2014-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * share/txr/stdlib/txr-case.txr: New file.
+
+ * txr.1: Document txr-if, txr-when and txr-case.
+
+ * genvim.txr: Added new macro names.
+
+ * tests/011/txr-case.expected: New file.
+
+ * tests/011/txr-case.txr: New file.
+
+ * txr.vim: Regenerated.
+
+2014-10-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Source file inclusion implemented: needed for macros.
+
+ * match.c (include_s): New symbol variable.
+ (v_load): Function extended to handle include semantics.
+ (include): External wrapper function for doing inclusion
+ via v_load.
+ (syms_init): include_s initialized.
+
+ * match.h (include_s): Declared.
+ (include): Declared.
+
+ * parser.y (check_for_include): New static function.
+ (clauses_rev): Use check_for_include to replace @(include ..)
+ directive.
+
+ * txr.1: Documented include.
+
+ * genvim.txr: Added include symbol.
+
+ * txr.vim: Regenerated.
+
+2014-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_fun): Bugfix: replace incorrect plain return
+ with debug_return. This causes a stray debug frame to be left
+ on the environment stack which turns to garbage, leading to
+ an invalid longjmp in another debug_return elsewhere
+ which tries to use that frame. This was diagnosed by valgrind
+ indicating accesses below the stack frame, and also by glibc
+ "longjmp causes uninitialized stack frame" abort.
+
+2014-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (lisp_parse): Bugfix: the error_stream argument
+ must be checked to be a stream before we plant it in place
+ of std_error, otherwise we will get a type exception thrown
+ lower down, which leads to runaway recursion as TXR tries
+ to print the error messages on std_error.
+
+ * dep.mk: Regenerated.
+
+2014-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (r_exprs): New grammar symbol. r_exprs uses
+ left-recursive rules to avoid filling the yacc stack, and
+ returns the items in reverse order. The output of each
+ r_exprs-generating rule consists of a list which gives
+ the terminating atom, and then the list contents in reverse order.
+ (n_exprs): Becomes wrapper for r_exprs which deals with
+ the terminating atom, and reversed items.
+
+2014-10-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Allow TXR to support large programs, and efficiently so.
+ (clauses_rev): New grammar symbol. Uses a left-recursive rule that
+ does not consume an amount of parser stack proportional to the number
+ of clauses, and sticks to efficient consing, which means that
+ the list is built up in reverse.
+ (clauses): Now just a wrapper rule for clauses_rev which nreverses
+ its output.
+ (clauses_opt): Retargetted to use clauses_rev instead of clauses,
+ and reverse its output.
+
+2014-10-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Deal with situation when GC is disabled and the freshobj array runs out
+ of room. This could happen when parsing a really large TXR program,
+ since gc is disabled during parsing. Currently it asserts, which
+ is not acceptable.
+
+ * gc.c (make_obj): If after gc, the freshobj array has not been
+ emptied (obviously because gc is disabled), do not assert.
+ Rather, set the full_gc flag to request a full garbage collection
+ when gc is re-enabled. Furthermore, only place newly allocated objects
+ into freshobj if full_gc has not been set. Thus, if we exhaust the
+ freshobj array while gc is off, the full_gc flag is set, and we
+ discontinue use of that array. When gc is re-enabled, we will do a full
+ gc pass. A full gc pass ignores freshobj array, so it doesn't matter
+ that its use was discontinued.
+
+2014-10-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (mf_all): Drop data_lineno parameter. Initialize
+ the corresponding member based on whether or not data is nil.
+ (do_match_line, mf_from_ml, match_filter, match_fun, extract):
+ Do not pass starting line number argument to mf_all.
+ This fixes a bug when the line number at @(eof) for an empty
+ file comes out as zero.
+ (mf_args, v_skip, v_fuzz, v_next, v_gather, v_collect,
+ open_data_source, match_files): Use zero and one instead of num(0) and
+ num(1).
+
+2014-10-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_eof): Bugfix: we are at EOF not only when
+ the remaining data is nil but when it is (nil). This
+ happens for interactive streams.
+
+2014-10-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (dest_bind): Remove the restriction of not allowing
+ @(expr ...) and @var on the left side of a bind. This
+ is useful, and necessary for @(line @(lisp expr)) to work:
+ matching computed line numbers and character positions.
+
+ * txr.1: Document use of Lisp on left hand side of bind,
+ that there is a restriction on the left hand side of a set,
+ and that Lisp can be used in a line or chr directive for
+ computed matches.
+
+2014-10-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: New section Type Safety.
+ Table of contents regenerated with line numbers.
+
+ * HACKING-toc.txr: New file.
+
+2014-10-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Converting cast expressions to macros that are retargetted
+ to C++ style casts when compiling as C++.
+
+ * lib.h (strip_qual, convert, coerce): New casting macros.
+ (TAG_MASK, tag, type, wli_noex, auto_str, static_str,
+ litptr, num_fast, chr, lit_noex, nil, nao): Use cast macros.
+
+ * arith.c (mul, isqrt_fixnum, bit): Use cast macros.
+
+ * configure (INT_PTR_MAX): Define using cast macro.
+
+ * debug.c (debug_init): Use cast macro.
+
+ * eval.c (do_eval, expand_macro, reg_op, reg_mac, eval_init):
+ Use cast macros.
+
+ * filter.c (filter_init): Use cast macro.
+
+ * gc.c (more, mark_obj, in_heap, mark, sweep_one, unmark): Use
+ cast macros.
+
+ * hash.c (hash_double, equal_hash, eql_hash, hash_equal_op,
+ hash_hash_op, hash_print_op, hash_mark, make_hash, make_similar_hash,
+ copy_hash, gethash_c, gethash, gethash_f, gethash_n, remhash,
+ hash_count, get_hash_userdata, set_hash_userdata, hash_iter_destroy,
+ hash_iter_mark, hash_begin, hash_uni, hash_diff, hash_isec): Use
+ cast macros.
+
+ * lib.c (code2type, chk_malloc, chk_malloc_gc_more, chk_calloc,
+ chk_realloc, chk_strdup, num, c_num, string, mkstring, mkustring,
+ upcase_str, downcase_str, string_extend, sub_str, cat_str, trim_str,
+ c_chr, vector, vec_set_length, copy_vec, sub_vec, cat_vec,
+ cobj_print_op, obj_init): Likewise.
+
+ * match.c (do_match_line, hv_trampoline, match_files, dir_tables_init):
+ Likewise.
+
+ * parser.l (grammar): Likewise.
+
+ * parser.y (parse): Likewise.
+
+ * rand.c (make_state, make_random_state, random_fixnum, random):
+ Likewise.
+
+ * regex.c (CHAR_SET_L2_LO, CHAR_SET_L2_HI, CHAR_SET_L1_LO,
+ CHAR_SET_L1_HI, CHAR_SET_L0_LO, CHAR_SET_L0_HI, L0_full, L0_fill_range,
+ L1_full, L1_fill_range, L1_contains, L1_free, L2_full, L2_fill_range,
+ L2_contains, L2_free, L3_fill_range, L3_contains, L3_free,
+ char_set_create, char_set_cobj_destroy, nfa_state_accept,
+ nfa_state_empty, nfa_state_single, nfa_state_wild, nfa_state_set,
+ nfa_free, nfa_run, regex_destroy, regex_mark, dv_compile_regex,
+ reg_derivative, regex_compile, regex_print, regex_run,
+ regex_machine_init): Likewise.
+
+ * signal.c (sig_mask): Likewise.
+
+ * stream.c (make_null_stream, stdio_stream_print, stdio_stream_destroy,
+ stdio_stream_mark, stdio_maybe_read_error, stdio_maybe_error,
+ stdio_put_char_callback, stdio_get_char_callback, stdio_put_string,
+ stdio_put_char, stdio_put_byte, stdio_flush, stdio_seek,
+ stdio_get_prop, snarf_line, stdio_get_line, stdio_get_char,
+ stdio_get_byte, stdio_unget_char, stdio_unget_byte, stdio_close,
+ tail_strategy, pipe_close, string_in_stream_mark, string_in_get_line,
+ string_in_get_char, string_in_unget_char, string_in_get_prop,
+ byte_in_stream_destroy, byte_in_get_byte, byte_in_unget_byte,
+ string_out_stream_destroy, string_out_byte_callback,
+ string_out_byte_flush, string_out_put_string, string_out_put_char,
+ string_out_put_byte, strlist_mark, strlist_out_put_string,
+ strlist_out_put_char, make_strlist_output_stream, get_list_from_stream,
+ dir_get_line, dir_close, make_stdio_stream_common, make_pipevp_stream,
+ make_string_input_stream, make_string_byte_input_stream,
+ make_string_output_stream, get_string_from_stream, make_dir_stream,
+ stream_set_prop, stream_get_prop, close_stream, get_line, get_char,
+ get_byte, unget_char, unget_byte, vformat, put_string, put_char,
+ put_byte, flush_stream, seek_stream, open_tail, open_process, run,
+ cat_stream_print, cat_get_line, cat_get_char, cat_get_byte,
+ cat_unget_byte, cat_unget_char, cat_get_prop, cat_mark,
+ make_catenated_stream): Likewise.
+
+ * sysif.c (getcwd_wrap): Likewise.
+
+ * syslog.c (syslog_mark, syslog_put_string, syslog_put_char,
+ syslog_put_byte, syslog_get_prop, syslog_set_prop, make_syslog_stream):
+ Likewise.
+
+ * txr.c (get_self_path): Likewise.
+
+ * unwind.c (uw_init): Likewise.
+
+ * utf8.c (utf8_from_uc, utf8_to_uc, utf8_to, utf8_dup_from_uc,
+ utf8_dup_from, utf8_dup_to, utf8_decode): Likewise.
+
+2014-10-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Purge stray occurrences of "void *" from code base.
+
+ * lib.c (cobj_print_op): In the format call, cast
+ the C pointer to val, since the ~p conversion now
+ takes a val rather than void *.
+ (cptr_equal_op, obj_print, obj_pprint): Remove cast to
+ void *, since obj now already has the type that ~p expects.
+
+ * lib.h (struct any): Use mem_t * instead of void *.
+
+ * parser.h (yyscan_t): Repeat the definition from inside
+ the Flex-generated lex.yy.c.
+ (yylex_init, yylex_destroy, yyget_extra, yyset_extra): Re-declare
+ using yyscan_t typedef in place of void *.
+
+ * parser.l (yyget_column, yyerrprepf): Re-declare using yyscan_t.
+ (grammar): Use yyg in place of yyscanner in calls to yyerrprepf.
+
+ * parser.y (yylex, %lex-param): Use yyscan_t instead of void *.
+ (parse): Use yyscan_t for local variable.
+
+ * signal.c (stack): Change type from void * to mem_t *.
+
+ * stream.c (vformat): Conversion specifier p extracts val
+ instead of void *.
+ (run): Use casts that only remove const, not all the way to void *.
+
+ * txr.1: Documented p conversion specifier of format.
+
+ * Makefile (OBJS-y): Initialize with := to make sure it is a
+ simple variable, and not a macro.
+ (SRCS): New variable, listing source files.
+ (enforce): New rule for enforcing coding conventions.
+ Currently checks for void * occurrences.
+
+2014-10-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (gcd): Fix semantics. If either operand is
+ zero, return the other operand.
+ (lcm): New function.
+
+ * eval.c (eval_init): Retarget registration of gcd to
+ variable argument gcdv function. Register lcm.
+
+ * lib.c (gcdv, lcmv): New functions.
+
+ * lib.h (gcdv, lcm, lcmv): Declared.
+
+ * txr.1: Re-document gcd with coverage of lcm.
+
+ * txr.vim: Regenerated.
+
+2014-10-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (gcd, lognot): Bugfix: bignum results
+ in fixnum range not normalized.
+
+2014-10-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (dest_bind): More detailed log message for variable
+ mismatch.
+
+2014-10-16 Kaz Kylheku <kaz@kylheku.com>
+
+ New @(line) and @(chr) directives.
+
+ * match.c (line_s): New variable.
+ (h_chr, v_line): New static functions.
+ (syms_init): line_s initialized.
+ (dir_tables_init): Register v_line and h_chr.
+
+ * match.h (line_s): Declared.
+
+ * txr.1: Document @(line) and @(chr) directives.
+
+ * txr.vim: Regenerated.
+
+2014-10-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (subst_vars): Fix buggy rendering of TXR Lisp expressions
+ that evaluate to lists. For instance `@(list)` renders to the
+ string "nil", and `@(list 1 2)` renders as "(1 2)". The desired
+ behavior is "" and "1 2", respectively.
+ (do_output_line): In output directives, there is a similar problem.
+ A @(list) in the middle of an output block turns to nil, and
+ a @(list 1 2) renders in parentheses as (1 2). Furthermore,
+ there is the additional problem that no filtering is applied
+ to the interpolated value. These behaviors are subject to the
+ compatibility option, since they change the externally visible
+ behavior of TXR programs.
+
+ * txr.1: Document that empty lists in @(output) variable substitutions
+ turn into nothing. Document value of 100 for -C option, describing
+ the above issue.
+
+2014-10-14 Kaz Kylheku <kaz@kylheku.com>
+
+ More type safety, with help from C++ compiler.
+
+ * parser.h (scanner_t): New typedef. Cleverly, we use
+ yyguts_t as the basis for this, which pays off in
+ a few places, getting rid of conversions.
+ (parser_t): scanner member redeclared to scanner_t *.
+ (yyerror, yyerr, yyerrof, end_of_regex, end_of_char):
+ Declarations updated.
+
+ * parser.l (yyerror, yyerrorf, num_esc): scanner argument becomes
+ scanner_t * instead of void *.
+ (yyscanner): Occurrences replaced by yyg: why should we
+ refer to the type-unsafe void *yyscanner, when we know that
+ in the middle of the yylex function we have the properly
+ typed yyguts_t *yyg.
+ (end_of_regex, end_of_char): Argument changes to scanner_t * and name
+ strategically changes to yyg, eliminating the local variable and cast.
+
+ * parser.y (sym_helper): scanner argument becomes
+ scanner_t * instead of void *.
+ (%parse-param}: void *scnr becomes scanner_t *scnr.
+ (define-transform, yybadtoken): Use scanner_t * instead of void *.
+ (parse): Since yylex_init takes a void **, we use it to initialize
+ a local void *, and then assign it to the structure member.
+
+2014-10-14 Kaz Kylheku <kaz@kylheku.com>
+
+ C++ upkeep.
+
+ TXR's support for compiling as C++ pays off: C++ compiler finds
+ serious bugs introduced in August 2 ("Big switch to reentrant lexing
+ and parsing"). The yyerror function was being misused; some of
+ the calls reversed the scanner and parser arguments. Since one
+ of the two parameters is void *, this reversal wasn't caught.
+
+ * parser.l (yyerror): Fix first two arguments being
+ reversed.
+ (num_esc): Change previously correct call to yyerror to follow reversed
+ arguments, so that it stays correct.
+
+ * parser.y (%parse-param): Change order of these directives
+ so that the scnr parameter is before the parser parameter.
+ This causes the yacc-generated calls to yyerror to have
+ the arguments in the correct order. It also has the
+ effect of changing the signature of yyparse, reversing its parameters.
+ (parse): Update call to yyparse to new argument order.
+
+ * parser.h (yyparse): Declaration removed.
+ (yyerror): Declaration updated.
+
+ * regex.c (regex_kind_t): New enum typedef.
+ (struct regex): Use regex_kind_t rather than an enum
+ inside the struct, which has different scoping rules
+ under C++.
+
+ * txr.c (get_self_path): Fix signed/unsigned warning.
+
+2014-10-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Round of fixes.
+
+2014-10-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register greater function as intrinsic.
+
+ * lib.c (gt_f, lt_f): Global variables removed.
+ (greater_f): New variable.
+ (greater): New function.
+ (find_max, pos_max): Use greater_f as default for testfun,
+ rather than gt_f.
+ (find_min, pos_min): Use less_f as default for testfun,
+ rather than lt_f.
+ (obj_init): Remove references to gt_f and lt_f.
+ GC-protect and initialize greater_f.
+
+ * lib.h (greater_f): Declared.
+ (gt_f, lt_f): Declarations removed.
+
+ * txr.1: Documented greater, and use of less and greater
+ in pos-min, pos-max, find-min and find-max.
+
+ * txr.vim: Regenerated.
+
+2014-10-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr (sortuniq): Remove unnecessary function,
+ since (sortuniq list) can be done as (sort (uniq list)).
+
+2014-10-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (merge_wrap): New static function
+ (eval_init): Register less as intrinsic. Retarget merge intrinsic to
+ merge_wrap for proper argument defaulting which is missing from merge,
+ and which we don't want to introduce there since internal calls
+ to merge don't erquire it. Change registration of sort so it has
+ only one required argument, not two.
+
+ * lib.c (less_f): New global variable.
+ (less_tab): New static array.
+ (less_tab_init): New static function.
+ (less): New function.
+ (sort): Default lessfun argument to the less function.
+ (obj_init): GC-protect the less_f variable.
+ Initialize it with a function object made from the less function.
+ (init): Call less_tab_init.
+
+ * lib.h (enum type): New enumeration member MAX_TYPE, an alias
+ for the largest type.
+ (less_f, less): Declared.
+
+ * txr.1: Documented new less function, and that the lessfun
+ argument in sort and merge is optional, defaulting to less.
+
+ * txr.vim: Regenerated.
+
+2014-10-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register chr_isblank and chr_isunisp as
+ intrinsics.
+
+ * lib.c (chr_isblank, chr_isunisp): New functions.
+
+ * lib.h (chr_isblank, chr_isunisp): Declared.
+
+ * regex.h (spaces): Declaration for existing variable added.
+
+ * txr.1: Documented chr-isblank and chr-isunisp.
+
+ * genvim.txr: Add missing sysif.c.
+
+ * txr.vim: Regenerated.
+
+2014-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix gc safety issue in abs_path_p function.
+
+ * stream.c (ap_regex): New static variable.
+ (abs_path_p): Remove local reg variable; replace
+ uses of reg with ap_regex.
+ (stream_init): gc-protect ap_regex.
+
+2014-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (stream_init): No need to gc-protect
+ std_input, std_output, std_debug, std_error and std_null. These are
+ not ordinary variables but macros which expand to locations in the
+ variable binding environment that are already protected. This call was
+ actually doing nothing, because the symbol involved in the expression
+ std_input is not yet initialized and so &std_input yields a null
+ pointer which causes protect to bail.
+
+2014-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Moving system interface functions to separate module out of
+ the eval and stream modules.
+
+ * Makefile (OBJS): Add sysif.o.
+
+ * dep.mk: Regenerated.
+
+ * eval.c (errno_wrap, daemon_wrap, exit_wrap, usleep_wrap, getpid_wrap,
+ getppid_wrap, env_hash): Functions moved to sysif.c and changed
+ to static functions.
+ (eval_init): Registrations of functions moved to sysif.c.
+
+ * lib.c (init): Call sysif_init.
+
+ * stream.c (w_stat, statf, mkdir_wrap, chdir_wrap, getcwd_wrap,
+ makedev_wrap, minor_wrap, major_wrap, mknod_wrap): Functions
+ moved to sysif.c and become static functions.
+ (stream_init): Registration of stat moved to sysif.c.
+ (open_files, open_files_star): Bugfix: no longer erroneously included
+ in #ifdef HAVE_UNISTD_H block.
+
+ * stream.h (mkdir_wrap, chdir_wrap, getcwd_wrap, makedev_wrap,
+ minor_wrap, major_wrap, mknod_wrap, symlink_wrap, link_wrap,
+ readlink_wrap): Declarations removed.
+
+ * sysif.c: New file.
+
+ * sysif.h: New file.
+
+2014-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Add test case for recent breakage.
+
+ * tests/006/freeform-3.expected: New file.
+
+ * tests/006/freeform-3.txr: New file.
+
+ * tests/006/passwd: New file.
+
+ * Makefile (TXR_ARGS): Set up for new test case.
+
+2014-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix 2011-12-03 regression. The freeform directive code
+ relies on lazy_str_get_trailing_list and the behavior
+ of that function changed because (split-str "" any-separator)
+ changed from returning nil to returning the empty string.
+ The resulting behavior change of lazy_str_get_trailing_list was later
+ described in the documentation, thereby codifying it.
+
+ This patch changes the lazy_str_get_trailing_list behavior,
+ which is poor, and causes infinite looping. We do not want
+ an extra empty string prepended, because it looks like
+ a spurious line.
+
+ * lib.c (lazy_str_get_trailing_list): if split_str produces
+ a the list (""), then just return the unmaterialized list from
+ the lazy string without prepending that one-element list to it.
+
+ * txr.1: Updated documentation for lazy-str-get-trailing-list.
+
+2014-10-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 99.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+ * Makefile: Improve binary packaging rules.
+
+ * regex.c: #include <stdarg.h> added.
+
+2014-10-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Printing of regular expression objects implemented.
+
+ * regex.c (regex_print): New static function.
+ (regex_obj_ops): Registered regex_print. (print_class_char,
+ paren_print_rec, print_rec): New static functions.
+
+ * dep.mk: Regenerated.
+
+2014-10-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Keep regex source code in regex objects, in anticipation
+ of pretty-printing. Fix object construction bugs.
+
+ * regex.c (struct regex): New member, source.
+ (regex_mark): Ensure source is visited by garbage collector.
+ (regex_compile): Store regex_sexp in source.
+ Fix violations of section 3.2 of HACKING document.
+
+2014-10-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Eliminating the extra list wrapping applied to regular
+ expression objects in the syntax tree. The parser
+ just puts out a #<regex ...> instead of (#<regex ...> regex-syntax).
+
+ * eval.c (do_eval): We no longer need the hack of
+ treating (#<regex> ...) as a special form which
+ evaluates to #<regex>.
+ (expand): We no longer have to skip over regex syntax,
+ so the case is removed.
+
+ * match.c (h_var, do_txeval, do_match_line): regexp cases are no longer
+ subcases of consp but stand on their own. In do_match_line, we
+ introduce a COBJ case into the type switch for regexes.
+
+ * parser.y: regexes are now compiled in the regex and lisp_regex
+ grammar rules instead of the dependent rules, and are not wrapped in
+ extra syntax.
+
+2014-10-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_var): Fix regression introduced in 2014-08-11
+ commit. The incompleteness of that change broke the case of an unbound
+ variable followed by a bound variable. The value of the
+ second variable was still being wrapped in the old complicated
+ representation before being pushed to the front of the spec.
+
+ * txr.1: Replace bogus text which says that variables are not
+ bound to regexes, and so regex matches from variable substitutions
+ do not arise. This works fine after this change.
+
+2014-10-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: rules that rely on values from config.make
+ now have config.make as a prerequisite.
+
+2014-10-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Using unified COBJ representation for both regex kinds,
+ rather than the list-based notation for derivative-based
+ regexes, and an encapsulated COBJ for NFA-based regexes.
+
+ * lib.c (compiled_regex_s): Variable removed.
+ (obj_init): Initialization of compiled_regex_s removed.
+
+ * lib.h (compiled_regex_s): Declaration removed.
+
+ * regex.c (struct regex, regex_t): New type.
+ (regex_destroy): Object is now a regex_t, not nfa_t.
+ (regex_mark): New function.
+ (regex_obj_ops): Register regex_mark operation.
+ (reg_nullable, reg_derivative): Remove cases that handles
+ compiled_regex_s.
+ (regex_compile): Output of dv_compile_regex becomes
+ a cobj nwo. Output of nfa_compile_regex must be
+ embedded in regex_t structure.
+ (regexp): Drop the check for compiles_regex_s.
+ (regex_nfa): Function removed.
+ (regex_run, regex_machine_init): Use cobj_handle to retrieve regex_t *
+ pointer and dispatch appropriate code based on regex->kind.
+
+2014-09-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Add PayPal donation button.
+
+ * txr.1: Avoid escapes at the end of a line; man2html doesn't
+ handle this properly.
+
+2014-09-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: TXR is now bolded in the title.
+
+ * txr.1: More formatting and wording fixes.
+
+2014-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (do_and): Fix andf again: (andf) not producing
+ a function that returns t, as documented.
+
+2014-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 98.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+ * dep.mk, txr.vim: Regenerated.
+
+2014-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Substantially revised with rich troff markup,
+ and restructured in some places.
+
+ * genman.txr: No longer generate the whole document in
+ monospaced font. Add hyperlinks.
+
+2014-09-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (do_and, do_or): Fix broken andf and orf,
+ lacking the semantics of returning the last value,
+ or the first true value, respectively.
+
+2014-09-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (txr-manpage.pdf): New target.
+
+2014-09-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (compat_fixup): void return changed to int.
+ Returns minimum supported emulation.
+
+ * lib.h (compat_fixup): Declaration fixed.
+
+ * txr.c (compat): Replace hard-coded min version
+ by return value of compat_fixup.
+
+2014-09-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (help): List new --compat option.
+ (requires_arg, do_fixnum_opt, compat, array_dim, gc_delta): New static
+ functions.
+ (txr_main): Use do_fixnum_opt for handling options with integer
+ argument. Add --compat alias for -C.
+
+ * txr.1: Documented --compat. Added missing description of --debugger.
+
+2014-09-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): Cleaning up option handling code.
+ Better checking for misused long options.
+
+2014-09-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register intrinsic partition* function.
+
+ * lib.c (partition_star_func): New static function.
+ (partition_star): New function.
+
+ * lib.h (partition_star): Declared.
+
+ * txr.1: Documented partition*.
+
+2014-09-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register intrinsic partition function.
+
+ * lib.c (partition_func): New static function.
+ (partition): New function.
+
+ * lib.h (partition): Declared.
+
+ * txr.1: Documented partition.
+
+2014-09-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (help): Revised help text.
+
+2014-09-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (MALLOC_DELTA_THRESH): Macro remaned to DFL_MALLOC_DELTA_THRESH.
+ (opt_gc_delta): New global variable.
+ (make_obj): Use opt_gc_delta rather than MALLOC_DELTA_THRESH.
+ (gc_set_delta, gc_wrap): New static functions.
+ (gc_late_init): New function.
+
+ * gc.h (gc_late_init): Declared.
+
+ * genvim.txr: scan gc.c also.
+
+ * lib.c (init): call gc_late_init.
+
+ * txr.1: Document new --gc-delta option and the functions
+ gc and gc-set-delta.
+
+ * txr.c (help): Help text for --gc-delta.
+ (txr_main): Parse --gc-delta option.
+
+ * txr.h (opt_gc_delta): Declared.
+
+2014-09-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Make the garbage collector aware of malloced bytes, to
+ prevent skyrocketing memory use when the program manipulates
+ heap objects that have large amounts of malloc memory
+ attached, like very large bignums.
+
+ * gc.c (MALLOC_DELTA_THRESH): New preprocessor symbol.
+ (prev_malloc_bytes): New static variable.
+ (make_obj): when the value of malloc_bytes jumps by MALLOC_DELTA_THRESH
+ or more since the last gc, trigger gc.
+
+2014-09-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (symbol_setname): New static function.
+ (obj_init): Change exception symbol names with underscores
+ to use friendly dashes instead.
+ (compat_fixup): New function.
+
+ * lib.h (compat_fixup): Declared.
+
+ * txr.1: Change occurrences of exception symbols from
+ underscores to dashes.
+
+ * txr.c (txr_main): Call compat_fixup when -C option
+ is processed.
+
+2014-09-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Document -C option.
+
+ * txr.c (opt_compat): New global variable.
+ (help): Describe -C option.
+ (txr_main): Process -C, and set opt_compat.
+ Ensure -C does not clump.
+
+ * txr.h (opt_compat): Declared.
+
+2014-09-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Update registration of lisp-parse and read
+ to account for new parameter.
+
+ * lib.c (syntax_error_s): New symbol_variable.
+ (obj_init): New symbol variable initialized.
+
+ * lib.h (syntax_error_s): Declared.
+
+ * parser.h (lisp_parse): Declaration updated.
+
+ * parser.l (lisp_parse): Takes third parameter.
+
+ * txr.1: Third parameter of read described.
+
+ * txr.c (txr_main): Pass colon_k to third parameter of lisp_parse
+ to obtain exception throwing behavior.
+
+ * unwind.c (uw_init): Register syntax-error as subtype of error.
+
+2014-09-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (arith_init): Register some variables: *flo-dig*,
+ *flo-min*, *flo-max*, *flo-epsilon*, *pi* and *e*.
+
+ * genvim.txr: Include arith.c in scan for symbols.
+
+ * lib.c (init): arith_init() must now be called after eval_init().
+
+ * txr.1: Documented new variables..
+
+ * txr.vim: Updated.
+
+2014-08-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 97.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+ * dep.mk: Regenerated.
+
+2014-08-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_quasi): Regression: fix broken handling
+ of @{var mod} syntax triggering a bogus assertion. Mods are the third
+ element in the abstract syntax now, not fourth. There is no next link.
+ Removing bogus comment referring to a nonexistent function.
+
+2014-08-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_load): Fix regression introduced in 94: broken @(load).
+
+2014-08-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (top): Renamed to gc_prot_top, turned extern.
+ (prot1, rel1, mark): Follow rename.
+
+ * gc.h (gc_prot_top): Declared.
+
+ * signal.h (extended_jmp_buf): New member, gc_pt.
+ (extended_setjmp): Save and restore gc_prot_top.
+
+2014-08-25 Kaz Kylheku <kaz@kylheku.com>
+
+ GC correctness fixes: make sure we pin down objects for which we borrow
+ low level C pointers, while we execute code that can cons memory.
+
+ * lib.c (list_str): Protect the str argument.
+ (int_str): Likewise.
+
+ * regex.c (search_regex): protect the haystack string,
+ while using the h pointer to its data, since regex_run
+ can use the derivative-based engine which conses.
+
+ * stream.c (vformat_str): Protect str argument, since
+ put_char might conceivably cons.
+ (vformat): Protect fmtstr.
+
+2014-08-14 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 96.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+ * txr.vim: Regenerated.
+
+2014-08-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Uprooting stupidities in handling of output variables.
+
+ * parser.y (o_elems_transform): Remove useless function which
+ was only unwrapping the strange parse of output vars.
+ (o_elems_opt, rep_elem, quasilit, wordsqlit): Eliminate
+ o_elems_transform call.
+ (o_var, q_var): Eliminate the phrase structure rules which
+ match an extra o_elem or quasi_item, and which incorporate
+ them into the var syntax tree element. Place the modifiers
+ into the third position, not fourth.
+
+ * eval.c (subst_vars): Eliminate handling of "pat"
+ element. Actually that was not even there thanks to
+ o_elems_transform being applied: dead code. Pull modifiers
+ from the third element of the var form now, not fourth.
+
+ * match.c (subst_vars): Similar changes as in the match.c
+ subst_vars function. Here the pat variable is even more obviously
+ useless; if it is not nil, it is just punted back to the spec.
+
+2014-08-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix regression in previous change: we must match a compound text
+ element whole, and not break it up.
+
+ * match.c (search_match): Take a spec argument.
+ (h_var): Turn a text element into a one-element spec and process
+ with search_match.
+
+ * txr.1: Updated text about matching of variables
+ followed by a directive or function, and about consecutive
+ variables via directive.
+
+2014-08-12 Kaz Kylheku <kaz@kylheku.com>
+
+ When a variable is delimited by some form other than
+ the contents of a variable, fixed string or regex, we now
+ use the entire tail of the specline to find the match.
+ So for instance @var@(trailer)foo works as intuition
+ might expect.
+
+ * match.c (search_form): Static function removed.
+ (search_match): New static function based on search_form.
+ Does not handle regexes, and does not update c->bindings.
+ (h_var): Renamed local variable pat to next. Added a few
+ missing rlcp's. Combined the cases when pat is a cons to
+ one block so consp isn't repeatedly tested. Function now
+ handles a var followed by (sys:text ...) elements specially;
+ the first element of the text block is pulled out and
+ matched. Implemented "var delimiting spec" general case
+ which matches the entire tail of the spec at successive
+ character positions until a match is found, and the skipped
+ text goes into the variable.
+
+2014-08-11 Kaz Kylheku <kaz@kylheku.com>
+
+ First cut at restructuring how variable matching works in the pattern
+ language. The goal is to remove the strict behavior of using only one
+ element of context after a variable.
+ variable form at parse time: we unravel that first.
+
+ * parser.y (grammar): Simplifying the phrase structure
+ rule for the var element. All the variants that have
+ a trailing elem are removed. The abstract syntax
+ changes; the modifier moves to the third position in the
+ list.
+
+ * match.c (h_var): Matching change: the element which follows
+ a variable is now pulled from the specline rather than the variable
+ syntax, which is how it should have been done in the first place. The
+ modifiers are pulled from a different spot in the variable syntax.
+
+2014-08-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c (filter_init): Expose the trie-lookup-begin,
+ trie-value-at and trie-lookup-feed-char functions as intrinsics.
+
+ * txr.1: Document exposed functions.
+
+2014-08-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: ret operator does not generate functions
+ that take any number of arguments.
+
+ * eval.c (me_ret): Generate (op identity (progn @rest <expr>))
+ rather than of (op identity <expr>).
+
+ * txr.1: Update misleading equivalence.
+
+2014-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 95.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+2014-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ No getppid on MinGW.
+
+ * configure: Add test for getppid.
+
+ * eval.c (getppid_wrap, eval_init): use HAVE_GETPPID
+
+2014-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (yyerr): Function removed; it is not used in the lexer,
+ and converted to a macro in the parser.
+
+ * parser.y (define_transform): take a parser argument rather
+ than scanner. Set up scnr local variable for yyerr macro.
+ Remove scnr argument from macro calls.
+ (yyerr): New macro.
+ (grammar): Remove scnr argument from yyerr calls.
+
+2014-08-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Reentrant parser regression
+
+ * parser.y (yybadtok): New macro.
+ (yybadtoken): Function must take parser argument.
+ (grammar): Replace uses of yybadtoken with yybadtok.
+
+ * parser.h (yybadtoken): Declaration updated.
+
+ * parser.l (grammar): Fix incorrect yyprepf calls
+ that are missing the yyscanner parameter.
+
+2014-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 94.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+ * txr.vim, dep.mk: Updated.
+
+2014-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (make_random_state): Make the seeding behavior
+ portable when the seed is a fixnum or bignum. The goal is that the same
+ values of seed should produce the same random sequences on any
+ platform.
+
+2014-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Fix incorrect registration of
+ random-fixnum, which doesn't allow it to be called
+ with no arguments.
+
+2014-08-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Back port from Berkeley Yacc to GNU Bison.
+ We need a prototype of yylex that is in scope of the grammar,
+ but YYSTYPE is not defined there.
+
+ * parser.l: Bison 3 declares yyparse in y.tab.h, so we have to
+ reorder some #includes.
+
+2014-08-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Big switch to reentrant lexing and parsing.
+
+ * parser.l (YY_INPUT): Stop relying on removed yyin_stream;
+ refer to stream via yyextra.
+ (yyin_stream, lineno, errors, spec_file_str,
+ prepared_error_message): Global variables removed.
+ (yyget_column, yyset_column): Missing prototypes not generated by flex
+ in bison bridge mode have to be added by us to avoid
+ warning.
+ (yyerror): Takes parser and scanner as parameters. Prepared error
+ message is now in the parser context. Calls to other error handling
+ functions receive scanner context.
+ (yyerr): New function.
+ (yyerrorf, yyerrprepf): Takes scanner argument, chases extra data to
+ get to parser, and refers to parser variables instead of globals.
+ (num_esc): Scanner argument added.
+ (%option reentrant, %option bison-bridge, %option extra-type): New
+ flex options.
+ (grammar): yyscanner added everywhere.
+ (end_of_char): Takes scanner argument.
+ (parse_init): Removed references to yyin_stream and
+ prepared_error_message.
+ (parse_reset): Function renamed to open_txr_file. Returns
+ results via pointers instead of setting global variables.
+ (regex_parse, lisp_parse): Use reentrant parser interface.
+
+ * parser.y (yyerror): Prototype removed.
+ (yylex): Prototype moved after grammar, with new arguments.
+ (sym_helper, define_transform): Take scanner argument.
+ (make_expr): Takes parser argument.
+ (rlrec): New static function.
+ (rl): Function turned into macro.
+ (mkexp, symhlpr): New macros.
+ (%purse-parser, %parse-param, %lex-param): New Yacc options.
+ (grammar): Actions re-worked for reentrance. Parser and scanner
+ contexts are passed down to helper functions, in some cases
+ via the three new macros. The result of the parse is stored
+ in the syntax_tree member of the parser_t structure instead
+ of a global. The yylex function receives the scanner instance.
+ (get_spec): Function removed.
+ (parse): New function.
+
+ * parser.h (lineno, errors, yyin_stream, spec_file_str):
+ Declarations removed.
+ (parser_t): New struct.
+ (yyerr): New function declared.
+ (yyparse, yyerror, yyerrorf, end_of_regex, end_of_char,
+ yylex, yylex_destroy): Declarations updated.
+ (yylex_init, yyget_extra, yyset_extra): Declared.
+ (parse_reset, rl): Declaration removed.
+ (open_txr_file): Declaration added.
+ (parse): New function.
+
+ * match.c (v_load): Use new reentrant parser interface.
+
+ * txr.c (txr_main): Stop using parser-related global variables;
+ call parser using new reentrant interface.
+
+2014-08-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.c (interrupt_count): New global variable.
+ (sig_handler): Increment and decrement interrupt count.
+ If the interrupt count is already positive, treat
+ that as if async signals were not enabled: do not
+ invoke handlers.
+
+2014-08-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (have_sys_time): New variable.
+ Added check for setitimer/getitimer which also
+ checks for <sys/time.h>.
+
+ * signal.c (sig_init): Register itimer-real, itimer-virtual,
+ itimer-prof variables and getitimer and setitimer functions.
+ (tv_to_usec): New static function.
+ (getitimer_wrap, setitimer_wrap): New functions.
+
+ * signal.h (getitimer_wrap, setitimer_wrap): Declared.
+
+ * txr.1: Documented itimers.
+
+2014-08-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.c (set_sig_handler): Don't use SA_ONSTACK
+ except for signals for which we use alt stack.
+
+ * signal.h (sig_save_enable): Do sig_check before
+ enabling async signals. This caused the !async_sig_enabled assertion
+ to trip inside make_obj.
+
+2014-08-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.c (sig_hup, sig_int, sig_quit, sig_ill, sig_trap, sig_abrt,
+ sig_bus, sig_fpe, sig_kill, sig_usr1, sig_segv, sig_usr2, sig_pipe,
+ sig_alrm, sig_term, sig_chld, sig_cont, sig_stop, sig_tstp, sig_ttin,
+ sig_ttou, sig_urg, sig_xcpu, sig_xfsz, sigtalrm, sig_prof, sig_poll,
+ sig_sys, sig_winch, sig_iot, sig_stkflt, sig_io, sig_lost, sig_pwr):
+ Remove unused global variables variables.
+
+ * signal.h: Remove declarations thereof.
+
+2014-07-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (getpid_wrap, getppid_wrap): New static functions.
+ (eval_init): Registered getpid and getppid intrinsics.
+
+ * signal.c (kill_wrap): New static function.
+ (sig-init): Registered kill intrinsic function.
+
+ * txr.1: Documented getpid, gettpid and kill.
+
+2014-07-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Allow unquotes and splices in QSPECIAL and BRACED states.
+
+ * parser.y (quasi_item): Support splices as items.
+
+ * genvim.txr: Syntax highlighting support for unquotes in
+ quasiliterals.
+
+ * txr.vim: Updated.
+
+2014-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register uniq function.
+
+ * lib.c (uniq): New function.
+
+ * lib.h (uniq): Declared.
+
+ * txr.1: Documented uniq.
+
+2014-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (repeatv): Renamed to repeat. Turned into function
+ with one optional argument, reflecting existing behavior.
+ (eval_init): Registration of repeat updated.
+
+ * txr.1: Fixed incorrect documentation which falsely suggests
+ that repeat takes multiple lists, and doesn't mention
+ the optional count.
+
+2014-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus, minus, mul): Fix missing breaks
+ to switch statements, leading to strange error
+ messages when wrong types are passed in.
+
+2014-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register nconc as intrinsic.
+
+ * lib.c (nconcv): New function.
+
+ * lib.h (nconcv): Declared.
+
+ * txr.1: Documented nconc.
+
+2014-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (reduce_left, reduce_right): Nullify incoming sequence
+ argument so empty vectors and strings can be processed.
+
+2014-07-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (giterate_func, giterate): Adjusting semantics of giterate to
+ include seed item in the sequence. The while test is applied to
+ each item before it is passed through the function. Also,
+ eliminated useless rplacd operation.
+
+ * txr.1: Updated documentation of giterate.
+
+2014-07-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register partition-by intrinsic.
+
+ * lib.c (partition_by_func): New static function.
+ (partition_by): New function.
+
+ * lib.h (partition_by): Declared.
+
+ * txr.1: Documented partition-by.
+
+2014-07-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (rising_product): Fix wrong m == n case,
+ which breaks the n_perm_k function for k == 1.
+
+ * txr.1: Fix typo: n-choose-k written in place of n-perm-k.
+
+2014-07-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix 2014-02-05 safety regression: unchecked use of non-function objects
+ in some contexts that require functions.
+
+ * lib.c (funcall, funcall1, funcall2, funcall3, funcall4):
+ check type(fun) before dereferencing to see whether there
+ are optional args.
+
+2014-07-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (giterate_func, giterate): New static functions.
+ (eval_init): Registered giterate as intrinsic.
+
+ * txr.1: Documented giterate.
+
+2014-07-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * unwind.h (uw_block_begin): Get rid of the unused typedef trick,
+ replace with do { } while (0), since we don't have any instances of a
+ uw_block_begin followed by declarations.
+ (uw_catch_begin): Move SYMVAR and EXCVAR inside the do/while block,
+ so that the expansion doesn't begin with a declaration.
+
+2014-07-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile, arith.c, arith.h, combi.c, combi.h, configure, debug.c,
+ debug.h, eval.c, eval.h, filter.c, filter.h, gc.c, gc.h, hash.c,
+ hash.h, lib.c, lib.h, match.c, match.h, parser.h, parser.l, parser.y,
+ rand.c, rand.h, regex.c, regex.h, signal.c, signal.h, stream.c,
+ stream.h, syslog.c, syslog.h, txr.c, txr.h, unwind.c, unwind.h,
+ utf8.c, utf8.h: Synchronize license header with LICENSE.
+
+2014-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (subst_vars): Bugfix: I neglected to apply the
+ filter which is in effect to the result of interpolating a TXR Lisp
+ expression, oops!
+
+2014-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (METANUM): Forgotten %right declaration for this
+ token has been resulting in a shift-reduce conflict.
+
+2014-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Add a check, in the case that we cannot make an
+ executable, whether this is due to being required to use C99.
+ For instance, the Solaris environment requires compilation
+ using the C99 dialect if _XOPEN_SOURCE is set to 600 or higher.
+
+ * debug.c: When compiling as C99, we have to obey the special
+ C99 conventions for instantiating inline functions.
+
+ * hash.c: Likewise.
+
+ * lib.c: Likewise.
+
+ * parser.y: Likewise.
+
+ * unwind.c: Likewise.
+
+2014-07-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+ * arith.c (log2): Change to static.
+
+2014-07-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (me_case): Fix quoting issue in expansion.
+
+2014-07-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.c (set_sig_handler): Set up and tear down alternate
+ stack for SIGBUS also, not only for SIGSEGV. On Linux,
+ when stack growth collides with another memory mapping,
+ it triggers a SIGBUS not SIGSEGV, which occurs when the
+ process limit on stack size is exceeded. In either
+ situation, we need an alternative stack.
+
+2014-07-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (caseq_s, caseql_s, casequal_s, memq_s, memql_s, memqual_s,
+ eq_s, eql_s, equal_s): New symbol variables.
+ (me_case): New static function.
+ (eval_init): Initialize new variables. Register caseq, caseql and
+ casequal macros.
+ Re-register memq, memql, memqual, eq, eql and equal using
+ new symbol variables.
+
+ * txr.1: Document case, caseql and casequal.
+
+2014-07-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register juxt as intrinsic.
+
+ * lib.c (do_juxt): New static function.
+ (juxtv): New function.
+
+ * lib.h (juxtv): Declared.
+
+ * txr.1: Documented juxt.
+
+2014-07-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (divi): Support one-argument form.
+ Use "/" name in error reporting, not "divi".
+
+ * eval.c (eval_init): Change registration of / so only
+ one argument is required out of two.
+
+ * txr.1: Document one-argument division.
+
+2014-07-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Fixed highlighting issues in numbers followed by newline.
+
+ * txr.vim: Regenerated.
+
+2014-07-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (search_str): Support negative starting index.
+ Hoist uselessly repeated c_str operation out of loop.
+
+ * txr.1: Document negative starting index for search-str.
+
+2014-07-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_construct): Nullify the pairs argument so that
+ it works correctly with an empty vector.
+
+ * txr.1: Write missing documentation for hash-construct.
+
+2014-07-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (mapdov): New function.
+ (eval_init): Register mapdo intrinsic.
+
+ * lib.c (mapdo): New function.
+
+ * lib.h (mapdo): Declared.
+
+ * txr.1: Documented mapdo. Documented zero-argument case
+ for mapcar, mapcar*, mappend and mappend*.
+
+2014-07-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (put_strings, put_lines): New functions.
+ (stream_init): Registered new functions as intrinsics.
+
+ * stream.h (put_strings, put_lines): Declared.
+
+ * txr.1: Documented.
+
+2014-07-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register get-lines as a synonym for lazy-stream-cons.
+
+ * stream.c (get_string): New function.
+
+ * stream.h (get_string): Declared.
+ (stream_init): get_string registered as get-string intrinsic.
+
+ * txr.1: Documented get-string, and get-lines as a synonym for
+ lazy-stream-cons. Documented the behavioral difference of
+ lazy-stream-cons lazy lists for real-time and non-real-time streams.
+
+2014-07-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (conftest, conftest2): Link math
+ library so we can test for math functions.
+
+ * arith.c (log2_init): New static function.
+ (log2, logtwo): New functions.
+ (l2): New static variable.
+ (arith_init): Call log2_init.
+
+ * configure (lang_flags): Switching _XOPEN_SOURCE
+ from 500 to 600 to reveal log2.
+ Adding test for log2.
+
+ * eval.c (eval_init): Register log2 intrinsic.
+
+ * lib.h (logtwo): Declared.
+
+ * txr.1: Documented log2.
+
+2014-07-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_do, v_require): Set up and tear down environment frame,
+ like other situations that evaluate TXR Lisp from the pattern language.
+ Otherwise obscure things will go wrong.
+ (h_do): Same as above, and additionally, add the forgotten
+ call to install the bindings into the match context.
+
+2014-07-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_eol): Fix broken horizontal @(eol).
+ It should be returning next_spec_k, rather
+ than bindings, which indicate a complete match.
+
+2014-07-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/001/query-1.txr: Remove bogus public domain header.
+
+ * tests/001/query-2.txr: Likewise.
+
+ * tests/001/query-3.txr: Likewise.
+
+ * tests/001/query-4.txr: Likewise.
+
+ * tests/002/query-1.txr: Likewise.
+
+2014-07-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix old, known syntax highlighting problems between symbols,
+ integers and floating literals.
+
+ * genvin.txr (txr_num): The general solution is to over-match
+ a number by one character: a non-token constituent, and then
+ subtract that from the highlight region using me=e-1.
+ This solves the prefix ambiguities between numbers and symbols.
+ (txr_badnum): New match: matches floating literals with trailing
+ junk, which are highlighted as errors.
+ (txr_directive, txr_list, txr_bracket, txr_mlist, txr_mbracket):
+ All of these contain a txr_badnum.
+
+ * txr.vim: Regenerated.
+
+2014-07-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix broken regex highlighting.
+
+ * genvim.txr (txl_regex): Missing syntactic region added.
+ (txr_regex): Start pattern is just a slash; no optional # in front.
+
+ * txr.vim: Regenerated.
+
+2014-07-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): Allow Lisp code executed via -e and -p options to
+ see the bindings set up by prior -D options.
+
+2014-07-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register interpose and lconsp as intrinsics.
+
+ * lib.c (lconsp, interpose): New functions.
+ (lazy_interpose_func, lazy_interpose): New static functions.
+
+ * lib.h (lconsp, interpose): Declared.
+
+ * txr.1: Documented lconsp and interpose.
+
+2014-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 92.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * share/txr/stdlib/ver.txr: Likewise
+
+2014-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/011/macros-2.txr: Added test for labels shadowing macro,
+ and let shadowing symacro.
+
+ * tests/011/macros-2.expected: Regenerated
+
+ * txr.vim: Regenerated.
+
+2014-07-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing local function binding constructs.
+
+ * eval.c (fbind_s, lbind_s, flet_s, labels_s): New symbol globals.
+ (env_fb_to_fb): New static function.
+ (lookup_mac): Implement the same shadow check for function macros
+ that is done for symbol macros, because we now have local functions
+ that can shadow local macros.
+ (fbindings_helper, op_fbind, make_fun_shadowing_env,
+ expand_fbind_vars, me_flet_labels): New static functions.
+ (expand): Add cases for fbind and lbind.
+ (eval_init): Intern the four new symbols.
+ Register sys:fbind and sys:lbind operators.
+ Register flet and labels macros.
+
+ * txr.1: Documented flet and labels.
+
+2014-07-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bindings_helper): New parameter to indicate that
+ the caller needs the return value, so the function
+ can avoid consing up a list that will be thrown away.
+ (op_let): Pass nil argument to new parameter of bindings_helper.
+ (op_each, op_for): Pass t to indicate that the return value
+ is needed.
+
+2014-07-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * LICENSE: Adding copyright for MPI Library.
+
+ * METALICENSE: Adding notes about MPI.
+
+2014-07-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: install the LICENSE and METALICENSE files into the data
+ directory.
+
+ * txr.c (help): Help text updated to document --license option.
+ (license): New function.
+ (txr_main): Implement --license option.
+
+ * unwind.h (uw_catch): Add cast to suppress warning about unused symbol.
+
+ * txr.1: Document --license option.
+
+2014-07-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (replace_list, sel): fix use of unused variable.
+
+2014-07-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * LICENSE: Small wording change. Add pointer to METALICENSE.
+
+ * METALICENSE: New file.
+
+2014-07-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * LICENSE: Switching to simplified two-clause BSD license,
+ but with modifications. Adding back the no-liability
+ part of the disclaimer, but with abbreviated text.
+ Also, rewriting the initial paragraph to make it clear
+ that the two conditions cover redistribution, and that
+ use of the software is tantamount to agreeing with the
+ disclaimer.
+
+2014-07-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Spell check.
+
+2014-07-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Corrections from Roman Mishin
+
+2014-07-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (apf_s, ipf_s): New symbol variables.
+ (me_ap, me_ip): Generate a much simpler macro-expansion:
+ a call to apf or ipf, rather than lambda syntax.
+ (me_ado, me_ido): New static functions.
+ (eval_init): Initialize apf_s and ipf_s variables.
+ Use them in the registration calls for apf and ipf.
+ Register ado and ido macros.
+
+ * txr.1: Streamlined documentation for ap and ip,
+ and added ado and ido.
+
+2014-07-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (apf, ipf): Bugfix: do_apf and do_ipf
+ should be registered as variadic functions.
+
+2014-07-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 91.
+
+ * RELNOTES: Updated.
+
+ * configure, txr.1: Bumped version.
+
+ * dep.mk, txr.vim: Regenerated.
+
+2014-07-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: use $(EXE) in install: recipe.
+
+ * configure: set up EXE variable in config.make, not exe.
+
+2014-07-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented usleep.
+
+2014-07-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc): Support indexing using a list of positions,
+ such as obtained by the where function.
+
+ * lib.c (replace_list, replace_str, replace_vec): Allow the
+ from argument to be a list of index positions, possibly empty.
+
+ * txr.1: Condensed syntactic descriptions under dwim operator.
+ Range Indexing section no longer says that the value nil
+ can be used as either endpoint of a range. This will not
+ work any longer since a "from" value of nil looks like an
+ empty list of indexes. Documented new behavior under
+ replace, and shortened documentation for replace-list,
+ replace-str and replace-vec.
+
+2014-06-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (sel): Bugfix: not implemented correctly for sequences
+ which are lists.
+
+2014-06-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (bit): New function.
+
+ * eval.c (eval_init): Register bit as intrinsic.
+
+ * lib.h (bit): Declared.
+
+ * mpi-patches/add-bitops (mp_bit): New function.
+
+ * txr.1: Documented bit
+
+2014-06-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/add-bitops (mp_and, mp_or, mp_xor, mp_shift): Plug memory
+ leaks caused by wrongly initializing the temporary destination operand
+ for mp2_comp with a size, which mp2_comp then clobbers by doing the same
+ thing. Also plug memory leaks that happen in in out-of-memory return
+ case.
+
+2014-06-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (where, sel): Extend into hashes.
+
+ * txr.1: document hash support for select and where.
+
+2014-06-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: apply_intrinsic and iapply must not destructively
+ manipulate argument lists.
+
+ * eval.c (apply_frob_args): Rewrite to non-destructive
+ one-pass version.
+ (iapply): Likewise.
+
+ * lib.c (term): New function.
+
+ * lib.h (term): Declared.
+
+2014-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixes to bignum bit operations affecting pretty much all bit operations
+ when bit field operands are negative, affecting logand, logor, logxor,
+ lognot, logtrunc, logtest and ash. In addition, logtest was found to
+ return the logical inverse of its correct value.
+
+ * arith.c (logtest): Fix broken boolean polarity
+ of return value.
+
+ * mpi-patches/add-bitops (mp_2comp): Fix incorrect
+ treatment of negative values.
+ (mp_and): Fix incorrectly ordered statements, which
+ cause failure when operands are negative.
+
+2014-06-26 kaz kylheku <kaz@kylheku.com>
+
+ * eval.c (iapply_s): new global variable.
+ (iapply, me_ip): new static functions.
+ (do_apf): Bugfix: use apply_intrinsic, not apply.
+ (do_ipf, ipf): New static functions.
+ (eval_init): initialize iapply_s. register me_ip macro
+ expander, and the iapply and ipf functions.
+
+ * txr.1: Documented iapply, ipf and ip.
+
+2014-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (last): Bugfix: reversed null test.
+
+2014-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): register range_regex and tok_where
+ as intrinsics.
+
+ * lib.c (tok_where): New function.
+
+ * lib.h (tok_where): Declared.
+
+ * regex.c (range_regex): New function.
+
+ * regex.h (range_regex): Declared.
+
+ * txr.1: Documented tok-where and range-regex.
+
+2014-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (search): Bugfix in type mismatch error message:
+ trying to print cons function pointer as value.
+
+2014-06-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (mapcarv): Use mapcar_listout, so list_of_lists can be
+ a non-list sequence.
+ (eval_init): Register transpose and zip as intrinsics.
+
+ * lib.c (curry_12_1_v): New static function.
+ (transpose, mapcar_listout): New functions.
+ (mapcar): Redefined in terms of mapcar_listout.
+
+ * lib.h (transpose, mapcar_listout): Declared.
+
+ * txr.1: Documented transpose and zip.
+
+2014-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: macros not being expanded in expansions embedded in
+ quasilierals: i.e. the forms X and Y in `@{X}`
+ and `@{X Y}`, where X and Y can be Lisp symbol macros or compound
+ forms that is a macro call.
+
+ * eval.c (expand_quasi): Handle the var forms in a quasi.
+
+ * parser.y (n_exprs_opt, q_var): New grammar nonterminals.
+ q_var is a clone of o_var, but with different construction behavior.
+ It fixes the bug that o_var applies expand_meta to embedded
+ Lisp forms, which is not appropriate for TXR Lisp quasiliterals.
+ (quasi_item): Derive q_var rather than o_var.
+
+2014-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Optimization: add missing tail updates to some list
+ collecting loops.
+
+ * lib.c (tuples_func, where, sel): Catch return value of
+ list_collect and update tail variable.
+
+ * match.c (do_txeval): Likewise.
+
+ * parser.y (expand_meta): Likewise for list_collect_nconc.
+
+2014-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (do_apf, apf): New functions.
+ (eval_init): Register apf as intrinsic.
+
+ * txr.1: Document apf.
+
+2014-06-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Improve error reporting.
+
+ * eval.c (eval_error): Use last_form_evaled if form is null.
+ (apply): Substitute apply symbol if ctx_form is null.
+ (apply_intrinsic): Do not pass fake (apply) context form to
+ apply, just pass nil.
+
+2014-06-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (identity_s): New global variable.
+ (me_ret, tf, nilf, do_retf, retf): New static functions.
+ (eval_init): Initialize identity_s, and use it for registration
+ of identity. Register ret macro, and the retf, tf and nilf
+ functions.
+
+ * txr.1: Documentation for ret, retf, tf and nilf.
+
+2014-06-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: dwim operator contradicts the documentation
+ and intended design.
+
+ * eval.c (do_eval): When calling do_eval_args to evaluate
+ the arguments of a compound form that is a function call,
+ do not pass down the lookup function, but substitute &lookup_var.
+ Passing down the lookup function means tha all evaluation
+ enclosed in (dwim ...) or [...] follows the Lisp-1 style.
+
+2014-06-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (me_ap): New static function.
+ (eval_init): Use new list_f instead of func_n0v(identity).
+ Register multi as intrinsic. Register me_ap as ap macro.
+
+ * lib.c (list_f): New global variable.
+ (multi): New function.
+ (multi_sort): Use list_f in place of func_n0v(identity).
+ (obj_init): gc-protect and initialize list_f.
+
+ * lib.h (list_f, multi): Declared.
+
+ * txr.1: Documented multi and ap.
+
+2014-06-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register member and member_if as intrinsics.
+
+ * lib.c (member, member_if): New functions.
+
+ * lib.h (member, member_if): Declared.
+
+ * txr.1: Documented.
+
+ * txr.vim: Regenerated.
+
+2014-06-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (generic_funcall): Bugfixes: support symbols.
+ Removed dubious statement which clamps nargs to the number
+ of fixed parameters, breaking variadic calls.
+ Test case: (mapcar 'list '(1 2)) -> ((1) (2))
+ Note: generic_funcall is only used when non-function objects
+ are used as functions; variadic funcalls were not broken.
+
+2014-06-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (generic_funcall): Bugfixes: support symbols.
+ Removed dubious statement which clamps nargs to the number
+ of fixed parameters, breaking variadic calls.
+ Test case: (mapcar 'list '(1 2)) -> ((1) (2))
+
+2014-06-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Fix broken examples for some and none functions.
+
+2014-06-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (not_null): New static function.
+ (eval_init): Use null_f in existing registration of null
+ and not. Add registration for not_null as "true",
+ and for null_f as "false".
+
+ * txr.1: Documented true and false.
+
+2014-06-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): register tuples as intrinsic.
+
+ * lib.c (tuples_func): New static function.
+ (tuples): New function.
+
+ * lib.h (tuples): Declared.
+
+ * txr.1: Documented.
+
+2014-06-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_print): Render character DC00 as "pnul".
+ Clean up code which chooses rendering for characters.
+ Print C0 and C1 control characters, as well as D800-DFFF,
+ FFFE and FFFF and characters above FFFF using hex;
+ others are printed using the #\<char> notation.
+
+ * parser.y (char_from_name): map "pnul" to DC00.
+
+ * txr.1: Documented pnul, clarified character
+ printing rules, and added a cautionary note about
+ possible ambiguity in printing.
+
+2014-06-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register pos_max, pos_min, find_max,
+ find_min and seqp as intrinsics.
+
+ * lib.c (gt_f, lt_f): New variables.
+ (to_seq): renamed to toseq.
+ (seqp): New function.
+ (minmax): New static function.
+ (replace_str, replace_vec): Follow to_seq renaming.
+ (find_max, find_min, pos_max, pos_min): New functions.
+ (obj_init): gc-protect and initialize gt_f and lt_f.
+
+
+ * lib.h (gt_f, lt_f): Declared.
+ (to_seq): Declaration updated to toseq.
+ (seqp, find_max, find_min, pos_max, pos_min): Declared.
+
+ * txr.1: Updated.
+
+2014-06-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): where and sel registered as intrinsics
+ where and select.
+
+ * lib.c (generic_funcall): Support a sequence as an argument
+ to a sequence.
+ (where, sel): New functions.
+
+ * lib.h (where, sel): Declared.
+
+ * txr.1: Documented.
+
+2014-06-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: range and range* broken when "to" argument is
+ omitted. This was broken in version 89, by the
+ 2014-04-08 commit.
+
+ * eval.c (rangev_func, range_star_v_func): Only perform
+ numeric tests between from and to if to is not nil.
+
+2014-06-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: Install share/txr/stdlib/*.txr material.
+
+ * match.c (do_txeval): If a variable is not in the bindings, fall
+ back on treating it as a TXR Lisp dynamic variable. This allows
+ us to refer to the stdlib variable from a quasistring in a
+ @(load ...) directive.
+
+ * txr.c (sysroot_init): Register new variable, *txr-version*.
+
+ * share/txr/stdlib/ver.txr: New file.
+
+2014-06-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_load): use the abs_path_p function instead of
+ checking for leading slash.
+
+ * stream.c (abs_path_p): New function.
+ (stream_init): Register abs_path_p as abs-path-p.
+
+ * stream.h (abs_path_p): Declared.
+
+ * txr.1: Documented abs-path-p.
+
+ * dep.mk: Updated.
+
+2014-06-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 90
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped.
+
+ * txr.spec: Bumped version.
+
+ * txr.vim, dep.mk: Regenerated.
+
+ * RELNOTES: Updated
+
+2014-06-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (txr.o): Pass TXR_VER preprocessor symbol on gcc command
+ line.
+ (PREINSTALL): New variable holding a step for the install recipe.
+ (pax tar zip): New targets.
+
+ * configure (txr_ver): Version now added to config.make, passed
+ through to txr.c.
+ (gen_config_make): bindir, datadir and mandir are established
+ using gmake's regular macro assignment (=) rather than
+ expanding assignment (:=). This allows us to override the
+ prefix variable after configure time.
+
+ * lib.h (wli_noex): New macro.
+ (wli): Retarget to wli_noex, so that argument is subject
+ to macro replacement.
+
+ * txr.c (version): Use TXR_VER defined on compiler command line,
+ rather than hard-coded string literal.
+
+2014-06-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Change registration of string_cmp
+ to cmp_str. Add registrations for str_eq, str_lt,
+ str_gt, str_le, and str_lt.
+
+ * lib.c (string_cmp): Name changes to cmp_str, and the
+ function fixed so that it actually works.
+ The name change doesn't affect anyone because the function
+ was too broken to use due to the incorrect type dispatch.
+ (string_lt): Name changes to str_lt.
+ (str_eq, str_gt, str_le, str_ge): New functions.
+
+ * lib.h (string_cmp, string_lt): Declarations renamed.
+ (str_eq, str_gt, str_le, str_ge): New declarations.
+
+ * txr.1: Document string-cmp to cmp-str rename, that
+ string-lt is deprecated, and the new str<, str>,
+ str>=, str<= and str= functions.
+
+2014-06-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (PROG): Removing ./ prefix from variable name; adding it
+ to invocations of $(PROG) in some rules.
+ (txr.o): Pass several strings as macros on the command line:
+ TXR_REL_PATH, EXE_SUFF and PROG_NAME.
+
+ * configure (bindir, datadir, mandir): These variables become
+ just relative paths from the prefix.
+
+ * txr.c (sysroot): Use the TXR_REL_PATH, EXE_SUFF and PROG_NAME
+ preprocessor symbols defined on the command line to avoid
+ hard-coding strings like "bin/txr" and "bin/txr.exe" which
+ actually should reflect the value of the bindir variable.
+
+2014-06-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (get_self_path): Fix spelling of GetModuleFileName.
+ Add missing parentheses in expression.
+ (sysroot_init): On Windows, filter progpath to change
+ backslashes to forward slashes.
+
+2014-06-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (yylex_destroy): The FLEX_ version are prefixed with YY_
+ in old flexes too.
+
+2014-06-09 Kaz Kylheku <kaz@kylheku.com>
+
+ New variable stdlib, with a sysroot mechanism to compute
+ the path based on the "sysroot" where it is actually installed.
+
+ * txr.c (progname_8u, progpath): New static variables.
+ (get_self_path, sysroot_helper, sysroot, sysroot_init): New
+ static functions. Sysroot creates a stdlib variable.
+ (main): Initialize progname_u8 value, and call sysroot_init.
+
+2014-06-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (match_str): Extended to suffix testing, with a negative
+ start argument.
+
+ * txr.1: Documented.
+
+2014-06-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: fix broken tests; numerous test cases output
+ bindings, and need the -B option. One test case does not
+ need the -l option which now implies -B.
+
+2014-06-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): New option --args.
+ Also, put in missing check for -f being erroneously clumped.
+
+ * txr.1: Documented.
+
+2014-06-09 Kaz Kylheku <kaz@kylheku.com>
+
+ The dumping of bindings and printing of false must now
+ be explicitly requested by the -B option.
+
+ * match.c (opt_nobindings): Variable removed.
+ (opt_print_bindings): New variable.
+ (extract): Print bindings or "false" if opt_print_bindings is true.
+
+ * stream.c (output_produced): Variable removed.
+ (stdio_put_string, stdio_put_char, stdio_put_byte): Remove
+ update of output_produced.
+
+ * stream.h (output_produced): Declaration removed.
+
+ * txr.1: Documentation updated.
+
+ * txr.c (txr_main): Option 'b' does nothing. 'B', 'l', 'a',
+ and '--lisp-bindings' set opt_print_bindings to 1.
+
+ * txr.h (opt_nobindings): Declaration removed.
+ (opt_print_bindings): Declared.
+
+ * unwind.c (uw_throw): When exiting due to a query error or
+ file error, print false when opt_print_bindings is true.
+
+2014-06-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing issue with list-like iteration over generic sequences,
+ namely that empty strings and vectors are not nil.
+ The nullify function is introduced. It is also exposed to
+ users, as is the existing make_like function.
+
+ * eval.c (mapcarv, mappendv, lazy_mapcar, lazy_mapcarv):
+ Use nullify to handle non-list inputs correctly.
+ (eval_init): Registering make_like and nullify as intrinsics.
+
+ * lib.c (copy_list, to_seq, list_collect_nconc, list_collect_append,
+ reverse, lazy_appendv_func, lazy_appendv, ldiff, memq, memql,
+ memqual, remq, remql, remqual, remove_if, keep_if, rem_lazy_rec,
+ remq_lazy, remql_lazy, remqual_lazy, remove_if_lazy, keep_if_lazy,
+ countqual, countql, countq, count_if, some_satisfy, all_satisfy,
+ none_satisfy, do_chain, chainv, do_and, andv, do_or, orv,
+ cat_vec, assoc, assql, mapcar, mapcon, mappend, sort, multi_sort,
+ find, find_if, posqual, posql, posq, pos, pos_if, set_diff,
+ search): Use nullify for correctness. Some functions fixed
+ so return sequence matches type of input sequence.
+ (nullify): New function.
+
+ * lib.h (nullify): Declared.
+
+ * txr.1: Documented nullify and ake-like.
+
+2014-06-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register new search function as intrinsic.
+
+ * lib.c (search_list): New static function.
+ (search): New function.
+
+ * lib.h (search): New function declared.
+
+ * txr.1: Documented.
+
+ * txr.vim: Regenerated.
+
+2014-06-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Adding an explicit lexical rule to
+ catch backslashes occurring within a regex, not followed by a
+ character. This can happen in dynamically parsed regexes
+ such as "abc\\".
+
+2014-06-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (yylex_destroy): Only rely on the FLEX_ version
+ numbers if they are defined. In a newer flex, they are prefixed
+ by YY_.
+
+2014-06-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (lang_flags): Removing -D_BSD_SOURCE
+ from lang_flags. Adding a test for determining
+ which flag reveals BSD functions. This is due to the
+ braindamaged way feature selection macros work on
+ FreeBSD. There is no way to say "give me only the
+ functions from a certain version of the Unix spec,
+ plus traditional BSD functions", so we have to resort to
+ using the internal symbol __BSD_VISIBLE. Also, changing
+ the detection test for daemon function to the
+ pointer-based approach.
+
+2014-06-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (lang_flags): drop -D_POSIX_C_SOURCE=199309L.
+ This is subsumed by -D_XOPEN_SOURCE=500.
+
+2014-06-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Typo in diagnostic output: wspawnlp.
+
+2014-06-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Changes for FreeBSD 9.
+
+ * configure: Use pointer-based test for timegm, because
+ -Werror=implicit-function-declaration does not work in the
+ gcc 4.2 used on FreeBSD 9.
+
+ * parser.l: Check for Flex 2.5.9 and earlier which don't
+ have yylex_destroy. Thanks to Marcus Breiing.
+
+2014-06-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Changes for building on Solaris 10 using the
+ /usr/bin/xpg4/sh shell. Solaris' /bin/sh does not like test
+ -e. Adding break to the new shell existence testing loop so we
+ use the first shell in the list. Solaris wants _XOPEN_SOURCE=500
+ to reveal certain functions. Fix breakage in the make utility
+ detection, and also use the $make variable everywhere instead
+ of make.
+
+2014-06-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Defend against legacy, non-POSIX /bin/sh implementations.
+ We boostrap using #!/bin/sh, but try to detect a better shell
+ and re-execute the script with that shell. Furthermore, we now
+ set up the SHELL variable in config.make, so that make uses that
+ shell for executing build recipes.
+
+2014-06-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_lisp1): Function removed.
+ (op_dwim, dwim_locs): Removing silly logic of separately calling
+ eval_lisp1 on the functor, and eval_lisp1_args on its arguments, since
+ lisp1 evaluation treats all position the same way.
+
+2014-06-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Documenting the return value of rplaca and rplacd, and changing
+ it to be the cell, rather than the new value.
+
+ * eval.c (transform_op): Fix use of rplacd that uses return value.
+ (force): Likewise.
+
+ * lib.c (rplaca, rplacd): Return cons.
+ (rem_lazy_rec, obj_init): Fix use of rplacd that uses return value.
+
+ * txr.1: Documented.
+
+2014-05-20 Kaz Kylheku <kaz@kylheku.com>
+
+ The call operator should be a function!
+
+ * eval.c (call): New static function.
+ (eval_args, op_call): Static functions removed.
+ (eval_init): call_s registered as operator rather than function.
+
+ * txr.1: Updated.
+
+2014-05-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 89
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped.
+
+ * txr.spec: Bumped version.
+
+ * RELNOTES: Updated
+
+2014-05-10 Kaz Kylheku <kaz@kylheku.com>
+
+ String type related bugfixes: neglecting to handle all three kinds in
+ some places. In particular, the test case
+
+ echo : | ./txr -c '@a:@a' -
+
+ breaks because of neglected LIT in do_match_line.
+
+ * arith.c (tofloat, toint): Handle LIT type in switch.
+
+ * lib.c (ref, refset, replace, update): Handle LSTR type.
+
+ * match.c (do_match_line, do_output_line): Handle LSTR and LIT
+ objects in switch.
+
+2014-04-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (get_line, get_char, get_byte): Fix outdated, incorrect
+ optional argument defaulting logic.
+
+2014-04-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c, gc.c, rand.c, regex.c, signal.c: Remove inclusion of unneeded
+ headers.
+
+2014-04-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (make_var_shadowing_env): Remove unnecessary test for
+ colon symbol.
+
+2014-04-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rangev_func, range_star_v_func): Use numeric
+ equivalence comparison for end test, rather than eql.
+
+2014-04-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (eql): Bugfix: not handling floating-point types!
+ Two objects which are equal floating-point values must be considered
+ eql even if they are distinct objects (not eq).
+
+2014-04-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 88
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped. Generational GC is now
+ enabled by default.
+
+ * txr.spec: Bumped version.
+
+ * RELNOTES: Updated
+
+ * txr.vim: Regenerated.
+
+2014-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (CHECKOBJ_VEC_SIZE, FRESHOBJ_VEC_SIZE): Increase
+ to 8 * HEAP_SIZE from 2 * HEAP_SIZE to reduce frequency
+ of garbage collections.
+
+2014-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Updating generational GC notes in light of changes.
+
+2014-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Change to how locations are passed around, for the sake of generational
+ GC. The issue being solved here is the accuracy of the gc_set function.
+ The existing impelmentation is too conservative. It has no generation
+ information about the memory location being stored, and so it assumes
+ the worst: that it is a location in the middle of a gen 1 object.
+ This is sub-optimal, creating unacceptable pressure against the
+ checkobj array and, worse, as a consequence causing unreachable gen 0
+ objects to be tenured into gen 1.
+
+ To solve this problem, we replace "val *" pointers with a structure
+ of type "loc" which keeps track of the object too, which lets us
+ discover the generation.
+
+ I tried another approach: using just a pointer with a bitfield
+ indicating the generation. This turned out to have a serious issue:
+ such a bitfield goes stale when the object is moved to a different
+ generation. The object holding the memory location is in gen 1, but the
+ annotated pointer still indicates gen 0. The gc_set function then
+ makes the wrong decision, and premature reclamation takes place.
+
+ * combi.c (perm_init_common, comb_gen_fun_common,
+ rcomb_gen_fun_common, rcomb_list_gen_fun): Update to new interfaces
+ for managing mutation.
+
+ * debug.c (debug): Update to new interfaces for managing mutation.
+ Avoid loc variable name.
+
+ * eval.c (env_fbind, env_fbind): Update to new interfaces
+ for managing mutation.
+ (lookup_var_l, dwim_loc): Return loc type and update to new interfaces.
+ (apply_frob_args, op_modplace, op_dohash, transform_op, mapcarv,
+ mappendv, repeat_infinite_func, repeat_times_func): Update to new
+ interfaces for managing mutation.
+
+ * eval.h (lookup_var_l): Declaration updated.
+
+ * filter.c (trie_add, trie_compress, trie_compress_intrinsic,
+ * build_filter, built_filter_from_list, filter_init): Update to new
+ * interfaces.
+
+ * gc.c (gc_set): Rewritten to use loc type which provides the exact
+ generation. We do not need the in_malloc_range hack any more, since
+ we have the backpointer to the object.
+ (gc_push): Take loc rather than raw pointer.
+
+ * gc.h (gc_set, gc_push): Declarations updated.
+
+ * hash.c (struct hash): The acons* functions use loc instead
+ of val * now.
+ (hash_equal_op, copy_hash, gethash_c, inhash, gethash_n, pushhash,
+ remhash, set_hash_userdata, hash_next, group_by, hash_keys,
+ hash_values, hash_pairs, hash_uni, hash_isec, hash_update,
+ hash_update_1): Updated to new interfaces for managing mutation.
+ (hash_grow): Needs hash table argument to call the new form of set.
+ (hash_process_weak): We need to use valptr to recover the val *
+ from the loc that we receive from some functions now.
+
+ * hash.h (gethash_c, gethash_f): Declarations updated.
+ (gethash_l): Inline function's prototype changes.
+
+ * lib.c (rplaca, rplacd, car_l, cdr_l, listref_l, tail, lastcons, last,
+ ltail, list_collect, list_collect_nconc, list_collect_append, nreverse,
+ lazy_appendv_func, lazy_appendv): Update to new interfaces.
+ (malloc_low_bound, malloc_high_bound): Static variables removed.
+ (adjust_bounds): Static function removed.
+ (chk_malloc, chk_malloc_gc_more, chk_calloc, chk_realloc):
+ Calls to adjust_bounds removed.
+ (in_malloc_range): Function removed.
+ (get_plist_f, string_extend, length_str, replace_str, make_sym,
+ delete_package, intern, rehome_sym, get_user_package,
+ get_system_package, get_keyword_package, func_get_env, vec_set_length,
+ vecref, vecref_l, vec_push, simple_lazy_stream_func, lazy_stream_func,
+ lazy_str, lazy_str_force, lazy_str_force_upto, acons_new, acons_new_c,
+ aconsql_new, aconsql_new_c, alist_nremove, alist_nremove1, merge,
+ sort_list, refset, obj_init): Update to new interfaces.
+
+ * lib.h (loc): New typedef.
+ (gc_set): Interface change.
+ (mkloc_fun): New inline function.
+ (mkloc, mkcloc, nulloc, nullocp, deref, valptr): New macros
+ (set): Interface change: takes loc as first argument,
+ rather than lvalue expression.
+ (mpush): Interface change: second argument is loc, rather
+ than lvalue.
+ (keyword_package, user_package, system_package, gensym_counter): Use
+ deref rather than dereference operator.
+ (in_malloc_range): Declaration removed.
+ (car_l, cdr_l, listref_l, tail, lastcons, ltail, getplist_f,
+ get_user_package, get_system_pckage, get_keyword_package,
+ vecref_l, acons_new_c, aconsql_new_c): Declarations updated.
+ (list_collect_decl): Updated to follow new interfaces.
+
+ * match.c (dest_set, h_coll, v_gather, v_collect, v_cat, v_output,
+ v_filter): Updated to follow new interfaces.
+
+ * parser.y (expand_meta, rlset): Updated to follow new interfaces.
+
+ * rand.h (random_state): Use deref.
+
+ * stream.c (string_in_get_line, string_in_get_char,
+ string_in_unget_char, strlist_out_put_string, strlist_out_put_char):
+ Updated to follow new interfaces.
+
+ * stream.h (std_input, std_output, std_debug, std_error,
+ std_null): Use deref macro.
+ (lookup_var_l): Declaration updated.
+
+ * syslog.c (syslog_put_string, syslog_put_char, syslog_put_byte,
+ syslog_set_prop): Updated to follow new interfaces.
+
+ * unwind.c (uw_register_subtype): Updated to follow
+ new interfaces.
+
+2014-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Generational GC tweaks.
+
+ * gc.c (make_obj): If we have room in the freshobj array,
+ but are out of objects, then call more. Without this,
+ we don't take proper advantage of this nursing area.
+ (gc): Set the full_gc flag after doing gc, in preparation
+ for next time. If we know full GC is coming, we can
+ adjust some behaviors. Increase the threshold for calling the more()
+ function to be the same as in the non-generational case:
+ less than 3/4 of the size of a heap scavenged.
+ (gc_set): Now does nothing if it is known that
+ a full gc is coming. Also, in the checkobj array overflow
+ case when we invoke gc, there is no point in adding obj
+ to the array, since it must have been promoted to the mature
+ generation.
+ (gc_mutated): Don't bother storing the object in the
+ array if a full GC is coming.
+
+2014-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (string_time): If possible, change the timezone in the
+ struct tm from "GMT" to "UTC", so that the time_string_utc
+ function will use UTC for the %Z format.
+
+2014-03-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix a bug arising from putting generation 1 objects into the
+ checkobj array (via the mut macro that expands to gc_mutated).
+ The garbage collector assumes that checkobj has only generation 0
+ objects, which all exist in the freshobj array, which is subject
+ to a sweep. So gen 1 objects in checkobj are never cleaned up
+ properly: they do not have their REACHABLE flag reset, or
+ their generation restored to 1. To fix this, a new array for these
+ objects is introduced separate from checkobj.
+
+ * gc.c (MUTOBJ_VEC_SIZE): New preprocessor symbol.
+ (mutobj, mutobj_idx): New static array and integer.
+ (mark_obj): Check for REACHABLE flag before checking the full_gc
+ flag and generation, since those cost additional memory accesses.
+ (mark): Mark the objects in the new mutobj array.
+ (sweep): Sweep the objects in the mutobj array.
+ (gc): Reset mutobx_idx to zero after gc.
+ (gc_set): Rearrange logic. In the case that the checkobj array
+ is full and a gc is done to make room, there is no point in
+ adding to the array: the gc pass moves all babies to generation 1,
+ so the object that was passed into the function is no longer a baby.
+ (gc_mutated): Rewrite in terms of mutobj rather than checkobj,
+ fixing the bug.
+
+ * HACKING: Improved documentation of GC. Describe mut macro
+ and mutobj array.
+
+2014-03-27 Kaz Kylheku <kaz@kylheku.com>
+
+ More generational GC fixes. One GC fix.
+
+ * combi.c (perm_init_common, comb_gen_fun_common,
+ rcomb_gen_fun_common): Use set macro instead of plain assignment.
+
+ * hash.c (hash_grow, copy_hash, hash_update_1): Use set macro
+ instead of plain assignment.
+
+ * lib.c (nreverse, lazy_appendv_func, lazy_appendv,
+ vec_push, refset): Use set macro instead of plain assignment.
+ (make_package): Assign all fields of the newly created PKG
+ object before calling a function which can trigger GC.
+
+ * parser.y (rlset): Use set macro.
+
+2014-03-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix generational GC regression caused by fixes
+ in in 2014-03-12, when prof was introduced.
+ The attempt to fix a bug made things worse.
+
+ * lib.c (adjust_bounds): New static function.
+ (chk_malloc, chk_calloc, chk_realloc): Replace existing logic with
+ call to adjust_bounds.
+ (chk_malloc_gc_more): Bugfix: add missing call to adjust_bounds.
+
+2014-03-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Update for WLL's and QLL's.
+
+ * txr.vim: Regenerate.
+
+2014-03-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (me_quasilist): New static function.
+ (eval_init): Register me_quasilist as quasilist macro expander.
+
+ * lib.c (quasilist_s): New global variable.
+ (obj_init): quasilist_s initialized.
+
+ * lib.h (quasilist_s): Declared.
+
+ * match.c (do_txreval): Handle quasilist syntax.
+
+ * parser.l (QWLIT): New exclusive state.
+ Extend lexical grammar to transition to QWLIT state upon
+ the #` or #*` sequence which kicks off a word literal,
+ and in that state, piecewise lexically analyze the QLL,
+ mostly by borrowing rules from quasiliterals.
+
+ * parser.y (QWORDS, QWSPLICE): New tokens.
+ (n_exprs): Integrate splicing form of QLL syntax.
+ (n_expr): Integrate non-splicing form of QLL syntax.
+ (litchars): Propagate line number info.
+ (quasilit): Fix "string literal" wording in error message.
+
+ * txr.1: Introduced WLL abbreviation for word list literals,
+ cleaned up the text a little, and documented QLL's.
+
+2014-03-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_quasi): Bugfix: incorrect logic, failing
+ to macro-expand the embedded forms in a quasiliteral except
+ when they are the very first item.
+
+2014-03-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (yybadtoken): Add missing cases for new token
+ types WORDS and WSPLICE.
+
+2014-03-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Introducing word list literals.
+
+ * parser.l (WLIT): New exclusive start state.
+ Extend lexical grammar to transition to WLIT state upon
+ the #" or #*" sequence which kicks off a word literal,
+ and in that state, piecewise lexically analyze the literal,
+ mostly by borrowing rules from other literals.
+
+ * parser.y (WORDS, WSPLICE): New tokens.
+ (n_exprs): Integrate splicing form of word list literal syntax.
+ (n_expr): Integrate non-splicit for of word list literal syntax.
+ (litchars): Propagate line number info.
+ (wordslit): New grammar rule.
+
+ * txr.1: Updated.
+
+2014-03-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register last function as intrinsic.
+
+ * lib.c (last): New function.
+
+ * lib.h (last): Declared.
+
+ * txr.1: Documented last.
+
+2014-03-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register empty as intrinsic.
+
+ * lib.c (copy): Bugfix: handle lazy strings. Also, handle hash
+ tables via copy_hash.
+ (length): Bugifx: handle lazy strings. Also, handle hash tables
+ via hash_count.
+ (empty): New function.
+
+ * lib.h (empty): Declared.
+
+ * txr.1: Documented.
+
+2014-03-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (not_s): New symbol var.
+ (me_unless, me_while, m_until): New static functions.
+ (eval_init): Register macros unless, while and until.
+
+ * txr.1: Document unless, while and until.
+
+2014-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 87
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated
+
+ * txr.vim: Regenerated.
+
+2014-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (w_fopen, w_popen, w_freopen, w_remove, w_rename): Revert
+ 2014-03-14 changes.
+
+2014-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (me_when): New static function.
+ (eval_init): Register "when" macro.
+
+ * txr.1: Documented when macro.
+
+2014-03-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Second round of bugfixing on the theme of the previous commit.
+ Here were are changing the output clause to recognize all special
+ clause tokens that are not used in output and turning them into
+ regular Lisp. So @(if a b c) in an output clause works once again,
+ recognized as IF exprs_opt ')' syntax, and turned into Lisp. Other
+ things work that didn't work before like @(and), @(or) and so forth.
+
+ * parser.y (make_expr): New static function.
+ (not_a_clause): New nonterminal.
+ (out_clause): Remove error-catching productions for match-side
+ clauses.
+ (o_elems): Now consists of a mixture of o_elems and not_a_clause's.
+
+2014-03-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing gaping bug in the handling of @-delimited expressions
+ within quasiliterals. This has been a problem for years.
+ Quasiliteral strings existed very early before TXR Lisp was introduced.
+ So it made sense that when @ is seen in a quasiliteral, the
+ lexical analyzer pushed into the SPECIAL state in which directives
+ are recognized, like in the pattern language. I noticed
+ this because there is an @(if) directive now, which prevents
+ `@(if ...)` from being valid.
+
+ * parser.l (QSPECIAL): New scanner state. This is a state
+ similar to SPECIAL that we enter into when @ is seen in a QSLIT state.
+ In this state we recognize constructs like braced variables, but not
+ certain other features like directives.
+
+2014-03-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (int_flo): Fix non-handling of negative values.
+
+2014-03-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (tofloat, toint): New functions.
+
+ * arith.h (tofloat, toint): Declared.
+
+ * eval.c (eval_init): tofloat and toint registered
+ as intrinsics.
+
+ * txr.1: Documented.
+
+2014-03-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 86
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated
+
+ * dep.mk: Regenerated.
+
+2014-03-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (win_make_cmdline): I think I cracked the code of
+ passing escaped arguments to Microsoft's popen and system
+ functions. The first argument cannot be quoted, but the
+ subsequent ones can. It is the quoting of the first argument
+ that causes the whole thing to be quoted. So we just
+ avoid quoting the first argument. (If it has spaces, too bad;
+ don't do that).
+ (open_process): Fix neglected optional argument handling
+ in Windows version of this function.
+
+2014-03-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Detect _wspawn* functions.
+
+ * stream.c (run): Implement using _wspawnvp on MinGW.
+
+2014-03-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Bugfix. When handling a backslash-newline continuation
+ in the SPECIAL, NESTED and BRACED states, do not pop the state in all
+ three, only in SPECIAL (to terminate the @\ continuation).
+
+ * txr.1: Eliminate wrong claim that string literals do not split across lines,
+ which is directly contradicted two paragraphs later. Document that
+ quasiliterals also split.
+
+ * genvim.txr (txr_regex, txl_regex): These definitions change from "syn match"
+ to "syn region" so that the backslash-newline continuation can be properly
+ handled.
+ (txr_string, txr_quasilit): Correctly handle split literals.
+
+ * txr.vim: Regenerated.
+
+2014-03-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (text): Allow the EMPTY token (the @(empty) syntax)
+ to be a text.
+
+ * txr.1: Documented @(empty).
+
+2014-03-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (regex_parse, lisp_parse): Fix neglected handling of
+ optional arguments. This problem can cause the symbol : to be
+ planted as the std_error stream, resulting in an error loop
+ that blows the stack.
+
+ * regex.c (regex_compile): Likewise.
+
+2014-03-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (w_fopen, w_popen, w_freopen, w_remove, w_rename): We
+ have similar functions in the MSVCRT library used by MinGW,
+ so if _WIN32 is defined, our functions now just wrap those.
+
+2014-03-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (run): Fix MinGW build failures. The run function doesn't
+ work right with arguments, though: the win command line is broken.
+
+2014-03-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Make seed argument optional in make-random-state.
+
+ * rand.c (make_random_state): Do argument defaulting on seed.
+ Also, mix getpid() into the seed.
+ (random_fixnum): Bugfix: do proper defaulting on optional
+ agument, rather than relying on nil.
+ (random): Fix 2014-02-05 regression. This was totally broken,
+ ignoring the random state passed in and using the global
+ random state. This function must only use the state passed in;
+ there is no defaulting to the global random state.
+
+ * txr.1: Documenting that seed is optional in make-random-state.
+ Describing what guarantees can be expected with regard to
+ calls made close together temporally.
+
+2014-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing @(if)/@(elif)/@(else) in the pattern language.
+ Input side for now; output later.
+
+ * parser.y (if_clause, elif_clauses_opt, else_clause_opt): New nonterminals.
+ (IF, ELIF, ELSE): New tokens.
+ (yybadtoken): Handle IF, ELIF, ELSE.
+
+ * parser.l: Recognize and return new tokens IF, ELIF and ELSE.
+
+ * txr.1: Documented.
+
+ * genvim.txr: Updated with if, elsif and else directive keywords.
+
+ * txr.vim: Regenerated
+
+2014-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ On platforms with sigaltstack, TXR programs can now catch the
+ segmentation fault that occurs when running out of stack space,
+ and escape by throwing an exception.
+
+ Also, bugfix: save and restore the gc enable/disable state. Without
+ this, if we are ever running cod in a gc disabled state and it jumps
+ out, gc stays disabled.
+
+ * configure: added check for sigaltstack.
+
+ * gc.h (gc_enabled): Declaration added for existing variable.
+
+ * signal.c (is_cpu_exception): New static function.
+ (sig_handler): For cpu_exception type signals that pertain
+ to the execution of some instruction, turn on async_sig_enabled,
+ so that the signal is not deferred. Otherwise we will just
+ return without calling the user-defined handler, restart
+ the instruction and get into a loop. Also, disable gc around
+ the handler just in case. One issue is that we might be on
+ an alternate stack, which gc won't like.
+ (setup_alt_stack, teardown_alt_stack): New static functions.
+ (set_sig_handler): If we have sigaltstack, and are asked
+ to set up a SEGV handler, then set it up on the alternate
+ stack.
+
+ * signal.h (extended_jmp_buf): Adding new member, gc.
+ (extended_setjmp, extended_longjmp): use gc member
+ to save and restore the gc_enable state across
+ setjmp and longjmp.
+
+2014-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (open_process): If execvp fails, use errno as the
+ exit status.
+ (sh, run): New static functions.
+ (stream_init): sh and run registered as intrinsics.
+
+2014-03-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (iffi): Bugfix: was still using incorrect, outdated optional
+ argument defaulting logic.
+
+2014-03-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (plus_s, prof_s): New symbol global variables.
+ (op_prof, me_pprof): New static functions.
+ (eval_init): Intern prof symbol, store in prof_s.
+ Captured interned + symbol in plus_s. Register prof operator and pprof
+ macro.
+
+ * gc.c (gc_bytes): New global variable.
+ (more): Use nse function chk_malloc_gc_more instead of chk_malloc.
+ (make_obj): Increment gc_bytes.
+
+ * lib.c (malloc_bytes): New global variable.
+ (chk_malloc, chk_realloc): Increment malloc_bytes.
+ (chk_calloc): Bugfix: incorrect size in recursion into oom_realloc.
+ Incorrect calculation of malloc_high_bound. Increment malloc_bytes.
+ (chk_malloc_gc_more): New function.
+
+ * lib.h (alloc_bytes_t): New typedef.
+ (malloc_bytes, gc_bytes): Declared.
+ (chk_malloc_gc_more): Declared.
+
+ * stream.c (format_s): New symbol global.
+ (stream_init): format_s inited.
+ format_s used to register formatv function.
+
+ * stream.h (format_s): Declared.
+
+ * txr.1: Documented prof and pprof.
+
+ * genvim.txr: Recognize reg_fun calls with intern
+ followed by a preceding assignment or other syntax.
+
+ * txr.vim: Updated.
+
+2014-03-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: new test for fcntl.
+
+ * stream.c (open_process): Fixed off-by one erroneous value of nargs,
+ causing memory leak of one string. Fixed memory leak on fork failure.
+ Fixed a deadlock that can occur in the pipe close function when
+ multiple pipes are in existence. This is fixed by setting the
+ FD_CLOEXEC flag on the pipe file descriptor. Without this, one child
+ process can hold another's pipe open, causing that other one not to
+ terminate when we're trying to shut it down, resulting in that child
+ blocked on a write, while we block on waitpid.
+
+2014-03-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (open_process): In the event of fdopen failure,
+ kill the child process less abruptly by hitting it with SIGINT and
+ SIGTERM, rather than with SIGKILL. Also, collect the child
+ process with waitpid.
+
+2014-03-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Registration of url_encode and url_decode
+ moved to filter.c.
+
+ * filter.c (trie_compress_intrinsic, html_encode, html_decode): New
+ static functions.
+ (filter_init): Register make_trie, trie_add, trie_compress_intrinsic,
+ filter_string_tree, filter_equal, html_encode and html_decode
+ as intrinsics. Move registration of url_encode and url_decode here.
+
+ * genvim.txr: Look for registrations in filter.c too.
+
+ * txr.1: Documented.
+
+ * txr.vim: Updated.
+
+2014-03-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (open_process): Close the original pipe file descriptor
+ in the child process after dup2-ing it to standard input or standard
+ output, so the child doesn't have to references to the pipe.
+
+2014-03-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (pipe_close): Restructured the function a bit.
+ Do not throw exceptions for normal process terminations, only for
+ abnormal ones (terminated by a signal). Return the termination
+ status instead of just t.
+
+ * txr.1: Fixed the neglected documentation of the optional boolean
+ argument of close-stream. Described the behaviors with regard
+ to pipes in more detail.
+
+2014-03-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_trailer): Fix segfault. The code which
+ helps implement the special interaction between @(accept) and
+ @(trailer) was not handling the situation when there is not
+ current unwind exit point.
+
+2014-03-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Syntactic tweak. Do not allow the "extra"
+ constituent chars # or ^ to start the symbol name after an @.
+ Prior to this change @^a is a "meta-symbol" whose name is "^a",
+ but ^a is the ^ quasiquote notation followed by symbol a.
+ After this change @^a is meta, applied to quasiquote-a.
+
+2014-03-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (lazy_sub_str): Bugfix: "from" was mistakenly used
+ in the adjustment of the "to" value.
+
+ * match.c (search_form): Use predefined constants for -1 and 1
+ instead of calling num.
+
+2014-03-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing broken processing of horizontal matching across
+ long lines produced by @(freeform). Once the matching
+ passes about 4000 characters, the "consume_prefix"
+ function kicks in to save memory. Then any code which is
+ not properly written to handle this displaced situation
+ will break.
+
+ * match.c (h_text, h_var, h_coll, h_parallel, h_fun): Bugfix.
+ The recursive calls to match_line return an absolute position.
+ From this value we must subtract c->base if we are to
+ compare it with c->pos, or update c->pos. If we use the
+ absolute value, we are abruptly jumping ahead in the data.
+
+2014-03-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Issue: match_regex and search_regex were continuing to feed characters
+ to the regex machine even when there is no transition available. This
+ was due to the broken return value protocol of regex_machine_feed. For
+ instance for the regex / +/ (one or more spaces), after matching some
+ spaces, it would report REGM_INCOMPLETE for additional non-space
+ characters, never reporting REGM_FAIL.
+
+ * regex.c (regm_result_t): Block comment added, documenting protocol.
+ (regex_machine_feed): Return REGM_FAIL if there are no transitions for
+ the given character, even a partial match has been recorded. This is
+ a signal to stop feeding more characters. At that point, the function
+ can be called with a null character to distinguish the three cases:
+ fail, partial or full match.
+ (search_regex): Now when the search loop gets a REGM_FAIL, it can
+ no longer assume that nothing was matched and the search must restart
+ at the next position. Upon the REGM_FAIL signal, it is necesary to
+ seal the search by feeding in the 0 character. Only if that returns
+ REGM_FAIL is it a no match situation. Otherwise it is actually a match!
+
+2014-03-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 85
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated
+
+ * txr.vim: Updated.
+
+2014-03-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Added missing documentation for @(forget)/@(local).
+
+2014-03-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (rand_init): Oops! Spectacular silliness here
+ broke the symbol module: two intern calls in consecutive
+ lines, one for the name without "earmuffs", one with,
+ leading to the situation that the C code looks for a
+ dynamic variable that does not exist.
+
+2014-03-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (LOG_MATCH, LOG_MISMATCH): Wouldn't you know it;
+ the format strings in these macros contained a workaround for
+ the broken * variable field width syntax, specifying
+ ~*~a where the extra ~ in the middle just feeds a character
+ that the broken state machine expects. These workarounds broke when I
+ fixed the formatting, making -v mode useless.
+
+2014-03-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 84
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated
+
+ * txr.vim: Updated.
+
+2014-03-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (upop): New function.
+
+ * lib.h (upop): Declared.
+
+ * txr.c (txr_main): Two bugfixes. One is that the argument -
+ was being pushed back twice resulting in *args* being ("-" "-").
+ This is because the option processing loop checked for "-" and pushed
+ it back into args, and then some logic after the loop pushed arg back
+ into args again. But, these pushes were wrong because they push
+ back a different cons cell; we would like to be able to
+ do (ldiff *full-args* *args*). This is solved by upop, which provides
+ one element of undo. After upop, we can restore the prior list
+ from the undo save location.
+
+2014-03-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (assert_s): New global variable.
+ (obj_init): Intern assert symbol, store in assert_s.
+
+ * lib.h (assert_s): Declared.
+
+ * match.c (typed_error, v_assert, h_assert): New static functions.
+ (dir_tables_init): Register v_assert and h_assert.
+ Register assert_s as non-data-matching directive.
+
+ * unwind.c (uw_init): Register assert as a subtype
+ of error.
+
+ * txr.1: Describe assert.
+
+2014-03-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c: (v_next): Set the "curfile" in the context to "env" when
+ scanning environment.
+ (open_data_source): Regression: was not setting c->curfile when opening
+ anything.
+
+2014-03-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (apply_intrinsic, lazy_mapcar): Changed linkage to external.
+
+ * eval.h (apply_intrinsic, lazy_mapcar): Declarations added.
+
+ * stream.c (open_files, open_file_star): New functions.
+ (stream_init): Registered new functions as intrinsics.
+
+ * txr.1: Documented open-files and open-files*. Added to make-catenated-stream documentation.
+
+ * genvim.txr: Replace bunch of code with open-files.
+
+ * txr.vim: Regenerated.
+
+2014-03-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_files): Fix it again. The data (nil)
+ can occur from an interactive/real-time stream.
+
+2014-03-06 Kaz Kylheku <kaz@kylheku.com>
+
+ g++ regressions.
+
+ * eval.c (env_k): Duplicate global variable definition removed.
+
+ * lib.c (vector, vec_set_length): Fixed signed/unsigned comparison
+ warnings.
+
+ * stream.h (stdin_s, stdout_s, stddebug_s, stderr_s, stdnull_s):
+ Declarations were definitions due to missing extern.
+
+2014-03-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): Don't push back arg into arg_list if arg is nil.
+
+2014-03-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing regression caused by the 2014-02-19 change ("Fixed long-running
+ issue ...").
+
+ * match.c (open_data_source): if c->data is t, but c->files
+ is nil, set c->data to nil: we cannot possibly open anything later.
+ (match_files): We need to call open_data_source one more time just
+ before processing a line with horizontal material. The previous
+ call(s) to open_data_source might not have opened anything. Before
+ accesing car(c.data) the correct test is consp(c.data), not c.data. In
+ the else clause, we now specificially check for nilp(c.data) which is
+ the correct indicator of no more data. If c.data is any other atom at
+ that point, we have an internal error, for which an assertion is added
+ now.
+
+2014-03-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Fix broken parsing of parameteric width and
+ precision (i.e. given by *). The simplest way to do this is to add a
+ state vf_star which is similar to vf_digits, and reuses much of the
+ logic via a goto. Fixing forgotten --fmt (push back char) when moving
+ from vf_precision to vf_spec state due to unhandled character.
+ Also, allowing a leading zero before a precision given as *
+ so that computed precisions can be combined with zero padding.
+
+ * txr.1: Documented leading zero better so it is clear it
+ combines with *. Restructured documentation.
+
+2014-03-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (put_line): Default string argument to empty string.
+ (stream_init): Change how put_line is registered to take advantage of
+ new optional parameter.
+
+ * txr.1: Updated.
+
+2014-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (logten): New function.
+
+ * eval.c (eval_init): logten registered as intrinsic.
+
+ * lib.h (logten): Declared.
+
+ * txr.1: Documented.
+
+2014-03-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Allowing ^ to be a quote character, and adjusting definition
+ of identifiers to rule this out from being the first character of a
+ symbol which has no prefix. Recognize the ^ character as a token in the
+ NESTED state.
+
+ * lib.c (obj_print, obj_pprint): Render sys:qquote as ^.
+
+ * parser.y (choose_quote): Function removed.
+ (n_expr): Recognize '^' as quasiquote. Removed all the "smart quote"
+ hacks that try to make quote behave as quote or quasiquote, or try to
+ cancel out unquotes and quotes.
+
+ * tests/009/json.txr: Fixed to ^ quasiquote.
+
+ * tests/010/reghash.txr: Likewise.
+
+ * tests/011/macros-2.txr: Likewise.
+
+ * tests/011/mandel.txr: Likewise.
+
+ * tests/011/special-1.txr: Likewise.
+
+ * txr.1: Updated docs.
+
+ * genvim.txr: Revamped definitions for txr_ident and txl_ident so that
+ unqualified identifiers cannot start with # or ^, but ones with @ or :
+ in front can start with these characters.
+
+ * txr.vim: Regenerated.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (lex.yy.c): Remove lex.yy.c before trying to regenerate it.
+ (y.tab.c, y.tab.h): Remove y.tab.c before running yacc. Write-protect
+ y.tab.c, not $@, which could expand to the y.tab.h target if that is
+ what triggered the rule.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Incorporating more corrections from Roman Mishin.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (make_env_intrinsic): New static function.
+ (eval_init): Register new intrinsics make-env, env-fbind and env-vbind.
+
+ * txr.1: Documented.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 83
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated
+
+ * dep.mk: Updated.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand): Bugfix. When processing a defvar, should mark
+ the variable as special at expansion time. Without this, binding
+ forms in other parts of the tree won't be expanded properly
+ to bring about the special semantics.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (unquotes_occur): Fix use of unquote_s rather than sys_unquote_s
+ which breaks backquote, caught by tests/010/reghash.txr.
+ I thought fixed this already! But I must have made the change to y.tab.c
+ rather than parser.y.
+
+ * Makefile (lex.yy.c, y.tab.c): Make these files readonly to prevent
+ unintended edits.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Skip lines that contain system_package.
+
+ * txr.vim: Regenerated.
+
+2014-03-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: catenated stream objects not hooked into garbage collector,
+ causing premature collection of the catenated stream list.
+
+ * stream.c (cat_mark): new function.
+ (cat_stream_ops): use cat_mark for gc mark function.
+
+2014-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ New quasiquote idea: let's have two quasiquote macros sharing one
+ expander. One macro based on sys:qquote, sys:unquote and sys:splice,
+ and the other based on qquote, unquote and splice in the user package.
+ The read syntax puts out the sys: one.
+
+ * eval.c (expand_qquote): Takes three additional arguments: the
+ qquote, unquote and splice symbols to recognize.
+ The invalid splice diagnostic is adjusted based on which backquote
+ we are expanding.
+ (me_qquote): Look at the symbol in the first position of the form
+ and then expand either the internal quasiquote macro or the public one,
+ passing the right symbols into expand_qquote.
+ (eval_init): Register error-throwing stub functions
+ for the sys_qquote_s, sys_unquote_s and sys_splice_s symbols.
+ Register a macro for sys_qquote_s.
+
+ * lib.c (sys_qquote_s, sys_unquote_s, sys_splice_s): New symbol
+ variables.
+ (obj_init): Initialize new variables. Change qquote_s,
+ unquote_s and splice_s to user package.
+ (obj_print, obj_pprint): Convert only sys_qquote_s,
+ sys_unquote_s and sys_splice_s to the read syntax.
+ The quote_s, unquote_s and splice_s symbols are not
+ treated specially.
+
+ * lib.h (sys_qquote_s, sys_unquote_s, sys_splice_s): Declared.
+
+ * parser.y (n_expr): Use sys_qquote_s, sys_unquote_s and
+ sys_splice_s rather than qquote_s, unquote_s and splice_s.
+ (unquotes_occur): Likewise.
+
+ * txr.1: Documented.
+
+2014-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: changed numerous "if ! conftest" tests to "if conftest",
+ swapping around the consequent and alternative clauses.
+
+2014-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (conftest, conftest_o): New functions
+ Use functions throughout tests instead of repeated code for removing
+ target, invoking make with redirection and testing for existence of
+ target.
+
+2014-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/011/special-1.txr: Add some coverage for evaluation
+ of a re-bound special under the Lisp-1 evaluation of the [ ]
+ notation. This test case would have failed three commits
+ back.
+
+2014-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_qquote): Another bugfix: not recognizing a trailing
+ atom that comes out of recursive call, wrapped in (quote ...),
+ resulting in '(,a . b) expanding to (append 'a . quote b)
+ rather than (append (list 'a) (quote b)); i.e. (append (list 'a) 'b).
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (lookup_sym_lisp1): Bugfix: wasn't following the dynamic
+ environment at all, and still had vestiges of support for the the old
+ cptr based global variables.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: Use target-specific assignment
+ to suppress TXR_DBG_OPTS for tests under tests/011.
+ The --gen-gc makes mandel.txr run too slow.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (self_evaluating_p, maybe_quote): New functions.
+ (expand): Use maybe-quote form macro-time, to not quote
+ result unnecessarily.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/011/mandel.expected: New file.
+
+ * tests/011/mandel.txr: New file.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Turn *gensym-counter* into proper special variable.
+
+ * eval.c (eval_init): Save *gensym-counter* symbol in gensym_counter_s
+ symbol variable right after interning, and use zero as the inital value
+ rather than the gensym_counter variable which is removed now.
+
+ * lib.c (gensym_counter_s): New symbol variable.
+ (gensym_counter): Variable removed.
+ (gensym): Slight refactoring to avoid a double variable lookup.
+ Also, for generational GC correctness, use the set macro to update it,
+ since the variable could live inside heap object and the counter
+ could overflow to bignums which are heap objects.
+ (obj_init): Remove initialization of gensym_counter.
+
+ * lib.h (gensym_counter_s): Declared.
+ (gensym_counter): Declaration removed, replaced by macro.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Change in the design of how special variables work, to fix the broken
+ re-binding. C code now has to go through the dynamic environment lookup
+ to access things like *random-state*, or *stdout*. As part of this,
+ I'm moving some intrinsic variable and function initializations out of
+ eval.c and into their respective modules. Macros are are used to make
+ global variables look like ordinary C variables. This is very similar
+ to the errno trick in POSIX threads implementations.
+
+ * eval.c (looup_var, lookup_var_l): Restructured to eliminate silly
+ goto, the cobjp handling is gone.
+ (reg_fun, reg_var): Internal function becomes external.
+ reg_var registers a simple cons cell binding now, without any
+ C pointer tricks to real C global variables.
+ (c_var_mark): Static function removed.
+ (c_var_ops): Static struct removed.
+ (eval_init): Numerous initializations for streams, syslog, rand,
+ signals and others moved to their respective modules.
+ The new symbol variables user_package_s, keyword_package_s
+ and system_package_s are interned here, and the variables are
+ created in a special way.
+
+ * eval.h (reg_var, reg_fun): Declared.
+
+ * gc.c (prot1): Added assert that the loc pointer isn't null.
+ This happened, and blew up during garbage collection.
+
+ * lib.c (system_package, keyword_package, user_package): Variables
+ removed these become macros.
+ (system_package_var, keyword_package_var, user_package_var): New
+ global variables.
+ (system_package_s, keyword_package_s, user_package_s): New
+ symbol globals.
+ (get_user_package, get_system_package, get_keyword_package): New
+ functions.
+ (obj_init): Protect new variables. Initialization order of modules
+ tweaked: the modules sig_init, stream_init, and rand_init are moved
+ after eval_init because they register variables.
+
+ * lib.h (keyword_package, system_pckage, user_package): Variables
+ turned into macros.
+ (system_package_var, keyword_package_var, user_package_var): Declared.
+ (system_package_s, keyword_package_s, user_package_s): Declared.
+ (get_user_package, get_system_package, get_keyword_package): Declared.
+
+ * rand.c (struct random_state): Renamed to struct rand_state to
+ avoid clash with new random_state macro.
+ (random_state): Global variable removed.
+ (random_state_s): New symbol global.
+ (make_state, rand32, make_random_state, random_fixnum, random):
+ Follow rename of struct random_state.
+ (rand_init): Reference to random_state variable gone. Using
+ reg_var to create the *random-state* variable that is referenced
+ from C using the random_stat macro.
+
+ * rand.h (random_state): Variable removed, replaced by macro
+ that performs dynamic lookup.
+
+ * signal.c (sig_init): References to all the sig_* global variables
+ removed. The signal-related reg_var and reg_fun calls from eval.c moved
+ here.
+
+ * stream.c (std_input, std_output, std_debug, std_error, std_null):
+ Variables removed.
+ (s_ifmt, s_ifsock, s_iflnk, s_ifreg, s_ifblk, s_ifdir,
+ s_ifchr, s_ififo, s_isuid, s_isgid, s_isvtx, s_irwxu,
+ s_irusr, s_iwusr, s_ixusr, s_irwxg, s_irgrp, s_iwgrp,
+ s_ixgrp, s_irwxo, s_iroth, s_iwoth, s_ixoth): Variables removed.
+ (stdin_s, stdout_s, stddebug_s, stderr_s, stdnull_s): New symbol
+ globals.
+ (stream_init): References to removed variables gone. Moved
+ stream-related initializations here from eval.c. The global
+ streams are set up differently.
+
+ * stream.h (std_input, std_output, std_debug, std_error, std_null):
+ Variable declarations replaced by macros.
+ (lookup_var_l): Declared.
+ (s_ifmt, s_ifsock, s_iflnk, s_ifreg, s_ifblk, s_ifdir,
+ s_ifchr, s_ififo, s_isuid, s_isgid, s_isvtx, s_irwxu,
+ s_irusr, s_iwusr, s_ixusr, s_irwxg, s_irgrp, s_iwgrp,
+ s_ixgrp, s_irwxo, s_iroth, s_iwoth, s_ixoth): Declarations removed.
+
+ * syslog.c (log_pid_v, log_cons_v, log_ndelay_v, log_odelay_v,
+ log_nowait_v, log_perror_v, log_user_v, log_daemon_v, log_auth_v,
+ log_authpriv_v, log_emerg_v, log_alert_v, log_crit_v, log_err_v,
+ log_warning_v, log_notice_v, log_info_v,
+ log_debug_v, std_log): Variables removed.
+ (syslog_init): References to removed variables removed.
+ Moved syslog-related initializations here out of eval_init.
+
+ * syslog.h:x (std_log): Declration removed.
+
+ * txr.c (self_path, prog_args_full, prog_args): Variables gone.
+ (txr_main): References to removed varaibles are gone.
+ Moved registration of special variables out of eval_init
+ here.
+
+ * txr.h (self_path, prog_args_full, prog_args): Declarations gone.
+
+ * tests/011/special-1.txr: Test case modified to properly test
+ special variables. Previously it produced the expected output
+ even though *stdout* wasn't rebound properly.
+
+ * tests/011/special-1.expected: Updated.
+
+ * genvim.txr: Updated to follow variable and function registration
+ moves. It has to scan more files than just eval.c. Produces identical
+ contents, so no change to txr.vim.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_defvar): Remove the same-named symbol macro when a
+ variable is defined.
+ (op_defsymacro): Remove the same-named variable when a symbol macro is
+ defined.
+ (op_defun): Throw excpetion if an attempt is made to define a
+ special operator as a function. Remove the same-named macro when a
+ function is defined.
+ (op_defmacro): Throw excpetion if an attempt is made to define a
+ special operator as a macro. REmove the same-named function
+ when a macro is defined.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_qquote): Fix broken '(,x . ,y) case, which
+ is generating (append (list x) . y) instead of (append (list x) y).
+ Also, added a nil case which is now necessary to prevent
+ '(,x) from generating (append (list x) nil), though this is
+ effectively an optimization, which is pointless, since
+ the expander isn't optimizing overall.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/010/output-clauses.expected: New file.
+
+ * tests/010/output-clauses.txr: New file.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ About time for some new regression tests.
+
+ * tests/011/macros-1.expected: New file.
+
+ * tests/011/macros-1.txr: New file.
+
+ * tests/011/macros-2.expected: New file.
+
+ * tests/011/macros-2.txr: New file.
+
+ * tests/011/special-1.expected: New file.
+
+ * tests/011/special-1.txr: New file.
+
+2014-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfixing semantics of symbol macro hiding by variable bindings.
+
+ * eval.c (expand_vars): Expand vars needs to know whether it's
+ handling a sequential (let*-like) or parallel (let-like) binding.
+ The init form of a variable sees the previous macro environment,
+ but that variable must, for the remaining variables, shadow any
+ previous symbol macro.
+ (expand): In expand we must inform expand_vars whether we have
+ a sequential or parallel binding construct. Moreover, there was
+ a huge bug here: the new_menv (with the shadows) was passed to
+ expand_vars, so that all the variables were hiding same-named
+ symbol macros from all their initforms.
+
+2014-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (delay_s): Global variable removed.
+ (eval_init): Initialiation of delay_s removed.
+ Symbol now interned in reg_mac call for registering me_delay .
+
+ * genvim.txr: Updated to recognize a reg_mac call
+ with intern.
+
+2014-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Improved documentation for the dwim operator.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 82
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date, improved the documentation
+ for the copy function and copy-list, and fixed the
+ an instance where the delay macro was called a function.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim: Updated.
+
+2014-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Typos, grammar and formatting fixes mailed in
+ by Roman Mishin.
+
+2014-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Regression: valid floating-point literals tagged
+ as having trailing junk. The fix is to put the junk-matching rule after
+ the valid rules.
+
+2014-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (copy): New function.
+
+ * lib.h (copy): Declared.
+
+ * eval.c (eval_init): Registered copy function as intrinsic.
+
+ * txr.1: Added missing documentation for length. Documented copy.
+
+2014-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Updated with regard to how operators are registered in
+ in eval_init. Also, scans reg_mac registrations now.
+
+ * txr.vim: Refreshed. The previously missed "delay" operator is now
+ listed, thanks to reg_mac.
+
+2014-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (maybe_progn): New function.
+ (expand_macrolet, expand_symacrolet): Use maybe_progn
+ to eliminate unnecessary progn wrapping.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (gun_s): New global variable.
+ (me_gun): New static function.
+ (eval_init): New gun symbol interened, me_gun registered
+ as intrinsic macro.
+
+ * txr.1: Documented gun.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Converting expander special case code transformations into
+ formal macros that are in the top_mb table, make their symbols
+ fboundp and can be expanded with macroexpand.
+
+ * eval.c (mefun_t): New typedef name.
+ (expand_macro): If the expander is a cobj, then pull out the C function
+ and call it, otherwise realize the interpreted macro as before.
+ (me_gen, me_delay): New static functions, replace expand_gen
+ and expand_delay.
+ (expand_qquote): Renamed to me_quote.
+ (expand_gen, expand_delay): Renamed to me_gen and me_delay,
+ with an interface adjustment and moved.
+ (expand_op): Renamed to me_op.
+ (expand): Removed qquote, gen, delay, op, and do handling, since
+ these operators are now macros.
+ Removed the unnecessary expansion of with-saved-vars.
+ (reg_op, reg_fun): Assert that the symbol is not nil, to catch
+ initialization order issues. One just showed up: op_do was
+ interned in match.c, which is initialized later.
+ (reg_mac): New static function
+ (eval_init): Intern do_s, because match.c hasn't done it yet
+ at this point. Register me_gen, me_delay, me_op (twice) and me_qquote
+ as intrinsic macros.
+
+ * txr.1: Documented those operators as macros.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (reg_op): New static function.
+ (eval_init): Register operators with reg_op instead of direct sethash
+ calls.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (make_like): If the first element of list isn't
+ a character, then don't try to make it into a string;
+ keep it as a list. This allows [mapcar list "abc" "def"]
+ to work intuitively rather than blow up.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (lit_s): New symbol.
+ (code2type): Return lit_s for LIT type.
+ (typeof): Return lit_s for TAG_LIT.
+ (replace_str): Error message wording.
+ (obj_init): lit_s interned.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (do_eval): Set last_form_evaled just before
+ dispatching function, so it is not clobbered by argument evaluations.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_op): Use rlcp_tree when constructing the
+ dwim_body, since the append2 copies list structure.
+
+ * parser.y (n_exprs): propagate source loc info from both
+ constituents, giving precedence to the left one, rather than just taking
+ it from the left one and ignoring the second constituent. This fixes
+ cases of missing location info. The left constituent n_expr is often
+ a symbol, and those do not have location info. We want a case like
+ like ((x) y) to take from (x), and (x (y)) to take it from (y),
+ and so on.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (list): For @n_expr, get the source location info
+ from the @ token.
+ (n_expr): Bugfix: do not attribute a symbol with location info.
+ (quasilit): Obtain location info from quasi_items, and only
+ if that is unavailable, then from lineno.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 81
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim: Updated.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (regex_parse, lisp_parse): Better formatting
+ for the context string that serves in place of a filename.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_place): Unnecessary, buggy function removed.
+ It was handling silly special cases with the net effect of being
+ nearly equivalent to just expand, while failing to expand places
+ which are compound macro calls. It did diagnose nonexistent place
+ types at expansion time, which isn't worth much.
+ (expand): All the expansions for the mutating operator sset, inc, dec,
+ push, pop and flip were also pointless and have been removed. they did
+ the precise equivalent of doing expand(rest(form)), and consing the
+ symbol to the front, which is the fallback case for function call
+ forms.
+
+2014-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Make it an error to have implicit function declarations by
+ means of -Werror=implicit-function-declarations. Fix broken mkdir and
+ mknod tests. Regenerate config.make if we add -U__STRICT_ANSI__
+ to the compiler options, so that later tests benefit from this.
+ Regenerate config.make right away if adding -D_DARWIN_C_SOURCE.
+ This allows the makedev test to pass.
+
+ * stream.c: Include <sys/types.h> for makedev.
+ (mknod_wrap): Don't rely on makedev wrappers to be there; test.
+
+2014-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (spec): Bugfix: SECRET_ESCAPE_E should use n_expr
+ not expr. expr is subject to expand_meta.
+ (n_expr): Do not associate source info with character
+ literals.
+ (expand_meta): Bugfix: when walking forms in a collecting loop,
+ propagate the source info to them. Bugfix: attach source
+ info to var and expr expansions.
+ (rl): Rewritten in terms of rlset.
+ (rlset): Only set source info for an object that doesn't already
+ have it.
+
+2014-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_init): Revert qquote, unquote and splice
+ to the system namespace, for hygiene.
+
+ * txr.1: Updated.
+
+2014-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): HAVE_MAKEDEV not HAVE_MKDEV.
+
+2014-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (getcwd_wrap): Implement correct test of getcwd's
+ return value.
+
+2014-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Use -Werror= on the missing prototypes and
+ strict prototypes warnings; these should be errors.
+
+2014-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Added feature tests for makedev, link/symlink/readlink,
+ mkdir and mknod.
+
+ * eval.c (eval_init): Wrap #ifdefs around the registrations of
+ the wrappers for these functions.
+
+ * stream.c (mkdir_wrap): Wrap in #ifdef HAVE_MKDIR, and
+ provide a Windows version if HAVE_MKDIR is missing, but
+ HAVE_WINDOWS_H is true.
+ (makedev_wrap, major_wrap, minor_wrap): Wrap with #if HAVE_MAKEDEV.
+ (mknod): Use #if HAVE_MKNOD.
+ (symlink_wrap, link_wrap, readlink_wrap): Wrap with #if HAVE_SYMLINK.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (debug): Fix 2013-12-02 regression, which leaves the
+ debugger not printing the current line of data.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Intern symlink_wrap, link_wrap, readlink_wrap.
+
+ * stream.c (symlink_wrap, link_wrap, readlink_wrap): New functions.
+
+ * stream.h (symlink_wrap, link_wrap, readlink_wrap): Declared.
+
+ * txr.1: Documented.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register forgotten s_ifsock variable.
+ Register mkdir_wrap, chdir_wrap, getcwd_wrap, makedev_wrap, minor_wrap,
+ major_wrap and mknod_wrap.
+
+ * stream.c (mkdir_wrap, chdir_wrap, getcwd_wrap, makedev_wrap,
+ minor_wrap, major_wrap, mknod_wrap): New functions.
+ (stream_init): Initialize forgotten variable s-ifsock.
+
+ * stream.h (s_ifsock): Declared.
+ (mkdir_wrap, chdir_wrap, getcwd_wrap, makedev_wrap,
+ minor_wrap, major_wrap, mknod_wrap): Declared.
+
+ * txr.1: Forgotten documentation for remove-path and rename-path
+ added. Forgotten mention of s-ifsock. Documented new Unix functions.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Support octal and binary numbers.
+
+ * txr.1: Documented.
+
+ * genvim.txr, txr.vim: Updated.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (modifiers): Bugfix: list element not subject to expansion
+ of Lisp forms denoted by @.
+ (expand_meta): Bugfix: failure to expand vars, which can be
+ symbol macros now.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_print, obj_pprint): Render quasi-quote hash and
+ vector literals using their original notation.
+
+ * parser.y (unquotes_occur): Takes new argument, level.
+ Only finds quotes which are at the given quasiquoting level.
+ Finally, this is the right semantics. In the first version of this
+ function, we were not eager enough: we neglected to find unquotes
+ that were wrapped in nested quasiquotes. Then we were too eager:
+ finding any unquotes, even ones belonging to the inner backquotes.
+ (vector, hash, choose_quote): Pass zero to unquotes_occur function.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_qquote): Bugfix. Was not handling an unquote
+ in the dotted position: (qquote x1 .. xn . (unquote form)),
+ which looks like the structure (qquote x1 .. xn unquote form).
+ Fixed by a hack: after recursively expanding the (unquote form)
+ part (rest of the form), we check whether the unexpanded
+ version has unquote at the front. If so, we know the expansion is just
+ form, and use it to emit the suitable expansion.
+
+2014-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Symbol macros.
+
+ * eval.c (top_smb, defsymacro_s, symacrolet_s): New global variables.
+ (lookup_symac, get_opt_param_syms, get_param_syms, op_defsymacro,
+ expand_symacrolet, make_var_shadowing_env): New static functions.
+ (expand_tree_cases, expand_catch_clause): Install shadowing environment
+ so lexical bindings hide any symbol macrolets.
+ (expand_place): Fix neglect to expand an atomic form, which breaks
+ symbol macros used as places.
+ (expand): Expand symbol macros, expand symacrolet binding forms.
+ Make sure symbol macros are shadowed in the lexical binding
+ constructs. Take advantage of return value of rlcp_tree in a
+ few places.
+ (macro_form_p): Support for symbol macros; bugfix: not handling
+ default argument.
+ (macroexpand_1): Streamlined, and support added for symbol macros.
+ (eval_init): Protect top_smb from gc. Create new hash, stored in
+ top_smb. Initialize defsymacro_s and symacrolet_s.
+ Register op_defsymacro.
+
+ * parser.y (rlcp_tree): Return the to form instead of useless t and nil.
+
+ * txr.1: Documented.
+
+2014-02-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Document quasiquote operator syntax.
+
+2014-02-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (env_fbind, env_vbind): Use acons_new_c, and provide
+ a much more useful return value: the binding cell itself,
+ rather than the symbol.
+ (bind_args): Bugfix: env_vbind was still being called in one case,
+ leading to a neglect to bind a special variable properly.
+ (bindings_helper): Changed interface. Bugfix: in sequential binding,
+ actually bind the successive environments so closures will behave
+ 100% correctly. Returns a list of the actual bindings, in which
+ special variables are not distinguished in any way.
+ (op_let, op_for): Conform to new bindings_helper interface. Use the
+ lexical environment that it returns instead of making a new one.
+ (op_each): Use the environment and list of bindings out of
+ bindings_helper. The bindings are used for stepping the lists,
+ and that includes stepping any special vars. The lexical environment
+ is used for evaluating the body. Thus, we need no special processing
+ for special vars here any more.
+
+2014-02-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bindings_helper): This must now bind dynamic values
+ rather than just assign to them. Got rid of the superfluous variable
+ saving array. Fixed the problem in recognizing the special_s symbol (it
+ is bindable).
+ (op_with_saved_vars): This simplifies, since it no longer needs
+ to save individual variables in an array, only to set up and
+ tear down a new dynamic environment frame.
+ (expand_vars): No longer returns two values with a cons.
+ Takes a form argument for error reporting and a pointer to a boolean
+ just to report whether there are special vars without listing them.
+ (expand_save_specials): The with-saved-specials form doesn't need
+ a var list any more, so the expander is updated not to stick them in.
+ (expand): Update calls to expand_vars to new interface.
+
+2014-02-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (get_string_from_stream): Bugfix: do not abort if
+ stream is not a string stream, but throw a proper error exception.
+
+2014-02-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Get special variable overriding working in function and macro
+ parameter lists.
+
+ There is a bugfix here too (see eval_init below).
+
+ * eval.c (special_s): New global variable. This symbol is used
+ as a marker in parameter lists denoting expander-generating
+ syntax that gives information about specials.
+ (lookup_var, looup_var_l): Bugfix: walk the dynamic chain properly.
+ Fallback from the lexical chain to the dynamic.
+ (env_vbind_special): New static function.
+ (bind_args, bind_macro_params): Detect special list in params. Use
+ env_vbind_special to bind variables either in the dynamic environment
+ or the lexical one.
+ (expand_opt_params, expand_params): Renamed to expand_opt_params_rec
+ and expand_params_rec, respectively. Now take extra argument for
+ accumulating list of special variables found in the param list.
+ (expand_params): New static function.
+ (set_dyn_env): New static function.
+ (interp_fun, expand_macro): Set up and tear down new dynamic
+ environment around parameter list evaluation and body evaluation. This
+ will take any new dynamic bindings.
+ (bindings_helper, op_each): The special_s symbol is now used instead of
+ colon_k for marking specials.
+ (op_defun): Recognize the specials added to the parameter list
+ so as not to t report that as not a bindable symbol.
+ (op_catch): Set up an tear down new dynamic environment around
+ the evaluation of the catch clause param binding and body.
+ (expand_vars): use colon_s symbol instead of colon_k for marking
+ special var.
+ (eval_init): Bugfix: gc-protect recently added dyn_env variable.
+ Intern special symbol into special_s variable.
+
+2014-02-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Introducing some changes for improved handling of special variables.
+ Saving and restoring of individual variables is very silly
+ and it's making it difficult to implement function parameters
+ that are rebindings of special variables.
+
+ Let's have a global pointer to a dynamic environment called dyn_env.
+ Let's make it part of the extended_jmp_buf structure, so that it's
+ implicitly saved and restored across exception handling.
+
+ Special variable lookups go through the dyn_env chain, and fall back on
+ the global bindings.
+
+ To override some specials, we just push a new dynamic environment and
+ stick them there. (As a bonus, the bindings can even be repeated in the
+ lexical environment (i.e. the same objects), so they can be found
+ faster. We have to make sure we remove that environment when we
+ leave the scope in the normal way. If we unwind out, it is done
+ automatically by extended_longjmp mechanism.
+
+ * eval.c (dyn_env): New global variable.
+ (lookup_var, lookup_var_l): If env is nil, look in the dyn_env
+ first, and only if that fails, look in the global bindings top_vb.
+
+ * signal.h (extended_jmp_buf): New member, de, for saving/restoring
+ dyn_env. This structure is now used whether or not we have signals.
+ (extended_setjmp, extended_longjmp): Updated to save and restore
+ dyn_env, and to do it regardless of whether there is POSIX signal
+ support.
+ (dyn_env): Declared here.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (symbol_function): Retrieve the global macro binding if the
+ function lookup fails, and if that fails, retrieve the special
+ operator binding.
+ (fboundp): Report t if there is a global macro binding.
+
+ * txr.1: Use "global" rather than "toplevel". Added note that
+ the fun operator doesn't see macro bindings. Documented that
+ symbol-function and fboundp see global macro bindings,
+ and that symbol-function can retrieve a special operator binding.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (prinl, pprinl): New functions.
+ (eval_init): Registered as intrinsics.
+
+ * txr.1: Documented.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_init): changing the quote, qquote, unquote
+ and splice symbols to be in the regular user package,
+ rather than the system package.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Allow the (. expr) syntax to denote expr.
+
+ * eval.h: Declare existing lambda_s extern variable.
+
+ * lib.c (obj_print, obj_pprint): print (lambda sym ...)
+ as (lambda (. sym) ...) and (lambda sym) as (lambda (. sym)).
+
+ * txr.1: document it.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Implemented macrolet.
+
+ * eval.c (macrolet_s): New variable.
+ (lookup_mac, expand_macrolet): New static functions.
+ (expand): Recognize and expand macrolet form.
+ use lookup_mac to resolve macros rather than gethash,
+ since we have lexical macros now.
+ (eval_init): Intern macrolet symbol.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_macro_params, expand_macro, macroexpand_1, macroexpand):
+ Rename mac_env variable to menv for consistency.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Preparation for lexical macros: we need to pass a macro
+ environment down through the expander call hierarchy.
+
+ * eval.c (expand_opt_params, expand_params, expand_tree_cases,
+ expand_tree_case, expand_forms, val expand_cond_pairs, val
+ expand_place, expand_qquote, expand_vars, expand_quasi, expand_op,
+ expand_catch_clause, expand_catch, expand): All expanders get new
+ parameter, menv. expand_forms and expand handle a nil value of menv.
+ (eval_intrinsic): Pass nil macro environment to expand.
+ (eval_init): Update intrinsic registration for expand.
+
+ * eval.h (expand, expand_forms): Declarations updated.
+
+ * parser.y (expand_meta): Gets macro env parameter.
+ (elem, o_elem, exprs, expr): Pass nil to expand_forms and expand_meta.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Replacing uses of the eq function which are used only as C booleans,
+ with just using the == operator.
+
+ Removing cobj_equal_op since it's indistinguishable from eq.
+
+ Streamlining missingp and null_or_missing_p.
+
+ * eval.c (transform_op): eq to ==.
+ (c_var_ops): cobj_equal_op to eq.
+
+ * filter.c (trie_compress, trie_lookup_feed_char, filter_string_tree,
+ html_hex_continue, html_dec_continue): eq to ==.
+
+ * hash.c (hash_iter_ops): cobj_equal to eq.
+
+ * lib.c (countq, getplist, getplist_f, search_str_tree,
+ posq): eq to ==.
+ (cobj_equal_op): Function removed.
+
+ * lib.h (cobj_equal_op): Declaration removed.
+ (missingp): Becomes a simple macro that yields a C boolean instead
+ of t/nil val, because it's only used that way.
+ (null_or_missing_p): Becomes inline function returning int.
+
+ * match.c (v_output): eq to ==.
+
+ * rand.c (random_state_ops): cobj_equal_op to eq.
+
+ * regex.c (char_set_obj_ops, regex_obj_ops): cobj_equal_op to eq.
+ (reg_derivative): Silly if3 expression replaced by null.
+ (regexp): Redundant if2 expression wrapped around eq removed.
+
+ * stream.c (null_ops, stdio_ops, tail_ops, pipe_ops, string_in_ops,
+ byte_in_ops, string_out_ops, strlist_out_ops, dir_ops,
+ cat_stream_ops): cobj_equal_op to eq.
+
+ * syslog.c (syslog_strm_ops): cobj_equal_op to eq.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ The C function nullp is being renamed to null, and the rarely
+ used global variable null which holds a symbol becomes null_s.
+
+ A new macro called nilp is added that more efficiently checks whether
+ an object is nil, producing a C boolean value rather than t or nil.
+
+ Most of the uses of nullp in the codebase just become the more
+ streamlined nilp.
+
+ * debug.c (show_bindings): nullp to nilp
+
+ * eval.c (lookup_var, lookup_var_l, lookup_fun, lookup_sym_lisp1,
+ do_eval, expand_qquote, expand_quasi, expand_op): nullp to nilp.
+ (op_modplace): nullp to null.
+ (eval_init): Update registration of null and not from C function
+ nullp to null.
+
+ * filter.c (trie_compress, html_hex_continue): nullp to nil.
+ (filter_string_tree): null to null_s.
+
+ * hash.c (hash_next): nullp to nilp.
+
+ * lib.c (null): Variable renamed to null_s.
+ (code2type): null to null_s.
+ (lazy_flatten_scan, chainv, lazy_str, lazy_str_force_upto,
+ obj_print, obj_pprint):
+ nullp to nilp.
+ (obj_init): null to null_s; nullp to null.
+
+ * lib.h (null): declaration changed to null_s.
+ (nullp): Inline function renamed to null.
+ (nilp): New macro.
+
+ * match.c (do_match_line): nullp to nilp.
+
+ * rand.c (make_random_state): Likewise.
+
+ * regex.c (compile_regex): Likewise.
+
+2014-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Bugfix, I think. :) We do not need to call the expander
+ for a Lisp expression in a quasistring, and doing so leads to a
+ potentially incorrect double expansion because the whole thing
+ will be expanded again, either by the TXR Lisp quasi operator's
+ expander (if this is a quasiliteral in Lisp) or in the TXR
+ pattern language, by expand_meta, which hunts down down @ expressions
+ and expands them.
+
+2014-02-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing special variables with local overriding.
+ All predefined globals become special.
+
+ * eval.c (special, with_saved_vars_s): New global variables.
+ (mark_special, special_p): New functions.
+ (bindings_helper): Takes new argument, include_specials.
+ Now processes the special colon syntax for denoting special variables,
+ setting up their values, taking care to observe whether the
+ binding is parallel or sequential.
+ (op_let, op_for): Pass new argument to bindings_helper.
+ (op_each): Pass new argument to bindings_helper with a value of it,
+ and deal with the colon annotations that emerge in the bindings.
+ (op_defvar, regvar): Mark symbol as special.
+ (op_with_saved_vars): New static function.
+ (expand_vars): Takes new argument, returns a cons. Detects special
+ variables among the vars and produces the colon syntax.
+ (expand_catch_clause): Bugfix: this was using expand_vars on
+ a parameter list. Now properly uses expand_params.
+ (expand_save_specials): New static function.
+ (expand): For the operators that are binding constructs, handle
+ the new form of expand_vars which returns information about
+ special variables. If specials occur, then generate the
+ with-saved-vars form around the expansion which will save and restore
+ their values. The expansion of vars done by expand_vars, together
+ with the run-time actions of bindings_helper, do the rest.
+ Speaking of which, the new with-saved-vars operator form is now
+ expanded here too.
+ (eval_init): Protect new variables special and with_saved_vars_s.
+ Initialize special with new hash table. Store new interned
+ symbol in with_saved_vars_s. Register op_with_save_vars in op_table.
+
+ * txr.1: Documented specials.
+
+2014-02-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (subst_vars): Change throwing of query_error_s
+ to eval_error call. This is a leftover from when this was cloned
+ from its counterpart in match.c. However, I can't think of a way
+ this call can ever be reached.
+
+2014-02-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (macro_form_p, macroexpand_1, macroexpand): New static
+ functions.
+ (eval_init): Registered new functions.
+
+ * txr.1: Documented.
+
+2014-02-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (unquotes_occur): Bugfix: we should not terminate
+ the recursion early if we see a quote. This would be true if
+ the only quotes were those generated by the parser based on
+ calls to choose_quote. However, it breaks for something
+ like an explicitly coded '(sys:quote ,form), which becomes
+ (sys:quote (sys:quote ,form)), leaving a dangling unquote.
+
+2014-02-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/faster-square-root (mp_sqrt): Bugfix: was computing square
+ roots that were incorrect in the last digit/bit, because it was not
+ generating the guess mask all the way down to bit zero. Also, added
+ an early test to bail the loop when an the guess at the root happens
+ to be right.
+
+ * mpi-patches/add-bitops: Refreshed.
+
+ * mpi-patches/fix-ctype-warnings: Likewise.
+
+ * mpi-patches/mpi-to-double: Likewise.
+
+2014-02-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing a long-running issue in the TXR pattern language: premature
+ opening of files, prior to directives that actually need data.
+ The documentation basically lied that this is the case: namely,
+ the text "A file isn't opened until the query demands material from
+ that file, and then the contents are read on demand, not all at
+ once." This is now a fact.
+
+ * match.c (non_matching_directive_table): New global variable.
+ (open_data_source): New static function. Contains an almost
+ verbatim migration of the source-opening logic that used
+ to be in match_files. The useless assignment to c->nil is gone,
+ and c->data == t is explicitly tested for. Instead of assuming
+ that only the @(next) directive does not need to have a data source
+ open, the table of non-matching directives is consulted. Opening
+ the data source is now skipped for numerous directives.
+ (match_files): Call open_data_source within the loop. This
+ means that even after processing numerous non-matching directives,
+ we will still correctly set up the data lazy list.
+ (dir_tables_init): Initialize non_matching_directive_table,
+ protect from GC and populate with numerous directives.
+
+ * txr.1: Improved documentation for @(next :args), and removed
+ a description of the hack that a single @(next) at the top of the
+ query suppressed the opening of the data source.
+
+2014-02-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (env_hash): new function.
+ (eval_init): Register env and env_hash functions. Register prog_args
+ and prog_args_full as *args* and *full-args*.
+
+ * lib.c (timegm_hack): Invalidate env_list, after mucking with
+ the environment via setenv and unsetenv.
+
+ * txr.c (prog_args_full, prog_args): New global variables.
+ (txr_main): Command-line processing converted to use TXR's
+ library. Populates prog_args_full and prog_args.
+
+ * txr.h (prog_args_full, prog_args): Declared.
+
+ * txr.1: Documented *args*, *full-args*, env and env-hash.
+
+2014-02-18 Kaz Kylheku <kaz@kylheku.com>
+
+ The mode argument in some stream-opening functions becomes optional.
+
+ * eval.c (eval_init): Change registration for open_file, open_tail
+ and open_command.
+
+ * stream.c (open_file, open_tail, open_command): mode_str argument
+ defaulted.
+
+ * txr.1: Updated.
+
+2014-02-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (open_tail): Fix 2013-12-02 regression:
+ seek_to_end_p argument being ignored, with the
+ behavior being no initial seek to the end.
+
+ * txr.1: Clarified the behavior of the seek-to-end-p
+ option.
+
+2014-02-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * combi.c (rperm_gen_full): Update ptail with return value
+ of list_collect. This is not necessary for correctness, but it spares
+ list_collect from having to search for the tail on each call.
+
+2014-02-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 80
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim, dep.mk: Updated.
+
+2014-02-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_args, op_defvar, op_defun, op_defmacro, op_modplace):
+ Fix sybol misspelling.
+
+2014-02-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register gensym function as the gensym
+ intrinsic, rather than gensymv.
+ Register gensym_counter as *gensym-counter*.
+
+ * lib.c (gensym): Handle missing prefix argument by defaulting
+ the prefix to "g".
+ (gensymv): Function removed.
+
+ * lib.h (gensymv): Declaration removed.
+
+ * txr.1: Fixed omission: missing documentation for gensym.
+ Documented *gensym-counter*.
+
+2014-02-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand): Bugfix: do not expand any part of the macro
+ form via expand_forms. This is completely wrong since only the
+ macro knows what material is evaluated and what isn't.
+
+2014-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_tree_case): Removed superfluous handling of
+ nil parameter list; this is correctly handled by bind_macro_params.
+ Added support for the colon symbol as an indication that
+ the case is declined.
+
+ * txr.1: Updated.
+
+2014-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ New destructuring operators.
+
+ * eval.c (tree_case_s, tree_bind_s): New symbol variables.
+ (bind_macro_params): Bugfix: inappropriate exception thrown when atom
+ matched against parameter list. Bugfix: nil being returned when
+ atom matches empty parameter list. Added support for a new convention:
+ if loose_p is the colon keyword, then exceptions are not thrown
+ for destructuring mismatches; nil is returned instad.
+ (op_tree_case, expand_tree_cases, expand_tree_case, op_tree_bind):
+ New static functions.
+ (expand): Handle tree_case_s and tree_bind_s.
+ (eval_init): Intern tree-case and tree-bind symbols.
+ Register the corresponding operator functions op_tree_case and
+ op_tree_bind under these symbols in op_table.
+
+ * txr.1: Documented tree-case and tree-bind operators.
+
+2014-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_macro_params): Bugfix: enforce mismatch on
+ superfluous material.
+
+2014-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ In the spirit of the previous hack, here is another hack to
+ alleviate a long-standing pain: when an exception happens in
+ TXR's library somewhere, the program dies without leaving
+ a clue about what code was being evaluated when that happened.
+ What we can do is have the evaluator publish the most recent
+ compound form it has processed by stashing it in a variable.
+ Then when an unhandled exception occurs, we can peek at that
+ and try to pull out source location info.
+
+ * eval.c (last_form_evaled): New variable.
+ (do_eval): When evaluating a compound form, stash it in
+ last_form_evaled.
+ (eval_init): Protect last_form_evaled from gc.
+
+ * eval.h (last_form_evaled): Declared.
+ (eval_error_s): Existing variable declared.
+
+ * unwind.c: Has to include "eval.h" for the above variable
+ and "parser.h" for the source_loc function.
+ (uw_throw): When an exception is unhandled, if
+ last_form_evaled has source info, add it to the diagnostic.
+ But not if the exception is eval-error; because errors from
+ the evaluators already have the info.
+
+2014-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Nice idea: how about a function which walks the tree structure and
+ back-fills some missing source code location info. We apply this to
+ macro expansions. If some error occurs in expanded code, this way it
+ is referenced to the line where the macro *call* occurs.
+ Not only is this better than nothing, it may be better than tracing
+ it to the macro definition. Ideally, we would have both places:
+ ("the error is in the code expanded from this macro, at this site").
+
+ * eval.c (expand): Use rlcp_tree to back-fill source info in
+ macro expansion by taking it from the unexpanded form.
+
+ * parser.h (rlcp_tree): Declared.
+
+ * parser.y (rlcp_tree): New function.
+
+2014-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfixes: not propagating source loc info in quasiliterals.
+
+ * eval.c (expand_quasi): Add some rlcp's here.
+
+ * parser.y (o_var, quasi_items, o_elems_transform): Likewise.
+
+2014-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand): Replace blatant tail calls with
+ a backwards goto.
+
+2014-02-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_macro_params): Bugfix: the :whole parameter must
+ capture the entire form, not just the arguments.
+ (expand): Apply rlcp to the result of macro expansion, if it has
+ not set up source code location.
+ (eval_init): Register rlcp as intrinsic.
+
+ * txr.1: Start of macro documentation. Documented rlcp.
+
+2014-02-15 Kaz Kylheku <kaz@kylheku.com>
+
+ First cut at implementation of macros.
+
+ * eval.c (top_mb, defmacro_s, macro_time_s, whole_k, env_k): New global
+ variables.
+ (expand_params): Recurse to handle macro parameter lists too.
+ (bind_macro_params, op_defmacro, expand_macro): New static functions.
+ (expand): Evaluate defmacro forms and macro-time forms at expansion
+ time. Recognize and expand macros (albeit not yet with proper lexical
+ scoping: local bindings are not able to shadow a macro).
+ (eval_init): Protect top_mb from GC and initialize it.
+ Intern new symbols defmacro, macro-time, and :whole.
+ Register defmacro operator in op_table.
+
+ * match.h (env_k): Added declaration for existing external variable.
+
+2014-02-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: parameters of defun were not being treated by expander.
+ They need to be since they can contain evaluable initforms for default
+ arguments. Ditto with lambda; lambda parameters were being treated
+ using expand_vars, which is not appropriate.
+
+ * eval.c (expand_opt_params, expand_params): New static functions.
+ (expand_vars): Bugfix: added some missing rlcp's to propagate
+ line number info.
+ (expand): Move lambda to separate case, and expand its params
+
+2014-02-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_args, op_modplace): Use ~s consistently
+ in error messages.
+
+2014-02-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bindings_helper): Fixed misspelling of "symbol" in exception
+ message.
+
+2014-02-15 Kaz Kylheku <kaz@kylheku.com>
+
+ A trivial change in the UTF-8 decoder allows TXR to handle null bytes
+ in text.
+
+ * utf8.h (UTF8_ADMIT_NUL): New preprocessor symbol.
+ (utf8_decoder): New member, flags.
+
+ * utf8.c (utf8_decoder_init): Initialize flags to 0.
+ (utf8_decode): If a null byte is encountered in the input,
+ then convert it to 0xDC00, rather than keeping it as zero,
+ unless flags contains UTF8_ADMIT_NUL.
+
+ * txr.1: Document handling of null bytes.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_update): Avoid double cdr.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (inhash): Simplify with gethash_c.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ Replacing acons_new_l and aconsq_new_l interfaces with ones
+ that return the new or old cons cell rather than a pointer
+ to its cdr field.
+
+ * eval.c (transform_op): use of acons_new_l replaced with
+ acons_new_c.
+
+ * hash.c (struct hash): acons_new_l_fun member replaced
+ with acons_new_c_fun.
+ (make_hash, make_similar_hash): initialize acons_new_l_fun
+ member using either acons_new_c or aconsql_new_c.
+ (gethash_l): function becomes an inline in hash.h.
+ (gethash_c): new function, based on gethash_l.
+ (inhash, gethash_n): updated w.r.t struct hash change.
+
+ * hash.h (gethash_c): declared.
+ (gethash_l): becomes an inline wrapper for gethash_c.
+
+ * lib.c (acons_new_l, aconsql_new_l): functions removed.
+ (acons_new_c, aconsql_new_c): new functions.
+ (obj_init): use gethash_c and rplacd instead of gethash_l
+ and set.
+
+ * lib.h (acons_new_l, aconsql_new_l): declarations removed.
+ (acons_new_c, aconsql_new_c): declared.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (inhash): Simplify code with gethash_f.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Registered hash_update_1 as intrinsic.
+
+ * hash.c (hash_update_1): New function.
+
+ * hash.h (hash_update_1): Declared.
+
+ * txr.1: Documented hash-update-1.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (inhash): Rename local variable from new to new_p.
+ This is consistent with usage elsewhere in the module,
+ and more importantly, keeps our code C++.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (class_check): Bugfix: the function was assuming that
+ the argument is a pointer type object, leading to a crash
+ if given a fixnum integer or string literal.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register inhash as intrinsic.
+
+ * hash.c (inhash): New function.
+
+ * hash.h (inhash): Declared.
+
+ * txr.1: Documented inhash. Also, added surprisingly missing
+ documentation for gethash!
+
+2014-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Different approach: optional arguments on hash-isec and hash-uni allow
+ for more flexible joining of data from the hash tables.
+
+ * eval.c (eval_init): Remove hash_guni and hash_gisec. Change
+ registration for hash_uni and hash_isec to three arguments with
+ one optional.
+
+ * hash.c (hash_uni): Third parameter introduced, join_func.
+ The default behavior changes: in the two argument case,
+ clashing keys prefer the value from hash1 rather than hash2.
+ For this reason, we now iterate over hash2 first, then hash1.
+ (hash_guni): Removed.
+ (hash_isec): Third parameter introduced, join_func.
+ (hash_gisec): Removed.
+
+ * hash.h (hash_uni, hash_isec): Declarations updated.
+ (hash_guni, hash_gisec): Delarations removed.
+
+ * txr.1: Documentation updated.
+
+2014-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register hash_guni and hash_gisec as intrinsics.
+
+ * hash.c (hash_guni, hash_gisec): New functions.
+ (hash_isec): Bugfix: since gethash was naively used, keys in hash2
+ associated with the value nil were erroneously omitted from the
+ intersection.
+
+ * hash.h (hash_guni, hash_gisec): Declared.
+
+ * txr.1: Documented new functions.
+
+2014-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Disallow syntax like 1.0a, flagging it as
+ an invalid floating-point token. The problem is that 1a is allowed,
+ for compatibility with other Lisp dialects (it is a symbol) whereas
+ 1.0a was scanning as 1.0 followed by a, which is inconsistent.
+ Some Lisp dialects embedded dots in symbols, and allow 1.0a
+ as a symbol token. We don't.
+
+2014-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (struct hash): New member, equal_fun.
+ (hash_equal_op): Short circuited logic: whenever we pull
+ identical cells from either hash, we don't have to go
+ through the pending lookaside list.
+ (make_hash, make_similar_hash): Initialize new structure member.
+
+2014-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_equal_op, hash_hash_op): New static functions.
+ (hash_ops): New functions registered in table of operations.
+
+ * txr.1: Documentation for equal function updated to explain
+ how two hashes are equal.
+
+2014-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Undoing bogus optimization, which can only work when objects
+ are treated as immutable.
+
+ * hash.c (last_equal_key, last_equal_hash): Variables removed.
+ (equal_hash, hash_process_weak): All references to removed
+ variables scrubbed.
+
+2014-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (some_satisfy, all_satisfy, none_satisfy): Fix coding
+ mistake from two commits ago leading to a regression.
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register new functions posqual, posql,
+ posq, pos, and pos_if as intrinsics.
+
+ * lib.c (posqual, posql, posq, pos, pos_if): New functions.
+
+ * lib.h (posqual, posql, posq, pos, pos_if): Declared.
+
+ * txr.1: Documented
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Turn a require argument into an optional
+ one for the functions some, all and none.
+
+ * lib.c (some_satisfy, all_satisfy, none_satisfy): Add defaulting
+ behavior for pred parameter.
+
+ * txr.1: Document that the predicate function is optional
+ in calls to some, all and none.
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 79
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (if_fun): Bugfix: forgotten handling of optional
+ alternative argument.
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (subst_vars): Bugfix: results of expressions not
+ treated in the same way as variables: lists not stringified,
+ causing expansions with parentheses, and sometimes errors
+ due to unhandled objects. Also, use tostringp instead of
+ format for stringifying objects.
+ stringifying object. Bugfix.k
+
+ * match.c (subst_vars): Added comment similar to the one in
+ the subst_vars of eval.c. Removed superfluous conversion code where the
+ str variable is already known to be a string.
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (apply): Fix regression in dwim operator: not handling
+ nil object properly. Since dwim now trivially delegates to apply,
+ apply must recognize nil.
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * combi.c (comb_hash_while_fun, comb_hash_gen_fun, comb_hash): New
+ static functions.
+ (comb): Support hash tables.
+
+ * hash.c (print_key_val): When values are nil, print in a more condensed
+ way by omitting the second element. This notation is accepted as
+ input already by the parser.
+ (hash_insert_pair): New function.
+
+ * txr.1: Description of comb updated to indicate that it works over
+ hashes.
+
+2014-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c: Remove inclusion of unneeded headers: <limits.h>
+ and <dirent.h>.
+
+2014-02-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (OBJS): New object file, combi.o.
+
+ * dep.mk: Updated.
+
+ * eval.c: Removed combination and permutation functions; they
+ now reside in combi.c.
+ (generate): Changed from static to external linkage.
+
+ * eval.h (generate): Declared.
+
+ * combi.c: New file.
+
+ * combi.h: New file.
+
+ * txr.vim: Regenerated.
+
+2014-02-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rcomb_gen_fun_common): Streamlined implementation.
+ Got rid of stack that is consed up on each call.
+
+2014-02-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Relaxed behavior: don't throw errors for impossible permutations,
+ but return an empty list.
+
+ * eval.c (perm_init_common): Do not throw error; return a nil
+ state if permutation length exceeds sequence length.
+ (perm_vec, perm_list, perm_str): Check for null return from
+ perm_init_common and return empty list.
+ (k_conses): Do not throw error; return empty list.
+ (comb_list_gen_fun): Check for nil value out of k_conses.
+ (comb): For vectors and strings, check length against k and
+ return nil if necessary. For lists, comb_list_gen_fun handles it.
+
+ * txr.1: Section order rearranged, and updated.
+
+2014-02-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rcomb_while_fun, rcomb_gen_fun_common,
+ rcomb_list_gen_fun, rcomb_list, rcomb_vec_gen_fun, rcomb_vec,
+ rcomb_str_gen_fun, rcomb_str, rcomb): New static functions.
+ (eval_init): Register rcomb as intrinsic.
+
+ * txr.1: Documented rcomb.
+
+2014-02-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rperm, perm_str): Just in case, return a mutable empty
+ string, rather than null_string, which is a literal.
+ (k_conses, comb_while_fun, comb_gen_fun_common,
+ comb_list_gen_fun, comb_list, comb_vec_gen_fun, comb_vec,
+ comb_str_gen_fun, comb_str, comb): New static functions.
+ (eval_init): Registered comb as instrinsic.
+
+ * txr.1: Documented comb.
+
+2014-02-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rperm_list, rperm_vec, rperm_str): n variable renamed
+ to k, for consistency with rperm.
+ (rperm): Likewise, and the behavior in the k == zero case is
+ changed to return a single empty permutation.
+ (perm_while_fun, perm_index, perm_gen_fun_common, perm_init_common,
+ perm_vec_gen_fill, perm_vec_gen_fun, perm_vec,
+ perm_list_gen_fill, perm_list_gen_fun, perm_list,
+ perm_str_gen_fill, perm_str_gen_fun, perm_str, perm): New
+ static functions.
+ (eval_init): perm registered as intrinsic.
+
+ * lib.c (vecref_l): Bugfix: allow negative indices, just like vecref.
+
+ * lib.h (three, four): New macros.
+
+ * txr.1: Updated documentation for rperm. Documented perm.
+
+2014-02-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (vector, vec_set_length, cat_vec): When the vector size
+ overflows the size_t type that is passed to malloc, throw an exception.
+
+2014-02-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (nperm_while_fun, nperm_gen_fun, nperm_list,
+ nperm_vec_gen_fun, nperm_vec, nperm_str_gen_fun, nperm_str, nperm): New
+ static functions.
+ (eval_init): nperm registered as intrinsic.
+
+ * txr.1: Documented nperm function.
+
+2014-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 78
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim: Updated.
+
+2014-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (int_str): Regression: handle base argument properly.
+
+2014-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_grow, make_hash, make_similar_hash, copy_hash):
+ Pass second argument to vector.
+
+ * lib.c (vector): Takes additional argument specifying the value
+ for the slots of the vector.
+ (vector_list, sub_vec): Pass second argument to vector.
+
+ * lib.h (vector): Declaration updated.
+
+ * eval.c (eval_init): Register vector as two-argument function
+ with one required arg.
+
+ * txr.1: Updated.
+
+2014-02-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_dwim): Gutted down to just a few lines.
+ Basically the dwim operator is just a Lisp-1 version of the call
+ operator now. It doesn't have to do anything funny with non-function
+ objects, since they are callable.
+
+ * lib.c (chr_str, chr_str_set, vecref, vecref_l): Replace
+ inappropriate internal assertions with error exceptions.
+
+ * unwind.h (numeric_assert, range_bug_unless): Unused macros
+ removed.
+
+2014-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (generic_funcall): If a cons cell is passed as
+ one argument to a sequence being used as a function, split it into two
+ arguments. This is consistent with the DWIM operator behavior.
+
+ * txr.1: Document callable objects.
+
+2014-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow sequences and hashes to be called as functions.
+ This is already supported in the DWIM operator.
+
+ * eval.c (apply): If object isn't a function, gather the
+ arguments into an array and delegate to generic_funcall.
+
+ * lib.c (generic_funcall): Changed from static to external linkage.
+ Supports sequences and hashes as functions. Error messages
+ fixed not to refer to "funcall".
+ (funcall, funcall1, funcall2, funcall3, funcall4): Do not throw
+ exception if fun is not of FUN type; instead, delegate
+ to generic_funcall. Error messages fixed not to refer to "funcall".
+
+ * lib.h (generic_function): Declared.
+
+2014-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (lognot): Conform to new scheme for defaulting optional args.
+
+ * eval.c (apply): Unconditionally use colon_k for missing optional
+ args, for intrinsic functions.
+ (eval_intrinsic, rangev, rangev_star, errno_wrap): Conform to new
+ scheme for defaulting optional args.
+ (reg_fun_mark): Function removed.
+ (eval_init): Switch reduce_left and reduce_right back to reg_fun
+ registration.
+
+ * hash.c (gethash_n): Conform to new scheme for defaulting optional
+ arguments.
+
+ * lib.c (sub_list, replace_list, remove_if, keep_if, remove_if_lazy,
+ keep_if_lazy, tree_find, count_if, some_satisfy, all_satisfy,
+ none_satisfy, search_str, match_str, match_str_tree, sub_str,
+ replace_str, cat_str, tok_str, intern, rehome_sym, sub_vec,
+ replace_vec, lazy_str, sort, multi_sort, find, find_if, set_diff,
+ obj_print, obj_pprint): Conform to new scheme for defaulting optional
+ arguments.
+ (func_f0, func_f1, func_f2, func_f3, func_f4, func_n0, func_n1,
+ func_n2, func_n3, func_n4, func_n5, func_n6, func_n7, func_f0v,
+ func_f1v, func_f2v, func_f3v, func_f4v, func_n0v, func_n1v,
+ func_n2v, func_n3v, func_n4v, func_n5v, func_n6v, func_n7v):
+ Remove references to removed mark_missing_args member of struct func.
+ (func_set_mark_missing): Function removed.
+ (generic_funcall): Unconditionally use colon_k for missing optional
+ args, for intrinsic functions.
+
+ * lib.h (struct func): mark_missing_args member removed.
+ (func_set_mark_missing): Declaration removed.
+ (default_arg, default_bool_arg): New inline functions.
+
+ * rand.c (random): Left argument is not optional.
+ (rnd): Conform to new scheme for defaulting optional arguments.
+
+ * regex.c (search_regex, match_regex): Conform to new scheme for
+ defaulting optional arguments.
+
+ * stream.c (unget_char, unget_byte, put_string, put_char, put_byte,
+ put_line): Conform to new scheme for defaulting optional arguments.
+
+ * syslog.c (openlog_wrap): Conform to new scheme for defaulting
+ optional arguments.
+
+ * txr.1: Remove the specification that nil is a sentinel value in
+ default arguments, where necessary. Use consistent syntax for
+ specifying variable parts in argument lists. A few errors and omissions
+ addressed.
+
+2014-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_args): Support optional parameters in the
+ form (sym initform present-p-sym). Also, support the convention
+ that a value of : explicitly passed for an optional argument produces
+ the same behavior as if that argument value were missing.
+
+ * txr.1: Document new conventions.
+
+2014-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (apply): Pass missing optional arguments as colon_k.
+ to functions for which this is requested.
+ (reg_fun_mark): New static function.
+ (eval_init): Register reduce_left and reduce_right as requiring
+ marking for missing optionals.
+
+ * lib.c (func_set_mark_missing): New function.
+ (generic_funcall): Pass missing optional arguments as colon_k
+ to functions for which this is requested.
+ (reduce_left, reduce_right): Handle missing values of init and key.
+ (func_f0, func_f1, func_f2, func_f3, func_f4, func_n0, func_n1,
+ func_n2, func_n3, func_n4, func_n5, func_n6, func_n7, func_f0v,
+ func_f1v, func_f2v, func_f3v, func_f4v, func_n0v, func_n1v,
+ func_n2v, func_n3v, func_n4v, func_n5v, func_n6v, func_n7v):
+ Initialize new mark_missing_args member of struct func.
+
+ * lib.h (struct func): New bitfield member, mark_missing_args.
+ (func_set_mark_missing): Declared.
+ (missingp, null_or_missing_p): New inline functions.
+
+ * txr.1: Updated descriptions of reduce-left and reduce-right.
+
+2014-02-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (nullp): Function removed.
+
+ * lib.h (nullp): New inline function.
+ (eq): Removed useless parentheses: it's not a macro.
+
+2014-02-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_modplace): Fixing a few argument count mismatches
+ in format calls.
+
+2014-02-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Tighten up environment visibility semantics of default argument
+ init forms, while streamlining the implementation.
+
+ * eval.c (bind_args): Get rid of opt_init_parm array hack;
+ turns out we already have a useful function for extending an
+ environment object, namely env_vbind: hitherto unused! We now make a
+ blank environment upfront and extend it destructively with env_vbind.
+ Except that after evaluating an init form, we create a new environment:
+ this is in case a lexical closure was made by the init form, in which
+ event we don't want to be destructively manipulating the environment
+ any more.
+
+ * txr.1: Clarified.
+
+2014-02-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Fix incorrect registration of
+ list_star_intrinsic, diagnosed by compiler.
+
+2014-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding list* since we get it "for free" thanks to the
+ new helper function that supports apply.
+
+ * eval.c (list_star_intrinsic): New static function.
+ (eval_init): Register list_star_intrinsic as list*.
+
+ * txr.1: Document list*.
+
+2014-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ append can now take additional leading arguments before the list.
+
+ * eval.c (apply_frob_args): New static function.
+ (apply_intrinsic): Process arguments with apply_frob_args.
+ (eval_init): apply_intrinsic registered differently, as a
+ variadic function with one mandatory arg.
+
+ * lib.c (lastcons): New function.
+
+ * lib.h (lastcons): Declared.
+
+ * txr.1: Updated append documentation.
+
+2014-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (apply): Support string and vector arglist.
+ (do_eval_args): Support string or vector in dot position.
+
+ * lib.c (tolist): New function.
+
+ * lib.h (tolist): Declared.
+
+ * txr.1: Document how apply and dot position in compound forms
+ supports strings as well as vectors.
+
+2014-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (do_eval_args): If the dotted position of the argument
+ list evaluates to a vector, then convert the vector to a list.
+
+ * txr.1: Document compound forms, and how they allow the dotted
+ position and how it may be a vector.
+
+2014-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register vector_list function a second time
+ under the name vec, as a variadic function.
+
+ * txr.1: Document vec.
+
+2014-02-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_mark, hash_grow, make_similar_hash,
+ copy_hash, gethash_l, gethash, gethash_f, gethash_n,
+ hash_count, hash_next, hash_eql, hash_equal): Use
+ num_fast instead of num.
+ (make_hash): An attempt to make a weak-keys hash that has
+ equal-based keys is nonsensical; it is now diagnosed with
+ an exception. Use num_fast instead of num.
+ (hash_process_weak): Call breakpt whenever the weak object(s) due to
+ which entries are being deleted match the value in break_obj.
+ Use num_fast instead of num.
+
+ * parser.l (parse_init): Bugfix: the forms_to_ln_hash
+ was equal-based, which makes no sense.
+
+2014-02-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Export break_obj.
+
+ * gc.c (break_obj): Change to external linkage.
+ (mark): Use t variable instead of re-evaluating obj->t.type.
+
+ * gc.h (break_obj): Declared.
+
+2014-02-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (d): Disable garbage collection around the dump.
+ It's importa for this function not to have the side effect
+ of triggering garbage collection, when it is used for
+ debugging issues that show up under --gc-debug.
+
+2014-01-31 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: remove stray debugging printf from the
+ GNU Make check. This was introduced in May 2012.
+
+2014-01-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Support floating-point constants.
+ Do not color embedded decimal integers in symbols as integers.
+
+ * txr.vim: Regenerated.
+
+2014-01-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_op): When the variant is do, and the symbol
+ is an operator, then suppress the addition of the rest
+ parameter in the dotted cons position at the end of the form,
+ since this mechanism for applying additional arguments is only
+ supported by function calls, not by special forms.
+
+ * lib.h (and2, and3): New macros.
+
+2014-01-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_op): Fix broken do operator. In the case of the do
+ operator, we must feed the entire form to the expander, not the
+ individual forms. That is to say (do operator arg) must expand the
+ form (operator arg), whereas (op fun arg) just expands the forms fun
+ and arg individually.
+
+2014-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 77
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim: Updated.
+
+2014-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * regex.c (match_regex_right): Fix not returning value.
+
+2014-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Default argument initializer scoping rule change, allowing
+ things like (defun foo (s : (l (length s))) ...).
+ Default arguments can be initialized by expressions that
+ refer to the arguments.
+
+ * eval.c (bind_args): By means of a local array, defer the evaluation
+ of optional argument init forms until the lexical environment,
+ including all the parameters, is captured. Then valuates the forms
+ in the array, and set the variable values.
+
+ * txr.1: Clarify the new scoping rules.
+
+2014-01-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Registered existing make_catenated_stream as
+ intrinsic.
+
+ * stream.c (cat_get_line, cat_get_char, cat_get_byte): Do not
+ remove the last stream from the stream list, so that there is
+ some stream object there which can take the unget-char or
+ unget-byte operations.
+ (cat_unget_byte, cat_unget_char): New static functions.
+ (cat_stream_ops): unget_char and unget_byte function pointers
+ filled in.
+
+ * txr.1: Documented catenated-streams.
+
+2014-01-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (struct stdio_handle): New member, is_rotated.
+ Moved mode member down.
+ (make_stdio_stream_common): Initialize is_rotated.
+ (tail_strategy): Substantially rewritten in order to address
+ a possible race condition, when a file is rotated.
+ The issue is that even when the file disappears, or when the file has
+ been replaced, we must continue reading from the old stream until the
+ end, and only then can we switch to the newly rotated file.
+
+2014-01-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (remove_path, rename_path): New functions.
+
+ * stream.h (remove_path, rename_path): Declared.
+
+ * utf8.c (w_remove, w_rename): New functions.
+
+ * utf8.h (w_remove, w_rename): Declared.
+
+ * eval.c (eval_init): Registered remove_path and rename_path
+ as intrinsics.
+
+2014-01-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (meta_meta_p, meta_meta_strip): New static functions.
+ (transform_op): Recognize compounded metas, and strip one level off.
+ (eval_init): Intern sys:expand function so we have access to the
+ form expander from TXR Lisp.
+
+ * lib.c (obj_print, obj_pprint): Fix: wasn't rendering metanumbers.
+
+ * parser.y (list): Support @ in front of anything. If it's an atom,
+ treat it similarly to a metasymbol or metanumber.
+
+ * txr.1: Documented meta-meta arguments in nested op.
+
+ * genvim.txr, txr.vim: Support coloring for compounded meta syntax.
+
+2014-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Lexing and parsing improvements, leaving things less hacky than before,
+ albeit hacky.
+
+ * parser.l (BSYM, NSYM): Regex definitions gone.
+ (BT0, BT1, BT2, NT0, NT1, NT2): New regex definitions.
+ (BTREG, BTKEY, NTREG, NTKEY): Rewritten, so that they cannot
+ match a lone @ character as a symbol name.
+ (grammar): Rules for returning METAPAR, METABKT and METAQUO
+ are gone. Instead, we just recognize a @ in the NESTED
+ and BRACED states and return it as a token.
+
+ * parser.y (METAPAR, METABKT, METAQUO): Token types removed.
+ (meta_expr): Nonterminal symbol removed.
+ ('@'): New token type.
+ (list): Quotes and splices handling removed from this rule.
+ The new token '@' is handled here, on the other hand, because
+ there are places that reference the list rule that need to support
+ @ expressions.
+ (n_expr): Reference to meta_expr removed. Quote, unquote and splice
+ added here.
+ (yybadtoken): Removed references to METAPAR, METABKT and METAQUO.
+
+ * txr.vim, genvim.txr: There can now be whitespace in TXR Lisp
+ like @ (a b c) and @ [1 2 3].
+
+2014-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (yybadtoken): Handle METAQUO in switch.
+
+2014-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (reduce_left, reduce_right): changing the behavior so that
+ the initial value is optional. this creates the possibility that
+ the effective list of operands is empty, in which case the function
+ must support a call with no arguments, just like in the common lisp
+ reduce.
+
+ * txr.1: rewrote reduce-left and reduce-right documentation.
+
+2014-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_print, obj_pprint): Bugfix: there may be
+ additional expressions forms in (sys:var <sym>) after
+ the sym. These were not being printed. Such syntax occurs
+ often in the TXR pattern language.
+
+2014-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * regex.c (match_regex_right): New function.
+
+ * regex.h (match_regex_right): Declared.
+
+ * eval.c (eval_init): Register match_regex_right as instrinsic.
+
+2014-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing more correct treatment of meta forms
+ like @[...] and @(...) occurring in the TXR pattern language.
+
+ The previous behavior is that the parser always expands the interior
+ of these forms when they occur. This is wrong.
+
+ These forms only denote TXR Lisp (and so require expansion) when they
+ occur in a directive, inside a sub-expression that is not already known
+ to be Lisp.
+
+ For instance in @(do @(op foo)), the inner @(op foo) should not be
+ subject to expansion. The reason that the argument forms of @(do)
+ are TXR Lisp. The @(op foo) form denotes (sys:expr foo), and that
+ operator currently has no meaning; and so we should not expand it.
+ The previous, buggy behavior would turn the @(op ..) into
+ a @(lambda ...).
+
+ Another example is @(bind a @(list @(op foo))) where @(list ...)
+ denotes TXR Lisp and so the interior of the form should be expanded.
+ However, the @(op foo) should not be expanded into @(lambda ...)
+
+ Expanding @(...) forms is not currently harmful, but it interferes
+ with code that wants to use the @(...) syntax for its own use,
+
+ The solution involves adding shims in the parser so that the expansion
+ is only applied when expressions are reduced to the top level
+ within a directive, and then to walk the expressions, looking for
+ the @ syntax and expanding only the outermost occurrence thereof.
+
+ * parser.y (expand_meta): New static function.
+ (n_exprs n_expr): New nonterminal symbols.
+ (elem): The arguments of the list elem (representing a generic
+ directive) now need to be put through expand_meta when it is not
+ @(do ...) or @(require ...).
+ (list): Use n_exprs instead of exprs.
+ (meta_expr): Do not call expand, and use n_expr(s) instead of expr(s).
+ (exprs, expr): These rules no become just a shim which expands
+ the outer-most metas. The actual parsing is represented by n_expr
+ and n_exprs ("n" stands for nested), which behave just like the
+ old expr and exprs.
+
+2014-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Sigh; more lexical-syntactic hacks. This adds handling
+ for the @' combination, as in @(bind a @'(foo ,bar))
+
+ * parser.l: Handle the new METAQUO token.
+
+ * parser.y (METAQUO): New token.
+ (meta_expr): New "METAQUO expr" case. Added missing METABKT
+ error handling case.
+
+2014-01-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_update): New function.
+
+ * hash.h (hash_update): Declared.
+
+ * lib.c (update): New function.
+
+ * lib.h (update): Declared.
+
+ * eval.c (eval_init): Register hash_update and update as intrinsics.
+
+ * txr.1: Documented.
+
+2014-01-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand): Bugfix in expansion of dohash: neglected
+ to insert result form into the expanded output.
+
+2014-01-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 76
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim, dep.mk: Updated.
+
+ * genvim.txr: Add missing op and do.
+
+2014-01-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_op): Takes sym argument to distinguish op and do.
+ The dwim operator is deleted when the symbol is do.
+ (expand): Expand do_s form with expand_op, not only op_s. Pass down
+ symbol.
+
+ * txr.1: Document do operator.
+
+2014-01-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (do_eval): Fix incorrect, recently introduced code
+ rearrangement that gives precedence to operator lookup over function
+ lookup.
+
+2014-01-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: @(require ...) not expanding forms.
+
+ * eval.c (expand_forms): Static function becomes external.
+ (expand_form): Remove case which handles do_s.
+
+ * eval.h (expand_forms): Declared.
+
+ * parser.y (elem): Expand both do_s and require_s forms by
+ using expand_forms.
+
+2014-01-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (conses, lazy_conses, func_set_env): New functions.
+ (lazy_conses_func): New static function.
+
+ * lib.h (conses, lazy_conses, func_set_env): Declared.
+
+ * eval.c (eval_init): conses, lazy_conses and func_set_env registered
+ as intrinsics.
+
+ * txr.1: Documented.
+
+2014-01-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Changes to the list collection mechanism to improve
+ the extension of list operations over vectors and strings.
+
+ * eval.c (do_eval_args, bindings_helper, op_each,
+ subst_vars, supplement_op_syms, mapcarv, mappendv): Switch from
+ list_collect_* macros to functions.
+
+ * lib.c (copy_list): Switch from list_collect* macros to functions.
+ Use list_collect_nconc for the final terminator. Doing a copy
+ there with list_collect_append was actually wasteful, and now
+ that list_collect_append calls copy_list in places, it triggered
+ runaway recursion.
+ (make_like): Bugfix: list_vector was used instead of vector_list.
+ (to_seq, list_collect, list_collect_nconc, list_collect_append): New
+ functions.
+ (append2, appendv, nappend2, sub_list, replace_list, ldiff, remq,
+ remql, remqual, remove_if, keep_if, proper_plist_to_alist,
+ improper_plist_to_alist, split_str, split_str_set, tok_str,
+ list_str, chain, andf, orf, lis_vector, mapcar, mapcon, mappend,
+ merge, set_diff, env): Switch from list_collect* macros to functions.
+ (replace_str, replace_vec): Allow single item replacement sequence.
+
+ * lib.h (to_seq): Declared.
+ (list_collect, list_collect_nconc, list_collect_append): Macros
+ removed, replaced by function declarations of the same name.
+ These functions return the new ptail since they cannot assign
+ to it, requiring all uses to be updated to do the assignment
+ of the returned value.
+ (list_collect_decl): Use val rather than obj_t *.
+
+ * match.c (vars_to_bindings, h_coll, subst_vars, extract_vars,
+ extract_bindings, do_output_line, do_output, v_gather, v_collect):
+ Switch from list_collect* macros to functions.
+
+ * parser.y (o_elems_transform): Likewise.
+
+ * regex.c (dv_compile_regex, regsub): Likewise.
+
+ * txr.c (txr_main): Likewise.
+
+2014-01-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Support function versions of if, and, or so that partial
+ evaluation like (op or @1 42) or (op if (eq @1 foo) bar xyzzy)
+ is possible.
+
+ * eval.c (do_eval): Change precedence between operator and
+ function lookup to favor operators. This is important since
+ there are several operators now which are also functions.
+ (if_fun, or_fun, and_fun): New static functions.
+ (eval_init): New functions registered as intrinsics.
+
+ * txr.1: Documented that if, and, or exist as both functions
+ and operators.
+
+2014-01-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_instrinsic): Changed to external linkage.
+
+ * eval.h (eval_intrinsic): Declared.
+
+ * txr.c (spec_file): Global variable removed.
+ (txr_main): Support for -e and -p options. Minor code cleanup.
+
+ * txr.1: Documented new options.
+
+2014-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (mapcarv, mappendv): Convert output to type of leftmost
+ input sequence.
+
+ * lib.c (make_like): New function.
+ (reverse, remq, remql, remqual, remove_if, keep_if, mapcar, mapcon,
+ mappend, set_diff): Convert output list to type of leftmost input
+ sequence.
+
+ * lib.h (make_like): Declared.
+
+ * txr.1: Documented.
+
+2014-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (car, cdr, ldiff): Extend to handle vectors and strings.
+ Thereby, numerous previously list-only operations in TXR Lisp
+ now magically handle strings and vectors.
+
+ * txr.1: Documented.
+
+2014-01-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (broken_down_time_list): New static function.
+ (time_fields_local, time_fields_utc): New functions.
+
+ * lib.h (time_fields_local, time_fields_utc): Declared.
+
+ * eval.c (eval_init): Intern time_fields_local and time_fields_utc
+ as intrinsic functions.
+
+ * txr.1: Documented.
+
+2014-01-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (group_by): New function.
+
+ * hash.h (group_by): Declared.
+
+ * eval.c (eval_init): group_by registered as group-by intrinsic.
+
+ * txr.1: Documented.
+
+2014-01-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 75
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim: Updated.
+
+2014-01-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_print, obj_pprint): Convert the internal representation
+ of @sym and @(expr ...) syntax back to these notations instead
+ of leaving them as (sys:var sym) and (sys:expr expr ...).
+
+2014-01-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (append_each_s, append_each_star_s): New symbol variables.
+ (op_each, expand): Support append-each and append-each*.
+ (eval_init): Initialize new symbol variables, and register
+ new operators.
+
+ * txr.1: Document append-each and append-each*.
+
+2014-01-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Wrote missing documentation for throw, throwf and error.
+
+2014-01-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (stdio_seek): After a successful seek, discard the character
+ that may have been put back with unget_char.
+
+2014-01-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bind_args): Implemented default values for optional
+ arguments.
+ (op_defun): Permit the syntax.
+
+ * txr.1: Documented.
+
+2014-01-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Support for pushing back bytes and characters into streams.
+
+ * stream.c (null_ops, stdio_ops, tail_ops, pipe_ops,
+ string_in_ops, byte_in_ops, string_out_ops, strlist_out_ops,
+ dir_ops, cat_stream_ops): Structure definition updated
+ with new initializers for two new virtuals.
+ (stdio_handle): New member, unget_c.
+ (snarf_line, stdio_get_char): Handle pushed-back character in
+ h->unget_c.
+ (stdio_unget_char, stdio_unget_byte, string_in_unget_char,
+ byte_in_unget_byte): New static functions.
+ (make_stdio_stream_common): Initialize unget_c member.
+ (unget_char, unget_byte): New functions.
+
+ * stream.h (struct strm_ops): New virtuals: unget_char and unget_byte.
+ (unget_char, unget_byte): New functions declared.
+
+ * syslog.c (syslog_strm_ops): Two new initializers.
+
+ * eval.c (eval_init): Registered unget_char and unget_byte as
+ intrinsics.
+
+ * txr.1: Documented.
+
+2014-01-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (put_byte): Bugfix: was checking whether the put_char
+ virtual function is not null, rather than put_byte.
+
+2014-01-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix in regex char ranges affecting ranges whose upper end
+ corresponds to the high bit of a bitmap cell: for instance
+ the character \x7f when the cell size is 32 bits.
+
+ * regex.c (BITCELL_ALL1): Unused macro removed.
+ (BITCELL_BIT): New macro to replace occurrences of a repeated
+ expression.
+ (CHAR_SET_INDEX, CHAR_SET_BIT): Updated to use BITCELL_BIT.
+ (L0_fill_range): Bugfix: the mask1 calculation was producing all-zero
+ in the condition bt1 == BITCELL_BIT; it should produce an all-ones
+ mask.
+
+2014-01-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 74
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES, txr.vim, dep.mk: Updated.
+
+2014-01-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.h (debug_check): Fix broken build when debugger is disabled:
+ the debug-disabled stub function needs six arguments.
+
+2014-01-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Some bignum-related optimizations
+
+ * arith.c (plus, minus, mul, trunc): Optimize cases
+ where bignum is opposite 1 or 0.
+
+2014-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (rising_product): New static function.
+ (n_choose_k, n_perm_k): New functions.
+
+ * arith.h (n_choose_k, n_perm_k): Declared.
+
+ * eval.c (eval_init): New functions interned.
+
+ * txr.1: Documented.
+
+2014-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (to_float): Print function name as ~a rather than ~s,
+ so it doesn't have quotes around it.
+ (cum_norm_dist): New function.
+
+ * arith.h (cum_norm_dist): Declared.
+
+ * eval.c: Include arith.h.
+ (eval_init): Register cum_norm_dist as intrinsic.
+
+ * txr.1: Documented cum-norm-dist.
+
+2014-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Detect platforms which don't reveal declarations
+ in C headers which are extensions to standard C, like popen or fileno,
+ in response to standard feature selection macros like -D_POSIX_SOURCE.
+ MinGW and Cygwin are offenders. These platforms hide the declarations
+ when gcc is in -ansi mode, by testing for __STRICT_ANSI__. Turns out,
+ however, that -U__STRICT_ANSI__ on the gcc command line strips this
+ away, causing the declarations to be revealed.
+
+ * lib.c, parser.l, stream.c, utf8.c: Removed the declarations which
+ compensated for the above problem. Yippee! Fuck you, stupid Cygwin
+ troglodytes, and the MinGW horse you rode in on.
+ http://cygwin.com/ml/cygwin/2011-10/msg00131.html
+
+2014-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Renaming lisp-parse to read; lisp-parse
+ is retained as an obsolescent synonym. All arguments become optional.
+
+ * parser.l (lisp_parse): Handle nil source.
+
+ * txr.1: Updated.
+
+2014-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (lang_flags): Let us switch from using _XOPEN_SOURCE=2
+ to _POSIX_C_SOURCE=199309L and _BSD_SOURCE.
+ In the .exe suffix test, try harder to redirect ls's output.
+ Test for fork stuff now needs <sys/types.h> evidently;
+ <unistd.h> does not necessarily pid_t, even though it defines
+ functions that return and accept pid_t!
+ The timegm test no longer needs _SVID_SOURCE since _BSD_SOURCE
+ covers it, and so we end up not using _SVID_SOURCE any more.
+ New tests for usleep and nanosleep.
+ The test for setenv is not conditional on timegm failing.
+
+ * eval.c: Include <time.h> and conditionally <windows.h>.
+ (usleep_wrap): New function.
+ (eval_init): New usleep_wrap function registered as usleep intrinsic.
+
+ * lib.c: Only define setenv and unsetenv if we don't have timegm,
+ because only in that situation they are used.
+
+014-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (do_txeval): Lift an annoying restriction in the pattern
+ language's expression evaluator. Whereas TXR Lisp expressions can be
+ used int the pattern language, preceded by @, it was not possible
+ to evaluate TXR Lisp variables this way. So instead of @var,
+ some clumsy trick had to be used like @(identity var). This is not
+ necessary any more. Code like @(next @*stdin*) will now work.
+
+ * txr.1: Updated.
+
+2014-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Generate HAVE_VALGRIND as #define-d to 1, rathern
+ than just fdefined.
+
+ * gc.c: Use #if HAVE_VALGRIND instaed of #ifdef HAVE_VALGRIND,
+ consistently with other HAVE_* config variables.
+
+ * lib.c: Likewise.
+
+ * lib.h: Likewise.
+
+ * txr.c: Likewise.
+
+ * txr.h: Likewise.
+
+2014-01-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix broken Json parsing test case on MinGW.
+
+ * stream.c (vformat): Fix incorrect code for normalizing
+ exponent fields in the output of sprintf's floating-point
+ conversion. For ~e, the logic would let through a leading zero.
+ For ~a/~s conversion, it was comparing to 0 instead of '0',
+ not squashing leading zeros at all.
+
+2014-01-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c: Eliminate useless #else section containing #error
+
+2013-01-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Long overdue MinGW port maintenance.
+
+ * Makefile: Use new EXE variable from config.mk.
+
+ * configure (exe, have_windows_h): New variables.
+ Handle situations with .exe suffix; on MiGW, the rm command
+ doesn't work on executables if the .exe suffix is not given.
+ New tests for localtime_r and gmtime_r.
+
+ * lib.c: Supply declarations which are missing on MinGW because
+ we use gcc -ansi, because MinGW doesn't follow established conventions
+ like -D_POSIX_SOURCE. Supply definitions for gmtime_r, localtime_r,
+ setenv and unsetenv.
+
+ * parser.l: Supply declarations which are missing on MinGW.
+
+ * signal.h (async_sig_enabled): Declare differently based on
+ HAVE_POSIX_SIGS.
+ Misspelled typedef fixed in the code for !HAVE_POSIX_SIGS
+ that has hitherto not been compiled.
+ (sig_mask): Wrap declaration in #ifdef HAVE_POSIX_SIGS because
+ it relies on sigset_t.
+
+ * stream.c: Supply declarations which are missing on MinGW.
+ Include <windows.h> if we have it.
+ (sleep): Define for Windows.
+ (statf): Handle missing st_blksize and st_blocks members in struct
+ stat.
+ (stream_init): Handle numerous missing S_* macros.
+
+ * utf8.c: Supply declarations which are missing on MinGW.
+
+2013-01-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 73
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2014-01-07 Kaz Kylheku <kaz@kylheku.com>
+
+ The lisp-parse function can now be called multiple times
+ on the same stream to extract multiple objects; the requirement
+ that the stream must hold exactly one complete Lisp object
+ with no following material is now lifted.
+
+ * parser.l (YY_INPUT): Modified the macro so that it reads no more
+ than one character. Though this probably makes the lexer less
+ efficient, it gives us the important property that the lexer does
+ not scan ahead into the input stream, hogging data into its buffer
+ which is then destroyed. This is essential if the lisp-parse function
+ is to support multiple calls to pull objects one by one out of
+ a stream.
+
+ * parser.y (spec): Use YYACCEPT in the SECRET_ESCAPE_E clause for
+ pulling a single expression out of the token stream. YYACCEPT
+ is a trick for not invoking the $accept : spec . $end production
+ which is implicitly built into the grammar, and which causes
+ a token of lookahead to occur. This allows us to read a full
+ expression without stealing any further token: but only if the
+ grammar is structured right.
+ (exprs): This phrase structure now handles the DOTDOT syntax.
+ There is no such thing as an expr DOTDOT expr expression any more;
+ it is in the list syntax (and not supported in the dot position).
+ (expr): Remove DOTDOT syntax.
+
+ * txr.1: Updated description of .. syntax, and relaxed the description
+ of lisp-parse since it now allows multiple calls to extract
+ multiple objects.
+
+2014-01-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_load): Call yylex_destroy after yyparse, so we don't
+ have stray scanner state possibly interfering with a subsquent
+ parse job.
+
+2014-01-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Add forgotten until and last keywords.
+
+ * txr.vim: Regenerated.
+
+2013-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Merry C++mas!
+
+ * configure: Avoid using "new" as identifier in signals test case.
+
+ * signal.c (set_sig_handler): Fix warning about { 0 } initializer.
+ (sig_mask): Avoid using "new" as identifier.
+
+
+2013-12-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing a bug and performance issue.
+
+ Problem: we are using sigsetjmp but with a jmp_buf structure;
+ it requires sigjmp_buf!
+
+ Performance issue: sigsetjmp is a dog which makes system calls.
+ Solution: let's roll our own cached version of sigprocmask which
+ only calls the real sigprocmask when the mask changes. Then
+ our extended_setjmp will just use regular setjmp, plus our own
+ custom signal saving and restoring based on the cached version.
+
+ * signal.c (sig_blocked_cache): New variable.
+ (set_sig_handler): Use our sig_mask instead of sigprocmask.
+ (mem_set_bits, mem_clr_bits): New static functions.
+ (sig_mask): New function.
+
+ * signal.h (extended_jmp_buf): New member, blocked.
+ (extended_setjmp): save blocked signals by peeking into
+ sig_blocked_cache, and restore using sig_mask.
+ (sig_blocked_cache, sig_mask): Declared.
+
+2013-12-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 72
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2013-12-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (stdio_seek): Bugfix. Was returning current position
+ whenever offset is zero, regardless of whence argument.
+
+2013-12-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (yybadtoken): Handle HASH_H.
+
+2013-12-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_defvar): Fix the semantics to be similar to Common Lisp:
+ no effect if the variable already exists.
+
+ * txr.1: Documented defvar and lisp-parse.
+
+2013-12-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (intern): fix the previous diagnostic bug once more with more
+ feeling.
+
+ * parser.l (grammar): Recognize package prefixes in symbol tokens.
+ Got rid of special rule for handling lone colon.
+
+ * parser.y (sym_helper): Catch undefined package as a parsing
+ error rather allowing intern function to throw exception.
+
+2013-12-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Changing the tokenizer to get rid of IDENT, KEYWORD and METAVAR
+ token categories, replaced by a single one called SYMTOK.
+ Package prefixes are now recognized and processed in tokens.
+
+ * lib.c (delete_package): Fix problem in no-such-package
+ error case: it would always report nil as the name.
+ (intern): Fix nonsensical error message: in the no-such-package case it
+ would report that the symbol exists already.
+
+ * parser.l (grammar): Occurences of KEYWORD, METAVAR, and IDENT
+ scrubbed. All rules reporting any of these now return
+ SYMTOK. The main one of these is greatly simplified.
+
+ * parser.y (sym_helper): New function.
+ (char_from_name): const qualifier inside param's type declaration.
+ (grammar): IDENT, KEYWORD and METAVAR tokens are gone.
+ New token SYMTOK. Grammar refactored around SYMTOK and using
+ the new sym_helper function.
+ (char_from_name): Updated.
+
+2013-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ Support for parsing Lisp expression out of strings and streams.
+ New catenated streams make the Yacc hack possible.
+
+ * eval.c (eval_init): Register lisp_parse as intrinsic.
+
+ * parser.h (lisp_parse): Declared.
+
+ * parser.l: New lexical hack to produce SECRET_ESCAPE_E token.
+ (regex_parse): Move declaration before statements.
+ (lisp_parse): New function.
+
+ * parser.y (SECRET_ESCAPE_E): New token type.
+ (spec): New production rule for single expression.
+
+ * stream.c (cat_stream_print, cat_get_line, cat_get_char,
+ cat_get_byte, cat_get_prop): New static functions.
+ (cat_stream_ops): New static function.
+ (make_catenated_stream): New function.
+
+ * stream.h (make_catenated_stream): Declared.
+
+2013-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ New stream property: name. Some streams can report
+ their name: some kind of string.
+
+ * stream.c (name_k): New variable.
+ (null_get_prop): New static function.
+ (null_ops): Wire null_get_prop into ops structure.
+ (stdio_get_prop): Report h->descr as name.
+ (string_in_get_prop): New function.
+ (string_in_ops): Wire string_in_get_prop into ops structure.
+ (stream_init): Initialize name_k.
+
+ * stream.h (name_k): Declared.
+
+ * syslog.c (syslog_get_prop): Report "syslog" as
+ stream name.
+
+2013-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.c (sig_handler): Pass two arguments to signal
+ handler rather than 1. The new argument is the value t,
+ telling the handler that it's asynchronously invoked in
+ a real signal context. If the signal handler returns
+ true, then mark it deferred so that it can re-trigger
+ in a synchronous context.
+ (sig_check): Pass nil as a the second argument to signal handlers,
+ indicating that they are synchronously called, not
+ in a signal handler context.
+
+ * txr.1: Added documentation.
+
+2013-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.c (set_sig_handler): Disable signals around this
+ function because it manipulates the mask of deferred
+ signals which can also be manipulated by an async signal.
+
+2013-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * signal.c (set_sig_handler): Clear the deferred flag
+ for a signal that is being set to ignored or default.
+
+ * txr.1: Documented signals.
+
+2013-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Registered vars for signal numbers.
+
+ * signal.c (sig_hup, sig_int, sig_quit, sig_ill, sig_trap, sig_abrt,
+ sig_bus, val sig_fpe, sig_kill, sig_usr1, sig_segv, sig_usr2, sig_pipe,
+ sig_alrm, val sig_term, sig_chld, sig_cont, sig_stop, sig_tstp,
+ sig_ttin, val sig_ttou, sig_urg, sig_xcpu, sig_xfsz, sigtalrm,
+ sig_prof, val sig_poll, sig_sys, sig_winch, sig_iot, sig_stkflt,
+ sig_io, sig_lost, sig_pwr): New variables.
+ (sig_init): New variables initialized.
+
+ * signal.h: New variables declared.
+
+2013-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ First cut at signal handling support.
+
+ * Makefile (OBJS-y): Include signal.o if have_posix_sigs is "y".
+
+ * configure (have_posix_sigs): New variable, set by detecting POSIX
+ signal stuff.
+
+ * dep.mk: Regenerated.
+
+ * arith.c, debug.c, eval.c, filter.c, hash.c, match.c, parser.y,
+ parser.l, rand.c, regex.c, syslog.c, txr.c, utf8.c: Include new
+ signal.h header, now required by unwind, and the <signal.h> system
+ header.
+
+ * eval.c (exit_wrap): New function.
+ (eval_init): New functions registered as intrinsics: exit_wrap,
+ set_sig_handler, get_sig_handler, sig_check.
+
+ * gc.c (release): Unused functions removed.
+
+ * gc.h (release): Declaration removed.
+
+ * lib.c (init): Call sig_init.
+
+ * stream.c (set_putc, se_getc, se_fflush): New static functions.
+ (stdio_put_char_callback, stdio_get_char_callback, stdio_put_byte,
+ stdio_flush, stdio_get_byte): Use new functions to enable
+ signals when blocked on I/O.
+ (tail_strategy): Allow signals across sleep.
+ (pipev_close): Allow signals across waitpid.
+ (se_pclose): New static function.
+ (pipe_close): Use new function to enable signals across pclose.
+
+ * unwind.c (uw_unwind_to_exit_point): use extended_longjmp instead of
+ longjmp.
+
+ * unwind.h (struct uw_block, struct uw_catch): jb member changes from
+ jmp_buf to extended_jmp_buf.
+ (uw_block_begin, uw_simple_catch_begin, uw_catch_begin): Use
+ extended_setjmp instead of setjmp.
+
+ * signal.c: New file.
+
+ * signal.h: New file.
+
+2013-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (config_flags): Variable removed. This was more trouble than it
+ was worth, and only solved problems caused by not checking that the test
+ program was made all the way to an executable.
+
+2013-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Fix warnings in test cases for HAVE_FORK_STUFF
+ and HAVE_DAEMON.
+
+ * eval.c: daemon support must be wrapped in #if HAVE_DAEMON
+
+2013-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (txr_main): Change stderr to line buffered mode.
+
+2013-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): log_authpriv_v registered as log-authpriv.
+
+ * syslog.c (log_authpriv_v): New variable.
+ (syslog_init): New variable initialized.
+
+ * syslog.h (log_authpriv_v): Declared.
+
+ * txr.1: Documented log-authpriv, and put in notes about testing
+ for variables that may not be present, including log-perror.
+
+2013-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (symbol_value, boundp, fboundp): New functions.
+ (eval_init): New functions registred as intrinsics.
+
+ * txr.1: Documented.
+
+2013-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c, hash.c, lib.c, rand.c, stream.c, syslog.c: Removing
+ #include <assert.h> since none of these modules uses the standard C
+ assert macro.
+
+2013-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): closelog_wrap interned.
+
+ * syslog.c (closelog_wrap): New function.
+
+ * syslog.h (closelog_wrap): Declared.
+
+ * txr.1: Documented.
+
+2013-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register streamp, real_time_stream_p,
+ stream_get_prop and stream_set_prop as intrinsics.
+
+ * stream.c (stream_get_prop): New function.
+
+ * stream.h (stream_get_prop): Declared.
+
+ * syslog.c (syslog_get_prop): Bugfix: check for prio_k not real_time_k.
+
+ * txr.1: Updated.
+
+2013-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ syslog support; bitwise logior and logand functions become variadic.
+
+ * Makefile: Use -iquote to restrict our #include search paths from
+ being processed for #include <...>. Add syslog.o to OBJS-y if
+ have_syslog is y.
+
+ * configure (have_syslog): New variable, set by detecting syslog API.
+
+ * eval.c (eval_init): logand and logior registrations changed to
+ go to variadic versions. New syslog variables and functions registered.
+
+ * lib.c (logandv, logiorv): New functions.
+
+ * lib.h (logandv, logiorv): Declared.
+
+ * txr.c (main): Call syslog_init.
+
+ * syslog.c: New file.
+
+ * syslog.h: New file.
+
+ * txr.1: Updated.
+
+ * txr.vim: Regenerated.
+
+2013-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 71
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2013-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (end_of_regex): Fix start condition stack underflow
+ during regex_parse.
+
+2013-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (regex_parse): Match the simplified grammar now
+ expected in the parser, with no slashes around the regex.
+ Change prefix for diagnostic message.
+
+2013-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Update registration of regex-compile
+ to reflect that it has two arguments now.
+
+ * parser.y (grammar): Update calls to regex_compile to
+ pass two arguments. Since we don't expect regex_compile to
+ parse, we specify the error stream as nil.
+ (spec): The "secret syntax" for a regex is simplified
+ not to include the slashes. This provides better diagnostics for
+ unterminated syntax and requires less string processing to generate.
+ Also, the form returned doesn't have the regex symbol
+ consed onto it, which parse_regex just throws away.
+
+ * regex.c (regex_compile): Now takes a stream argument.
+
+ * regex.h (regex_compile): Declaration updated.
+
+ * txr.1: Updated
+
+2013-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing some old-style coding that became obsolete
+ around November 2009.
+
+ * lib.c (lazy_str): Use the efficient lit("...") that
+ doesn't allocate memory instead of string(L"...").
+ (lazy_str_get_trailing_list): Likewise.
+
+ * stream.c (open_process): Likewise.
+
+ * txr.c (remove_hash_bang_line): Likewise.
+
+2013-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * regex.c (regex_compile): Handle string input.
+
+ * regex.h (regex_compile): Don't call argument
+ regex_sexp, since it can be a string.
+
+ * txr.1: Updated.
+
+2013-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Registered regex_parse as new
+ intrinsic function and std_null as new variable.
+
+ * parser.h (yylex_destroy): Existing function declared.
+
+ * parser.l (regex_parse): New function.
+ New lexical syntax added which returns SECRET_ESCAPE_R.
+
+ * parser.y (SECRET_ESCAPE_R): New token.
+ (spec): Added syntactic variant which lets us
+ smuggle a regex into the parser easily.
+
+ * stream.c:x (std_null): New global variable.
+ (null_stream_print): New static function.
+ (null_ops): New static structure.
+ (make_null_stream): New function.
+ (stream_init): Protect and initialize std_null.
+
+ * stream.h (std_null, make_null_stream): Declared.
+
+ * txr.1: New features documented: regex-parse, *stdnull*.
+
+ * txr.c (txr_main): Call yylex_destroy after parsing the program now
+ that I know about this function; this can free up some memory.
+
+2013-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (stdio_set_prop): Fix reversed boolean.
+
+2013-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (tail_strategy): Execute the strategy code also
+ in the case that the stream's FILE * handle is null. This handles
+ opening the file for the first time.
+ (make_stdio_stream_common): Do not use the FILE * handle if it is null.
+ (open_tail): Do not open the file immediately and error out.
+ This is undesirable because log files might not exist at the time
+ open_tail is called on them. Instead, produce a stream which contains
+ a null file handle, and use tail_strategy to poll for the file
+ to come into existence.
+
+ * utf8.c (w_freopen): Just in case freopen doesn't like a null
+ pointer for the existing stream, use fopen instead if that is the case.
+
+2013-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Missing catch and finally keywords added.
+
+ * txr.vim: Regenerated.
+
+2013-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ debug_check calls are the culprit triggering lookahead
+ in lazy lists. Changing the semantics of the data argument
+ so that it can just be the list.
+
+ * debug.c (debug): If data is a cons, then replace it with
+ the first item.
+
+ * match.c (match_files): Pass c.data to debug_check, rather
+ than the value of if2(consp(c.data), car(c.data)) which accesses
+ car(c.data) whether or not we are debugging.
+ (match_fun): Likewise.
+
+2013-12-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Steps toward fixing an issue: lazy list readahead.
+ The problem is that accurate lazy lists are not suitable for
+ real time use, where we want the TXR program to respond immediately
+ to matching some datum.
+
+ I'm implementing a simple, naive variant of lazy stream lists
+ which simply populates the lazy cons by reading from the stream when
+ the car or cdr fields are accessed. This type of stream can never
+ be nil (empty list) even if the file is empty; in that case
+ it will be (nil) and in general, it will have a spurious nil
+ item at the end instead of ending in a string.
+ (An adjustment was made in match.c to detect this; more
+ will be needed.)
+
+ I'm adding attributes to streams so streams can now have a
+ "real-time" attribute. When a lazy string list is constructed over
+ a real-time stream, the simple implementation is used.
+ File streams are automatically real-time if (on Unix) they are tied
+ to tty streams. Tail streams are also real-time.
+
+ More work is needed to achieve the goal of this change,
+ but this is a big step in the right direction.
+
+ * configure: Detect isatty function.
+
+ * lib.c (simple_lazy_stream_func): New static function.
+ (lazy_stream_cons): Use simple implementation for real-time streams.
+
+ * match.c (match_files): Do not call match_line_completely
+ with a data line that is nil (as a result of simple lazy list
+ over a real-time stream). A nil item in a lazy list of strings
+ is treated as eof.
+
+ * stream.c (real_time_k): New symbol variable.
+ (struct strm_ops): New members: get_prop, set_prop.
+ (struct stdio_handle): New member: is_real_time.
+ (stdio_get_prop, stdio_set_prop): New static function.
+ (stdio_ops, tail_ops, pipe_ops): stdio_get_prop and
+ stdio_set_prop funtions wired in.
+ (make_stdio_stream_common): Attribute streams as real-time
+ if they are tty devices.
+ (make_tail_stream): Tail streams are real-time attributed.
+ (stream_set_prop, real_time_stream_p): New functions.
+ (stream_init): Initialize real_time_k.
+
+ * stream.h (real_time_k): Declared.
+ (real_time_stream_p, stream_set_prop): Likewise.
+
+2013-11-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New functions countqual, countql, countq
+ and count_if registered as intrinsics.
+
+ * lib.c (countqual, countql, countq, count_if): New functions.
+
+ * lib.h (countqual, countql, countq, count_if): Declared.
+
+ * txr.1: New functions documented.
+
+2013-11-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (config_flags): New variable, allowing us to
+ have stricter diagnosis for configure tests.
+ (have_timegm, need_svid_source, need_bsd_source): New
+ variables. sys/stat.h test only declares static data and
+ compiles an object file. Adding tests for timegm, tzset,
+ setenv and unsetenv.
+
+ * eval.c (eval_init): Register new intrinsic, make_time_utc.
+
+ * lib.c (make_time_impl): New static function.
+ (make_time): Reimplemented as call to make_time_impl.
+ (timegm_hack): New conditionally-defined static function.
+ (make_time_utc): New function.
+
+ * lib.h (make_time_utc): Declared.
+
+ * txr.1: make-time-utc documented.
+
+2013-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (make_time): We must subtract from the 1-12
+ month for the tm_mon member of struct tm; we
+ were adding 1 instead.
+
+2013-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (tail_calc): New function
+ (tail_strategy): Handle the situation when the file disappears. We
+ cannot throw an error, but must poll the filesystem
+ for the file to reappear.
+
+2013-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Detect the daemon function.
+
+ * eval.c: Include <unistd.h> conditionally.
+ (errno_wrap, daemon_wrap): New functions.
+ (eval_init): Registered errno_wrap and daemon_wrap as intrinsics
+ under the names daemon and errno.
+
+ * txr.1: Documented errno and daemon in new UNIX PROGRAMMING
+ section.
+
+2013-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented open-tail and make-time.
+
+2013-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Extending intrinsic functions to go up to 7 arguments.
+ Adding wrapper for mktime.
+
+ * eval.c (apply): Handle function codes N5 through N7.
+ (eval_init): Register make_time as intrinsic.
+
+ * lib.c (auto_k): New keyword symbol variable.
+ (equal, generic_funcall): Handle N5-N7.
+ (func_n5, func_n6, func_n7, func_n5v, func_n6v, func_n7v): New
+ functions.
+ (obj_init): Initialize auto_k.
+ (make_time): New function.
+
+ * lib.h (functype_t): New enum members: N5, N6, N7.
+ (struct func): New members: n5, n6, n7, n5v, n6v, n7v.
+ (auto_k, func_n5, func_n6, func_n7, func_n5v, func_n6v, func_n7v,
+ make_time): Declared.
+
+2013-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (make_stdio_stream_common): Initialize new
+ mode member of struct stdio_ops to nil.
+
+2013-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (struct stdio_handle): New member, mode.
+ (stdio_stream_mark): Mark the new member during gc.
+ (stdio_seek): When we seek, we should reset the utf8 machine.
+ (tail_strategy): New function.
+ (tail_get_line, tail_get_char, tail_get_byte): Use
+ tail_strategy for polling the file at EOF.
+ (open_tail): Store the mode in the file handle.
+
+ * utf8.c (w_freopen): New function.
+
+ * utf8.h (w_freopen): Declared.
+
+2013-11-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (conftest.clean): Use @ to suppress output.
+
+ * configure (have_unistd): New variable. Set true by every successful
+ test that compiles something that contains #include <unistd.h>.
+ HAVE_UNISTD_H is conditionally generated in config.h based on this variable.
+ Minor cleanup.
+
+ * parser.l: Inclusion of <unistd.h> wrapped in #if/#endif.
+
+ * stream.c: Conditional inclusion of <unistd.h> based on new HAVE_UNISTD_H symbol.
+
+2013-11-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Added check to detect POSIX sleep function.
+
+ * eval.c (eval_init): Register new open_tail function as intrinsic.
+
+ * match.c (complex_snarf, complex_stream): Update calls to
+ make_stdio_stream and make_pipe_stream to take fewer arguments.
+ (match_files): Support a stream object as a data source specification
+ in place of a string.
+
+ * parser.l (parse_reset): Update call to make_stdio_stream to take
+ fewer arguments.
+
+ * stream.c: Inclusion of <unistd.h> made properly conditional.
+ (struct stdio_handle): pid member defined as pid_t only if we have fork
+ functionality, otherwise defined as int.
+ (tail_get_line, tail_get_char, tail_get_byte): New static functions.
+ (tail_ops): New static structure.
+ (make_stdio_stream_common): New static structure.
+ (make_stdio_stream, make_pipe_stream): These functions lose the input
+ and output parameters, which ended up never used. Reimplemented
+ in terms of new common function.
+ (make_tail_stream): New function.
+ (make_pipevp_stream): Reimplemented in terms of new common function.
+ (open_file, open_command): Simplified by removal of useless local
+ variables and their computation, which used to be extra arguments to
+ make_stdio_stream and make_pipe_stream.
+ (open_tail): New function.
+ (stream_init): Calls to make_stdio_stream updated.
+
+ * stream.h (make_stdio_stream, make_pipe_stream): Declarations updated.
+ (make_tail_stream, open_tail): Declared.
+
+ * txr.c (txr_main): Calls to make_stdio_stream updated.
+
+2013-11-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Stream-seeking functionality.
+
+ Bugfix in stdio_flush: check FILE * handle for null.
+
+ Minor cleanups.
+
+ * eval.c (eval_init): Register seek_stream as intrinsic.
+
+ * stream.c (from_start_k, from_current_k, from_end_k): New symbol
+ variables.
+ (strm_whence): New enum.
+ (strm_ops): New member, seek.
+ (stdio_maybe_write_error): Renamed to stdio_maybe_error; takes
+ new string argument to describe action.
+ (stdio_put_string, stdio_put_char, stdio_put_byte): Updated call to
+ stdio_maybe_error.
+ (stdio_flush): Updated call to stdio_maybe_error. Check
+ handle for null.
+ (stdio_seek): New static function.
+ (stdio_ops): Added stdio_seek.
+ (pipe_ops, string_in_ops, byte_in_ops, string_out_ops,
+ strlist_out_ops, dir_ops): Added explicit zero entries and comments for
+ unimplemented functions.
+ (seek_stream): New function.
+ (stream_init): New keyword symbols interned.
+
+ * stream.h (from_start_k, from_current_k, from_end_k): New
+ variables declared.
+ (dev_k, ino_k, mode_k, nlink_k, uid_k, gid_k, rdev_k, size_k,
+ blksize_k, blocks_k, atime_k, mtime_k, ctime_k, s_ifmt, s_iflnk,
+ s_ifreg, s_ifblk, s_ifdir, s_ifchr, s_ififo, s_isuid, s_isgid, s_isvtx,
+ s_irwxu, s_irusr, s_iwusr, s_ixusr, s_irwxg, s_irgrp,
+ s_iwgrp): Existing extern variables declared.
+ (seek_stream): New function declared.
+
+ * txr.1: Documented seek-stream.
+
+2013-11-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_load): Bugfix: bindings were propagated in only one of two
+ subcases of a successful load. This bug means that a loaded TXR
+ sub-query was not reliably able to bind variables that are then visible
+ to subsquent directives in the parent.
+
+2013-11-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix for uninitialized struct member curfiles in the match context.
+ This is used for reporting the current match location in debug traces.
+
+ * match.c (mf_all): Takes new argument curfiles
+ and initializes the match_files_ctx member of the same name.
+ (do_match_line, mf_from_ml, match_filter, match_fun, extract):
+ Pass curfile to ml_all.
+
+2013-11-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Change how the hard-coded symbols (end, and, or) are
+ added, and also add the missing rep to these.
+
+ * txr.vim: Regenerated.
+
+2013-11-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 70
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2013-11-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Nasty bug fixed: @(accept) from inside a @(collect) was found not to
+ propagate bindings. The culprit? The bindings_coll variable in the
+ v_collect function being indeterminate by the well-documented and
+ understood action of setjmp. Marking the bindings_coll variable
+ volatile instantly fixed it. I reviewed this code to find any other
+ instance of this oversight.
+
+ * match.c (v_skip, v_collect): Mark some local variable volatile:
+ precisely those which are used after possibly returning via an
+ unwind, and which might have been modified since setting up
+ the unwind block.
+
+2013-11-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Handle symbols whose C names end with _star_s,
+ and also ones with underscores.
+
+ * txr.vim: Updated.
+
+2013-10-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (clean): depends on conftest.clean
+ (conftest.clean): New target.
+
+ * configure: Use "make conftest.clean" to clean up conftest stuff. Note
+ that there was a bug here: brace expansion was used, but the shell is
+ /bin/sh, so conftest.err wasn't being removed.
+
+2013-10-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix 2013-10-06 regression in op syntax. This happens when a @var
+ syntax appears in an op form, crashing the expander with infinite
+ recursion at program load time, before the code is run.
+
+ * eval.c (transform_op): The fi == var check to handle a
+ trailing op variable in the dot position of a form
+ needs to ensure that it really is @<num> type var, and
+ not the @<sym> type for instance.
+
+2013-10-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix jaw-dropping bug introduced on 2009-11-15, first affecting
+ the 022 release.
+
+ Efficient string literal objects (tag bits 11) were introduced on that
+ day.
+
+ The null_string object was changed to a literal, and that object is
+ efficiently returned by some string manipulation functions in cases
+ when it is obvious that the result is an empty string.
+
+ However, the LIT type code was not added to a switch statement in
+ the variable matching code, which continued to recognize only the
+ type STR as a string, to this day.
+
+ A test case for this is
+
+ echo ":x" | ./txr -c "@x:@x" -
+
+ which results in an "unsupported object in spec" error.
+
+ * match.c (h_var): Use stringp to test for string rather than
+ type(..) == STR. Add LIT and LSTR to the switch statement
+ so that literals an lazy strings are handled if they occur.
+ (do_output_line): Add LIT and LSTR to switch.
+
+2013-10-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Include syntactic directives which aren't extracted from
+ sources because actions aren't registered for them.
+
+ * txr.vim: Regenerated.
+
+2013-10-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Ouch! Turns out the code base has numerous unintended
+ deviations from C90, like mixed declations and
+ statements. GCC doesn't diagnose these without the
+ --pedantic flag.
+
+ * configure: GCC's --ansi flag should be spelled -ansi.
+
+ * lib.c (split_str, obj_print): Reorder declaration before statements.
+ (make_sym): Fix similar problem by eliminating a statement.
+ (funcall1, funcall2, funcall3, funcall4): Use assignment to initialize
+ local array with non-constant elements. This is actually good for
+ performance because we only initialize those parts of the array that
+ we use.
+
+ * lib.h (struct func): Change functype member to unsigned,
+ since enum-typed bitfields are a GCC extension.
+
+ * match.c (ml_all, mf_all): Use assignments to initialize local
+ struct with non-constants.
+ (do_txeval, v_collect): Slightly revise unwinding macrology with help
+ of new macros to avoid mixing declarations and statements.
+ (spec_bind): Removed spurious semicolon from macro expansion.
+ (v_gather): Reorder two lines to avoid mixed decls and
+ statements.
+ (match_filter): Move declaration of ret a few lines up, ahead of
+ statements.
+
+ * unwind.c (uw_pop_until): New function.
+
+ * unwind.h (uw_pop_until): Declared.
+ (uw_mark_frame, uw_fast_return): New macros.
+
+2013-10-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: Split long lines of keywords.
+
+ * txr.vim: Updated.
+
+2013-10-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * genvim.txr: New file.
+
+ * txr.vim: Updated using genvim.txr.
+
+2013-10-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Change to header block comment generated in config.h
+
+2013-10-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 69
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2013-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Fixed documentation bug. expt with three or more
+ arguments is a right-associative reduction, not left.
+
+2013-10-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11433. Implement continuation of multiple
+ output blocks across the same stream.
+
+ * match.c (close_s, named_k, continue_k, finish_k): New symbol
+ variables.
+ (v_output): Implement :named, :finish and :continue.
+ (v_close): New static function.
+ (syms_init): New symbols interned.
+ (dir_tables_init): New entry associating v_close
+ function with symbol stored in close_s.
+
+ * match.h (close_s): Declared.
+
+ * txr.1: New features documented.
+
+2013-10-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Fix reversed arguments in documentation for time-string-local
+ * and time-string-utc.
+
+2013-10-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 68
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2013-10-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Improving behavior of op and fixing a bug.
+
+ Explicitly specifying @rest using (op ... . @rest)
+ did not work at all.
+
+ The then-func agument of iff and iffi may now be nil.
+
+ * eval.c (format_op_arg): New static function.
+ (transform_op): Handle dotted lists ending in @rest
+ or @<num>.
+ (supplement_op_syms): New static function.
+ (expand_op): Add missing numeric arguments,
+ so that all 1 through n are in the list.
+ Trailing rest is now added under different
+ conditions.
+
+ * lib.c (do_iff): Give thenfun the same
+ behavior on nil that elsefun enjoys.
+
+ * txr.1: Updated.
+
+2013-10-06 Kaz Kylheku <kaz@kylheku.com>
+
+ New feature: :vars argument in repeat and rep directives in an output
+ block, for specifying variables to include in iteration whose
+ presence repeat is not able to deduce.
+
+ * match.c (extract_bindings): New argument, vars, specifies
+ additional variables to consider.
+ (do_output_line, do_output): Process :vars argument of repeat
+ and rep directive.
+
+ * txr.1: Updated.
+
+2013-08-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c, utf8.c: Tabs changed to spaces. For some reason, filter.c
+ used 4 space tabs and utf8.c used 8 space tabs, inconsistently.
+
+2013-07-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 67
+
+ txr.1: Documented line continuation for string literals,
+ supported since Version 38 but not clarified properly.
+
+ RELNOTES: Updated.
+
+2013-07-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Diagnose unrecognized escape sequences in string
+ literals and quasiliterals and after @\.
+ Support "\ " (backslash space) escape in string literals
+ and quasiliterals.
+
+2013-07-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Fix slipup, where call is referred to as funcall.
+
+2013-07-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version, set date and documented string-cmp.
+
+ * configure (txr_ver): Bumped.
+
+ * eval.c (eval_init): Forgotten string-cmp registered as intrinsic.
+
+ * txr.vim: Highlighting for string-cmp.
+
+ * RELNOTES: Updated.
+
+2013-07-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Bringing up to date.
+
+2013-06-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (require_s): New variable.
+ (v_require): New static function.
+ (syms_init): Initialize require_s.
+ (dir_tables_init): Add new entries into v_directive_table
+ and h_directive_table for new require directive.
+
+ * match.h (require_s): Declared.
+
+ * txr.1: Added do and require directives to the directive summary
+ section. Documented new require directive.
+ Fixed int-str documentation to clarify that the radix is
+ optional.
+
+2013-06-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): tok-str acquires new parameter
+
+ * lib.c (tok_str): New parameter, keep_sep.
+
+ * lib.h (tok_str): Declaration updated.
+
+ * txr.1: Documentation for tok-str updated.
+
+2013-06-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): lazy-str's third argument is optional.
+ Added lazy-stringp. Changing names of length-str-{gt,ge,lt,le}
+ to be consistent with the >, >=, < and <= functions.
+
+ * lib.c (lazy_stream_func): Greatly simplified implementation.
+ The lazy list now continues by means of recursing via
+ an optimized version of lazy_stream_cons called lazy_stream_cont.
+ The environment structure is simplified to just hold the next item,
+ rather than a pointless list. The pointless setting of lcons->lc.func
+ to nil is also removed; this is always done by the caller.
+ (lazy_stream_cont): New static function, similar to lazy_stream_cons,
+ but optimized by not consing up a new function and new environment
+ cell.
+ (lazy_stream_cons): The environment for the update function
+ is simplified to just a single cons.
+
+ * txr.1: Documented lazy string functions and lazy-stream-cons.
+
+2012-03-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): lazy string related functions become intrinsics.
+
+ * lib.c (string_cmp): New function.
+
+ * lib.h (string_cmp): Declared.
+
+2013-05-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register tok_str as intrinsic.
+
+ * lib.c (tok_str): New function.
+
+ * lib.h (tok_str): Declared.
+
+ * txr.1: Documented.
+
+2013-05-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Corrected wrong function name in documentation
+ for split-str-set.
+
+2013-05-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Misleading documentation updated for split-str, which
+ takes a regex, not just a fixed string separator. Clarified
+ the corner case behaviors too.
+
+2013-05-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 66
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2013-05-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New intrinsics, time-string-local and
+ time-string-utc.
+
+ * lib.c (string_time): New static function.
+ (time_string_local, time_string_utc): New functions.
+
+ * lib.h (time_string_local, time_string_utc): Declared.
+
+ * txr.1: Documented.
+
+ * RELNOTES: Updated.
+
+2013-05-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_fun): Support debug stop on the function
+ prior to the call. The first data line number is 1, not zero,
+ if there is data.
+
+ * txr.1: Added usage example for match-fun.
+
+2013-05-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented time and url encoding/decoding functions.
+
+2013-05-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): State argument in random-fixnum should be
+ optional.
+
+ * txr.1: Documented random functions as well as range and range*
+
+2013-05-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * RELNOTES: Updated in preparation for release.
+
+ * eval.c (eval_init): Expose delete-package, rehome-sym
+ and packagep.
+
+ * lib.c (make_package, intern): use ~s formatting for package name in
+ error message.
+ (packagep, delete_package, rehome_sym): New functions.
+
+ * lib.h (packagep, delete_package, rehome_sym): Declared.
+
+ * txr.1: Documented process functions and packages.
+
+2013-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New instrinsic function iffi registered.
+
+ * lib.c (iff): Reversed argument names corrected. No functional
+ change.
+ (iffi): New function.
+
+ * lib.h (iffi): Declared.
+
+ * txr.1: Documented iffi.
+
+2013-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (help): Help text updated.
+ (debug): Fix conflicting command assignment.
+ Show form is now 'o'.
+
+2012-10-31 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (int_str): Fix gaping bug introduced by previous commit,
+ which could have been caught by running the regression test suite.
+ The revised function was returning small integers as bignums.
+
+2012-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (string_lt): Bugfix: wcscmp returns some value less than zero,
+ not specifically -1.
+
+2012-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/config-types: Include the header as "config.h"
+ rather than "../config.h" because the dependency generation script
+ checks for this as a special case and treats it relative to the
+ build directory.
+
+ * dep.mk: Regenerated.
+
+2012-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (bignum_from_long): New function.
+
+ * arith.h (bignum_from_long): Declared.
+
+ * lib.c (int_str): Streamlined. Only use mp_read_radix in the case when
+ wcstol fails, because now we have bignum_from_long to handle all values
+ of long. Ensure that the bignum is normalized, in case it falls in the
+ fixnum range (does not happen on our usual platforms).
+
+2012-09-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c: Allow the test form of a for loop to be omitted,
+ defaulting to a true test, allowing an infinite loop to
+ be expressed as (for () () () ...).
+
+ * txr.1: Documented.
+
+2012-09-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * RELNOTES: Correct incorrect 2011 years on all 2012 dates.
+ How did that happen?
+
+2012-09-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (apply): Fix in error message: hard coded "apply" instead
+ of using ctx_form.
+
+2012-09-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: internal funcall functions not handling functions
+ with optional arguments.
+
+ * lib.c (generic_funcall): New static function, based on apply
+ from eval.c.
+ (funcall, funcall1, funcall2, funcall3, funcall4): If the function
+ being called has optional arguments, then go through generic_funcall.
+
+2012-09-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (logand): Fix incorrect return value.
+
+2012-09-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (logtest): New function.
+
+ * eval.c (eval_init): Registered logtest.
+ Registered s-ifmt, s-iflnk, s-ifreg, s-ifblk, s-ifdir,
+ s-ifchr, s-ififo, s-isuid, s-isgid, s-isvtx, s-irwxu,
+ s-irusr, s-iwusr, s-ixusr, s-irwxg, s-irgrp, s-iwgrp,
+ s-ixgrp, s-irwxo, s-iroth, s-iwoth, s-ixoth variables.
+
+ * lib.h (logtest): Declared.
+
+ * stream.c (s_ifmt, s_ifsock, s_iflnk, s_ifreg, s_ifblk,
+ s_ifdir, s_ifchr, s_ififo, s_isuid, s_isgid, s_isvtx, s_irwxu, s_irusr,
+ s_iwusr, s_ixusr, s_irwxg, s_irgrp, s_iwgrp, s_ixgrp, s_irwxo, s_iroth,
+ s_iwoth, s_ixoth): New global variables.
+
+ * stream.h (s_ifmt, s_ifsock, s_iflnk, s_ifreg, s_ifblk,
+ s_ifdir, s_ifchr, s_ififo, s_isuid, s_isgid, s_isvtx, s_irwxu, s_irusr,
+ s_iwusr, s_ixusr, s_irwxg, s_irgrp, s_iwgrp, s_ixgrp, s_irwxo, s_iroth,
+ s_iwoth, s_ixoth): Declared.
+
+ * txr.1: Documented logtest and s-* variables for stat,
+ as well as open-file and open-directory.
+
+2012-09-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Slight change in ~s directive. For a floating
+ point integer, .0 is now always shown if the precision is not given,
+ or if it is given and nonzero. Previous behavior of ~s was add .0 only
+ when a precision is not specified. The new behavior is more
+ sensible and consistent with documentation.
+
+ * txr.1: Typo fixed in related documentation.
+
+2012-09-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (comp_trunc, logcomp): logcomp renamed to lognot,
+ consistent with Common Lisp.
+
+ * eval.c (eval_init): logcomp to lognot.
+
+ * lib.h (logcomp): Declaration updated.
+
+2012-09-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (highest_significant_bit): New static function.
+ (comp_clamp): Bugfix: avoid shifting left into sign bit. Function
+ renamed to comp_trunc.
+ (logtrunc, ash): New functions.
+
+ * eval.c (eval_init): Registered logtrunc and ash intrinsics.
+
+ * lib.h (logtrunc, ash): Declared.
+
+ * mpi-patches/add-bitops (s_highest_bit_mp): Forward declaration for
+ added.
+ (mp_clamp_comp): Bugfix in handling remainder bits. Function
+ renamed to mp_trunc_comp.
+ (mp_trunc, mp_shift): New functions.
+
+2012-09-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (highest_significant_bit): New static function.
+ (comp_clamp): Bugfix: avoid shifting left into sign bit.
+ (logclamp, ash): New functions.
+
+ * eval.c (eval_init): Registered logclamp and ash intrinsics.
+
+ * lib.h (logclamp, ash): Declared.
+
+ * mpi-patches/add-bitops (s_highest_bit_mp): Forward declaration for
+ added.
+ (mp_comp_clamp): Bugfix in handling remainder bits.
+ (mp_clamp, mp_shift): New functions.
+
+2012-09-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/add-bitops: Bugfixes: mp_2comp is extended to properly
+ allow arbitrarily wide complements (which causes the code to access
+ beyond the a argument's digits array). A similar fix is applied in
+ the new mp_clamp_comp function. Incorrect initializations of mp_int
+ fixed in all the logic functions: mp_init was used instead of
+ mp_init_size.
+
+2012-09-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (logand, logior, logxor): Bugfix: result needs to be
+ normalized, otherwise we end up with fixnum-range bignums.
+ (comp_clamp): New function.
+ (logcomp): Changed to two argument form. If second argument
+ is present (not nil) then call comp_clamp.
+
+ * eval.c (eval_init): Change registration of logcomp to allow
+ optional argument.
+
+ * lib.h (logcomp): Declaration updated.
+
+ * mpi-patches/add-bitops: New mp_clamp_comp function implemented.
+
+2012-09-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding complementing function.
+
+ * arith.c (logcomp): New function.
+
+ * eval.c (eval_init): logcomp registered as intrinsic.
+
+ * lib.h (logcomp) declared.
+
+ * mpi-patches/add-bitops: Fixed bugs in mp_xor. Implemented mp_comp.
+
+2012-09-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Starting work on adding bit operations. The semantics is that
+ negative integers behave as an "infinite bit two's complement".
+
+ * arith.c (logand, logor, logxor): New functions.
+
+ * eval.c (eval_init): New intrinsic functions logand, logior, logxor.
+
+ * lib.h (logand, logor, logxor): Declared.
+
+ * mpi-patches/series: New patch, add-bitops.
+
+ * mpi-patches/add-bitops: New file.
+
+2012-09-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Fix bug in ~x format directive for printing
+ integers in hex. When we use the printf's %x conversion specifiers for
+ fixnums, we get incorrect results when the values are negative, because
+ the argument is actually treated as an unsigned integer.
+ The end result is that (format t "~x" -1) produces FFFFFFFF
+ rather than -1. Also, merged together mindless code duplication.
+
+2012-09-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Implemented hexadecimal integer constants.
+ These will be very useful since bit operations are about
+ to be implemented.
+
+ * txr.1: Documented.
+
+2012-09-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New intrinsics: make-similar-hash, copy-hash,
+ hash-uni, hash-diff, hash-isec.
+
+ * hash.c (make_similar_hash, copy_hash, hash_uni, hash_diff,
+ hash_isec): New functions.
+
+ * hash.h (make_similar_hash, copy_hash, hash_uni, hash_diff,
+ hash_isec): Declared.
+
+ * txr.1: Updated.
+
+ * txr.vim: Highlighting for these new functions.
+
+2012-09-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Added test for <sys/stat.h>
+
+ * eval.c: New intrinsic functions "stat" and "prop".
+
+ * stream.c: Include <sys/stat.h> if we have it.
+ (w_stat, statf): New functions.
+ (val dev_k, ino_k, mode_k, nlink_k, uid_k,
+ val gid_k, rdev_k, size_k, blksize_k, blocks_k;
+ val atime_k, mtime_k, ctime_k): New sybol variables.
+ (stream_init): Intern new keywords symbols.
+
+ * stream.h (statf): Declared.
+
+ * txr.1: prop documented. Stub for stat created.
+
+2012-09-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): new instrinsic function /= registered.
+
+ * lib.c (numneqv): New function.
+
+ * lib.h (numneqv): Declared.
+
+ * txr.1: New function documented.
+
+2012-09-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_collect): Bug in processing of @(last) directive.
+ When a match for the @(last) material occured at the end of data,
+ c->data was being mistakenly set to nil rather than t before breaking
+ out of the loop, wreaking havoc. This is not a regression; this
+ was there since the inception of @(last) between versions 38 and 39.
+
+2012-09-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented string library.
+
+2012-09-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Follow function renames.
+
+ * hash.c (make_hash): Likewise.
+
+ * lib.c (assq): Renamed to assql for consistency.
+ (aconsq_new): Renamed to aconsql_new.
+ (aconsq_new_l): Renamed to aconsql_new_l.
+ (alist_remove_test): Use equal rather than eq. Association lists
+ use equal equality by default.
+ (alist_nremove): Use memqual rather than memq.
+ (alist_nremove1): Use equal rather than eq.
+ (merge): Bugfix: unnecessary consing caused by using append
+ instead of nconc on list pieces that are already destructively
+ chopped up. This has implications for the efficiency of sort
+ over lists!
+ (multi_sort_less): Implement key functions.
+ (multi_sort): Interface change: arguments rearranged, and new
+ argument to specify key functions.
+
+ * lib.h (assoc, assq, assql, aconsq_new, aconsq_new_l): Declarations
+ renamed.
+ (multi_sort): Declaration updated.
+
+ * txr.1: Documented alist library, list sorting and completed
+ documenting lazy library.
+
+ * txr.vim: multi-sort highlighted.
+
+2012-09-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Lots of new documentation. Major rearrangement of document,
+ with new headings.
+
+2012-09-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (symbol_function): Bugfix: return the function rather than
+ the whole binding.
+
+2012-09-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Minor corrections, and documented most stream functions,
+ except directory-related ones.
+
+2012-09-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented print, pprint, tostring and tostringp.
+
+2012-08-31 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Bugfix: under the ~a and ~s directives,
+ apply field formatting to the object not only if a nonzero width has
+ been specified, but also if precision has been specified.
+
+ * txr.1: documented stream global variables and format.
+
+2012-08-31 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand): Bugfix: failure to handle regular
+ expression syntax, resulting in (set ...) syntax being regarded as
+ assignment (due to another recent change).
+
+2012-08-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented chain, andf, orf and iff.
+
+2012-08-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_intrinsic): Bugfix: take the expanded form instead
+ of throwing it away.
+ (expand): Recurse into expand_place for (set ...) forms.
+
+ * txr.1: Documented eval.
+
+2012-08-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented all functions related to hashing.
+
+2012-08-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (multi_sort_less): Fixing semantics of return value. Individual
+ sorted lists are returned, rather than a list of zipped tuples.
+
+2012-08-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (multi_sort_less): Change the semantics so that when the
+ list of the functions is empty, the left item is considered less
+ than the right, thereby preserving the order.
+
+2012-08-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (mapcarv): Changed to external linkage.
+
+ * eval.h (mapcarv): Declaration added.
+ (eval_init): New intrinsic multi-sort registered.
+
+ * lib.c (multi_sort_less): New static function.
+ (multi_sort): New function.
+
+ * lib.h (multi_sort): Declared.
+
+ * txr.1: stub section added.
+
+2012-05-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Registered open-command and open-process
+ intrinsics. open-pipe is now deprecated but stays for backward
+ compatibility as a synonym for open-command.
+
+ * stream.c (open_pipe): Renamed to open_command.
+ (open_pipevp): Renamed to open_process.
+
+ * stream.h (open_pipe, open_pipevp): Declarations updated.
+
+ * txr.1: Documentation headings updated.
+
+2012-05-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (open_pipev): Bugfix: program name is included
+ as first element of argv.
+
+2012-05-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Implement open_pipev in terms of popen for Windows which
+ does not have for or exec. We could use CreateProcess and CreatePipe,
+ et cetera, but it won't buy us anything because the whole point
+ of this function is to improve the argument passing, and CreateProcess
+ takes a single command line string, not too different from popen.
+
+ * stream.c (pipev_close, make_pipev_stream): Surrounded with
+ HAVE_FORK_STUFF ifdef.
+ (pipe_close): Choice of close strategy conditional on HAVE_FORK_STUFF.
+ (open_pipev): Conditionally defined in two ways now.
+ (win_escape_arg, win_make_cmdline): New static functions.
+
+2012-05-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: New test added for fork, pipe, exec and waitpid.
+ Produces HAVE_FORK_STUFF in config.h.
+
+2012-05-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (w_fopen, w_popen): Removing unnecessary casts of
+ return values of ut8_dup_to.
+
+ * match.c (complex_open): Likewise.
+
+ * stream.c (w_opendir): Likewise.
+
+2012-05-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing new pipe function to get around the limitation
+ that popen accepts a complete command. We need something which
+ accepts a program name, and a list of arguments, so that
+ we don't have to assemble together a correctly quoted string.
+ popen needs an alternative interface resembling execvp.
+
+ * eval.c (eval_init): New intrinsic registered, open-pipe-args.
+
+ * stream.c (struct stdio_handle): New member, pid.
+ (stdio_stream_print): Print the pid, if it is nonzero.
+ (pipevp_close): New close function.
+ (pipe_close): If h->pid is nonzero, it's a new-style pipe, which
+ must be closed with pipev_close.
+ (make_stdio_stream, make_pipe_stream): Initialize new stdio_handle
+ member to zero.
+ (make_pipevp_stream): New static function.
+ (open_pipevp): New function.
+
+ * stream.h (open_pipevp): Declared.
+
+ * txr.1: open-pipe-args added to stub section heading.
+
+2012-05-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_collect): Implemented semantics for repeat symbol.
+ (dir_tables_init): Register dispatch for repeat to v_collect
+ function.
+
+ * parser.y (collect_repeat): New nonterminal symbol.
+ (clause): Removed repeat_clause error case because that now clashes
+ with the syntax in collect_clause.
+ (collect_clause): Repeat syntax implemented, with help of
+ collect_repeat.
+ (out_clause): Error case for collect_clause removed due to
+ syntactic clash.
+
+ * txr.1: Added mention of @(collect :vars nil) and documented
+ @(repeat) as the shorthand.
+
+2012-05-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Do not capture the stderr of GNU Make in the
+ configure step; send it to /dev/null.
+
+ * txr.spec: Adding specfile for building RPMs.
+
+2012-04-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (range_v_func, range_v_star_func): Restore the order of
+ arguments to plus, so that the from object is on the left. This
+ change was introduced in a commit on 2012-02-14, causing
+ character ranges to break due to bug that addition did not
+ commute for char + fixnum. Although the previous commit fixed
+ the regression, it's still good to have the object on the
+ left in case there are some future data types in case there
+ is ever some form of addition which does not commute.
+
+2012-04-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus): Fixed broken (+ fixnum char) case.
+
+2012-04-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixes for configuring and building in a separate directory.
+
+ * configure: MPI is now extracted and patched in the build directory,
+ not in the source directory.
+
+ * Makefile (CFLAGS): Refer to mpi headers relative to current
+ directory, not $(top_srcdir).
+ (repatch): Run MPI repatching steps in correct directory.
+ (clean): Remove extracted MPI from build directory.
+
+2012-04-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 65
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-04-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * regex.c (regex_space_chars): Variable removed.
+ (char_set_addr_str): New function.
+ (char_set_compile): Use char_set_addr_str to
+ add spaces to set.
+ (init_special_char_sets): Use char_set_addr_str to
+ add spaces to set. Bugfix: word_cs, cword_cs wrongly initialized.
+ (regex_init): Removed reference to regex_space_chars.
+
+2012-04-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (regtoken): New nonterminal symbol.
+ (regterm): REGTOKEN production factored out to regtoken.
+ (regclass): Reverted prior commmit's changes.
+ (regclassterm): Reverted prior commit, removing REGTOKEN
+ production for character classes, and introduced a regtoken
+ production. So now the keyword symbols are part of the
+ character class abstract syntax.
+ (regtoken): New production rule.
+
+ * regex.c (regex_space_chars): Converted to internal linkage.
+ (char_set_compile): Handle token keywords in character class
+ abstract syntax.
+
+ * regex.h (regex_space_chars): External declaration removed.
+
+2012-04-19 Kaz Kylheku <kaz@kylheku.com>
+
+ First cut at implementing \s, \d, \w, \S, \D and \W regex tokens.
+
+ * lib.c (init): Call regex_init.
+
+ * parser.l: return new REGTOKEN kind.
+
+ * parser.y (REGTOKEN): New token type.
+ (REGTERM): Translate REGTERM to keyword.
+ (regclass): Restructured to handle inherited nodes as lists.
+ (regclassterm): Produce $$ as list. Add handling for REGTOKEN
+ occurring inside character class by expanding it. This might not
+ be the best approach.
+ (yybadtoken): Handle REGTOKEN in switch.
+
+ * regex.c (struct any_char_set, struct small_char_set,
+ struct displaced_char_set, struct large_char_set,
+ struct xlarge_char_set): New bitfield member, stat.
+ (char_set_create): New parameter for indicating static char set.
+ (char_set_destroy): Do not free a static char set.
+ (char_set_compile): Pass zero to new parameter of char_set_create.
+ (spaces): New static array.
+ (space_cs, digit_cs, word_cs, cspace_cs, cdigit_cs, cword_cs): New
+ static pointers to char_set_t.
+ (init_special_char_sets, nfa_compile_given_set): New static function.
+ (nfa_compile_regex, dv_compile_regex): Handle new character set token
+ keywords.
+ (space_k, digit_k, word_char_k, cspace_k, cdigit_k, cword_char_k,
+ regex_space_chars): New variables.
+ (regex_init): New function.
+
+ * regex.h (space_k, digit_k, word_char_k, cspace_k, cdigit_k,
+ cword_char_k, regex_space_chars, regex_init): Declared.
+
+ * txr.1: Documented.
+
+2012-04-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New intrinsic functions remq*, remql*,
+ remqual*, remove-if*, keep-if*.
+
+ * lib.c (rem_lazy_func, rem_lazy_rec): New static functions.
+ (remq_lazy, remql_lazy, remqual_lazy, remove_if_lazy,
+ keep_if_lazy): New functions.
+
+ * lib.h (remq_lazy, remql_lazy, remqual_lazy, remove_if_lazy,
+ keep_if_lazy): Declared.
+
+ * txr.1: New functions documented.
+
+2012-04-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): find-if intrinsic registered.
+
+ * lib.c (find): First and second arguments reversed.
+ The item should be first.
+ (find_if): New function.
+
+ * lib.h (find): Declaration updated.
+ (find_if): Declaration added.
+
+ * txr.1: Stub section.
+
+2012-04-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Added notes on generational garbage collection.
+
+2012-04-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New functions remove-if and keep-if.
+
+ * lib.c (remove_if, keep_if): New functions.
+
+ * lib.h (remove_if, keep_if): Declared.
+
+ * txr.1: Documented.
+
+2012-04-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Restructuring configure script to be able to detect
+ nonexistent options. Variable default values are established first,
+ which simplifies the syntax. The scanning loop detects attempts
+ to create configuration variables that do not exist.
+ The var_given convention is folded into the parsing. (If var
+ exists, and var_given exists, and the user specifies var,
+ then var_given is set to y to indicate that the value came
+ from the user.)
+
+2012-04-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: multiple uses of @(next :args) seeing junk "args" string
+ in argument list. Fix is not to rely on the hack of using the first
+ element of the list of files to hold the name of the current file.
+
+ * match.c (match_files_ctx): New member, curfile.
+ (mf_all): Initialize curfile.
+ (mf_args): Set curfile to "args".
+ (mf_file_data): Initialize curfile.
+ (v_skip, v_fuzz, v_gather, v_collect): Use c->curfile rater than
+ first(c->files) in debug calls.
+ (freeform_prepare, match_files): Pass c->curfile to ml_all constructor
+ of match_line_ctx rather than rather than first(c->files).
+
+2012-04-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Improve the regex Lisp syntax by allowing strings to specify
+ character compounds. I.e. the syntax "foo" is equivalent to the
+ cumbersome canonical form (compound #\f #\o #\o).
+
+ * regex.c (nfa_compile_regex, dv_compile_regex): Use chrp function
+ instead of typeof. Handle stringp case by forming a compound out of the
+ characters and recursing. Check for some bad objects in the regex
+ that would never come out of our regex parser but could occur
+ in a "hand crafted" syntax tree.
+
+2012-04-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Fix misleading comment example.
+
+2012-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding patch to MPI to disable its Makefile so people don't try
+ to work around TXR build problems by running make inside
+ the MPI directory, which is wrong.
+
+ Also fixing an incorrect use of ctype.h functions in
+ MPI and one case of a superfluous warning.
+
+ * mpi-patches/series: new patches added.
+
+ * mpi-patches/disable-make: New file.
+
+ * mpi-patches/fix-ctype-warnings: New file.
+
+2012-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ More NetBSD porting.
+
+ * Makefile (EXTRA_FLAGS): Handy new variable for additional
+ ad-hoc CFLAGS. Needed by a new test in configure.
+
+ * configure: Check for annoying warnings about char being used
+ as an array subscript when calling the macros from <ctype.h>.
+ If this occurs, suppress it by #undef-ing the macros.
+ (lang_flags): Switching fromm _XOPEN_SOURCE to _XOPEN_SOURCE=2
+ because this is needed on NetBSD to obtain declarations of
+ popen and pclose.
+
+ * stream.c (pipe_close): If we don't have the WIFCONTINUED macro,
+ then define it to expand to zero. It's absent on NetBSD and they
+ already seem to have a hack for this because there is a warning about
+ the function not being defined, but then the program links anyway.
+ Let's do it properly and not rely on their hack.
+
+2012-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (INT_PTR_MAX_MP): New static variable.
+ (in_int_ptr_range): New function.
+ (arith_init): Initialize INT_PTR_MAX_MP.
+
+ * arith.h (in_int_ptr_range): Declared.
+
+ * lib.c (c_num): Allow bignums to be converted to a cnum, if
+ they are in range, rather than allowing only fixnums.
+
+ * rand.c (make_random_state): Now that we have such a function,
+ initialize random seed using time value from time_sec_usec rather than
+ from time and clock. clock is bad for random seeding because it
+ measures virtual time since the start of the process.
+
+2012-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Switch from _POSIX_C_SOURCE=2 to _XOPEN_SOURCE.
+ We will be relying on the gettimeofday function which only came
+ into POSIX in 2001, but was in Unix long before then.
+
+ * HACKING: Replace notes about -D_POSIX_C_SOURCE which are not true
+ any more.
+
+2012-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (conftest.ccver): New phony target.
+
+ * configure: The test for non-working 128 bit integers in the gcc
+ used by NetBSD 5.1 is not good enough to catch the bug.
+ Adding a test which will assume that gcc 4.3.x and lesser
+ does not have working 128 bit types.
+
+2012-04-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Expose regex-compile and regexp as intrinsics.
+
+ * lib.c (obj_init): Change spelling of nongreedy operator and put
+ it into the user package so that it is available for use with
+ regex-compile.
+
+ * regex.c (match_regex, search_regex): Bugfix: optional start
+ position argument argument not defaulting to zero.
+
+ * txr.1: Documented regex-compile and regexp.
+
+ * txr.vim: Highlighting regex-compile and regexp.
+
+2012-04-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Port to NetBSD (5.1).
+
+ * arith.c (bignum_dbl_ipt): Added missing #if HAVE_DOUBLE_INTPTR_T
+ around function
+
+ * configure: NetBSD's shell is too pathetic to expand "$@" properly
+ when there are no positional arguments, so I applied the ${@+"$@"}
+ trick.
+ (make): New variable. GNU make might be known only as gmake,
+ so we now detect the command for our own use within the configure
+ script and also for giving the user advice on what command to use for
+ building. Put in a fix so that the attempt to run $make --version
+ does not bail the script under "set -e" if that command terminates
+ unsuccessfully.
+ The check for clashing names has been moved earlier, so that
+ the renaming #define's appear early in config.h (so config.h itself
+ can rely on the renames). The identifier longlong_t has been added
+ to the potential clash list. NetBSD exposes this identifier in spite
+ of -D_POSIX_SOURCE=2, and it clashes with our longlong_t.
+ The tests for integers wider than long long has been modified
+ to actually compile a multiplication of two long-long-s into
+ the wider precision. On the NetBSD system, with gcc 4.1.3, I found
+ that the __int128 type is there, but doesn't actually work;
+ compilation of arith.c bails with an internal compiler error.
+ We now get this internal error at configure time and avoid using
+ the type.
+
+2012-04-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/add-mp-hash (mp_hash): Fix incorrect
+ code on platforms where mp_digit is smaller than long.
+ This was left shifting a mp_digit by MP_DIGIT_BIT.
+ It was found by compiling on NetBSD with a gcc 4.1.3
+ which has a broken__int128_t, forcing us to use 32 bit
+ mp_digit with a 64 bit mp_word.
+
+2012-04-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (bignum): Previously static function now exposed as external.
+
+ * arith.h (bignum): Declared.
+
+ * configure: Added check for tm_gmtoff and tm_tmzone fields
+ being present in struct tm.
+
+ * eval.c (eval_init): New intrinsic functions: time, time-usec.
+
+ * lib.c (num): If the cnum is outside of the fixnum range, then
+ construct a bignum.
+ (time_sec, time_sec_usec): New functions.
+
+ * lib.h (mut): Slight change to macro to eliminate compiler warning.
+ (time_sec, time_sec_usec): Declared.
+
+ * txr.1: Stub section for time and time-usec.
+
+ * txr.vim: Highlighting for time and time-usec.
+
+2012-04-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Fixed accidental breakage.
+
+2012-04-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c: Revert earlier change: config.h must be included before the
+ <windows.h> section because that header is conditionally included
+ based on one of the config constants.
+
+2012-04-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixes to get configure ccname=g++ working on OSX Lion.
+
+ * Makefile (conftest.syms): Use -n flag in nm so that the output
+ is not alphabetically sorted, but numerically. We need this
+ to get the symbols ordered by increasing offset.
+
+ * configure (read_syms): New function. Factors out logic used
+ in two places for reading the output of nm. On OSX Lion, it looks
+ like we do not get symbol sizes but offsets only, when compiling
+ with g++. The symbols are in an S section. When compiling with
+ gcc, we get a common C section with symbol sizes.
+ So the hack is to use the deltas between offsets to get the sizes.
+ The objects had to be re-ordered in decreasing rank so alignment
+ doesn't create padding that will get counted as the size.
+ Interleaved dummy objects of type char should also work.
+
+2012-04-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Print done and terminate line after checking for
+ clashing symbols.
+
+2012-04-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Added new check for some clashing external names,
+ which we can redefine out of the way in config.h.
+
+ * lib.c: config.h was being included before <windows.h>.
+
+2012-04-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented int-flo, flo-int, search-regex,
+ match-regex and regsub.
+
+2012-04-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Rounding out hash table functionality with lazy lists that
+ can walk table content in different ways.
+
+ * eval.c (op_dohash): Follow interface change of hash_next.
+ (eval_init): hash-keys, hash-values, hash-pairs and hash-alist
+ intrinsics introduced.
+
+ * filter.c (trie_compress): Follow interface change of hash_next.
+
+ * hash.c (hash_next): Silly interface which takes a pointer to
+ the iterator has changed to just take the iterator. The function
+ unambiguously returns nil when the iteration ends, so there
+ is no need to set the iterator variable to nil.
+ (maphash): Follows interface change of hash_next.
+ (hash_keys_lazy, hash_values_lazy, hash_pairs_lazy, hash_alist_lazy):
+ New static functions.
+ (hash_keys, hash_values, hash_pairs, hash_alist): New functions.
+
+ * hash.h (hash_next): Declaration updated.
+ (hash_keys, hash_values, hash_pairs, hash_alist): Declared.
+
+ * lib.c (make_half_lazy_cons): New way of constructing lazy cons,
+ with the car field specified. It simplifies situations when the
+ previous cons computes the car of the next one. Why hadn't I thought of
+ this before?
+
+ * lib.h (make_half_lazy_cons): Declared.
+
+ * txr.1: Doc stubs for new hash functions.
+
+ * txr.vim: Highlighting for new hash functions.
+
+2012-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 64
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: @[...] syntax not marked as "contained" because it
+ can freely occur, and is useful in @(output).
+
+2012-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (FRESHQ_SIZE): Preprocessor symbol renamed to FRESHOBJ_VEC_SIZE.
+ (freshobj, make_obj): Object and function definitions follow rename.
+
+2012-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (mark_obj, sweep_one, gc_is_reachable): Check for gen > 0 rather
+ than gen == 0. This allows gen == -1 objects to be considered the
+ same as gen == 0, and traversed.
+ (gc_set, gc_mutated): When a gen 0 object is added to the checkobj
+ array, set its generation to -1. This prevents duplicates in
+ the checkobj array. Also, it fixes a bug: an vector marked as
+ mutated was not being traversed due to being in generation 1.
+
+2012-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Code cleanup and tweaking.
+
+ * gc.c (BACKPTR_VEC_SIZE): Preprocessor symbol renamed to
+ CHECKOBJ_VEC_SIZE.
+ (FULL_GC_INTERVAL): Increased to 40 since the modified
+ algorithm now leaves less work for the full gc to do.
+ (backptr, backptr_idx): Static variables renamed to
+ checkobj and checkobj_idx.
+ (mark): Follows rename of backptr and backptr_idx.
+ (gc): Commented out handy printf added.
+ (gc_set): Use in_malloc_range check to avoid adding to
+ the check array pointers which are being stored in non-heap locations,
+ since non-heap locations are already GC roots.
+ (gc_mutated): Follows variable renaming.
+ (gc_push): Just do the push using gc_set.
+
+ * lib.c (malloc_low_bound, malloc_high_bound): New variables.
+ (chk_malloc, chk_calloc, chk_realloc): Updated malloc_low_bound
+ and malloc_high_bound.
+ (in_malloc_range): New function.
+
+ * lib.h (in_malloc_range): Declared.
+
+2012-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ The mut macro should only be used for vectors or vector-like objects
+ which hold direct references to other objects and must be used
+ each time a mutation takes place.
+
+ * eval.c (op_dohash): invocations of mut macro removed.
+ Comment rewritten.
+
+ * lib.c (sort_list): Use set macro for mutating assignment.
+ Do not invoke mut on sorted list; it won't work anyway, because
+ it doesn't mean what the code wants it to mean: that the list will be
+ fully traversed during gc marking.
+
+2012-04-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Bunch of fixes.
+
+ * gc.c (gc_mutated): Return the value.
+
+ * gc.h (gc_mutated): Declaration updated.
+
+ * hash.c (remhash): Fix unsafe assignment to use set macro.
+
+ * lib.c (sort): Fix wrong use of mut macro on the list
+ before it is sorted rather than after.
+
+ * lib.h (mut): Trivial version of macro updated to return argument.
+
+ * unwind.c (uw_init): The toplevel environment's match_context
+ should be gc_protected. Though this is probably not used,
+ which is why it has not been a problem.
+
+2012-04-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_grow, gethash_l, gethash, gethash_f): Replace
+ useless use of *vecref_l() with vecref().
+
+2012-04-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (gen_gc): Default to off.
+ Help section added for gen_gc variable.
+
+ * gc.c (gc): Some missing CONFIG_GEN_GC added.
+
+2012-04-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Code cleanup.
+
+ * gc.c (backptr_oflow): Static variable removed.
+ (freshq_head, freshq_tail, partial_gc_count): Static variables removed.
+ (freshq): Array renamed to freshobj.
+ (full): Variable renamed to full_gc.
+ (freshobj_idx): New varaible.
+
+ (make_obj): Add newly born objects to freshobj array rather than
+ freshq. If freshobj array is full on entry to this function,
+ trigger gc to empty it. make_obj no longer updates the free_tail;
+ the gc routine takes care of restoring this invariant.
+ (mark_obj): Follows rename of full_gc. Some code was not wrapped
+ in #if CONFIG_GEN_GC.
+ (mark, sweep_one): Follow rename of full_gc.
+ (sweep): On entry, restore free_tail invariant in the empty
+ free_list case. Code which processes freshq from tail to head
+ replaced by simple array walk of freshobj. Code wrapped properly
+ in #if CONFIG_GEN_GC.
+ (gc): Logic for triggering full gc simplified.
+ Check added for situations when a partial gc is called when
+ the free list empties, and it doesn't liberate enough memory.
+ This prevents the situation of partial gc being called over and over
+ again by make_obj, squeezing less and less memory each time until
+ finally it returns 0 objects, and more() is called.
+ (gc_is_reachable): Follows rename of full_gc, and #if CONFIG_GEN_GC
+ added.
+ (gc_set, gc_mutated): Simplified. Check if the backptr array
+ is full and trigger gc if so to flush it, then just add to the array.
+
+2012-04-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Performance tweaking and fixes.
+
+ * gc.c (BACKPTR_VEC_SIZE): Increase greatly, so that we don't
+ trigger gc due to overflow of the backptr array. This is not likely
+ to yield a lot of free objects except in a full GC.
+ (FULL_GC_INTERVAL): From 10 to 20.
+ (gc): Take a not of whether or not gc was entered with free_list
+ being exhausted or not. Call more() only if the free_list was
+ empty, and a full sweep was done.
+ Reset partial_gc_count only when a full gc is triggered.
+
+2012-04-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix failing test case tests/006/freeform-1.txr.
+
+ * lib.c (lazy_str_force, lazy_str_force_upto): Use set macro
+ when assigning lim. This won't cause a problem unless lim is
+ in the bignum range, however.
+ (acons_new, aconsq_new): When overwriting the cdr value of
+ the existing entry, use set. This is the smoking gun;
+ these functions are used for manipulating bindings.
+ (sort): After sorting a list, we must mark it as having
+ been mutated. If a list contains only mature conses or only
+ fresh conses, there is no problem. But if it contains a mixture,
+ then sorting could reverse their relationship, causing mature
+ conses to backpoint to the fresh ones.
+ (obj_init): Use set when installing the t symbol into the user package.
+
+2012-04-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Generational GC showing signs of working. One test case in
+ test suite fails.
+
+ * gc.c (FRESHQ_SIZE): New preprocessor symbol.
+ (backptr_oflow, freshq, freshq_head, freshq_tail): New static
+ variables.
+ (make_obj): Place newly allocated generation 0 object into
+ freshq. If freshq becomes full, transfer oldest item into
+ generation 1.
+ (mark_obj): If doing only a partial gc, then do not mark
+ objects which are not generation 0.
+ (mark_mem_region): Valgrind support: cannot mark t.type field undefined
+ because it is a bitfield. Just mark the first SIZEOF_PTR bytes
+ of the object defined.
+ (mark): Under partial gc, mark the table of back pointers.
+ (sweep_one): New static function from the prior guts of sweep.
+ Reachable objects now get promoted to generation 1.
+ (sweep): Under partial gc, sweep just the freshq which identifies
+ the generation 0 objects, rather than the entire linked list of all the
+ heaps.
+ (gc): Trigger full gc also if the backptr list has overflowed
+ due to gc having been disabled.
+ Under generational gc, reset the static variables afterward:
+ clear the list of backpointers, and the freshq.
+ (gc_is_reachable): Under partial gc, report any mature object
+ as reachable.
+ (gc_set, gc_mutated): Handle backptr array overflow situation
+ when gc is disabled.
+ (gc_push): Bugfix: it is the newly pushed cons cell that has to be
+ marked as a root, not the value being pushed.
+
+ * hash.c (sethash): Use set macro for storing value.
+
+ * lib.h (set, mut, mpush): Fix wrong-way #if test for these macros.
+ The trivial versions were being defined uner CONFIG_GEN_GC and vice
+ versa!
+
+2012-04-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_modplace): push replaced with mpush (mutating push).
+
+ * gc.c (gc_push): New function.
+
+ * gc.h (gc_push): Declared.
+
+ * hash.c (pushhash): Use mpush.
+
+ * lib.c (push): Reverted to unsafe operation. TODO comment replaced
+ with warning.
+ (lazy_flatten_scan): push occurence commented as safe.
+ (lazy_stream_func): Unsafe push replaced with mpush.
+
+ * lib.h (mpush): New macro.
+
+2012-04-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Support a gen-gc configuration variable which
+ causes CONFIG_GEN_GC to be defined as 1 in config.h.
+
+ * eval.c (op_defvar, dwim_loc, op_modplace, transform_op): Handle
+ mutating assignments via set macro.
+ (op_dohash): Inform gc about mutated variables. TODO here.
+
+ * filter.c (trie_add, trie_compress): Handle mutating assignments
+ via set macro.
+
+ * gc.c (BACKPTR_VEC_SIZE, FULL_GC_INTERVAL): New preprocessor symbols.
+ (backptr, backptr_idx, partial_gc_count, full): New static variables.
+ (make_obj): Initialize generation to zero.
+ (gc): Added logic for deciding between full and partial gc.
+ (gc_set, gc_mutated): New functions.
+
+ * gc.h (gc_set, gc_mutated): Declared.
+
+ * hash.c (hash_mark): Changed useless use of vecref_l to vecref.
+ (gethash_f): Use set when assigning through *found since it
+ is a possible mutation.
+
+ * lib.c (car_l, cdr_l, vecref_l): Got rid of loc macro uses. Using the
+ value properly is going to be the caller's responsibility.
+ (push): push may be a mutation, so use set.
+ (intern): Uset set to mutate a hash entry.
+ (acons_new_l, aconsq_new_l): Use set when replacing *list.
+
+ * lib.h (PTR_BIT): New preprocessor symbol.
+ (obj_common): New macro for defining common object fields.
+ type_t is split into two bitfields, half a pointer wide,
+ allowing for generation to be represented.
+ (struct any, struct cons, struct string, struct sym, struct package,
+ struct func, struct vec, struct lazy_cons, struct cobj, struct env,
+ struct bignum, struct flonum): Use obj_common macro to defined
+ common fields.
+ (loc): Macro removed.
+ (set, mut): Macros conditionally defined for real functionality.
+ (list_collect, list_collect_nconc, list_collect_append): Replace
+ mutating operations with set.
+
+ * match.c (dest_set, v_cat, v_output, v_filter): Replace
+ mutating operations with set.
+
+ * stream.c (string_in_get_line, string_in_get_char,
+ strlist_out_put_string, strlist_out_put_char): Replace mutating
+ operations with set.
+
+ * unwind.c (uw_register_subtype): Replace mutating operation with set.
+
+2012-04-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (vec_set_length): Use set instead of assignment.
+ (vecref_l): Use loc to lift address of cell.
+ (replace_vec): Use macro mut to indicate the object is being
+ mutated.
+
+ * lib.h (mut): New macro.
+
+2012-04-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Start of ground-work for ephemeral GC. We must add some abstraction
+ to places where we potentially assign a reference to a younger object
+ inside a field located in an older object (chronological
+ backreference) and also where we take the address of an object
+ field, making it possible that the user of the address will do so.
+
+ This patch does not take care of vectors.
+
+ No, this is not an April Fool's joke.
+
+ * eval.c (env_fbind, env_vbind, env_replace_vbind, lookup_var,
+ lookup_sym_lisp1): Use set macro instead of assignment.
+
+ * hash.c (hash_grow, set_hash_userdata, hash_next):
+ Use set macro instead of assignment.
+
+ * lib.c (rplaca, rplacd, string_extend, length_str, replace_str,
+ rehome_sym, lazy_stream_func, lazy_str, lazy_str_force,
+ lazy_str_force_upto, obj_init): Use set macro instead of assignment.
+
+ (car_l, cdr_l): Use loc instead of address-of operator.
+
+ * lib.h (set, loc): New macros.
+
+2012-03-31 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (last_equal_key, last_equal_hash): New static variables.
+ (equal_hash): Caching optimization implemented.
+ (eql_hash): Optimization extended to those objects that have
+ equal semantics.
+ (hash_process_weak): Clear the cached hash during gc.
+
+2012-03-31 Kaz Kylheku <kaz@kylheku.com>
+
+ If one of the blocks which are subordinate to a @(trailer)
+ happen to request a successful termination by invoking @(accept)
+ the position must not advance into the trailer material.
+
+ * match.c (v_trailer): Added an unwind protect which
+ detects that an accept is taking place and adjusts the return value to
+ restrict the input position at the point given to trailer.
+ (accept_fail): Use uw_block_return_proto instead of uw_block_return
+ and pass the symbol as the protocol identifier.
+
+ * unwind.c (uw_current_exit_point): New function.
+ (uw_block_return): Function renamed to uw_block_return_proto;
+ takes new parameter which is stored in the block structure.
+
+ * unwind.h (struct uw_block): New member, protocol.
+ (uw_block_return): Becomes an inline wrapper for uw_block_return_proto.
+ (uw_block_return_proto, uw_current_exit_point): Declared.
+
+ * txr.1: Interaction between @(trailer) and @(accept) documented.
+
+2012-03-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_var): Disallow the variable named by the symbol t
+ by throwing an exception. Allow nil, but wherever nil occurs,
+ do not produce a binding.
+
+ * txr.1: State the restrictions against using t in the section
+ on Variables and also describe the nil ignore feature.
+
+2012-03-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Correction: backtracking does NOT take place into a block
+ which completed.
+
+2012-03-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documenting the debugger with an example session.
+
+2012-03-30 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 63
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-03-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (num_str): Much more accurate test for deciding whether
+ to treat the number as floating or integer. We can't just look
+ for the presence of E, e or . because these coudl be part of
+ trailing junk for instance "123XYZE." should convert
+ to the integer 123, where "XYZE." is trailing junk.
+
+ * txr.1: Documented int-str, flo-str and num-str.
+
+2012-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (numeq): Fix misplaced parenthesis.
+
+2012-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (min2, max2): Semantics tweak. If the numbers are equal,
+ favor the left one.
+
+ * txr.1: Documented min and max.
+
+2012-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (numeq): New function.
+ (exptmod): Bugfix: was no normalizing the bignum, ouch.
+ Also was reporting "non-integral operands" for other
+ errors.
+
+ * eval.c (eval_init): Registered = intrinsic function.
+
+ * lib.c (numeqv): New function.
+
+ * lib.h (numeq, numeqv): Declared.
+
+ * txr.1: Documented expt, sqrt, isqrt, exptmod, fixnump, bignump,
+ integerp, floatp, numberp, zerop, evenp, oddp, >, <, >=, <= and =.
+
+ * txr.vim: Highlight =
+
+2012-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (gcd): Allow zeros. Don't issue "non-integral"
+ exception if MPI fails.
+ (floorf, ceili): Map integer argument to itself.
+ (tang, asine, acosi): New functions.
+
+ * eval.c (eval_init): New intrinsics: tan, asin, acos.
+
+ * lib.h (tang, asine, acosi): Declared.
+
+ * txr.1: Documented gcd, abs, floor, ceil, sin, cos, tan
+ asin, acos, atan, log, and exp.
+
+ * txr.vim: Highlighting for tang, asine, acosi.
+
+2012-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (dmod): New static function.
+ (mod): Use dmod instead of fmod directly, to calculate
+ the correct semantics for combinations of
+ negative operands in the floating point domain also.
+
+ * txr.1: Documented /, trunc and mod.
+
+2012-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented +, - and *.
+
+2012-03-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: num-str added to doc stub.
+
+ * txr.vim: num-str added.
+
+2012-03-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_print, obj_pprint): Do not use the #<lazy-string ..>
+ notation for lazy strings that have been forced.
+
+2012-03-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Compensate for differences in printf
+ implementations with regard to printing floating point exponents.
+ by deleting any plus sign and leading zeros after the 'e'.
+
+ * tests/009/json.expected: Regenerated.
+
+2012-03-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Filtering on lists and nested lists is hereby made to work.
+ For instance given @(bind a ("a" "b" "c")) it is now possible
+ to do @(filter :upcase a) whereby a promptly takes on the value
+ ("A" "B" "C").
+
+ * filter.c (string_filter): Function renamed to string_tree_filter.
+ (compound_filter): Follows rename.
+ (filter_string): Function renamed to filter string tree.
+ Can filter tree of strings, or possibly other objects,
+ if the filter function allows.
+ (filter_equal): No special case test for objects that are strings.
+ Just put them through the filter.
+
+ * filter.h (filter_string): Declaration updated.
+
+ * match.c (format_field, subst_vars, v_filter): Follow rename.
+
+2012-03-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_output): Bugfix: we should flush the stream
+ after each @(output) block. Otherwise if output blocks
+ that go to standard output are interleaved with output blocks
+ which pipe to some command which then goes to standard out,
+ the output won't be in the proper order.
+
+2012-03-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New intrinsic num-str registered.
+
+ * filter.c (tonumber_k, tointeger_k, tofloat_k, hextoint_k):
+ New keyword variables.
+ (filter_init): New variables initialized; new filters registered.
+
+ * filter.h (tonumber_k, tointeger_k, tofloat_k, hextoint_k):
+ Declared.
+
+ * lib.c (num_str): New function.
+
+ * lib.h (num_str): Declared.
+
+ * txr.1: New filters documented.
+
+2012-03-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (to_float): Fix unterminated argument list in throwf.
+
+ * lib.c (funcall): Likewise.
+
+2012-03-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (rebind_s): New symbol variable.
+
+ * lib.h (rebind_s): Declared.
+
+ * match.c (v_rebind): New static function.
+ (dir_tables_init): Registered rebind_s to v_rebind,
+ and also to hv_trampoline in the horizontal directive table.
+
+ * txr.1: Documented it.
+
+2012-03-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35989
+
+ * match.c (syms_init): text_s must be in the system
+ package because it's not a user-visible operator.
+
+2012-03-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Performance improvement in the GC: keep at least one heap's worth
+ of free space, so programs close to exhausting a heap do not
+ waste cycles frequently calling the collector.
+
+ * gc.c (more): Do not assert that free_list is null; this will
+ not be the case any more.
+ (make_obj): Comment added regarding why we the free_tail variable
+ is fixed up.
+ (sweep): Now returns a count of the objects that are free.
+ (gc): If sweep reports that less than 75% of the objects are free
+ then let us add another heap.
+
+2012-03-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register match-str and match-str-tree
+ intrinsics.
+
+ * lib.c (match_str, match_str_tree): Default position to zero.
+
+ * txr.1: Doc stubs created.
+
+ * txr.vim: Highlighting for match-str and match-str-tree.
+
+2012-03-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: code like @(skip)@{var /partial/} where
+ the regular expression does not match all the way to
+ the end of the line was getting by the check for
+ a complete match.
+
+ * match.c (do_match_line): Loses the second parameter
+ named completely. The check whether the line was matched
+ completely is done higher up, in match_line_completely.
+ This is needed because do_match_line has some early
+ successful return cases which bypass the check.
+ (match_line): Remove second paramter in call to do_match_line.
+ (match_line_completely): Do the check here that the line
+ was matched completely. Nothing can get by this.
+ (v_freeform): Do notpass second nil argument to do_match_line.
+
+2012-03-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (search_str): If start_num is nil, default it to zero.
+ This is needed for this to work right as an optional argument.
+
+2012-03-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 62
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+2012-03-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * RELNOTES: Updated.
+
+ * txr.1: Describe floating-point constants.
+
+2012-03-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (TXR_ARGS): Pass new file to tests/009/json.txr test.
+
+ * tests/009/json.expected: Updated.
+
+ * tests/009/json.txr: Updated source. Translates to a more native
+ representation with vectors and hash tables. Numbers go to
+ floating point instead of remaining as strings.
+
+ * tests/009/pass1.json: New file: a test case from json.org.
+
+2012-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (expo): New function.
+
+ * eval.c (eval_init): expo registered as intrinsic exp.
+
+ * lib.h (expo): Declared.
+
+ * txr.1: Added to stub heading.
+
+ * txr.vim: Highlighting for exp.
+
+2012-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (transform_op): use integerp instead of numberp.
+ Not all numbers are integers now, and that situation
+ requires an integer.
+
+2012-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Bugfix: was not allowing e-notation floats
+ with no decimal point like 1E1.
+
+ * stream.c: (vformat): Keep track of whether or not precision was
+ given in precision_p local variable.
+ When printing #<bad-float> pass a precision of 0
+ to vformat_str, not precision, since precision does not apply.
+ In ~f and ~e, if the precision was not given, default
+ it to 3.
+ Restructured float printing in ~a and ~s. It now just uses sprintf's %g
+ with a precision. If user does not specify precision, it defaults
+ to DBL_DIG to print the number with reasonable accuracy.
+ A .0 is added if it sprintf produces an integer, and the conversion
+ is ~s rather than ~a.
+
+2012-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix sqrt confusion. There must be a separate isqrt
+ for the integer square root.
+
+ * arith.c (sqroot_fixnum): Renamed back to isqrt_fixnum.
+ (sqroot): Rewritten to handle only floating-point square root.
+ (isqrt): New function, based on previous sqroot,
+ handles only integers.
+
+ * eval.c (eval_init): New intrinsic, isqrt.
+
+ * lib.h (isqrt): New declaration.
+
+ * txr.1: Doc stubs.
+
+ * txr.vim: Highlighting for isqrt.
+
+2012-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (floorf, ceili, sine, cosi, atang, loga): New functions.
+
+ * eval.c (eval_init): New intrinsic functions registered:
+ floor, ceil, sin, cons, atan, log.
+
+ * lib.h (floorf, ceili, sine, cosi, atang, loga): Declared.
+
+ * txr.1: Doc stub section for new functions.
+
+ * txr.vim: Highighting added.
+
+2012-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (int_flo): If sprintf produces something
+ that doesn't begin with a digit, it's most likely NaN or Inf.
+ We can turn that into an exception.
+
+ * stream.c (vformat): If sprintf produces a non-number,
+ turn it into the printed representation #<bad-float>.
+
+2012-03-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (to_float): New static function.
+ (divi): Uses to_float.
+ (zerop, gt, lt, ge, le, expt): Floating support.
+ (isqrt_fixnum): Static function renamed to sqroot_fixnum.
+ (isqrt): Renamed to sqroot. Floating support.
+ (evenp, oddp, exptmod, gcd): Work with integers, not floats.
+
+ * eval.c (eval_init): intrinsic registration of sqrt follows rename of
+ isqrt to sqroot.
+
+ * lib.h (isqrt): Declaration replaced.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (divi): New function.
+
+ * eval.c (eval_init): divi registered as / intrinsic.
+
+ * lib.h (divi): Declared.
+
+ * txr.1: divi added to stub heading.
+
+ * txr.vim: / operator highlighted.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (mod): Floating support.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (trunc): Floating support.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus, minus, mul): Removing unnecessary type checks,
+ which are already implied by the switch case.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Doc stubs for new functions floatp, integerp,
+ float-str, int-flo and flo-int.
+
+ * txr.vim: Highlighting for new functions.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile: link in -lm, which is needed now on some systems.
+
+ * arith.c (plus, minus): Eliminated some unnecessary (double) casts.
+ (abso, mul): Floating support.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (neg): Floating-point support.
+
+ * parser.l: FLO and FLODOT cases had to be reordered because
+ the lex trailing context counts as part of the match length,
+ causing 3.0 to be matched as three characters with 0 as
+ the trailing context. The cases are split up to eliminate
+ a flex warning.
+
+ * stream.c (vformat): Support bignum in floating point
+ conversion. Bugfixes: floating point conversion was
+ accessing obj->fl.n instead of using n.
+ Changed some if/else ladders to switches.
+
+2012-03-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus): Minor code simplification.
+ (minus): Floating point support.
+
+ * mpi-patches/mpi-to-double (mp_to_double): Re-apply lost
+ bugfix: index incremented instead of decremented.
+ Didn't refresh patch last time, then did a make distclean.
+
+2012-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Regression fix: 1..3 scans incorrectly into 1. .3 tokens.
+
+ * parser.l (SGN, EXP, DIG): New regex definitions.
+ (FLO): Do not recognize numbers of the form 123.
+ Decimal point must be followed either by exponent, or digits
+ (which may then be followed by an exponent).
+ (FLODOT): New token type, recognizes 123.
+ (grammar): Recognize FLODOT as a floating point number,
+ only if it not trailed by another dot, and
+ recognize FLO unconditionally.
+
+2012-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus): Completed implementation of bignum-float
+ and float-bignum cases.
+
+2012-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Use larger num_buf buffer so we don't
+ overrun. IEEE double floats can go to e+-308.
+
+2012-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (flo_int): New function.
+
+ * eval.c (eval_init): flo-int registered as intrinsic.
+
+ * lib.h (flo_int): Declared.
+
+ * mpi-patches/series: Added mpi-to-double to patch stack.
+ (mp_to_double): New MPI function.
+
+ * mpi-patches/mpi-to-double: New file.
+
+2012-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus): Optimization: use num_fast when
+ result is in the fixnum range.
+ Implemented FLNUM cases, except for adding a FLNUM
+ to BGNUM.
+ (minus, mul): Use num_fast when the cnum value is in the fixnum range.
+ (int_flo): New function.
+
+ * eval.c (eval_init): Register int-flo intrinsic.
+
+ * lib.c (c_flo): New function.
+
+ * lib.h (TYPE_SHIFT, TYPE_PAIR): New macros, carried over
+ from the lazy strings branch.
+ (c_flo, int_flo): Declared.
+
+2012-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (FLO): Adjusted syntax of floating point numbers
+ to allow leading or trailing decimal.
+
+2012-03-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): num_buf increased to 256 because we
+ are now printing floating point numbers into it, letting
+ the C library handle precision which can generate many digits.
+ We cap the precision at at 128. New format specifiers ~e
+ and ~f implemented, which loosely correspond to those of printf.
+ The ~s and ~a directives handle floats similarly to ~g in
+ printf, except that they ensure that a decimal point is printed
+ for the non-exponential notation.
+
+2012-03-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (uintptr): New variable. Indicates whether unsigned
+ version of intptr_t is available and should be generated in config.h
+ as uintptr_t.
+
+ * eval.c (eval_init): New intrinsic functions floatp,
+ integerp, flo-str.
+
+ * gc.c (finalize): Handle FLNUM case. Rearranged
+ cases so that all trivially returning cases are
+ together.
+ (mark): Handle FLNUM case.
+
+ * hash.c (hash_double): New function.
+ (equal_hash): Handle FLNUM via hash_double.
+ (eql_hash): Likewise.
+
+ * lib.c: <math.h> is included.
+ (float_s): New symbol variable.
+ (code2type, equal): Handle FLNUM case in switch.
+ (integerp): New function; does the same thing
+ as integerp before.
+ (numberp): Returns t for floats.
+ (flo, floatp, flo_str): New functions.
+ (obj_init): Initialize new float_s variable.
+ (obj_print, obj_pprint): Handle FLNUM case in switch.
+ Printing does not work yet; needs work in stream.c.
+
+ * lib.h (enum type): New enumeration FLNUM.
+ (struct flonum): New struct type.
+ (union obj): New member, fl.
+ (float_s, flo, floatp, integerp, flo_str): Declared.
+
+ * parser.l (FLO): New token pattern definition.
+ Scans to a NUMBER token.
+ Corrected uses of yylval.num to yylval.val.
+
+ * parser.y (%union): Removed num member from yystype.
+
+2012-03-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (debug): Breakpointing now takes into account
+ the module file name, not only the line number. Breakpoints work on
+ source locations rather than line numbers. Boy, this was easy.
+ Keep the breakpoint list free of duplicates. Issue a message
+ if a nonexistent breakpoint is asked to be deleted.
+
+2012-03-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): url_decode has two parameters now,
+ so we make the second one optional.
+
+ * filter.c (topercent_k, frompercent_k): New keyword
+ variables.
+ (url_encode, url_decode): Take a second parameter, space_plus.
+ This determines whether or not to apply the rule that
+ a space encodes as a + character.
+ (filter_init): Initialize new keyword variables, and register :topercent
+ and :frompercent filters. Fix the previous registrations of :tourl and
+ :fromurl using currying.
+
+ * filter.h (urlencode, urldecode): Declarations updated.
+ (topercent_k, frompercent_k): Declared.
+
+ * txr.1: Documented.
+
+2012-03-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Changing type function to not blow up on nil, which makes a lot of code
+ simpler. A pseudo type code is introduced called NIL with value 0.
+
+ * lib.h (enum type): New enumeration value, NIL.
+ (type): Function accepts object nil and maps it to code NIL.
+
+ * eval.c (dwim_loc, op_dwim): test for nil obj and goto hack is gone,
+ just handle NIL in the switch.
+
+ * gc.c (make_obj, mark): Handle new NIL type code in switch.
+
+ * hash.c (equal_hash): Handle NIL in the switch instead of nil test.
+
+ * lib.c (code2type): Map new NIL type code to null.
+ (typeof, typecheck): Code simplified.
+ (class_check, car): Move nil test into switch.
+ (eql, equal, consp, bignump, stringp, lazy_stringp,
+ symbolp, functionp, vectorp, cobjp): Simplified.
+ (length, sub, ref, refset, replace, obj_print, obj_pprint): Handle NIL
+ in switch instead of nil test. goto hack removed from refset.
+
+ * match.c (do_match_line, do_output_line): switch condition simplified.
+
+ * regex.c (regexp): Simplified.
+ (regex_nfa): Assert condition simplified.
+
+2012-03-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c (digit_value): static function moved.
+ (html_hex_continue): Use digit_value instead of hex digits string
+ literal.
+
+2012-03-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (do_chain): More useful behavior. The first
+ function, if any, is treated as variadic. Subsequent
+ functions are monadic.
+ (chain, chainv): Turn do_chain into variadic.
+
+2012-03-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New intrinsic functions
+ chain, andf, orf, iff.
+
+ * lib.c (chainv): New function.
+ (do_and, do_or): Generalized to handle functions of
+ any arguments via apply.
+ (andf, orf): Turn do_and and do_or into variadic function instead of a
+ monadic function.
+ (do_iff): New static function.
+ (andv, orv, iff): New functions.
+
+ * lib.h (chainv, andv, orv, iff): New functions declared.
+
+ * txr.1: Doc stubs created.
+
+ * txr.vim: Updated.
+
+2012-03-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (quicksort): Bugfix: incorrect loop from 0 rather than from
+ leading to unbounded recursion.
+
+2012-03-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 61
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * eval.c (op_modplace): Fix warning about uninitialized variable.
+ No bug.
+
+ * filter.c: gcc compilation regresion: missing <stdio.h> breaks inclusion
+ of "stream.h" header. Strangely, didn't show up when configured for
+ compiling with g++ on Ubuntu.
+
+ * match.c (match_filter): Fixed ununsed variable warning.
+
+ * txr.vim: Bunch of missing keywords added.
+
+ * dep.mk: Regenerated.
+
+2012-03-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/010/block.expected: New file.
+
+ * tests/010/block.txr: New file.
+
+ * tests/010/reghash.expected: New file.
+
+ * tests/010/reghash.txr: New file.
+
+2012-03-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * RELNOTES: Updated for upcoming 61.
+
+2012-03-14 kaz kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented hash and vector quasiliterals.
+
+2012-03-14 Kaz Kylheku <kaz@kylheku.com>
+
+ Support quasiquoting over vectors also, and a bugfix for hash
+ quasiquoting. We cannot use the same symbol for the
+ literal form from the parser, and for the expanded form,
+ because this creates a confusion when there are multiple
+ nestings of quasiquote expansion.
+
+ * eval.c (vector_lit_s, vector_list_s, hash_lit_s): New symbol
+ variables.
+ (hash_construct_s): Relocated here from hash.c.
+ (expand_qquote): Part of bugfix: look for hash_lit_s
+ instead of has_construct_s. Translate to a hash_construct_s
+ form which is no longer recognizes as a hash literal.
+ Implementing recognition of a quasiquote vector literal,
+ handled similarly.
+ (eval_init): Initialize vector_lit_s, vector_list_s,
+ hash_list_s and hash_lit_s.
+ Use vector_list_s when registering vector_list function.
+
+ * eval.h (vector_lit_s, vector_list_s, hash_lit_s,
+ hash_constuct_s): Declared.
+
+ * hash.c (hash_construct_s): Variable removed
+ and relocated into eval.c.
+ (hash_init): Initialization of hash_construct_s removed.
+
+ * hash.h (hash_construct_s): Declaration removed.
+
+ * parser.y: (vector): Action updated to generate
+ a (vec-lit ...) form if the object contains unquotes,
+ otherwise generate a vector object.
+ (hash): Generate hash-lit form, not a
+ hash-construct form.
+
+2012-03-14 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow quasi-quoting over hash table literals,
+ to express dynamic hash table construction
+
+ * eval.c (expand_qquote): Recognize hash-construct
+ forms: expand the hash arguments and pairs separately,
+ then rewrite to a new hash-construct form.
+ (eval-init): hash-construct intrinsic function added.
+
+ * hash.c (hash_construct_s): New symbol variable.
+ (hash_construct): New function.
+ (hash_init): Initialize hash_construct_s.
+
+ * hash.h (hash_construct_s, hash_construct): Declared.
+
+ * parser.y (hash): Rule rewritten to emit either a literal
+ hash table object, or a hash-construct form, based on
+ whether quasiquote unquotes occur within the syntax.
+ (hash_from_notation): Function removed.
+
+2012-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Change: @(block) requires @(end) from now on.
+ Blocks no longer extend to the end of the surrounding
+ scope.
+
+ * match.c (v_block): Rewrite for new syntax.
+
+ * parser.l (BLOCK): New token type handled.
+
+ * parser.y (BLOCK): New token.
+ (block_clause): New nonterminal grammar symbol.
+ (clause): Collateral fix: replaced a bunch of
+ list(X, nao) forms with cons(X, nil).
+ Introduced block_clause as a constituent of clause.
+
+ * txr.1: Revamped documentation of block, and
+ wrote about using blocks for reducing nested
+ skips and reducing backtracking in general.
+
+2012-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (ID_END): Bugfix: ID_END was defined incorrectly
+ for the current way in which an identifier token is recognized.
+ As a result @(collect-ing) was being interpreted as @(collect -ing).
+ It should be the complement of NSCHR.
+
+2012-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * regex.c (regsub): the replacement argument
+ can now be a function of one argument which maps
+ the original piece of text matched by the regex
+ to a replacement text.
+
+2012-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (stdio_put_string, stdio_put_char, stdio_put_byte): Do not
+ consider data sent to std_error to be output for the purposes of
+ the output_produced flag. Otherwise the program behavior changes
+ in -v mode; it will not print bindings.
+
+2012-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing URL filtering.
+
+ * eval.c (eval_init): New intrinsic functions: url-encode, url-decode.
+
+ * filter.c (tourl_k, fromurl_k): New keyword variables.
+ (is_url_reserved, digit_value): New static functions.
+ (url_encode, url_decode): New functions.
+ (filter_init): Intialize new keyword variables and register
+ new :tourl and :fromurl filters.
+
+ * filter.h (tourl_k, fromurl_k, url_encode, url_decode): Declared.
+
+ * txr.1: Updated.
+
+ * txr.vim: Likewise.
+
+2012-03-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (string_out_byte_flush): Bugfix. Do not loop inside this
+ function. This must not flush out more than one character out of this
+ small buffer, except when we are flushing out the last data.
+ The correct operation is predicated on the assumption that
+ a complete character can be pulled out. That's why we move the
+ buffer to the front after consuming it, and do not automatically
+ flush until there are four bytes.
+ (string_out_put_string): We loop the call to string_out_byte_flush
+ here because when a request comes in to write a Unicode character,
+ we flush all the bytes, even if the tail of those bytes forms
+ an incomplete sequence that turns into U+DCxx codes.
+ (get_string_from_stream): Use the same loop termination test
+ as in string_out_put_string, for consistency. In that function
+ it is needed to prevent infinite looping in the case when
+ the string_out_put_string is being called from string_out_byte_flush
+ and is thus re-entering it.
+
+ * tests/010/strstream.expected: New file.
+
+ * tests/010/strstream.txr: New file.
+
+2012-03-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing put_byte for string output stream.
+ This does the Right Thing with a mixture of bytes and characters.
+ Incomplete byte sequences.
+
+ * stream.c (struct strm_ops): Changing byte argument of put_byte
+ to int, since the put_byte API function can just pass down that
+ value after validating it.
+ (stdio_handle): Use available typedef.
+ (stdio_put_byte): Follow interface change in strm_ops.
+ Do not validate the range of a byte; the put_byte higher
+ level function does that now.
+ (struct string_output): New members: ud, byte_buf, head, tail.
+ (string_out_byte_callback, string_out_byte_flush): New static
+ functions.
+ (string_out_put_string): Flush any UTF-8 bytes in the byte buffer
+ before putting the string.
+ (string_out_put_byte): New static function, implementation for
+ put_byte on string output streams.
+ (string_out_ops): string_out_put_byte wired in.
+ (make_string_output_stream): Initialize new members of
+ of struct string_output.
+ (get_string_from_stream): Flush any UTF-8 bytes in the byte buffer
+ before retrieving the string.
+ (put_byte): Validate that the byte is in range. Pass byte
+ as C int down to the put_byte virtual.
+
+2012-03-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Plugging memory leak.
+
+ * stream.c (byte_in_stream_destroy): New function.
+ (byte_in_ops): Use new function instead of noop stub.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Update. Adding remq, remql, remqual, regsub, *stddebug*
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35718. Workaround good enough to get some code working.
+
+ * eval.c (cons_find): New function.
+ (expand_op): Use cons_find rather than tree_find to look for
+ rest_gensym.
+
+ * regex.c (regsub): Rearranged arguments so that the string
+ is last. This is better for partial evaluaton via the op
+ operator.
+
+ * regex.h (regsub): Updated declaration.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New intrinsic function, regsub.
+
+ * regex.c (regsub): New function.
+
+ * regex.h (regsub): Declared.
+
+ * txr.1: Doc stub added.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (split_str): Separator can be a regex now.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 60
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+ * txr.vim: Handle : symbol properly.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus): Showstopper bug: plus(bignum, fixnum)
+ broken for fixnum <= 0. Bad pointer passed to MPI.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/add-mp-hash (mp_hash): Fixed use of uninitialized
+ variable on platforms where the MP digit is smaller than a long integer.
+ (Not anything TXR is known to run on). Changed algorithm to take the
+ first and last digit and add them together, rather than just taking the
+ last digit. The last digit will be zeros for numbers that contain 2 as a
+ factor with a large enough multiplicity.
+
+ * mpi-patches/add-mpi-toradix-with-case: Refreshed.
+
+ * mpi-patches/bit-search-optimizations: Likewise.
+
+ * mpi-patches/faster-square-root: Likewise.
+
+ * mpi-patches/fix-bad-shifts: Likewise.
+
+ * mpi-patches/fix-mult-bug: Likewise.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_defun): Bugfix: documentation says that defun supports
+ the same parameter list as lambda, and that is the intent. But
+ this was broken, since op_defun was expecting the parameter list
+ to be a proper list containing only bindable symbols, ruling out
+ the use of the consing dot for rest parameter as well as the colon
+ keyword symbol for optional parmeters.
+
+2012-03-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Expose remq, remql and remqual.
+
+ * txr.1: Documented.
+
+2012-03-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (sub_str): Removed second check for lazy string that
+ can't ever come out true.
+
+ * match.c (search_form, h_var, h_coll, h_parallel, h_fun): Handle
+ position t emanating from match_line, indicating match to end of line.
+ (h_skip): When skipping to the end of line (empty spec), just
+ return t as the position rather than the end of the line. This avoids
+ calculating the length of the line, which forces a lazy string.
+ (do_match_line): Near the beginning of the loop, if the position is t,
+ then substitute the length of the line.
+ (freeform_prepare): Return the freeform line limit value.
+ (v_freeform): Check for t coming out of match line and do the
+ conversion back to the trailing list in that case, but only if
+ the freeform was limited by number of lines.
+
+2012-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (search_form): search_form works with relative positions now,
+ but match_line returns absolute, and so needs to be offset by -c->base.
+ (h_trailer, h_fun): Bugfix: return the absolute position, rather than
+ relative c->pos. The return value of these functions becomes the return
+ value of do_match_line, so the semantics has to agree.
+
+2012-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (sem_error, file_err): Bugfix: pull text formatted source
+ location using source_loc_str rather than raw object using source_loc.
+
+2012-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_load): Fixed broken functionality. Failing to evaluate
+ directives following the load and consume input properly.
+ Check for errors during the parse and throw an exception.
+
+2012-03-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing two instances of unintentional O(n*n) behavior and poor memory use
+ that occur in horizontal matching of basic text patterns.
+
+ * lib.c (match_str, match_str_tree): New functions.
+
+ * lib.h (match_str, match_str_tree): Declared.
+
+ * match.c (do_match_line): Use match_str_tree and match_str when matching
+ strings and string lists, respectively, rather than stupidly calling
+ search functions and then asserting that the match was found at the
+ starting position.
+
+2012-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (do_match_line): Function takes new argument, "completely".
+ The check for completely matching a line is now done within
+ do_match_line.
+ (match_line): Pass nil to do_match_line, specifying that a prefix
+ match is okay.
+ (match_line_completely): New interface to do_match_line, which
+ requests a match to the end of the line.
+ (v_freeform): Pass nil to do_match_line: freeform needs
+ incomplete match semantics.
+ (match_files): Use match_line_completely instead of match_line.
+ By doing it this way, we do not need to compute the length of
+ the original line and compare it to the absolute position.
+ This saves time and memory since computing the length of a lazy
+ string forces it.
+
+2012-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (consume_prefix): This memory optimization should only
+ be done for lazy strings, otherwise it just causes unnecessary
+ memory use by duplicating the line, and inefficiency via
+ thanks to allocator churn.
+
+2012-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (numberp): Fix bad type check: null pointer dereference when
+ object is nil.
+
+ * match.c (do_match_line): Bugfix for incorrect treatment of long
+ lines. Must return the absolute position from the start of the original
+ line (plus(c->pos, c->base)), rather than just c->pos, which only
+ measures from the start of a line that may have been chopped by
+ consume_prefix.
+
+2012-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: rlcp function was incorrect for new way of storing
+ line number info.
+
+ * parser.h (rlset): Declared.
+ (rlcp): Use rlset.
+
+ * parser.y (rlset): New function.
+
+2012-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (help, debug): New g command for tweaking log level.
+
+2012-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c: Missing d command implemented.
+ Condense the output to 8 times the screen width, for more context.
+ Condense the output in vertical mode (when the entire input line
+ is shown) not only character mode.
+
+ * lib.c (remq, remql, remqual): New functions.
+
+ * lib.h (remq, remql, remqual): Declared.
+
+2012-02-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 59
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-02-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (sub_list, replace_list, lazy_sub_str, sub_str, replace_str,
+ sub_vec, replace_vec): Regression: replace incorrect zerop(to)
+ test with to == zero, because to is not necessarily a number.
+
+2012-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Recognize backslash-newline break in regexes.
+
+2012-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Substantially revised for better lexical accuracy
+ and highlighting of errors.
+
+2012-02-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (extract): Check for negative value of opt_nobindings,
+ which forces the printing.
+
+ * txr.c (help): Under -b, mention that printing the word false is
+ suppressed also. Added documentation for -B.
+ (main): Implemented -B option.
+
+ * txr.1: Documented -B option and added clarifying text under -b
+ option explaining the conditions under which bindings are printed.
+
+2012-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix the issue properly, once and for all, of how to determine
+ that output has taken place and suppress the printing of bindings.
+
+ * debug.c (debug): std_output replaced with std_debug.
+
+ * eval.c (eval_init): Registered new *stddebug* variable.
+
+ * stream.c (std_debug): New variable.
+ (stdio_put_string): Check that stream is other than
+ std_debug, to determine that output has taken place.
+
+ * stream.h (std_debug): Declared.
+
+ * txr.1: Added *stddebug* to documentation stub heading.
+
+2012-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixing long-time (pre-GIT) bug. The object (nil) was stupidly used to
+ represent empty optional output clauses, distinguishing them from
+ missing clauses. This creates an ambiguity, so that an @(output)
+ block which puts out a single empty line is treated as empty.
+ Present but empty clauses are now represented by t.
+
+ * match.c (do_output_line): Check for t and bail.
+ (do_output): Check for t instead of (nil) and bail.
+
+ * parser.y (o_elems_opt2): Nonterminal deleted.
+ (out_clauses_opt): Empty case generates nil.
+ (req_parts_opt): o_elems_opt2 replaced by o_elems_opt.
+ (repeat_rep_helper): Function now keeps track of which
+ clauses were specified. For those that were specified, but
+ empty, it substitutes t.
+
+ * tests/008/empty-clauses.expected: New file.
+
+ * tests/008/empty-clauses.txr: New file.
+
+2012-02-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35625
+
+ * parser.l (BSCHR, BSYM, BTOK): New lexical definitions.
+ (BRACED): New state.
+ (grammar): Refactored so that braced variables are now handled
+ in the BRACED state, allowing for lexical differences between
+ braced variables and Lisp. This allows us to have
+ the /regex/ syntax in braces, but /regex/ is just a symbol
+ in the Lisp. The new #/ token is recognized and returned
+ as HASH_SLASH. All rules reformatted to a more easily
+ maintainble convention.
+
+ * parser.y (HASH_SLASH): New token.
+ (modifiers, lisp_regex): New nonterminals.
+ (var): Grammar changed to use modifiers nonterminal instead of exprs.
+ (var_op): Rule moved closer to var.
+ (expr): Produces lisp_regex rather than regex.
+ (yybadtoken): Handle HASH_SLASH in the switch statement.
+ Bugfix: HASH_BACKSLASH was not handled.
+
+ * txr.1: Documented #/regex/ syntax.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c: Updated copyright year.
+
+ * arith.h: Likewise.
+
+ * debug.c: Added copyright header.
+
+ * debug.h: Updated copyright year.
+
+ * eval.c: Likewise.
+
+ * eval.h: Likewise.
+
+ * filter.c: Likewise.
+
+ * filter.h: Likewise.
+
+ * gc.c: Likewise.
+
+ * gc.h: Likewise.
+
+ * hash.c: Likewise.
+
+ * hash.h: Likewise.
+
+ * lib.c: Likewise.
+
+ * lib.h: Likewise.
+
+ * match.c: Likewise.
+
+ * match.h: Likewise.
+
+ * parser.h: Likewise.
+
+ * regex.c: Likewise.
+
+ * regex.h: Likewise.
+
+ * stream.c: Likewise.
+
+ * stream.h: Likewise.
+
+ * txr.c: Likewise, and e-mail address.
+
+ * txr.h: Updated copyright year.
+
+ * unwind.c: Likewise.
+
+ * unwind.h: Likewise.
+
+ * utf8.c: Likewise.
+
+ * utf8.h: Likewise.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/008/filtenv.expected: New file.
+
+ * tests/008/filtenv.txr: New file.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34652
+
+ * match.c (do_txeval): Establish a dynamic env frame around
+ evaluation of quasiliteral and around embedded TXR Lisp expression
+ (which may contain quasiliterals) and stick the bindings there
+ via set_match_context. This way if filte functions are invoked through
+ a quasiliteral, they can see bindings.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New put-byte function interned.
+
+ * stream.c (struct strm_ops): New member, put_byte.
+ (stdio_put_byte): New function.
+ (stdio_ops, pipe_ops, string_in_ops, byte_in_ops,
+ string_out_ops, strlist_out_ops, dir_ops): Updated.
+ (put_byte): New function.
+
+ * stream.h (put_byte): Declared.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (num_esc): Skip octal indicator 'o' if present.
+ This is needed for character constants.
+ (CHRLIT): Fix broken hex constants, being treated as octal.
+
+ * txr.1: Document octal character constants.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 58
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+ * eval.c (eval_init): Updated.
+
+ * rand.c (rand): Function renamed to rnd due to a clash with
+ standard C library (that does not show up when compiling as C++).
+
+ * rand.h (rand): Declaration renamed to rnd.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l (source_loc_str): Missing function re-written.
+ (Accidentally originally written in lex.yy.c file!)
+ (parse_reset): If file can't be opened, try adding .txr suffix
+ to it.
+
+ * txr.1: Suffix-handling behavior documented.
+
+2012-02-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (clause): "Doh" moment. We don't need the special
+ transformation of the load syntax because the parent location
+ is already associated with the syntax.
+
+ * match.c (v_load): Pull out source location info from
+ the form itself.
+
+2012-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (debug): Use new way of getting line number.
+
+ * eval.c (eval_error): Use source_loc_str to get source location.
+
+ * match.c (debuglf, sem_err, file_err): Likewise.
+
+ * parser.h (source_loc_str): Declared.
+
+ * parser.l (parse_init): form_to_ln_hash must be equal based now.
+
+ * parser.y (rl): Store new form of read-time source location info.
+
+ * txr.1: Documented load.
+
+2012-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_load): Sanity checking on target path.
+ Check if it is absolute and do not substitute parent
+ file's directory.
+
+2012-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_var): Eliminated uses of rl function, in favor of
+ rlcp. Only the parser should use rl to establish location info.
+
+2012-02-24 Kaz Kylheku <kaz@kylheku.com>
+
+ First cut at @(load) directive. Incomplete: debug location info
+ needs to record file name, not only line number; absolute paths
+ not handled, etc.
+
+ * match.c (load_s): New symbol variable.
+ (v_load): New static function.
+ (syms_init): load_s initialized.
+ (dir_tables_init): Load directive registered.
+
+ * match.h (load_s): Declared.
+
+ * parser.h (parse_reset): New function declared.
+
+ * parser.l (spec_file_str): Global variable moved from txr.c.
+ (parse_reset): New function.
+
+ * parser.y (clause): Special handling for @(load ...) directive.
+ parent file path inserted into the syntax at parse time,
+ so when the load directive executes, it can load the file from
+ the same directory as the parent file.
+
+ * txr.c (spec_file_str): Global variable moved to parser.l.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/010/seq.txr: New file.
+
+ * tests/010/seq.expected: New file.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (sub_list, replace_list, lazy_sub_str, sub_str,
+ replace_str, sub_vec, replace_vec): Implementing floating zero
+ behavior. This is necessary so that the important case index .. (+
+ index 1) for selecting one element as a subrange works even if index is
+ negative.
+
+ * txr.1: Floating zero behavior for ranges documented.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc): del operator's return value is the
+ deleted range of values. Missing del cases added for single
+ index cases.
+
+ * lib.c (quicksort): Fix pivot selection one more time.
+ (length): Fix bad argument in "not a sequence" error.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (quicksort): Incorrect pivot selection.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (del_s): New symbol variable.
+ (eval_error): nostatic added to suppress a g++ warning.
+ (dwim_loc): Takes new value as the original unevaluated form so
+ it can control evaluation. Support for del operator added.
+ (op_modplace): Bugfixes: new value form was being unconditionally
+ evaluated and out of order w.r.t. other forms. Now there is
+ left to right order. The form is evaluated later, since for most
+ operators it is on the right, with the exception of push.
+ dwim places can now optionally control the evaluation of newform.
+ del operator supported in gethash case as a special case.
+ error case added for del: if it's not handled in gethash or
+ dwim_loc, it is an error.
+ (eval_init): del_s initialized, and del operator added to table.
+
+ * txr.vim: syntax highlighting for del.
+
+ * txr.1: Documented del.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (init): Hash bugfix: added missing call to hash_init.
+ Previously this function did nothing, but now it interns
+ some important symbols.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (remhash): Rewrote buggy function.
+ It was decrementing the hash count without checking that
+ something was deleted from the chain. The deletion was done
+ incorrectly, without regard for the kind of comparison fucntion
+ used by the hash table.
+
+2012-02-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Intrinsic bindings for sub, ref, refset
+ and replace.
+
+ * lib.c (do_sort): Static function renamed to sort_list.
+ (swap, quicksort, sort_vec): New static functions.
+ (sort): Made generic over lists, vectors and strings.
+ (refset): New function.
+
+ * lib.h (sort): Declaration updated (parameter name change).
+ (refset): Declared.
+
+ * txr.1: Mention refset.
+
+ * txr.vim: Updated with refset.
+
+2012-02-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Third argument of gethash becomes optional.
+
+2012-02-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Introducing optional arguments.
+
+ * debug.c (help, show_bindings): put_string arguments reversed.
+
+ * eval.c (bind_args): Support colon notation in interpreted
+ function lambda lists for optional arguments. Improved error checking.
+ (apply): Allow optional arguments to be left out.
+ (dwim_loc): Reversed arguments to replace_str, replace_vec,
+ replace_list.
+ (eval_init): Numerous intrinsics now have arguments that are optional.
+ New function rand introduced which reverses arguments relative to
+ random. New intrinsic function hash introduced for alternative
+ construction of hashes.
+
+ * gc.c (sweep): Reversed arguments to put_char.
+
+ * hash.c (weak_keys_k, weak_vals_k, equal_based_k): New keyword
+ symbol variables.
+ (hashv): New function.
+ (hash_init): Intern new symbols.
+
+ * hash.h (weak_keys_k, weak_vals_k, equal_based_k, hashv): Declared.
+
+ * lib.c (colon_k): New keyword symbol variable.
+ (replace_list, replace_str, replace_vec): Arguments rearranged.
+ (tree_find): testfun becomes optional argument.
+ (int_str): base becomes optional argument.
+ (func_f0, func_f1, func_f2, func_f3, func_f4, func_n0,
+ func_n1, func_n2, func_n3, func_n4, func_f0v, func_f1v,
+ func_f2v, func_f3v, func_f4v, func_n0v, func_n1v,
+ func_n2v, func_n3v, func_n4v, func_interp): Initialize optargs to zero.
+ (func_n0o, func_n1o, func_n2o, func_n3o, func_n4o): New functions.
+ (cobj_print_op): Reversed arguments to put_string.
+ (find): testfun and keyfun become optional arguments.
+ (replace): Parameters rearranged and arguments rearranged in calls to
+ replace_list, replace_str and replace_vec.
+ (obj_init): colon_k initialized.
+ (obj_print, obj_pprint): Arguments reversed, and stream defaults
+ to std_output. Arguments reversed in calls to put_char and put_string.
+ (dump): Arguments reversed in call to put_char.
+
+ * lib.h (struct func): sizes of minparam, fixparam bitfields
+ adjusted. New bitfield optargs. New unnamed bitfield added so
+ the previous ones add up to 16 bits.
+ (colon_k): Declared.
+ (func_n0o, func_n1o, func_n2o, func_n3o, func_n4o): Declared.
+ (replace_list, replace_str, replace_vec, replace): Declarations updated.
+
+ * match.c (debuglf, dump_shell_string, dump_byte_string, dump_var,
+ do_output_line, extract): Reversed arguments to put_char and
+ put_string.
+
+ * parser.l (yyerrorf): Reversed arguments to put_char.
+ (grammar): Recognize : symbol in NESTED state. This is a keyword
+ symbol with the empty string as its name.
+
+ * rand.c (rand): New function.
+
+ * rand.h (rand): Declared.
+
+ * stream.c (strlist_out_put_string): Reversed arguments to put_string.
+ (strlist_out_put_char): Reversed arguments to put_char.
+ (get_line, get_char, get_byte): Stream defaults to std_input.
+ (vformat_num, vformat_str, vformat): Reversed arguments to put_char.
+ (put_string, put_char, put_line): Arguments reversed; stream defaults
+ to std_output.
+
+ * stream.h (put_string, put_line, put_char): Declarations updated.
+
+ * txr.c (oom_realloc_handler): Arguments to put_line reversed.
+
+ * unwind.c (uw_throw): Likewise.
+
+ * txr.1, txr.vim: Updated.
+
+2012-02-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Corrected misleading text in description of output
+ variables. Lists do not have to be wrapped in @(repeat)/@(rep).
+ Indexing notation works on strings and vectors.
+
+2012-02-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (sub, ref, replace): New functions.
+
+ * lib.h (sub, ref, replace): Declared.
+
+ * match.c (format_field): Generic indexing using new functions.
+
+ * txr.1: Documentation stub.
+
+ * txr.vim: Highlighting for new functions.
+
+2012-02-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (extract_vars): If a brace var is actually an
+ expression, then recurse into the expression to find
+ variables. This allows us to do things like @{`@x`} inside
+ a @(repeat) or @(rep).
+
+2012-02-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow braced output variables to actually be arbitrary substitutions.
+
+ * eval.c (subst_vars): Treat the variable as an arbitrary
+ expression rather than just a symbol.
+
+ * match.c (subst_vars): Likewise.
+
+ * parser.y (o_var): Further simplification. The first item in
+ an output var is an expr and not an IDENT.
+
+ * txr.1: Updated.
+
+ * txr.vim: Likewise.
+
+2012-02-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (o_var): Remove productions from grammar by using exprs_opt.
+
+2012-02-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Reimplementation of how TXR decides whether to dump bindings
+ or not. This is now done right inside the standard output stream.
+
+ * match.c (output_produced): Variable removed.
+ (complex_open): Assignment to output_produced removed.
+
+ * stream.c (output_produced): New global variable.
+ (stdio_put_string, stdio_put_char): Set output_produced
+ to t if the target of the output is stdout.
+
+ * stream.h (output_produced): Declared.
+
+ * txr.h (output_produced): Declaration removed.
+
+2012-02-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc): 2012-02-13 fix didn't do it.
+ Here is a simpler way. We can let nil be treated as a list with a
+ simple goto. This solves all cases.
+
+2012-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Register match-fun.
+
+ * match.c (v_do): Store match context.
+ (match_fun): New function.
+
+ * match.h (match_fun): Declared.
+
+ * stream.c (streamp): New function.
+
+ * stream.h (streamp): Declared.
+
+ * txr.1: Stub section for match-fun.
+
+ * txr.vim: Highlight match-fun.
+
+2012-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_funcall): Function renamed to match_filter.
+
+ * match.h (match_funcall): Declaration updated.
+
+ * filter.c (get_filter): Updated.
+
+2012-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_catch): Treat the nil exception object as an empty
+ list, and not the atom nil.
+
+ * match.c (v_try): Do not transform an atomic exception x into
+ the list ((t . x)). Just to (x). This (t . x) representation is
+ a vestige of from the time when the exception consisted of the
+ old-style return values from txeval.
+
+2012-02-16 Kaz Kylheku <kaz@kylheku.com>
+
+ TXR Lisp gets exception handling.
+
+ * eval.c (op_catch, expand_catch_clause,
+ expand_catch): New static functions.
+ (expand): Handle catch operator.
+ (eval_init): Added catch operator to op_table,
+ and registered new functions throw, throwf and error.
+
+ * txr.1: Documented catch operator and created
+ stub section for throw, throwf and error.
+
+ * txr.vim: Updated.
+
+ * unwind.c (uw_throwfv, uw_errorfv): New functions.
+
+ * unwind.h (uw_throwfv, uw_errorfv): Declared.
+
+2012-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rangev_func, rangev, range_star_v_func,
+ range_star_v): Regression: handle the case where the range is
+ open-ended (to is nil).
+
+2012-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rangev): If a descending range is specified,
+ but the step is omitted, the step should be negative one
+ rather than one.
+ (range_star_v_func, range_star_v): New static functions.
+ (eval_init): New function, range*, registered.
+
+ * txr.1: Stub section for range is also for range*.
+
+ * txr.vim: Recognize range* function.
+
+2012-02-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rangev_func): Improved termination test. The sequence
+ not only if it achieves the endpoint, but if it crosses it.
+
+2012-02-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc): Allow assignment to the dwim place when it
+ evaluates to nil, by building a form targetting the place,
+ and recursing into op_modplace. Also, optimization: don't use eval
+ on a form built from the operator; just go to op_modplace directly.
+
+2012-02-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 57
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-02-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (subst_vars): Handle lone symbols (not wrapped
+ in sys::var form) as variables. This allows interpretation of metanums
+ in quasiliterals, because these are replaced by variables in the
+ op expander.
+
+ * parser.l: Recognize METANUM in QSILIT state.
+
+ * parser.y (quasi_item): METANUM parsed in quasiliteral.
+
+ * txr.vim: Metanums highlighted properly.
+
+2012-02-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc, op_dwim): Bugfix: hash indexing requiring
+ at least two arguments, rather than at least one.
+
+2012-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Added note about register save areas, which can contribute
+ to spurious retention.
+
+2012-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (breakpoints, last_command): linkage changed to static.
+ (cols): New static variable.
+ (debug): Print context intelligently, fitting into the width of
+ the screen.
+ (debug_init): Try to get terminal width, from the COLUMNS variable.
+
+2012-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (lazy_flatten): Bugfix: function was assuming that
+ the input is a list, and not handling the case
+ atom -> (atom) like its non-lazy counterpart.
+ This broke @(next :list expr).
+
+2012-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (obj_print): Print control characters in string and
+ character literals as hex escapes, followed by semicolon if
+ necessary. Don't use iswprint function since it is locale-specific
+ and concludes that non-ASCII characters are unprintable.
+ Changed print syntax for lazy strings.
+ (obj_pprint): Changed print syntax for lazy strings.
+
+ * parser.l: Bugfix in hex/octal character constant.
+ num_esc(yytext) was called rather than num_esc(yytext+1).
+
+ * parser.y (chrlit): Bugfix: missing case for hex and octal
+ constants which are given by a LITCHAR token.
+
+ * stream.c (vformat): Bugfix: strings were being printed as if using ~a
+ even under ~s.
+
+2012-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11486
+
+ * match.c (h_coll): Call consume_prefix in the loop.
+
+2012-02-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11486: continuation. Take into account base position
+ in debug reporting.
+
+ * debug.c (debug): New argument, base.
+
+ * debug.h (debug_check): New argument, base.
+ (debug): Declaration updated.
+
+ * eval.c (do_eval): Pass new argument of debug_check as nil.
+
+ * match.c (LOG_MISMATCH, LOG_MATCH): Take into account base
+ when displaying character position.
+ (do_match_line): Pass base position to debug_check.
+ (match_files): Pass nil as base to debug_check.
+
+2012-02-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11486: continuation. Now able to @(skip) through
+ a large file horizontally under @(freeform) in constant memory.
+ Position reporting is incorrect.
+
+ * match.c (match_line_ctx): New member, base.
+ (ml_all): Initialize new member to zero.
+ (consume_prefix): New static function.
+ (do_match_line): New static function, contains implementation of
+ match_line. Calls consume_prefix.
+ (match_line): Becomes a wrapper for do_match_line.
+ (search_form, h_skip): Call consume_prefix.
+ (freeform_prepare): New function. External to avoid inlining.
+ (v_freeform): Uses do_match_line, to down context by reference,
+ and also refactored to avoid spurious retention of c->data.
+
+ * unwind.c (uw_push-block, uw_push_env, uw_push_debug,
+ uw_push_catch): Zero out the structure, otherwise the unused
+ fields can cause spurious retention.
+
+2012-02-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11486: preparatory refactoring.
+
+ * match.c (h_match_func): Changed to one-argument form.
+ (LOG_MISMATCH, LOG_MATCH): References to structure members
+ changed from member selection . to ->.
+ (h_text, h_var, h_skip, h_coll, h_parallel, h_trailer,
+ h_fun, hv_trampoline, h_define, h_do): Changed to one-argument form
+ that takes a pointer to the context.
+ (match_line): Local pointer named c used so that the
+ LOG_MISMATCH and LOG_MATCH macros can be used.
+
+2012-02-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (lazy_sub_str): New static function.
+ (sub_str): Bugfix: handle t values of from from and to, and negative
+ indices, just like sub_vec. Special handling for lazy strings
+ introduced. If to is the value t, then the a lazy string can be
+ produced.
+
+2012-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Updated.
+
+ * txr.vim: Fixed mistakes in a few regex character classes,
+ causing upper case letters not to be recognized as part
+ of a variable name, and character hex constant.
+
+2012-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 56
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Allow semicolon terminator on hex and octal
+ escapes in a regex. Removed o escape character from octal
+ constants in strings and quasiliterals: no such thing is documented.
+ Octal constants can be semicolon-terminated like hex ones.
+
+ * txr.1: Documented semicolons after octal constants in
+ string literals and after hex and octal constants in regexes.
+
+2012-02-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (utf8_from_uc, utf8_decode): Some cascaded if tests converted
+ to a switch on the upper nybble value. This also fixes an unfortunate
+ bug. The test for the two byte case was written as
+ ch >= 0xc2 && ch <= 0xE0. That should have been ch < 0xE0.
+ Versions of TXR up to 55 have been incorrectly decoding some UTF-8.
+
+2012-02-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (utf8_from_uc): Bugfix: incorrect condition in character
+ range check (less than minimum *and* U+DCxx, rather than *or*).
+ Also, we must check for out of range characters. UTF-8 sequences
+ beginning with F4 can code beyond 0x10FFFF.
+ (utf8_decode): Check for characters beyond 0x10FFFF.
+
+2012-02-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (rest_s, op_s): New variables.
+ (do_eval_args): Allow calls specified by improper lists
+ like (x y . z) where the z expression must evaluate to a list
+ that turns into addition arguments to be applied.
+ (transform_op, expand_op): New static functions.
+ (expand): Call expand_op.
+ (eval_init): Initialize rest_s and op_s. Use rest_s
+ to register rest function.
+
+ * lib.c (gensym): New function based on gensymv.
+ (gensymv): Now calls gensym.
+
+ * lib.h (gensym): Declared.
+
+ * parser.l: Parse @ followed by digits as a new kind of token,
+ METANUM.
+
+ * parser.y (METANUM): New token.
+ (meta_expr, exprs): Missing rlcp's added.
+ (expr): METANUM variant introduced.
+ (yybadtoken): Handle METANUM.
+
+ * txr.1: Documented one-symbol argument list of lambda.
+ Documented op. Closed some unbalanced parentheses.
+
+ * txr.vim: Highlight op.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (utf8_from_uc, utf8_decode): Use upper case for hex constants.
+ If bytes decode to U+DCxx, treat this sequence as invalid. This
+ way we can't be fooled by an attacker into accepting some U+DCxx which
+ on output we will then convert to byte xx.
+ (utf8_to_uc): Use upper case for hex constants.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (utf8_to_uc, utf8_encode): Do not encode surrogate code
+ points (U+DC00 to U+DCFF) as multi-byte UTF8 sequences. We use
+ that range for invalid bytes on input, so on output the best thing
+ to do is to reproduce the original bytes. E.g the code U+DCA0
+ will produce the byte A0.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: UTF-8 handling clarified.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * utf8.c (utf8_from_uc, utf8_decode): Impose a minium value on the
+ decoded character based on which UTF-8 case it is from. This rejects
+ overlong forms.
+
+ * utf8.h (struct utf8_decoder): New member, wch_min.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Document that TXR accepts UTF-8 overlong forms.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Move error match before other cases and simplify.
+ Comment are colorized properly again.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ This test case would have caught the prior regression.
+
+ * Makefile (TXR_ARGS): Defined for new test case.
+
+ * tests/010/align-columns.dat: New file.
+
+ * tests/010/align-columns.expected: New file.
+
+ * tests/010/align-columns.txr: New file.
+
+2012-02-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (format_field): Regression. Was not handling modifiers
+ which are compound expression (e.g. computed field widths).
+ This was broken by the first commit of 2012-01-26.
+
+2012-02-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (lookup_sym_lisp1): New function.
+ (do_eval, do_eval_args): New static functions.
+ (eval, eval_args): Become wrappers for do_eval and do_eval_args,
+ respectively.
+ (eval_lisp1, eval_args_lisp1): New static functions.
+ (dwim_loc, op_dwim): Use eval_lisp1 and eval_args_lisp1 instead
+ of eval and eval_args.
+
+ * parser.y (meta_expr): Bugfix: expand the whole dwim expression,
+ rather than its arguments, which are not an expression.
+
+ * txr.1: Updated with notes that dwim really does Lisp-1 style
+ evaluation.
+
+2012-01-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: More color categories. More accurate matching of @ elements.
+
+2012-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Support hex and octal escapes in string and quasiliterals,
+ as the documentation says. Also support an optional trailing ;
+ delimiter in hex escapes.
+
+ * txr.1: Documented.
+
+2012-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Properly show @[...] inside quasiliteral.
+
+2012-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc, op_dwim): Relax the requirement on hash
+ indexing arguments. The default value can be omitted,
+ defaulting to nil.
+
+2012-01-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_begin): Missing type check added, otherwise
+ passing in an object that is not a hash results in corruption
+ or crashing behavior.
+
+ * lib.c (class_check): Improved to a one-step check with a clear
+ message.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 55
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_modplace): Fix warning caught by gcc, but not g++.
+
+ * lib.c (replace_list): Fix code that is valid C++ but not C.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (replace_list): Always convert the input items to a list,
+ even in the trivial case that an empty list is being replaced.
+ Allow a string to be the replacement (split into a list of
+ characters).
+ (replace_str): Bugfix in assignment from vector; wrong index
+ used over source vector.
+ (split_str): If the splitting set is empty, just split the
+ string into characters instead of getting into an infinite loop.
+ (replace_vec): Allow replacement source to be a string.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus, minus): Better wording in error messages.
+
+ * eval.c (dwim_loc): Assignments to string indices and ranges
+ supported. New arguments for this purpose.
+ (op_modplace): Use new dwim_loc interface for returned value.
+ (op_dwim): Support assignment to string ranges.
+ (eval_init): replace_str registered.
+
+ * lib.c (string_extend): If the argument is a number, let it
+ specify the amount by which to extend the string.
+ (replace_str): New function.
+
+ * lib.h (replace_str): Declared.
+
+ * txr.1: Updated.
+
+ * txr.vim: Updated.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (listref, listref_l): Negative indices must have semantics
+ consistent with vecref and ranges.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (cat_str): Throw error if one of the list elements
+ is not a character or string instead of silently returning nil.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: More discussion of ranges.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (format_field): Removed useless use of cat_str (no longer
+ needed because str is already a string). The purpose was to reduce
+ character to strings.
+ (subst_vars): Some of the new logic in format_field must be replicated
+ in the case when format_field is not called because the variable
+ has no modifiers. Lists must be converted to a space-separated string.
+ Bugfix here: occurence of pat and modifiers is not mutually exclusive.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc, dwim_op): Eliminated redundant re-evaluation
+ of range arguments. They are already evaluated since the cons
+ expression is evaluates as part of the dwim arglist.
+ Replaced some open code with function calls to the new listref
+ and listref_l functions.
+ (tostring, tostringp): made extern and moved to lib.c.
+
+ * lib.c (listref, listref_l): New functions.
+ (tostring, tostringp): moved here from eval.c.
+
+ * lib.h (listref, listref_l, tostring, tostringp): Declared.
+
+ * match.c (format_field): Handle index and range references.
+
+ * txr.1: Documented new output variable syntax.
+
+2012-01-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_loc): Handles full responsibility for assigning
+ to list and array ranges.
+ (op_modplace): Pass extra arguments to dwim_loc so it can
+ do the job for ranges. If dwim_loc returns 0, it means
+ that it did everything.
+ (op_dwim): Support list and array ranges.
+
+ * txr.1: Documented.
+
+2012-01-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (zerop): Misspelling in error message.
+
+ * lib.c (sub_list, replace_list, sub_vec, replace_vec):
+ Allow the value t to specify one element past the end, so that t t
+ refers to zero-length sequence just past the end of the array or list.
+ Also, fixed out of bounds memmoves in replace_vec.
+
+2012-01-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New functions registered.
+
+ * lib.c (sub_list, replace_list, vectorp): New functions.
+ (sub_vec): Allow negative indices from end of array.
+ (replace_vec): New function.
+
+ * lib.h (sub_list, replace_list, vectorp, replace_vec): Declared.
+
+ * parser.l (DOTDOT): Scan .. as new token.
+
+ * parser.y (DOTDOT): New token.
+ (expr): New syntax with DOTDOT.
+ (yybadtoken): Handle DOTDOT.
+
+ * txr.vim: Added new functions. Also missing append* and dwim.
+
+ * txr.1: Updated.
+
+2012-01-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim (txr_chr): Fix for highlighting named characters
+ like #\newline.
+
+2012-01-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dwim_s): New symbol variable.
+ (dwim_loc, op_dwim): New static functions.
+ (op_modplace): Support assignment to dwim forms
+ with the help of dwim_loc.
+ (expand_place): Handle dwim places.
+ (eval_init): Initialize dwim_s. Register dwim operator
+ in op_table.
+
+ * eval.h (dwim_s): Declared.
+
+ * lib.c (chr_str, chr_str_set): Allow negative indices to index
+ backwards from end of string.
+ (vecref, vecref_l): Allow negative indices to index from
+ rear of array.
+ (obj_print, obj_pprint): Render (dwim ...) forms as [...].
+
+ * parser.l: Peoduce new METABKT token type for @[,
+ and '[', ']' tokens.
+
+ * parser.y (METABKT): New token. %type declaration for '['.
+ (list): Support square-bracket style of list, translated
+ into dwim form.
+ (meta_expr): Support @[...] variant.
+ (yybadtoken): Handle METABKT in switch.
+
+ * txr.1: Documented [...] syntax and dwim operator.
+
+ * txr.vim: Updated.
+
+2012-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 54
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (help): Added missing help for w command.
+ (debug): In backtrace, show the renaming pairs for unbound
+ variables (up_p_a_pairs) if they are present.
+
+ * debug.h (debug_begin): Renamed to debug_frame.
+
+ * eval.c (eval): Wrap debug_begin/debug_end around function dispatch,
+ so TXR Lisp functions are included in backtraces.
+
+ * match.c (h_fun): Follow rename of debug_begin to debug_frame.
+ Pass in evaluated args, not the original ones.
+ (v_fun): Likewise.
+
+ * unwind.c (uw_push_debug): bindings argument renamed to env.
+ Bugfix: args argument was being assigned to ub_p_a_pairs.
+
+ * unwind.h (struct uw_debug): Member bindings renamed to env.
+ (uw_push_debug): Declaration updated.
+
+2012-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (last_command): Do not initialize with lit();
+ this is not a constant expression in C.
+ (debug): Handle the situation here.
+
+2012-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (help): Filled in.
+ (debug): Some commands changed due to duplicates.
+
+2012-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_fun): Removing all debugging instrumentation.
+ (match_files): Moving debug_check out of directive case so
+ it covers all forms handled by loop. All this makes the n
+ command in the debugger work better: not skip over
+ function calls or horizontal material.
+
+2012-01-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Improved debugging. Debug nesting depth counter maintained
+ and used for next/step/finish stepping.
+
+ * Makefile (OBJS): debug.o moved to OBJS-y or OBJS-.
+ (OBJS-y, OBJS-): New variables.
+ $(PROG): Depends on OBJS-y also.
+ clean: clean $(OBJS-y).
+ depend: include $(OBJS-y) in dependency generation.
+
+ * configure: Underscores and dashes are interchangeable in
+ configure variables.
+ (yaccname_given, yacc_given): Default value is y, not yes.
+ (debug_support): New config variable.
+ (CONFIG_DEBUG_SUPPORT): New config.h symbol.
+
+ * debug.c (debug_depth): New global variable.
+ (debug_block_s): New symbol variable.
+ (next_depth): New static variable.
+ (debug): Renamed some commands. Introduced separate next, step
+ and finish.
+ (debug_init): debug_block_s initialized.
+
+ * debug.h (debug_depth, debug_block_s): Declared.
+ (debug_enter, debug_leave, debug_return): New macros.
+ (debug_check, debug_init): Conditionally defined based on
+ if this is a debug build.
+
+ * dep.mk: Regenerated.
+
+ * eval.c (eval): Instrumented with debug_enter, debug_leave,
+ debug_return.
+
+ * match.c (match_line, v_fun, match_files): Likewise.
+
+ * txr.c (txr_main): Bail if -d or --debug used in build
+ that lacks debug support.
+
+2012-01-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (last_command): Initialize to empty string rather
+ than nil, otherwise hitting enter tries to repeat the nil command.
+ (show_bindings): New function. Prints all levels of bindings.
+ (debug): Flip the corresponding print flags after printing the current
+ form or data, so they are not printed for every prompt.
+ On EOF from standard input, substitute the q command.
+ If enter is hit and there is no last command, just re-print the prompt.
+ The v command uses show_bindings to dump the environment.
+
+ * eval.c (eval): When calling debug_check, pass the env objects, rather
+ than the bindings it contains.
+
+2012-01-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (car_l, cdr_l): Bugfix: do not call the lazy cons
+ force function if it is already nil, and set it to nil afterward.
+
+2012-01-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Make lazy_appendv function
+ available as append*.
+
+ * txr.1: Documented.
+
+2012-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Before releasing 53, there is this.
+
+ * eval.c (c_var_mark): Bugfix: we cannot use cptr_get from
+ within the garbage collector because of its type check.
+ Bugfix: synchronize the shadow binding with the variable's
+ current contents so we don't hang on to a stale object.
+
+2012-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 53
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2012-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ TXR Lisp regression in C global variables.
+
+ * eval.c (struct c_var): New struct type.
+ (lookup_var, lookup_var_l): cptr type bindings now point to a struct
+ c_var, which has to be handled properly here.
+ (c_var_mark): New static function.
+ (c_var_ops): New static struct.
+ (reg_var): Register variables using struct c_var to provide
+ a pointer to the location and a cached cons that can be
+ returned as a binding.
+
+2012-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (each_s, each_star_s, collect_each_s, collect_each_star_s):
+ New symbol variables.
+ (op_each): New static function.
+ (expand): Handle the four new operators.
+ (eval_init): Intern new symbols, register new operators.
+
+ * txr.1: Documented each, each*, collect-each and collect-each*.
+
+ * txr.vim: Updated.
+
+2012-01-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): list_str registered.
+
+ * lib.c (list_str): New function.
+
+ * lib.h (list_str): Declared.
+
+ * txr.1: Doc stub section created.
+
+ * txr.vim: Updated.
+
+2012-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (generate): Bugfix: do not call gen_fun before
+ testing while_pred.
+
+2012-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (tostring, tostringp): New static functions.
+ (eval_init): New functions registered.
+
+ * txr.1: Stub sections created.
+
+ * txr.vim: Updated.
+
+2012-01-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Spat of new features having to do with lazy processing.
+
+ * eval.c (prog1_s, gen_s, generate_s, delay_s, promise_s): New symbol
+ variables.
+ (eval_prog1, op_prog1, expand_gen, expand_delay): New static functions.
+ (expand): Handle gen and delay.
+ (lazy_mapcar_func, lazy_mapcar, lazy_mapcarv_func, lazy_mapcarv,
+ lazy_mappendv): New static functions.
+ (rangev_func, rangev, generate_func, generate, repeat_infinite_func,
+ repeat_times_func, repeatv, force): New static functions.
+ (eval_init): New operators and functions interned.
+ lazy-flatten renamed to flatten*.
+
+ * lib.c (null_f): New global variable.
+ (ltail, lazy_appendv): New functions.
+ (lazy_appendv_func): New static function.
+ (obj_init): null_f protected and initialized.
+
+ * lib.h (null_f, ltail, lazy_appendv): Declared.
+
+ * txr.1: Documented.
+
+ * txr.vim: Updated.
+
+2012-01-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Non-broken way to achieve intent of previous commit.
+
+ * eval.c (subst_vars): Do not evaluate modifiers
+ as an argument list locally. Pass form-evaluating
+ function to format_field.
+
+ * match.c (format_field): Modified to accept new argument,
+ a one-argument function for reducing a form to a value.
+ Error checking for invalid modifiers made stricter.
+ (subst_vars): Do not evaluate modifiers as an argument
+ list. Pass form-evaluating function to format_field.
+
+ * match.h (format_field): Declaration updated.
+
+2012-01-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (subst_vars): Evaluate the
+ modifiers, so expressions can be used.
+
+ * match.c (subst_vars): Likewise,
+ but using txeval.
+
+2012-01-07 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 52
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated. Wrong December dates fixed.
+
+2012-01-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (fuzz_s): New symbol variable.
+ (v_fuzz): New static function.
+ (syms_init): fuzz_s initialized.
+ (dir_tables_init): v_fuzz entered into v_directive_table.
+
+ * txr.1: Documented @(fuzz).
+
+2012-01-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_gather): Implemented until/last clause.
+
+ * parser.y (gather_parts, additional_gather_parts): New nonterminals.
+ (gather_clause): Syntax refactored for until/last clause.
+
+ * txr.1: Updated.
+
+2012-01-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Fix regression introduced in
+ 2011-12-29 commit. We can't use mod_s, because the module
+ which sets up that variable is not yet initialized.
+
+2012-01-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Make C globals in TXR Lisp properly assignable, so that for instance
+ assigning *stdout*, it really overwrites the underlying C variable.
+
+ * eval.c (lookup_var): Handle new kind of toplevel binding.
+ If the hash value is a cptr, it points to a val storage location.
+ (lookup_val_l): New function.
+ (op_modplace): Get location of variable using lookup_val_l
+ rather than assuming there is a cons-based binding.
+ (reg_var): Argument changed to val * pointer.
+ Register the variable as a cptr referencing the location.
+ (eval_init): reg_var calls pass address of each global.
+
+ * eval.h (lookup_var_l): Declared.
+
+2012-01-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New gensym function registered.
+
+ * lib.c (gensym_counter): New variable.
+ (gensymv): New function.
+ (obj_init): Initialize gensym_counter.
+
+ * lib.h (gensym_counter, gensymv): Declared.
+
+2011-12-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (counter_k): New keyword symbol variable.
+ (do_output_line): Process new :counter argument of rep.
+ (do_output): Ditto, for repeat.
+ (syms_init): Intern new keyword symbol.
+
+ * match.h (counter_k): Declared.
+
+ * parser.l (REPEAT, REP): Lexical syntax changed to
+ allow arguments.
+
+ * parser.y (repeat_rep_helper): Takes extra argument, representing
+ the repeat/rep args. This is inserted into the second position
+ of the output list.
+ (repeat_clause, rep_elem): Extract repeat/rep arguments and
+ pass to repeat_rep_helper.
+ (yybadtoken): Do not put quotes around the word "number".
+
+ * txr.1: Updated.
+
+2011-12-29 Kaz Kylheku <kaz@kylheku.com>
+
+ New functionality: mod and modlast directives in repeat and rep.
+
+ * eval.c (eval_init): Use new symbol variable mod_s instead
+ of calling intern.
+
+ * match.c (mod_s, modlast_s): Symbol variables defined.
+ (do_output_line): mod and modlast directives implemented under rep.
+ (do_output): likewise under repeat.
+ (syms_init): Initialize new symbol variables.
+
+ * match.h (mod_s, modlast_s): Declared.
+
+ * parser.l (MOD, MODLAST): Parse new token types.
+
+ * parser.y (MOD, MODLAST): New tokens.
+ (repeat_parts_opt, rep_parts_opt): New syntax.
+ (repeat_rep_helper): Handle mod and modlast syntax.
+
+ * txr.1: Updated.
+
+ * txr.vim: Updated.
+
+2011-12-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (repeat_rep_helper): Bugfix. Circular lists
+ were being created here when clauses of the same kind appear multiple
+ times. The problem is that append2 no longer copies the second list,
+ which the code was relying on it to do.
+
+2011-12-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Useless sentence under reduce-left and reduce-right removed.
+ Missing Description headings added.
+
+2011-12-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Updated for recent man page changes.
+
+2011-12-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 51
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Capitalize TXR where it makes sense.
+ Introductory text rewritten.
+
+2011-12-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (LOG_MATCH): Use < in format directive instead of -.
+
+ * rand.c (random): Add back missing declaration.
+
+2011-12-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (quasi_item): Switch from var to o_var. This fixes
+ cases like `@a@(foo)@b` where foo was being translated
+ to (foo) rather than (sys:expr foo).
+
+2011-12-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/shrink-mpi-int (mpi_int): Fixed terrible bug in this
+ patch, resulting in an insufficient bit field width for representing
+ the allocation size of the MPI integer on 32 bit platforms.
+
+2011-12-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (make_state): Use ANSI C syntax for prototyped function of no
+ arguments. This snuck through due to working with a C++ compiler.
+ (random): Fixed unused variable warning that happens on 32-bit-pointer
+ platforms.
+
+2011-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Formatting fixes.
+
+2011-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * dep.mk: Overdue update.
+
+2011-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_next): Change flatten to lazy_flatten in the
+ correct place. In the previous commit I did it in the code that handles
+ the obsolescent :var syntax.
+
+2011-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New function interned.
+
+ * lib.c:x (lazy_flatten_scan, lazy_flatten_func): New static functions.
+ (lazy_flatten): New function.
+
+ * lib.h (lazy_flatten): Declared.
+
+ * match.c (v_next): Use lazy_flatten instead of flatten for
+ processing a :list source. This means that @(next :list ...)
+ can be used to process infinite lazy lists.
+
+ * txr.1: Documented lazy-flatten.
+
+2011-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (rand32): Moved.
+ (make_random_state): After initializing, retrieve eight
+ random numbers to clear pathological initial behavior
+ leading to duplicate values.
+
+2011-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (highest_bit): Changing to external linkage.
+
+ * arith.h (highest_bit): Declared.
+
+ * rand.c (random): Rewrote using different algorithm which
+ ensures even distribution, and avoids doing a bignum mod
+ operation.
+
+2011-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 50
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (memql): New function.
+ (some_satisfy): Return the first non-nil result, rather than t.
+ (all_satisfy): Return the value of the last item, if all items
+ are processed.
+
+ * lib.h (memql): Declared.
+
+ * txr.1: Documented memq, memql, memqual, tree-find, some,
+ all, none, eq, eql and equal.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented copy-list, reverse, nreverse, ldiff and flatten.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented reduce-left and reduce-right.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35010
+
+ * match.c (extract_bindings): Make sure there are no duplicate
+ variables among the extracted bindings. This is needed because
+ of the other changes.
+ (do_output_line, do_output): In handling the rep/repeat directives,
+ append the original bindings to the extracted set bindings for the
+ variables which just occur in the clause, so that Lisp code can see all
+ of the variables.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): If width is specified for ~s or ~a, and
+ the object is not a string or number, then print it to a string
+ and treat it as a string, adjusting it within the field.
+ Also, do not simply abort on an unknown format directive
+ but throw a proper exception.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Left-adjusted field is now specified
+ using < rather than '-'. The +, space and leading 0 are
+ specified on the precision, not the width.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (random): Fix for 64 bit fixnums: stick two random numbers
+ together. Otherwise for fixnum moduli, we get only a 32 bit number no
+ matter what the modulus is.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (vformat): Combine ~a and ~s cases, so numbers and
+ strings are printed the same way under ~s and ~a. The only difference
+ is printing other kinds of objects.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35026
+
+ * stream.c (format_num): New argument: sign character.
+ Rewrote to handle precision, width, zero padding and
+ leading sign similarly to printf.
+ (vformat): New syntax accepted: a space or + before
+ the width specifies that a positive sign is to be
+ explicitly written as a space or + character.
+ Pass one more argument to vormat_num calls.
+ Bugfix: go back to vf_init state after processing ~~.
+
+2011-12-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35136 and cleanup.
+
+ * arith.c (plus, minus, mul, gt, ge, lt, le, exptmod, gcd): Remove
+ trailing abort; we already marked uw_throwf as noreturn. This hack
+ should not be needed in functions where the last statement is a throw.
+ (trunc, expt): Repeated error case handled in one place. Temp variable
+ used to avoid two calls to mp_clear. Call to abort removed.
+ (mod): Repeated error handed in one place. Plugged memory leak
+ by moving throw past mp_clear calls. Call to abort removed.
+ (isqrt): Repeated error case handed in one place.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Fixed to char literal syntax.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/bit-search-optimizations (s_highest_bit):
+ It will take days to completely wipe the egg off my face.
+ I forgot to fix this code for unsigned integers before
+ pasting it into MPI.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (normalize): Linkage changed to extern.
+
+ * arith.h (normalize): Declared.
+
+ * rand.c (random): Bugfix: normalize the bignum before returning it.
+
+ * txr.1: Doc stubs for PRNG functionality.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c: Added comment about source of algorithm.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * rand.c (random): Bugfix: not building up sufficiently large bignums.
+ Work properly when mp_digit is smaller than 32 bits.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (OBJS): new object file, rand.o.
+
+ * eval.c: Includes rand.h header.
+ (eval_init): New variable and functions from rand module registered.
+
+ * lib.c: Includes rand.h header.
+ (init): Call rand_init.
+
+ * rand.c: New file.
+
+ * rand.h: New file.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35139
+
+ Better fix.
+
+ * parser.y (YYEOF): If YYEOF is not defined, define it as zero.
+ (yybadtoken): Undo previous changes: do not test for zero.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35139
+
+ * parser.y (yybadtoken): The current token (yychar) is 0 on byacc
+ rather than YYEOF or YYEMPTY, so we have to handle that.
+
+2011-12-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (distclean): use rm -rf on mpi directory.
+
+2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Test case for bug #35137
+
+ * tests/007/except-2.expected: New file.
+
+ * tests/007/except-2.txr: New file.
+
+2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New function registered.
+
+ * lib.c (cat_vec): New function.
+
+ * lib.h (cat_vec): Declared.
+
+ * txr.1: Documentation stub.
+
+2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #35137
+
+ * unwind.c (uw_unwind_to_exit_point): When jumping to a catch frame,
+ do not mark it invisible.
+
+ * unwind.h (uw_catch): Flip the matches to nil so that this catch
+ frame can no longer be identified as an unwind point by uw_throw,
+ and thus will not be re-entered for the purposes of handling
+ an exception. It remains visible for the purposes of running the
+ clean up code.
+ (uw_unwind): Prior to executing cleanup forms, flip the visibility
+ to 0. This means that the frame will no longer be re-entered
+ for any reason.
+
+2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Streamlining exception handling macros a little bit.
+
+ * eval.c (op_unwind_protect): Use uw_simple_catch_begin,
+ and remove the uw_catch (exsym, exvals) clause. Put
+ explicit braces around the unwind code even though it
+ is only one statement.
+
+ * match.c (do_txeval): Got rid of empty uw_unwind clause.
+ This is not needed any longer.
+ (v_try): Got rid of explicit uw_do_unwind calls.
+
+ * unwind.h (uw_simple_catch_begin): New macro.
+ (uw_do_unwind): Macro removed.
+ (uw_catch): Added goto uw_unwind_label at the front.
+ This way if the previous clause falls through,
+ control goes to the unwind logic.
+ (uw_unwind): Got rid of initial break. Previous
+ clause should fall through to unwind logic,
+ whether it is the main clause, or one of the catches.
+ (uw_catch_end): Default case aborts, because
+ we don't expect this.
+
+2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Critical regression. Hash lookup was crashing on some platforms
+ due to negative hashing values being reduced modulo table size
+ to a negative array index.
+
+ * hash.c (equal_hash, eql_hash): Ensure
+ that value returned is in the range [0,NUM_MAX].
+ (hash_obj): Unused function removed.
+ (cobj_hash_op): Use hashing similar to eql hash for
+ other kinds of references.
+ (hash_eql, hash_equal): Removed bogus % NUM_MAX reduction.
+
+ * hash.h (hash_obj): Declaration removed.
+
+2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New functions registered as intrinsics.
+
+ * lib.c (copy_vec, sub_vec): New functions.
+
+ * lib.h (copy_vec, sub_vec): Declared.
+
+ * txr.1: Stub sections created.
+
+2011-12-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 049
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (subst_vars, op_quasi_list, expand_quasi): New static
+ functions.
+ (expand): New case for quasiliterals.
+ (eval_init): Register quasi literal as special operator.
+
+ * match.c (format_field): Linkage changed to external.
+
+ * match.h (format_field): Declared. Declarations rearranged.
+
+2011-12-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bindings_helper): Fix format arguments.
+ (eval_init): Registered new functions: symbol-function,
+ func-get-form, func-get-env, functionp, interp-fun-p.
+
+ * lib.c (nappend2, getplist_f, improper_plist_to_alist):
+ tail variable renamed to avoid clash in macro.
+ (func_get_form, func_get_env, interp_fun_p): New functions.
+
+ * lib.h (func_get_form, func_get_env, interp_fun_p): Declared.
+ (list_collect): Fix macro not to throw error, but handle the case.
+
+ * match.c (vars_to_bindings, extract_bindings): tail variable
+ renamed to avoid clash in macro.
+
+ * txr.1: Documentation stubs.
+
+2011-12-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (equal_hash): Eliminating displacement from character
+ hashes. Simplifying some code.
+ (eql_hash): Handle fixnums, characters and literals specially,
+ rather than hashing all value types the same way. The shift
+ applicable for object pointers causes adjacent integers to clash.
+
+2011-12-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_vars): Bugfix: use expand_forms rather than
+ expand on a list of forms.
+
+2011-12-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: iskeyword updated.
+
+2011-12-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (appendv): bugfix: wrong way test.
+ (vector_list): Wrong zero used, resulting in vector(nil) being called.
+
+2011-12-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): not added as synonym for null.
+
+ * lib.c (copy_list): Use list_collect_append rather than
+ list_collect_terminate.
+ (append2, appendv): Simplified using new list_collect_append.
+ (nappend2): Simplified using new list_collect_nconc.
+
+ * lib.h (list_collect): Added check for accidental usage
+ of list_collect after list_append, since PTAIL has different
+ semantics.
+ (list_collect_nconc, list_collect_append): Semantics fixed so that
+ append collecting works more like the Common Lisp append function,
+ allowing trailing atoms or a lone atom. The meaning of PTAIL is
+ changed, however. Now PTAIL actually tracks the head of the most
+ recently appended segment. Each append operation has to first
+ traverse the previously added piece to get to the end.
+
+ (list_collect_terminate): Macro removed.
+
+ * match.c (v_gather): Removed useless use of list_collect_terminate.
+
+ * parser.y: Some headers added that are needed by list_collect.
+
+ * txr.1: Documented append, list, atom, null, not, consp, make-lazy-cons,
+ lcons-fun, listp, proper-listp, length-list, mapcar, mappend, and apply.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ @# comments are becoming obsolescent. @# comments
+ can now be used. Within nested forms,
+ Lisp-compatible ; comments are suported.
+
+ * parser.l: Support @# and ; comments.
+
+ * txr.1: Documentation updated.
+
+ * txr.vim: Updated.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (car, cdr): Set the lazy cons function to nil
+ after calling it.
+ (rplacd): Do not set the lazy cons function to nil
+ in.
+
+ * txr.1: Documented a bunch of functions.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): Removed registration for vec_get_fil.
+ Renamed vec_set_fill to vec-set-length.
+
+ * hash.c (equal_hash): vec_fill to vec_length name change.
+ (hash_grow, make_hash): No need to call vec_set_length.
+
+ * lib.c (equal, vecref, vec_push, length_vec, list_vector,
+ obj_print, obj_pprint): vec_fill to vec_length name change.
+ (vector): Argument now represents actual length, not just allocated
+ size.
+ (vec_get_fill): Function removed; did exactly the same thing
+ as length_vec.
+ (vec_set_fill): Function renamed to vec_set_length.
+ (vector_list): Allocate a 0 length vector initially.
+
+ * lib.h (enum vecindex): member changes name from vec_fill
+ to vec_length.
+ (vector): Parameter name changed.
+ (vec_set_fill): Redeclared.
+ (vec_get_fill): Declaration removed.
+
+ * txr.1: Doc stubs updated.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (car, cdr): Semantics fix for lazy conses.
+ Ignore the return value of the lazy cons function: do not
+ return nil if the function returns nil.
+ This useless behavior was a source of inconvenience in lazy
+ cons programming, requiring the lazy function to return
+ non-nil in addition to installing the car and cdr fields.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (abso): broken for fixnums.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Highlight hash prefix and quote.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_dohash): Esbatlish anonymous block.
+
+ * txr.1: Finished documenting special operators.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Fix empty NAME section.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (minus): Allow difference between characters.
+
+2011-12-14 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus, minus, gt, lt, ge, le): Handle character operands.
+
+ * eval.c (eval_init): New functions interned.
+
+ * lib.c (num_chr, chr_num): New functions.
+
+ * lib.h (num_chr, chr_num): Declared.
+
+ * txr.1: Documentation stubs.
+
+2011-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 048
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (exptmod, gcd): New functions.
+
+ * eval.c (eval_init): New functions registered as intrisics.
+
+ * lib.h (exptmod, gcd): Declared.
+
+ * txr.1: Documentation stubs added.
+
+2011-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (evenp, oddp): New functions.
+
+ * eval.c (eval_init): New functions registered as intrinsics.
+
+ * lib.h (evenp, oddp): Declared.
+
+ * txr.1: Documentation stub updated.
+
+2011-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (highest_bit): Linkage changed to static.
+ (abso, isqrt): New functions.
+ (isqrt_fixnum): New static function.
+
+ * eval.c (eval_init): Registered abs, sqrt and numberp instrinsics.
+
+ * lib.c (numberp): New function.
+
+ * lib.h (numberp, abso, isqrt): Declared.
+
+ * mpi-patches/series: New patch added.
+
+ * mpi-patches/faster-square-root: New patch added.
+
+ * txr.1: Documentation stubs for new functions.
+
+2011-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (expt): Fix broken bignum x fixnum combination.
+
+2011-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (repatch): New phony target.
+ (distclean): Remove mpi directory.
+
+2011-12-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Patch to shrink mpi-int to three words on 32 bit platforms,
+ so that obj_t stays four pointers wide.
+
+ * mpi-patches/series: New patch added.
+
+ * mpi-patches/shrink-mpi-int: New file.
+
+2011-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/bit-search-optimizations (s_highest_bit): Added static
+ storage class specifier.
+
+ * mpi-patches/fix-mult-bug (s_mp_sqr): More braindamage found in MPI.
+ This function performs additions and multiplication mp_digit,
+ expecting a mp_word precision result without casting. This function
+ is needed for exponentiation.
+
+2011-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Git rid of some some loops in MPI where it is searching for
+ the highest bit, replacing them with an adapation of the
+ bit searching function used in arith.c.
+
+ * mpi-patches/series: Patch added.
+
+ * mpi-patches/bit-search-optimizations: New file.
+
+2011-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (expt): New function.
+
+ * eval.c (eval_init): Registering new intrinsic functions,
+ reduce-left, reduce-right and expt.
+
+ * lib.c (minusv): Return one instead of num(1).
+ (exptv, reduce_right): New functions.
+
+ * lib.h (expt, exptv, reduce_right): Declared.
+
+ * txr.1: Blank sections for new functions.
+
+2011-12-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/fix-mult-bug: One more flaw discovered in
+ s_mp_mul_d and added to patch. This one caused malloc corruption and
+ crashes, because the incorrect arithmetic causes the function
+ to think that the multiplication will not be needing another
+ digit, but then there is a carry out which does spill into
+ a new digit.
+
+ * mpi-patches/series: Arg! Somehow the patch fix-bad-shift
+ went missing from the series file, even though the patch
+ itself is in the GIT repository.
+
+2011-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 047
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (zerop, gt, lt, ge, le): Functions from lib.c reimplemented
+ with bignum support.
+
+ * eval.c (eval_init): Added bignump and zerop as intrinsic function.
+ Renamed numberp to fixnump.
+
+ * lib.c (zerop, gt, lt, ge, le): Functions removed.
+ (numeq): Unused function removed.
+
+ * lib.h (numeq): Declaration removed.
+
+ * txr.1: Sections for zerop and bignump created. Changed reference
+ to numberp to fixnump.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (plus, mul): Plugged mpi_int memory leaks.
+ (trunc): Plugged memory leaks. Straightened out semantics
+ with negative modulus. (Residue comes out negative).
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (trunc): Error messages prefixed with trunc:.
+ (mod): New function, reimplementation of removed mod from lib.c.
+
+ * lib.c (mod): Function removed.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Bignum division implemented. More portability bugs found in MPI:
+ code like 1 << n, where n exceeds the width of the type int.
+
+ * arith.c (trunc): New function, reimplementation of removed
+ trunc from lib.c.
+
+ * lib.c (trunc): Removed.
+
+ * mpi-patches/fix-bad-shifts: New file.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c (ABS): New macro.
+ (plus, minus): Bugfix: must not pass signed values to mp_add_d and
+ mp_sub_d functions.
+ (mul): Must not pass signed value to mp_mul_d. Also, fixed type check
+ on wrong argument in the (TAG_PTR, TAG_NUM) case.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ Removing this crutch; it's not that useful.
+
+ * arith.txr: File removed.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c: Regenerated.
+
+ * arith.txr (normalize): Bugfix: was not turning +/- NUM_MAX bignums
+ into fixnums.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c: Regenerated.
+
+ * arith.txr (highest_bit): Missing #else added, fixing
+ SIZEOF_PTR == 4 case.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c: Regenerated.
+
+ * arith.txr (highest_bit): Oops, half the logic for
+ the 64 bit case was missing due to to a cut and paste mistake.
+
+2011-12-11 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c: Regenerated.
+
+ * arith.txr (highest_bit): New function.
+ (mul): Use highest_bit instead of shift based algorithm.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim (txr_atat): New match. The @@ sequence is recognized
+ properly and highlighted.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Bignum support in mult function.
+
+ * arith.c: Regenerated.
+
+ * arith.txr (CNUM_BIT): New constant.
+ (bignum, bignum_dbl_ipt): New static functions.
+ (@{add-fname}): Use bignum function.
+ (mul): New functions, rewrite of mul from lib.c.
+
+ * lib.c (mul): Function removed.
+
+ * mpi-patches/add-mp-set-intptr (mp_set_intptr): Revised patch.
+ Local variable v should be int_ptr_t not unsigned long.
+ Also, the mp_set interface doesn't set the sign; it's an unsigned
+ interface. We must do that ourselves.
+
+ * mpi-patches/fix-mult-bug: The main multiplication function is
+ also broken in the same way, requiring the cast.
+
+ * mpi-patches/mpi-set-double-intptr: Fixed use of wrong type for
+ local variable v.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/mpi-set-mpi-word: Bugfix and refresh.
+
+ * mpi-patches/mpi-set-double-intptr: New file.
+
+ * mpi-patches/series (mpi-set-double-intptr): Patch added.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: add to config.h the type double_intptr_t, which
+ is twice the size of intptr_t. It may not be available, so
+ there is a HAVE_ macro to detect it.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New functions added as intrinsics.
+
+ * hash.c (hash_eql, hash_equal): New external functions.
+
+ * hash.h (hash_eql, hash_equal): Declared.
+
+ * txr.1: Sections added.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * mpi-patches/add-mp-hash: Rewrote mp_hash to only hash enough
+ low-order bit material from the bignum to fill an unsigned long.
+ We don't need to walk the entire bignum. If the low order
+ digit of the bignum is at least as large as an unsigned long,
+ we just take that as the hash, otherwise we take enough of the
+ digits to fill an unsigned long. For negative numbers, we just
+ invert the bits of the hash.
+
+ * mpi-patches/add-mpi-toradix-with-case: Refreshed.
+
+ * mpi-patches/fix-mult-bug: Refreshed.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (mulv): Recognize cases to eliminate a wasteful mul call
+ with an initial element of 1.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (plusv): Recognize cases to eliminate a wasteful plus call
+ with an initial element of zero.
+
+2011-12-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * arith.c: File is now generated using TXR.
+ (NOOP): New macro.
+ (plus): Use NOOP macro.
+ (minus, neg): Function moved here from lib.c and rewritten
+ for bignum support.
+
+ * lib.c (minus, neg): Functions removed.
+
+ * arith.txr: New file.
+
+2011-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Fix patching without quilt.
+
+2011-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Build and pass test suite on Cygwin.
+
+ * configure (longlong, ulonglong, superlong, usuperlong): Initialize
+ these variables so that if the detection tests fail, the script
+ does not access unbound variables.
+ Avoid adding junk like .bss.* into config.h.
+
+ * mpi-patches/config-types: Fixed wrong use of nonexistent
+ SIZEOF_LONG_T.
+
+2011-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ (Applies to previous commit.)
+
+ * mpi-patches/config-types: Added missing definitions
+ of MP_DIGIT_SIZE in two cases.
+
+2011-12-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Bignum support, here we go!
+
+ Bignums, based on Michael Fromberger's MPI library, are integrated
+ into the input syntax, stream output, equality testing, the garbage
+ collector, and hashing.
+
+ The plus operation handles transitions between fixnums and bignums.
+ Other operations are still fixnum only.
+
+ * Makefile (CFLAGS): Add mpi directory to include file search.
+ (OBJS): Include new arith.o module and all of MPI_OBJS.
+ (MPI_OBJS, MPI_OBJS_BASE): New variables.
+
+ * configure (mpi_version, have_quilt, have_patch): New variables.
+ Script detects whether patch and quilt are available. Unpacks
+ mpi library, applies patches. Detects 128 bit integer type.
+ Records more information in config.h about the sizes of types.
+
+ * dep.mk: Updated.
+
+ * depend.txr: Make work with paths that have directory components.
+
+ * eval.c (eval_init): Rename of nump to fixnump.
+
+ * gc.c (finalize, mark_obj): Handle BGNUM case.
+
+ * hash.c: (hash_c_str): Changed to return unsigned long
+ instead of long.
+ (equal_hash): Handle BGNUM case.
+ (eql_hash): Handle bignums with equal-hash, but other
+ objects as eq.
+
+ * lib.c (num_s): Variable renamed to fixnum_s.
+ (bignum_s): New symbol variable.
+ (code2type): Follow rename of num_s. Handle BGNUM case.
+ (typeof): Follow rename of num_s.
+ (eql): Handle bignums using equal, and other types using eq.
+ (equal): Handle BGNUM case.
+ (chk_calloc): New function.
+ (c_num): Wording change in error message: is not a fixnum.
+ (nump): Renamed to fixnump.
+ (bignump): New function.
+ (plus): Function removed, reimplemented in arith.c.
+ (int_str): Handle integers which are too large for wcstol
+ using bignum conversion. Base 0 is no longer passed to
+ wcstol but converted to 10 because the special semantics
+ for 0 would be inconsistent for bignums.
+ (obj_init): Follow rename of num_s. Initialize bignum_s.
+ (obj_print, obj_pprint): Handle BGNUM.
+ (init): Call arith_init.
+
+ * lib.h: Includes "mpi.h", as an exception to the project rule against
+ headers including headers.
+ (enum type): New enumeration member, BGNUM.
+ (struct bignum): New struct type.
+ (union obj): New member bn.
+ (mp): New inline function.
+ (num_s): Redeclared as fixnum_s.
+ (bignum_s, chk_calloc, bignump): Declared.
+ (nump): Redeclared as fixnump.
+
+ * match.c (h_var, h_line, h_skip, h_coll, h_fun, format_field, v_skip,
+ v_freeform, v_collect, v_match_files): Follow nump to fixnump rename.
+
+ * parser.l (NUM): New token type. Split up the parsing of identifiers
+ and numbers once again. But since every number is also lexically also
+ lexically an identifier, we put the action first. The action for
+ making numbers handles bignums. It produces object numbers, not
+ C numbers (change in yystype union).
+
+ * parser.y (%union): num changes type from cnum to val.
+
+ * stream.c (vformat): Handle bignums in numeric conversions.
+
+ * arith.c: New file.
+
+ * arith.h: New file.
+
+ * mpi-1.8.6.tar.gz: New file.
+
+ * mpi-patches/add-mp-hash: New file.
+
+ * mpi-patches/add-mp-set-intptr: New file.
+
+ * mpi-patches/add-mpi-toradix-with-case: New file.
+
+ * mpi-patches/config-types: New file.
+
+ * mpi-patches/export-mp-eq: New file.
+
+ * mpi-patches/fix-mult-bug: New file.
+
+ * mpi-patches/fix-warnings: New file.
+
+ * mpi-patches/series: New file.
+
+ * mpi-patches/use-txr-allocator: New file.
+
+2011-12-08 Kaz Kylheku <kaz@kylheku.com>
+
+ C++ maintenance.
+
+ * eval.c (and_s, or_s): Redundant variables removed.
+
+ * match.h (do_s): extern storage class specifier added.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_defun): Transform a function body by inserting
+ a named block around it, thereby imitating a Common Lisp feature.
+ (op_for): Establish an anonymous block around the loop body,
+ test form and increment forms.
+
+ * txr.1: Documented named block in defun. Documented for and for *.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Updated with all operators and functions.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: flip operator documented. Bad syntax for pop fixed.
+ Blank section for list-vector function added.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_modplace): If the operator is push, then reverse
+ the arguments. We want (push item list) for compatibility with CL.
+ (expand): Bugfix: some of the cases were constructing new
+ forms using unexpanded pieces from the original form.
+ Added separate case for push, which handles the reversed arguments.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (debug): Fix regression: repeat last command by hitting
+ Enter stopped working. This was broken by recent bugfixes in the
+ string splitting functions, which introduced a semantics change.
+
+ * eval.c (flip_s, vecref_s): New symbol variables.
+ (op_modplace): New places (vecref ...) and (flip ...). Bugfix: dec
+ operator was incrementing.
+ (expand_place): Handle vecref and flip. Bugfix: pop has no
+ third argument and so is now handled by the same case as flip.
+ Bugfix: if a modify form has no third argument, then do not
+ resynthesize it with a nil third argument.
+ (eval_init): Initialize new symbol variables.
+ Register new flip operator. Register new list_vectory function
+ as intrinsic.
+
+ * lib.c (rplacd): When modifying the cdr field of a lazy cons,
+ then lapse the lazy function to nil! This is needed by user-defined
+ lazy conses, and it makes sense to do it this way rather than
+ put in some explicit interface.
+ (list_vector): New function.
+
+ * lib.h (list_vector): Declared.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (lookup_var, lookup_fun): Reversing assoc arguments.
+ (eval_init): New intrinsics.
+
+ * hash.c (struct_hash): assoc_fun parameters reversed.
+ (gethash, gethash_f, gethash_n): Likewise.
+
+ * lib.c (assoc, assq): Reversing parameters.
+ (find_package, acons_new, acons_new_l, aconsq_new): Reversing
+ arguments to assoc adn assq.
+
+ * lib.h (assoc, assq): Declarations updated.
+
+ * match.c (dest_set, dest_bind, h_var, h_coll, h_parallel, h_fun,
+ subst_vars, do_txeval, v_next, v_parallel, v_gather, v_collect,
+ v_flatten, v_cat, v_output, v_filter, f_fun, match_funcall):
+ Reversing arguments to assoc.
+
+ * unwind.c (uw_get_func, uw_exception_subtype_p, uw_register_subtype):
+ Reversing arguments to assoc.
+
+ * txr.1: Blank sections created for new functions.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Blank sections created for character functions.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New functions registered as intrinsics.
+
+ * lib.c (chr_toupper, chr_tolower): New functions.
+
+ * lib.h (chr_toupper, chr_tolower): New functions declared.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: In the CHRLIT state, return a nonblank character as an
+ IDENT token. This allows for character literals like #\$.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): New character functions registered.
+
+ * lib.c (c_num): Generalized to convert characters to numbers also.
+ This allows functions like gt and lt to work with characters.
+ (chr_isalnum, chr_isalpha, chr_isascii, chr_iscntrl, chr_isdigit,
+ chr_isgraph, chr_islower, chr_isprint, chr_ispunct, chr_isspace,
+ chr_isupper, chr_isxdigit): New functions added.
+
+ * lib.h: (chr_isalnum, chr_isalpha, chr_isascii, chr_iscntrl,
+ * chr_isdigit, chr_isgraph, chr_islower, chr_isprint, chr_ispunct,
+ * chr_isspace, chr_isupper, chr_isxdigit): New functions declared.
+ (c_true): New macro.
+
+2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (progn_s): New symbol variable.
+ (op_progn): New static function.
+ (eval_init): Initialize new variable, register progn operator.
+
+ * txr.1: progn documented.
+
+2011-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 046
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * stream.c (find_char): New function.
+ (string_in_get_line): Following up TODO. Fixed broken
+ function. Now get_line on a string stream properly returns characters
+ up to and not including the next newlne character, and also consumes
+ the newline character. Other cases are handled properly, also:
+ the stream being at EOF already, or at the last line not being
+ newline-terminated.
+
+2011-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_unwind_protect): Fixed uninitialized variable
+ warning.
+ (eval_init): New functions registered: typeof and vector functions,
+ as well as length_list.
+
+ * lib.c (length): Function renamed to length_list, because it is
+ list specific.
+ (length_vec, size_vec, vector_list): New functions.
+ (length): New function, generic over lists, vectors and strings.
+
+ * lib.h (length_list, length_vec, size_vec, vector_list): Declared.
+
+ * match.c (h_var, h_fun, robust_length, v_deffilter, v_fun): Use
+ length_list instead of length.
+
+ * parser.l: Introduced # token.
+
+ * parser.y (vector): New nonterminal.
+ (expr): vector is a kind of expr.
+ (chrlist): Bugfix: single-character syntax was not working;
+ for instance #\x to denote the charcter x.
+ (lit_char_helper): Use length_list instead of length.
+
+ * stream.c (string_in_get_line): Bugfix: this was using
+ the wrong length function: length was being applied to a string.
+ The genericity of length makes that correct now, but changing
+ to length_str anyway.
+
+ * txr.1: Blank sections created for functions. Vector syntax
+ documented.
+
+2011-12-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Forgot to treat octal number in the processing
+ of conftest.syms. Removed useless eval.
+
+2011-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 045
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_cond): Fixed behavior for singleton clauses.
+ (eval_init): Use existing function objects car_f, cdr_f,
+ eq_f, eql_f and equal_f. Added identity to function table.
+
+ * lib.h (eql_f): Missing declaration added.
+
+ * txr.1: Documented cond, and, if, or, defun, inc, dec,
+ set, push and pop.
+
+2011-12-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (force_regular_quotes): Function removed.
+ (list): Prior commit reversed.
+
+ * txr.1: Prior commit reversed.
+
+ * RELNOTES: No semantics clarification in quasiquote; bugfixes only.
+
+2011-12-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_qquote_error, op_unquote_error): New static functions.
+ (expand_qquote): Bugfix: missing case added to handle directly quoted
+ quasiquote.
+ (eval_init): Error-catching pseudo-operators registered in
+ op_table.
+
+ * parser.y (force_regular_quotes): New function.
+ (list): Quotes within unquotes and splices are regular.
+
+ * txr.1: Clarified new rules. Removed description of ,'form and ,*'form
+ special syntax.
+
+2011-12-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Expose lazy lists in TXR Lisp.
+
+ * eval.c (eval_init): New intrinsic functions.
+
+ * lib.c (rplaca, rplacd, lcons_fun): New functions.
+ (make_lazycons): Renamed to make_lazy_cons, relocated
+ and turned into external function.
+ (lazy_stream_func, lazy_stream_cons): Follow rename
+ of make_lazycons.
+
+ * lib.h (rplaca, rplacd, make_lazy_cons, lcons_fun):
+ Declared.
+
+ * txr.1: Stub sections created.
+
+2011-12-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (uw_protect_s, return_s, return_from_s): New symbol
+ variables.
+ (op_unwind_protect, op_block, op_return, op_return_from):
+ New static functions.
+ (expand): Removed case for call, if, and, and or. These operators
+ evaluate all their arguments, so the code walker can treat them
+ as a function calls.
+ Added case for block and return-from.
+ (eval_init): New symbols interned. New operator functions
+ registered in op_table.
+
+ * txr.1: Blank sections added.
+
+2011-12-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (split_str, split_str_set): Bugfix: access beyond the end of
+ the input string.
+
+2011-12-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): String and character functions
+ exposed as intrinsics.
+
+ * txr.1: Blank sections created.
+
+2011-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Added stub sections for new functions.
+
+2011-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c: Symbol related intrinsic functions and variables made
+ available:
+
+ * lib.h (sym_name): Dangling declaration removed.
+
+2011-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (list): unquote and splice actions look inside the
+ argument form. If an unquote or splice are applied to a quoted
+ form, its quote becomes a regular quote.
+ This behavior is necessary to make ,',form work in nested
+ quotes, otherwise the ' is a quasiquote which captures
+ the comma in ,form, reducing ,',form to ,form.
+
+ * txr.1: Documented this special behavior.
+
+2011-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_qquote): Bugfix: removed bogus recognition
+ and processing of regular quote form. This broke nested
+ backquote processing, and quasiquote forms containing
+ non-quasi-quotes like like '(a 'b ,c).
+
+2011-12-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 044
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-12-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Started Lisp documentation. Updated description of
+ symbol syntax.
+
+2011-12-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (int_str): Return nil rather than 0 if no digits are extracted
+ at all.
+
+2011-12-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_skip, h_coll, v_skip, v_collect): Evaluate the arguments.
+ (do_txeval): Optimization: short-circuit out if the expression is nil,
+ without establishing the exception handler.
+
+2011-12-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_skip): Bugfix: Nov 12 commit caused regression:
+ skip min/max arguments not working!
+
+ * RELNOTES: Updated.
+
+2011-12-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Dropping the silly cons return value from txeval.
+ Two interfaces are provided to the function. One throws
+ on unbound variable, the other which evaluates them to the
+ symbol noval_s (used in exception handling).
+
+ * match.c (do_txeval): New static function.
+ (txeval): Functionality moved to do_txeval.
+ (txeval_allow_ub): New static function.
+ (vars_to_bindings, h_fun, v_freeform, v_next, v_merge, v_bind, v_set,
+ v_cat, v_output, v_deffilter, v_fun): No need to
+ use cdr to get the value from txeval.
+ (v_throw): Use txeval_ub_allowed, since unbound variables
+ are allowed in throw.
+ (v_try): Detect unbound arguments by checking for noval_s rather than
+ nil. No need to use cdr.
+
+2011-12-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (eval_form): Function renamed to txeval so its is
+ not confused with the Lisp evaluation functions.
+ (vars_to_bindings, h_fun, v_freeform, v_next, v_merge, v_bind, v_set,
+ v_cat, v_output, v_throw, v_deffilter, v_fun): Updated.
+
+2011-11-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.h (or2): Restore macro version of or2, because we need
+ the sequencing! Making it an inline function broke the tests.
+ But we can't have multiple evaluation either, so it's going to use
+ a temporary lexical variable.
+ (uses_or2): Macro which declares the lexical variable needed by or2.
+
+ * debug.c (debug): add uses_or2.
+
+ * eval.c (eval_intrinsic, op_modplace): Likewise.
+
+ * lib.c (lazy_str, lazy_str_force_upto, lazy_str_get_trailing_list):
+ Likewise.
+
+ * match.c (h_parallel, v_freeform, v_parallel, v_output): Likewise.
+
+ * parser.y (unquotes_occur): Likewise.
+
+ * stream.c (format): Likewise.
+
+2011-11-30 Kaz Kylheku <kaz@kylheku.com>
+
+ Removing useless hash table.
+
+ * parser.h (ln_to_forms_hash): Declaration removed.
+
+ * parser.l (ln_to_forms_hash): Variable removed.
+ (parse_init): Initialization and protection of ln_to_forms_hash
+ removed.
+
+ * parser.y (rl): Update of ln_to_forms_hash removed.
+
+ * txr.1:
+
+2011-11-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure (extra_debugging): New variable. EXTRA_DEBUGGING
+ conditionally generated in config.h.
+
+ * gc.c (break_obj): New static variable.
+ (mark_obj): Debugging feature: if the object is the one stored in
+ break_obj and not yet reached, then call breakpt.
+ (deheap): New debugging function for viewing regions of the heaps.
+
+ * lib.c (breakpt): New function.
+
+ * lib.h (breakpt): Declared.
+
+2011-11-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (hash_process_weak): Fix regression caused by a mistake
+ in the the 2010-01-26 commit, prior to release 033. When processing a
+ table with weak values, this function was mistakenly testing the keys
+ rather than values for for reachability. I noticed this when a test
+ case that should run in constant memory showed unwarranted accumulation
+ of memory.
+
+2011-11-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (op_modplace): Bugfix: conflation of new value and
+ increment value. Separate new value and increment value, and check
+ number of arguments.
+
+ * lib.h (or2): Turned into inline function due to multiple
+ argument evaluation.
+
+2011-11-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: New operators added.
+
+2011-11-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (bindings_helper): Fix uninitialized variable.
+
+2011-11-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (dohash_s): New symbol variable.
+ (op_dohash): New static function
+ (expand): New case for dohash_s.
+ Bugfix for do_s: expand was used rather than expand_forms.
+ (eval_init): dohash_s initialized and entered into op_table.
+
+2011-11-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): hashp and maphash functions registered.
+
+ * hash.c (maphash): New function.
+
+ * hash.h (maphash): Declared.
+
+2011-11-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (expand_vars): Bugfix: was not handling vars
+ of the form var, only (var initform).
+
+2011-11-29 Kaz Kylheku <kaz@kylheku.com>
+
+ Support assignment to (car ...) and (cdr ...).
+
+ * eval.c (car_s, cdr_s): New symbol variables.
+ (op_modplace): Cases for car and cdr added.
+ (expand_place): Likewise. Calls abort should the
+ cases fall through rather than returning 42.
+ (expand): Bugfix: for and for* case not propagating
+ source location info. Bugfix: expansion for do added.
+ (eval_init): car_s and cdr_s initialized and used
+ in place of previous intern calls.
+
+ * parser.y (elem): Removed wrong logic for expanding the
+ do form. It was expanding only the first argument.
+
+2011-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (let_star_s, for_s, for_star_s): New symbols.
+ (env_replace_vbind, bindings_helper): New static functions.
+ (op_let): Refactored to allow for let* form. Code for setting
+ up bindings moved into bindings helper, shared by for loop.
+ (op_for, expand_vars): New static functions.
+ (expand): Bugfix: let case was neglecting to walk the var
+ initialization forms. This is done via expand_vars now.
+ let_star_s added to this case to handle let* and let at
+ the same time. New case added for for and for*.
+ (eval_init): let_star_s, for_s, and for_star_s initialized,
+ and entered into op_table.
+
+2011-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * eval.c (eval_init): More functions.
+
+ * txr.vim: More highlighting.
+
+2011-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding streams functions to Lisp evaluator.
+
+ * eval.c (op_let): Bugfix: was not evaluating var init forms.
+ (reg_var): New static function.
+ (eval_init): Registered numerous stream functions and the
+ three standard streams.
+
+ * lib.c (obj_print, obj_pprint): Modified to return a value.
+ (init): eval_init called after stream_init, because eval
+ needs the three standrad streams prepared.
+
+ * lib.h (obj_print, obj_pprint): Declarations updated.
+
+ * stream.c (format): Support t as a shorthand for standard output.
+ (formatv, open_directory, open_file, open_pipe): New functions.
+ (w_opendir): New static function.
+
+ * stream.h (formatv, open_directory, open_file, open_pipe):
+ Declared.
+
+ * txr.vim: set iskeyword such that keyword can contain special
+ characters. Set b:current_syntax to "lisp".
+ (txl_keyword): New keyword category populated with TXR Lisp keywords
+ defined as separate category.
+ (txr_list): Contains txl_keyword.
+ (txr_meta): Contains txl_keyword and txr_list.
+
+2011-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ mapcar, mappend and apply functions.
+ fun operator.
+
+ * eval.c (apply_s): New symbol variable.
+ (apply): Handle functions specified as symbols. Use symbol from context
+ form in error reporting.
+ (apply_intrinsic): New function.
+ (interp_fun): Bugfix: removed evaluation of arguments, since
+ arguments are already evaluated.
+ (op_call): Simplified by not having to handle symbols,
+ since apply does.
+ (op_fun): New function.
+ (expand): Handle special form fun.
+ (mapcarv, mappendv): New functions.
+ (eval_init): Initialize apply_s. Register op_fun function
+ in op_table. Register mapcar, mappend and apply functions.
+
+2011-11-28 Kaz Kylheku <kaz@kylheku.com>
+
+ Added evaluation support for quote and quasiquote with unquotes.
+ New functions list, append and eval. Code walking framework for
+ expanding quasiquotes. quotes right now.
+
+ * eval.c (let_s, lambda_s, call_s, cond_s, if_s, and_s, or_s
+ defvar_s, defun_s, list_s, append_s): New symbol variables.
+ (eval_intrinsic, op_quote, expand_forms, expand_cond_pairs,
+ expand_place, expand_qquote): New static functions.
+ (expand): New external function.
+ (eval_init): Initialize new symbol variables. Use newly defined symbol
+ variables to register functions. Also, new functions: quote, append,
+ list and eval.
+
+ * eval.h (expand): Declared.
+
+ * lib.c (appendv): New function.
+ (obj_init): quote and splice operator symbols moved into system
+ package.
+ (obj_print, obj_pprint): Support for printing quotes and splices.
+
+ * lib.h (appendv): Declared.
+
+ * match.c (do_s): New symbol variable.
+ (syms_init): New variable initialized.
+ (dir_tales_init): New variable used instead of intern.
+
+ * match.h (do_s): Declared.
+
+ * parser.y (elem): @(do) form recognized and its argument passed
+ through the new expander.
+ (o_elem, quasi_item): Pass list through expander.
+ (list): Use choose_quote to decide whether to put
+ regular quote or quasiquote on quoted list.
+ (meta_expr): Fixed abstract syntax so the expression is a single
+ argument of the sys:expr, rather than multiple arguments.
+ (unquotes_occur, choose_quote): New static function.
+
+2011-11-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (expr): Set source location info on elements.
+ (strlit): Set location info.
+
+2011-11-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (subst_vars): Handle expr_s, so that
+ Lisp expressions can be interpolated into quasiliterals.
+ (extract_vars): Avoid recursing into expressions marked
+ with expr_s.
+ (do_output_line): Handle expr_s so that Lisp expressions
+ can be interpolated into output.
+
+ * parser.y (o_elem, quasi_items): Handle list expressions,
+ annotated with expr_s.
+
+2011-11-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11436
+
+ Lisp interpreter added.
+
+ * gc.c (finalize, mark_obj): Handle ENV objects.
+
+ * hash.c (struct hash): acons_new_l_fun function
+ pointer order of arguments change.
+ (equal_hash): Handle ENV.
+ (make_hash, gethash_l): Use cobj_handle for
+ type safety. Follow change in acons_new_l.
+ (gethash, gethash_f, remhash, hash_count,
+ hash_get_userdata, hash_set_userdata, hash_next): Use cobj_handle.
+ (gethash_n): New function.
+
+ * hash.h (gethash_n): Declared.
+
+ * lib.c (env_s): New symbol variable.
+ (code2type, equal): Handle ENV. (plusv, minusv, mul, mulv, trunc, mod,
+ gtv, ltv, gev, lev, maxv, minv, int_str): New functions.
+ (rehome_sym): New static function.
+ (func_f0, func_f1, func_f2, func_f3, func_f4, func_n0, func_n1,
+ func_n2, func_n3, func_n4): Initialize new fields of struct func.
+ (func_f0v, func_f1v, func_f2v, func_f3v, func_f4v,
+ func_n0v, func_n1v, func_n2v, func_n3v, func_n4v,
+ func_interp): New functions.
+ (apply): Function removed: sanely re-implemented in new eval.c file.
+ (funcall, funcall1, funcall2, funcall3, funcall4): Handle
+ variadic and interpreted functions.
+ (acons, acons_new, acons_new_l, aconsq_new, aconsq_new_l): Reordered
+ arguments for compatibility with Common Lisp acons.
+ (obj_init): Special hack to prepare hash_s symbol, which is
+ needed for type checking inside the hash table funtions invoked
+ by make_package, at a time when the symbol is not yet interned.
+ Initialize new env_s variable.
+ (obj_print, obj_pprint): Handle ENV. Fix confusing rendering of
+ of function type.
+ (init): Call new function eval_init.
+
+ * lib.h (enum type): New enumeration member ENV.
+ (struct func): functype member changed to bitfield.
+ New bitfied members minparam and variadic.
+ New members in f union: f0v, f1v, f2v, f3v,
+ f4v, n0v, n1v, n2v, n3v, n4v.
+ (struct env): New type.
+ (union obj): New member e of type struct env.
+ (env_s): Variable declared.
+ (plusv, minusv, mul, mulv, trunc, mod, gtv, ltv, gev, lev, maxv, minv,
+ int_str): New functions declared.
+ (func_f0v, func_f1v, func_f2v, func_f3v, func_f4v,
+ func_n0v, func_n1v, func_n2v, func_n3v, func_n4v,
+ func_interp): Likewise.
+ (apply): Declaration removed, and re-introduced in eval.h.
+ (acons, acons_new, acons_new_l, aconsq_new, aconsq_new_l): Declarations
+ updated to new argument order.
+
+ * match.c (bindable): static function moved to eval.c, where
+ it becomes external.
+ (h_var, h_coll, h_parallel, h_fun, v_parallel, v_gather,
+ v_collect, v_merge, v_fun): Follows argument order change in
+ acons functions.
+ (subst_vars): Print atoms other than strings.
+ (eval_form): Support @(...) syntax for evaluating Lisp forms.
+ (v_do, h_do): New functions.
+ (dir_tables_init): Insert v_do and h_do into tables.
+
+ * parser.l: Token syntax for numbers and symbols merged.
+ Symbols in a nested context can consist of various additional
+ characters. Useless code removed from action for '('/METAPAR.
+
+ * stream.c (format): Bugfix in type checking, in the
+ case that the stream argument is nil and defaults to a string stream.
+
+ * txr.vim: Updated for new token syntax. Fixed uses of
+ unescaped + operator.
+
+ * unwind.c (uw_set_func)
+ * unwind.h (numeric_assert, range_bug_unless): Missing
+ whitespace in message added.
+
+ * Makefile (OBJS): eval.o added.
+
+ * dep.mk: Updated.
+
+ * eval.c: New file.
+
+ * eval.h: New file.
+
+2011-11-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (getplist_f): New function.
+
+ * lib.h (getplist_f): Declared.
+
+ * match.c (v_collect, h_coll): Use getplist_f to distinguish
+ the case that :vars is explicitly specified as (). In this
+ case, no bindings escape from the collect.
+
+ * tests/008/soundex.txr: This test case broke due to using
+ :vars () and yet counting on the variable to exist.
+
+ * RELNOTES: Updated.
+
+2011-11-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_funcall): Set source location info for
+ generated function call.
+
+2011-11-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (texts, elem): Fixed incorrect use of rl rather
+ than rlcp. Added forgotten rlcp on result of optimize_text.
+
+ * RELNOTES: Updated.
+
+2011-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 043
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+ * RELNOTES: Updated.
+
+2011-11-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (remove_hash_bang_line): Recognize multiple
+ syntax possibilities. A hash bang could be buried in a (text ...)
+ compound, or it could just be a string (thanks to the text form
+ optimization).
+
+2011-11-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Optimization: if all the elements of (text ...) are
+ strings, then replace the (text ...) by the catenation
+ of those strings.
+
+ * parser.y (optimize_text): New function.
+ (elem): Use optimize_text.
+
+2011-11-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (plus, minus): Fixed wrong assertion which would incorrectly
+ fire for inputs that do not overflow.
+
+ * match.c (search_form): Fixed incorrect loop test which could
+ lead to nonterminating behavior.
+
+ * RELNOTES: Updated.
+
+2011-11-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Semantics change. If a variable is followed by a mixture
+ of text and regular expressions, that whole mixture is
+ considered to follow the variable and used for matching.
+
+ The earlier semantics change whereby a single unescaped
+ space denotes the regular expression / +/ broke the
+ simple case @a word. It caused the @a to be followed
+ not by the text " word" but by just the regular expression
+ element.
+
+ With this change @a word means that a is followed by
+ the regex / +/ and "word".
+
+ * match.c (text_s): New symbol variable.
+ (h_text): New function.
+ (syms_init): Initialize new symbol variable.
+ (dir_tables_init): Hook h_text into horizontal directives table.
+
+ * match.h (text_s): Declared.
+
+ * parser.y (text, texts): New nonterminals.
+ (elem): TEXT, SPACE and regex are now handled under texts
+ grammar production. All texts are run together and produce
+ an item which looks like (text items ...).
+
+ * txr.1, RELNOTES: Updated.
+
+ * txr.c (remove_hash_bang_line): Updated to find #! buried
+ in (text ...) syntax.
+
+2011-11-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Fix environ test case for C++.
+
+2011-11-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (search_form): Bugfix: we must search to one character
+ position after the end of the line, otherwise we can never match
+ @(eol).
+ (h_eol): Bugfix: do not return t, but the line length.
+
+ * txr.1: Warn users about @var@(bind ...) pitfall.
+
+ * RELNOTES: Updated.
+
+2011-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 042
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+2011-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (char_from_name): const on wchar_t *.
+
+2011-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34630
+
+ * parser.y (repeat_clause, rep_elem): Allow empty body.
+ (yybadtoken): Handle unexpected newline with different message.
+
+ * RELNOTES: Updated.
+
+2011-11-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Relaxing :vars in collect/coll a little bit.
+
+ * match.c (h_coll, v_collect): Only throw an error about
+ missing required variables if the collect iteration collected some new
+ variables. This allows strict collects with :vars to have
+ some cases which explicitly match and skip unwanted material,
+ without binding variables. Also, print all missing variables in the
+ diagnostic.
+
+ * txr.1: Mention this special exception.
+
+ * RELNOTES: Updated.
+
+2011-11-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (tests/008/soundex.ok): New test case.
+ (TXR_ARGS): Specified for new test case.
+
+ * tests/008/soundex.expected: New file.
+
+ * tests/008/soundex.txr: New file.
+
+2011-11-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * RELNOTES: New file.
+
+2011-11-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34866
+
+ * match.c (h_skip): Bugfix. Return the length of the line if
+ the skip is to the end of line, not the value t.
+
+ * txr.1: Clarify that @var@(skip)text is useless.
+
+2011-11-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_deffilter): Even better. Just evaluate
+ the arguments individually. Now @(deffilter a b ..)
+ is possible where these evaluate to suitable
+ lists of strings.
+
+ * txr.1: Documented.
+
+2011-11-19 Kaz Kylheku <kaz@kylheku.com>
+
+ deffilter grows in power: it can take quasistrings.
+
+ * lib.c (cdr_f): New global variable.
+ (funcall1, funcall2, funcall3, funcall4): Fix unterminated
+ arguments in uw_throwf call by using uw_throw instead.
+ (do_or): New static function.
+ (orf): New function.
+ (obj_init): gc_protect and initialize cdr_f.
+
+ * lib.h (cdr_f, orf): Declared.
+
+ * match.c (v_deffilter): Treat the table as forms to be evaluated which
+ must reduce to strings, rather than literal strings.
+
+ * txr.1: Documented.
+
+2011-11-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (yybadtoken): Use ~a to print bad character rather than #\
+ notation.
+
+2011-11-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Regression IDENT, '{' and '}'
+ must be on the same precedence level and right
+ associative. Without this consective braced
+ variables don't work, etc.
+
+2011-11-18 Kaz Kylheku <kaz@kylheku.com>
+
+ * gc.c (mark_mem_region): Use the Valgrind API only to mark
+ the type field as accessible, not the whole object that
+ we are checking. Marking the whole object accessible hides
+ uninitialized field bugs!
+
+ * lib.c: And found a bug already: lazy_str was not completely
+ initializing all of the object fields (ls.prefix, ls.list)
+ before invoking memory allocating operations, making it
+ possible for the garbage collector to encounter uninitialized
+ object areas.
+
+2011-11-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Added a JSON parsing test case. This flushed out a bug which crashed
+ the garbage collector (uninitialized fields in function objects).
+
+ * Makefile: Defined TXR_ARGS and TXR_OPTS for new test case.
+
+ * hash.c (hash_begin): Construction of cobj modified to obey
+ the correct procedure described in HACKING.
+
+ * lib.c (func_n3, func_n4): These functions neglected to initialize
+ the env member of the function structure.
+
+ * tests/009/json.expected: New file.
+
+ * tests/009/json.txr: New file.
+
+ * tests/009/webapp.json: New file.
+
+2011-11-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11598.
+
+ * match.c (resolve_k): New keyword symbol variable.
+ (h_parallel, v_parallel): Implement :resolve keyword in @(some)
+ directive.
+ (syms_init): New symbol variable initialized.
+
+ * parser.l: Allow (some) to have argument material.
+
+ * parser.y (some_clause, elem): SOME syntax adjusted.
+
+ * txr.1: Documented new :resolve keyword in @(some).
+
+2011-11-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding quote and unquote read syntax to list forms, resembling
+ Lisp. The difference is that splice is spelled ,* because @
+ already means something, and that there is only one quote operator.
+ None of this does anything; it is only syntax.
+
+ * lib.c (quote_s, qquote_s, unquote_s, splice_s): New variables.
+ (obj_init): New variables initialized.
+
+ * lib.h (quote_s, qquote_s, unquote_s, splice_s): Declared.
+
+ * parser.l: Added recognition rules.
+
+ * parser.y (SPLICE): New symbolic token.
+ (list): Added new syntax for quote and splicing.
+
+2011-11-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_fun, v_fun): Bugfix! copy_list should be used for copying
+ the bindings, not copy_alist. Otherwise functions cannot destructively
+ update a binding, which is useless. We want a function not to
+ manipulate the binding list, but to be able to manipulate the
+ contents of bindings.
+ (match_files_ctx): Declaration moved ahead of match_line.
+ (v_fun): Forward declaration added.
+ (match_line): Allow vertical functions to be called from
+ a horizontal context, in a limited way.
+
+ * txr.1: Mention the possibility of a call from a horizontal
+ context falling back on a vertical function.
+
+2011-11-17 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Bugfix: precedence of { } must be low, close to that of
+ IDENT, otherwise @{var}@(foo) doesn't parse.
+
+2011-11-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Allow directives after variable to be a kind of negative match.
+
+ * match.c (search_form): bugfix: return correct match extent.
+
+ * parser.y: Adjusting associativity and precedence of directives, IDENT,
+ and grouping tokens once again. This is so that a var followed by
+ a directive will turn into one elem, rather than the var being
+ reduced to an elem first.
+
+ * txr.1: Revised documentation to mroe clearly define the concept
+ of a negative match, broken into subsections. Some sections
+ belonging to syntax were moved to an appropriate location.
+ Subsections added to description of form syntax.
+ Explanation of directive-driven syntax.
+
+2011-11-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Variable matches can span over function calls.
+ Function calls following variables have searching semantics.
+
+ * match.c (ml_specline_pos, search_form): New static functions.
+ (h_var): Handle functions and regexes in a common way.
+
+ * parser.y: Adjusted precedence of IDENT and ( so that
+ @var@(func) are parsed into a single var element.
+
+ * txr.1: Documented.
+
+2011-11-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Update for new character constant syntax.
+
+2011-11-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_var): when manipulating specline, propagate the
+ source locatio info.
+ (v_skip): Don't use specline for trace messages, because
+ it may be nil. Use the skip spec.
+
+ * parser.h (rl): Declared.
+ (rlcp): New inline function.
+
+ * parser.y (rl): Static declaration removed. Function becomes
+ extern.
+ (clause): Propagate location info from clause to clause list
+ backbone.
+ (collect_clause, COLL): Bugfix: car/cdr mixup in location info.
+ (elem): Use rlcp function to abbreviate code.
+ (o_elems_opt, o_elems_opt2, o_elem): Set location info.
+
+2011-11-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Changing read syntax for character literals, because we are going to
+ need the single quote in the Lisp way for suppressing evaluation,
+ eventually.
+
+ I'm going with a Scheme-compatible syntax for character literals.
+ It has a richer repertoire of standard character names than Common
+ Lisp, and has a x convention for coding characters in hex.
+
+ * lib.c (obj_print): Print characters in a Scheme-like way.
+
+ * parser.h (end_of_char): New function declared.
+
+ * parser.l (grammar): Implement rules for #\ syntax, with
+ involving new HASH_BACKSLASH token.
+ (end_of_regex): Enhancement: added check that end_of_regex is
+ called in correct state, like the one in end_of_char.
+ (end_of_char): New function.
+
+ * parser.y (repeat_rep_helper, o_elems_transform, define_transform,
+ lit_char_helper): Functions changed to static.
+ (rl): Function moved down, past the grammar section.
+ (HASH_BACKSLASH): New terminal symbol.
+ (chrlit): Grammar redesigned.
+ (char_from_name): New function.
+
+ * txr.1: Character syntax documented.
+
+2011-11-14 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: horizontal directives were being treated as vertical,
+ and the trailing material silently ignored.
+ For instance @(bind a 1)@(bind b 2). This was going to v_bind,
+ v_bind does not check for the trailing material and doe snot
+ call decline_s. The result was that b was not bound.
+ Correct behavior is to process these binds in match_line.
+
+ * match.c (match_line): Check if a directive IS found in the vertical
+ table, and if so report a different error message. The fallback
+ case is that there is no such function or directive.
+ (v_next): Do not check for obsolete syntax any more. This case
+ will not occur any more due to the following changes.
+ (match_files): Do not defer opening the file if the data starts
+ with an incorrectly written next directive.
+ Do not look up and process a vertical directive or function
+ call if it is followed by more material in the same line.
+ Thus vertical directives can longer receive trailing material.
+ This fixes the bug of horizontal directives being treated as
+ vertical
+
+2011-11-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * debug.c (debug): Eliminated duplicate code.
+ Implemented better way of printing character context.
+
+2011-11-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Adding a debugger. This is an experimental prototype.
+
+ * Makefile (OBJS): New object file debug.o.
+
+ * dep.mk: Updated.
+
+ * match.c (h_fun): Use debug_begin and debug_end macros
+ to set up a debug frame for backtracing.
+ (match_line, match_files): Call debug_check to give debugger a chance
+ to instrument call.
+ (v_fun): Use debug_begin and debug_end macros to set up a debug frame
+ for backtracing. Call debug_check to give debugger a chance to
+ instrument call.
+
+ * stream.c (struct strm_ops): New function pointer, flush.
+ (stdio_maybe_write_error): Wrong word in error message corrected.
+ (stdio_flush): New static function.
+ (stdio_ops, pipe_ops): New function entered into tables.
+ (flush_stream): New function.
+
+ * stream.h (flush_stream): Declared.
+
+ * txr.c (help): New options documented.
+ (main): call to debug_init added. New debug options parsed and
+ opt_debugger set accordingly.
+
+ * unwind.c (uw_push_debug, uw_current_frame): New function.
+
+ * unwind.h (uw_frtype): New enumeration member UW_DBG.
+ (struct uw_debug): New frame variant.
+ (union uw_frame): New member, db.
+ (uw_push_debug, uw_current_frame): Declared,
+
+ * debug.c: New file.
+
+ * debug.h: New file.
+
+2011-11-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Fix regression in earlier commit:
+
+ "Eliminate line numbers from the abstract syntax
+ tree representation of the TXR query."
+
+ * match.c (match_funcall): Remove spurious object being
+ added to the front of a form where a line number used
+ to be.
+
+2011-11-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c: Removed <assert.h>
+
+ * txr.c: Likewise.
+
+2011-11-13 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34813
+
+ * match.c (v_freeform): Fail if the data is null,
+ to avoid a false positive match as an empty line, followed by the type
+ error of incrementing a nonexistent data line number.
+
+2011-11-12 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Correctly record line number info for regex.
+
+2011-11-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Improved line number reporting in errors and debug traces.
+
+ * match.c (debugf): Function removed.
+ (dest_bind, v_output, v_eof): Use debuglf instead of
+ debugf, and sem_error instead of uw_throwf.
+ (match_files): Likewise, and file_err is called
+ with form.
+
+2011-11-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Eliminate line numbers from the abstract syntax
+ tree representation of the TXR query.
+
+ * match.c (debuglf, sem_error, file_err, eval_form): Line number argument replaced
+ with the form to which the situation pertains. Location information is
+ pulled from the hash table entry associated with the form.
+ (dest_set, dest_bind, eval_form, vars_to_bindings): Context argument
+ renamed since it isn't a line number.
+ (struct match_line_ctx): spec_lineno member removed.
+ (ml_all, ml_bindings_specline): lineno parameter removed.
+ (LOG_MISMATCH, LOG_MATCH, h_var, h_skip, h_coll, h_parallel,
+ match_line): Pass elem to debuglf instead of line number.
+ as context.
+ (h_trailer, h_eol): define elem for LOG_MISMATCH and LOG_MATCH macros.
+ (h_fun): Pass elem variable to debuglf instead of line number.
+ Body stored as a simple cons cell once again (no line number).
+ (do_output_line): Line number parameter removed. Pass specline to
+ sem_error instead of line number.
+ (do_output): Adjusted for one less parameter in do_output_line.
+ (mf_from_ml): Pass one less parameter to ml_all. Conversion of
+ specline to spec is just a wrapping into a nested list,
+ with no line number.
+ (spec_bind): Linenumber variable parameter removed from macro.
+ Definition simplified.
+ (v_skip): Pass specline to debuglf instead of spec_linenum,
+ which is no longer computed.
+ (v_trailer): Use new definition of specline. Pass first_spec
+ to sem_error instead of spec_linenum.
+ Computation of ff_specline no longer has to skip line number.
+ (v_freeform, v_block, v_accept_fail, v_next, v_parallel, v_gather,
+ v_collect, v_merge, v_bind, hv_trampoline, v_cat, v_output,
+ v_try, v_defex, v_throw, v_deffilter, v_filter, match_funcall): Use new
+ definition of specline. Pass first_spec to sem_error instead of
+ spec_linenum. (v_forget_local): Specline computed differently since
+ there is no linenumber to skip.
+ (h_define): Back to implified representation of function with
+ no extra cell for line number.
+ (v_define, v_fun): Pass first_spec to sem_error instead of
+ spec_linenum. Back to implified representation of function with no
+ extra cell for line number.
+ (match_files): first_spec_item computed differently.
+ Pass first_spec to sem_error instead of spec_linenum.
+
+ * parser.h (source_loc): Declared.
+
+ * parser.l (source_loc): New function.
+
+ * parser.y:x (grammar): Removed line numbers from abstract sytnax
+ tree. A few more places needed the annotation of forms with location
+ info, and a couple of cases of the need to propagate the info was
+ identified. Use extra cons cell as output of until_last to propagate
+ the line number from the symbol to the use.
+
+ * txr.c (remove_hash_bang_line): No longer has to look past
+ line number.
+
+2011-11-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Infrastructure for storing line number information
+ outside of the code, in hash tables.
+
+ * filter.c (make_trie, trie_add): Update to three-argument
+ make_hash.
+
+ * hash.c (struct hash): New members, hash_fun, assoc_fun
+ acons_new_l_fun.
+ (ll_hash): Renamed to equal_hash.
+ (eql_hash): New static function.
+ (cobj_hash_op): Follows ll_hash rename.
+ (hash_grow): Use new function indirection to call hashing function.
+ (make_hash): New argument to specify type of hashing. Initialize new
+ members of struct hash.
+ (gethash_l, gethash, remhash): Use function indirection for hashing and
+ chain search and update.
+ (pushhash): New function.
+
+ * hash.h (make_hash): Declaration updated with new parameter.
+ (pushhash): Declared.
+
+ * lib.c (eql_f): New global variable.
+ (eql, assq, aconsq_new, aconsq_new_l): New functions.
+ (make_package): Updated to new three-argument make_hash.
+ (obj_init): gc-protect and initialize new variable eql_f.
+
+ * lib.h (eql, assq, aconsq_new, aconsq_new_l): Declared.
+
+ * match.c (dir_tables_init): Updated to there-argument make_hash.
+
+ * parser.h (form_to_ln_hash, ln_to_forms_hash): Global variables
+ declared.
+
+ * parser.l (form_to_ln_hash, ln_to_forms_hash): New global variables.
+ (grammar): Set yylval.lineno for tokens that are classified to
+ that type in parser.y.
+ (parse_init): Initialize and gc-protect new global variables.
+
+ * parser.y (rl): New static helper function.
+ (%union): New member, lineno.
+ (ALL, SOME, NONE, MAYBE, CASES, CHOOSE, GATHER,
+ AND, OR, END, COLLECT, UNTIL, COLL, OUTPUT, REPEAT,
+ REP, SINGLE, FIRST, LAST, EMPTY, DEFINE,
+ TRY, CATCH, FINALLY, ERRTOK, '('): Reclassified as lineno type.
+ In the grammar, these keywords can thus provide a stable line number
+ from the lexer.
+ (grammar): Numerous rules updated to add constructs to the
+ line number hash tables via the rl helper.
+
+ * dep.mk: Updated.
+
+ * Makefile (depend): Use the installed, stable txr in the
+ system path to update dependencies rather than locally built ./txr, to
+ prevent the problem that txr is broken because out out-of-date
+ dependencies, and thus cannot regenerate dependencies.
+
+2011-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34799: errors in horizontal functions
+ reported to caller line number.
+
+ * match.c (ml_bindings_specline): Extended with extra argument
+ (h_coll): Pass nil for new argument of ml_bindings_specline.
+ (h_fun): Extract line number from stored function.
+ Pass line number to ml_bindings_specline.
+ (h_define, v_define): Store function as a cons cell containing
+ the line number and body.
+
+2011-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Document -l/--lisp-bindings.
+
+2011-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (opt_nobindings, opt_arraydims): Global
+ variables moved from parser.l.
+ (opt_lisp_bindings): New variable.
+ (dump_bindings): Dump Lisp syntax bindings
+ on standard output if opt_lisp_bindings is set.
+ (v_cat): Do not complain about trailing material;
+ this is not compatible with horizontal cat.
+
+ * parser.l (opt_nobindings, opt_arraydims): Moved
+ to match.c.
+
+ * txr.c (txr_main): New options, --lisp-bindings
+ and the equivalent -l.
+
+ * txr.h: opt_lisp_bindings declared.
+
+2011-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11583
+
+ * match.c (dir_tables_init): Mapping flatten_s, forget_s,
+ local_s, merge_s, set_s, cat_s and filter_s to hv_trampoline
+ function, thereby making all these directives work in
+ horizontal contexts in one fell swoop.
+
+2011-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11583
+
+ More generic approach.
+
+ * match.c (h_bind): Function removed.
+ (hv_trampoline): New function.
+ (dir_tables_init): hv_trampoline installed in
+ h_directive_table instead of h_bind.
+
+2011-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Fixed wrong error message.
+
+2011-11-10 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_fun): Bugfix: if there is material after
+ the function call, decline it; it is a horizontal context.
+
+ * txr.1: Discussion and examples of calls that are
+ in a horizontal context.
+
+2011-11-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented horizontal function definitions and calls
+
+2011-11-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11583
+
+ @(bind) in horizontal mode.
+
+ * match.c (mf_from_ml, h_bind): New functions.
+ (dir_tables_init): h_bind entered into table.
+
+2011-11-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_fun, v_fun): Slightly more informative tracing from failed
+ function calls.
+
+2011-11-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Missing coll keyword added.
+
+2011-11-08 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11431. First cut at horizontal match functions.
+
+ * match.c (h_fun): New function.
+ (match_line): Rearranged not to do hash lookup if the directive is a
+ regex or list. If hash lookup fails, try it as a horizontal function.
+ (h_define): New function. Handles horizontal function syntax embedded
+ in line.
+ (v_define): Handle the horizontal function syntax occuring
+ on a line by itself. The function info is now stored as a cons cell
+ whose car is the vertical function and cdr the horizontal one.
+ (v_fun): Adjust to new function storage convention.
+ (dir_tables_init): h_define entered in table.
+ * parser.y: Added syntax for horizontal define.
+
+2011-11-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Make sure whitespace is recognized after @.
+
+2011-11-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11581 & bugfix.
+
+ * match.c (noval_s): New symbol variable.
+ (vars_to_bindings): Use a default value of noval_s to indicate a
+ required variable, rather than nil, which would not allow
+ an optional variable with a default value of nil.
+ (h_coll, v_collect): Check default value against noval_s, rather than nil.
+ (v_gather): Support :vars keyword.
+ (syms_init): Initialize new symbol variable.
+
+ * txr.1: Documented gather's :vars parameter.
+
+2011-11-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11581
+
+ * match.c (gather_s): New keyword variable.
+ (v_gather): New function.
+ (syms_init): gather_s initialized.
+ (dir_tables_init): v_gather entered into table.
+
+ * match.h (gather_s): Declared.
+
+ * parser.l: GATHER token scanning added.
+
+ * parser.y: GATHER token added. gather_clause nonterminal added.
+
+ * txr.1: New directive documented.
+
+ * txr.vim: gather keyword introduced.
+
+2011-11-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (env): Fixed inappropriate cut-and-pasted error messages.
+ Check for failure of GetEnvironmentStringsW, and call
+ FreeEnvironmentStringsW is called.
+
+2011-11-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (dir_tables_init): Bugfix: horizontal @(some)
+ directive not included in dispatch table.
+
+2011-11-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Bugfixes. Before the compiler tests, we must
+ remove the conftest executable, to make sure that the next test will
+ try to re-make it. The configure runs fast enough that the new
+ conftest.c does not always have a timestamp which is newer than
+ previous conftest executable.
+
+2011-11-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11442. Make work on MingW.
+
+ * configure: Test for environ and GetEnvironmentStrings.
+
+ * lib.c: Conditionally include <windows.h>.
+ (env): Implemented for POSIX and Windows with #ifdefs.
+
+2011-11-05 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11442. Access to environment variables.
+
+ * lib.c (env_list): New static variable.
+ (env): New function.
+ (match): Declaration of nonexistent function removed.
+ (obj_init): New variable gc-protected.
+
+ * lib.h (env): Declared.
+
+ * match.c (env_k): New symbol variable.
+ (v_next): Implemented :env.
+
+ * txr.1: @(next :env) described.
+
+2011-11-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (ll_hash): Added a break in the case that handles
+ pointer hashing of identity-equal objects. Without this, if the
+ pointer size is not 4 or 8, we fall through to the next case.
+
+2011-11-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.c (help): Change year from 2009 to 2011.
+
+2011-11-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/008/students.txr: Use disciplined collect with :vars.
+
+2011-11-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/008/students.txr: Regexes removed.
+
+2011-11-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Added missing keywords.
+
+2011-11-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * genman.txr: Use filter for mapping month digits to names.
+ Added comment about where to find the right man2html.
+
+2011-11-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.vim: Added installation instructions.
+
+2011-11-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Syntax highlighting for Vim.
+
+ * txr.vim: New file.
+
+2011-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 041
+
+ Bugfixes:
+
+ Runaway recursion in @(block) directive, introduced in 040.
+
+ Fixed bug in matching list variable against text, at the same
+ time clarifying semantics to longest-match.
+
+ Fixed potential excessive memory use caused by refactoring in 040.
+
+ Features:
+
+ New :append keyword in @(output) to append instead of overwriting.
+
+ Variable contents can be treated as input sources using :string
+ and :list keywords in @(next). Variables can be treated as output
+ destinations using :into keyword in @(output).
+
+ New @(set) directive for destructive assignment to a variable.
+
+ New filters: :upcase and :downcase.
+
+ @(bind) can now compare left and right objects through filters.
+
+ Filters can now be chained into compound filters.
+
+ Pattern matching functions can be used as filters.
+
+ Shorthand notation in @(deffilter) when multiple strings map to the
+ same replacement string.
+
+ @(cat) directive changes syntax.
+
+ Error handling improvements in parser: no more reams and reams of
+ errors.
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+2011-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ We don't include headers in headers in this project.
+
+ * parser.h: Do not include <stdio.h>
+
+ * regex.c: Include <limits.h>
+
+ * regex.h: Do not include <limits.h>
+
+2011-10-30 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34691
+
+ Changing the parameter passing convention for vertical directives.
+ They take one parameter which is a pointer, rather than a copy
+ of the structure. They do not have to perform a structure
+ assignment when returning next_spec_k.
+
+ * match.c (v_match_func): Typedef updated to new function
+ signature.
+ (v_skip, v_trailer, v_freeform, v_block, v_accept, v_accept, v_next,
+ v_parallel, v_collect, v_flatten, v_forget, v_forget, v_merge, v_bind,
+ v_set, v_cat, v_output, v_define, v_try, v_defex, v_throw, v_deffilter,
+ v_filter, v_eof, v_fun): Refactored.
+ (match_files): Updated dispatch logic to new style calls.
+ (match_funcall): Updated to new way of calling v_fun.
+
+2011-10-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Grammar fixes. Expanded on lazy strings a little bit.
+ Added something about mem_t *, and a few extra words here and there,
+ including a blurb about a Valgrind debugging caveat.
+
+2011-10-27 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34657
+
+ * txr.1: Added explanations about the differences between
+ empty streams and empty lines, and to watch out when passing
+ empty strings to @(next :string ...).
+
+2011-10-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfix: prepared_error_message variable needs to be gc-protected.
+
+ * parser.h (parse_init): Declared.
+
+ * parser.l (parse_init): New function.
+
+ * txr.c (main): Call parse_init.
+ (txr_main): No need to gc-protect yyin_stream since parse_init does it.
+
+2011-10-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Parse error handling improvements.
+
+ * parser.l (prepared_error_message): New static variable.
+ (yyerror): Emit and clear prepared error message.
+ (yyerrprepf): New static function.
+ (yybadtoken): Function moved into parser.y.
+ (grammar): For irrecoverable lexical errors, stash error message
+ with yyerrprepf and return the special error token ERRTOK to generate a
+ syntax error. I could find no other interface to the parser to make it
+ cleanly exit.
+
+ * parser.y (ERRTOK): New terminal symbol, does not appear anywhere
+ in the grammar.
+ (spec): Bail after 8 errors, recover to nearest newline, and
+ use yyerrok to clear error situation.
+ (YYEOF): Provided by Bison, conditionally defined for other yacc-s.
+ (yybadtoken): Function moved from parser.l. Checks for the next
+ token being YYEMPTY or YYEOF, and also handles ERRTOK.
+
+ * stream.c (vformat_to_string): New function.
+ (format): If stream is nil, format to string and return it.
+
+ * stream.h (vformat_to_string): Declared.
+
+2011-10-26 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_cat): Bugfix: unterminated variable argument list.
+
+ * tests/001/query-3.txr: Updated to new cat syntax.
+
+2011-10-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixed lame @(cat) directive, without obsolescence phase.
+
+ * match.c (v_cat): Rewritten.
+
+ * txr.1: Documented.
+
+2011-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: put in set -u to trap unbound variables,
+ and fixed resulting errors that were found.
+
+2011-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (filter_s): New symbol variable.
+ (v_filter): New function.
+ (syms_init): New symbol variable initialized.
+ (dir_tables_init): New function entered into table.
+
+ * txr.1: Documented new filter directive.
+
+2011-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ dep.mk: Regenerated.
+
+2011-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Shorthand for filters which map multiple texts to a common
+ replacement text.
+
+ * filter.c (build_filter_from_list): Allow tuples to denote
+ multiple keys mapping to the same value.
+
+ * lib.c (do_curry_123_2, do_curry_123_1): New static functions.
+ (curry_123_2, curry_123_1): New functions.
+
+ * lib.h (curry_123_2, curry_123_1): New functions declared.
+
+ * match.c (v_deffilter): Allow tuples of strings rather than
+ just pairs.
+
+ * txr.1: Updated.
+
+2011-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y: Remove mention of nonexistent terminal \\
+ from %right associativity clause.
+
+2011-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c (fun_k): New keyword variable.
+ (function_filter): Use :fun keyword symbol instead of fun.
+ (filter_init): New keyword variable initialized.
+
+ * filter.h (upcase_k, downcase_k, fun_k): Declared.
+
+ * txr.1: Updated.
+
+2011-10-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_bind): Use sem_error to throw errors with line number
+ info.
+
+2011-10-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugs #34641, #34629.
+
+ * lib.c (search_str_tree): If multiple strings from the needle tree
+ matching within within the haystack string, then take the leftmost
+ match. If there are multiple matches at the same leftmost position,
+ take the longest one.
+
+2011-10-24 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c (function_filter): New function.
+ (get_filter): Handle (fun ...) syntax.
+
+ * match.c (v_bind): Establish dynamic environment frame around
+ dest_bind, and stash the bindings there so filters can have access
+ to the bindings.
+ (v_output): Likewise, around do_output calls.
+ (v_fun): New function.
+ (match_files): Function handling broken out into v_fun.
+ (match_funcall): New function.
+
+ * match.h (match_funcall): Declared.
+
+ * unwind.c (uw_push_env): Initialize match_context.
+ (uw_get_match_context, uw_set_match_context): New functions.
+
+ * unwind.h (struct uw_dynamic_env): New member, match_context.
+ (uw_get_match_context, uw_set_match_context): Declared.
+
+ * txr.1: Documented function filters.
+
+2011-10-24 Kaz Kylheku <kaz@kylheku.com>
+
+ Turning attention to some plumbing.
+
+ * unwind.c (uw_env_stack): New static variable.
+ (uw_unwind_to_exit_point): Maintain correct uw_env_stack
+ during unwinding.
+ (uw_find_env): Just retrieve the env stack pointer; no search.
+ (uw_push_env): Store a pointer to the previous
+ environmental frame and just initialize the bindings to nil.
+ No need to cons up a copy of the bindings from the previous frame.
+ (uw_get_func): Perform a search through the environment stack.
+
+ * unwind.h (struct uw_dynamic_env): New member, up_env.
+
+2011-10-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/007/except-1.txr: Use next :list instead
+ of piping from echo command. As a result, this test case should run on
+ MingW.
+
+2011-10-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (list_k, string_k): New keyword symbol variables.
+ (v_next): Implement :list and :string keywords.
+ (syms_init): New keyword variables initialized.
+ NOTE: the :var keyword is deprecated.
+
+ * txr.1: Documented :list and :string.
+
+2011-10-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (h_skip): Bugfix: bad agument list in debugf call.
+
+2011-10-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11474
+
+ * filter.c (filter_equal): Takes two filters instead of one.
+ (lfilt_k, rfilt_k): New keyword variables.
+ (filter_init): New keyword variables initialized.
+
+ * filter.h (filter_equal): Declaration updated.
+ (lfilt_k, rfilt_k): Declared.
+
+ * lib.c (funcall4): New function.
+ (do_curry_1234_34): New static function.
+ (curry_1234_34): New function.
+ (do_swap_12_21): New static function.
+ (swap_12_21): New function.
+
+ * lib.h (funcall4, curry_1234_34, swap_12_21): Declared.
+
+ * match.c (dest_bind): Swap use the function argument swapping
+ combinator when calling tree find such that the value
+ being searched is on the left and pattern material is on the right.
+ (v_bind): Implemented :lfilt and :rfilt.
+
+ * txr.1: Documented :lfilt and :rfilt.
+
+2011-10-22 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c (get_filter_trie): Function renamed to get_filter. A filter
+ is not necessarily a trie.
+ (string_filter, compound_filter): New functions.
+ (get_filter): Recognize a compound filters and return a function
+ which implements it.
+
+ * filter.h (get_filter_trie): Declaration renamed.
+
+ * match.c (format_field, v_bind, v_output): Follow get_filter_trie
+ rename. Error message text updated.
+
+ * txr.1: Describe compound filters.
+
+2011-10-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11474
+
+ * filter.c (filter_equal): New function.
+ (upcase_k, downcase_k): New keyword variables.
+ (filter_init): New keyword variables initialized,
+ and new upcase and downcase filters registered.
+
+ * filter.h (filter_equal): Declared.
+
+ * lib.c (tree_find): Takes new argument, the equality test function.
+ (upcase_str, downcase_str): New functions.
+ (do_curry_123_23): New static function.
+ (curry_123_23): New function.
+
+ * lib.h (tree_find): Declaration updated.
+ (upcase_str, downcase_str, curry_123_23): Declared.
+
+ * match.c (dest_bind): Updated to take equality function.
+ Uses it and passes it down to tree_find.
+ (v_bind): Filter feature implemented.
+ (h_var, v_try): Add equal_f to dest_bind argument list.
+
+ * txr.1: Updated to describe new filters and bind arguments.
+
+2011-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_collect, v_coll): Establish empty list bindings
+ for all :vars in the event that the collect turns up nothing.
+
+ * txr.1: Document behavior.
+
+2011-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_collect): Regression bugfix. Make it work like the comment
+ says: until/last clause has visibility to uncollated bindings from
+ collect.
+
+2011-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ Implementing @(set) directive for assigning to variables
+ destructively.
+
+ * match.c (dest_set, v_set): New static functions.
+ (dir_tables_init): Add v_set to vertical directives hash table.
+
+ * txr.1: Documented.
+
+2011-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (v_output): When appending output to a variable,
+ flatten the previous contents so we can append to a single
+ string, or to deeply nested list, etc.
+
+ * txr.1: Documented these new extensions to next and output.
+
+2011-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ New features. Strling list output streams in stream
+ library, allow output to be captured as a list of strings
+ representing lines (in contrast to string streams which capture
+ a single string).
+
+ The output directive can output to a variable,
+ and next can scan over a variable.
+
+ * lib.c (span_str, compl_span_str, break_str): New functions.
+
+ * lib.h (span_str, compl_span_str, break_str): New functions declared.
+
+ * match.c (into_k, var_k): New keyword variables.
+ (mf_file_data): New static function.
+ (v_next): Refactored argument handling. Added support for :var
+ keyword.
+ (v_output): Added support for :into keyword.
+
+ * stream.c (strlist_mark, strlist_out_put_string,
+ strlist_out_put_char): New static functions.
+ (strlist_out_ops): New static struct.
+ (make_strlist_output_stream, get_list_from_stream): New functions.
+
+ * stream.h (make_strlist_output_stream, get_list_from_stream): New
+ functions declared.
+
+2011-10-21 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (proper_plist_to_alist, improper_plist_to_alist): New
+ functions.
+
+ * lib.h (proper_plist_to_alist, improper_plist_to_alist): New
+ functions declared.
+
+ * match.c (append_k): New keyword symbol variable.
+ (complex_open): New append argument.
+ (v_output): Streamlined parsing of keywords.
+ Support :append keyword.
+
+ * txr.1: Output directive's keyword documentation revised.
+
+2011-10-20 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34609
+
+ * match.c (v_block): Regression induced by rabid refactoring. Block
+ must apply remaining directives to data, excluding itself, otherwise
+ runaway recursion takes the place of correct behavior.
+
+2011-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 040
+
+ Single unescaped space behaves like @/ +/ regex.
+
+ Ported to native Windows via MinGW.
+
+ Bugfixes for Cygwin and more robust handling of
+ errors arising from Windows not having proper
+ Unicode support (16 bit wide characters only).
+
+ Nasty GC bug fixed for all platforms, exposed by gcc 4.5.2, x86_64.
+
+ [Internal] The huge functions match_line and match_files have been
+ broken up into functions dispatched by hash table lookup on directive
+ symbols.
+
+ [Internal] Hashing of some objects improved.
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+2011-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425
+
+ * match.c (repeat_spec_k): New symbol variable
+ (h_match_func): New typedef.
+ (elem_bind): New macro.
+ (h_var, h_skip, h_coll, h_parallel, h_trailer, h_eol): New functions.
+ (match_line): Remaining directives moved to functions.
+ (syms_init): New symbol variable initialized.
+ (dir_tables_init): New functions entered into hash table.
+
+2011-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425
+
+ Refactoring match_files to make it easier to break up into
+ subfunctions, similarly to what was done with match_files.
+
+ * match.c (match_line_ctx): New struct type.
+ (ml_all, ml_specline, ml_bindings_specline): New functions.
+ (LOG_MISMATCH, LOG_MATCH): Macros moved outside of function,
+ updated to refer to structure members rather than local
+ variables.
+ (match_line): Takes only one argument now.
+ All recursive calls updated.
+ (v_freeform): Call to match_line updated.
+ (match_files): Likewise.
+
+2011-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425
+
+ * match.c (v_accept_fail, v_next, v_parallel, v_collect,
+ v_flatten, v_forget_local, v_merge, v_bind, v_cat, v_output,
+ v_try, v_define, v_defex, v_throw, v_deffilter, v_eof):
+ New functions.
+ (match_files): Remaining directives moved to functions.
+ (dir_tables_init): New functions entered into hash table.
+
+2011-10-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * hash.c (ll_hash): Hashing of pointers should take into
+ account alignment, otherwise only values divisible by the
+ alignment occur. This patch takes into considerations that
+ val values are pointers to object descriptors in a heap which
+ are four words wide, and so most likely aligned to 16 byte
+ boundaries (32 bit systems) or 32 byte boundaries (64 bit).
+ We need to shift.
+
+2011-10-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425
+
+ * match.c (v_block): New function.
+ (match_files): Block directive moved to function.
+ (dir_tables_init): v_block entered into table.
+
+2011-10-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425
+
+ * match.c (spec_bind): New macro.
+ (v_freeform): New function.
+ (match_files): Freeform logic moved to function.
+ (dir_tables_init): v_freeform entered into table.
+
+2011-10-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425
+
+ * match.c (same_data_k): Symbol variable renamed to next_spec_k.
+ (v_skip): Restructured not to return next_spec_k when there
+ are no more specs, but rather thread directly to what match_file
+ will do anyway, namely return the bindings and data position.
+ (v_trailer): New functions.
+ (match_files): Trailer logic moved to function.
+ (syms_init): Follows renaming of variable.
+ (dir_tables_init): GC bugfix: did not protect global hash
+ tables again, like in filter.c previously.
+
+2011-10-17 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425
+
+ Vertical skip directive moved into function dispatched
+ via hash table. Test suite passes.
+
+ * lib.c (cptr_s): New symbol variable.
+ (cptr_equal_op): New static function.
+ (cptr_equal_op, cptr, cptr_get): New functions.
+ (cptr_ops): New static structure.
+ (obj_init): New variable initialized.
+
+ * lib.h (cptr_s, cptr, cptr_get): Declared.
+
+ * match.c (decline_k, same_data_k): New symbol variables.
+ (v_match_func): New typedef.
+ (v_skip): New function.
+ (match_files): Check symbol in v_directive_table and dispatch
+ the associated function if an entry exists.
+ Skip directive handling moved to v_skip function.
+ (syms_init): Initialize new symbol variables.
+ (dir_tables_init): Enter v_skip into v_directive_table under
+ skip_s symbol.
+
+2011-10-16 Kaz Kylheku <kaz@kylheku.com>
+
+ Quick and dirty port to MinGW.
+
+ * configure: Test for presence of <sys/wait.h> added.
+ Conditionally generates HAVE_SYS_WAIT variable in config.h.
+
+ * stream.c: Include <sys/wait.h> conditionally.
+ (pipe_close): Do not test ermination status with WIFEXITED, etc.
+ if there is no <sys/wait.h> header.
+
+2011-10-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: reduced post-configure advice to just point
+ to the INSTALL guide.
+
+ * INSTALL: New file.
+
+2011-10-16 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c (trie_filter_string): Fix warning about uninitialized
+ variable (not a bug, but compiler cannot prove that).
+
+2011-10-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Task #11425. Refactoring match_files to make it easier to
+ break up into subfunctions. Arguments are packaged into a structure,
+ so that subfunctions won't have to all have big argument lists.
+
+ * match.c (h_directive_table, v_directive_table): New variables.
+ (match_files_ctx): New structure.
+ (mf_all, mf_args, mf_data, mf_spec, mf_spec_bindings): New functions.
+ (match_files): Takes only one argument now, the context
+ structure. data_lineno variable is a dynamic number.
+ Recursive calls to match_files are handled by creating contexts
+ as appropriate with the helper functions.
+ The old local variable data is now part of the context.
+ (syms_init, dir_tables_init): New functions.
+ (match_init): Just calls syms_init and dir_tables_init.
+
+2011-10-15 Kaz Kylheku <kaz@kylheku.com>
+
+ Fixed broken GC on x86_64 (Ubuntu 11, gcc 4.5.2).
+ The issues is that due to the aggressive function inlining
+ in the gc module, the mark_mem_region function is not real
+ subroutine. The address of its local variable &gc_stack_top
+ ended up excluding the machine context saved by setjmp in
+ the parent function. I.e. the buffer was not between the
+ computed stack top and bottom. Thus registers were not being
+ scanned for references to values. I added a little abstraction
+ to the machine context in the process of fixing this.
+
+ * gc.c (struct mach_context, mach_context_t): New type.
+ (save_context): New macro.
+ (mark): Takes two new arguments, pointer to the stack top and
+ machine context. It scans the machine context explicitly rather
+ than relying it to be on the stack, between the top and bottom.
+ This context is in fact only object within the garbage collector part
+ of the activation chain that we need to scan.
+ (gc): Use new abstraction to save machine context. Local variable
+ is used to derive the stack top here. The stack top is the top
+ of the stack above the activation frames in the garbage collector
+ itself. The gc has nothing on its stack that should be scanned,
+ except for the machine context, which is now handled explicitly.
+
+2011-10-15 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: POSIX Portability. Use = instead of ==
+ in test expressions. This was revealed by ubuntu's dash.
+
+2011-10-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (elem): Amending previous change. A single space
+ should only denote multiple spaces, not mixtures of spaces and
+ tabs. WE have to be careful with tabs because they can be
+ semantically different from spaces (e.g. file with tab delimited
+ fields which can be blank, empty or have leading or trailing spaces.)
+
+ * txr.1: Updated.
+
+2011-10-13 Kaz Kylheku <kaz@kylheku.com>
+
+ * Makefile (%.ok: %.txr): Use unified diff for showing
+ differences between expected and actual test output.
+
+ * parser.l (yybadtoken): Handle new terminal symbol, SPACE.
+ New rule for producing SPACE token out of an extent of
+ tabs and spaces.
+
+ * parser.y (SPACE): New terminal symbol.
+ (o_var): New nonterminal. I noticed that the var rule was
+ being used for output elements, and the var rule refers to
+ elem rather than o_elem. A new o_var rule is a simplified
+ duplicate of var.
+ (elem): Handle SPACE token. Transform to regex if it is
+ a single space, otherwise to literal text.
+ (o_elem): Handle SPACE token in output.
+
+ * tests/001/query-2.txr: This query depends on matching
+ single spaces and so needs to use escapes.
+
+ * tests/001/query-4.txr, test/001/query-4.expected: New test
+ case, based on query-2.txr. It produces the same output,
+ but is simpler thanks to the new semantics of space.
+
+ * txr.1: Documented.
+
+2011-10-12 Kaz Kylheku <kaz@kylheku.com>
+
+ Bug #34538
+
+ * lib.h (wli): This macro now does the pointer displacement by 1.
+ (auto_str, static_str): #if/#else/#endif gone. These functions just
+ add the type tag. The + 1 logic was incorrect; it should have
+ been + sizeof(wchar_t). But even that was not right because other
+ code expects a wchli_t * to point to the first character,
+ such as the string_out_put_char function.
+
+2011-10-10 Kaz Kylheku <kaz@kylheku.com>
+
+ Improved support for broken unicode.
+ Regex support for extra-large character sets not compiled in
+ if wchar_t is not wide enough for it.
+ The utf-8 properly throws exceptions when encountering characters
+ that it cannot represent, instead of silently ignoring the
+ situation and continuing with incorrectly computed data.
+
+ * regex.c (FULL_UNICODE): New macro.
+ (CHAR_SET_L3, CHAR_SET_L2_LO, CHAR_SET_L2_HI): Only defined
+ if full unicde is available.
+ (CHSET_XLARGE, cset_L3_t, struct xlarge_char_set,
+ L2_full, L3_fill_range, L3_contains): Ditto.
+ (unon char_set): Member x1 present only under FULL_UNICODE.
+ (char_set_destroy, char_set_add, char_set_add_range,
+ char_set_contains): CHSET_XLARGE cases only available on
+ FULL_UNICODE.
+ (char_set_compile): Default cst variable to CHSET_LARGE.
+
+ * utf8.c (FULL_UNICODE): New macro.
+ (conversion_error): New function.
+ (utf8_from_uc): Throw error if not FULL_UNICODE and character is
+ outside the BMP.
+ (utf8_decode): Likewise.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Documented portability hacks for narrow wchar_t.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 039
+
+ Ported to Cygwin.
+
+ Horizontal modes for @(trailer), @(skip).
+
+ New :greedy keyword in skip which can be given instead of max
+ distance to give it longest match semantics.
+
+ @(collect) and @(coll) support a new clause, @(last).
+
+ The :times keyword in @(collect) and @(coll) introduced in the
+ previous release has a different meaning. The keywords :mintimes
+ and :maxtimes are added, and :maxtimes behaves like :times
+ did previously.
+
+ There is a :vars keyword in @(collect) and @(coll) to have
+ some control over what bindings are collected, as well
+ as error checking for missing bindings and defaulting behavior.
+
+ New @(eol) directive for explicitly matching the end of
+ the input or end of a line.
+
+ New lexical syntax: @(...) and @abc is allowed within expressions.
+ This produces a special structural syntax with no assigned meaning yet.
+
+ Awful bug fixed in function calling: if a function was called with
+ multiple unbound variables, and bindings were produced for them,
+ only one variable was being propagated to the calling environment.
+
+ Bugfixes to binding environment handling in the face of
+ @(local)/@(forget) directive.
+
+ Fix for the issue of unbound variables being silently ignored
+ in some contexts, like quasiliterals. An exception is now thrown.
+
+ Bugfix for an issue with consecutive variables in output.
+
+ Bugfix for an issue with horizontal @(cases) not collecting
+ bindings.
+
+ Bugfix for an issue with @(until) inside @(coll) not seeing
+ bindings from main clause.
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ One more swing at this with the axe.
+
+ * lib.h (wini, wref): New macros.
+
+ * stream.c (string_out_put_char): Rewritten with macros to eliminate
+ preprocessor #if test.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.h (wli, lit_noex): We need null characters on both ends
+ so that this hack is correct for null strings. When recovering
+ the wchar_t pointer from a null literal object, we wil increment
+ unconditionally, since it always points to a null character.
+ We end up skipping past null terminator #1, but safely landing on #2.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Following up to previous commit's TODO.
+
+ * filter.c (struct filter_par): wchar_t becomes wchli_t.
+
+ * lib.h (wchli_t): New type: an incomplete structure type,
+ so that a pointer to this type is incompatible with anything else.
+ (wli): Macro produces const wchli_t * pointer instead of
+ const wchar_t *.
+ (auto_str, static_str): Accept a const wchli_t * instead
+ of const wchar_t *, making it impossible to misuse these
+ functions by passing in a literal.
+
+ * stream.c (string_out_put_char): These type changes showed
+ this hack to have a bug. Confronted with the need to cast
+ from const wchar_t * to const wchli_t *, it's obvious that
+ the conversion has to be done properly with the + 1 in the
+ one platform case, but not the other.
+
+ * txr.c (version): Type changed to const wchli_t.
+
+ * txr.h (version): Declaration updated.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ Ported to Cygwin.
+
+ TODO: there should be some type safety with the new wli macro
+ so that if it is forgotten, there will be a diagnostic.
+
+ * configure (lit_align): New configuration variable
+ and configuration test. Generates LIT_ALIGN in config.h.
+ Fixed the integer-holds-pointer test for the different output
+ from the nm program on Cygwin. The arrays become common symbols
+ marked C which do not show an offset attribute, only size:
+ one less column.
+
+ * filter.c (to_html_table, from_html_table): wrap wide string
+ literals with the wli macro. This must be done from now on for
+ all literals and initializes of arrays that are going to be
+ directly converted to type tagged val-s.
+
+ * lib.h (wli): New macro.
+ (auto_str, static_str, litptr, lit_noex): Handle wide literals on
+ platforms where they are aligned to only two bytes, such that we don't
+ have two bits in the pointer. We can still add our 11 bit type tag, but
+ then when recovering the pointer to the data, we have may have
+ to fix up the pointer.
+
+ * parser.l: Another portability issue here. Flex generates a scanner
+ which has #include <unistd.h> in the middle, after the source file's
+ own #includes which can introduce macros. On Cygwin, there is some
+ hygiene problem whereby our "noreturn" macro causes the <unistd.h>
+ header to generate bad syntax and fail to compile. Stupid Cygwin
+ and even stupider flex! The workaround is to include <unistd.h>
+ at the top in the flex source.
+
+ * stream.c (string_out_put_char): This is one more place where
+ the string literal handling hack spreads.
+
+ * txr.c (version): Wrap string in wli.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * dep.mk: Regenerated. Too easy to neglect this file.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (vars_to_bindings): Regression fix: recent commit
+ caused test failure. An empty list not treated as a valid collect
+ variable list.
+
+2011-10-09 Kaz Kylheku <kaz@kylheku.com>
+
+ * configure: Fixed indentation.
+
+2011-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Removed references to obsolete @(next) variant.
+
+2011-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (vars_to_bindings): New function.
+ (match_line): keyword argument :vars implemented for coll.
+
+ * txr.1: Documented :vars.
+
+2011-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (vars_k): New symbol variable.
+ (match_files): Implemented :vars in collect.
+ (match_init): New symbol variable initialized.
+
+2011-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Augment example of @/.*/ being used to skip to the
+ end of the line with @(skip) which is now better style,
+ since it avoids reaching for regexes.
+
+2011-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_line): Skip directive bugfix. If skip is the
+ last item on the line, it must match the whole line by returning
+ success.
+
+2011-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (mintimes_k, maxtimes_k): New keyword variables.
+ (match_line): Implemented :mintimes and :maxtimes, changing
+ the semantics of :times.
+ (match_files): Likewise.
+ (match_init): New keyword variables initialized.
+
+ * txr.1: Updated.
+
+2011-10-08 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Formatting.
+
+2011-10-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_files): Fixed spectacular bug in function calling,
+ dating back to before October 2009 when txr was put into git.
+ Basically, unbound variables were not handled right after
+ the function return, due to the increment step being wrongly
+ written as ``piter = cdr(aiter)'' in the for loop that processes the
+ ub_p_a_pairs. Evil cut and paste!
+
+2011-10-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (greedy_k): New keyword symbol variable.
+ (match_line): Greedy skip implemented.
+ (match_files): Likewise.
+ (match_init): New keyword symbol variable initialized.
+
+ * txr.1: Updated.
+
+2011-10-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (eol_s): New symbol variable.
+ (obj_init): New variable initialized.
+
+ * lib.h (eol_s): Declared.
+
+ * match.c (match_line): Implemented horizontal skip as and
+ new eol directive.
+ (match_lines): Vertical skip defers to horizontal skip if
+ there is trailing material.
+
+ * txr.1: Updated.
+
+2011-10-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (flatten_helper): Function removed.
+ (flatten): Recurse directly, using func_n1.
+
+2011-10-07 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: fxed wrong word.
+
+2011-10-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Extending syntax to allow for @VAR and @(...) forms inside
+ nested lists. This is in anticipation of future features.
+
+ * lib.c (expr_s): New symbol variable.
+ (obj_init): expr_s initialized.
+
+ * lib.h (expr_s): Declared.
+
+ * match.c (dest_bind): Now takes linenum. Tests for the meta-syntax
+ denoted by the system symbols var_s and expr_s, and throws an
+ error.
+ (eval_form): Similar error checks added. Also, hack: do not add
+ file and line number to an exception which begins with a '('
+ character; just re-throw it. This suppresses duplicate line
+ number addition when this throw occurs across some nestings.
+ (match_files): Updated calls to dest_bind.
+
+ * parser.l (yybadtoken): Handle new token kind, METAVAR and METAPAR.
+ (grammar): Refactoring among patterns: TOK broken into
+ SYM and NUM, NTOK introduced, unused NUM_END removed.
+ Rule for @( producing METAPAR in nested state.
+
+ * parser.y (METAVAR, METAPAR): New tokens.
+ (meta_expr): New nonterminal.
+ (expr): meta_expr and META_VAR productions handled.
+
+2011-10-06 Kaz Kylheku <kaz@kylheku.com>
+
+ Renaming the currying combinators according to new scheme.
+
+ * lib.c (bind2): Function renamed to curry_12_2.
+ (bind2other): Function renamed to curry_12_1.
+ (do_bind_2, do_bind2other): Helpers renamed likewise.
+ (tree_find): Follows rename of bind2.
+
+ * match.c (match_files): deffilter code follows bind2 rename
+ to curry_12_2.
+
+2011-10-06 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (funcall3, curry_123_2): New functions.
+ (do_curry_123_2): New static function.
+
+ * lib.h (funcall3, curry_123_2): Declared.
+
+ * match.c (subst_vars): Bugfix: throw error on unbound variable instead
+ of ignoring the situation. This bug caused unbound variables in
+ quasiliterals to be silently ignored.
+ (eval_form): Function changed to three argument form, so that
+ it takes a line number for reporting errors. Restructured to catch
+ the new unbound variable exception from subst_vars, and re-throw
+ it with a line number. Also, throws exception now instead of returning
+ nil if itself it detets an unbound variable. Uses of eval_form
+ no longer have to test the return value for nil, but just assume
+ it worked.
+ (match_lines): Currying calls to eval form updated to use
+ curry_123_2. Test of eval return value eliminated. In function
+ calls, eval isn't used for reducing symbol arguments to values,
+ because it now throws in the unbound case, and it's not worth
+ setting up a catch for this. Instead, assoc is used directly.
+
+2011-10-05 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_files): In function calls, the deletion of
+ the unbound variable from the argument list can be done
+ with a destructive operation since that list is a copy.
+
+2011-10-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * LICENSE, Makefile, configure, filter.c, filter.h, gc.c, gc.h, hash.c,
+ hash.h, lib.c, lib.h, match.c, match.h, parser.h, parser.l, parser.y,
+ regex.c, regex.h, stream.c, stream.h, txr.1, txr.c, txr.h, unwind.c,
+ unwind.h, utf8.c, utf8.h: Updated e-mail address.
+
+2011-10-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_line, match_files): Another correction to how bindings
+ are handled in collect/coll. New bindings from the main clause and
+ last clause must override old bindings. This is done by some
+ additional set difference operations based on symbol identity.
+ Otherwise it is possible to end up with multiple bindings for the
+ same symbol, which is untidy. If the collect clause scrubs a variable
+ with forget and re-binds it, then combining that environment
+ with the previous bindings will create a duplicate.
+ Also, fixed a serious bug with the bindings from the last clause;
+ the append was wrongly put into the loop that processes the collected
+ lists.
+
+2011-10-04 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (acons): New function.
+ (set_diff): Optimize common case: list1 and list2
+ are the same, or list2 is substructure of list1.
+ Situations in which this won't be the case for variable bindings are
+ rare.
+
+ * lib.h (acons): Declared.
+
+ * match.c (match_line): Use acons rather than acons_new, when binding
+ variables that we know are new (the symbol is unbound).
+ When computing the set difference over bindings, use cons cell
+ equality, rather than symbol equality. Symbol equality is wrong
+ because a binding can be removed, and then a new binding can be
+ introduced using the same symbol. This must be treated as
+ a different binding.
+
+2011-10-04 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfixes to the semantics of binding environments, which
+ were broken in the face of deletions (local, forget).
+ For some stupid reason, I had written a destructive routine for
+ removing elements from an association list, and used it
+ as the basis for the local and forget directives.
+
+ * lib.c (eq_f, car_f): New variables.
+ (identity_tramp, equal_tramp): Obsolete functions removed.
+ (apply): Broken function disabled at run time.
+ (funcall, funcall1, funcall2): Throw meaningful error instead
+ of aborting.
+ (alist_remove_test): New static function.
+ (alist_remove, alist_remove1): Rewritten to be functional
+ rather than destructive.
+ (alist_nremove, alist_nremove1): Destructive functions,
+ using previous implementations of alist and alist_nremove.
+ (do_sort): Recurses directly rather than via sort. That was
+ probably why this helper was introduced!
+ (find, set_diff): New functions.
+ (obj_init): gc-protect new variables eq_f and car_f, and initialize
+ them. Initializations for equal_f and identity_f changed to
+ use equal and identity directly, without the obsolete wrappers.
+
+ * lib.h (eq_f, car_f, alist_nremove, alist_nremove1,
+ find, set_diff): Declared.
+
+ * match.c (match_line): Use set_diff to determine what bindings
+ are new, rather than ldiff and ldiff-like logic which break when
+ the new bindings do not share structure with the old.
+ (match_files): Likewise.
+
+2011-10-03 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Starte dodcumenting the forgotten merge directive.
+
+2011-10-03 Kaz Kylheku <kaz@kylheku.com>
+
+ Implemented new last clause for collect and coll.
+ Bugfix in cases inside coll: was not collecting bindings.
+ Bugfix for until inside coll: was not seeing bindings
+ from main clause.
+
+ * lib.c (ldiff): New function.
+
+ * lib.h (ldiff): Declared.
+
+ * match.c (match_line): Implemented last clause. Fixed cases
+ handling by moving misplaced termination check.
+ (match_files): Implemented last clause.
+
+ * parser.y (until_last): New nonterminal symbol.
+ (collect_clause): Refactored syntax to support until and last.
+ (elem): Likewise.
+
+ * txr.1: Updated.
+
+2011-10-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (rep_elem): Bugfix: forgotten o_elems_transform on
+ syntax tree of o_elems constituent, leading to problems with
+ consecutive variables in a @(rep).
+
+2011-10-02 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_line): Handle trailer_s directive.
+ (match_files): Remove check against trailer_s not having trailing
+ material. If it doesn't, it's a vertical directive processed here,
+ otherwise leave it alone so match_line processed it.
+
+2011-10-02 Kaz Kylheku <kaz@kylheku.com>
+
+ Compiles as C++ again.
+
+ * lib.h (cons_set): New macro.
+
+ * match.c (match_line, match_files): In collect clause handlers,
+ move variable declarations above goto, and initialize with
+ cons_set, instead of declaring and initializing with cons_bind.
+ This eliminates the stupid C++ error that goto skips a variable
+ initialization (which happens even when it can be trivially
+ proven that the has no next use at the goto site!)
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 038
+
+ New eof directive.
+
+ Fixes in skip directive to work very well with eof.
+
+ Consecutive variable matching semantics improved; concept of double
+ variable match introduced for unbound variable followed by
+ regex variable.
+
+ Directives collect and coll have keyword arguments for more control
+ over their behavior.
+
+ Parallel directives (all, some, none, ...) are available in
+ horizontal mode.
+
+ New choose directive for selecting one of numerous alternatives
+
+ GC bugfix in new filtering code.
+
+ The code has an issue compling with GNU C++ instead of C,
+ which is something that is supported by this project.
+ Not a release-blocking issue. Not easy to fix without
+ restructuring some code.
+
+ * txr.c (version): Bumped.
+
+ * txr.1: Bumped version and set date.
+
+ * configure (txr_ver): Bumped.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Maintaining C++ compiling (except for two issues that will
+ need another commit).
+
+ * filter.c: Include "gc.h" for prototype of protect.
+ (struct filter_pair): Use const wchar_t *, so we can assign
+ literals.
+ (html_hex_continue): Ditto.
+
+ * lib.c (and): Function renamed to andf, since and is a C++
+ operator.
+
+ * lib.h (and): Declaration renamed.
+
+ * match.c (match_files): Use of and updated to andf.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ HACKING: Clarified that --vg-debug is also needed to turn on on
+ the Valgrind support at run-time, in addition to building it in.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ New test case, covering some filtering from HTML/XML.
+
+ * Makefile: Defined TXR_ARGS for new test case.
+
+ * tests/008/students.expected: New file.
+ * tests/008/students.txr: New file.
+ * tests/008/students.xml: New file.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * filter.c (filters, filter_init): Serious gc bug fixed: neglected to
+ inform the garbage collector about the filters global variable.
+ Ouch!
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ New test case under tests/008.
+
+ * Makefile: Made previous TXR_ARGS for 008 specific
+ to tokenizing test case, and introduced separate TXR_ARGS
+ for this test case.
+
+ * tests/008/configfile: New file.
+
+ * tests/008/configfile.expected: New file.
+
+ * tests/008/configfile.txr: New file.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Tokenizing test case, exercising for @(coll :gap 0)
+ and horizontal @(choose :shortest ...).
+
+ * Makefile: Defined TXR_ARGS for tests/008 directory.
+
+ * tests/008/data: New file.
+ * tests/008/tokenize.expected: New file.
+ * tests/008/tokenize.txr: New file.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ New test case, covering exception handling across nested
+ function invocations.
+
+ * Makefile (TEST): Test targets marked as .PHONY, because they are.
+
+ * tests/007/except-1.expected: New file.
+ * tests/007/except-1.txr: New file.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y (all_clause, some_clause, none_clause, maybe_clause,
+ cases_clause, choose_clause, elem): Regression bug fix: bad list calls
+ in parser, lacking nao terminator.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ Regression bug fix: longest match variables broken by
+ 2011-09-28 commit which introduced the double var match.
+
+ * match.c (match_line): Handle case where modifier is t.
+
+ * parser.y (var_op): Produce modifir as (t) rather than t.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Documented choose and horizontal mode for paralle
+ constructs.
+
+2011-10-01 Kaz Kylheku <kaz@kylheku.com>
+
+ New directive: choose.
+
+ * match.c (choose_s, longest_k, shortest_k): New variables.
+ (match_line, match_files): Introduced choose directive.
+ (match_init): Initialize new variables.
+
+ * match.h (choose_s): Declared.
+
+ * parser.l (yybadtoken): Handle CHOOSE.
+ (CHOOSE): Clause added for returning this token.
+
+ * parser.y: Added #include "match.h".
+ (CHOOSE): New token symbol.
+ (choose_clause): New nonterminal symbol.
+ (clause): choose_clause added.
+ (all_clause, some_clause, none_clause, maybe_clause,
+ cases_clause): Abstract syntax tree tweaked.
+ (choose_clause): New syntax.
+ (elem): Abstract syntax trees tweaked for many clauses.
+ New CHOOSE clauses.
+ (out_clause): New error case for choose_clause.
+
+2011-09-30 Kaz Kylheku <kaz@kylheku.com>
+
+ * HACKING: Updated with debugging hints.
+
+2011-09-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * txr.1: Clarified consecutive variables and documented double
+ variable match.
+
+2011-09-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.l: Implemented backslash continuations in SPECIAL
+ state, regexes and string literals.
+
+ * txr.1: Documented.
+
+2011-09-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_line): Implemented horizontal all, some,
+ none, maybe and cases directives.
+ (match_files): Recognize horizontal version of these directives
+ by the presence of the extra symbol t and do not process.
+ Also, bugfix in the all directive: not resetting the
+ all_match flag when short circuiting out.
+ * parser.y (clause_parts_h, additional_parts_h): New nonterminals.
+ (elem): New clauses added.
+
+2011-09-29 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (chars_k): New variable.
+ (match_line): Keyword arguments in coll implemented.
+ (match_init): chars_k variable initialized.
+
+ * parser.l (COLL): Lexical syntax changed to allow for
+ argument material.
+
+ * parser.y (elem): Coll syntax rewritten for arguments.
+
+ * txr.1: Updated.
+
+2011-09-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (mingap_k, maxgap_k, gap_k, times_k, lines_k): New
+ symbol variables.
+ (match_lines): Keyword arguments in collect implemented.
+ (match_init): New function.
+
+ * match.h (match_init): Declared.
+
+ * parser.l (COLLECT): Lexical syntax changed for COLLECT to
+ allow for argument material.
+
+ * parser.y (%union): obj renamed to val.
+ (exprs_opt): New nonterminal.
+ (collect_clause): Rewritten for arguments.
+
+ * txr.c (main): Call to match_init introduced.
+
+2011-09-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_line): Bugfix in double var. Do not
+ prepend the next_pat to the specline if it is nil.
+
+2011-09-28 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_line): Logic restructured to allow for
+ regex variables which also have nested variables.
+ Previously this code was assuming that the cases were
+ mutually exclusive, and the parser happened to work that way.
+ Also, added support for a "double var" match which occurs
+ when an unbound variable is followed by a regex variable.
+ This case should be allowed because it makes sense.
+ It's similar to a variable followed by a regex, except
+ that the regex is also a variable binding.
+
+ * parser.y (o_elems_transform): New function.
+ (o_elems_opt, o_elems_opt2, quasilit): Transform o_elems with new
+ function. This is needed because subst_vars doesn't
+ deal with the nested var syntax for consecutive variables.
+ (var): New syntax case '{' IDENT exprs '}' elem. This
+ allows consecutive variables to be nested in all cases.
+
+2011-09-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y ('{', '}'): Nope, still not right.
+ These must have exactly the same precedence as
+ IDENT for this to work right, of course.
+
+2011-09-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * parser.y ('{', '}'): Bugfix: precedence of these
+ terminals was causing @foo@foo to be parsed differently
+ from @foo@{foo}. We need consecutive variables to be
+ specially folded in the syntax under a single var_s
+ node.
+
+2011-09-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_files): One more fix to this, argh.
+ The test for !data should be done after matching,
+ before incrementing to the next line. Then it is a true
+ bottom of the loop test. This commit allows
+ @(skip)
+ @first_line
+ @(skip nil 3)
+ @(eof)
+ to correctly match the first line of the input, not
+ the fourth one from the bottom, since the
+ second skip has an unbounded range.
+
+2011-09-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_files): Another bugfix to skip.
+ If a hard skip tries to go beyond EOF, then the query
+ must fail. However, a skip to exactly EOF is fine.
+ I.e. data can hit nil at the same time as the right
+ number of skip iterations is performed.
+
+2011-09-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_files): Bugfix in skip directive.
+ We should try the match at least once even if there is no data
+ after a hard skip, so that the query has an opportunity
+ to do an explicit match for no data, as with @(endp).
+ This commit makes possible queries like:
+ @fourth_line_from_bottom
+ @(skip 1 3)
+ @(eof)
+ This query depends on @(skip 1 3) not failing when
+ it runs out of data, because @(eof) checks for htis.
+
+2011-09-27 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (eof_s): New symbol variable.
+ (obj_init): New variable initialized.
+
+ * lib.h (eof_s): Declared.
+
+ * match.c (match_files): New @(eof) directive explicitly
+ matches end of data.
+
+ * txr.1: Updated.
+
+2011-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 037
+
+ Short-circuiting behavior for @(all) and @(none).
+
+ Obsolete forms of @(next) and @(output) syntax are gone.
+
+ New filtering feature for substitutions in output. Filtering to and
+ from HTML built in, plus user-defined filtering with deffilter.
+
+ Bugfixes: wrong error message in throw; lack of support for escaping
+ backslashes in literals and regexes.
+
+ * txr.c (version): Bumped to 037.
+
+ * txr.1: Set version to 037 and bumped date.
+
+ * configure: Bumped txr_ver to 037.
+
+2011-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Support &#NNNN; decimal escapes also.
+
+ * filter.c (html_hex_continue): Bail with nil if no digits
+ are collected. The &#x; syntax is not translated to anything.
+ (html_dec_continue): New function.
+ (html_hex_handler): Function renamed to html_numeric_handler.
+ (filter_init): Change function-based trie node over to
+ html_numeric_handler.
+
+2011-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Support &#xNNNN; hex escapes in html. Bugfix in field formatting.
+ chr function inlined.
+
+ * filter.c (trie_value_at, trie_lookup_feed_char): Handle function
+ case.
+ (build_filter): New parameter, compress_p.
+ (html_hex_continue, html_hex_handler): New functions.
+ (filter_init): Add a function-based node to the from_html trie.
+
+ * lib.c (chr): Function removed.
+ (functionp) New function.
+
+ * lib.h (chr): Declaration replaced with inline function.
+ (functionp): Declared.
+
+ * match.c (format_field): Bugfix: failed to apply filter
+ that came in as an argument.
+
+2011-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Bugfixes: Consistent escaping in various literals. Double
+ backslash codes for single backslash. Output clause can be empty.
+
+ * parser.l (char_esc): Backslash handled.
+ Use internal_error rather than abort.
+ (REGCHAR, LITCHAR): Backslash added to lexical syntax.
+
+ * parser.y (output_clause): Allow empty output clause.
+
+2011-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ New feature: @(deffilter)
+
+ Bugfix in @(throw) when non-symbol is thrown: exception message
+ referred to the symbol throw rather than the erroneous object.
+
+ * filter.c (build_filter_from_list, register_filter): New functions.
+
+ * filter.h (register_filter): New function declared.
+
+ * lib.c (deffilter_s): New variable defined.
+ (chain): Function changed from single list argument to variable
+ argument list to reduce the complexity of use.
+ (do_and, and): New functions.
+ (obj_init): deffilter_s initializatio added.
+
+ * lib.h (deffilter_s, and): New declarations.
+ (chain): Declaration updated to new function signature.
+ (eq): Changed from macro to inline function.
+
+ * match.c (do_output_line): Simplified expression involving chain.
+ (do_output): Likewise.
+ (match_files): Bugfix in error handling of throw.
+ Implementation of deffilter.
+
+ * txr.1: Documented deffilter.
+
+2011-09-26 Kaz Kylheku <kaz@kylheku.com>
+
+ Trie compression. Hash table iteration.
+ Bugfix in typeof.
+
+ * filter.c (trie_compress): New function.
+ (trie_value_at, trie_lookup_feed_char, filter_string): Handle cons cell
+ nodes in trie.
+ (build_filter): Call trie_compress.
+
+ * gc.c (cobj_destroy_op): Function renamed to cobj_destroy_stub_op
+ since it doesn't do anything.
+ (cobj_destroy_free_op): New function.
+ * hash.c (struct hash_iter): New type.
+ (hash_destroy): Function removed.
+ (hash_ops): Reference to hash_destroy replaced with
+ cobj_destroy_free_op.
+ (hash_count, hash_iter_mark, hash_begin, hash_next): New functions.
+ (hash_iter_ops): New static structure.
+ * hash.h (hash_count, hash_begin, hash_next): New functions declared.
+ * lib.c (hash_iter_s): New symbol variable.
+ (typeof): Bugfix: TAG_LIT type tag not handled.
+ (vecref): New function.
+ (obj_init): Initialize hash_iter_s.
+ * lib.h (cobj_destroy_op): Declaration renamed.
+ (cobj_destroy_free_op, vecref): New functions declared.
+ (hash_iter_s): New variable declared.
+ * stream.c (string_in_ops, byte_in_ops): cobj_destroy_op
+ renamed to cobj_destroy_stub_op.
+
+2011-09-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Filtering from HTML implemented.
+
+ * filter.c (from_html_k): New variable.
+ (to_html_table): New static array.
+ (filter_init): Intern new symbol. Instantiate new filter
+ and store in filters hash.
+
+2011-09-25 Kaz Kylheku <kaz@kylheku.com>
+
+ Filtering feature for variable substitution in output.
+
+ * filter.c, filter.h: New files.
+
+ * Makefile (OBJS): filter.o added.
+
+ * gc.c (mark_obj): Mark new alloc field of string objets.
+
+ * hash.c (struct hash): New member, userdata.
+ (hash_mark): Mark new userdata member of hash.
+ (make_hash): Initialize userdata.
+ (get_hash_userdata, set_hash_userdata, hashp): New functions.
+
+ * hash.h (get_hash_userdata, set_hash_userdata, hashp): New functions
+ declared.
+
+ * lib.c (getplist, string_extend, cobjp): New functions.
+ (string_own, string, string_utf8): Initialize new alloc field to nil.
+ (mkstring, mkustring): Initialize new alloc field to actual size.
+ (length_str): When length is computed and cached, also compute
+ and cache alloc.
+ (init): Call filter_init.
+
+ * lib.h (string string): New member, alloc.
+ (num_fast): Macro converted to inline function.
+ (getplist, string_extend, cobjp): New functions declared.
+
+ * match.c (match_line): Follows change of modifier s-exp syntax.
+ (format_field): New parameter, filter.
+ New modifier syntax parsed. Filter retrieved, and applied.
+ (subst_vars): New parameter, filter. Filter is either applied
+ in this function or passed to format_field, as needed.
+ (eval_form): Pass nil to new parameter of subst_vars.
+ (do_output_line): New parameter, filter. Passed down to subst_vars.
+ (do_output): New parameter, filter. Passed down to do_output_line.
+ (match_files): Pass nil filter to subst_vars in cat directive.
+ Output directive refactored to parse keywords, extract the
+ filter and pass down to do_output.
+
+ * parser.y (regex): Generate (sys:regex regex syntax ...)
+ instead of (regex syntax ...).
+ (elem, expr): Updated w.r.t. regex syntax change.
+ (var): Cases '{' IDENT regex '}' and '{' IDENT NUMBER '}'
+ are removed. new syntax '{' IDENT exprs '}' to handle these
+ more generally and allow for keywords.
+
+ * txr.1: Updated.
+
+2011-09-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Numeric constants become real constants.
+
+ Vector code cleanup.
+
+ * lib.h (zero, one, two, negone, maxint, minint): Extern declarations
+ removed, macros introduced for these identifiers.
+
+ * lib.c (zero, one, two, negone, maxint, minint): File scope
+ definitions removed.
+ (vector): Use vec_alloc and vec_fill enums instead of constants.
+ (obj_init): Remove references to removed definitions.
+
+2011-09-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * LICENSE, Makefile, configure, gc.c, gc.h, hash.c, hash.h, lib.c,
+ lib.h, match.c, match.h, parser.h, parser.l, parser.y, regex.c,
+ regex.h, stream.c, stream.h, txr.1, txr.c, txr.h, unwind.c, unwind.h,
+ utf8.c, utf8.h: Updated copyright year.
+
+2011-09-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c, parser.y: Support for old output syntax removed.
+ Leading :nothrow with trailing material is an error now.
+
+ * txr.1: Updated. Made note of errors in pipes being asynchronous.
+
+2011-09-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * tests/002/query-1.txr: Old next syntax rewritten to new.
+
+2011-09-23 Kaz Kylheku <kaz@kylheku.com>
+
+ * match.c (match_files): Some cleanup in preparation of new
+ features. Support for obsolescent @(next) syntax is gone.
+
+2011-09-23 Kaz Kylheku <kaz@kylheku.com>
+
+ Semantics tweak: short circuiting behavior for @(all) and @(none).
+
+ * match.c (match_files): Added a couple of break statements.
+
+ * txr.1: Updated.
+
+2011-09-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Version 036
+
+ Extension to @(skip).
+
+ * txr.c (version): Bumped to 036.
+
+ * txr.1: Set version to 036.
+
+ * configure: Bumped txr_ver to 036.
+
+2011-09-22 Kaz Kylheku <kaz@kylheku.com>
+
+ Useful second argument in skip directive for skipping
+ a minimum number of lines.
+
+ * match.c (match_files): New behavior in skip_s case.
+
+ * txr.1: Documented.
+
+2010-10-05 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 035
+
+ Fixes garbage-collection-related problem affecting @(freeform)
+ that was revealed by "make tests" on x86-64 system, gcc 4.3.2.
+
+ Fixes show-stopper stupidity, again: a query that matches
+ the end of data terminates successfully rather than failing. This
+ is because version 032 did not properly address the breakage
+ introduced in the 2010-01-21 change to match.c involving the dataline
+ variable. The "fix" only prevented the program from aborting in that
+ situation.
+
+ * txr.c (version): Bumped to 035.
+
+ * txr.1: Set version to 035.
+
+ * configure: Bumped txr_ver to 035.
+
+2010-10-04 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_files): Bugfix. A (sub)query that runs out of data
+ lines to match must fail. Extra data lines relative to the spec
+ are tolerated; extra spec lines unmet by data aren't.
+
+2010-10-03 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.h (lazy_string): Fix incorrect comment.
+
+ * lib.c (split_str, split_str_set): It is necessary to protect input
+ parameters against GC, because we cache their internal pointers,
+ after which we no longer refer to the objects themselves. Moreover,
+ we perform object allocation, and then keep using the internal
+ pointers.
+
+2010-09-30 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Fix formatting problem.
+
+2010-03-01 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Fix inaccuracies: files are not read into memory all at
+ once, and a query doesn't execute if it had errors.
+
+2010-02-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 034
+
+ Patched up broken @(freeform) directive.
+
+ * txr.c (version): Bumped to 034.
+
+ * txr.1: Set version to 034.
+
+ * configure: Bumped txr_ver to 034.
+
+2010-02-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ New testcases for freeform.
+
+ * tests/006/data: New UTF-8 file.
+
+ * tests/006/freeform-1.txr: Likewise.
+
+ * tests/006/freeform-1.expected: Likewise.
+
+ * tests/006/freeform-2.txr: Likewise.
+
+ * tests/006/freeform-2.expected: Likewise.
+
+ * Makefile (TXR_ARGS): New target-specific assignment to set
+ data for test case set 006.
+
+2010-02-27 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (length_str_gt, length_str_ge, length_str_lt, length_str_le):
+ Added missing support for literal string type.
+
+2010-02-27 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (search_str): Bugfix for empty haystack case: checks for end
+ of string must use postincrement on the index, otherwise the access
+ goes past the null terminator.
+
+2010-02-27 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_lines): Bugfix in freeform directive.
+ If the virtual line is partially matched, the remainder of
+ the line is folded back into list form. In this case, the
+ data line number must be incremented. Otherwise the calling
+ context may conclude that no progress was made, and
+ skip a line of input. I.e. the unmatched part of the input
+ is a new line, even if there had originally
+ been no line break at that point.
+
+2010-02-27 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.h (split_str_sep): Declared.
+
+ * lib.c (split_str_sep): New function.
+ (split_str): Semantics changed; the second argument
+ is not a set of separator characters (like in split_str_sep)
+ but rather a separator string. Fixed bug: if the input
+ string is empty, the output list is empty. This caused
+ infinite looping behavior in @(freeform).
+
+2010-02-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (init_str): Bugfix: copy only len characters, not len + 1, so
+ that we don't clobber the null terminator in the target string, or try
+ read past the end of the source data. This affects the @(freeform)
+ directive.
+
+2010-01-26 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 033
+
+ Addressed exponential memory behaviors
+ in derivative-based regex matching.
+
+ * txr.c (version): Bumped to 033.
+
+ * txr.1: Set version to 033.
+
+ * configure: Bumped txr_ver to 033.
+
+2010-01-26 Kaz Kylheku <kkylheku@gmail.com>
+
+ hash.c (hash_process_weak): There is no point in fixing up
+ the type codes of spuriously reached nodes; reached objects
+ will not be removed by weak processing and so it's better
+ to just detect those situations and short-circuit.
+
+2010-01-26 Kaz Kylheku <kkylheku@gmail.com>
+
+ Optimization in derivative-based regex engine.
+ Exponential memory consumption behavior was observed when
+ matching the input aaaaaa....
+ against the regex a?a?a?a?....aaaa....
+ The fix is to eliminate common subexpressions
+ from the derivative for the or operator.
+
+ * lib.c (memqual, mapcon): New functions
+
+ * lib.h (memqual, mapcon): Declared.
+
+ * regex.c (flatten_or, unflatten_or,
+ unique_first, reduce_or): New functions.
+ (reg_derivative): Apply reduce_or
+ to the constructed disjunction.
+
+2010-01-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fixing weak hash tables.
+
+ * gc.c, gc.h (REACHABLE, FREE): Moved to header.
+
+ * hash.c (hash_mark): Fix broken list push code.
+ (has_process_weak): Defend against conservative
+ garbage collector. We cannot trust that the
+ conses which make up the chain backbone
+ and hash entry pairs are unmarked, because the
+ hash vectors might be reached through
+ spurious references.
+
+2010-01-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 032
+
+ Fix showstopper stupidity.
+
+ * match.c (match_files): Fix incorrect change involving dataline
+ variable made on 2010-01-21; failure to check for end of data.
+
+ * txr.c (version): Bumped to 032.
+
+ * txr.1: Set version to 032.
+
+ * configure: Bumped txr_ver to 032.
+
+2010-01-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 031
+
+ Addresses some spurious object retention problems related to the GC's
+ conservative scan of the stack.
+
+ * txr.c (version): Bumped to 031.
+
+ * txr.1: Set version to 031.
+
+ * configure: Bumped txr_ver to 031.
+
+2010-01-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_files): Workaround for GC issue
+ discovered on Red Hat EL 4 with gcc 3.4.3.
+ In the collect loop, set car(success) to nil.
+ Somehow the generated code hangs on to the last
+ matching position for a regex, preventing GC.
+
+2010-01-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ * stream.c (vformat_num): Fix bad width calculation.
+
+2010-01-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fix for unbounded memory growth problem reproduced with GCC 4.4.1
+ on 32 bit x86 Fedora. This happens because the lazy list variable
+ ``data'' in the match_files function is optimized to a register,
+ but a stale value of that variable persists in the backing storage.
+
+ * gc.h (gc_hint): New macro.
+ (gc_hint_func): Declared.
+
+ * gc.c (gc_hint_func): New function.
+
+ * match.c (match_files): Use gc_hint on the data lazy list.
+
+2010-01-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_files): Reduce scope, and bogus use of, dataline
+ variable.
+
+2010-01-19 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 030
+
+ Fixed grammar conflicts.
+
+ R1~R2 syntax supported in regexes.
+
+ * txr.c (version): Bumped to 030.
+
+ * txr.1: Set version to 030.
+
+ * configure: Bumped txr_ver to 030.
+
+2010-01-19 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.y (regex): Getting rid of empty '/' '/' production
+ again.
+ (regexpr): Re-introducing empty production; this time using
+ %prec LOW trick to give this interpretation the lowest
+ possible precedence. Thus expressions like /&/ work again.
+ (regbranch): New production to allow R1~R2 to be valid.
+
+ * txr.1: Documented.
+
+2010-01-19 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.l (grammar): The ^ character is no longer considered
+ a special regex token, just a regular character.
+
+ * parser.y (LOW): New phony terminal symbol, used as place holder
+ for lowest precedence.
+ (grammar): Fixed numerous conflicts in regex section by refactoring.
+ The regex nonterminal no longer has an empty derivation.
+ A regex character class no longer has an empty derivation; this is
+ handled by special rules. Ambiguity around ^ is resolved; this is
+ parsed as a regular character and specially recognized.
+ Ambiguity between catenation of terms and postfix operators
+ resolved in favor of shift by giving catenation low
+ precedence using %prec LOW.
+
+2010-01-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 029
+
+ Performance optimizations of derivative-based regexes.
+
+ New syntax: [] and [^].
+
+ Saner semantics for % operator.
+
+ * txr.c (version): Bumped to 029.
+
+ * txr.1: Set version to 029.
+
+ * configure: Bumped txr_ver to 029.
+
+2010-01-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ * regex.c (reg_derivative_list, reg_derivative): Recognition
+ of cases to reduce consing. In reg_derivative_list, we avoid
+ consing the full or expression if either branch is t, and
+ also save a cons when the first element has a null derivative.
+ In reg_derivative the oneplus and zeroplus cases are split,
+ since zeroplus can re-use the input expression, when it's
+ just a one-character match, deriving nil.
+
+2010-01-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ Adjust semantics of non-greedy operator R%S, to avoid the broken
+ case whereby R%S matches nothing at all when S is not empty
+ but equivalent to empty, or more generally when S is nullable.
+ A much nicer definition is ``the intersection of R* and
+ the set of all strings that do not contain a non-empty substring
+ that matches S, followed by S''.
+
+ * regex.c (dv_compile_regex): Adjust syntactic sugar for the %
+ operator, taking advantage of the reg_nullable function to keep the
+ simpler syntactic sugar for cases where S is not nullable.
+
+ * txr.1: Document accordingly.
+
+2010-01-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.y (regterm, regclass): Relocate handling
+ of empty [] into regterm, via empty derivation.
+
+2010-01-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ Regex syntactic tweaks: support the [] syntax
+ to match no character and [^] as its complement,
+ being synonymous with the wildcard dot.
+
+ * parser.y (regterm): Added new productions.
+
+ * txr.1: Documented.
+
+2010-01-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 028.
+
+ Code cleanup.
+
+ New additional regex implementation using regex derivatives,
+ providing new operators: regex complement, intersection,
+ non-greedy match.
+
+ Regex syntax bugfixes.
+
+ * txr.c (version): Bumped to 028.
+
+ * txr.1: Bumped version to 028.
+
+ * configure: Bumped txr_ver to 028.
+
+ * match.c (dest_bind): Remove spurious syntax.
+
+2010-01-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Get rid of parens from regex operator descriptions.
+ Correct wrong text: all operators can take an empty regex.
+ Clarify escaping rules within a character class.
+ Describe Kleene and non-greedy behavior more accurately.
+
+2010-01-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * genman.txr, txr.1: Encode version differently; extract
+ from text during HTML conversion.
+
+2010-01-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ Automate the maintenance of the HTML-ized man page.
+
+ * Makefile (txr-manpage.html): New target, generated from txr.1
+ man page.
+
+ * genman.txr: New txr query to transform the output of man2html.
+
+2010-01-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ Implemented non-greedy operator.
+
+ * lib.c (nongreedy_s): New symbol globals.
+ (obj_init): New symbol interned.
+
+ * lib.h (nongreedy_s): Declared.
+
+ * parser.l (grammar): Support % as a regex operator.
+
+ * parser.y (grammar): Define '%' nonterminal,
+ on th esame precedence level as '*'.
+ (regterm): Add the % expression as a term.
+ (regchar): Recognize % as ordinary character in a character
+ class. Also, bugfix: recognize & and ~ similarly.
+
+ * regex.c (dv_compile_regex): Implement % as a syntactic sugar
+ via an algebraic transformation to a more complex expression.
+ (regex_requires_dv): A regex containing the % operator requires
+ derivatives.
+
+ * txr.1: Documented %; moved exotic regex notes to end of document.
+
+2010-01-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * regex.c (reg_derivative_list): Bugfix: wrong algebra,
+ taking a double derivative of the first item.
+
+2010-01-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Fix accidental edit garbage.
+
+2010-01-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Fix accidental .b, which should have been .B.
+ Revised description of regex operators. Added section
+ on intersection and complement, which may not be familiar
+ to regex users.
+
+2010-01-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ * regex.c (reg_derivative): Bugfix: remove invalid
+ algebraic reductions in the derivative for the or operator.
+
+2010-01-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ Bugfix: allow unescaped / to be used in regex character classes.
+
+ To do this, we no longer make the lexer look for the terminating
+ slash which ends the regex syntax. This is driven by the parser,
+ which calls a special function in the lexer to indicate that
+ the regex parsing is done.
+
+ * parser.h (end_of_regex): New function declared.
+
+ * parser.l (REGCLASS): Unused start condition removed.
+ (grammar): A slash character in the REGEX start condition is now simply
+ returned as an operator token; no popping of the state stack takes
+ place. The scanner stays in REGEX mode.
+ (end_of_regex): New function.
+
+ * parser.y (regex): Call end_of_regex when a regex is successfully
+ scanned through to terminating slash, or if a syntax error occurs.
+ (regchar): Can derive a / terminal now, thus including it in a
+ regex character class.
+
+2010-01-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.y (precedence): bugfix: character classes like this [^*]
+ being treated as a non-complemented set of two characters.
+
+2010-01-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ Dynamically determine which regex implementation to use:
+ NFA or derivatives. The default behavior is NFA, with
+ derivatives used if the regular expression contains
+ uses of complement or intersection. The --dv-regex
+ option forces derivatives always.
+
+ * regex.c (opt_derivative_regex): Default value is 0 now.
+ (regex_requires_dv): New function.
+ (regex_compile): If regex_requires_dv function reports
+ true, or if the opt_derivative_regex flag is true,
+ treat the regex with the derivative-based implementation.
+
+ * txr.c (txr_main): Implemented --dv-regex option
+ to set the opt_derivative_regex flag.
+
+2010-01-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.h (c_num): Remove redundant declaration.
+
+2010-01-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ Impelement derivative-based regular expressions.
+
+ * lib.c (chset_s, compiled_regex_s): New symbol globals.
+ (obj_init): New symbols interned.
+
+ * lib.h (chest_s, compiled_regex_s): Declared.
+
+ * match.c (match_line, match_files): Use regexp predicate
+ function instead of typeof for detecting regex.
+
+ * parser.y (regexpr, regbranch, regterm): Minor syntactic refactoring.
+
+ * regex.h (union nfa_state, nfa_state_t, struct nfa, enum nfam_result,
+ nfa_machine_t, nfa_compile_regex, nfa_free, nfa_run,
+ nfa_machine_reset, nfa_machine_init, nfa_machine_cleanup,
+ nfa_machine_feed, nfa_machine_match_span, regex_nfa): Declarations
+ for internal material removed from header, some moved into regex.c.
+
+ * regex.c: Includes txr.h now to get declaration of new option global.
+ (union nfa_state, nfa_state_t, struct nfa,
+ nfa_compile_regex, nfa_free, nfa_run, regex_nfa): Declarations
+ moved from regex.h.
+ (enum nfam_result, nfa_machine_reset, nfa_machine_init,
+ nfa_machine_cleanup, nfa_machine_feed, nfa_machine_match_span):
+ Renamed from nfam_* and nfa_machine_* to regm_* and regex_machine_*.
+ Functions made static. Regex machine is now polymorphic: the
+ machine is instantiated based on whether the regex is NFA or
+ derivative type, and the behavior of the functions is type dependent.
+ (nfa_machine_t): Renamed to regex_machine_t, now typedef name for union
+ regex_machine.
+ (struct dv_machine, union regex_machine): New types.
+ (struct nfa_machine): New member is_nfa. A few members rearranged,
+ so that union common members are at the start of the structure.
+ (opt_derivative_regex): New global added.
+ (char_set_compile, char_set_cobj_destroy): New function.
+ (char_set_cobj_ops): New static structure.
+ (nfa_compile_set): Refactored to use char_set_compile; made static.
+ (nfa_compile_list): New function.
+ (nfa_compile_regex): Refactored to follow new syntax from parser.y;
+ made static.
+ (nfa_free, nfa_run, regex_nfa): Made static.
+ (dv_compile_regex, reg_nullable_list, reg_nullable,
+ reg_derivative_list, reg_derivative, dv_run): New functions.
+ (regex_compile): Can compile either kind of regex now.
+ (search_regex, match_regex): Decoupled from dependency on NFA
+ implementation.
+
+ * txr.h (opt_derivative_regex): Declared.
+
+ * dep.mk: Regenerated.
+
+2010-01-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Remove incorrect implementation of extended
+ regex operations (complement, intersection).
+ The syntax extensions documentation are retained.
+
+ * regex.c (struct any_char_set, struct small_char_set, struct
+ displaced_char_set): refs field removed.
+ (nfa_kind_t): Removed enum members nfa_super_accept,
+ nfa_reject, nfa_compl_empty, nfa_compl_wild,
+ nfa_compl_single, nfa_compl_set.
+ (nfa_super_accept_state, nfa_is_accept_state): Removed.
+ (char_set_create, char_set_destroy): Reverted.
+ (char_set_clone): Removed.
+ (nfa_state_empty_convert, nfa_state_merge): Reverted.
+ (nfa_compl_state, nfa_compl): Removed.
+ (nfa_compile_regex, nfa_all_states, nfa_closure, nfa_move): Reverted.
+
+2010-01-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Some fine tuning in regex grammar.
+
+ * parser.y (regex): Empty regex handled by
+ allowing regex to generate empty, rather than
+ a special case production for '/' '/'. Thus
+ empty subexpressions are possible.
+ (regbranch, regterm): Complement is handled
+ in regbranch, so that it has lower precedence
+ than aggregation.
+
+2010-01-05 Kaz Kylheku <kkylheku@gmail.com>
+
+ Implemented the regular expression ~ and & operators.
+ This turns out to be easy to do in NFA land.
+ The complement of an NFA has exactly the same number
+ and configuration of states and transitions, except
+ that the states have an inverted meaning; and furthermore,
+ failed character transitions are routed to an extra
+ state (which in this impelmentation is permanently
+ allocated and shared by all regexes). The regex &
+ is implemented trivially using DeMorgan's.
+
+ Also, bugfix: regular expressions like A|B|C are allowed
+ now by the syntax, rather than constituting syntax error.
+ Previously, this would have been entered as (A|B)|C.
+
+ * lib.c (comp_s, and_s): New symbol globals.
+ (obj_init): New symbols interned.
+
+ * lib.h (comp_s, and_s): Declared.
+
+ * parser.l (grammar): Provide new ~ and & tokens in REGEX state.
+
+ * parser.y (regexpr): Constituents of '|' are regexprs,
+ rather than regbranches (see bugfix note above).
+ The '&' operator is added.
+ (regterm): The '~' operator is added.
+
+ * regex.c (struct any_char_set, struct small_char_set, struct
+ displaced_char_set): refs field added.
+ (nfa_kind_t): New enum members nfa_super_accept,
+ nfa_reject, nfa_compl_empty, nfa_compl_wild,
+ nfa_compl_single, nfa_compl_set.
+ (nfa_super_accept_state): New static structure.
+ (nfa_is_accept_state): New inline function.
+ (char_set_create): Initialize reference count to 1.
+ (char_set_destroy): Decrement refcount, free if zero.
+ (char_set_clone): New function.
+ (nfa_state_empty_convert, nfa_state_merge): Handle nfa_reject state,
+ the complement of nfa_accept.
+ (nfa_compl_state, nfa_compl): New functions.
+ (nfa_compile_regex): Handle new operators.
+ (nfa_all_states, nfa_closure): Handle new state types.
+ (nfa_move): Handle new types according to special rules:
+ the new complemented states that have character transitions have a next
+ move to the super-accept state if they do not match the input
+ character.
+
+ * txr.1: Documented new regex operators.
+
+2009-12-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (make_package, find_package): Eliminate declaration
+ in the middle of statement block.
+
+ * lib.h (TAG_MASK): Becomes type cnum rather than long.
+ (nao): Based off 1 rather than -1 to avoid left shift of
+ negative number.
+
+2009-12-09 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.l (YYINPUT): Fix signed/unsigned comparison.
+
+2009-12-09 Kaz Kylheku <kkylheku@gmail.com>
+
+ * hash.c (sethash): New function.
+
+ * hash.h (sethash): Declared.
+
+ * lib.c (cobj_handle): New function.
+
+ * lib.h (cobj_handle): Declared.
+
+2009-12-08 Kaz Kylheku <kkylheku@gmail.com>
+
+ All COBJ operations have default implementations now;
+ no null pointer check over struct cobj_ops operations.
+
+ New typechecking function for COBJ objects.
+
+ * gc.c (finalize): Assume function pointer destroy
+ is not null.
+ (cobj_destroy_op): New function.
+ (mark_obj): Assume function pointer mark is not null.
+ (cobj_mark_op): New function.
+
+ * hash.c (ll_hash): Assume function pointer hash
+ is not null.
+ (cobj_hash_op): New function.
+ (hash_equal): Function removed.
+ (hash_ops): Replaced hash_equal with cobj_equal_op.
+
+ * lib.c (class_check, cobj_equal_op): New functions.
+
+ * lib.h (cobj_equal_op, cobj_destroy_op, cobj_mark_op,
+ cobj_hash_op): Declarations added.
+ (system_package, user_package, class_check): Declaration added.
+
+ * regex.c (regex_equal): Function removed.
+ (regex_obj_ops): regex_equal replaced with cobj_equal_op.
+
+ * stream.c (common_equal): Function removed.
+ (stdio_ops, pipe_ops, string_in_ops, byte_in_ops,
+ string_out_ops, dir_ops): common_equal replaced
+ with cobj_equal_op, and all previously null
+ function pointers populated with default functions.
+
+2009-12-05 Kaz Kylheku <kkylheku@gmail.com>
+
+ More void * to mem_t * conversion.
+
+ * stream.c (stdio_put_char_callback, stdio_get_char_callback,
+ stdio_put_string, stdio_put_char, stdio_snarf_line, stdio_get_char):
+ Convert void * to mem_t *.
+
+ * utf8.c (utf8_encode, utf8_decode): Convert void * to mem_t *.
+
+ * utf8.h (utf8_encode, utf8_decode): Update declarations.
+
+2009-12-04 Kaz Kylheku <kkylheku@gmail.com>
+
+ Eliminate the void * disease. Generic pointers are of mem_t *
+ from now on, which is compatible with unsigned char *.
+ No implicit conversion to or from this type, in C or C++.
+
+ * hash.c (make_hash): Convert void * to mem_t *.
+
+ * lib.c (oom_realloc, chk_malloc, chk_realloc, vec_set_fill,
+ cobj, init): Convert to using mem_t *.
+
+ * lib.h (mem_t): New typedef.
+ (struct cobj): Convert void * to mem_t *.
+ (oom_realloc, chk_malloc, chk_realloc, init): Declarations updated.
+
+ * regex.c (regex_compile): Convert void * to mem_t *.
+
+ * stream.c (snarf_line, string_out_put_string, make_stdio_stream,
+ make_pipe_stream, make_string_input_stream,
+ make_string_byte_input_stream, make_string_output_stream,
+ get_string_from_stream): Convert void * to mem_t *.
+
+ * txr.c (oom_realloc_handler): Convert void * to mem_t *.
+
+2009-12-03 Kaz Kylheku <kkylheku@gmail.com>
+
+ * gc.c (heap_min_bound, heap_max_bound): New static globals.
+ (more): Update heap_min_bound and heap_max_bound.
+ (in_heap): Do early rejection tests on the pointer. If it's
+ not aligned, or it's completely outside of the bounding
+ box of the heap area, short circuit to false.
+
+2009-12-03 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 027.
+
+ Code cleanup.
+
+ gc-related bugfix.
+
+ Improved file copying semantics of make install,
+ and adherence for DESTDIR convention.
+
+ * txr.c (version): Bumped to 027.
+
+ * txr.1: Bumped version to 027.
+
+ * configure: Bumped txr_ver to 027.
+
+2009-12-03 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (CFLAGS): Better test for g++, when removing
+ warning options not appropriate for g++. Sometimes
+ g++ may be called something that dosn't end in g++,
+ like g++4.
+
+2009-12-03 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.l (YY_NO_UNPUT): Removed superfluous #define. This is not
+ needed because suppressing generation of unput is requested via
+ the %option. In scanners generated by the legacy version of
+ flex, 2.5.4, still widely in use. this redundancy leads to
+ a multiple #define YY_NO_UNPUT and a compiler warning.
+
+2009-12-03 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fix for failing test suite on MIPS machine, due to
+ gc failing to mark a local variable in txr_main.
+
+ * txr.c (txr_main): Changed from internal linkage to external.
+ This prevents gcc -O2 from inlining txr_main into main.
+ We need separate stack frames for main and txr_main,
+ in order to be sure that when walking to the bottom of
+ stack pointer, we visit all locals in main. This is the
+ whole reason why there is a separate txr_main.
+
+2009-12-02 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (tests): Don't depend on the executable. Otherwise,
+ during make install-tests, if it doesn't exist in the
+ install directory, a gcc compile command gets deposited
+ into the run.sh generated script.
+ (install-tests): Fixes to make this work when using
+ a separate build directory. Split the cpio -p job
+ into a cpio -i piping into cpio -o.
+
+2009-12-02 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (install-tests): New target. Provides a way to make the
+ test cases part of the installation, and a generated script to run the
+ commands on the installation host.
+
+2009-12-02 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fix annoyances with dependency generation, such as picking up local
+ files that are not in the project.
+
+ * Makefile (depend): Rule passes object file names as arguments
+ to depend.txr script.
+
+ * depend.txr: Changed to take names of object files from command line,
+ rather than scanning the directory for all .c files. Switched
+ to new style next directives, using quasiliterals.
+
+ * dep.mk: Regenerated.
+
+2009-11-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (CFLAGS): If the compiler matches the pattern %g++,
+ then remove some C-front-end-specific warnings from CFLAGS,
+ which the g++ front end will complain about.
+
+2009-11-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (CFLAGS): add -Dlint to CFLAGS when compiling y.tab.o.
+ This suppresses some warnings from a byacc-generated parser,
+ and gets rid of a useless static sccsid array. May help with
+ Bison-generated parser also.
+
+2009-11-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.l: Use flex options to suppress generation of the
+ unused functons yyunput and yyinput, thus getting rid of
+ some compiler diagnostics.
+
+2009-11-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ Code cleanup. All private functions static. Private stuff
+ in regex module not exposed in header. Etc.
+
+ * configure (diag_flags): Add -Wmissing-prototypes and
+ -Wstrict-prototypes.
+
+ * gc.c (more): Turn into prototyped definition with (void).
+
+ * gc.h (unmark): Declared.
+
+ * hash.c (hash_equal, hash_destroy, hash_mark, hash_grow): Private
+ functions defined static.
+
+ * lib.c (flatten_helper, do_bind2, do_bind2other): Likewise.
+
+ * lib.h (make_package, merge, d): Declared.
+
+ * match.c (dump_shell_string, dump_byte_string, dump_var,
+ dump_bindings, depth, weird_merge, bindable, dest_bind, match_line,
+ format_field, subst_vars, eval_form, complex_open, complex_snarf,
+ complex_stream, robust_length, bind_car, bind_cdr, extract_vars,
+ extract_bindings, do_output_line, do_output, match_files): Private
+ functions defined static.
+ (map_leaf_lists, complex_close): Unused functions removed.
+
+ * parser.h (yyerror): Declared.
+
+ * regex.c (bitcell_t, BITCELL_ALL1, CHAR_SET_SIZE,
+ chset_type_t, cset_L0_t, cset_L1_t, cset_L2_t, cset_L3_t,
+ struct any_char_set, struct small_char_set, struct displaced_char_set,
+ struct large_char_set, struct xlarge_char_set, union char_set,
+ nfa_kind_t, struct nfa_state_accept, struct nfa_state_empty,
+ struct nfa_state_single, struct nfa_state_set, struct nfa_state,
+ struct nfa_machine): Definitions moved here from regex.h file.
+ (L0_fill_range, L0_contains, L1_full, L1_fill_range, L1_contains,
+ L1_free, L2_full, L2_fill_range, L2_contains, L2_free, L3_fill_range,
+ L3_contains, L3_free, char_set_create, char_set_destroy,
+ char_set_compl, char_set_add, char_set_add_range, char_set_contains,
+ nfa_state_accept, nfa_state_empty, nfa_state_single, nfa_state_wild,
+ nfa_state_free, nfa_state_shallow_free, nfa_state_set,
+ nfa_state_empty_convert, nfa_state_merge, nfa_make, nfa_combine,
+ nfa_compile_set, nfa_all-states, nfa_closure, nfa_move): Private
+ functions defined static.
+
+ * regex.h (bitcell_t, BITCELL_ALL1, CHAR_SET_SIZE,
+ chset_type_t, cset_L0_t, cset_L1_t, cset_L2_t, cset_L3_t,
+ struct any_char_set, struct small_char_set, struct displaced_char_set,
+ struct large_char_set, struct xlarge_char_set, union char_set,
+ nfa_kind_t, struct nfa_state_accept, struct nfa_state_empty,
+ struct nfa_state_single, struct nfa_state_set, struct nfa_state,
+ struct nfa_machine): Definitions removed.
+ (char_set_created, char_set_destroy, char_set_compl, char_set_add,
+ char_set_add_range, char_set_contains nfa_state_accept,
+ nfa_state_empty, nfa_state_single, nfa_state_wild, nfa_state_set,
+ nfa_state_free, nfa_state_shallow_free, nfa_state_merge): Extern
+ declarations removed.
+
+ * stream.c (stdio_stream_print, stdio_stream_destroy,
+ stdio_stream_mark, stdio_get_char, stdio_get_byte,
+ string_in_stream_mark, vformat_str): Private functions defined static.
+
+ * txr.c (oom_realloc_handler, help, hint,
+ remove_hash_bang_line): Likewise.
+
+ * unwind.c (uw_unwind_to_exit_point): Likewise.
+
+2009-11-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ * configure: Workaround in banner code for coreutils printf %.*s bug.
+
+2009-11-27 Kaz Kylheku <kkylheku@gmail.com>
+
+ Switching to DESTDIR convention for install.
+ Make install step does some things more correctly now,
+ without relying on the install program.
+
+ * configure: Help text doesn't refer to ``Makefile variables''
+ but ``make variables'', or ``variables in config.make''.
+ The install_prefix variable becomes DESTDIR now in
+ config.make.
+
+ * Make (INSTALL): New rule body macro.
+ (install): Uses of mkdir -p and cp switched to a call
+ to the INSTALL macro.
+
+2009-11-26 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 026.
+
+ Fixed wchar_t build problem in parser.y.
+
+ Improved configure script to auto-detect yacc program.
+ Txr works with either Berkeley yacc (byacc) or Bison.
+
+ Fixed some two uninitialized memory bugs.
+
+ Valgrind API is now used to integrate GC memory manager
+ with valgrind.
+
+ The symbols nothrow and args in the next directive
+ are now keyword symbols, written :nothrow and
+ :args. (Breaks backward compatibility; sorry!)
+
+ * txr.c (version): Bumped to 026.
+
+ * txr.1: Bumped version to 026.
+
+ * configure: Bumped txr_ver to 026.
+
+2009-11-26 Kaz Kylheku <kkylheku@gmail.com>
+
+ Not all systems have a yacc alias for the yacc program.
+ txr is known to work with two yacc implementations: GNU Bison
+ and Berkeley yacc. Let's add some auto-detection for yacc.
+
+ * Makefile: use "include" rather than "-include" for
+ including config.make, so that make fails if the file does
+ not exist.
+ (conftest.yacc): New target. Just outputs the value of the
+ variable expansion of $(YACC).
+
+ * configure (yaccname): New variable.
+ (gen_config_make): New function.
+ Steps added to test for existence of various yaccs.
+
+2009-11-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ * gc.c (mark_mem_region): Bugfix: do not mess with the valgrind
+ accessibility of the heap object if valgrind debugging is not enabled.
+
+2009-11-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.y (grammar): Fixes for bison 2.4.1. Remove superfluous action
+ in chrlit. Include <stdlib.h> for abort.
+
+2009-11-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ Refinements to Valgrind support.
+
+ * gc.c (mark_mem_region): If a pointer from the stack is valid
+ for the heap, it may point to a free object, which is marked
+ in accessible. We must grant the garbage collector access
+ to the object. If the object is free, close off access.
+ This is not 100% correct, because if the object is accessible
+ but undefined, then we end up flipping it to defined.
+ (sweep): Before sweeping each heap, mark the entire block as defined.
+ This is necessary because sweep accesses blocks, which may be free,
+ and thus inaccessible. Then, during the sweep, any block
+ which is already free must be marked inaccessible again.
+ This means that the remaining blocks that are reachable become defined.
+ Here that is okay, because gc has marked all those blocks. If any
+ of them had uninitialized members, that would have been caught
+ by valgrind during the marking phase, if not sooner.
+
+2009-11-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ More Valgrind support. New option --vg-debug which turns on
+ Valgrind protection of free blocks. This works independently
+ of --gc-debug.
+
+ * gc.c (opt_vg_debug): New conditionally defined global variable.
+ (more): Mark entire heap of free blocks inaccessible, if
+ vg debugging is enabled.
+ (make_obj): If vg debugging enabled, mark returned block as accessible,
+ but undefined, and take care to grant self temporary access while
+ manipulating the free list.
+ (finalize): Removed old debugging logic of not freeing strings
+ and vectors during gc debug. If the null pointers are ever a problem
+ during debugging, they can be checked inside obj_print, and
+ turned into #<garbage ...> notation.
+ (sweep): Switch to FIFO free block recycling if vg debugging is
+ enabled, just like when gc debugging is enabled.
+ Mark freed blocks as inaccessible, careful to grant self
+ temporary access while manipulating the free list.
+
+ * txr.c (txr_main): Parse the --vg-debug option.
+
+ * txr.h (opt_vg_debug): Conditionally declared.
+
+2009-11-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fix a build breakage that may happen on some platforms.
+ The parser.y file includes "utf8.h", which uses the the type wint_t.
+ It also includes "lib.h" which uses "wchar_t". But it fails
+ to include any headers which define these types.
+ The generated y.tab.c picks up wchar_t by the Bison-inserted
+ inclusion of <stdlib.h>, so that's how we got that. But wint_t does not
+ come from any of the headers---if they are standard-conforming.
+
+ * parser.y: Add inclusion of <stddef.h> and <wchar.h>.
+
+2009-11-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ More valgrind integration. Vector objects keep displaced pointers
+ to vector data; they point to element 0 which is actually the third
+ element of the vector. If an object is only referenced by interior
+ pointers, Valgrind reports it as possibly leaked. This change
+ conditionally adds a pointer to the true start of the vector,
+ if Valgrind support is enabled.
+
+ * lib.h (struct vec): vec_true_start, new member.
+
+ * lib.c (vector, vec_set_fill): Maintain vec_true_start.
+
+2009-11-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ First stab at Valgrind integration. First goal: eliminate false
+ positives when gc is accessing uninitialized parts of the stack.
+
+ * configure (valgrind): New variable. Defaults to false (do not
+ build valgrind support). New check for whether the valgrind API
+ is actually avilable if --valgrind is selected.
+ (HAVE_VALGRIND): Conditionally added to config.h.
+
+ * gc.c: Conditionally include valgrind memcheck.h header.
+ (mark_mem_region): After pulling out a value from the stack,
+ mark that copy as defined memory using VALGRIND_MAKE_MEM_DEFINED.
+ (mark): Removed check for a registered root variable pointer
+ being null; this cannot happen, unless someone registers a
+ null pointer, or the stack is trashed. The comment about a
+ possible null was misleading.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fix uninitialized memory locations.
+
+ * hash.c (make_hash): Uninitialized h->count member.
+
+ * lib.c (mkustring): Preallocated string buffer to have its
+ null terminator byte initialized, because the caller
+ does not do so (e.g. see lit_har_helper in parser.y).
+ The calling module is responsible for initializing all API-accessible
+ parts of the string, but the null belongs to the string implementation.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Switching to keyword symbols for :args and :nothrow.
+
+ * lib.c (args_s, nothrow_s): Renamed to args_k and nothrow_k.
+ (flattn_s): Renamed to flatten_s.
+ (obj_init): args_k and nothrow_k interned in keyword package.
+
+ * lib.h (args_s, nothrow_s, flattn_s): Declarations updated.
+
+ * match.c (match_files): Follow name changes.
+
+ * tests/004/query1.txr: Changed nothrow to :nothrow.
+
+ * txr.1: Documentation updated.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ /Now/ this can be released as 025.
+
+ utf8.c (utf8_from_uc): Fix bug introduced several commits ago (porting
+ to C++). Caught by regression test suite. Found using git bisect.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 025
+
+ External changes:
+
+ Flattening an empty list produces an empty list, not (()),
+ which is a list containing an empty list.
+
+ Tightened up semantics of bind, merge and other forms.
+ Fixed false positives in binding.
+
+ More bugfixes in the parser leading to garbage error messages.
+ (Still no regression test cases for error cases, oops).
+
+ Fixed crash in regexp function.
+
+ Symbol packages added. Keyword symbols (symbols in keyword package)
+ introduced.
+
+ Clarified semantics that t, nil and keywords evaluate to themselves.
+
+ Fixed bugs in the system for building in a separate directory.
+
+ Configuration script now tests the compiler for sanity, and runs
+ compiler-based tests to detects which integer type to use for casting
+ an obj_t * value to a number, and what specifiers to use for
+ inline functions.
+
+ Internal changes:
+
+ Macros replaced with inline functions.
+
+ Uses of obj_t * replaced with val typedef everywhere.
+
+ Exceptions occuring during early initialization no longer
+ lead to an infinite recursion due to streams not working.
+
+ The long type is no longer used, but a configured typedef.
+
+ Configure script now spits out a "config.h" header that is
+ widely included.
+
+ Symbol globals renamed to _s naming scheme.
+
+ Code made portable to C++. A new configure flag --ccname make it easier
+ to switch compilers.
+
+ * txr.c (version): Bumped to 025.
+
+ * txr.1: Bumped version to 025.
+
+ * configure: Bumped txr_ver to 025.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Auto-detect what specifiers to use for inline functions.
+ Allow compiler command to be set independently of full path
+ for easier compiler switching.
+
+ * Makefile (conftest.o): Target removed. What this rule does
+ is already an implicit rule; and nowhere else in the Makefile
+ are there rules for .c -> .o.
+ (conftest2): New target, for two-translation-unit config test program.
+ (INLINE_FLAGS): Removed.
+
+ * configure (ccname, inline): New variables.
+ (inline_flags): Variable removed. INLINE_FLAGS not generated
+ any more in config.make. Added test for what inline specifiers to use,
+ which is turned into #define INLINE ... in the config.h header.
+
+ * lib.h: (tag, is_ptr, is_num, is_chr, is_lit, type, auto_str,
+ static_str, litptr): Changed from inline to INLINE.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Changes to make the code portable to C++ compilers, which
+ can be taken advantage of for better diagnostics.
+
+ * gc.c (more, mark_obj, sweep, unmark): Obey stricter C++ rules
+ with regard to enumerations.
+ (make_obj): Avoid using C++ keyword "try".
+
+ * lib.c: Removed duplicate definitions of objects, found by C++.
+ (chk_malloc, chk_realloc): Casts needed when converting from void *.
+ (list): Discovered and fixed lack of va_end.
+ (trim_str, acons_new_l): Avoid use of C++ keyword "new".
+ (make_sym): Follow rename of struct member.
+
+ * lib.h (struct sym): Renamed val member to value.
+ (null): Added missing declaration.
+
+ * match.c (enum fpip_close, struct fpip): Moved and named enum out of
+ struct.
+
+ * regex.c (L0_full): Cast added in signed/unsigned comparison.
+ (L1_fill_range, L2_fill_range, L3_fill_range, char_set_create):
+ Don't mark static blank structures const; then they need initializers
+ in C++.
+ (char_set_compl, char-set_destroy, char_set_contains, nfa_compile_set):
+ Avoid using the C++ keyword "compl".
+
+ * regex.h (struct any_char_set, struct small_char_set, struct
+ displaced_char_set, struct large_char_set, struct xlarge_char_set):
+ Renamed compl member to comp.
+
+ * utf8.c (utf8_from_uc, ut8_decode): Obey stricter C++ rules
+ with regard to enumerations.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fixed broken yyerrorf. It was still taking char *, and passing
+ that as an object to vformat, resulting in #<garbage: ...>
+ output.
+
+ * parser.h (yybadtoken): Declaration updated.
+
+ * parser.l (yybadtoken): Redefined to take val argument.
+ The tok stays as int; this is closely coupled to yacc,
+ so why bother with num().
+
+ * parser.y (grammar): Fix occurences of yybadtoken to pass
+ proper literal objects using the lit macro, or nil in
+ the one case when there is no context.
+
+2009-11-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Renaming global variables that denote symbols, such that they
+ have a _s suffix.
+
+ * lib.c (cons_t, str_t, chr_t, num_t, sym_t, pkg_t, fun_t, vec_t,
+ stream_t, hash_t, lcons_t, lstr_t, cobj_t var, regex, set, cset, wild,
+ oneplus zeroplus, optional, compound, or, quasi skip, trailer, block,
+ next, freeform, fail, accept all, some, none, maybe, cases, collect,
+ until, coll define, output, single, frst, lst, empty, repeat, rep
+ flattn, forget, local, mrge, bind, cat, args try, catch, finally,
+ nothrow, throw, defex error, type_error, internal_err, numeric_err,
+ range_err query_error, file_error, process_error): Symbol globals
+ renamed to cons_s, str_s, chr_s, num_s, sym_s, pkg_s, fun_s, vec_s, t,
+ cons_s, str_s, chr_s, num_s, sym_s, pkg_s, fun_s, vec_s, stream_s,
+ hash_s, lcons_s, lstr_s, cobj_s, var_s, regex_s, set_s, cset_s, wild_s,
+ oneplus_s, zeroplus_s, optional_s, compound_s, or_s, quasi_s, skip_s,
+ trailer_s, block_s, next_s, freeform_s, fail_s, accept_s, all_s,
+ some_s, none_s, maybe_s, cases_s, collect_s, until_s, coll_s, define_s,
+ output_s, single_s, first_s, last_s, empty_s, repeat_s, rep_s,
+ flattn_s, forget_s, local_s, merge_s, bind_s, cat_s, args_s, try_s,
+ catch_s, finally_s, nothrow_s, throw_s, defex_s, error_s, type_error_s,
+ internal_error_s, numeric_error_s, range_error_s, query_error_s,
+ file_error_s, process_error_s,
+ (code2type, typeof, make_package, intern, obj_init): Symbols
+ references follow rename.
+
+ * lib.h (cons_t, str_t, chr_t, num_t, sym_t, pkg_t, fun_t, vec_t,
+ stream_t, hash_t, lcons_t, lstr_t, cobj_t var, regex, set, cset, wild,
+ oneplus zeroplus, optional, compound, or, quasi skip, trailer, block,
+ next, freeform, fail, accept all, some, none, maybe, cases, collect,
+ until, coll define, output, single, frst, lst, empty, repeat, rep
+ flattn, forget, local, mrge, bind, cat, args try, catch, finally,
+ nothrow, throw, defex error, type_error, internal_err, numeric_err,
+ range_err query_error, file_error, process_error): Declarations
+ updated.
+
+ * hash.c (make_hash): Symbol references follow rename.
+
+ * match.c (sem_error, file_err, dump_var, match_line, subst_vars,
+ eval_form, complex_stream, extract_vars, do_output_line, do_output,
+ match_files): Likewise.
+
+ * parser.y (grammar, repeat_rep_helper, define_transform): Likewise.
+
+ * regex.c (nfa_compile_set, nf_compile_regex, regex_compile,
+ regexp, regex_nfa): Likewise.
+
+ * stream.c (stdio_maybe_read_error, stdio_maybe_write_error,
+ stdio_close, pipe_close, make_stdio_stream, make_pipe_stream,
+ make_string_input_stream, make_string_byte_input_stream,
+ make_string_output_stream, get_string_from_stream, make_dir_stream,
+ close_stream, get_line, get_char, get_byte, vformat, format,
+ put_string, put_char): Likewise.
+
+ * txr.c (txr_main): Likewise.
+
+ * unwind.c (uw_throw, uw_errorf, type_mismatch, uw_register_subtype,
+ uw_init): Likewise.
+
+ * unwind.h (internal_error, numeric_assert, range_bug_unless);
+ Likewise.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * configure (platform_flags, remove_flags): New config variables.
+
+ * Makefile (CFLAGS): Take into account new flags.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ Follow up on 64 bit compilation warnings.
+
+ * lib.c (chr, chrp): Do not convert directly between wchar_t and
+ the pointer type; go through cnum intermediate value.
+
+ * stream.c (vformat): Fix bad cast from pointer to int; this was
+ missed in the conversion to cnum because it should have been a
+ cast to long originally.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (conftest.o): revert change that took CFLAGS from
+ this target.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * configure: Don't rely on higher precision arithmetic from the build
+ machine's shell. POSIX requires shell arithmetic to be only signed
+ long. We can't compute the INT_PTR_MAX constant in the shell, but
+ rather generate a constant C expression to compute it.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ Reporting of compile errors during configuration for easier
+ configure debugging.
+
+ * Makefile (conftest): Pass all of the CFLAGS when building
+ conftest. This way bad compiler options are caught
+ right in the basic compiler sanity test.
+
+ * configure: Compiler jobs are redirected to temporary error
+ file conftest.err which is dumped if there is a failure.
+ Parting text is improved: the user should not blindly
+ trust the success of the configuration but check its sanity.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * configure: Bugfix in parsing configuration variables
+ which contain the = character.
+
+ * Makefile (conftest.o): Pass full CFLAGS to configuration test
+ builds. If some flags don't work with the compiler, this should
+ be caught.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (CFLAGS): Added -I. so current directory is first
+ in the include search path. This is needed for finding
+ generated header files, when building in a separate directory.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (chk_malloc, chk_realloc): Fix diagnosable conversion,
+ caught by gcc 4.1.1.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * configure (cross): Print out value of $cross in --help.
+
+ * depend.txr: Add "config.h" to list of headers that are not
+ prefixed with $(top_srcdir).
+
+ * dep.mk: Regenerated.
+
+2009-11-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ Improving portability. It is no longer assumed that pointers
+ can be converted to a type long and vice versa. The configure
+ script tries to detect the appropriate type to use. Also,
+ some run-time checking is performed in the streams module
+ to detect which conversions specifier strings to use for
+ printing numbers.
+
+ * Makefile (conftest, conftest.o, conftest.syms): New targets.
+ Used by the configure script.
+
+ * configure (intptr, nm): New configuration variables.
+ Generating config.make is no longer the last step; compiler tests are
+ performed after config.make is set up, so that rules in the Makefile
+ can be used for doing the compiling. (This is the cleanest way to do
+ it, since the paths to the tools may contain Make variable expansion
+ syntax). New steps are added to try to detect whether the compiler has
+ a wider integer type than the c89 long, and which of the available
+ types (including, potentially, the extra wide type) is suitable for
+ holding a pointer. Results are generated into a header config.h.
+
+ * dep.mk: Regenerated.
+
+ * lib.h (NUM_MAX, NUM_MIN): Now derived from INT_PTR_MAX and
+ INT_PTR_MIN macros, which come from config.h.
+ (cnum): New typedef name.
+ (cobj ops, tag, auto_str, static_str, litptr, lit_noex):
+ Changed long to cnum.
+ (num, c_num): Declaration updated.
+
+ * lib.c (equal, length, num, c_num, plus, minus, neg, search_str,
+ cat_str, vector, vec_set_fill, obj_print, obj_pprint): Changed
+ long to cnum.
+
+ * gc.c (mark_obj): Changed long to cnum.
+
+ * hash.c (stuct hash, ll_hash, hash_mark, hash_grow,
+ hash_process_weak): Changed long to cnum.
+
+ * match.c (complex_open, do_output_line, do_output, match_files):
+ Changed long to cnum.
+
+ * parser.h (lineno): Declaration updated.
+
+ * parser.l (lineno): Redefined as cnum.
+ (grammar): Changed long to cnum.
+
+ * parser.y (%union/yystype): num member changed to cnum.
+ of config.h added.
+
+ * regex.c (nfa_run, nfa_machine_match_span, search_regex):
+ Changed long to cnum.
+
+ * regex.h (struct nfa_machine): Members last_accept_pos and count
+ changed to cnum.
+ (nfa_run, nfa_machine_match_span): Declarations updated.
+
+ * stream.c (struct fmt): New type.
+ (fmt_tab): New static array.
+ (num_fmt): New static pointer.
+ (detect_format_string): New function.
+ (vformat): Changed long to cnum. Formatting of numbers uses
+ num_fmt.
+ (stream_init): Call detect_format_string.
+
+ * txr.c, unwind.c, utf8.c: include config.h.
+
+ * unwind.h (internal_error): Local declaration of num updated.
+
+2009-11-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ Introducing symbol packages. Internal symbols are now in
+ a system package instead of being hacked with the $ prefix.
+ Keyword symbols are provided. In the matcher, evaluation
+ is tightened up. Keywords, nil and t are not bindeable, and
+ errors are thrown if attempts are made to bind them.
+ Destructuring in dest_bind is strict in the number of items.
+ String streams are exploited to print bindings to objects
+ that are not strings or characters. Numerous bugfixes.
+
+ * lib.h (enum type, type_t): new member: PKG.
+ (struct stym): New member: package.
+ (struct package): New type.
+ (union obj, obj_t): New member pk.
+ (interned_syms): Declaration removed.
+ (keyword_package, pkg_t): Declared.
+ (intern, acons_new_l): Declarations updated.
+ (find_package, symbol_package, keywordp): Declared.
+
+ * lib.c (interned_syms): Definition removed.
+ (packages, pkg_t, system_package, keyword_package, user_package): New
+ global variables.
+ (code2type, equal, obj_pprint): Handle PKG case.
+ (symbol_package, make_package, find_package, keywordp): New functions.
+ (make_sym): Initialize package field of symbol.
+ (intern): Takes package argument. Rewritten using packages,
+ which use hash tables to store symbols.
+ (acons_new_l): Takes extra pointer argument to return an extra
+ value.
+ (obj_init): Updated to handle packages. The orders of some
+ initializations have to change. The way nil is added as a symbol is
+ quite different, and a special hack for the symbol t is used.
+ Most symbols go into the user_package, but symbols that were
+ previously namespaced with $ go to the system package.
+ (obj_print): SYM cases now considers the packge of a symbol.
+ Symbols in the user package are printed as before.
+ Symbols with no package are printed using #: notation;
+ keywords with : notation; and all others with their package prefix.
+ PKG case is handled.
+
+ * gc.c (finalize): Handle PKG case.
+ (mark_obj): For SYM, mark the new package member. Handle PKG case.
+
+ * hash.h (gethash_l): Declaration updated.
+
+ * hash.c (ll_hash): Handle PKG case.
+ (gethash_l): Extra argument added to distinguish new addition
+ from existing find.
+
+ * match.c (dump_var): Dumps any object now by printing to
+ a string with a string stream.
+ (bindable): New function.
+ (dest_bind): Tightened up to distinguish bindable symbols
+ from non-bindable. Symbols that stand for themselves, including nil,
+ can only match themselves. Destructuring matches have to
+ match in the number of elements: dot notation can be used
+ to match superfluous elements.
+ (eval_form): Tightened up to recognize bindable symbols.
+ (match_files): Various directives honor non-bindable symbols (cat,
+ merge, flatten).
+
+ * parser.l (yybadtoken): Handle KEYWORD case.
+ (grammar): TOK can start with : . Returned as KEYWORD terminal,
+ with a lexeme that no longer has the : character.
+
+ * parser.y (KEYWORD): New nonterminal.
+ (grammar): Calls to intern given extra parameter.
+ In the expr rule, KEYWORD turned into symbol in keyword package.
+
+ * regex.c (regexp): Bugfix: dereferencing non pointer.
+
+ * stream.c (vformat): Bugfixes in state machine: handling
+ of prefix digits; printing of numbers in ~s.
+
+ * txr.c (txr_main): Intern calls updated.
+
+ * txr.1: Updated with information about nil, t and keywords.
+ More details about destructuring matching in bind.
+
+2009-11-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ * unwind.c (uw_throw): If streams are not initialized,
+ we have an unhandled exception too early in initialization.
+ Use C stream to print an error message and abort.
+ Using the nil stream variable will just cause a recursion bomb.
+
+2009-11-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (intern): Symbol interning to hash tables.
+ (obj_init): interned_syms must be created as a hash
+ table. Rearranged the order of some initializations so
+ the vector code called by hash works.
+
+2009-11-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (dest_bind): Fix breakage from two commits ago;
+ was falling through to unsuccessful return in the
+ consp case.
+
+2009-11-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.y (grammar): Fix error actions that do not assign
+ a value to $$.
+
+2009-11-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (dest_bind): Extended to handle more general forms
+ by using eval_form rather than direct symbol binding lookups.
+ False positive return fixed.
+ (match_line): Fixed merge to use eval_from
+ rather than direct symbol binding.
+
+2009-11-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (flatten): Semantics change. The flatten function
+ should not map nil -> (nil), but nil -> nil.
+
+2009-11-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ Changing ``obj_t *'' occurences to a ``val'' typedef. (Ideally,
+ we wouldn't have to declare object variables at all, so why
+ use an obtuse syntax to do so?)
+
+ * lib.h (val): New typedef name. Used throughout.
+
+ * gc.c, gc.h, hash.c, hash.h, lib.c, match.c, match.h, parser.h,
+ parser.l, parser.y, regex.c, regex.h stream.c,, stream.h, txr.c,
+ unwind.c, unwind.h: Replace obj_t * with val almost everywhere.
+ Low-level gc functinos that work with arrays of obj_t use
+ obj_t *. Seeing pointer arithmetic on a val doesn't make sense.
+ In macros we use obj_t *, to reduce the chances of clashing
+ with some local variable called val.
+
+2009-11-19 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Fixed mangled formatting of exception handling example.
+
+2009-11-19 Kaz Kylheku <kkylheku@gmail.com>
+
+ Get rid of macros in favor of safer inline functions.
+
+ The recent auto_str("byte str") error could have been caught
+ at compile time.
+
+ * Makefile (CFLAGS): Include expansion of INLINE_FLAGS.
+
+ * configure (inline_flags): New variable.
+ (INLINE_FLAGS): New variable generated in config.make.
+
+ * lib.h (tag, is_ptr, is_num, is_chr, is_lit, type,
+ auto_str, static_str, litptr): Function-like macros converted to
+ functions.
+
+2009-11-19 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 024
+
+ Fixed show-stopper breakage in parse error diagnostic function.
+
+ Fixed bug introduced back in 015: collects that don't yield
+ any variable bindings being wrongly treated as failed.
+
+ * txr.c (version): Bumped to 024.
+
+ * txr.1: Bumped version to 024.
+
+2009-11-19 Kaz Kylheku <kkylheku@gmail.com>
+
+ Use unsigned char * as allocator return value.
+
+ * lib.c (chk_malloc, chk_realloc): Return unsigned char *.
+
+ * lib.c (chk_malloc, chk_realloc): Declarations updated.
+
+ * utf8 (utf8_dup_to_uc): Remove cast to unsigned char *.
+
+2009-11-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ Following-up on diagnostics obtained by running code through C++
+ compiler. Idea: allocator functions return char * instead of void *,
+ like malloc did in classic pre-ANSI C. That way we are forced to
+ use a cast except when the target pointer is char * already.
+
+ * lib.c (progname): Duplicate definition of global removed.
+ (equal): Some default: cases to switch statements added.
+ (chk_malloc): Returns char *.
+ (chk_realloc): Returns char *, but takes void * on the way in.
+ That way we get C++-like behavior.
+ (chk_strdup): Oops, this returned void * instead of wchar_t *.
+ c++ catches boo boo.
+ (stringp): Added default: case to switch.
+ (vec_set_fill): Cast return value of chk_realloc.
+
+ * lib.h (chk_malloc, chk_realloc, chk_strdup): Declarations updated.
+
+ * parser.h (lineno): extern qualifier added to prevent duplicate
+ definitions of.
+
+ * regex.c (nfa_free, nfa_run, nfa_machine_init, regex_compile): Cast
+ return value of chk_malloc.
+
+ * stream.c (snarf_line, get_string_from_stream): Cast return value of
+ chk_realloc.
+
+2009-11-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_line, match_files): Fix broken behavior of collect
+ that doesn't match anything. It is not a failed match, as the
+ documentation makes perfectly clear. Collect/coll were introduced
+ in txr-006 and had the proper non-failing semantics.
+ However, in txr-015, during code restructuring, a bug crept in.
+ When changing to a different debugiging function, for some reason
+ I added the nil returns.
+
+2009-11-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.l (yyerror): Total breakage: can't take auto_str of char *
+ string.
+ (yyerrorf): Total breakage: arguments of wrong types. Detected
+ by vformat as garbage.
+
+2009-11-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ txr.1: Clarified handling of UTF-8, now that it's precise and portable.
+
+2009-11-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 023
+
+ Minor bugfix.
+
+ Code cleanup. Portability.
+
+ Completely removed dependency on C99 wide character stream functions,
+ and character encoding support from glibc. All UTF-8 encoding
+ and decoding is done by the program itself.
+
+ Removed the use of all GNU extensions and C99 syntax.
+
+ txr now requires a C90 compiler, and POSIX 1003.1 and 1003.2.
+
+ * txr.c (version): Bumped to 023.
+
+ * txr.1: Bumped version to 023.
+
+2009-11-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ More removal of C99 wide character I/O, and tightening up
+ of standard conformance.
+
+ * configure (lang_flags): Specify -D_POSIX_C_SOURCE=2 to obtain
+ POSIX 1003.1 and POSIX 1003.2 functions from the headers,
+ without GNU extensions. Specify -std=c89 to get C89 conformance
+ from gcc.
+
+ * match.c (dump_byte_string): New function.
+ (dump_shell_string): Retargetted to object streams.
+ (dump_var, dump_bindings): Retargetted to object streams.
+ Changed back to using a byte string for the array index prefixes,
+ to avoid using the wide-character swprintf.
+
+ * parser.l (grammar): Eliminate wcsdup uses in favor of chk_strdup.
+ Not only is wcsdup a GNU extension, it doesn't have the OOM check.
+
+ * stream.c: Added <sys/wait.h> header to define WIFEXITED and others.
+
+ * txr.c: Added include of <stdarg.h>. Removed <locale.h>,
+ (main): Removed setlocale call. Not needed any more, since wide
+ stream and string I/O is no longer used from the C library.
+
+2009-11-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ Removing use of C99 wide character I/O.
+
+ * stream.c (BROKEN_POPEN_GETWC): Macro removed. Work around no
+ longer needed since the program does not call getwc.
+ (struct stdio_handle): #ifdef text removed.
+ New member added: utf8 decoder.
+ (stdio_maybe_read_error, stdio_maybe_write_error): Treat
+ null handle as an exception rather than nil return. No need
+ to check ferror in stdio_maybe_write_error, since there is no
+ need to distinguish an end-of-file situation from error.
+ (stdio_put_char_callback, stdio_get_char_callback): New functions.
+ (stdio_put_string, stdio_put_char): Retargetted to utf8 encoder.
+ Null handle treated as separate kind of error.
+ (snarf_line, stdio_get_line, stdio_get_char): Retargetted to utf8
+ decoder.
+ (pipe_close): #ifdef text removed.
+ (make_stdio_stream): utf8 decode initialized.
+ (make_pipe_stream): utf8 decoder initialized. #ifdef text removed.
+
+2009-11-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ Warning fixes.
+
+ * hash.c (hash_ops): Add missing initializer.
+
+ * match.c (complex_open): Add missing intializer to ret variable.
+
+ * regex.c (regex_obj_ops): Add missing initializer.
+
+ * stream.c (stdio_ops, pipe_ops, string_in_ops, byte_in_ops,
+ string_out_ops, dir_ops): Likewise.
+
+2009-11-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (chrp): Fix broken is_chr(num) call.
+
+2009-11-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ * regex.c (nfa_all_states, nfa_closure): visited parameter
+ should be unsigned.
+
+2009-11-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fixes for compliance to C89.
+
+ * lib.c (init): Do not define variable after statements.
+
+ * match.c (match_files): Likewise.
+
+ * regex.h (struct any_char_set, struct small_char_set, struct
+ displaced_char_set, struct large_char_set,
+ struct xlarge_char_set): do not use enum bitfields, which is a GCC
+ extension.
+
+ * unwind.h (enum uw_frtype, uw_frtype_t): Combine into one
+ declartion, eliminating forward enum reference which is a GCC
+ extension.
+ (uw_block_begin): Add dummy typedef to macro so that it requires
+ a following semicolon. Without this, if the macro use is followed
+ by a semicolon, that semicolon looks like a null statement. A
+ subsequent declaration thus follows a statement and is not conforming
+ to C89. Also added an opening do.
+ (uw_block_end): Add while(0) to match do in uw_block_begin.
+ (uw_env_begin, uw_env_end): Add do/while(0) to macro pair, so
+ uw_env_end reuqires a semicolon.
+ (uw_catch_begin, uw_catch_end): Likewise.
+
+2009-11-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 022
+
+ Fix for bug 28033: crash in string output stream.
+ (Used by exception handling).
+
+ New kernel object type introduced which allows C string literals
+ to be used as first-class objects.
+
+ Use of printf-like C formatting eliminated from the code base.
+
+ The dependency on C99 wide character I/O is now minimized.
+
+ * txr.c (version): Bumped to 022.
+
+ * txr.1: Bumped version to 022.
+
+2009-11-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (rebuild): New target. Tired of doing make clean; make.
+
+2009-11-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ Big round of changes to switch the code base to use the stream
+ abstraction instead of directly using C standard I/O,
+ to eliminate most uses of C formatted I/O,
+ and fix numerous bugs, such variadic argument lists which
+ lack a terminating ``nao'' sentinel.
+
+ Bug 28033 is addressed by this patch, since streams no longer provide
+ printf-compatible formatting. The native formatter is extended with
+ some additional capabilities to take over.
+
+ The work on literal objects is expanded and they are now used
+ throughout the code base.
+
+ Fixed bad realloc in string output stream: reallocating by number
+ of wide chars rather than bytes.
+
+ * gc.c (sweep): Debugging code switched from fprintf to format.
+
+ * lib.c (typ_check, type_check2, car, cdr, car_l, cdr_l, list,
+ num, chrp, apply, cobj_print_op, dump): Retargetted, with help of new
+ literals, to new funtions that take string objects, rather than raw C
+ strings.
+ (obj_print, obj_pprint): Revamped with support for LIT type.
+ Retargetted to not use C style I/O functions in streams.
+
+ * lib.h (lit): Macro retargetted to another macro so that it expands
+ its argument.
+ (lit_noex): New macro, like lit, but does not macro-expand argument.
+ (auto_str): New macro.
+ (static_str): New macro.
+
+ * match.c (debugf, debuglf, sem_error, file_err): Converted from C
+ string to string object.
+ (dest_bind, match_line, LOG_MISMATCH, LOG_MATCH, match_files):
+ Retargetted to new interfaces that take string objects rather than raw
+ C strings.
+ (complex_stream): New function.
+ (do_output_line, do_output, extract): Retargetted from C streams to
+ object streams.
+
+ * parser.h (yyerrorf): Declaration updated.
+
+ * parser.l (yyerror): Call new yyerrorf interface, using auto_str
+ macro to dress up C string as a temporary object.
+ (yyerrorf): Changed from C strings to object strings.
+ (yybadtoken, grammar): Retargetted to new yyerrorf.
+
+ * stream.c (strm_ops): put_string and put_char function pointers
+ changed to take object strings rather than C strings. vcformat and
+ vformat virtuals removed. C formatting is not supported, and vformat is
+ handled above the stream switch level in one place for all streams.
+ (common_vformat, stdio_vcformat, string_out_vcformat, cformat,
+ put_cstring, put_cchar): Functions removed.
+ (stdio_stream_print, stdio_stream_destroy, stdio_maybe_write_error,
+ stdio_put_string, stdio_put_char, stdio_close, pipe_close,
+ string_out_put_char, make_pipe_stream, make_string_input_stream,
+ make_string_output_stream, make_dir_stream, close_stream,
+ get_line, put_line, get_char, put_char, put_string): Retargetted to new
+ string object interfaces.
+ (stdio_ops, pipe_ops): stdio_vcformat and common_vcformat initializers
+ (string_out_ops): string_out_vcformat and common_vcformat initializers
+ removed.
+ (string_in_ops, byte_in_ops, dir_ops): Two null initializers removed.
+ (string_out_put_string): Converted to object string interface.
+ Unnecessary chk_realloc call suppressed.
+ (get_string_from_stream): Fixed bad call to realloc with incorrect
+ size.
+ (vformat_num, vformat_str): New functions, helper to vformat.
+ (vformat): Rewritten. Is now the formatting engine.
+ (format, put_string, put_char): Interface converted from C string to
+ object string.
+
+ * stream.h (vformat, format): Declarations updated.
+ (vcformat, cformat, put_cstring, put_cchar): Declarations removed.
+
+ * txr.c (oom_realloc_handler, help, txr_main): Retargetted to object
+ stream and strings.
+
+ * unwind.c (uw_throw, type_mismatch, uw_register_subtype): Retargetted
+ to new string object interfaces.
+ (uw_throwf, uw_errorf): Interface changed from C string to object
+ string.
+ (uw_throwcf, uw_errorcf): Functions removed.
+
+ * unwind.h (uw_throwf, uw_errorf, type_mismatch): Declarations updated.
+ (uw_throwcf, uw_errorcf): Declarations removed.
+ (internal_error): Macro interface changed and retargetted to
+ object strings. Also, num hygiene problem worked around with local
+ extern declaration.
+ (numeric_assert, range_bug_unless): Retargetted to object strings.
+
+ * utf8.c (utf8_to, utf8_dup_from_uc, utf8_dup_from,
+ utf8_dup_to_uc): Casts of chk_malloc return value added.
+
+2009-11-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ Use the 11 tag bit pattern to denote a new type: LIT. This is a
+ pointer to a C static string, intended for literals. We can now
+ treat literal strings as light-weight objects.
+
+ * lib.h (TAG_MASK): Ensure the constant expr has long type.
+ (TAG_LIT): New macro.
+ (enum type, type_t): New enum member, LIT.
+
+ * gc.c (finalize, mark_obj): Handle LIT type.
+
+ * hash.c (ll_hash): Likewise.
+
+ * lib.c (code2type, equal, stringp, length_str, c_str,
+ obj_print): Likewise.
+ (obj_init): Intern symbols using literal strings.
+ (type): Parentheses added to macro expansion.
+ (is_lit, lit, litptr): New macros.
+
+2009-11-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (chr): Take wchar_t argument, not int. Dropped range check.
+ (c_chr): Return wchar_t not int.
+
+ * lib.h (chr, c_chr): Declarations updated.
+
+2009-11-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 021.
+
+ Text is represented using wide characters now. Queries and data
+ are parsed as UTF-8, so extended characters can be directly used.
+ Numeric character escapes can go up to \x10FFF. (More limited on
+ platforms where wchar_t is 16 bit). Regular expressions support
+ extended characters, directly or through escapes. Regex character set
+ matches can use full Unicode range. New test case 005 exercises
+ some of these features over Japanese text.
+
+ Failed exit status of pipes, and file close errors are exceptions now.
+
+ Bug fixed in regex character classes.
+
+ Fixed off-by-one error in lazy string implementation, which broke
+ some uses of the @(freeform) directive.
+
+ Fixed all instances of gc bug 28086: objects being prematurely
+ reclaimed. This showed up when compiling for profiling (gcc -pg).
+
+ The --cc argument of the configure script works properly now.
+
+ Numbers and characters are unboxed types now, encoded directly in
+ the (obj_t *) value. Lowest two bits of (obj_t *) are a tag
+ distinguishing characters, integers and pointers. The program
+ performs better from not having to cons memory when operating
+ on numbers and characters.
+
+ Discovered bug in glibc: getwc function segfaults when applied to
+ stream returned by popen. Worked around this bug. Bug is filed
+ as 10958 in glibc bugzilla.
+
+ Internals:
+
+ Hash tables implemented. Hash tables support weak keys and values.
+
+ * configure, hash.c, lib.c, stream.c, utf8.c: Removed trailing
+ from some lines.
+
+ * txr.c (version): Bumped to 021. Removed trailing whitespace.
+
+ * txr.1: Bumped version to 021.
+
+2009-11-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ Provide both char * and unsigned char * interfaces in UTF-8 module.
+ Fix unsigned and plan char * mixing.
+
+ * utf8.c (utf8_from_uc, utf8_to_uc, utf8_dup_from_uc,
+ utf8_dup_to_uc): New functions.
+ (utf8_from): Fix type of backtrack pointer to unsigned char *.
+
+ * utf8.h (utf8_from_uc, utf8_to_uc, utf8_dup_from_uc,
+ utf8_dup_to_uc): Declared.
+
+ * lib.c (string_utf8): Changed to take char * argument.
+
+ * lib.h (string_utf8): Declaration updated.
+
+2009-11-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (depend): Marked phony and $(PROG) prerequisite dropped.
+ (clean, distclean, tests, install): Phony targets marked phony.
+
+ * dep.mk: Regenerated.
+
+2009-11-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ * configure (cc): Compute variable properly.
+
+2009-11-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fixes for bug 28086. When constructing a cobj, whose associated
+ C structure contains obj_t * references, we should initialize
+ that C structure after allocating the cobj. If we initialize
+ the structure first, it may end up having the /only/ references
+ to the objects. In that case, the objects are invisible to the
+ garbage collector. The subsquent allocation of the cobj itself
+ then may invoke gc which will turn these objects into dust.
+ The result is a cobj which contains a handle structure that
+ contains references to free objects. The fix is to allocate
+ the handle structure, then the cobj which is associated with
+ that handle, and then initialize the handle, at which point it
+ is okay if the handle has the only references to some objects.
+ Care must be taken not to let a cobj escape with a partially
+ initialized handle structure, and not to trigger gc between
+ allocating the cobj, and initializing the fields.
+
+ * hash.c (make_hash): Fix cobj construction order.
+
+ * stream.c (make_stdio_stream): Fix cobj construction order.
+ (make_pipe_stream): Fix cobj construction order. Also
+ noticed and fixed a bug: h->descr field not being initialized
+ in the currently enabled BROKEN_POPEN_GETWC variant of the code.
+
+2009-11-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ New testcase which does some UTF-8 scanning, Unicode regexes,
+ and @(freeform).
+
+ * tests/005/data: New UTF-8 file.
+
+ * tests/005/query-1.txr: Likewise.
+
+ * tests/005/query-1.expected: Likewise.
+
+ * Makefile (TXR_ARGS): New target-specific assignment to set
+ data for test case set 005.
+
+2009-11-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (symbolp): Bugfix: function crashed on NUM argument.
+ (lazy_str): Fix for gc correctness: object from make_obj must be
+ completely intialized before any gc-triggering operation is invoked,
+ otherwise the garbage collector will be traversing an object
+ whose fields contain old garbage.
+ (lazy_str_force_upto): Off-by-one error. To force the object
+ up to index position N, means forcing up to length N+1.
+ This bug can make it look like a lazy string is much shorter
+ than it really is.
+
+2009-11-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ Allow -c scripts to not have a trailing newline.
+ Test suite exercises -c now.
+
+ txr.c (txr_main): If the script specified with -c is not terminated
+ by a newline, just add a newline. On the shell command line, it's a
+ nuisance to have to add the extra line before closing the quote.
+ It's also awkward in scripting, because the shell (or at
+ least Bash 3.0) does not produce a final terminating newline in command
+ substitution syntax like -c "$(cat file)". The last newline in
+ the file is trimmed, and has to be explicitly added in the script
+ itself, which is wrong in the case when the file is empty.
+
+ Makefile (TXR_SCRIPT_ON_CMDLINE): New target-specific variable,
+ arbitarily set for test 002.
+ (%.ok: %.txr): Rule updated to honor TXR_SCRIPT_ON_CMDLINE
+ variable, passing the script body to txr using -c rather than
+ as a file argument.
+
+ txr.1: Document -c change.
+
+2009-11-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ Previous commit broke UTF-8 lexing, by changing the get_char
+ semantics on the input stream to wide character input.
+ Also, reading a query the command line (-c) must
+ read bytes from a UTF-8 encoding of the string.
+ We introduce a new get_byte function which can extract bytes
+ from streams which provide it.
+
+ * parser.l (YYINPUT): Call get_byte instead of get_char.
+
+ * stream.c (struct strm_ops): New function pointer, get_byte.
+ (stdio_get_byte): New function.
+ (stdio_ops, pipe_ops): Add new function.
+ (string_in_ops, string_out_ops, dir_ops): Null pointer added.
+ (struct byte_input): New struct type.
+ (byte_in_get_byte): New function.
+ (byte_in_ops): New structure.
+ (make_string_byte_input_stream, get_byte): New functions.
+
+ * stream.h (make_string_byte_input_stream, get_byte): New functions.
+
+ * txr.c (txr_main): Make a byte input stream from the command
+ line spec, rather than a string input stream.
+
+2009-11-12 Kaz Kylheku <kkylheku@gmail.com>
+
+ Continuing wchar_t conversion. Making sure all stdio calls
+ use wide character functions so that there is no illicit
+ mixing. (But the goal is to replace this usage with txr streams).
+
+ * lib.c (list, cobj_print_op, obj_print, obj_pprint): Use
+ wide string literals and I/O functions.
+
+ * match.c (debuglcf): Converted to wchar_t.
+ (dump_bindings, match_line, match_lines, extract): Use wide string
+ literal and I/O function.
+
+ * parser.h (yyerrorf): Declaration updated.
+
+ * parser.l (yyerror): Use wide-string yyerrorf. Users of
+ yyerror continue to pass multibyte strings.
+ (yyerrorf): Converted to wchar_t.
+ (yybadtoken, grammar): Use wide string literals to call yyerrorf.
+
+ * stream.c (struct strm_ops): vcformat changed to wchar_t.
+ (stdio_vcformat, string_out_vcformat, vcformat, cformat): Likewise.
+
+ * stream.h (vformat, vcformat, cformat): Declarations updated.
+
+ * txr.c (oom_realloc_handler, help, hint, txr_main): Use wide string
+ literals and I/O functions.
+
+ * unwind.c (uw_throwcf, uw_errorcf): Converted to wchar_t.
+
+ * unwind.h (uw_throwcf, uw_errorcf): Declarations updated.
+ (internal_error, numeric_assert, range_bug_unless): Macros
+ fixed to use wide string literals.
+
+2009-11-12 Kaz Kylheku <kkylheku@gmail.com>
+
+ * utf8.c (utf8_from): Fix total breakage.
+ Was writing out incomplete wide characters on internal
+ state transtions while traversing a single multi-byte character.
+ Also, improved handling of bad bytes close to EOF: if EOF
+ occurs in a multi-byte character, it will backtrack,
+ and skip one bad byte, etc.
+ (utf8_encode, utf8_decoder_init, utf8_decode): New functions.
+
+ * utf8.h (enum utf8_state): New enum.
+ (struct utf8_decoder, utf8_decoder_t): New struct.
+ (utf8_encode, utf8_decoder_init, utf8_decode): Declared.
+
+2009-11-12 Kaz Kylheku <kkylheku@gmail.com>
+
+ Documenting extended characters in man page.
+ Cleaned up some more issues related to extended characters.
+
+ * parser.l (grammar): Added error sctions for invalid UTF-8 bytes.
+
+ * stream.c (BROKEN_POPEN_GETWC): New macro. Enables workaround
+ for a glibc bug, whereby getwc blows up when applied to a FILE *
+ stream returned from a popen call.
+ (struct strm_ops): put_char function takes wchar_t.
+ (common_format): Use wchar_t rather than int.
+ (stdio_put_string): fputws returns -1, not EOF.
+ (stdio_put_char, put_cchar): Character argument changed to wchar_t.
+ Output done with putwc used instead of putc.
+ (snarf_line, stdio_get_char): Use getwc to read from the stream.
+ (pipe_close, make_pipe_stream): Implement workaround form glibc bug.
+
+ * stream.h (put_cchar): Declaration updated.
+
+ * txr.1: Added notes about international characters.
+
+2009-11-12 Kaz Kylheku <kkylheku@gmail.com>
+
+ Regular expression module updated to do unicode character sets.
+ Most of the changes are in the area of representing sets.
+
+ Also, a bug was found in the compilation of regex character sets:
+ ranges straddling two adjacent blocks of 32 characters were
+ not being added to the character set. However, ranges falling
+ within a single 32 block, or spanning three or more such blocks,
+ worked properly. This bug is not tickled by common ranges
+ such as A-Z, or 0-9, which land within a 32 block.
+
+ * regex.h (BITCELL_LIT): Macro removed.
+ (CHAR_SET_SIZE): Macro does not depend on UCHAR_MAX any more,
+ but hard-codes a set size of 256. UCHAR_MAX means nothing to us any
+ more since we are using wchar_t. The number 256 is simply an
+ arbitrarily chosen size for representing the small character
+ sets (or the leaves of the radix tree for representing large sets).
+ (chset_type_t): New enum typedef.
+ (cset_L0_t, cset_L1_t, cset_L2_t, cset_L3_t): New array typedefs.
+ (struct char_set): Replaced by union char_set.
+ (struct any_char_set, struct small_char_set, struct displaced_char_set,
+ struct large_char_set, struct xlarge_char_set): New struct types.
+ (char_set_clear): Declaration removed.
+ (char_set_create, char_set_destroy): Declared.
+ (char_set_add, char_set_add_range, char_set_contains,
+ nfa_state_single, nfa_state_set, nfa_machine_feed): Declarations
+ updated for wchar_t.
+ (struct nfa_state_single): member ch changed to wchar_t.
+
+ * regex.c (char_set_clear): Function removed.
+ (CHAR_SET_L0, CHAR_SET_L1, CHAR_SET_L2, CHAR_SET_L3, CHAR_SET_L2_L0,
+ CHAR_SET_L2_HI, CHAR_SET_L1_L0, CHAR_SET_L1_HI, CHAR_SET_L0_L0,
+ CHAR_SET_L0_HI): New macros.
+ (L0_full, L0_fill_range, L0_contains, L1_full, L1_fill_range,
+ L1_contains, L1_free, L2_full, L2_fill_range, L2_contains,
+ L2_free, L3_fill_range, L3_contains, char_set_create,
+ char_set_destroy): New functions.
+ (char_set_compl): Works using a flag rather than by actually
+ computing a complemented set. Also, is no longer a toggle (and
+ was never used that way).
+ (char_set_add, char_set_add_range, char_set_contains): Polymorphic over
+ the different set types.
+ (nfa_state_single, nfa_move, nfa_run, nfa_machine_feed): Converted
+ to wchar_t.
+ (nfa_state_free): Use char_set_destroy to free set.
+ (nfa_state_set): Does not construct the set internally but
+ takes it as a parameter.
+ (nfa_compile_set): Rewritten to perform two passes over the
+ s-expression representing the list of characters and ranges
+ making up the set. The first pass determines what representation
+ will be used for the set. The second pass stuffs the characters and
+ ranges into the set.
+
+2009-11-11 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.c (main): call setlocale to set the LC_CTYPE to en_US.UTF-8,
+ so that the C library streams do the encoding. Once the program
+ is weaned from C library wide character stream I/O, this can go away.
+
+2009-11-11 Kaz Kylheku <kkylheku@gmail.com>
+
+ Big conversion to wide characters and UTF-8 support.
+ This is incomplete. There are too many dependencies on
+ wide character support from the C stream I/O library.
+ The regex code does not handle wide characters properly.
+ Character type is still int in some places, rather than wchar_t.
+ Test suite passes though.
+
+ * hash.c (hash_str): Converted to wchar_t.
+
+ * lib.c (progname, type_check, type_check2, type_check3,
+ car, cdr, car_l, cdr_l, equal, chk_strdup, string_own,
+ string, mkstring, mkustring, init_str, length_str,
+ c_str, search_str, sub_str, cat_str, split_str, trim_str,
+ chrp, apply, lazy_str, lazy_str_get_trailing_list,
+ cobj, obj_init, obj_print, obj_pprint, init): Converted to wchar_t.
+ (vector): Cast of chk_malloc return value added.
+ (string_utf8): New function.
+
+ * lib.h (struct string): Member str changed to wchar_t *.
+ (progname, chk_strdup, string_own, string, init_str,
+ c_str, init): Declarations updated.
+ (string_utf8): Declared.
+
+ * match.c (debugf, debuglf, sem_error, file_err, dump_shell_string,
+ dump_var, dump_bindings, dest_bind, match_line, do_output_line,
+ do_output, match_files): Converted to wchar_t.
+
+ * parser.h (spec_file): Declaration updated.
+
+ * parser.l (yy_errorf, char_esc, num_esc): Converted to wchar_t.
+ (ASC, ASCN, U, U2, U3, U4, UANY, UNANN, UONLY): New named
+ regexes, used for lexing utf-8.
+ (grammar): Converted to wchar_t and utf-8 handling.
+
+ * parser.y (%union/yystype): lexeme member changed to wchar_t *,
+ chr member changed to wchar_t.
+
+ * regex.c (nfa_run): Input string is wchar_t *.
+ (search_regex): String from haystack is wchar_t *.
+
+ * regex.h (nfa_run): Declaration updated.
+
+ * stream.c (struct strm_ops, common_vformat, stdio_stream_print,
+ stdio_maybe_read_error, stdio_maybe_write_error, stdio_put_string,
+ stdio_put_char, snarf_line, stdio_get_line, stdio_close, pipe_close,
+ struct string_output, string_out_put_string, string_out_put_char,
+ string_out_vcformat, dir_get_line, make_string_output_stream,
+ get_string_from-stream, make_dir_stream, get_line, get_char,
+ vformat, vcformat, format, cformat, put_string, put_cstring,
+ put_char, put_cchar, stream_init): Converted to wchar_t.
+
+ * stream.h (vformat, format, put_cstring): Declarations updated.
+
+ * txr.c (version, progname, spec_file, oom_realloc_handler,
+ help, hint, remove_hash_bang_line, main, txr_main): Converted
+ to wchar_t.
+
+ * txr.h (version, progname): Declarations updated.
+
+ * unwind.c (uw_throw, uw_throwf, uw_errorf, type_mismatch,
+ uw_register_subtype): Converted to wchar_t.
+
+ * unwind.h (uw_throwf, uw_errorf, type_mismatch): Declarations updated.
+
+ * utf8.c, utf8.h: New files.
+
+2009-11-10 Kaz Kylheku <kkylheku@gmail.com>
+
+ hash.c (hash_grow): Rewritten to avoid resizing the vector
+ in place, and thus having to pulling all conses into a big list.
+ TODO: avoid recomputing the hash function over the keys.
+ We could enhance cons cells with two more fields without using
+ additional storage.
+
+2009-11-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Changing representation of objects to allow for unboxed characters.
+ Now numbers and characters fit into a cell. We lose one more bit
+ from the range of numbers.
+
+ * lib.h (TAG_SHIFT, TAG_MASK, TAG_NUM, TAG_PTR, NUM_MASK, NUM_MIN,
+ is_ptr, is_num): Macros updated.
+ (is_chr, tag): New macros.
+ (struct chr): Removed.
+ (union obj): Updated.
+
+ * lib.c (typeof, equal, chr, chrp, c_chr, obj_print): Updated.
+
+ * hash.c (ll_hash): Characters aren't pointers any longer;
+ use abstract accessor.
+
+2009-11-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Add hash removal.
+
+ * hash.c (remhash): New function.
+
+ * hash.h (remhash): Declared.
+
+2009-11-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Add hash table growth.
+
+ hash.c (hash_grow): New function.
+ (l_gethash): Renamed to gethash_l. Increment count; if load
+ factor gets to two, call hash_grow to double the size.
+
+ hash.h (l_gethash): Declaration changed to gethash_l.
+
+2009-11-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Changing representation of objects to allow the NUM type to be
+ unboxed. If the lowest bit of the obj_t * pointer is 1, then
+ the remaining bits are a number. A lot of assumptions are made:
+ - the long type can be converted to and from a pointer
+ - two's complement.
+ - behavior of << and >> operators when the sign bit is involved.
+
+ * lib.h (TAG_SHIFT, TAG_MASK, TAG_NUM, TAG_PTR, NUM_MASK, NUM_MIN,
+ is_ptr, is_num, type): New macros.
+ (struct num): Removed.
+ (nao): Redefined, so that it doesn't have the numeric tag.
+
+ * lib.c (typeof, type_check2, type_check3, car, car_l, cdr, cdr_l,
+ equal, consp, atom, listp, num, c_num, nump, plus, minus,
+ stringp, lazy_stringp, obj_print, obj_pprint): Fixed these
+ functions to use the new number representation, and not to deference
+ the obj_t * poitner if it is actually a number.
+ (obj_init): Adjusted values of maxint and minint.
+
+ * gc.c (mark_obj, gc_is_reachable): Avoid dereferencing numbers.
+
+ * hash.c (ll_hash): Likewise.
+
+ * match.c (match_line, do_output_line): Likewise.
+
+2009-11-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ First cut at hash tables. One known problem is allocation during gc,
+ due to use of boxed numbers for vector access.
+
+ * gc.c (gc): Disable gc when doing garbage collection, in case
+ something tries to allocate memory during gc, triggering a recursive
+ gc, which would be very bad. Also, call the new function,
+ hash_process_weak, in between the mark and sweep phases.
+ (gc_is_reachable): New function.
+
+ * gc.h (gc_is_reachable): Declared.
+
+ * lib.c (hash_t): New symbol global.
+ (acons_new_l): New function.
+ (obj_init): New symbol interned.
+
+ * lib.h (hash_t, acons_new_l): Declared.
+
+ * hash.c, hash.h: New files.
+
+ * Makefile: New target, hash.o.
+
+ * dep.mk: Regenerated.
+
+2009-11-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Throw exception on stream error during close, or I/O operations. This
+ is needed for pipes that terminate abnormally or return failed
+ termination. Pipe and stdio streams have an extra description field
+ so they are printed in a readable way.
+
+ * lib.c (process_error): New global defined.
+ (obj_init): New symbol interned.
+ (lazy_stream_func): Pass t to close_stream, so exception
+ is thrown if the close fails.
+ (lazy_stream_cons): Ditto.
+
+ * lib.h (process_error): Declared.
+
+ * match.c (complex_snarf): Pass new desr argument to make_stdio_stream
+ and make_pipe_stream.
+
+ * stream.c (strm_ops): New argument on close function pointer.
+ (common_destroy): Close without throwing exception. For objects
+ being finalized, we don't care if the close works or not; the
+ program has shown that it doesn't care about the stream by
+ letting it become unreachable, so we don't bother the program
+ by throwing an exception.
+ (stdio_handle): New struct.
+ (stdio_stream_print, stdio_stream_destroy, stdio_stream_mark,
+ stdio_maybe_read_error, stdio_maybe_write_error): New functions.
+ (stdio_put_string, stdio_put_char, stdio_get_line,
+ stdio_get_char, stdio_vcformat, stdio_close): Updated to new
+ handle format, and throw errors now.
+ (stdio_ops, pipe_ops): Redirected to new functions stdio_stream_print,
+ stdio_stream_destroy and stdio_stream_mark.
+ (pipe_close): Updated to new handle format. Parses status from
+ pclose and throws exceptions appropriate to the situation.
+ (dir_close): Takes extra argument.
+ (make_stdio_stream, make_pipe_stream): New argument added.
+ (make_string_output_stream): Some casts added.
+ (close_stream): Pass new argument down to virtual function.
+ (stream_init): Pass new argument to make_stdio_stream
+ when creating streams for stdin, stdout and stderr.
+
+ * stream.h (make_stdio_stream, make_pipe_stream, close_stream):
+ Declarations updated.
+
+ * txr.c (txr_main): Pass new argument to make_stdio_stream.
+
+ * unwind.c (uw_init): Register process_error.
+
+2009-11-01 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 020
+
+ Improved documentation.
+
+ Building via configure script.
+
+ Support for cross compiling support.
+
+ Support for building in separate build directory.
+
+ Internal bugfixes.
+
+ Portability bugs fixed; works on x86-64 GNU/Linux.
+
+2009-11-01 Kaz Kylheku <kkylheku@gmail.com>
+
+ Bug ID 27898: Directory order dependencies in test case.
+ Converted some directories to text files.
+
+ * tests/002/proc/*/task: Directories removed.
+
+ * tests/002/proc/*/tasks: Files created.
+
+ * tests/002/query-1.txr: Query updated.
+
+ * tests/002/query-1.expected: Expected output updated.
+
+2009-11-01 Kaz Kylheku <kkylheku@gmail.com>
+
+ Bug ID 27895: Calls to protect have an argument list terminated
+ by the integer constant 0 rather than a proper null pointer constant.
+
+ lib.c (obj_init): Properly terminate argument list of protect call.
+
+ stream.c (stream_init): Likewise.
+
+ unwind.c (unwind_init): Likewise.
+
+ txr.c (txr_main): two-argument protect calls rewritten using prot1.
+
+2009-11-01 Kaz Kylheku <kkylheku@gmail.com>
+
+ Bug ID 27899: Garbage collection problem: method of locating stack
+ bottom is unreliable due to the unpredictable allocation order of local
+ variables. The addresses of stack_bottom_0 and stack_bottom_1 variables
+ do not necessarily bracket the others which means that some local
+ variables in main can be out of the reach of the garbage collector:
+ our stack bottom is wrongly in the middle of the frame.
+
+ * lib.c (init): Removed one of the stack bottom parameters, so there
+ is only one. This is passed straight down to gc_init.
+ Also noticed that the oom_realloc variable was not being set
+ from the oom parameter.
+
+ * lib.h (init): Declaration updated.
+
+ * txr.c (txr_main): New static function.
+ (main): Calls init, and then txr_main. The idea is that txr_main
+ should get fresh stack frame. So the stack_bottom variable in main
+ should be outside of that stack frame.
+
+2009-10-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (equal): Fix broken LSTR and FUN cases.
+
+2009-10-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ Got "make tests" working in separate build directory,
+ with .out files going to local tests/ tree.
+
+ * Makefile (depend): Refer to depend.txr and dep.mk
+ using $top_srcdir; no need for symlinks.
+ Changed a few more ./txr references to use $(PROG).
+ (TESTS): Path munging to generate targets with local paths.
+ (%.ok): Fixed diff logic to compare between .expected file
+ in $(top_srcdir) and local .out file.
+
+ * configure: Don't generate symlinks for tests and dep.mk.
+
+2009-10-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ Got "make install" working.
+
+ * Makefile (install): New target.
+
+ * configure (mandir, bindir): New variables.
+
+2009-10-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ Got build to work in separate build directory.
+
+ * Makefile (CFLAGS): Added -I flag to point header inclusion to the
+ source directory.
+ (PROG): New variable to hold program name.
+ (VPATH): Variable set, as a quick and dirty way to get GNU make
+ to find the prerequisites back in the source directory.
+ * configure: Added steps to symlink the tests directory and dep.mk.
+ * depend.txr: Modified to generate the dependencies with
+ correct references to the top_srcdir, with the exception of
+ locally generated headers.
+ * dep.mk: Regenerated.
+
+2009-10-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ Build configuration via configure script, with cross compiling support.
+ (Tested by cross-compiling txr on an x86 GNU/Linux system
+ to run on a MIPS-based GNU/Linux system).
+
+ * configure: New script.
+ * Makefile: (OPT_FLAGS, LANG_FLAGS, DIAG_FLAGS, DBG_FLAGS,
+ LEX_DBG_FLAGS, TXR_DBG_OPTS, LEXLIB): Variables removed;
+ these are now generated in config.make by configure.
+ (config.make): New target to print friendlier diagnostic if
+ the build is not configured.
+ (distclean): New target to do clean, plus remove config.make.
+
+2009-10-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.l (YY_INPUT): Kill tabs with spaces (how did they sneak in?).
+ Fix possible use of uninitialized ch.
+
+2009-10-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Fixed misleading wording (separation versus termination).
+ Added Introduction headings to some major sections.
+ Improved exception handling intro.
+
+2009-10-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 019
+
+ Regexps can be bound to variables.
+
+ New freeform directive.
+
+ * txr.c (version): Bump.
+ * txr.1: Bump version and date.
+
+ * lib.c, match.c, regex.c, regex.h, stream.c: Trailing whitespace
+ removed from lines.
+
+2009-10-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Documented freeform.
+
+2009-10-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ Change the freeform line catenation semantics to termination
+ rather than separation.
+
+ * lib.h (lazy_str): Declaration updated.
+
+ * lib.c (lazy_str): Tack terminator onto initial prefix
+ string. Parameter renamed. Also, terminator string cached
+ in the object.
+ (lazy_str_force, lazy_str_force_upto): Terminate, rather
+ than separate.
+
+ * match.c (match_files): sep variable renamed to term.
+
+2009-10-21 Kaz Kylheku <kkylheku@gmail.com>
+
+ * gc.c (mark_obj): Bugfix: recurse over recently added
+ member, opts, in the lazy_string structure.
+
+2009-10-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ Got regex working over lazy strings from freeform.
+
+ Bugfixes.
+
+ * lib.c (length_str): Fixed recursion to wrong length function.
+ (lazy_str_force): March down list properly. Update lazy
+ string's limit value.
+
+ * match.c (match_line): Convert to lazy-string-aware style; i.e.
+ avoidance of triggering a force of the whole string.
+ (match_files): Bugfix in argument processing of freeform directive.
+
+ * regex.h (nfam_result_t): New typedef.
+ (nfa_machine_reset): New function declaration.
+ (nfa_machine_feed): Updated declaration.
+
+ * regex.c (nfa_machine_init): Refactor to use nfa_machine_reset.
+ (nfa_machine_feed): Return nfam_result_t rather than just int.
+ (search_regex, match_regex): Refactor to work with lazy strings well.
+
+2009-10-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ Implement custom separator and limit in freeform.
+
+ * lib.h (lazy_string): New struct member, opts.
+ (lazy_str): Declaration updated.
+
+ * lib.c (lazy_str): New constructor parameters to set the
+ seprator string and numeric line limit.
+ (lazy_str_force, lazy_str_upto): Honor the line limit,
+ and use the separator string if provided.
+
+ * match.c (match_files): Process the arguments for freeform
+ directive.
+
+2009-10-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (sub_str): Avoid invoking c_str which forces the
+ lazy string.
+
+2009-10-20 Kaz Kylheku <kkylheku@gmail.com>
+
+ Start of implementation for freestyle matching.
+
+ Lazy strings implemented, incompletely.
+
+ Changed string function to implicitly strdup; non-strdup
+ version changed to string_own. Fixed wrong uses of strdup
+ rather than chk_strdup.
+
+ Functions added to regex module to provide regex matching
+ as a state machine to which characters are fed.
+
+ * lib.h (type_t): New enum member LSTR, for lazy strings.
+ (lstr_t, freestyle, type_check3, string_own): Declared.
+ (string): Parameter changed to const char *.
+ (lazy_stringp, split_str, lazy_str, lazy_str_force_upto,
+ lazy_str_force, lazy_str_get_trailing_list, length_str_gt,
+ length_str_ge, length_str_lt, length_str_le): Declared.
+
+ * lib.c (lstr_t, freestyle): New symbol globals.
+ (code2type, obj_print, obj_pprint, equal): Extended to handle LSTR.
+ (type_check3): New function.
+ (string_own): New function; does what string used to do.
+ (string): Duplicates the string with strdup, so callers don't have to.
+ (mkstring, copy_str, trim_str): Use string_own.
+ (stringp): A lazy string is a kind of string.
+ (lazy_stringp): New function.
+ (length_str, c_str, search_str, sub_str, chr_str,
+ chr_str_set): Handle lazy strings.
+ (split_str): New function.
+ (lazy_str, lazy_str_force_upto, lazy_str_force,
+ lazy_str_get_trailing_list, length_str_gt, length_str_ge,
+ length_str_lt, length_str_le): New functions.
+ (obj_init): New symbols interned. Eliminated strdup calls.
+
+ * gc.c (finalize, mark_obj): Changed to handle LSTR type.
+ Eliminated default case from switch so we get a gcc
+ diagnostic if a case is not handled.
+
+ * match.c (match_files): Eliminated strdup calls.
+ Added freeform directive.
+
+ * parser.y (grammar): Changed string calls to string_own.
+
+ * stream.c (stdio_get_line, get_string_from_stream):
+ Changed string calls to string_own.
+ (dir_get_line): Eliminated chk_strdup call.
+
+ * txr.c (remove_hash_bang_line, main): Eliminated strdup calls.
+
+ * regex.h (nfam_result): New union.
+ (nfa_machine, nfa_machine_t): New struct and typedef.
+ (nfa_machine_init, nfa_machine_cleanup, nfa_machine_feed,
+ nfa_machine_match_span): New functions declared.
+
+ * regex.c (nfa_machine_init, nfa_machine_cleanup, nfa_machine_feed,
+ nfa_machine_match_span): New functions defined.
+
+2009-10-18 Kaz Kylheku <kkylheku@gmail.com>
+
+ Trivial change allows regexps to be bound to variables,
+ and used for matching. This Just Works because of
+ the way match_line treats variables.
+
+ * match.c (eval_form): Check for a regexp form and return
+ it as a value representing itself.
+ * regex.c (regexp): New function.
+ * regex.h (regexp): Declared.
+
+2009-10-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ * deps.mk: Updated.
+
+2009-10-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 018
+
+ Bugfixes: mistakes in debugging calls; infinite looping
+ bug in collect; skip directive not advancing match
+ by proper number of lines bug.
+
+ * match.c (debuglcf): Cosmetic fix.
+ (match_files): After recognizing nothrow in the file spec,
+ replace it by a string. A few places expect first(files) to be
+ a string. The skip directive must return whatever
+ return value it obtained from the nested match_files call,
+ and not substitute the current line number, so that the
+ caller can proceed past the correct number of lines that
+ were matched. Fixed obj_t * being passed to %s printf specifier
+ in debug printf. Collect directive must make progress even
+ if the nested spec makes no progress (returns successfully,
+ but with the original line number).
+ * txr.c (version): Bump.
+ * txr.1: Bump version and date.
+ * txr/tests/004/query-1.txr: New test case.
+ * tests/004/query-1.expected: Expected result for new test case.
+
+2009-10-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 017
+
+ Bugfix in exception subtype definition (defex).
+
+ Tail recursion in marking function of garbage collector.
+
+ -f option for specifying query file, allowing more
+ options to follow, useful in hash-bang scripting and
+ other situations.
+
+ * txr.c: (version): Bump to 016
+ * txr.1: Bump version to 016.
+
+2009-10-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Documented defex.
+ * unwind.c (uw_register_subtype): Bugfix: if the subtype
+ exists already, we must not delete it and create a new entry, but
+ destructively point its entry to its assigned supertype.
+ An exceptions is thrown rather than abort for attempts
+ to make t a subtype of something other than itself.
+ An attempt to make something other than nil a subtype of nil
+ is diagnosed. Attempts to redefine the relationship
+ between two types if they are already connected by one;
+ this covers circularity and other cases, while still allowing
+ a relaxed order of definition.
+
+2009-10-17 Kaz Kylheku <kkylheku@gmail.com>
+
+ * gc.c (mark_obj_tail): New macro.
+ (mark_obj): Optimized with manual tail recursion.
+ The funtion will no longer generate long call stacks
+ for long lists. Descending to the car field of
+ a cons is still recursive, but ``car-heavy''
+ trees are rare.
+
+2009-10-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ Resurrect -f option, with different meaning.
+ We need "-f query-file" so that hash-bang scripts
+ can be written which can pass options to txr.
+
+ * txr.c (help, main): Inplement and document -f.
+ Also bugfix: do not throw file open errors as exceptions
+ of type error, because these cause an abort, potentially leading to a
+ core dump. They are now thrown as file_error.
+ * txr.1: Documented -f.
+
+2009-10-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ Implemented @(next arg) for treating the command line
+ as an input source.
+
+ * txr.1: Updated, and fixed a few unrelated mistakes.
+ * lib.c (dir): Removed unused symbol globa.
+ (args): New symbol global.
+ * lib.h (dir): Declaration removed.
+ (args): Declared.
+ match.c (match_files): Implemented @(next arg).
+ Had to hack laziness to the file opening logic in match_files.
+ If the function is entered with a spec whose first
+ directive is @(next), then it defers opening the first
+ file in the list of files (since it will be immediately
+ abandoned in favor of another input source).
+ This prevents an error in the situation when the
+ arguments do not name files, and there is a @(next args)
+ directive to process them as an input source.
+
+2009-10-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 016
+
+ Catch clauses with parameters.
+
+ Directive for throwing exceptions: throw.
+
+ Directive for defining exception types: defex.
+
+ -f option renamed to -c.
+
+ * txr.c: (version): Bump to 016
+ * txr.1: Bump version to 016.
+
+2009-10-16 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.c (help, main): Changed -f argument to -c. This
+ is consistent with the -c argument of the shell;
+ -f looks like awk's -f option, which specifies a file,
+ not a literal script body.
+
+ * txr.1: Updated.
+
+2009-10-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: Grammar, spelling.
+
+2009-10-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.y (clauses_opt): Long overdue nonterminal added.
+ (define_clause) simplified with clauses_opt.
+ (try_clause): Error handling improved.
+ (catch_clauses_opt): Catch and finally clauses can be empty.
+ Error cases added.
+ * txr.1: Updated.
+
+2009-10-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_files): Use alist_remove1 for a one
+ element removal.
+
+2009-10-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * unwind.c (uw_throw): Add program prefix before
+ unhandled exception text. Print it in the
+ standard notation if it's not a string literal.
+ * match.c (sem_error, file_err): Don't stick program
+ prefix into exception text.
+
+2009-10-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ * unwind.c (uw_exception_subtype_p, uw_init):
+ Slight change in representation for exception subtypes,
+ saving one node in the list.
+
+2009-10-15 Kaz Kylheku <kkylheku@gmail.com>
+
+ New throw and defex directives, catches with arguments.
+
+ * lib.c (defex, throw): New symbol globals.
+ (obj_init): Symbols interned.
+ * lib.h (defex, throw): Declared.
+ * match.c (match_files): Implemented throw and defex.
+ Argument handling in catches.
+ * unwind.c (uw_register_subtype): Returns right
+ argument, so we can cleverly use it with reduce_left.
+ * unwind.h (uw_register_subtype): Declaration updated.
+ * txr.1: Updated.
+
+2009-10-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 015
+
+ Code restructuring.
+
+ Corruption bugfix in gc-debugging code.
+
+ The nil symbol more properly implemented.
+
+ Semantics change: collect treated as a failed match if it
+ does not collect anything.
+
+ Bugfix in function argument reconciliation: must only
+ be done for unbound parameters.
+
+ New @(local) directive (synonym of forget) for expressing
+ local variables in functions.
+
+ Quasi-literals: backquote-delimited literals that contain interpolated
+ variables. Useful in next, output, bind and function calls.
+
+ Hygiene: some implementation-inserted syntax tree elements
+ are now in their own namespace so they can't clash with user-defined
+ constructs.
+
+ Rewritten streams implementation.
+
+ Exception handling: try/catch/finally.
+
+ Exceptions used internally and externally.
+
+ File errors are mapped to exceptions now.
+
+ Hash bang (#!) scripting supported.
+
+ New -f paramater, allowing entire query to be specified
+ as argument rather than from a file or stdin.
+
+ * txr.c: (version): Bump to 014.
+ * txr.1: Bump version to 014. More documentation about
+ exceptions.
+
+2009-10-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ Support for hash bang execution, and embedding query
+ in a command line argument.
+
+ * txr.c (remove_hash_bang_line): New function.
+ (main): Added -f option. Initialize and gc-protect yyin_stream, and
+ use it in all places where yyin was previously set up.
+ Diagnose when -a, -D and -f are wrongly clumped with other options.
+ Remove the first line of the query if it starts with #!.
+ * parser.h (yyin): Declaration removed.
+ (yyin_stream): Declared.
+ * parser.l (YY_INPUT): Macro defined.
+ (yyin_stream): New global.
+ * stream.c (string_in_get_line, string_in_get_char): Bugfix:
+ wrong length function used.
+ (string_in_ops): Bugfix: wrong get_char function wired in.
+ (get_char): New function.
+ * stream.h (get_char): Declared.
+ * txr.1: -f option documented.
+
+2009-10-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (obj_print, obj_pprint): Print #<garbage ...>
+ syntax if an object has a bad type code; do not just return
+ without printing anything.
+
+2009-10-14 Kaz Kylheku <kkylheku@gmail.com>
+
+ Code cleanup and documentation.
+
+ * txr.1: Start documenting quasiliterals, exception handling and
+ nothrow in next and output.
+ * parser.y (catch_clauses_opt): Add missing empty production, so that
+ a try block doesn't have to have a finally clause.
+ * lib.h (or2, or3, or4): New macros.
+ * match.c (match_files): Allow output and next forms which just
+ have one argument that is nothrow, as documented.
+ * stream.c common_vformat, string_out_vcformat, string_out_vcformat,
+ make_string_output_stream, make_dir_stream, close_stream, get_line,
+ vformat, vcformat, format, cformat, put_string, put_cstring,
+ put_char): Switch to new style type assertions.
+
+2009-10-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ New syntax for next and output directives, taking advantage
+ of quasi-literals. Non-throwing behavior can be specified in
+ both using nothrow. The old syntax is supported, and has
+ the old semantics (non-throwing). Hence, the test cases
+ pass again without modification.
+
+ File open errors thrown as file_error type.
+
+ * lib.c (nothrow, file_error): New symbol globals.
+ (obj_init): New symbols interned.
+ * lib.h (nothrow, file_error): Declared.
+ * match.c (file_err): New function.
+ (eval_form): Bugfix: if input is nil, or an atom other than a symbol,
+ return the value hoisted into a cons. A nil return strictly means,
+ unbound variable.
+ (match_files): Support new syntax for next and and output.
+ Throw open errors as file_err.
+ * parser.l (grammar): Change how OUTPUT is returned to the
+ style similar to DEFINE, so interior forms can be parsed.
+ * parser.y (grammar): Fix up output_clause with new syntax.
+ * unwind.c (uw_throw): Do not abort on unhandled file_error,
+ but terminate with a failed status.
+ (uw_init): Register file_error as a subtype of error exception.
+
+2009-10-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ First cut at working try/catch/finally implementation.
+
+ * lib.c (try, catch, finally): New symbol globals.
+ (obj_init): New symbols interned.
+ * lib.h (try, catch, finally: Declared.
+ * parser.y (TRY, CATCH, FINALLY): New tokens.
+ (try_clause, catch_clauses_opt): New nonterminal grammar symbols.
+ * parser.l (yybadtoken): TRY, CATCH and FINALLY handled.
+ (grammar): New cases for try, catch and finally.
+ * unwind.h (struct uw_catch): New member called visible.
+ (uw_continue): New parameter added.
+ (uw_exception_subtype_p): Declared.
+ (uw_catch_begin): Macro rewritten to use switch logic
+ around setjmp.
+ (uw_do_unwind, uw_catch, uw_unwind): New macros.
+ (uw_catch_end): Rewritten to close switch, and automatically
+ continue the unwinding if the block is entered as an unwind.
+ * unwind.c (uw_unwind_to_exit_point): Exception catching
+ frames made invisible via new flag prior to control passing to them.
+ longjmp code 2 introduced for distinguishing a catch from
+ an unwind. Visibility flag is checked and invisible frames
+ are skipped.
+ (uw_push_catch): cont member of the unwind frame initialized to zero.
+ (exception_subtype_p): Renamed to uw_exception_subtype_p, changed
+ to extern. Fixed wrong order of arguments to assoc.
+ (uw_throw): Honor visibility flag: do not consider invisible
+ catch frames.
+ (uw_register_subtype): sup/sub mixup bugfix.
+ (uw_continue): Takes extra argument: the continuation frame
+ that (re)establishes the exit point for the unwinding.
+ This allows nested unwinding action to take place in a finally,
+ and then to continue to the original exit point.
+ * match.c (match_files): Handling for try directive added.
+
+2009-10-13 Kaz Kylheku <kkylheku@gmail.com>
+
+ * parser.l (yybadtoken): Bugfix: added missing LITCHAR case.
+ * unwind.h (internal_error): Fixed broken macro.
+ * match.c (match_line, match_files): sem_error bugfix: used %a instead
+ of ~a.
+ (match_files): Wrap block handler in compound statement, otherwise the
+ macroexpansion declares a variable in the middle of a statement, which
+ is a gcc extension to C90 (or a C99 feature,
+ but we aren't using C99).
+
+2009-10-08 Kaz Kylheku <kkylheku@gmail.com>
+
+ Exception handling for query errors.
+ Verbose logging decoupled from yyerror functions.
+ Superior object-oriented formatting used for cleaner code.
+
+ * lib.c (query_error): New symbol global.
+ (obj_init): New symbol interned.
+ * lib.h (query_error): Declared.
+ * match.c (output_produced): Variable changed to external linkage.
+ (debugf, debuglf, debuglcf, sem_error): New static functions.
+ (dest_bind, match_line, match_files): Regtargetted away from
+ the yyerrorf and yyerrorlf functions to use debugf,
+ debuglf, debuglcf for logging and sem_error for throwing
+ query errors as exceptions.
+ * parser.h (spec_file_str): New global declared.
+ * parser.l (yyerror): Calls yyerrorf instead of yyerrorlf;
+ lets yyerrorf increment error count.
+ (yyerrorf): Loses level argument.
+ (yyerrorlf): Function removed.
+ (yybadtoken): Retargetted from yyerrorlf to yyerrorf.
+ (grammar): yyerrorf call fixed up.
+ * txr.c (spec_file_str): New global defined.
+ (main): Protects new global against gc, and initializes it.
+ * unwind.c (uw_throw): If an unhandled exception is of
+ type query_error, it results in an exit rather than abort.
+ The false string is conditionally printed.
+ (uw_init): Register query_error as subtype of error.
+
+2009-10-08 Kaz Kylheku <kkylheku@gmail.com>
+
+ Exception handling framework implemented.
+
+ * lib.c (cobj_t, error, type_error, internal_err, numeric_err,
+ range_err): New symbol globals.
+ (prog_string): New string global.
+ (code2type): New static function.
+ (typeof): Rewritten using code2type.
+ (type_check, type_check2): New static functions.
+ (car, cdr, list, plus, minus, length_str, chr_p, chr_str,
+ chr_str_set, apply, funcall, funcall1, funcall2,
+ vec_get_fill, vecref_l, lazy_stream_cons): Checks and
+ assertions rewritten using new functions and macros.
+ (obj_init): prog_string protected from gc.
+ New symbols interned.
+ (init): uw_init() call moved after obj_init() because
+ it needs stable symbols.
+ * lib.h (cobj_t, error, type_error, internal_err, numeric_err,
+ range_err, prog_string, type_check, type_check2): Declared.
+ * match.c (dump_var, complex_snarf, complex_close): abort
+ calls rewritten to use exception handling.
+ * regex.c (nfa_all_states, nfa_closure, nfa_move): Likewise.
+ * stream.c (string_out_vcformat): Bugfix: fill index not updated.
+ (make_string_output_stream): Bugfix: initial buffer not null terminated.
+ (get_string_from_stream): New function.
+ * stream.h (get_string_from_stream): Declared.
+ * txr.c (main): Some error prints turned to throws.
+ * unwind.c (unwind_to_exit_point): Supports UW_CATCH frames,
+ whose finalization logic has to be invoked during unwinding,
+ and as target exit points.
+ (uw_init): Installs exception symbols into
+ subtyping hirearchy.
+ (uw_push_catch, exception_subtype_p, uw_throw, uw_throwf,
+ uw_errorf, uw_throwcf, uw_errorcf, type_mismatch,
+ uw_register_subtype, uw_continue): New functions.
+ (exception_subtypes): New static global.
+ * unwind.h (noreturn): New macro, conditionally defined on __GNUC__.
+ (enum uw_frtype): New member, UW_CATCH.
+ (struct uw_catch): New struct type.
+ (union uw_frame): New member, ca.
+ (uw_push_catch, exception_subtype_p, uw_throw, uw_throwf,
+ uw_errorf, uw_throwcf, uw_errorcf, type_mismatch,
+ uw_register_subtype, uw_continue): New functions declared.
+ (uw_catch_begin, uw_catch_end, internal_error, type_assert,
+ bug_unless, numeric_assert, range_bug_unless): New macros.
+
+2009-10-07 Kaz Kylheku <kkylheku@gmail.com>
+
+ Rewritten streams implementation.
+
+ * stream.h, stream.c: New files.
+ * Makefile (OBJS): New object file stream.o.
+ * dep.mk: Dependencies updated.
+ * gc.c (finalize): STREAM case removed. Call destroy only if not null.
+ (mark_obj): STREAM case removed.
+ * lib.c (push, pop): New functions.
+ (equal): STREAM case removed.
+ (sub_str): Allow from parameter to be nil, defaulting to zero.
+ (stdio_line_read, stdio_line_write, stdio_close, stdio_line_stream,
+ pipe_close, pipe_line_stream, dirent_read, dirent_close,
+ dirent_stream, stream_get, stream_pushback, stream_put,
+ stream_close): Functions removed.
+ (stream_ops dirent_stream_ops, stdio_line_stream_ops,
+ struct stream_ops, pipe_line_stream_op): Static structs removed.
+ (lazy_stream_func, lazy_stream_cons): Retargetted to new streams.
+ (cobj_print_op): Likewise.
+ (init): Disables and restores GC, instead of doing it in obj_init.
+ (obj_print): Retargetted to new streams.
+ (obj_pprint): New function.
+ (obj_init): Does not manipulate gc_state any more, moved to init.
+ Call to stream_init added.
+ (d, snarf): Retargetted to new streams.
+ (snarf_line): Removed, now appears in stream.c, retargetted
+ to new streams.
+ * lib.h (enum type): STREAM removed.
+ (struct stream, struct stream_ops): Removed.
+ (struct cobj_ops): Retargetted to new streams.
+ (union obj): sm member removed.
+ (push, pop, obj_pprint): Declared.
+ (stdio_line_stream, pipe_line_stream, dirent_stream, stream_get,
+ stream_pushback, stream_put, stream_close, snarf_line): Removed.
+ (cobj_print_op, dump, snarf): Modified.
+ * match.c (dump_bindings, complex_snarf): Retargetted to new streams.
+ * txr.c (main): format used to dump bindings and specs in verbose mode.
+
+2009-10-07 Kaz Kylheku <kkylheku@gmail.com>
+
+ Implemented quasi-literals: string literals which may
+ contain variables to be interpolated.
+
+ Also, took care of a hygiene problem with respect to some
+ parser-generated forms, which must be invisible to the user.
+
+ * Makefile (LEX_DB_FLAGS): New variable; helpful
+ in generating a lexical analyzer with debug tracing.
+ * parser.l (nesting, closechar): Static variables removed.
+ (char_esc): Add \` escape for quasi-literals.
+ (stack): New %option, to generate a scanner which has
+ a start condition stack.
+ (QSILIT): New start condition.
+ (grammar): Refactored to use start condition stacks.
+ Quasi-literal lexical analysis added.
+ * parser.y (lit_char_helper): New function, for factoring out
+ some common logic between string literals and quasi literals.
+ (quasilit, quasi_item, quasi_items): New grammar symbols and
+ production rules.
+ (strlit): Rule shortened with new helper function.
+ Bugfix: error case assigns nil to $$.
+ (chrlist): Bugfix: error case assigns nil to $$.
+ (LITCHAR): Added to %prec table to fix shift-reduce problem.
+ (expr): Production now can generate a quasilit.
+ * lib.c (quasi): New symbol global.
+ (obj_init): Intern quasi as "$quasi", so the user can
+ make a function called quasi. Also, var and regex are now interned
+ with the names "$var" and "$regex" for the same reason.
+ * lib.h (quasi): Declared.
+ * match.c (eval_form): Rewritten with recursive processing
+ to handle deeply embedded variables, as well as quasi-strings.
+ (subst_vars): Handles quasi-strings.
+ (match_files): Function calls now use eval_form for function
+ argument evaluation, except of course in the special case that if an
+ argument is a symbol, it may be unbound.
+
+2009-10-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_files): No error message for merging to
+ a symbol which is already bound; the existing behavior
+ is to destructively update the binding, which is useful,
+ and so the error is pointless.
+
+2009-10-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Introduce local as synonym to forget. It does exactly the
+ same thing; a previous binding is forgotten. This spelling
+ is nicer for functions.
+ * lib.h (local): Declared.
+ * lib.c (local): Defined.
+ (obj_init): New symbol interned.
+
+2009-10-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Bugfix: function parameter reconciliation (after function call
+ completes) must only consider the unbound parameters.
+ Otherwise false mismatches result if the function destructively
+ manipulated some bindings of bound parameters.
+ E.g. @(define foo (a)) is called as @(foo "bar") and internally
+ it rebinds bound parameter a to "baz". This situation is
+ not a mismatch. The rebinding is thrown away.
+
+ * match.c (match_files): When processing a function call,
+ keep an alist which associates arguments and unbound parameters.
+ Then, after the function call, process the alist, rather
+ than the full parameter list.
+
+2009-10-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Semantics change: collect fails if it does not collect
+ anything. Non-failing behavior can be obtained by
+ wrapping with @(maybe) (but no such workaround for coll yet).
+
+ * match.c (match_line): Return nil if coll collected nothing.
+ (match_files): Return nil if collect collected nothing.
+
+
+2009-10-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ Bugfix: nil must be on the list of interned symbols.
+
+ * lib.c (sym_name): Function removed. This was like
+ symbol_name but did not accept nil.
+ (intern): Use symbol_name instead of sym_name, allowing
+ nil to be on the list of interned symbols.
+ (obj_init): Add nil to interned_syms list.
+ (nil_string): Changed from "NIL" to "nil".
+ * match.c (dest_bind): Treat nil as a value, not a symbol.
+ (match_files): Treat nil as a value when it's
+ a function argument.
+
+2009-10-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ * gc.c (more): Bugfix: free_tail was incorectly calculated,
+ thereby destroying the validity of the FIFO recycling algorithm
+ used when GC debugging is enabled. This showed up as mysterious
+ assertions and crashes.
+ (mark_obj): Do not abort if a free object is marked.
+ (mark_mem_region): Renamed bottom and top variables to low
+ and high. The naming was confusing inverted relative
+ to that in the caller.
+ (sweep): Abort if somehow a block is free and marked reachable.
+
+2009-10-06 Kaz Kylheku <kkylheku@gmail.com>
+
+ * match.c (match_files): Fixed nonexitent symbol warning for merge
+ directive (complained about wrong symbol).
+
+2009-10-05 Kaz Kylheku <kkylheku@gmail.com>
+
+ Refactoring matching code.
+
+ * lib.h (cobj_ops): New function pointer, mark.
+ * gc.c (mark_obj): For a COBJ type, call the mark function
+ if the pointer is non-null.
+ (gc_mark): New public function, wrapper that calls
+ the private mark_obj. Implementations of mark for COBJ
+ objects will need to call this.
+ * gc.h (mark_obj): Declared.
+ * regex.c (regex_obj_ops): Explicitly initialize mark function pointer
+ to null.
+
+2009-10-05 Kaz Kylheku <kkylheku@gmail.com>
+
+ Code restructuring.
+
+ * Makefile (match.o): New object file.
+ (depend): New rule for generating dep.mk, using txr.
+ (lib.o, lex.yy.o, regex.o, y.tab.o unwind.o, txr.o, match.o, gc.o):
+ Dependency rules removed.
+ * dep.mk: New make include file; captures dependencies. Generated
+ by new depend rule in Makefile, using txr.
+ * depend.txr: Txr query to generate dependencies.
+ * extract.y: File renamed to parser.y
+ (output_produced): Variable removed,
+ moved into new file match.c.
+ (dump_shell_string, dump_shell_string, dump_var, dump_bindings, depth,
+ weird_merge, map_leaf_lists, dest_bind, eval_form, match_line,
+ format_field, subs_vars, complex_open, complex_open_failed,
+ complex_close, complex_snarf, robust_length, bind_car, bind_cdr,
+ extract_vars, extract_bindings, do_output_line, do_output,
+ match_files, extract): Functions removed, added to match.c.
+ (struct fpip): Definition removed, added to match.c
+ (<stdlib.h>, <string.h>, <ctype.h>, <errno.h>, <setjmp.h>,
+ "gc.h", "unwind.h"): Unneeded headers removed.
+ * match.c: New file.
+ * extract.l: Renamed to parser.l.
+ * extract.h: Renamed to parser.h.
+ (opt_loglevel, opt_nobindings, opt_arraydims, version, progname):
+ Declarations moved to txr.h.
+ (extract): Dclaration moved to match.h.
+ * txr.h, match.h: New headers.
+ * gc.h (opt_gc_debug): Moved to txr.h.
+
+2009-10-03 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 014
+
+ New cases directive.
+
+ New define directive: user-defined dynamically scoped functions.
+
+ String literals in bind and function calls.
+
+ EOF in the middle of a line handled properly.
+
+ * extract.l (version): Bump to 014.
+ * txr.1: Bump version to 014.
+
+
+2009-10-02 Kaz Kylheku <kkylheku@gmail.com>
+
+ New cases directive.
+
+ * extract.l (yybadtoken): Add case for CASES.
+ (grammar): Tokenize cases directive.
+ * extract.y (CASES): New token kind.
+ (cases_clause): New grammar symbol.
+ (grammar): Implement new grammar cases.
+ (match_files): Implement semantics for cases.
+ * lib.c (cases): New global.
+ (obj_init): Intern cases symbol.
+ * lib.h (cases): Declared.
+ * txr.1: Documented.
+
+2009-10-02 Kaz Kylheku <kkylheku@gmail.com>
+
+ Support for string and character literals.
+
+ * extract.l (char_esc): Support \' and \" escapes.
+ (STRLIT, CHRLIT): New flex start conditions.
+ (grammar): New rules for tokenizing string literals.
+ * extract.y (LITCHAR): New token kind.
+ (strlit, chrlit, litchars): New grammar symbols.
+ (grammar): Implement string literal parsing.
+ (dump_var): Support character objects, treating
+ them as one-character strings.
+ (eval_form): New function.
+ (match_files): In bind directive, allow the right
+ hand side to be an arbitrary object.
+ * lib.c (mkustring, init_str): New functions.
+ (cat_str): Allow characters in the mix, treating
+ them as one-character strings.
+ * lib.h (mkustring, init_str): Declared.
+ (chrp, chr_str, chr_str_set): New function.
+ * txr.1: Documented.
+
+2009-10-02 Kaz Kylheku <kkylheku@gmail.com>
+
+ Support for query-defined functions.
+
+ * extract.l (yybadtoken): New DEFINE case.
+ (NESTED): New flex start condition. This allows for different lexing
+ rules in nested lists, so even though for instance @(collect) is a
+ special token @((collect)) isn't.
+ (grammar): Refactored with NESTED.
+ Tokenize define directive.
+ * extract.y (define_transform): New function.
+ (DEFINE): New token kind.
+ (define_clause): New grammar symbol.
+ (match_files): Implement define semantics, and function calls.
+ * lib.c (define): New global.
+ * lib.h (define): Declared.
+ (proper_listp, alist_remove1, copy_cons, copy_alist): New functions.
+ (obj_init): Intern define symbol.
+ (init): Call new function uw_init.
+ * unwind.c (toplevel_env): New static structure.
+ (uw_unwind_to_exit_point): Support new UW_ENV frame type.
+ (uw_init, uw_find_env, uw_push_env, uw_get_func, uw_set_func): New
+ functions.
+ * unwind.h (UW_ENV): New enumeration member in uw_frtype.
+ (uw_dynamic_env): New struct.
+ (uw_block_begin, uw_block_end): Renamed some variables.
+ (uw_env_begin, uw_env_end): New macros.
+ * txr.1: Documented.
+
+2009-10-02 Kaz Kylheku <kkylheku@gmail.com>
+
+ Misc. bugfixes and improvements.
+
+ * extract.l (grammar): Newline in a directive
+ no longer an error. Why not allow it.
+ * extract.y (grammar): Productions for catching empty bodies in some
+ constructs now end with END newl, rather
+ than just END, so parsing can continue sanely.
+ (match_lines): In diagnostics, don't say "ignored" about material which
+ causes an error that fails the query!
+ * lib.c (mkstring): Initialize length since we know it!
+ (c_str): Take a symbol as an arg, so we don't have
+ to keep writing c_str(symbol_name(sym)).
+ (obj_print): Use isprint rather than isctrl to decide
+ whether to print a character as an escape.
+ (snarf_line): Properly handle EOF in the middle of line.
+
+2009-09-29 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 013
+
+ Some minor garbage collection issues fixed.
+
+ Infinite looping bug fixed.
+
+ New @(trailer) directive.
+
+ * extract.y (match_files): Implemented trailer directive.
+ * extract.l (version): Bump to 013.
+ * lib.h (trailer): Declaration added.
+ * lib.c (trailer): External definition added.
+ (obj_init): Initializer trailer with interned symbol.
+ * txr.1: Documented @(trailer) and bumped version to 013.
+
+2009-09-29 Kaz Kylheku <kkylheku@gmail.com>
+
+ Looping bug fixed. Certain directives could cause an infinite
+ loop if the query has run out of data.
+
+ * extract.y (match_files): The semantics of the first_file_parsed
+ argument changes a little bit. Previously, if nil was passed,
+ a new lazy stream would be opened for the first file.
+ But this is ambiguous because nil also means empty list;
+ sometimes when we recurse into match_files, the data has ran
+ out and this argument is thus nil. Now, that argument must be
+ the symbol t in order to mean ``open the first file''.
+ If the argument is nil, it unambiously means ``we are at the end of the
+ current file; don't open anything''.
+ (extract): The initial call to match_files now passes
+ the symbol t for the first_file_parsed argument.
+
+2009-09-29 Kaz Kylheku <kkylheku@gmail.com>
+
+ Fixing some gc issues. The test cases were found to bomb
+ with an assertion when run with --gc-debug enabled,
+ due to a garbage-collected object still being used.
+ This was due to the way the main function was structured.
+
+ Also, the stack ``top'' terminology in the gc was stupidly wrong. Leaf
+ function frames are at the stack top, and main is near the bottom.
+ I was thinking of the ``top caller''.
+
+ * Makefile (TXR_DBG_OPTS): New variable.
+ Tests are now run with --gc-debug, which makes them slower,
+ but has much greater chance of trapping gc problems.
+ * extract.l (main): Two variables are now used for determining the
+ stack bottom. We don't know in which order the compiler
+ places local variables into a stack frame. (This is a separate
+ question from that of the direction of stack growth).
+ The call to the init function is now done right away.
+ The argument processing section of main does some processing
+ with GC objects, but the init function was being called afterward,
+ before the list of interned symbols is protected from garbage
+ collection! So with --gc-debug turned on, parts of the interned
+ symbol list were being garbage collected (since the variable
+ has not yet been added to the set of root pointers, which is
+ done in the init function). Also, the use of an unknown --long-option
+ is diagnosed properly now.
+ * gc.c (gc_stack_top): Renamed to gc_stack_bottom, and converted from
+ extern to static.
+ (mark): Follows rename of gc_stack_top to gc_stack_bottom.
+ (sweep): Eliminated the freed variable for counting freed objects,
+ and the associated debug message, which was not useful.
+ Commented why the free list is managed differently when dbg
+ is turned on.
+ (gc_init): New function.
+ * gc.h (gc_stack_top): Declaration removed.
+ (gc_init): Declaration added.
+ * lib.c (min): New macro.
+ (init): Takes two additional arguments which are used to
+ determine the stack bottom. The function first determiens
+ whether the stack grows up or down. Then it takes the
+ greater or smaller of the two potential stack top pointers,
+ based on that. The result is passed go gc_init.
+ * lib.h (init): Declaration updated.
+
+2009-09-28 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 012
+
+ Semantics change of @(until) in @(collect) and @(coll).
+
+ Minor fixes.
+
+ * extract.y (match_line, match_files): The until clauses
+ continue to be processed after the main clauses of the collect
+ or coll (to see the bindings), but are processed before
+ the collection occurs, so that the until will veto
+ the bindings of the last iteration. Moreover, the data
+ positions stays where it is when this happens, and no
+ arrangement is made to match the until material again.
+
+ * txr.1: Tried to document the change.
+
+
+2009-09-27 Kaz Kylheku <kkylheku@gmail.com>
+
+ * txr.1: following proofread, fixed various escaping problems and
+ instances of missing text.
+
+2009-09-26 Kaz Kylheku <kkylheku@gmail.com>
+
+ * lib.c (equal): Bugfixes: wrong fallthrough of FUN case.
+ VEC case must return nil, not break.
+
+2009-09-26 Kaz Kylheku <kkylheku@gmail.com>
+
+ Preparation for some sorting support.
+
+ * extract.y (merge): Renamed to weird_merge.
+ (map_leaf_lists): New functino.
+ (match_file): Follow weird_merge rename.
+ * lib.c (all_satisfy, none_satisfy, string_lt, do_bind2other,
+ bind2other, merge, do_sort, sort): New functions.
+ * lib.h (all_satsify, none_satisfy, string_lt,
+ bind2other, sort): Declared.
+
+2009-09-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 011
+
+ New @(maybe) clause optionally matches (does not fail if none of
+ its clauses match anything).
+
+ New blocks feature: allows a query or subquery to be
+ abruptly terminated by invoking an exit to a named or anonymous
+ block. @(collect) and @(skip) have implicit anonymous blocks now.
+
+ The @(skip) directive takes a numeric argument now, which limits
+ how many lines are searched.
+
+ * Makefile, extract.l, extract.y, extract.h, gc.c, gc.h, lib.c, lib.h,
+ regex.c, regex.h, txr.1, unwind.c, unwind.h: Copyright notice and
+ license text updated or added, and version bumped up to 011.
+ * tests/001/query-1.txr, tests/001/query-2.txr, tests/001/query-3.txr,
+ tests/002/query-1.txr: Assigned to public domain.
+
+2009-09-25 Kaz Kylheku <kkylheku@gmail.com>
+
+ New features:
+ - named blocks;
+ - maybe clause;
+ - optional iteration bound on skip.
+
+ * extract.y: includes added: "unwind.h", <setjmp.h>.
+ (MAYBE, OR): New grammar tokens.
+ (maybe_clause): New nonterminal grammar symbol.
+ (expr): A NUMBER can be an expression now, so that @(skip 42)
+ is valid syntax.
+ (match_files): Support for numeric argument in skip directive
+ to bound the search to a maximum number of lines.
+ Anonymous block established around skip.
+ New directives implemented: maybe, block, accept and fail.
+ Anonymous block established around collect.
+ * txr.1: Documentation updated with new features.
+ * Makefile: new object file unwind.o, and associated rules.
+ * extract.l (yybadtoken): New cases for MAYBE and OR.
+ (grammar): Likewise.
+ * lib.c (block, fail, accept): New symbol variables.
+ (obj_init): New symbols interned.
+ * lib.h (block, fail, accept): Declared.
+ (if2, if3): Macros fixed so test expression is not compared to nil,
+ but implicitly tested as boolean.
+ * unwind.c, unwind.h: New source files.
+
+2009-09-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Stability fixes.
+
+ * extract.y (match_files): Fixed invalid string("-") to
+ string(chk_strdup("-")) which caused a freeing of
+ a non-malloced string at gc finalization time.
+ * regex.c (nfa_state_shallow_free): New function: does not
+ free satellite objects, just the structure itself.
+ (nfa_combine): Use nfa_state_shallow_free instead of nfa_state_free,
+ because the merged state inherits ownership of objects from the state
+ being spliced out.
+ (nfa_state_set): Fix lack of initialization of s.visited member of the
+ state structure.
+
+2009-09-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 010
+
+ A file specs can start with $, which means read a directory.
+
+ Data sources are not into memory at once, but on demand,
+ which can reduce memory for many queries.
+
+ Regular expressions are now compiled once, when the
+ query is parsed.
+
+ Character escapes are now supported in regular expressions,
+ and as a special syntax.
+
+ * extract.l (version): Bumped to 010.
+ (grammar): 8 and 9 are not octal digits; handle all regex
+ backslash escaping in lexical grammar.
+ * extract.y (grammar): Get rid of backslash handling from
+ regex grammar. Lexer returns a REGCHAR for every escaped
+ item. In situations where an operator character is implicily
+ literal, like * in a character class, we use the grammar
+ to include that alongside REGCHAR. Bugfixes: the character ], when not
+ closing a class, is not a syntax error but stands for itself;
+ the character - stands for itself outside of character class;
+ the | character is literal in a character class.
+ * txr.1: Updated version. Documented character escapes.
+
+2009-09-24 Kaz Kylheku <kkylheku@gmail.com>
+
+ Lazy stream list improvement: no extra NIL element caused
+ by end-of-file. Requires push-back support in streams.
+ To avoid introducing a new structure member into streams,
+ we extend the semantics of the label member, and rename
+ it to label_pushback.
+
+ * lib.c (stdio_line_stream, pipe_line_stream,
+ dirent_stream): Follow rename of struct stream member;
+ assert that label is an atom.
+ (stream_get): Check pushback stack first and get item from there.
+ (stream_pushback): New function.
+ (lazy_stream_func): Pull one more item from the stream and
+ use /that/ to decide whether to continue the lazy stream.
+ The extra item is pushed back, if valid.
+ (lazy_stream_cons): Simplified: no hack involving regular cons. Starts
+ the induction by peeking into the stream. If something is there, it is
+ pushed back, and a lazy cons is constructed which will fetch it.
+ (obj_print): Made aware of the pushback, which must be skipped
+ to get to the terminating label.
+ * lib.h (struct stream): Member renamed from label to label_pushback.
+ (stream_pushback): New function declaration.
+
+2009-09-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ Escape syntax in regexes, and text. The
+ standard seven character escapes are supported,
+ namely \a, \b, \t, \n, \v, \f, and \r,
+ as well as hex and octal escapes, plus
+ the code \e for ASCII ESC.
+
+ * extract.l (char_esc, num_esc): New functions.
+ (grammar): New lex cases.
+ * lib.c (obj_print): Support all character escapes in printing.
+ Bugfix: backslash printed as two backslashes, not one.
+
+2009-09-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ * tests/002/query-1.txr: Modified to use $ to scan thread
+ subdirectories.
+ * tests/002/query-1.expected: Updated.
+
+2009-09-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ New COBJ type for wrapping arbitrary C objects into the
+ Lisp-like framework. Compiled regexes are objects now.
+ Regexes in a query are now compiled just once.
+
+ * extract.y (grammar): Regexes compiled while parsing.
+ (match_line): Modify with respect to the abstract syntax
+ tree change, and the interface changes in the match_regex,
+ and search_regex functions.
+ * gc.c (mark_obj, finalize): Handle marking and finalization
+ of COBJ objects.
+ * lib.c (typeof, equal, obj_print): Handle COBJ.
+ (cobj, cobj_print_op): New functions.
+ * lib.h (type_t): New enum element, COBJ.
+ (struct cobj, struct subj_ops): New types.
+ (union obj): New member, co.
+ (cobj, cobj_print_op): New functions declared.
+ * regex.c (regex_equal, regex_destroy, regex_compile, regex_nfa): New
+ functions.
+ (regex_obj_ops): New static struct.
+ (search_regex, match_regex): Interface change. Regex arguments
+ are now compiled regexes. Functions won't handle raw regexes.
+ * regex.h (regex_compile, regex_nfa): New functions declared.
+
+2009-09-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ New feature: file specs that start with $ read directories.
+ Reading from an ``ls'' pipe is too slow.
+
+ Streams and lazy conses implemented. Lazy conses allow us to treat a
+ file or other kind of stream exactly as if it were a list.
+ We can use car and cdr, etc. But only the parts of the list
+ that we actually touch are instantiated on-the-fly by
+ reading from the underlying stream.
+
+ * extract.l: inclusion of <dirent.h> added.
+ * extract.l: inclusion of <dirent.h> added.
+ * extract.y (fpip_closedir): new enumeration in struct fpip,
+ and fpip_noclose removed.
+ (complex_open): Check for leading $, use opendir.
+ (complex_open_failed): New function.
+ (complex_close): Handle fpip_closedir case. Not closing
+ stdin and stdout is handled by explicit comparison now.
+ (complex_snarf): New function, constructs stream of
+ a suitable type, over object returned from complex_close,
+ wraps it in a lazy list.
+ (match_files): Use complex_snarf instead of snarf to get a lazy list.
+ * gc.c: Handle LCONS and STREAM cases.
+ * lib.c (stream_t, lcons_t): New variables holding symbols.
+ (typeof, equal, obj_print): Handle LCONS and STREAM.
+ (car, cdr, car_l, cdr_l, consp, atom, listp): Rewritten to handle
+ LCONS.
+ (chk_strdup, stdio_line_read, stdio_line_write, stdio_close
+ stdio_line_stream, pipe_close, pipe_line_stream,
+ dirent_read, dirent_close, dirent_stream,
+ stream_get, stream_put, stream_close,
+ make_lazycons, lazy_stream_func, lazy_stream_cons): New functions.
+ (stdio_line_stream_ops, pipe_line_stream_ops,
+ dirent_stream_ops): New static structs.
+ (obj_init): Intern new symbols lstream, lcons, and dir.
+ * lib.h (type_t): New enum members STREAM and LCONS.
+ (struct stream, struct stream_ops, struct lazy_cons): New types.
+ (union obj): New members sm and lc.
+ (chk_strdup, stdio_line_stream, pipe_line_stream,
+ dirent_stream, stream_get, stream_put, stream_close,
+ lazy_stream_cons): New function declarations.
+ * regex.c: inclusion of <dirent.h> added
+
+2009-09-23 Kaz Kylheku <kkylheku@gmail.com>
+
+ Version 009
+
+ User-friendly error messages from parser.
+ Fixed -q option.
+
+ * extract.l (version): Bumped to 009.
+ * txr.1: Updated version.
+
+2009-09-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ * Makefile (LIBLEX): New variable.
+ Refer to lex library as -lfl, using variable
+ that can be overridden.
+
+2009-09-22 Kaz Kylheku <kkylheku@gmail.com>
+
+ * extract.h (yybadtoken): New function declaration.
+ * extract.l (yybadtoken): New function.
+ (main): Fixed -q option.
+ * extract.y (grammar): Lots of new error productions, some
+ phrase rules refactored, resulting in much more user-friendly
+ error diagnosis.
+ * txr.1: -q option semantics clarified.