# HG changeset patch # User Karl Heuer # Date 771898708 0 # Node ID 9e2e0fdd1710316936cdbfe8841975bea38041f0 # Parent e609577aa2f31579dcecdc9ba8085926be4ba5c3 (minibuf_save_list): New variable, replaces minibuf_save_vector. (read_minibuf): Cons it up. (read_minibuf_unwind): Pop back the saved values. (syms_of_minibuf): staticpro it. diff -r e609577aa2f3 -r 9e2e0fdd1710 src/minibuf.c --- a/src/minibuf.c Sat Jun 18 00:13:37 1994 +0000 +++ b/src/minibuf.c Sat Jun 18 00:18:28 1994 +0000 @@ -32,23 +32,14 @@ extern int quit_char; /* List of buffers for use as minibuffers. - The first element of the list is used for the outermost minibuffer invocation, - the next element is used for a recursive minibuffer invocation, etc. - The list is extended at the end as deeped minibuffer recursions are encountered. */ + The first element of the list is used for the outermost minibuffer + invocation, the next element is used for a recursive minibuffer + invocation, etc. The list is extended at the end as deeper + minibuffer recursions are encountered. */ Lisp_Object Vminibuffer_list; -struct minibuf_save_data - { - char *prompt; - int prompt_width; - Lisp_Object help_form; - Lisp_Object current_prefix_arg; - Lisp_Object history_position; - Lisp_Object history_variable; - }; - -int minibuf_save_vector_size; -struct minibuf_save_data *minibuf_save_vector; +/* Data to remember during recursive minibuffer invocations */ +Lisp_Object minibuf_save_list; /* Depth in minibuffer invocations. */ int minibuf_level; @@ -139,7 +130,6 @@ register Lisp_Object val; int count = specpdl_ptr - specpdl; Lisp_Object mini_frame; - struct gcpro gcpro1, gcpro2; if (XTYPE (prompt) != Lisp_String) prompt = build_string (""); @@ -156,22 +146,16 @@ #endif error ("Command attempted to use minibuffer while in minibuffer"); - if (minibuf_level == minibuf_save_vector_size) - minibuf_save_vector = - (struct minibuf_save_data *) - xrealloc (minibuf_save_vector, - (minibuf_save_vector_size *= 2) - * sizeof (struct minibuf_save_data)); - minibuf_save_vector[minibuf_level].prompt = minibuf_prompt; - minibuf_save_vector[minibuf_level].prompt_width = minibuf_prompt_width; + /* Could we simply bind these variables instead? */ + minibuf_save_list + = Fcons (minibuf_prompt, + Fcons (make_number (minibuf_prompt_width), + Fcons (Vhelp_form, + Fcons (Vcurrent_prefix_arg, + Fcons (Vminibuffer_history_position, + Fcons (Vminibuffer_history_variable, + minibuf_save_list)))))); minibuf_prompt_width = 0; - /* >> Why is this done this way rather than binding these variables? */ - minibuf_save_vector[minibuf_level].help_form = Vhelp_form; - minibuf_save_vector[minibuf_level].current_prefix_arg = Vcurrent_prefix_arg; - minibuf_save_vector[minibuf_level].history_position = Vminibuffer_history_position; - minibuf_save_vector[minibuf_level].history_variable = Vminibuffer_history_variable; - GCPRO2 (minibuf_save_vector[minibuf_level].help_form, - minibuf_save_vector[minibuf_level].current_prefix_arg); record_unwind_protect (Fset_window_configuration, Fcurrent_window_configuration (Qnil)); @@ -248,8 +232,7 @@ Fforward_char (backup_n); } - minibuf_prompt = (char *) alloca (XSTRING (prompt)->size + 1); - bcopy (XSTRING (prompt)->data, minibuf_prompt, XSTRING (prompt)->size + 1); + minibuf_prompt = Fcopy_sequence (prompt); echo_area_glyphs = 0; /* This is in case the minibuffer-setup-hook calls Fsit_for. */ previous_echo_glyphs = 0; @@ -322,7 +305,6 @@ val = Fcar (expr_and_pos); } - UNGCPRO; return unbind_to (count, val); /* The appropriate frame will get selected in set-window-configuration. */ } @@ -385,15 +367,19 @@ windows_or_buffers_changed++; XFASTINT (XWINDOW (minibuf_window)->last_modified) = 0; - /* Restore prompt from outer minibuffer */ - minibuf_prompt = minibuf_save_vector[minibuf_level].prompt; - minibuf_prompt_width = minibuf_save_vector[minibuf_level].prompt_width; - Vhelp_form = minibuf_save_vector[minibuf_level].help_form; - Vcurrent_prefix_arg = minibuf_save_vector[minibuf_level].current_prefix_arg; - Vminibuffer_history_position - = minibuf_save_vector[minibuf_level].history_position; - Vminibuffer_history_variable - = minibuf_save_vector[minibuf_level].history_variable; + /* Restore prompt, etc from outer minibuffer */ + minibuf_prompt = Fcar (minibuf_save_list); + minibuf_save_list = Fcdr (minibuf_save_list); + minibuf_prompt_width = XFASTINT (Fcar (minibuf_save_list)); + minibuf_save_list = Fcdr (minibuf_save_list); + Vhelp_form = Fcar (minibuf_save_list); + minibuf_save_list = Fcdr (minibuf_save_list); + Vcurrent_prefix_arg = Fcar (minibuf_save_list); + minibuf_save_list = Fcdr (minibuf_save_list); + Vminibuffer_history_position = Fcar (minibuf_save_list); + minibuf_save_list = Fcdr (minibuf_save_list); + Vminibuffer_history_variable = Fcar (minibuf_save_list); + minibuf_save_list = Fcdr (minibuf_save_list); } @@ -1544,9 +1530,7 @@ If no minibuffer is active, return nil.") () { - if (!minibuf_prompt) - return Qnil; - return build_string (minibuf_prompt); + return Fcopy_sequence (minibuf_prompt); } DEFUN ("minibuffer-prompt-width", Fminibuffer_prompt_width, @@ -1568,9 +1552,11 @@ syms_of_minibuf () { minibuf_level = 0; - minibuf_prompt = 0; - minibuf_save_vector_size = 5; - minibuf_save_vector = (struct minibuf_save_data *) malloc (5 * sizeof (struct minibuf_save_data)); + minibuf_prompt = Qnil; + staticpro (&minibuf_prompt); + + minibuf_save_list = Qnil; + staticpro (&minibuf_save_list); Qread_file_name_internal = intern ("read-file-name-internal"); staticpro (&Qread_file_name_internal);