changelog shortlog graph tags branches changeset file revisions annotate raw help

Mercurial > core / lisp/ffi/readline/readline.lisp

revision 660: da507f0274b3
parent 658: 804b5ee20a46
child 661: 39170f311b8c
     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,