| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
| |
* socket.c (struct dgram_stream): Member sock_connected
renamed to is_connected.
(make_dgram_sock_stream, dgram_flush, sock_connect,
sock_mark_connected): Follow rename.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* stream.c (CONFIG_STDIO_STRICT): New preprocessor symbol.
(enum stdio_op): New enum.
(struct stdio_handle): New member, last_op.
(stdio_switch): New static function, or macro.
(stdio_put_string, stdio_put_char, stdio_put_byte): Indicate
possible switch to write mode via stdio_switch.
(stdio_flush): If the last direction wasn't write,
don't bother doing anything.
(stdio_get_char, stdio_get_byte): Indicate possible switch to
read mode.
(tail_strategy): Set last mode to stdio_none whenever new
FILE * stream is installed.
(make_stdio_stream_common): Initialize last_op member.
|
|
|
|
|
|
|
|
| |
* txr-embedded-arg.txr (stream-positioned-to-right-place):
Call stream-set-prop to mark stream as byte oriented.
This is for the sake of the MinGW port, where reading
binary files with UTF-8 decoding can throw errors about
unsupported Unicode characters (those beyond 0xFFFF).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* stream.c (byte_oriented_k): New keyword symbol variable.
(struct stdio_handle): New member, is_byte_oriented.
(stdio_get_prop): Retrieve the value of is_byte_oriented when
the :byte-oriented property is inquired.
(stdio_set_prop): Map :byte-oriented to the is_byte_oriented
flag.
(stdio_get_char): Do not decode UTF-8 if is_byte_oriented is
set; just read one character.
(make_stdio_stream_common): Initialize is_byte_oriented to 0.
(stream_init): Initialize byte_oriented_k.
* txr.1: Document :byte-oriented property, along
with some clean-up and clarification in the description of
properties.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* genman.txr: Call set-hash-str-limit to set a generous
limit for string hashing, which restores the old hash
values in the HTML document, preserving the validity of
existing URLs.
* hash.c (hash_str_limit, hash_rec_limit): New
static variables.
(HASH_STR_LIMIT, HASH_REC_LIMIT): Preprocessor
symbols removed.
(hash_c_str, equal_hash): Use hash_str_limit.
(gethash_c, gethash, gethash_f, gethash_n, remhash,
hash_equal): Use hash_rec_limit.
(set_hash_str_limit, set_hash_rec_limit): New static
functions.
(hash_init): Register sys:set-hash-str-limit and
sys:set-hash-rec-limit intrinsics.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (gethash_s): Global symbol variable removed,
due to being used only in one place.
(eval_init): Remove registration of make-hash, make-similar-hash,
copy-hash, hash, hash-construct, hash-from-pairs, hash-list, inhash,
sethash, pushhash, remhash, hash-count, get-hash-userdata,
set-hash-userdata, hashp, maphash, hash-eql, hash-equal, hash-keys,
hash-values, hash-pairs, hash-alist, hash-uni, hash-diff, hash-isec,
hash-subset, hash-proper-subset, group-by, group-reduce, hash-update,
hash-update-1, hash-revget, hash-begin, hash-next.
* hash.c (hash_init): Registrations removed from eval_init
moved here.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Here, we augment the cons cells used for the hash chain assoc
lists with one more field to store the hash value. This lets
us grow hash tables without recalculating the hashes, and to
perform hash searches with fewer equality comparisons.
* hash.c (struct hash): assoc_fun and acons_new_c_fun function
pointers get a new cnum hash argument.
(hash_equal_op): Pass cell's hash value to assoc_fun.
(hash_grow): No need to compute each hash entry's hash
code; just pull it out from the cell, and mod it with the
new modulus to get the chain index.
(hash_assoc, hash_assql, hash_acons_new_c,
hash_aconsql_new_c): New static functions.
(make_hash): Store hash_assoc, hash_assql, hash_acons_new_c
and hash_aconsql_new_c in place of assoc, assql,
acons_new_c and aconsql_new_c.
(gethash_c, gethash, gethash_f, gethash_n, remhash):
Pass hash alue to assoc_fun or acons_new_c_fun.
* lib.h (struct cons_hash_entry): New struct type.
(union obj): New member ch.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Curtail traversal of objects and strings.
* hash.c (struct hash): hash_fun member takes int *
parameter now.
(HASH_STR_LIMIT, HASH_REC_LIMIT): New macros.
(hash_c_str): Hash only HASH_STR_LIMIT characters.
(equal_hash): Becomes extern function. Takes pointer-to-int
count argument, which is decremented. Function stops
recursing and returns zero when this hits zero.
(eql_hash): Also takes int * param, for compatibility
with function pointer in struct hash. This parameter
is not used, though.
(cobj_hash_op): Take pointer-to-count parameter,
but ignore it.
(hash_hash_op): Take pointer-to-count parameter,
decrement and check that it has not hit zero,
pass down to equal hash.
(hash_grow, gethash_c, gethash, gethash_f, gethash_n,
remhash): Initialize a counter to HASH_REC_LIMIT and
pass down to hashing function.
(hash_eql): Pass down a pointer to a dummy counter
to eql_hash.
(hash_equal): Initialize a counter to HASH_REC_LIMIT
and pass down to hash_equal.
* hash.h (equal_hash): Declared.
* lib.h (cobj_ops): hash member takes int * parameter.
(cobj_hash_op): Declaration updated with new param.
* struct.c (struct_inst_hash): Takes new int * parameter
for count. Calls equal_hash instead of hash_equal,
eliminating c_num calls; pointer to count is
passed to equal_hash.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This addresses a regression caused by commit
68ca87bc780e25dea1418019161d99727225d1ce, affecting a hundred
releases of TXR from 42 to 141.
The copy_alist call to deeply clone the variable bindings was
carelessly replaced with copy_list, to address the problem
that functions weren't able to mutate outer bindings.
However, the parameter binding code depends on the deep
cloning; it destructively manipulates bindings with the
understanding that they are copies that will be thrown away.
Test case:
@(define f0 (var))
@(end)
@(define f1 (out1 out2 var))
@ (bind out1 `a:@var`)
@ (maybe)
@ (f0 `b:@var`)
@ (end)
@ (bind out2 `a:@var`)
@(end)
@(f1 o1 o2 "z")
This program incorrectly binds o1 and o2 to different
strings, "a:z" and "a:b:z" respectively, because
the f0 pattern function call has the unwanted effect of
mutating var. Expected behavior is that both o1 and
o2 are bound to identical strings, "a:z" and "a:z".
* match.c (h_fun, v_fun): When binding arguments, extend
the environment with new bindings instead of trying to
re-use existing ones, because we do not have a copy of the
binding cells, like we used to when bindings_cp was
produced by a copy_alist call.
|
|
|
|
|
|
| |
* lib.c (drop_while, drop_until): No need to
do default_arg on keyfun, since it is just passed
to pos_if, which takes care of it.
|
|
|
|
|
|
| |
* lib.c (take_until): keyfun not defaulted in list cases.
Needless defaulting of key in vector/string cases, since pos
function already defaults.
|
|
|
|
|
|
|
|
| |
* checkman.txr (check-cblk): New pattern
function, hooked into main scan.
* txr.1: Fixed four instances of .cblk closed
by .cblk instead of .cble.
|
|
|
|
|
|
| |
* txr-embedded-arg.txr: New file.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* txr.c (sysroot_init): Don't print "unable to calculate
sysroot" error message in the fallback case, and
use the absolute path of the executable directory
as the sysroot in this case.
(txr_main): Define static area prefixed by @(txr): header. If
a string is present in this data area then process it as an
argument. Treat the *args* variable carefully. If we use the
stored string as the argument, save the args in orig_args
variable, then later bind *args* to that. In the -e, -p and
related options processing, we bind *args* to the original
list so args are available to the expression being evaluated.
If the expression mutates *args* then we keep the mutated args
whether or not we are processing the stored string.
* txr.1: Documented in new sction, STAND-ALONE
APPLICATION SUPPORT.
|
|
|
|
|
|
|
| |
* txr.c (dirname): New static function.
(sysroot_init): Register txr-path variable.
* txr.1: documented txr-path.
|
|
|
|
|
|
|
|
| |
* eval.c (me_op): We tell a little lie here, by indicating
that the "dwim body" is an expansion of the op operator.
Of course, the entire lambda containing that body
is that expansion. But in error messages, we need something
useful for the user.
|
|
|
|
|
|
|
| |
* parser.l (grammar): Recognize {WS}* between @
and ; (or the legacy #) in comments.
* txr.1: Documentation updated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Let's use our usleep_wrap function which uses nanosleep.
The old sleep can interact with SIGALRM.
* stream.c (tail_calc): Calculate microseconds instead
of seconds.
(sleep): Wrapper for Windows gone.
(tail_strategy): Rename sec variable to usec. Use
usleep_wrap instead of sleep.
* sysif.c (usleep_wrap): Change to extern.
* sysif.h (usleep_wrap): Declaration updated.
|
|
|
|
|
|
|
|
|
|
| |
* stream.c (remove_path): New parameter, throw_on_error.
(stream_init): Update registratino of remove_path intrinsic.
* stream.h (remove_path): Declaration updated.
* txr.1: Updated remove-path documentation to describe
throw-on-error-p parameter.
|
|
|
|
|
|
| |
* txr.c (txr_main): Diagnose unrecognized long option in if/else
statement that handles long options, rather than clumsily in switch for
non-clumping options.
|
|
|
|
|
|
| |
* txr.c (txr_main): Drop setuid privilege as soon
as we know we are just going to exit, before producing any
diagnostic output, like in existing cases.
|
|
|
|
|
| |
txr.1: It wasn't documented that expr in @(next expr)
can produce a stream.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
| |
* txr.1: Replace Expressivity with Expressiveness.
|
|
|
|
| |
* txr.1: Capitalize Boolean everywhere.
|
|
|
|
|
|
|
|
|
|
|
| |
* parser.c (listener_sel_inclusive_p_s): New symbol variable.
(repl): Install current value of *listener-sel-inclusive-p*
variable into linenoise.
(parse_init): Initialize the symbol variable and register
the Lisp special variable.
* txr.1: Documented special variable and selection mode
semantics.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (struct lino_state): New mode flag,
selinclusive.
(lino_set_selinclusive, lino_get_selinclusive): New functions.
(sync_data_to_buf): Adjust rightmost endpoint when
selection is reversed and inclusive mode is in effect,
so that the included character will be visually highlighted.
(yank_sel, delete_sel): Adjust endpoint of selection
if in in inclusive mode.
* linenoise/linenoise.h (lino_set_selinclusive,
lino_get_selinclusive): Declared.
|
|
|
|
|
| |
* txr.c (help): Note the existence of --args and --eargs,
without giving a full description.
|
|
|
|
| |
* txr.1: maybe -> may be.
|
|
|
|
|
|
| |
* txr.1: Just list directives that take Lisp;
drop the details. Point out that no @ is needed
for access to Lisp variable.
|
|
|
|
|
| |
* txr.1: @ is not required on Lisp
variables.
|
|
|
|
| |
* txr.1: Mistake in syntax markup.
|
|
|
|
|
|
| |
* eval.c (eval_init): Use sys_load_s variable
set up earlier in the function instead of redundant call to
intern.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (self_load_path_s): New symbol variable.
(sys_load): Save, set-up and restore self-load-path
around load.
(set_get_symacro): New function.
(eval_init): Register load function using sys_load_s instead
of redundant intern.
* eval.h (set_get_symacro): Declared.
* match.c (v_load): Save, set-up and restore self-load-path
macro.
* parser.c (load_rcfile): Likewise.
* txr.c (txr_main: Set up self-load-path when opening
file.
* txr.1: Documented self-load-path.
|
|
|
|
|
|
|
| |
* txr.1: In Interactive Listener sections, note what
"character under the cursor" means when a vertical cursor
is in effect, and add notes about how the selection semantics
pairs well with that style of cursor.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* sysif.c (at_exit_list): New static variable.
(at_exit_call, at_exit_do_not_call): New functions.
(at_exit_handler): New static function.
(sysif_init): GC-protect at_exit_list.
Register at_exit_handler with C atexit function.
Register intrinsic functions at-exit-call and
at-exit-do-not-call.
* sysif.h (at_exit_call, at_exit_do_not_call): Registered.
* txr.1: Documented.
|
|
|
|
|
|
| |
* lib.c (length_list): Count using cnum
only up to INT_PTR_MAX, then switch to
bignums.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Makefile (termios.o): New object file.
* lib.c (init): Call termios_init.
* lisplib.c (termios_set_entries, termios_instantiate): New
functions.
(lisplib_init): Register new functions in autoload table.
* share/txr/stdlib/termios.tl: New file.
* termios.c, termios.h: New files.
* txr.1: Documented termios.
|
|
|
|
|
|
|
|
|
|
|
| |
* checkman.txr: Check against blank line after .desc.
Fix incorrect pattern, failing to match one-symbol
Function/Operator/Macro headings. This exposes
errors in the document that were previously undetected.
* txr.1: Fix numerous occurrences of blank lines
after .desc, missing .desc, incorrect headings
and other problems.
|
|
|
|
|
|
|
|
|
|
|
| |
* lib.c (rcyc_pop): Just assume that *plist points to a cons
and access the fields directly.
(rcyc_cons): Don't bother with rplacd.
(rcyc_list): Don't bother with set macro.
* regex.c (read_until_match): Defensive coding: locally
ensure that rcyc_pop won't be called on a nil stack,
which will now segfault.
|
|
|
|
|
|
|
|
|
|
| |
* lib.c (cons): When we recycle a cons, it could
be already in the mature generation. In that case,
baby objects stored in its car or cdr violate the
integrity of the heap. We must hint about this
to the garbage collector. Test case:
./txr --gc-debug -p "(list* 'foo (zip
'(a) (repeat '((gensym)))))"
|
|
|
|
|
| |
* gc.c (gc_set): Should say "promote obj to gen 1",
not "to gen 0".
|
|
|
|
|
|
|
|
|
| |
* struct.c (static_slot_ensure): In the case when we grow the
array of static slots, we were allowing chk_manage_vec to
initialize the newly added element. This is wrong, because
it is just a plain assignment, which causes a mature object
to point to a baby object. This bug caused static slots to
contain junk.
|
|
|
|
|
|
|
| |
* struct.c (lookup_slot_load, lookup_static_slot_load): New
functions.
(slot, static_slot): Use auto-load wrappers for lower-level
slot lookup functions.
|
|
|
|
|
|
|
|
|
| |
Improper handling of arguments in certain cases.
Test case: [[flipargs -] 2 1]. Should yield -1;
actual behavior is error.
* lib.c (minusv, divv): Correct test for more
arguments after extracting the leftmost one.
|
|
|
|
|
|
|
|
| |
* stream.c (record_adapter): Use default_bool_arg
rather than tnil. Since rb->include_match ends up passed
directly to read_until_match, which deals with argument
defaulting, we could just store the argument value into the
structure.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
| |
* lib.h (default_arg): Inline function becomes macro,
so we can avoid evaluating the default value expression
when it is not needed.
* lib.c (default_arg): Declaration removed.
|
|
|
|
|
|
|
|
|
| |
* stream.c (flush_stream): Default the argument to
std_output.
(stream_init): Register flush-stream as having one
optional arg.
* txr.1: Updated flush-stream description.
|
|
|
|
|
|
| |
* genvim.txr: Let's not get rid of this just from
the instructions comment, but from the internals.
txl-* replaced with tl-*.
|