X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/36cf8493aff99b652b2ad8c9e4d55a18688e8484..2bfa3d3e1fb347ba76bddf77f3e288049635821d:/src/minibuf.c diff --git a/src/minibuf.c b/src/minibuf.c index 3042b13b7d..e257ac2177 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -205,7 +205,7 @@ string_to_object (Lisp_Object val, Lisp_Object defalt) } val = Fcar (expr_and_pos); - RETURN_UNGCPRO (val); + return val; } @@ -231,7 +231,7 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial, val = Qnil; size = 100; len = 0; - line = xmalloc (size); + line = xmalloc_atomic (size); while ((c = getchar ()) != '\n') { @@ -377,7 +377,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, bool allow_props, bool inherit_input_method) { Lisp_Object val; - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); Lisp_Object mini_frame, ambient_dir, minibuffer, input_method; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; Lisp_Object enable_multibyte; @@ -462,7 +462,8 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, expflag, histvar, histpos, defalt, allow_props, inherit_input_method); UNGCPRO; - return unbind_to (count, val); + dynwind_end (); + return val; } /* Choose the minibuffer window and frame, and take action on them. */ @@ -625,7 +626,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, /* Erase the buffer. */ { - ptrdiff_t count1 = SPECPDL_INDEX (); + dynwind_begin (); specbind (Qinhibit_read_only, Qt); specbind (Qinhibit_modification_hooks, Qt); Ferase_buffer (); @@ -647,7 +648,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, Fadd_text_properties (make_number (BEG), make_number (PT), Vminibuffer_prompt_properties, Qnil); } - unbind_to (count1, Qnil); + dynwind_end (); } minibuf_prompt_width = current_column (); @@ -753,7 +754,8 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, /* The appropriate frame will get selected in set-window-configuration. */ UNGCPRO; - return unbind_to (count, val); + dynwind_end (); + return val; } /* Return a buffer to be used as the minibuffer at depth `depth'. @@ -787,7 +789,7 @@ get_minibuffer (EMACS_INT depth) } else { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); /* We have to empty both overlay lists. Otherwise we end up with overlays that think they belong to this buffer while the buffer doesn't know about them any more. */ @@ -799,7 +801,7 @@ get_minibuffer (EMACS_INT depth) call0 (intern ("minibuffer-inactive-mode")); else Fkill_all_local_variables (); - unbind_to (count, Qnil); + dynwind_end (); } return buf; @@ -853,14 +855,14 @@ read_minibuf_unwind (void) /* Erase the minibuffer we were using at this level. */ { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); /* Prevent error in erase-buffer. */ specbind (Qinhibit_read_only, Qt); specbind (Qinhibit_modification_hooks, Qt); old_deactivate_mark = Vdeactivate_mark; Ferase_buffer (); Vdeactivate_mark = old_deactivate_mark; - unbind_to (count, Qnil); + dynwind_end (); } /* When we get to the outmost level, make sure we resize the @@ -983,7 +985,7 @@ Fifth arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits (Lisp_Object prompt, Lisp_Object initial_input, Lisp_Object history, Lisp_Object default_value, Lisp_Object inherit_input_method) { Lisp_Object val; - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); /* Just in case we're in a recursive minibuffer, make it clear that the previous minibuffer's completion table does not apply to the new @@ -996,7 +998,8 @@ Fifth arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits inherit_input_method); if (STRINGP (val) && SCHARS (val) == 0 && ! NILP (default_value)) val = CONSP (default_value) ? XCAR (default_value) : default_value; - return unbind_to (count, val); + dynwind_end (); + return val; } DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 3, 0, @@ -1093,7 +1096,7 @@ function, instead of the usual behavior. */) Lisp_Object args[4], result; char *s; ptrdiff_t len; - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); if (BUFFERP (def)) def = BVAR (XBUFFER (def), name); @@ -1142,7 +1145,8 @@ function, instead of the usual behavior. */) args[3] = require_match; result = Ffuncall (4, args); } - return unbind_to (count, result); + dynwind_end (); + return result; } static Lisp_Object @@ -1203,7 +1207,6 @@ is used to further constrain the set of candidates. */) ? list_table : function_table)); ptrdiff_t idx = 0, obsize = 0; int matchcount = 0; - ptrdiff_t bindcount = -1; Lisp_Object bucket, zero, end, tem; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; @@ -1288,18 +1291,17 @@ is used to further constrain the set of candidates. */) /* Ignore this element if it fails to match all the regexps. */ { + dynwind_begin (); + specbind (Qcase_fold_search, + completion_ignore_case ? Qt : Qnil); for (regexps = Vcompletion_regexp_list; CONSP (regexps); regexps = XCDR (regexps)) { - if (bindcount < 0) { - bindcount = SPECPDL_INDEX (); - specbind (Qcase_fold_search, - completion_ignore_case ? Qt : Qnil); - } tem = Fstring_match (XCAR (regexps), eltstring, zero); if (NILP (tem)) break; } + dynwind_end (); if (CONSP (regexps)) continue; } @@ -1313,11 +1315,6 @@ is used to further constrain the set of candidates. */) tem = Fcommandp (elt, Qnil); else { - if (bindcount >= 0) - { - unbind_to (bindcount, Qnil); - bindcount = -1; - } GCPRO4 (tail, string, eltstring, bestmatch); tem = (type == hash_table ? call2 (predicate, elt, @@ -1396,11 +1393,6 @@ is used to further constrain the set of candidates. */) } } - if (bindcount >= 0) { - unbind_to (bindcount, Qnil); - bindcount = -1; - } - if (NILP (bestmatch)) return Qnil; /* No completions found. */ /* If we are ignoring case, and there is no exact match, @@ -1460,7 +1452,6 @@ with a space are ignored unless STRING itself starts with a space. */) : VECTORP (collection) ? 2 : NILP (collection) || (CONSP (collection) && !FUNCTIONP (collection)); ptrdiff_t idx = 0, obsize = 0; - ptrdiff_t bindcount = -1; Lisp_Object bucket, tem, zero; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; @@ -1551,18 +1542,17 @@ with a space are ignored unless STRING itself starts with a space. */) /* Ignore this element if it fails to match all the regexps. */ { + dynwind_begin (); + specbind (Qcase_fold_search, + completion_ignore_case ? Qt : Qnil); for (regexps = Vcompletion_regexp_list; CONSP (regexps); regexps = XCDR (regexps)) { - if (bindcount < 0) { - bindcount = SPECPDL_INDEX (); - specbind (Qcase_fold_search, - completion_ignore_case ? Qt : Qnil); - } tem = Fstring_match (XCAR (regexps), eltstring, zero); if (NILP (tem)) break; } + dynwind_end (); if (CONSP (regexps)) continue; } @@ -1576,10 +1566,6 @@ with a space are ignored unless STRING itself starts with a space. */) tem = Fcommandp (elt, Qnil); else { - if (bindcount >= 0) { - unbind_to (bindcount, Qnil); - bindcount = -1; - } GCPRO4 (tail, eltstring, allmatches, string); tem = type == 3 ? call2 (predicate, elt, @@ -1594,11 +1580,6 @@ with a space are ignored unless STRING itself starts with a space. */) } } - if (bindcount >= 0) { - unbind_to (bindcount, Qnil); - bindcount = -1; - } - return Fnreverse (allmatches); } @@ -1769,17 +1750,20 @@ the values STRING, PREDICATE and `lambda'. */) /* Reject this element if it fails to match all the regexps. */ if (CONSP (Vcompletion_regexp_list)) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); specbind (Qcase_fold_search, completion_ignore_case ? Qt : Qnil); for (regexps = Vcompletion_regexp_list; CONSP (regexps); regexps = XCDR (regexps)) { if (NILP (Fstring_match (XCAR (regexps), SYMBOLP (tem) ? string : tem, - Qnil))) - return unbind_to (count, Qnil); + Qnil))){ + + dynwind_end (); + return Qnil; + } } - unbind_to (count, Qnil); + dynwind_end (); } /* Finally, check the predicate. */ @@ -1904,6 +1888,8 @@ init_minibuf_once (void) void syms_of_minibuf (void) { +#include "minibuf.x" + minibuf_level = 0; minibuf_prompt = Qnil; staticpro (&minibuf_prompt); @@ -2078,28 +2064,4 @@ properties. */); /* We use `intern' here instead of Qread_only to avoid initialization-order problems. */ Vminibuffer_prompt_properties = list2 (intern_c_string ("read-only"), Qt); - - defsubr (&Sactive_minibuffer_window); - defsubr (&Sset_minibuffer_window); - defsubr (&Sread_from_minibuffer); - defsubr (&Sread_string); - defsubr (&Sread_command); - defsubr (&Sread_variable); - defsubr (&Sinternal_complete_buffer); - defsubr (&Sread_buffer); - defsubr (&Sread_no_blanks_input); - defsubr (&Sminibuffer_depth); - defsubr (&Sminibuffer_prompt); - - defsubr (&Sminibufferp); - defsubr (&Sminibuffer_prompt_end); - defsubr (&Sminibuffer_contents); - defsubr (&Sminibuffer_contents_no_properties); - defsubr (&Sminibuffer_completion_contents); - - defsubr (&Stry_completion); - defsubr (&Sall_completions); - defsubr (&Stest_completion); - defsubr (&Sassoc_string); - defsubr (&Scompleting_read); }