summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* configure: allow variables to contain quotes.Kaz Kylheku2020-03-251-1/+1
| | | | | | | | | * configure: When generating the assignment that stores the value of the command line variable into the corresponding shell variable, interpolate $val between single quotes in such a way that single quotes occurring in $val are replaced by the pattern '\''. Thus, variables may contain any character whatsoever.
* configure: remove C diagnostic options under C++.Kaz Kylheku2020-03-251-0/+34
| | | | | | | * configure (cplusplus): New variable. Check ccname and cc for signs of C++; if so, set the new variable to 'y'. If the variable is set, then filter C-specific options out of diag_flags.
* Version 234.txr-234Kaz Kylheku2020-03-256-608/+669
| | | | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated. * protsym.c: Regenerated.
* doc: typeof: missing BST types.Kaz Kylheku2020-03-241-0/+6
| | | | * txr.1: List tnode and tree types in typeof description.
* open-process: fix regression.Kaz Kylheku2020-03-241-1/+1
| | | | | | | TXR 228, which introduced open-subprocess, broke open-process. * stream.c (open_process): Pass args correctly as the fourth argument of open_subprocess, rather than the third.
* New contains function: near alias of search.Kaz Kylheku2020-03-234-1/+23
| | | | | | | | | | | | Harmonizes with starts-with and ends-with. * eval.c (eval_init): Register contains intrinsic. * lib.c (contains): New function. * lib.h (contains): Delared. * txr.1: Documented.
* method: use new dynamic args to avoid consing list.Kaz Kylheku2020-03-231-9/+10
| | | | | | | | * struct.c (method_args_fun): env parameter is now a dynamic args object. Code adjusted accordingly. (method): Duplicate args into a dyn_args object instead of a list. Because a dyn_args has a car and cdr field, we can eliminate the two conse as well.
* umethod: use new dynamic args to avoid consing list.Kaz Kylheku2020-03-233-7/+18
| | | | | | | | | | | | | * args.c (args_cat): New function. * args.h (args_cat): Declared. * struct.c (umethod_args_fun): env parameter is now a dynamic args object. Code adjusted accordingly. (umethod): Duplicate the args into a dynamic args object instead of consing up a list and also eliminate the temporary cons since we can pass the additional argument using the car field of the dynamic args.
* apf and ipf: take arguments that are inserted.Kaz Kylheku2020-03-222-9/+54
| | | | | | | | | | | | | | The apf and ipf functions now take arguments in addition to the function that is being wrapped. If specified, these arguments are inserted to the left the applied arguments. * eval.c (do_args_apf, do_args_ipf): New static functions. (apf, ipf): Use do_args_apf and do_args_ipf, respectively, for handling the case when arguments are present. Passing the stored arguments is done with the help of the new DARG type, instead of consing up a list. * txr.1: Documented new arguments of apf and ipf.
* New type args with DARG type code.Kaz Kylheku2020-03-227-2/+53
| | | | | | | | | | | | | | | | | | | | | | | | | | | An object of args type captures into the heap the "struct args" argument list that normally appears only on the stack. Such an object also has space for a car and cdr field, which can come in handy. * args.c (dyn_args): New function: hoist a struct args * into an args heap object. * args.h (dyn_args): Declared. * gc.c (finalize, mark_obj): Handle DARGS type code. * hash.c (equal_hash): Handle DARG via eq equivalence. * lib.c (args_s): New symbol variable. (code2type): Map DARG to args symbol. (equal): Handle DARG type, using eq equivalence for now. (obj_init): Initialize args_s with interned symbol. * lib.h (enum type, type_t): New type code, DARG. (struct dyn_args): New struct. (union obj): New member, a of type struct dyn_args. * txr.1: Documented args type under typeof.
* dump-compiled-objects: wrong self name.Kaz Kylheku2020-03-221-1/+1
| | | | | * share/txr/stdlib/compiler.tl (dump-compiled-objects): Fixed incorrect value of self variable.
* hash-uni: two new arguments for projecting values.Kaz Kylheku2020-03-193-10/+31
| | | | | | | | | | | * hash.c (hash_uni): New functional argument map1fun and map2fun. If present, values from hash1 and hash2, respectively, are projected through these functions. (hash_init): hash-uni registration updated. * hash.h (hash_uni): Declaration updated. * txr.1: Documented new arguments.
* linenoise: major delete ops now yank to clipboard.Kaz Kyheku2020-03-191-19/+41
| | | | | | | | | | | | | | | | | | | | | | * linenoise/linenoise.c (yank): New static function, made out of yank_sel. (yank_by_ptr): New static function. (yank_sel): Now wrapper for yank. (edit_delete): Call yank_sel here if selmode is on, rather than having the caller do it. This fixes a bug: the Ctrl-D handler was doing this, but not the Del key handler. (edit_delete, edit_delete_prev_all, edit_delete_to_eol, edit_delete_line): All these operations now yank the deleted text into the clipboard. (edit_delete_prev_word): Likewise, and bugfix here: undo was not being recorded for the clipboard deletion, only for the word deletion. The semantics here is that if a selection is in effect, only the selection goes into the clipboard, not the word.now the deleted selection goes into the clipbo (edit): Ctrl-D handler now doesn't call yank_sel, relying on edit_delete to do it. * txr.1: Documentation updated.
* gc: small memory support.Kaz Kylheku2020-03-182-0/+20
| | | | | | | | | | | * configure (small_mem): New variable. Provide help text and show default value of --small-mem option. Generate CONFIG_SMALL_MEM in config.h. * gc.c (HEAP_SIZE, CHECKOBJ_VEC_SIZE, MUTOBJ_VEC_SIZE, FULL_GC_INTERVAL, FRESHOBJ_VEC_SIZE, DFL_MALLOC_DELTA_THRESH): Define conservative values of these constants if CONFIG_SMALL_MEM is in effect.
* internals: rename misnamed curry_* functions.Kaz Kyheku2020-03-1710-92/+92
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The various curry_xx_yy functions perform partial application, not currying. The curry prefix is being renamed to pa (partially apply). * lib.c (remq_lazy, remql_lazy, remqual_lazy, tree_Find): Updated. (do_curry_12_1, do_curry_12_1_v, do_curry_12_2, do_curry_123_1, do_curry_123_23, do_curry_123_2, do_curry_123_3, do_curry_1234_1, do_curry_1234_34): Renamed to do_pa_12_1, do_pa_12_1_v, do_pa_12_2, do_pa_123_1, do_pa_123_23, do_pa_123_2, do_pa_123_3, do_pa_1234_1, do_pa_1234_34. (curry_12_1, curry_12_1_v, curry_12_2, curry_123_1, curry_123_23, curry_123_2, curry_123_3, curry_1234_1, curry_1234_34): Renamed to pa_12_1, pa_12_1_v, pa_12_2, pa_123_1, pa_123_23, pa_123_2, pa_123_3, pa_1234_1, pa_1234_34. (transposev, do_juxt): Updated. * lib.h: Declarations renamed. * eval.c (subst_vars, qquote_init, expand_catch, weavev): Updated. * filter.c (get_filter, build_filter_from_list, filter_string_tree, filter_init): Updated. * match.c (tx_subst_vars, do_txeval, v_freeform, v_bind, v_throw, v_deffilter, v_assert, h_assert): Updated. * parser.y (gather_clause): Updated. * regex.c (regex_range_full_fun, regex_range_left_fun, regex_range_right_fun, regex_range_search_fun): Updated. * stream.c (open_files, open_files_star): Updated. * txr.c (txr_main): Updated. * unwind.c (me_defex): Updated.
* Support base64url encoding.Kaz Kyheku2020-03-173-20/+208
| | | | | | | | | | | | | | | | | | | | | | | | | | * filter.c (tobase64url_k, frombase64url_k): New keyword symbols variables. (base64_stream_enc_impl): New static function, derived from base64_stream_enc. (base64_stream_enc): Now a wrapper for base64_stream_enc_impl. (base64url_stream_enc, base64url_encode): New functions. (base64_stream_dec_impl): New static function, derived from base64_stream_dec. (base64-stream_dec): Now a wrapper for base64_stream_dec_impl. (get_base64_url_char, b64url_code): New static functions. (base64url_stream_dec, base64_url_decode, base64url_decode_buf): New functions. (filter_init): Intern new keyword symbols, initializing the corresponding variables, register new :frombase64url and :tobase64url filters and intrinsic functions base64url-stream-enc, base64url-stream-dec, base64url-encode, base64url-decode and base64url-decode-buf. * filter.h (base64url_stream_enc, base64url_stream_dec, base64url_encode, base64url_decode, base64url_decode_buf): Declared. * txr.1: Documented.
* tags: useless use of quasiliteral.Kaz Kylheku2020-03-141-2/+2
| | | | | * txr.tl (toplevel): In the usage output, a few quasiliterals should just be literals since nothing is interpolated.
* tags: fix reversed test for ftw-actionretval.Kaz Kylheku2020-03-141-1/+1
| | | | | | | | * tags.tl (toplevel): We need to push directories into the skiplist when we don't have FTW_ACTIONRETVAL, indicated by ftw-actionretval being zero. If ftw-actionretval is nonzero, so is ftw-skip-subtree, which completely takes care of the skipping of subdirectories.
* tags: missing eval in macro.Kaz Kylheku2020-03-111-1/+1
| | | | | * tags.tl (static-when): Macro must explicitly reduce expression to its value.
* compile-file: propagate permissions for hash bang programs.Kaz Kyheku2020-03-102-4/+39
| | | | | | | | | | * share/txr/stdlib/compiler.tl (propagate-perms): New function. (compile-file-conditionally): If the source file is a hash bang script, then call propagate-perms just before closing the streams. * txr.1: Documented the permission propagation.
* tags: support compilation.Kaz Kylheku2020-03-101-41/+42
| | | | | * tags.tl (toplevel): Wrap in compile-only so compiler doesn't execute it.
* tags: don't scan files twice.Kaz Kylheku2020-03-091-67/+65
| | | | | | | | | | * tags.tl (collect-tags): Snarf the file as a string from which we can make a string byte input stream suitable for parsing. Having that string, we can handle hash bang by detecting it and commenting it out with a semicolon. We obtain the lines by splitting the string. When calling read, we pass the path as the name argument, so error messages still use the correct file name.
* hash: bugfix: maintain counts in weak processing.Kaz Kylheku2020-03-091-4/+10
| | | | | | * hash.c (do_weak_tables): Update the count field of each weak hash to account for the entries that get removed by expiry. Also, loop variable moves into a tighter scope.
* Version 233.txr-233Kaz Kylheku2020-03-086-1063/+1126
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated.
* strings: bugfix: broken inequality comparisons.Kaz Kylheku2020-03-072-5/+14
| | | | | | | | | | | | | | | | | | | | | Inequality comparisons of strings and symbols are broken due to assuming that cmp_str returns -1 or 1. cmp_str uses the C library function wscsmp, and is exposed as the Lisp function cmp-str. That is correctly documented as returning a negative or positive value. But a few function in lib.c assume otherwise. On newer glibc's, at least on x86, it seems that wcscmp does return 1, 0 or -1 consistently; perhaps the newer optimized assembly routines are ensuring this. It shows up on older glibc installations where the C version just returns the difference between the mismatching characters. * lib.c (cmp_str): Now returns -1, 0 or 1. * txr.1: Specify the stronger requirements on the cmp-str return value, adding a note that older versions conform to a weaker requirement.
* genvim: colon isn't keyword constituent any more.Kaz Kylheku2020-03-071-1/+1
| | | | | | | | | | | * genvim (iskeyword): Remove the : character from being a symbol constituent. This doesn't work well with tags, which are oblivious to packages. We would not only have to make tags.tl deal with packages, but in the tags file we would have to duplicate every entry with and without the package prefix. It doesn't make a lot of sense. Plus, packages themselves are tags, and if we put the cursor on the package part of a qualified symbol, we can jump to the package.
* tags: add --exclude option.Kaz Kylheku2020-03-071-9/+33
| | | | | | | | | | | | | * tags.tl (tags-opts): Cumulative exlude option added. (ftw-actionretval, ftw-continue, ftw-skip-subtree): These variables are missing if we are not on Glibc, so we define them as zero. These definitions help us take advantage of FTW_ACTIONRETVAL to skip recursing into exluded subtrees. (static-when): New macro. (toplevel): Implement exclude option. Skipping directories on platforms whose nftw function doesn't have FTW_ACTIONRETVAL is simulated by keeping a dynamic skip list, which is intelligently purged to keep it short.
* fnmatch: fix missing fnm-extmatch.Kaz Kylheku2020-03-071-1/+1
| | | | | * sysif.c (sysif_init): Fix misspelled FNM_EXTMATCH in #ifdef causing registration of fnm-extmatch being excluded.
* getopts: new feature: cumulative options.Kaz Kyheku2020-03-063-14/+82
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | An option declared as (cumul <type>) indicates that it is of type <type>, and that multiple occurrences of the option produce values that are accumulated into a list. The accumulation is in reverse order: the rightmost occurrence ends up the first in the list. * lisplib.c (getopts_set_entries): Add cumul to list of interned symbols, so that the getopts.tl code isn't mistakenly working with sys:cumul. * share/txr/stdlib/getopts.tl (opt-parsed): New slot, cumul. (opt-desc basic-type p, opt-desc list-type-p, opt-desc cumul-type-p): New methods. (opt-desc check): Rework type validity check using the new methods. (opt-parsed convert-type): Support 'cumul type by instantiating an opt-parsed object for the wrapped type, and stealing its converted argument into the current object, and setting the cumul flag. (opts add-opt, option-base add-opt): Support options that have the cumul flag set by accumulating list values. The code is different due to different amounts of encapsulation. The opts structure stores the raw opt-parsed objects, whereas option-base just takes the decoded values. (opthelp): Parse through the (cumul ...) type syntax, so cumulative options are printed in the help text the same way as if they were non-cumulative. * txr.1: Documented.
* getopts: bugfix in short option processing.Kaz Kyheku2020-03-061-6/+6
| | | | | | | | * share/txr/stdlib/getopts.tl (sys:opt-processor parse-shorts): There is a scoping mixup here with the opts argument shadowed by a same-named lexical variable, causing a referential mixup. Also fixed bad indentation.
* tags: handle option struct slots with more careKaz Kylheku2020-03-051-2/+4
| | | | | | | | * tags.tl (collect-tags): In proccessing a define-option-struct, don't record a tag for a long or short option that is nil. Each option definition defines only one slot. If both a long and short option are present (non-nil), then the long option names the slot.
* tags: implement merge with merge function.Kaz Kylheku2020-03-051-2/+2
| | | | | | | * tags.tl (write-tagfile): Since we can assume that the tags file is sorted, and the tags coming into this function are likewise sorted, we can just merge the sorted lists. Then, we don't have to sort the tags list a second time.
* tags: fix off-by-one line numbers for hash bang.Kaz Kylheku2020-03-051-1/+2
| | | | | | | | | * tags.tl (collect-tags): For hash-bang files, pop the dummy blank line that we inserted at the head of the line list to obtain 1-based numbering. If the parser starts working ater the #! line, it means the second line is 1, which is the same as zero-based numbering, so we can lose the dummy entry and all is well.
* tags: handle define-option-struct.Kaz Kylheku2020-03-051-0/+6
| | | | | | * tags.tl (collect-tags): Generate tags for the define-option-struct macro, indexing both the long and short forms.
* tags: add option processing.Kaz Kylheku2020-03-051-11/+46
| | | | | | | | | | | | * tags.tl (tag-opts): New option struct. (orig-tag): New struct. (write-tagfile): Take option struct as argument. Implement merge and append options. (toplevel): Parse arguments and provide usage text. Default to processing the current directory when no non-option arguments are given. Allow files that don't end in .tl, if they are explicititly specified; but directories are searched only for .tl files.
* tags: reduce repetition of tag construction with macrolet.Kaz Kylheku2020-03-041-76/+50
| | | | | * tags.tl (collect-tags): Use macrolet to sugar over the numerous new operator calls.
* tags: eliminate duplicated text methods.Kaz Kylheku2020-03-041-10/+13
| | | | | | | | | * tags.tl (tag): New slot, type; new method, text. (fun-tag, var-tag, struct-tag, type-tag): Override type slot with appropriate value ("f", "v", "s", "t"), and remove text method. (slot-tag): Override type; keep text method, and interpolate typee instead of hard-coded "m".
* TXR Lisp tag generation utility.Kaz Kylheku2020-03-041-0/+150
| | | | * tags.tl: New file.
* less: fix broken semantics for symbols.Kaz Kyheku2020-03-042-6/+82
| | | | | | | | | | | | | | | | | | | | | | | If a and b are symbols, then it's possible for (equal a b), (less a b) and (less b a) to all yield false, which makes no sense. This happens in the case when a and b are distinct symbols (thus not equal), and have the same name (so the stringwise comparison finds them to be equal and hence neither less than the other). * lib.c (less): Implement more complicated requirements for comparing symbols. If two distinct symbols have the same name, then one must be less than the other, and we use other information to determine this. If at least one of them has a home package, then we go by comparing packages: package names are compared as strings, and a missing package is less than a present package. If both same-named symbols have no package, then they are compared as pointers. * txr.1: Documented the properties of less as an antisymmetric, antireflexive and transitive relation. Documented the relationship with equal. Documented the treatment of symbols. Cleaned up some wording.
* doc: better wording on lisp compilation.Kaz Kylheku2020-02-291-16/+11
| | | | | * txr.1: Rewriting awkward language in overview of file compilation.
* doc: missing article under Lisp Compilation.Kaz Kylheku2020-02-291-1/+1
| | | | * txr.1: "refers to [a] processing step".
* New function: assq and rassq.Kaz Kyheku2020-02-246-12/+63
| | | | | | | | | | | | | | | | | | | | | TXR Lisp is henceforth a dialect in which (cdr (assq key a-list)) works exactly as shown, without substitution of assql or assoc. * eval.c (eval_init): Register assq and rassq intrinsics. * lib.c (assq, rassq): New functions. * lib.h (assq, rassq): Declared. * txr.1: Documented. * tests/012/ashwin.tl: New file. * tests/012/ashwin.expected: New file.
* New functions: meq, meql and mequal.Kaz Kylheku2020-02-224-0/+69
| | | | | | | | | | * eval.c (eval_init): Register meq, meql an mequal intrinsics. * lib.c (meq, meql, mequal): New functions. * lib.h (meq, meql, mequal): Declared. * txr.1: Documented.
* listener: if no new lines, don't save history.Kaz Kylheku2020-02-183-1/+7
| | | | | | | | | * linenoise/linenoise.c (lino_have_new_lines): New function. * linenoise/linenoise.h (lino_have_new_lines): Declared. * parser.c (hist_save): Do nothing if lino_have_new_lines returns false.
* listener: save history early with :save command.Kaz Kylheku2020-02-182-15/+36
| | | | | | | | | * parser.c (hist_save): New static function. (repl): Logic for savingn history when terminating has moved into hist_save. New save command also calls this function. * txr.1: Documented.
* doc: spelling under file-place-bufKaz Kylheku2020-02-181-1/+1
| | | | * txr.1: doees -> does.
* listener: append to .txr_history instead of clobbering.Kaz Kyheku2020-02-184-10/+60
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch addresses the problem of history loss that occurs when a user juggles multiple TXR sessions that all clobber the same history file. * linenoise/linenoise.c (struct lino_state): New member, loaded_lines, keeping track of how many of the lines in the history came from loading the history file. Lines between [0] and [loaded_lines - 1] are loaded lines. New lines occur between [loaded_lines] and [history_len - 1]. (lino_hist_add): Reset loaded_lines to zero when creating history for the first time. Not really necessary since the structure starts zero-filled. When a line of history is erased, then it must be a loaded line, unless loaded_lines is zero. Thus, then decrement loaded_lines to account for a loss of a loaded line, but don't decrement below zero. (lino_hist_set_max_len): Setting the max length can cause history to be trimmed, so we must adjust loaded_lines to account for any loaded lines that get discarded. (lino_hist_save): Takes a new parameter which indicates whether to just save the new history by appending it to the given file, or to overwrite the file with the entire history. In either case, once we save the history, we assume that all of our lines are loaded lines and set loaded_lines to hist_len. In the future, this last step will help implement incremental saving mid-way through a sesssion. (lino_hist_load): Error out if there is already a history. With this loaded_lines logic, it really wouldn't make sense to read history more than once. After loading, set loaded_lines to hist_len. * linenoise/linenoise.h (enum lino_file_mode): New enumeration lino_append. (lino_hist_save): Declaration updated. * parser.c (repl): Implement new history saving protocol. The history file is read using a temporary instance of linenoise, which has the effect of trimming it to the required number of lines. This is written to a temporary file, to which the newly entered lines are appended, and which is finally renamed to replace the history file. (lino_mode_str): Add "a" entry corresponding to lino_append. (lino_open): Do the fchmod in the lino_append case also. * txr.1: Documented the new handling of the history file.
* cygwin: use spawnvp for run and sh.Kaz Kylheku2020-02-172-48/+102
| | | | | | | | | | | | | | | | | | | | | | | | We revive the dead _wspawnvp code that was used on MinGW, a platform that has not been supported for years, adapting it for Cygwin. * configure: Correct the _wspawnlp test; it should have been testing for _wspawnvp function, which is what is is actually used by the matching code. Moreover, the broken test was calling _wspawnlp with _wspawnvp style arguments. Anyway, this is moot because we will never detect this function in the foreseeable future. More importantly, adding a test for spawnvp, which exists on Cygwin. * stream.c: Include the <process.h> header if HAVE_WSPAWN or HAVE_SPAWN. This was missing before; how did the _wspawnvp call ever compile? (w_spawnvp): New static function. (run): spawn version now calls either _wspawwnvp or w_spawnvp if that is not available. We test for HAVE_WSPAWN or HAVE_SPAWN first, before HAVE_FORK_STUFF, so that we use the spawn function preferentially. On Cygwin, we have the fork stuff.
* crypt: refactor hardening a bit.Kaz Kylheku2020-02-151-17/+22
| | | | | | | | | | * sysif.c (validate_salt): Take const wchar_t * argument instead of val. Set errno and return null pointer instead of throwing, so we don't have two places that throw an exception related to crypt. (crypt_wrap): Put exception at the end. Return hash only if validate_salt returns a non-null pointer and so does crypt. In all other cases, reach exception call.
* crypt: harden against crashes.Kaz Kylheku2020-02-141-3/+60
| | | | | | | | | | | | | | | | | | | | The crypt function on glibc, and maybe other platforms, simply crashes when given a perfectly valid salt string that contains invalid salt syntax. This is nasty; we want TXR Lisp library functions to be robust; bringing down the image is not acceptable. Also, crypt may return a null pointer. glibc's crypt does this in certain situations, like when the "2a" (Blowfish) algorithm is specified when not available. We are not checking for this null return, in which case the ensuing crash is our fault. * sysif.c (salt_char_p, validate_salt): New functions. (crypt_wrap): Validate the salt via validate_salt. Check the return value from crypt/crypt_r; if null, then throw an exception that incorporates the errno information.