summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* * lib.c (sub_list, replace_list, lazy_sub_str, sub_str,Kaz Kylheku2012-02-223-6/+45
| | | | | | | | | 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.
* * eval.c (dwim_loc): del operator's return value is theKaz Kylheku2012-02-223-10/+26
| | | | | | | | 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.
* * lib.c (quicksort): Incorrect pivot selection.Kaz Kylheku2012-02-222-1/+5
|
* * eval.c (del_s): New symbol variable.Kaz Kylheku2012-02-224-37/+116
| | | | | | | | | | | | | | | | | | | (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.
* * lib.c (init): Hash bugfix: added missing call to hash_init.Kaz Kylheku2012-02-222-0/+7
| | | | | Previously this function did nothing, but now it interns some important symbols.
* * hash.c (remhash): Rewrote buggy function.Kaz Kylheku2012-02-222-3/+17
| | | | | | | 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.
* * eval.c (eval_init): Intrinsic bindings for sub, ref, refsetKaz Kylheku2012-02-226-8/+95
| | | | | | | | | | | | | | | | 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.
* * eval.c (eval_init): Third argument of gethash becomes optional.Kaz Kylheku2012-02-212-1/+5
|
* Introducing optional arguments.Kaz Kylheku2012-02-2118-203/+449
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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
* * txr.1: Corrected misleading text in description of outputKaz Kylheku2012-02-192-16/+37
| | | | | variables. Lists do not have to be wrapped in @(repeat)/@(rep). Indexing notation works on strings and vectors.
* * lib.c (sub, ref, replace): New functions.Kaz Kylheku2012-02-196-8/+76
| | | | | | | | | | * 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.
* * match.c (extract_vars): If a brace var is actually anKaz Kylheku2012-02-182-1/+11
| | | | | | expression, then recurse into the expression to find variables. This allows us to do things like @{`@x`} inside a @(repeat) or @(rep).
* Allow braced output variables to actually be arbitrary substitutions.Kaz Kylheku2012-02-186-51/+71
| | | | | | | | | | | | | | * 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.
* * parser.y (o_var): Remove productions from grammar by using exprs_opt.Kaz Kylheku2012-02-182-10/+10
|
* Reimplementation of how TXR decides whether to dump bindingsKaz Kylheku2012-02-175-3/+23
| | | | | | | | | | | | | | | 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.
* * eval.c (dwim_loc): 2012-02-13 fix didn't do it.Kaz Kylheku2012-02-172-6/+9
| | | | | Here is a simpler way. We can let nil be treated as a list with a simple goto. This solves all cases.
* * eval.c (eval_init): Register match-fun.Kaz Kylheku2012-02-168-1/+50
| | | | | | | | | | | | | | | * 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.
* * match.c (match_funcall): Function renamed to match_filter.Kaz Kylheku2012-02-164-3/+11
| | | | | | * match.h (match_funcall): Declaration updated. * filter.c (get_filter): Updated.
* * eval.c (op_catch): Treat the nil exception object as an emptyKaz Kylheku2012-02-163-2/+12
| | | | | | | | | 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.
* TXR Lisp gets exception handling.Kaz Kylheku2012-02-166-1/+153
| | | | | | | | | | | | | | | | | * 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.
* Fix accidental mistake.Kaz Kylheku2012-02-141-1/+1
|
* * eval.c (rangev_func, rangev, range_star_v_func,Kaz Kylheku2012-02-142-6/+14
| | | | | range_star_v): Regression: handle the case where the range is open-ended (to is nil).
* * eval.c (rangev): If a descending range is specified,Kaz Kylheku2012-02-144-4/+56
| | | | | | | | | | | 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.
* * eval.c (rangev_func): Improved termination test. The sequenceKaz Kylheku2012-02-142-5/+13
| | | | not only if it achieves the endpoint, but if it crosses it.
* * eval.c (dwim_loc): Allow assignment to the dwim place when itKaz Kylheku2012-02-132-3/+16
| | | | | | 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.
* Version 57txr-57Kaz Kylheku2012-02-135-4/+52
| | | | | | | | | | * txr.c (version): Bumped. * txr.1: Bumped version and set date. * configure (txr_ver): Bumped. * RELNOTES: Updated.
* * eval.c (subst_vars): Handle lone symbols (not wrappedKaz Kylheku2012-02-135-6/+37
| | | | | | | | | | | | 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.
* * eval.c (dwim_loc, op_dwim): Bugfix: hash indexing requiringKaz Kylheku2012-02-132-2/+7
| | | | at least two arguments, rather than at least one.
* * HACKING: Added note about register save areas, which can contributeKaz Kylheku2012-02-122-1/+8
| | | | to spurious retention.
* * debug.c (breakpoints, last_command): linkage changed to static.Kaz Kylheku2012-02-122-4/+29
| | | | | | | (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.
* * lib.c (lazy_flatten): Bugfix: function was assuming thatKaz Kylheku2012-02-122-7/+18
| | | | | | the input is a list, and not handling the case atom -> (atom) like its non-lazy counterpart. This broke @(next :list expr).
* * lib.c (obj_print): Print control characters in string andKaz Kylheku2012-02-125-14/+35
| | | | | | | | | | | | | | | | | 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.
* Task #11486Kaz Kylheku2012-02-122-0/+8
| | | | * match.c (h_coll): Call consume_prefix in the loop.
* Oops, syntax error.Kaz Kylheku2012-02-121-1/+1
|
* Task #11486: continuation. Take into account base positionKaz Kylheku2012-02-125-13/+33
| | | | | | | | | | | | | | | | 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.
* Task #11486: continuation. Now able to @(skip) throughKaz Kylheku2012-02-113-26/+86
| | | | | | | | | | | | | | | | | | | | 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.
* Task #11486: preparatory refactoring.Kaz Kylheku2012-02-092-187/+181
| | | | | | | | | | | * 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.
* * lib.c (lazy_sub_str): New static function.Kaz Kylheku2012-02-092-8/+78
| | | | | | | (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.
* * genman.txr: Updated.txr-56Kaz Kylheku2012-02-053-4/+12
| | | | | | * 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.
* Version 56Kaz Kylheku2012-02-055-10/+68
| | | | | | | | | | * txr.c (version): Bumped. * txr.1: Bumped version and set date. * configure (txr_ver): Bumped. * RELNOTES: Updated.
* * parser.l: Allow semicolon terminator on hex and octalKaz Kylheku2012-02-053-13/+25
| | | | | | | | | 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.
* * utf8.c (utf8_from_uc, utf8_decode): Some cascaded if tests convertedKaz Kylheku2012-02-052-16/+42
| | | | | | | 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.
* * utf8.c (utf8_from_uc): Bugfix: incorrect condition in characterKaz Kylheku2012-02-042-3/+13
| | | | | | | 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.
* * eval.c (rest_s, op_s): New variables.Kaz Kylheku2012-02-038-22/+211
| | | | | | | | | | | | | | | | | | | | | | | | | | | | (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.
* * utf8.c (utf8_from_uc, utf8_decode): Use upper case for hex constants.Kaz Kylheku2012-02-022-25/+37
| | | | | | | 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.
* * utf8.c (utf8_to_uc, utf8_encode): Do not encode surrogate codeKaz Kylheku2012-02-022-8/+26
| | | | | | | 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.
* * txr.1: UTF-8 handling clarified.Kaz Kylheku2012-02-022-12/+20
|
* * utf8.c (utf8_from_uc, utf8_decode): Impose a minium value on theKaz Kylheku2012-02-023-8/+38
| | | | | | | decoded character based on which UTF-8 case it is from. This rejects overlong forms. * utf8.h (struct utf8_decoder): New member, wch_min.
* * txr.vim: Move error match before other cases and simplify.Kaz Kylheku2012-02-022-1/+7
| | | | Comment are colorized properly again.
* This test case would have caught the prior regression.Kaz Kylheku2012-02-025-0/+67
| | | | | | | | | | * 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.