summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* linenoise: new Ctrl-X Ctrl-K command to delete line.Kaz Kylheku2015-09-212-0/+38
| | | | | | | | | * 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: multi-line behavior for del to bol/eol.Kaz Kylheku2015-09-212-15/+60
| | | | | | | | | | | | | * 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.
* linenoise: squelch some useless undo items.Kaz Kylheku2015-09-211-5/+24
| | | | | | | | | | | | | | | | | | | | | 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: do not undo to empty lineKaz Kylheku2015-09-211-9/+14
| | | | | | * linenoise/linenoise.c (restore_undo): If an undo item wants to produce a completely blank line, then discard and skip it.
* linenoise: much more sane, per-history-item undo.Kaz Kylheku2015-09-212-76/+88
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* linenoise: renumber history indices in undo itemsKaz Kylheku2015-09-201-5/+27
| | | | | | | | | | | | | | | 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: single return out of edit.Kaz Kylheku2015-09-201-27/+27
| | | | | | | | * 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.
* linenoise: move to end in mlmode on Ctrl-C, Ctrl-Z.Kaz Kylheku2015-09-201-4/+17
| | | | | | | | | | 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: undo feature.Kaz Kylheku2015-09-202-0/+151
| | | | | | | | | | | | | | | | | | | | | * 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: visual select and clipboard copy/paste.Kaz Kylheku2015-09-202-38/+333
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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: sync_data_to_to_buf loses pointless arg.Kaz Kylheku2015-09-201-8/+8
| | | | | | | | * 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.
* Adding flatcar* function.Kaz Kylheku2015-09-194-9/+62
| | | | | | | | | | | | * 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.
* Atom insert feature.Kaz Kylheku2015-09-182-0/+58
| | | | | | | | * parser.c (provide_atom): New static function. (repl): Register provide_atom with linenoise as atom callback. * txr.1: Documented.
* linenoise: atom-gathering callback feature.Kaz Kylheku2015-09-182-1/+38
| | | | | | | | | | | | * 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.
* New function: flatcar.Kaz Kylheku2015-09-184-0/+45
| | | | | | | | | | * eval.c (eval_init): Register flatcar intrinsic. * lib.c (flatcar): New function. * lib.h (flatcar): Declared. * txr.1: Documented.
* linenoise: insert previous word featureKaz Kylheku2015-09-182-3/+57
| | | | | | | | * 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.
* Set the tempfile suffix.Kaz Kylheku2015-09-181-0/+1
| | | | | * parser.c (repl): Configure the .tl suffix in the linenoise object.
* linenoise: support suffix on temp file name.Kaz Kylheku2015-09-182-2/+19
| | | | | | | | | | | | | | 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.
* Detect mkstemps function.Kaz Kylheku2015-09-181-0/+20
| | | | | | * configure: Add check for mkstemps. (HAVE_MKSTEMPS): New preprocessor symbol, conditionally deposited into config/config.h
* Doc fix under getpwnam.Kaz Kylheku2015-09-181-1/+1
| | | | * txr.1: Description wrongly refers to getpwuid.
* Improved ~/.txr_profile checks, with security.Kaz Kylheku2015-09-182-8/+27
| | | | | | | | | | * 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.
* New function path-private-to-me.Kaz Kylheku2015-09-173-1/+48
| | | | | | | | | * 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.
* Add unix group database functions.Kaz Kylheku2015-09-173-0/+240
| | | | | | | | | | | | | | | | | | * 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.
* Change how error locations are reported in REPL.Kaz Kylheku2015-09-171-2/+2
| | | | | | | | | | | | | | 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.
* Whitespace fix.Kaz Kylheku2015-09-171-1/+1
| | | | * parser.c (load_rcfile): Trailing whitespace after declaration.
* linenoise: Ctrl-X Ctrl-V super verbatim mode.Kaz Kylheku2015-09-172-2/+30
| | | | | | | | * linenoise/linenoise.c (edit): Support a verbatim entry mode with limited commands, in which most characters self-insert, including Enter. * txr.1: Documented.
* Version 116.txr-116Kaz Kylheku2015-09-176-522/+573
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated.
* Listener configuration variables.Kaz Kylheku2015-09-174-7/+56
| | | | | | | | | | | | | | | | | | * 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.
* Describe listener limitations.Kaz Kylheku2015-09-161-0/+7
| | | | * txr.1: New section about line length limit and other restrictions.
* Rearrange some subsections.Kaz Kylheku2015-09-161-36/+37
| | | | | * txr.1: Clear Screen, Suspend, and History Persistence are not editing commands. They get their own sections.
* linenoise: edit command line in external editor.Kaz Kylheku2015-09-162-0/+83
| | | | | | | | * 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: Ctrl-X extended commands.Kaz Kylheku2015-09-161-1/+16
| | | | | | * linenoise/linenoise.c (edit): Handle the Ctrl-X key by setting a temporary flag. This sets the framework for commands prefixed by Ctrl-X.
* syntax: be tolerant of carriage returns.Kaz Kylheku2015-09-161-15/+16
| | | | | | | | | | | | | | 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].
* linenoise: oldpos-related multi-line refresh issue.Kaz Kylheku2015-09-161-21/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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: remove multiline debug codeKaz Kylheku2015-09-161-28/+0
| | | | | | | * linenoise/linenoise.c (lndebug): Macro removed. The variables have changed; it won't work any more. We have GDB. (refresh_multiline): lndebug calls removed.
* linenoise: enhanced multi-line mode with line breaks.Kaz Kylheku2015-09-162-23/+106
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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: don't process carriage returns in history.Kaz Kylheku2015-09-161-4/+1
| | | | | | | | | * 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: null-terminate display buffer.Kaz Kylheku2015-09-161-0/+1
| | | | | | | * 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: Ctrl-J toggles multi-line mode.Kaz Kylheku2015-09-161-0/+4
| | | | | * linenoise/linenoise.c (edit): Handle CTL('J') by toggling mlmode and refreshing the line.
* linenoise: bugfix: Ctrl-D checks wrong length field.Kaz Kylheku2015-09-161-1/+1
| | | | | * linenoise/linenoise.c (edit): Delete if the data length is nonzero, not the display length.
* linenoise: parenthesis-matching backward jump.Kaz Kylheku2015-09-152-0/+116
| | | | | | | | | | | * 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.
* Wording and grammar fix under permutationsKaz Kylheku2015-09-151-3/+3
| | | | | * txr.1: Fix inappropriately copy and pasted ungrammatical text "permutations is of zero length".
* False positive valgrind error: uninitialized sigset_t.Kaz Kylheku2015-09-151-0/+6
| | | | | | | | | | | | | | | 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.
* extended_jmp_buf members should be volatile.Kaz Kylheku2015-09-151-12/+14
| | | | | | | | | | | | | 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.
* Regex state-marking counter wraparound bug.Kaz Kylheku2015-09-151-1/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Use alloca for some temporary arrays in regex module.Kaz Kylheku2015-09-151-11/+5
| | | | | * regex.c (nfa_free): Use alloca for array of all states. (nfa_run): Use alloca for move, closure and stack arrays.
* Remove limit on NFA state size and allocate tightly.Kaz Kylheku2015-09-151-62/+63
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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.
* Fix memory leak in regexes.Kaz Kylheku2015-09-141-1/+1
| | | | | | * regex.c (nfa_free): The visited marker must be incremented, otherwise nfa_all_states will only collect start and accept.
* linenoise: handle SIGWINCH resize signal.Kaz Kylheku2015-09-141-2/+64
| | | | | | | | | | | | | | | | | | | | * linenoise/linenoise.c (struct lino_state): New member, need_resize. (lino_list_busy): New static variable. (handle_resize): New function. (complete_line, history_search, edit): Check for the tty read being interrupted, and in that case call handle_resize to put the resize into effect, and continue the loop to fetch another character. (sigwich_handler): New function. (linenoise): If we have SIGWINCH, install a handler for it temporarily. (link_into_list, unlink_from_list): Set global busy flag around list manipulations. The signal handler stays away if these are set. This means that if the user performs some action that requires a lino_t to be constructed (e.g. types Ctrl-R to search), while resizing the window at almost exactly the same time, we will lose the resize signal. Oh well!
* Implement ~/.txr_profile mechanism.Kaz Kylheku2015-09-134-1/+58
| | | | | | | | | | | | * parser.c (load_rcfile): New function. (repl): Compute profile file name and try to load it before entering loop. * sysif.c (statp): Linkage becomes external. * sysif.h (statp): Declaration updated. * txr.1: Documented.