| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
| |
* 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 (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.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
* protsym.c: Regenerated.
|
|
|
|
| |
* txr.1: List tnode and tree types in typeof description.
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (dump-compiled-objects):
Fixed incorrect value of self variable.
|
|
|
|
|
|
|
|
|
|
|
| |
* 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/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.
|
|
|
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
|
| |
* txr.tl (toplevel): In the usage output, a few quasiliterals
should just be literals since nothing is interpolated.
|
|
|
|
|
|
|
|
| |
* 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.tl (static-when): Macro must explicitly reduce
expression to its value.
|
|
|
|
|
|
|
|
|
|
| |
* 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.tl (toplevel): Wrap in compile-only so compiler doesn't
execute it.
|
|
|
|
|
|
|
|
|
|
| |
* 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.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.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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 (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.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.
|
|
|
|
|
| |
* sysif.c (sysif_init): Fix misspelled FNM_EXTMATCH in #ifdef
causing registration of fnm-extmatch being excluded.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
| |
* 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.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.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.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.tl (collect-tags): Generate tags for the
define-option-struct macro, indexing both the long
and short forms.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* 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.tl (collect-tags): Use macrolet to sugar over the
numerous new operator calls.
|
|
|
|
|
|
|
|
|
| |
* 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".
|
|
|
|
| |
* tags.tl: New file.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
* txr.1: Rewriting awkward language in overview of file
compilation.
|
|
|
|
| |
* txr.1: "refers to [a] processing step".
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
| |
* txr.1: doees -> does.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
| |
* 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|