1.1--- a/lisp/ffi/readline/readline.lisp Fri Sep 20 19:59:36 2024 -0400
1.2+++ b/lisp/ffi/readline/readline.lisp Fri Sep 20 22:18:48 2024 -0400
1.3@@ -12,10 +12,80 @@
1.4 :list-all 63
1.5 :not-list-cmn-prefix 64)
1.6
1.7-(define-alien-type rl-history-entry (struct rl-history-entry
1.8+(define-alien-type rl-hist-entry (struct rl-hist-entry
1.9 (line (* t))
1.10 (time (* t))
1.11 (data (* t))))
1.12+
1.13+;; HS_STIFLED
1.14+(define-alien-type rl-history-state
1.15+ (struct rl-history-state
1.16+ (hist-entries (array (* rl-hist-entry)))
1.17+ (offset int)
1.18+ (length int)
1.19+ (size int)
1.20+ (flags int)))
1.21+
1.22+(define-alien-enum (rl-undo-code int :test eq)
1.23+ :delete 0
1.24+ :insert 1
1.25+ :begin 2
1.26+ :end 3)
1.27+
1.28+(define-alien-type rl-undo-list
1.29+ (struct rl-undo-list
1.30+ (next (* (struct rl-undo-list)))
1.31+ (start int)
1.32+ (end int)
1.33+ (text c-string)
1.34+ (what rl-undo-code)))
1.35+
1.36+(define-alien-type rl-command-func
1.37+ (function int int int))
1.38+
1.39+(define-alien-type rl-funmap
1.40+ (struct rl-funmap
1.41+ (name c-string)
1.42+ (function (* rl-command-func))))
1.43+
1.44+(define-alien-type rl-keymap-entry
1.45+ (struct rl-keymap-entry
1.46+ (type char)
1.47+ (function (* rl-command-func))))
1.48+
1.49+(define-alien-type rl-keymap (array rl-keymap-entry))
1.50+
1.51+(define-alien-type readline-state
1.52+ (struct readline-state
1.53+ (point int)
1.54+ (end int)
1.55+ (mark int)
1.56+ (buflen int)
1.57+ (buffer c-string)
1.58+ (ul (* rl-undo-list))
1.59+ (prompt c-string)
1.60+ (rlstate int)
1.61+ (done int)
1.62+ (kmap rl-keymap)
1.63+ (lastfunc (* rl-command-func))
1.64+ (insmode int)
1.65+ (edmode int)
1.66+ (kseq c-string)
1.67+ (kseqlen int)
1.68+ (pendingin int)
1.69+ (inf (* t))
1.70+ (outf (* t))
1.71+ (macro c-string)
1.72+ (catchsigs int)
1.73+ (catchsigwinch int)
1.74+ (entryfunc (* rl-command-func))
1.75+ (menuentryfunc (* rl-command-func))
1.76+ (ignorefunc (* rl-command-func))
1.77+ (attemptfunc (* rl-command-func))
1.78+ (wordbreakchars c-string)
1.79+ (reserved (array char 64))))
1.80+
1.81+;;; Well Known Vars
1.82 (macrolet ((def-rl-var (name var type)
1.83 `(define-alien-variable (,name ,var) ,type)))
1.84 (def-rl-var "rl_line_buffer" *line-buffer* c-string)
1.85@@ -74,33 +144,196 @@
1.86 (def-rl-var "history_base" *history-base* int)
1.87 (def-rl-var "history_length" *history-length* int))
1.88
1.89-(defvar *states*
1.90- '(:initializing ; 0x0000001 initializing
1.91- :initialized ; 0x0000002 initialization done
1.92- :termprepped ; 0x0000004 terminal is prepped
1.93- :readcmd ; 0x0000008 reading a command key
1.94- :metanext ; 0x0000010 reading input after ESC
1.95- :dispatching ; 0x0000020 dispatching to a command
1.96- :moreinput ; 0x0000040 reading more input in a command function
1.97- :isearch ; 0x0000080 doing incremental search
1.98- :nsearch ; 0x0000100 doing non-incremental search
1.99- :search ; 0x0000200 doing a history search
1.100- :numericarg ; 0x0000400 reading numeric argument
1.101- :macroinput ; 0x0000800 getting input from a macro
1.102- :macrodef ; 0x0001000 defining keyboard macro
1.103- :overwrite ; 0x0002000 overwrite mode
1.104- :completing ; 0x0004000 doing completion
1.105- :sighandler ; 0x0008000 in readline sighandler
1.106- :undoing ; 0x0010000 doing an undo
1.107- :inputpending ; 0x0020000 rl_execute_next called
1.108- :ttycsaved ; 0x0040000 tty special chars saved
1.109- :callback ; 0x0080000 using the callback interface
1.110- :vimotion ; 0x0100000 reading vi motion arg
1.111- :multikey ; 0x0200000 reading multiple-key command
1.112- :vicmdonce ; 0x0400000 entered vi command mode at least once
1.113- :redisplaying ; 0x0800000 updating terminal display
1.114- :done) ; 0x1000000 done; accepted line
1.115- "Possible state values for `+readline-state+'.")
1.116+;; low-level
1.117+(macrolet ((def-rl-int2 (&rest names)
1.118+ `(progn
1.119+ ,@(loop for i in names
1.120+ collect
1.121+ (std:with-gensyms (i1 i2)
1.122+ `(define-alien-routine ,i int (,i1 int) (,i2 int)))))))
1.123+ (def-rl-int2 "rl_digit_argument" "rl_universal_argument" "rl_forward_byte"
1.124+ "rl_forward_char" "rl_forward" "rl_backward_byte" "rl_backward_char" "rl_backward"
1.125+ "rl_beg_of_line" "rl_end_of_line" "rl_forward_word" "rl_backward_word" "rl_refresh_line"
1.126+ "rl_clear_screen" "rl_clear_display" "rl_skip_csi_sequence" "rl_arrow_keys"
1.127+ "rl_previous_screen_line" "rl_next_screen_line"
1.128+ "rl_insert" "rl_quoted_insert" "rl_tab_insert" "rl_newline" "rl_do_lowercase_version"
1.129+ "rl_rubout" "rl_delete" "rl_rubout_or_delete" "rl_delete_horizontal_space" "rl_delete_or_show_completions"
1.130+ "rl_insert_comment" "rl_upcase_word" "rl_downcase_word" "rl_capitalize_word" "rl_transpose_words"
1.131+ "rl_transpose_chars" "rl_char_search" "rl_backward_char_search" "rl_beginning_of_history"
1.132+ "rl_end_of_history" "rl_get_next_history" "rl_get_previous_history" "rl_operate_and_get_next"
1.133+ "rl_fetch_history" "rl_set_mark" "rl_exchange_point_and_mark" "rl_vi_editing_mode"
1.134+ "rl_emacs_editing_mode" "rl_overwrite_mode" "rl_re_read_init_file" "rl_dump_functions" "rl_dump_macros"
1.135+ "rl_dump_variables" "rl_complete" "rl_possible_completions" "rl_insert_completions" "rl_old_menu_complete"
1.136+ "rl_backward_menu_complete" "rl_kill_word" "rl_backward_kill_word" "rl_kill_line" "rl_backward_kill_line"
1.137+ "rl_kill_full_line" "rl_unix_word_rubout" "rl_unix_line_discard" "rl_copy_region_to_kill" "rl_kill_region"
1.138+ "rl_copy_forward_word" "rl_copy_backward_word" "rl_yank" "rl_yank_pop" "rl_yank_nth_arg" "rl_yank_last_arg"
1.139+ "rl_bracketed_paste_begin"
1.140+ #+win32 "rl_paste_from_clipboard"
1.141+ "rl_reverse_search_history" "rl_forward_search_history" "rl_start_kbd_macro" "rl_end_kbd_macro"
1.142+ "rl_call_last_kbd_macro" "rl_print_last_kbd_macro" "rl_revert_line" "rl_undo_command" "rl_tilde_expand"
1.143+ "rl_restart_output" "rl_stop_output" "rl_abort" "rl_tty_status"
1.144+ "rl_history_search_forward" "rl_history_search_backward" "rl_history_substr_search_forward"
1.145+ "rl_history_substr_search_backward" "rl_noninc_forward_search" "rl_noninc_reverse_search"
1.146+ "rl_noninc_forward_search_again" "rl_noninc_reverse_search_again"
1.147+ "rl_insert_close" "rl_vi_redo" "rl_vi_undo" "rl_vi_yank_arg" "rl_vi_fetch_history" "rl_vi_search_again"
1.148+ "rl_vi_search" "rl_vi_complete" "rl_vi_tilde_expand" "rl_vi_prev_word" "rl_vi_next_word" "rl_vi_end_word"
1.149+ "rl_vi_insert_beg" "rl_vi_append_mode" "rl_vi_append_eol" "rl_vi_eof_maybe" "rl_vi_insertion_mode"
1.150+ "rl_vi_insert_mode" "rl_vi_movement_mode" "rl_vi_arg_digit" "rl_vi_change_case" "rl_vi_put" "rl_vi_column"
1.151+ "rl_vi_delete_to" "rl_vi_change_to" "rl_vi_yank_to" "rl_vi_yank_pop" "rl_vi_rubout" "rl_vi_delete"
1.152+ "rl_vi_back_to_indent" "rl_vi_unix_word_rubout" "rl_vi_first_print" "rl_vi_char_search" "rl_vi_match"
1.153+ "rl_vi_change_char" "rl_vi_subst" "rl_vi_overstrike" "rl_vi_overstrike_delete" "rl_vi_replace"
1.154+ "rl_vi_set_mark" "rl_vi_goto_mark"
1.155+ ;; NOTE 2024-09-20: there are uppercase versions - fWord eWord
1.156+ "rl_vi_fword" "rl_vi_bword" "rl_vi_eword"))
1.157+
1.158+;;; Well Published Functions
1.159+(define-alien-routine "readline" c-string (prompt c-string))
1.160+(define-alien-routine "rl_set_prompt" int (prompt c-string))
1.161+(define-alien-routine "rl_expand_prompt" int (prompt c-string))
1.162+(define-alien-routine "rl_initialize" int)
1.163+;; undocument; unused by readline
1.164+;; (define-alien-routine "rl_discard_argument" int)
1.165+
1.166+;; [[file:/usr/include/readline/readline.h::/* Utility functions to bind keys to readline commands. */][last]]
1.167+(define-alien-routine "rl_add_defun" int (name c-string) (func (* rl-command-func)))
1.168+(define-alien-routine "rl_bind_key" int (key int) (function (* rl-command-func)))
1.169+(define-alien-routine "rl_bind_key_in_map" int (key int) (func (* rl-command-func)) (map rl-keymap))
1.170+(define-alien-routine "rl_unbind_key" int (key int))
1.171+(define-alien-routine "rl_unbind_key_in_map" int (key int) (map rl-keymap))
1.172+(define-alien-routine "rl_bind_key_if_unbound" int (key int) (function (* rl-command-func)))
1.173+(define-alien-routine "rl_bind_key_if_unbound_in_map" int (key int) (function (* rl-command-func)) (map rl-keymap))
1.174+(define-alien-routine "rl_generic_bind" int (key int) (str c-string) (name c-string) (map rl-keymap))
1.175+(define-alien-routine "rl_variable_value" c-string (name c-string))
1.176+(define-alien-routine "rl_variable_bind" int (name c-string) (val c-string))
1.177+
1.178+(define-alien-routine "rl_read_init_file" int (file c-string))
1.179+(define-alien-routine "rl_parse_and_bind" int (binding c-string))
1.180+
1.181+;; keymaps
1.182+(define-alien-routine "rl_make_bare_keymap" rl-keymap)
1.183+(define-alien-routine "rl_empty_keymap" int (map rl-keymap))
1.184+(define-alien-routine "rl_copy_keymap" rl-keymap (map rl-keymap))
1.185+(define-alien-routine "rl_make_keymap" rl-keymap)
1.186+(define-alien-routine "rl_discard_keymap" void (map rl-keymap))
1.187+(define-alien-routine "rl_free_keymap" void (map rl-keymap))
1.188+(define-alien-routine "rl_set_keymap" void (map rl-keymap))
1.189+(define-alien-routine "rl_get_keymap" rl-keymap)
1.190+(define-alien-routine "rl_set_keymap_name" int (name c-string) (map rl-keymap))
1.191+
1.192+;; funmaps
1.193+(define-alien-routine "rl_add_funmap_entry" int (name c-string) (function (* rl-command-func)))
1.194+(define-alien-routine "rl_funmap_names" (array c-string))
1.195+
1.196+;; kbd macros
1.197+(define-alien-routine "rl_push_macro_input" void (input c-string))
1.198+
1.199+;; undo
1.200+(define-alien-routine "rl_add_undo" void (code rl-undo-code) (i1 int) (i2 int) (input c-string))
1.201+(define-alien-routine "rl_free_undo_list" void)
1.202+(define-alien-routine "rl_do_undo" int)
1.203+(define-alien-routine "rl_begin_undo_group" int)
1.204+(define-alien-routine "rl_end_undo_group" int)
1.205+(define-alien-routine "rl_modifying" int (i1 int) (i2 int))
1.206+
1.207+;; redisplay
1.208+(define-alien-routine "rl_redisplay" void)
1.209+(define-alien-routine "rl_on_new_line" int)
1.210+(define-alien-routine "rl_on_new_line_with_prompt" int)
1.211+(define-alien-routine "rl_forced_update_display" int)
1.212+(define-alien-routine "rl_clear_visible_line" int)
1.213+(define-alien-routine "rl_clear_message" int)
1.214+(define-alien-routine "rl_reset_line_state" int)
1.215+(define-alien-routine "rl_crlf" int)
1.216+
1.217+;; mark and region
1.218+(define-alien-routine "rl_keep_mark_active" void)
1.219+(define-alien-routine "rl_activate_mark" void)
1.220+(define-alien-routine "rl_deactivate_mark" void)
1.221+(define-alien-routine "rl_mark_active_p" int)
1.222+(define-alien-routine "rl_message" int)
1.223+(define-alien-routine "rl_show_char" int (char int))
1.224+;; undocumented
1.225+(define-alien-routine "rl_character_len" int (i1 int) (i2 int))
1.226+(define-alien-routine "rl_redraw_prompt_last_line" void)
1.227+
1.228+(define-alien-routine "rl_save_prompt" void)
1.229+(define-alien-routine "rl_restore_prompt" void)
1.230+
1.231+;; text editing
1.232+(define-alien-routine "rl_replace_line" void (line c-string) (idx int))
1.233+(define-alien-routine "rl_insert_text" int (text c-string))
1.234+(define-alien-routine "rl_delete_text" int (i1 int) (i2 int))
1.235+(define-alien-routine "rl_kill_text" int (i1 int) (i2 int))
1.236+(define-alien-routine "rl_copy_text" c-string (i1 int) (i2 int))
1.237+
1.238+;; tty
1.239+(define-alien-routine "rl_prep_terminal" void (i int))
1.240+(define-alien-routine "rl_deprep_terminal" void)
1.241+(define-alien-routine "rl_tty_set_default_bindings" void (map rl-keymap))
1.242+(define-alien-routine "rl_tty_unset_default_bindings" void (map rl-keymap))
1.243+(define-alien-routine "rl_tty_set_echoing" int (val int))
1.244+(define-alien-routine "rl_reset_terminal" int (val c-string))
1.245+(define-alien-routine "rl_resize_terminal" void)
1.246+(define-alien-routine "rl_set_screen_size" void (x int) (y int))
1.247+(define-alien-routine "rl_get_screen_size" void (i1 (* int)) (i2 (* int)))
1.248+(define-alien-routine "rl_reset_screen_size" void)
1.249+
1.250+(define-alien-routine "rl_get_termcap" c-string (key c-string))
1.251+
1.252+;; character input
1.253+(define-alien-routine "rl_stuff_char" int (c int))
1.254+(define-alien-routine "rl_execute_next" int (i int))
1.255+(define-alien-routine "rl_clear_pending_input" int)
1.256+(define-alien-routine "rl_read_key" int)
1.257+(define-alien-routine "rl_getc" int (c (* t))) ;; NOTE: (* FILE)
1.258+(define-alien-routine "rl_set_keyboard_input_timeout" int (val int))
1.259+
1.260+;;timeouts
1.261+(define-alien-routine "rl_set_timeout" int (n1 unsigned-int) (n2 unsigned-int))
1.262+(define-alien-routine "rl_timeout_remaining" int (n1 (* unsigned-int)) (n2 (* unsigned-int)))
1.263+
1.264+;; public utils
1.265+(define-alien-routine "rl_extend_lind_buffer" void (i int))
1.266+(define-alien-routine "rl_ding" int)
1.267+(define-alien-routine "rl_alphabetic" int (i int))
1.268+(define-alien-routine "rl_free" void (o (* t)))
1.269+
1.270+;; signals
1.271+(define-alien-routine "rl_set_signals" int)
1.272+(define-alien-routine "rl_clear_signals" int)
1.273+(define-alien-routine "rl_cleanup_after_signal" void)
1.274+(define-alien-routine "rl_reset_after_signal" void)
1.275+(define-alien-routine "rl_free_line_state" void)
1.276+(define-alien-routine "rl_pending_signal" int)
1.277+(define-alien-routine "rl_check_signals" void)
1.278+(define-alien-routine "rl_echo_signal_char" void (c int))
1.279+(define-alien-routine "rl_set_paren_blink_timeout" int (val int))
1.280+
1.281+;; history
1.282+(define-alien-routine "rl_clear_history" void)
1.283+(define-alien-routine "rl_maybe_save_line" int)
1.284+(define-alien-routine "rl_maybe_unsave_line" int)
1.285+(define-alien-routine "rl_maybe_replace_line" int)
1.286+
1.287+;; completion
1.288+(define-alien-routine "rl_complete_internal" int (i int))
1.289+(define-alien-routine "rl_display_match_list" void (list (array c-string)) (i1 int) (i2 int))
1.290+;; (define-alien-routine "rl_completion_matches" (array c-string) (input c-string) (function (* rl-compentry-func)))
1.291+(define-alien-routine "rl_username_completion_function" c-string (name c-string) (i int))
1.292+(define-alien-routine "rl_filename_completion_function" c-string (name c-string) (i int))
1.293+(define-alien-routine "rl_completion_mode" int (function (* rl-command-func)))
1.294+
1.295+;; history.h
1.296+(define-alien-routine "using_history" void)
1.297+(define-alien-routine "add_history" void (line c-string))
1.298+(define-alien-routine "clear_history" void)
1.299+(define-alien-routine "stifle_history" void (i int))
1.300+(define-alien-routine "unstifle_history" int)
1.301+(define-alien-routine "history_is_stifled" int)
1.302+(define-alien-routine "history_list" (array (* rl-hist-entry)))
1.303+
1.304+(define-alien-routine "rl_save_state" int (state (* readline-state)))
1.305+(define-alien-routine "rl_restore_state" int (state (* readline-state)))
1.306
1.307 (defvar +c-buffer-size+ 256
1.308 "How many bytes to allocate per Lisp string when converting list of
1.309@@ -112,9 +345,6 @@
1.310 (values (ldb (byte 8 8) version)
1.311 (ldb (byte 8 0) version)))
1.312
1.313-;; (defun decode-state (state)
1.314-;; "Transform Readline state STATE into list of keywords. See `+states+' for
1.315-;; list of components that can appear in result list."
1.316 ;; (mapcan (lambda (index keyword)
1.317 ;; (when (logbitp index state)
1.318 ;; (list keyword)))
1.319@@ -154,7 +384,7 @@
1.320 PREDICATE. Return T if there is no history saved."
1.321 (if (zerop *history-length*)
1.322 t
1.323- (with-alien ((s rl-history-entry))
1.324+ (with-alien ((s rl-hist-entry))
1.325 (funcall predicate
1.326 ;; TODO 2024-09-19: does SBCL know how to conver this to a lisp string automatically?
1.327 (with-alien-slots
1.328@@ -166,9 +396,6 @@
1.329 s
1.330 line)))))
1.331
1.332-(define-alien-routine "readline" (* t) (prompt c-string))
1.333-(define-alien-routine "add_history" void (line c-string))
1.334-
1.335 (defun rl (&key
1.336 prompt
1.337 already-prompted
1.338@@ -208,12 +435,6 @@
1.339 str)
1.340 (free-alien ptr)))))
1.341
1.342-;; (defun ensure-initialization ()
1.343-;; "Make sure that Readline is initialized. If it's not initialized yet,
1.344-;; initialize it."
1.345-;; (unless (find :initialized *readline-state*)
1.346-;; (initialize)))
1.347-
1.348 ;; (defmacro with-possible-redirection (filename append &body body)
1.349 ;; "If FILENAME is not NIL, try to create C file named FILENAME,
1.350 ;; temporarily reassign `*outstream*' to pointer to this file, perform BODY,