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;
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 ("");
#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));
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;
val = Fcar (expr_and_pos);
}
- UNGCPRO;
return unbind_to (count, val); /* The appropriate frame will get selected
in set-window-configuration. */
}
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);
}
\f
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,
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);