| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
| |
* linenoise/linenoise.c (edit): Implemented.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (scan_match_fwd, scan_fwd,
edit_move_matching_paren): New functions.
(edit): New Ctrl-] command implemented using
edit_move_matching_paren.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (edit_delete_line): New
static function.
(edit): New Ctrl-K extended command case implemented using
edit_delete_line.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (edit_delete_prev_all):
In multi-line mode, delete only to beginning of physical
line, not the entire logical line.
Also, detect noop cases and don't do record undo
or produce any effect.
(edit_delete_to_eol): New function.
(edit): Use edit_delete_to_eol function for Ctrl-K instead of
inline code.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Sometimes edits don't do anything, and so the undo item
recorded for them is superfluous. When undo is used
nothing appears to happen for a turn.
We use two strategies: detect the noop change
and avoid recording the undo (or doing anything),
or else detecting the noop undo afterward and
removing it from the undo stack.
* linenoise/linenoise.c (remove_noop_undo): New static
function.
(edit_delete, edit_backspace): Remove noop undo.
(edit_delete_prev_word): Don't record undo, move
memory or update vars if there is no word to delete.
(edit_in_editor): Remove noop undo.
(edit): For Ctrl-T, don't record undo or do anything
other than clear the selection if the cursor
is leftmost already.
|
|
|
|
|
|
| |
* linenoise/linenoise.c (restore_undo): If an undo
item wants to produce a completely blank line,
then discard and skip it.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Undo now works intuitively. It does not perform invisible
jumps among history items, restoring instead just the history
for the given line being edited.
* linenoise/linenoise.c (LINENOISE_MAX_UNDO): Raised from 32
to a more generous 200. Since edits are per-history line,
it makes sense to allow a lot more.
(delete_undo): New static function.
(free_undo): Static function removed to free_undo_stack.
Trivial loop around delete_undo.
(record_undo): Do not record the current history index; all
edits are assigned the index INT_MAX. INT_MAX is an indicator
that the edits do not have an assigned history line. The
decision of where to assign them depends on whether history
navigation is used to move to another history line or
Enter is used to submit an edited line.
A stinky part of the history trimming code is rewritten
simply in terms of delete_undo.
(record_triv_undo): Suppress a trivial item only if
the top item belongs to the same history line, or is
nonspecific (INT_MAX).
(undo_pop): Static function removed.
(restore_undo): Rewritten to look for the topmost item
specific to the current history line or an INT_MAX nonspecific
item. Removes undo items for expired lines as it goes.
(undo_subst_hist_idx): New static function.
(renumber_undo_hist): Renamed to undo_renumber_hist_idx.
(edit_history_next): Do not record an undo; history navigation
is no longer considered an edit. Rewrite all the INT_MAX
entries in the undo stack with the current history index,
permanently associating the undo items with the history line
away from which we are navigating.
(edit): Do not record an undo for a line terminating with
Enter. It is not an edit action. When leaving the funtion,
renumber any INT_MAX entries in the undo history to history
index zero. Thus edits to any line which is submitted via
Enter will (correctly) not be associated with that line,
which was not in fact edited, but with the new line that was
submitted.
(lino_cleanup): Follow rename of free_undo.
(lino_hist_add): Follow rename of undo_renumber_hist_idx.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This has to be done because each time a history line is added,
or taken back, the relative numbers change.
* linenoise/linenoise.c (undo_pop): New static function.
(restore_undo): Skip undo items which refer to lines of
history which no longer exist. Restore history[0] also.
(renumber_undo_hist): New static function.
(edit): When leaving, and removing the extra history
line representing the current line, renumber the undo
items by -1.
(lino_hist_add): After adding a line, bump the undo item
history indices by 1.
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (edit): Changing most returns
to goto out. We have common clean-up to do, namely
removing the last history item which represents the
current line. This fixes a bug: not removing the
history line in the Ctrl-C case.
|
|
|
|
|
|
|
|
|
|
| |
If we don't move the cursor to the end, then
the shell prompt (Ctrl-Z) or next REPL prompt (Ctrl-C)
comes in the middle of the previous input.
* linenoise/linenoise.c (edit): in multi-line mode,
move to end of input on Ctrl-C. On Ctrl-Z suspend,
do the same, but save and restore the position.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (LINENOISE_MAX_UNDO): New preprocessor
symbol.
(struct lino_state): New member, undo_stack.
(struct lino_undo): New struct type.
(free_undo, record_undo, record_triv_undo, restore_undo):
New static functions.
(edit_insert): Record trivial undo item with record_triv_undo.
(edit_insert_str, edit_history_next, edit_delete,
edit_backspace, edit_delete_prev_all, edit_delete_prev_word,
edit_in_editor): Record undo item.
(edit): Record undo item before Ctrl-R history recall and
Ctrl-T twiddle. Also record one final undo item upon Enter, as
well as Ctrl-C. New Ctrl-O command to undo.
(lino_copy): Do not copy undo_stack, to prevent double
freeing.
(lino_free): Free the undo history.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (struc lino_state): New member,
clip, sel, end, dsel, dend, need_refresh, selmode.
(sync_data_to_buf): Update the sel and end members
of the structure based on dsel and dend, the way
pos is being updated from dpos.
(refresh_singleline, refresh_multiline): If visual selection
mode is in effect, show the selected region in inverse video.
(update_sel, clear_sel, yank_sel, delete_sel):
New static function.
(edit_insert): Delete the selection before inserting, so that
the character appears to replace the selection.
Set need_refresh flag instead of calling refresh_line.
(edit_insert_str): New static function. Inserts string,
replacing existing selection, if any.
(paren_jump, edit_move_left, edit_move_right, edit_move_home,
edit_move_end, edit_history_next): Set new
need_refresh flag instead of calling refresh_line directly.
(edit_delete): If selection is in effect, just delete the
selection and return. Set need_refresh flag instead
of calling refresh_line.
(edit_backspace): If selection is in effect, and selection
is not inverted (cursor is to the right of selection)
then just delete the selection. Otherwise delete the
selection, and perform the backspace. Set need_refresh flag
instead of calling refresh_line.
(edit_delete_prev_word): Delete the selection and the word
before the selection. Set need_refresh flag
instead of calling refresh_line.
(edit_in_editor): Set need_refresh_flag instead of
calling refresh_line, and cancel visual selection mode.
(edit): Clear selection mode on entry. Update the selection
variables on each loop iteration. Honor the need_refresh
flag. New commands implemented: Ctrl-S, Ctrl-Q, Ctrl-X Ctrl-Q.
Some commands need to set need_refresh flag.
Some need to cancel selection mode.
(lino_copy): Set the clip member of the cloned structure
to null, otherwise there will be a double free of the
clipboard buffer.
(lino_cleanup): Free the clipboard and null out the pointer.
* txr.1: Documented visual select.
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (sync_data_to_buf): prompt argument
removed. The value passed is always l->mlmode, and that
is what it indicates.
(complete_line, complete_line, sync_data_to_buf,
refresh_multiline, edit_insert): Updated calls.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (eval_init): Registered flatcar* intrinsic.
* lib.c (lazy_flatcar_scan, lazy_flatcar_func):
New static functions.
(lazy_flatcar): New function.
* lib.h (lazy_flatcar): Declared.
* txr.1: Documented, also touching flatten documentation.
|
|
|
|
|
|
|
|
| |
* parser.c (provide_atom): New static function.
(repl): Register provide_atom with linenoise as
atom callback.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (struct lino_state): New members
atom_callback and ca_ctx.
(lino_set_atom_cb): New function.
(edit): Ctrl-X Ctrl-A invokes atom callback, and inserts
returned string.
* linenoise/linenoise.h (lino_atom_cb_t): New function pointer
typedef.
(lino_set_atom_cb): Declared.
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (eval_init): Register flatcar intrinsic.
* lib.c (flatcar): New function.
* lib.h (flatcar): Declared.
* txr.1: Documented.
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (edit): Ctrl-X Ctrl-W,
or Ctrl-X w, with an optional number in between,
cause a word from the previous line to be inserted.
* txr.1: Documented.
|
|
|
|
|
| |
* parser.c (repl): Configure the .tl suffix
in the linenoise object.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is so that when a command line is edited in an external
editor, editors can choose appropriate syntax highlighting
mode based on the suffix.
* linenoise/linenoise.c (struct lino_state): New member,
suffix.
(edit_in_editor): If we have the mkstemps function, then
use it to create a suffixed name.
(lino_set_tempfile_suffix): New function.
* linenoise/linenoise.h (lino_set_tempfile_suffix): Declared.
|
|
|
|
|
|
| |
* configure: Add check for mkstemps.
(HAVE_MKSTEMPS): New preprocessor symbol,
conditionally deposited into config/config.h
|
|
|
|
| |
* txr.1: Description wrongly refers to getpwuid.
|
|
|
|
|
|
|
|
|
|
| |
* parser.c (load_rcfile): Use path-exists-p for the existence
check. Since that doesn't throw, it's outside of the
catch section. Use path-private-to-me-p to impose a security
check on the profile file. If an error exception is caught,
show the details.
* txr.1: Added notes about security check.
|
|
|
|
|
|
|
|
|
| |
* lisplib.c (path_test_set_entries: "path-private-to-me-p"
addred to name array.
* share/txr/stdlib/path-test.tl (path-private-to-me-p): New
function.
* txr.1: Documented path-private-to-me.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* configure (have_grgid): New variable.
New tests added for getgrent and the rest.
(HAVE_GRGID, HAVE_GRGID_R): New preprocessor symbols
conditionally deposited into config/config.h.
* sysif.c (group_s, mem_s): New global symbol variables.
(setgrent_wrap, endgrent_wrap, fill_group, make_grstruct,
get_grent_wrap, getgrgid_wrap, getgrnam_wrap): New static
functions.
(sysif_init): New global symbol variables initialized.
New group struct type instantiated.
Intrinsic functions setgrent, endgrent, getgrent,
getgrgid and getgrnam registered.
* txr.1: Documented group structure and functions.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Now that we have a multi-line mode, it no longer works that we
use the command line number as the parse line number, so that
an error from something that was parsed in command 42 comes
out as "line:42". This commit changes to the format
"expr-42:3": line 3 of expression 42. The expression number is
fixed in the parse name, and the line number is derived from
the line divisions in the entry itself.
* parser.c (repl): Dynamically compute the parse name,
such that it contains the command number. Then when parsing,
just leave the parse to begin at line 1.
|
|
|
|
| |
* parser.c (load_rcfile): Trailing whitespace after declaration.
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (edit): Support a verbatim
entry mode with limited commands, in which most
characters self-insert, including Enter.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (lino_get_multiline): New function.
* linenoise/linenoise.h (lino_get_multiline): Declared.
* parser.c (listener_hist_len, listener_multi_line_p_s): New
symbol global variables.
(repl): Set linenoise history length and multi-line mode from
the *listener-hist-len* and *listener-multi-line-p* variables
on each call. Set the *listener-multi-line* variable from
the lino_t object's current state after each linenoise call.
(parse_init): Initialize new global variables and register
them as special variables.
* txr.1: Update sentence which says that history is fixed
at 100 lines. Document listener configuration variables.
|
|
|
|
| |
* txr.1: New section about line length limit and other restrictions.
|
|
|
|
|
| |
* txr.1: Clear Screen, Suspend, and History Persistence
are not editing commands. They get their own sections.
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (tr, edit_in_editor): New
static functions.
(edit): edit_in_editor hooked in under Ctrl-X Ctrl-E.
* txr.1: Documented.
|
|
|
|
|
|
| |
* linenoise/linenoise.c (edit): Handle the Ctrl-X
key by setting a temporary flag. This sets the framework for
commands prefixed by Ctrl-X.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is needed for multi-line mode with CR line breaks.
It also makes TXR tolerant when code is ported among
systems with different line endings.
* parser.l (NL): New lex named pattern, matching three
possible line terminators: CR, NL or CR-NL.
(grammar): In places where \n was previously matched,
use {NL}. In a few places where \n is in a character
class, add \r. In one place (comment matching), the
the pattern . which implicitly doesn't match newlines
had to be replaced with [^\r\n].
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The oldpos variable for tracing the previous cursor position
as an absolute offset into the display data is not appropriate
any more under enhanced multi-line mode. The reason is that
edit operations can completely replace the buffer (e.g.
history recall). When the buffer is replaced, because there
can be arbitrary line breaks in the data, the oldpos
variable's saved position has no meaning relative to the new
buffer contents. But the only use of oldpos is to calculate
the previous *row* of the cursor position! So, we can replace
oldpos with a variable that just remembers the row directly.
As a bonus, we can get rid of the calculation which tries to
recover the oldrow from oldpos.
* linenoise/linenoise.c (struct lino_state): Removed member
oldpos. Added member oldrow.
(struct row_values): Array reduced to two elements.
(screen_rows): Doesn't take oldpos argument any more.
Current cursor position returned in out.rows[1].
(refresh_multiline): Some variables renamed. rpos2 becomes
nrow (new row position). old_rows is oldmaxrows to avoid
confusion with l->oldrow. The rpos variable (old row
position) is gone: its uses are replaced with l->oldrow.
Near the end of the function, we save the new cursor row
position (nrow) in l->oldrow, in the same spot where
we previously saved the current position in l->oldpos.
(edit): Initialize l->oldrow to 0. Remove initialization
of l->oldpos.
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (lndebug): Macro removed.
The variables have changed; it won't work any more.
We have GDB.
(refresh_multiline): lndebug calls removed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The linenoise multi-line mode is just a glorified line
wrapper, and not actualy a multi-line editor, like in GNU
Readline and others. This commit fixes it. The edit buffer can
now contain line breaks, separated by carriage return
characters. (In single-line mode, these characters continue
to be displayed as ^M). The row and column calculations in the
multi-line refresh follow this data representation.
* linenoise/linenoise.c (sync_data_to_buf): This function
now takes an extra argument telling it whether multi-line mode
is in effect for the rendering. In multi-line mode, the prompt
is now added to the display data, so that multi-line refresh
is simplified by not having to account for the prompt length
in various calculations. Also, in multi-line mode, carriage
returns are rendered to display as CR-LF pairs, since they
denote embedded line breaks.
(complete_line): Pass mlmode to sync_data_to_buf.
(struct row_values): New struct, for returning multiple
row values out of a function.
(screen_rows, col_offset_in_str): New static functions.
(refresh_multiline): Modified to use screen_rows and
col_offset_in_str for its calculations, and not to deal with
the prompt at all, since the prompt is rolled into the display
data.
(refresh_line, edit_insert): Pass mlmode to sync_data_to_buf.
* txr.1: Documented multi-line mode.
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (lino_hist_load): Don't look for
and overwrite carriage returns with the null character; only
do that for newlines. We already handle embedded carriage
returns just fine by displaying them as ^M.
There is a plan to use these characters for breaking up lines
in an enhanced multi-line mode.
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (sync_data_to_buffer): Add
missing null terminator to l->buf. This hasn't
caused a problem because no code relies on it
being a C string. That may be about to change.
|
|
|
|
|
| |
* linenoise/linenoise.c (edit): Handle CTL('J')
by toggling mlmode and refreshing the line.
|
|
|
|
|
| |
* linenoise/linenoise.c (edit): Delete if the data
length is nonzero, not the display length.
|
|
|
|
|
|
|
|
|
|
|
| |
* linenoise/linenoise.c (LINENOISE_PAREN_DELAY): New
preprocessor symbol.
(scan_match_rev, scan_rev, usec_delay, paren_jump):
New static functions.
(edit): Handle closing parenthesis, bracket and brace
by inserting and calling paren_jump.
* txr.1: Documented.
|
|
|
|
|
| |
* txr.1: Fix inappropriately copy and pasted ungrammatical
text "permutations is of zero length".
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The issue is that sigset_t is 1024 bits wide on Linux, but
there aren't actually that many signals. Valgrind knows this
and so when sigprocmask returns the old signal set, Valgrind
only marks a portion of it as initialized, and not the
entire 1024 bits. When this sigset_t is later passed into
sig_set again, we do a memcmp on all 1024 bits and Valgrind
complains about a use of uninitialized data. Test case:
run valgrind ./txr -i and execute a (throw 'foo) expr.
* signal.c (sig_mask): If we are compiling with Valgrind
support, mark the old signal set defined just before passing
it to sigprocmask, so it has no uninitialized bits.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Instances of extended_jmp_buf structure are defined in
automatic storage. The members are manipulated after setjmp
and accessed after returning via longjmp. Therefore, they
should be volatile-qualified.
* signal.h (EJ_DBG_MEMB): Add volatile to dbg_depth.
(extended_jmp_buf): Add volatile on all members in
both versions of the structure.
(extended_setjmp): Cast away volatile when
passing sigset_t to sig_mask.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When a NFA regex goes through more than 4.29 billion state
transitions, the state coloring "visited" marker wraps around.
There could still exist states with old values at or near
zero, which destroys the correctness of the closure
calculations.
* regex.c (nfa_handle_wraparound): New static function.
The wraparound situation is handled by detecting when
the next marker value is UINT_MAX. When this happens,
we visit all states, marking them to UINT_MAX.
Then we visit them again, marking them to zero, and
set the next marker value to 1.
(nfa_free): Added comment about why we don't have a
wraparound check, in case it isn't obvious.
(nfa_run): Check for wraparound before eveyr nfa_closure call.
(regex_machine_reset): Check for wraparound before nfa_closure
call. Fix: store the counter back in the start state's visited
field.
(regex_machine_init): Initialize the n.visited field of the
regex machine structure to zero. Not strictly necessary, since
it's initialized moments later in regex_machine_reset, but
good form.
(regex_machine_feed): Check for wraparound before nfa_closure
call.
|
|
|
|
|
| |
* regex.c (nfa_free): Use alloca for array of all states.
(nfa_run): Use alloca for move, closure and stack arrays.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* regex.c (struct regex): New member, nstates.
(NFA_SET_SIZE): Preprocessor symbol removed.
(struct nfa_machine): New member, nstates.
(nfa_all_states): Function removed.
(nfa_map_states): New static function.
(nfa_count_one, nfa_count_states, nfa_collect_one): New static
functions.
(nfa_free): Takes nstates argument. Calculate array of all
states using nfa_map_states over nfa_collect_one rather than
nfa_all_states. The array is tightly allocated. Also the
spanning tree traversal needs just one root, nfa.start.
It's not clear why nfa_all_states used nfa.start and
nfa.accept as roots.
(nfa_closure): Takes nstates parameter; array bounds checking
performed tightly against nstates rather than NFA_SET_SIZE.
(nfa_move): Check against NFA_SET_SIZE removed.
(nfa_run): Take nstates argument. Allocate arrays tightly. Pass nstates
to nfa_closure.
(regex_destroy): Pass regex->nstates to nfa_free.
(regex_compile): Initialize regex->nstates.
(regex_run): Pass regex->nstates to nfa_run.
(regex_machine_reset): Pass nstates to nfa_closure.
(regex_machine_init): Initialize n.nstates member of regex
machine. Allocate arrays tightly.
(regex_machine_feed): Pass nstates to nfa_closure.
|
|
|
|
|
|
| |
* regex.c (nfa_free): The visited marker must be incremented,
otherwise nfa_all_states will only collect start and
accept.
|