1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19 
  20 
  21 
  22 #include <config.h>
  23 #include <stdio.h>
  24 #include <setjmp.h>
  25 
  26 #include "lisp.h"
  27 #include "commands.h"
  28 #include "buffer.h"
  29 #include "character.h"
  30 #include "dispextern.h"
  31 #include "keyboard.h"
  32 #include "frame.h"
  33 #include "window.h"
  34 #include "syntax.h"
  35 #include "intervals.h"
  36 #include "keymap.h"
  37 #include "termhooks.h"
  38 
  39 extern int quit_char;
  40 
  41   42   43   44   45 
  46 
  47 Lisp_Object Vminibuffer_list;
  48 
  49 
  50 
  51 Lisp_Object minibuf_save_list;
  52 
  53 
  54 
  55 int minibuf_level;
  56 
  57 
  58 
  59 Lisp_Object Qhistory_length, Vhistory_length;
  60 
  61 
  62 
  63 int history_delete_duplicates;
  64 
  65 
  66 
  67 Lisp_Object Vhistory_add_new_input;
  68 
  69 
  70 
  71 Lisp_Object last_minibuf_string;
  72 
  73   74 
  75 
  76 int enable_recursive_minibuffers;
  77 
  78   79 
  80 
  81 int minibuffer_allow_text_properties;
  82 
  83 
  84 
  85 Lisp_Object Vminibuffer_help_form;
  86 
  87 
  88 
  89 Lisp_Object Vminibuffer_history_variable;
  90 
  91 
  92 
  93 Lisp_Object Vminibuffer_history_position;
  94 
  95   96   97 
  98 
  99 Lisp_Object Vminibuffer_prompt_properties;
 100 
 101 Lisp_Object Qminibuffer_history, Qbuffer_name_history;
 102 
 103 Lisp_Object Qread_file_name_internal;
 104 
 105 
 106 
 107 Lisp_Object Qminibuffer_setup_hook, Vminibuffer_setup_hook;
 108 Lisp_Object Qminibuffer_exit_hook, Vminibuffer_exit_hook;
 109 
 110 
 111 Lisp_Object Vread_buffer_function;
 112 
 113 
 114 
 115 int completion_ignore_case;
 116 Lisp_Object Qcompletion_ignore_case;
 117 int read_buffer_completion_ignore_case;
 118 
 119 
 120 
 121 Lisp_Object Vcompletion_regexp_list;
 122 
 123  124 
 125 
 126 int minibuffer_auto_raise;
 127 
 128 
 129 Lisp_Object Vread_expression_map;
 130 
 131 Lisp_Object Vminibuffer_completion_table, Qminibuffer_completion_table;
 132 Lisp_Object Vminibuffer_completion_predicate, Qminibuffer_completion_predicate;
 133 Lisp_Object Vminibuffer_completion_confirm, Qminibuffer_completion_confirm;
 134 Lisp_Object Vminibuffer_completing_file_name;
 135 
 136 Lisp_Object Quser_variable_p;
 137 
 138 Lisp_Object Qminibuffer_default;
 139 
 140 Lisp_Object Qcurrent_input_method, Qactivate_input_method;
 141 
 142 Lisp_Object Qcase_fold_search;
 143 
 144 Lisp_Object Qread_expression_history;
 145 
 146 extern Lisp_Object Voverriding_local_map;
 147 
 148 extern Lisp_Object Qmouse_face;
 149 
 150 extern Lisp_Object Qfield;
 151 
 152  153  154 
 155 
 156 void
 157 choose_minibuf_frame ()
 158 {
 159   if (FRAMEP (selected_frame)
 160       && FRAME_LIVE_P (XFRAME (selected_frame))
 161       && !EQ (minibuf_window, XFRAME (selected_frame)->minibuffer_window))
 162     {
 163       struct frame *sf = XFRAME (selected_frame);
 164       Lisp_Object buffer;
 165 
 166        167 
 168       if (NILP (sf->minibuffer_window))
 169         abort ();
 170 
 171        172  173 
 174       buffer = XWINDOW (minibuf_window)->buffer;
 175       if (BUFFERP (buffer))
 176         Fset_window_buffer (sf->minibuffer_window, buffer, Qnil);
 177       minibuf_window = sf->minibuffer_window;
 178     }
 179 
 180    181  182  183 
 184   {
 185     Lisp_Object tail, frame;
 186 
 187     FOR_EACH_FRAME (tail, frame)
 188       if (MINI_WINDOW_P (XWINDOW (FRAME_SELECTED_WINDOW (XFRAME (frame))))
 189           && !(EQ (frame, selected_frame)
 190                && minibuf_level > 0))
 191         Fset_frame_selected_window (frame, Fframe_first_window (frame), Qnil);
 192   }
 193 }
 194 
 195 Lisp_Object
 196 choose_minibuf_frame_1 (ignore)
 197      Lisp_Object ignore;
 198 {
 199   choose_minibuf_frame ();
 200   return Qnil;
 201 }
 202 
 203 DEFUN ("set-minibuffer-window", Fset_minibuffer_window,
 204        Sset_minibuffer_window, 1, 1, 0,
 205        doc:  206  207 )
 208      (window)
 209      Lisp_Object window;
 210 {
 211   CHECK_WINDOW (window);
 212   if (! MINI_WINDOW_P (XWINDOW (window)))
 213     error ("Window is not a minibuffer window");
 214 
 215   minibuf_window = window;
 216 
 217   return window;
 218 }
 219 
 220 
 221 
 222 
 223 static Lisp_Object read_minibuf_unwind P_ ((Lisp_Object));
 224 static Lisp_Object run_exit_minibuf_hook P_ ((Lisp_Object));
 225 static Lisp_Object read_minibuf P_ ((Lisp_Object, Lisp_Object,
 226                                      Lisp_Object, Lisp_Object,
 227                                      int, Lisp_Object,
 228                                      Lisp_Object, Lisp_Object,
 229                                      int, int));
 230 static Lisp_Object read_minibuf_noninteractive P_ ((Lisp_Object, Lisp_Object,
 231                                                     Lisp_Object, Lisp_Object,
 232                                                     int, Lisp_Object,
 233                                                     Lisp_Object, Lisp_Object,
 234                                                     int, int));
 235 static Lisp_Object string_to_object P_ ((Lisp_Object, Lisp_Object));
 236 
 237 
 238  239 
 240 
 241 static Lisp_Object
 242 string_to_object (val, defalt)
 243      Lisp_Object val, defalt;
 244 {
 245   struct gcpro gcpro1, gcpro2;
 246   Lisp_Object expr_and_pos;
 247   int pos;
 248 
 249   GCPRO2 (val, defalt);
 250 
 251   if (STRINGP (val) && SCHARS (val) == 0)
 252     {
 253       if (STRINGP (defalt))
 254         val = defalt;
 255       else if (CONSP (defalt) && STRINGP (XCAR (defalt)))
 256         val = XCAR (defalt);
 257     }
 258 
 259   expr_and_pos = Fread_from_string (val, Qnil, Qnil);
 260   pos = XINT (Fcdr (expr_and_pos));
 261   if (pos != SCHARS (val))
 262     {
 263        264 
 265       int i;
 266       pos = string_char_to_byte (val, pos);
 267       for (i = pos; i < SBYTES (val); i++)
 268         {
 269           int c = SREF (val, i);
 270           if (c != ' ' && c != '\t' && c != '\n')
 271             error ("Trailing garbage following expression");
 272         }
 273     }
 274 
 275   val = Fcar (expr_and_pos);
 276   RETURN_UNGCPRO (val);
 277 }
 278 
 279 
 280  281 
 282 
 283 static Lisp_Object
 284 read_minibuf_noninteractive (map, initial, prompt, backup_n, expflag,
 285                              histvar, histpos, defalt, allow_props,
 286                              inherit_input_method)
 287      Lisp_Object map;
 288      Lisp_Object initial;
 289      Lisp_Object prompt;
 290      Lisp_Object backup_n;
 291      int expflag;
 292      Lisp_Object histvar;
 293      Lisp_Object histpos;
 294      Lisp_Object defalt;
 295      int allow_props;
 296      int inherit_input_method;
 297 {
 298   int size, len;
 299   char *line, *s;
 300   Lisp_Object val;
 301 
 302   fprintf (stdout, "%s", SDATA (prompt));
 303   fflush (stdout);
 304 
 305   val = Qnil;
 306   size = 100;
 307   len = 0;
 308   line = (char *) xmalloc (size * sizeof *line);
 309   while ((s = fgets (line + len, size - len, stdin)) != NULL
 310          && (len = strlen (line),
 311              len == size - 1 && line[len - 1] != '\n'))
 312     {
 313       size *= 2;
 314       line = (char *) xrealloc (line, size);
 315     }
 316 
 317   if (s)
 318     {
 319       len = strlen (line);
 320 
 321       if (len > 0 && line[len - 1] == '\n')
 322         line[--len] = '\0';
 323 
 324       val = build_string (line);
 325       xfree (line);
 326     }
 327   else
 328     {
 329       xfree (line);
 330       error ("Error reading from stdin");
 331     }
 332 
 333   
 334   if (expflag)
 335     val = string_to_object (val, CONSP (defalt) ? XCAR (defalt) : defalt);
 336 
 337   return val;
 338 }
 339 
 340 DEFUN ("minibufferp", Fminibufferp,
 341        Sminibufferp, 0, 1, 0,
 342        doc:  343  344 )
 345      (buffer)
 346      Lisp_Object buffer;
 347 {
 348   Lisp_Object tem;
 349 
 350   if (NILP (buffer))
 351     buffer = Fcurrent_buffer ();
 352   else if (STRINGP (buffer))
 353     buffer = Fget_buffer (buffer);
 354   else
 355     CHECK_BUFFER (buffer);
 356 
 357   tem = Fmemq (buffer, Vminibuffer_list);
 358   return ! NILP (tem) ? Qt : Qnil;
 359 }
 360 
 361 DEFUN ("minibuffer-prompt-end", Fminibuffer_prompt_end,
 362        Sminibuffer_prompt_end, 0, 0, 0,
 363        doc:  364 )
 365      ()
 366 {
 367   
 368   Lisp_Object beg, end, tem;
 369   beg = make_number (BEGV);
 370 
 371   tem = Fmemq (Fcurrent_buffer (), Vminibuffer_list);
 372   if (NILP (tem))
 373     return beg;
 374 
 375   end = Ffield_end (beg, Qnil, Qnil);
 376 
 377   if (XINT (end) == ZV && NILP (Fget_char_property (beg, Qfield, Qnil)))
 378     return beg;
 379   else
 380     return end;
 381 }
 382 
 383 DEFUN ("minibuffer-contents", Fminibuffer_contents,
 384        Sminibuffer_contents, 0, 0, 0,
 385        doc:  386 )
 387      ()
 388 {
 389   int prompt_end = XINT (Fminibuffer_prompt_end ());
 390   return make_buffer_string (prompt_end, ZV, 1);
 391 }
 392 
 393 DEFUN ("minibuffer-contents-no-properties", Fminibuffer_contents_no_properties,
 394        Sminibuffer_contents_no_properties, 0, 0, 0,
 395        doc:  396 )
 397      ()
 398 {
 399   int prompt_end = XINT (Fminibuffer_prompt_end ());
 400   return make_buffer_string (prompt_end, ZV, 0);
 401 }
 402 
 403 DEFUN ("minibuffer-completion-contents", Fminibuffer_completion_contents,
 404        Sminibuffer_completion_contents, 0, 0, 0,
 405        doc:  406  407 )
 408      ()
 409 {
 410   int prompt_end = XINT (Fminibuffer_prompt_end ());
 411   if (PT < prompt_end)
 412     error ("Cannot do completion in the prompt");
 413   return make_buffer_string (prompt_end, PT, 1);
 414 }
 415 
 416 
 417  418  419  420  421  422  423  424  425  426  427  428  429  430  431  432  433  434  435  436  437  438 
 439 
 440 static Lisp_Object
 441 read_minibuf (map, initial, prompt, backup_n, expflag,
 442               histvar, histpos, defalt, allow_props, inherit_input_method)
 443      Lisp_Object map;
 444      Lisp_Object initial;
 445      Lisp_Object prompt;
 446      Lisp_Object backup_n;
 447      int expflag;
 448      Lisp_Object histvar;
 449      Lisp_Object histpos;
 450      Lisp_Object defalt;
 451      int allow_props;
 452      int inherit_input_method;
 453 {
 454   Lisp_Object val;
 455   int count = SPECPDL_INDEX ();
 456   Lisp_Object mini_frame, ambient_dir, minibuffer, input_method;
 457   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
 458   Lisp_Object enable_multibyte;
 459   int pos = INTEGERP (backup_n) ? XINT (backup_n) : 0;
 460   
 461   Lisp_Object histstring;
 462 
 463   Lisp_Object empty_minibuf;
 464   Lisp_Object dummy, frame;
 465 
 466   extern Lisp_Object Qfront_sticky;
 467   extern Lisp_Object Qrear_nonsticky;
 468 
 469   specbind (Qminibuffer_default, defalt);
 470 
 471    472  473  474 
 475   specbind (intern ("minibuffer-completing-file-name"), Vminibuffer_completing_file_name);
 476   if (EQ (Vminibuffer_completing_file_name, Qlambda))
 477     Vminibuffer_completing_file_name = Qnil;
 478 
 479 #ifdef HAVE_WINDOW_SYSTEM
 480   if (display_hourglass_p)
 481     cancel_hourglass ();
 482 #endif
 483 
 484   if (!NILP (initial))
 485     {
 486       if (CONSP (initial))
 487         {
 488           backup_n = Fcdr (initial);
 489           initial = Fcar (initial);
 490           CHECK_STRING (initial);
 491           if (!NILP (backup_n))
 492             {
 493               CHECK_NUMBER (backup_n);
 494               
 495               if (XINT (backup_n) < 1)
 496                 
 497                 pos =  - SCHARS (initial);
 498               else
 499                 pos = XINT (backup_n) - 1 - SCHARS (initial);
 500             }
 501         }
 502       else
 503         CHECK_STRING (initial);
 504     }
 505   val = Qnil;
 506   ambient_dir = current_buffer->directory;
 507   input_method = Qnil;
 508   enable_multibyte = Qnil;
 509 
 510    511  512 
 513   GCPRO5 (map, initial, val, ambient_dir, input_method);
 514 
 515   if (!STRINGP (prompt))
 516     prompt = empty_unibyte_string;
 517 
 518   if (!enable_recursive_minibuffers
 519       && minibuf_level > 0)
 520     {
 521       if (EQ (selected_window, minibuf_window))
 522         error ("Command attempted to use minibuffer while in minibuffer");
 523       else
 524         
 525         Fthrow (Qexit,
 526                 build_string ("Command attempted to use minibuffer while in minibuffer"));
 527     }
 528 
 529   if ((noninteractive
 530         531 
 532        || (IS_DAEMON && (daemon_pipe[1] >= 0)))
 533       && NILP (Vexecuting_kbd_macro))
 534     {
 535       val = read_minibuf_noninteractive (map, initial, prompt,
 536                                          make_number (pos),
 537                                          expflag, histvar, histpos, defalt,
 538                                          allow_props, inherit_input_method);
 539       UNGCPRO;
 540       return unbind_to (count, val);
 541     }
 542 
 543   
 544 
 545   choose_minibuf_frame ();
 546 
 547   record_unwind_protect (choose_minibuf_frame_1, Qnil);
 548 
 549   record_unwind_protect (Fset_window_configuration,
 550                          Fcurrent_window_configuration (Qnil));
 551 
 552    553 
 554   mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window));
 555   if (!EQ (mini_frame, selected_frame))
 556     record_unwind_protect (Fset_window_configuration,
 557                            Fcurrent_window_configuration (mini_frame));
 558 
 559    560 
 561   Fmake_frame_visible (mini_frame);
 562 
 563   if (minibuffer_auto_raise)
 564     Fraise_frame (mini_frame);
 565 
 566   temporarily_switch_to_single_kboard (XFRAME (mini_frame));
 567 
 568    569 
 570 
 571    572  573 
 574   minibuf_save_list
 575     = Fcons (Voverriding_local_map,
 576              Fcons (minibuf_window,
 577                     minibuf_save_list));
 578   minibuf_save_list
 579     = Fcons (minibuf_prompt,
 580              Fcons (make_number (minibuf_prompt_width),
 581                     Fcons (Vhelp_form,
 582                            Fcons (Vcurrent_prefix_arg,
 583                                   Fcons (Vminibuffer_history_position,
 584                                          Fcons (Vminibuffer_history_variable,
 585                                                 minibuf_save_list))))));
 586 
 587   record_unwind_protect (read_minibuf_unwind, Qnil);
 588   minibuf_level++;
 589    590  591  592  593 
 594   record_unwind_protect (run_exit_minibuf_hook, Qnil);
 595 
 596   
 597 
 598   minibuf_prompt_width = 0;
 599   minibuf_prompt = Fcopy_sequence (prompt);
 600   Vminibuffer_history_position = histpos;
 601   Vminibuffer_history_variable = histvar;
 602   Vhelp_form = Vminibuffer_help_form;
 603    604  605  606  607 
 608   if (!NILP (Vminibuffer_completing_file_name))
 609     Vminibuffer_completing_file_name = Qlambda;
 610 
 611   if (inherit_input_method)
 612     {
 613        614 
 615       input_method = Fsymbol_value (Qcurrent_input_method);
 616       enable_multibyte = current_buffer->enable_multibyte_characters;
 617     }
 618 
 619   
 620 
 621   minibuffer = get_minibuffer (minibuf_level);
 622   Fset_buffer (minibuffer);
 623 
 624   
 625   if (inherit_input_method)
 626     current_buffer->enable_multibyte_characters = enable_multibyte;
 627 
 628    629  630  631  632  633  634  635 
 636   if (STRINGP (ambient_dir))
 637     current_buffer->directory = ambient_dir;
 638   else
 639     {
 640       Lisp_Object buf_list;
 641 
 642       for (buf_list = Vbuffer_alist;
 643            CONSP (buf_list);
 644            buf_list = XCDR (buf_list))
 645         {
 646           Lisp_Object other_buf;
 647 
 648           other_buf = XCDR (XCAR (buf_list));
 649           if (STRINGP (XBUFFER (other_buf)->directory))
 650             {
 651               current_buffer->directory = XBUFFER (other_buf)->directory;
 652               break;
 653             }
 654         }
 655     }
 656 
 657   if (!EQ (mini_frame, selected_frame))
 658     Fredirect_frame_focus (selected_frame, mini_frame);
 659 
 660   Vminibuf_scroll_window = selected_window;
 661   if (minibuf_level == 1 || !EQ (minibuf_window, selected_window))
 662     minibuf_selected_window = selected_window;
 663 
 664    665  666 
 667   empty_minibuf = Fget_buffer (build_string (" *Minibuf-0*"));
 668 
 669   FOR_EACH_FRAME (dummy, frame)
 670     {
 671       Lisp_Object root_window = Fframe_root_window (frame);
 672       Lisp_Object mini_window = XWINDOW (root_window)->next;
 673 
 674       if (! NILP (mini_window) && ! EQ (mini_window, minibuf_window)
 675           && !NILP (Fwindow_minibuffer_p (mini_window)))
 676         Fset_window_buffer (mini_window, empty_minibuf, Qnil);
 677     }
 678 
 679   
 680   Fset_window_buffer (minibuf_window, Fcurrent_buffer (), Qnil);
 681   Fselect_window (minibuf_window, Qnil);
 682   XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0);
 683 
 684   Fmake_local_variable (Qprint_escape_newlines);
 685   print_escape_newlines = 1;
 686 
 687   
 688   {
 689     int count1 = SPECPDL_INDEX ();
 690     specbind (Qinhibit_read_only, Qt);
 691     specbind (Qinhibit_modification_hooks, Qt);
 692     Ferase_buffer ();
 693 
 694     if (!NILP (current_buffer->enable_multibyte_characters)
 695         && ! STRING_MULTIBYTE (minibuf_prompt))
 696       minibuf_prompt = Fstring_make_multibyte (minibuf_prompt);
 697 
 698     
 699     Finsert (1, &minibuf_prompt);
 700     if (PT > BEG)
 701       {
 702         Fput_text_property (make_number (BEG), make_number (PT),
 703                             Qfront_sticky, Qt, Qnil);
 704         Fput_text_property (make_number (BEG), make_number (PT),
 705                             Qrear_nonsticky, Qt, Qnil);
 706         Fput_text_property (make_number (BEG), make_number (PT),
 707                             Qfield, Qt, Qnil);
 708         Fadd_text_properties (make_number (BEG), make_number (PT),
 709                               Vminibuffer_prompt_properties, Qnil);
 710       }
 711     unbind_to (count1, Qnil);
 712   }
 713 
 714   minibuf_prompt_width = (int) current_column (); 
 715 
 716   
 717   if (!NILP (initial))
 718     {
 719       Finsert (1, &initial);
 720       Fforward_char (make_number (pos));
 721     }
 722 
 723   clear_message (1, 1);
 724   current_buffer->keymap = map;
 725 
 726   
 727   if (STRINGP (input_method) && !NILP (Ffboundp (Qactivate_input_method)))
 728     call1 (Qactivate_input_method, input_method);
 729 
 730    731  732 
 733   if (!NILP (Vminibuffer_setup_hook) && !EQ (Vminibuffer_setup_hook, Qunbound)
 734       && !NILP (Vrun_hooks))
 735     call1 (Vrun_hooks, Qminibuffer_setup_hook);
 736 
 737   
 738   current_buffer->undo_list = Qnil;
 739 
 740   recursive_edit_1 ();
 741 
 742    743 
 744   if (XWINDOW (minibuf_window)->cursor.vpos >= 0
 745       && !noninteractive)
 746     {
 747       XWINDOW (minibuf_window)->cursor.hpos = 0;
 748       XWINDOW (minibuf_window)->cursor.x = 0;
 749       XWINDOW (minibuf_window)->must_be_updated_p = 1;
 750       update_frame (XFRAME (selected_frame), 1, 1);
 751       {
 752         struct frame *f = XFRAME (XWINDOW (minibuf_window)->frame);
 753         struct redisplay_interface *rif = FRAME_RIF (f);
 754         if (rif && rif->flush_display)
 755           rif->flush_display (f);
 756       }
 757     }
 758 
 759   
 760   Fset_buffer (minibuffer);
 761   if (allow_props)
 762     val = Fminibuffer_contents ();
 763   else
 764     val = Fminibuffer_contents_no_properties ();
 765 
 766   
 767 
 768   last_minibuf_string = val;
 769 
 770   
 771   if (SCHARS (val) != 0)
 772     histstring = val;
 773   else if (STRINGP (defalt))
 774     histstring = defalt;
 775   else if (CONSP (defalt) && STRINGP (XCAR (defalt)))
 776     histstring = XCAR (defalt);
 777   else
 778     histstring = Qnil;
 779 
 780   
 781   if (!NILP (Vhistory_add_new_input)
 782       && SYMBOLP (Vminibuffer_history_variable)
 783       && !NILP (histstring))
 784     {
 785        786 
 787       Lisp_Object histval;
 788 
 789       
 790 
 791       histval = find_symbol_value (Vminibuffer_history_variable);
 792       if (EQ (histval, Qunbound))
 793         Fset (Vminibuffer_history_variable, Qnil);
 794 
 795        796 
 797 
 798       if (NILP (histval)
 799           || (CONSP (histval)
 800               
 801               && (NILP (Fequal (histstring, Fcar (histval))))))
 802         {
 803           Lisp_Object length;
 804 
 805           if (history_delete_duplicates) Fdelete (histstring, histval);
 806           histval = Fcons (histstring, histval);
 807           Fset (Vminibuffer_history_variable, histval);
 808 
 809           
 810           length = Fget (Vminibuffer_history_variable, Qhistory_length);
 811           if (NILP (length)) length = Vhistory_length;
 812           if (INTEGERP (length))
 813             {
 814               if (XINT (length) <= 0)
 815                 Fset (Vminibuffer_history_variable, Qnil);
 816               else
 817                 {
 818                   Lisp_Object temp;
 819 
 820                   temp = Fnthcdr (Fsub1 (length), histval);
 821                   if (CONSP (temp)) Fsetcdr (temp, Qnil);
 822                 }
 823             }
 824         }
 825     }
 826 
 827   
 828   if (expflag)
 829     val = string_to_object (val, defalt);
 830 
 831    832 
 833   UNGCPRO;
 834   return unbind_to (count, val);
 835 }
 836 
 837  838  839 
 840 
 841 Lisp_Object
 842 get_minibuffer (depth)
 843      int depth;
 844 {
 845   Lisp_Object tail, num, buf;
 846   char name[24];
 847   extern Lisp_Object nconc2 ();
 848 
 849   XSETFASTINT (num, depth);
 850   tail = Fnthcdr (num, Vminibuffer_list);
 851   if (NILP (tail))
 852     {
 853       tail = Fcons (Qnil, Qnil);
 854       Vminibuffer_list = nconc2 (Vminibuffer_list, tail);
 855     }
 856   buf = Fcar (tail);
 857   if (NILP (buf) || NILP (XBUFFER (buf)->name))
 858     {
 859       sprintf (name, " *Minibuf-%d*", depth);
 860       buf = Fget_buffer_create (build_string (name));
 861 
 862        863 
 864       Fbuffer_enable_undo (buf);
 865 
 866       XSETCAR (tail, buf);
 867     }
 868   else
 869     {
 870       int count = SPECPDL_INDEX ();
 871        872  873  874 
 875       delete_all_overlays (XBUFFER (buf));
 876       reset_buffer (XBUFFER (buf));
 877       record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
 878       Fset_buffer (buf);
 879       Fkill_all_local_variables ();
 880       unbind_to (count, Qnil);
 881     }
 882 
 883   return buf;
 884 }
 885 
 886 static Lisp_Object
 887 run_exit_minibuf_hook (data)
 888      Lisp_Object data;
 889 {
 890   if (!NILP (Vminibuffer_exit_hook) && !EQ (Vminibuffer_exit_hook, Qunbound)
 891       && !NILP (Vrun_hooks))
 892     safe_run_hooks (Qminibuffer_exit_hook);
 893 
 894   return Qnil;
 895 }
 896 
 897  898 
 899 
 900 static Lisp_Object
 901 read_minibuf_unwind (data)
 902      Lisp_Object data;
 903 {
 904   Lisp_Object old_deactivate_mark;
 905   Lisp_Object window;
 906 
 907    908 
 909   minibuf_level--;
 910 
 911   window = minibuf_window;
 912    913 
 914   Fset_buffer (XWINDOW (window)->buffer);
 915 
 916   
 917   minibuf_prompt = Fcar (minibuf_save_list);
 918   minibuf_save_list = Fcdr (minibuf_save_list);
 919   minibuf_prompt_width = XFASTINT (Fcar (minibuf_save_list));
 920   minibuf_save_list = Fcdr (minibuf_save_list);
 921   Vhelp_form = Fcar (minibuf_save_list);
 922   minibuf_save_list = Fcdr (minibuf_save_list);
 923   Vcurrent_prefix_arg = Fcar (minibuf_save_list);
 924   minibuf_save_list = Fcdr (minibuf_save_list);
 925   Vminibuffer_history_position = Fcar (minibuf_save_list);
 926   minibuf_save_list = Fcdr (minibuf_save_list);
 927   Vminibuffer_history_variable = Fcar (minibuf_save_list);
 928   minibuf_save_list = Fcdr (minibuf_save_list);
 929   Voverriding_local_map = Fcar (minibuf_save_list);
 930   minibuf_save_list = Fcdr (minibuf_save_list);
 931 #if 0
 932   temp = Fcar (minibuf_save_list);
 933   if (FRAME_LIVE_P (XFRAME (WINDOW_FRAME (XWINDOW (temp)))))
 934     minibuf_window = temp;
 935 #endif
 936   minibuf_save_list = Fcdr (minibuf_save_list);
 937 
 938   
 939   {
 940     int count = SPECPDL_INDEX ();
 941     
 942     specbind (Qinhibit_read_only, Qt);
 943     specbind (Qinhibit_modification_hooks, Qt);
 944     old_deactivate_mark = Vdeactivate_mark;
 945     Ferase_buffer ();
 946     Vdeactivate_mark = old_deactivate_mark;
 947     unbind_to (count, Qnil);
 948   }
 949 
 950    951 
 952   if (minibuf_level == 0)
 953     resize_mini_window (XWINDOW (window), 0);
 954 
 955   
 956   windows_or_buffers_changed++;
 957   XSETFASTINT (XWINDOW (window)->last_modified, 0);
 958   XSETFASTINT (XWINDOW (window)->last_overlay_modified, 0);
 959   return Qnil;
 960 }
 961 
 962 
 963 DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 7, 0,
 964        doc:  965  966  967  968  969  970  971  972  973  974  975  976  977  978  979  980  981  982  983  984  985  986  987  988  989  990  991  992  993  994  995  996  997  998  999 1000 1001 1002 1003 )
1004    (prompt, initial_contents, keymap, read, hist, default_value, inherit_input_method)
1005      Lisp_Object prompt, initial_contents, keymap, read, hist, default_value;
1006      Lisp_Object inherit_input_method;
1007 {
1008   Lisp_Object histvar, histpos, val;
1009   struct gcpro gcpro1;
1010 
1011   CHECK_STRING (prompt);
1012   if (NILP (keymap))
1013     keymap = Vminibuffer_local_map;
1014   else
1015     keymap = get_keymap (keymap, 1, 0);
1016 
1017   if (SYMBOLP (hist))
1018     {
1019       histvar = hist;
1020       histpos = Qnil;
1021     }
1022   else
1023     {
1024       histvar = Fcar_safe (hist);
1025       histpos = Fcdr_safe (hist);
1026     }
1027   if (NILP (histvar))
1028     histvar = Qminibuffer_history;
1029   if (NILP (histpos))
1030     XSETFASTINT (histpos, 0);
1031 
1032   GCPRO1 (default_value);
1033   val = read_minibuf (keymap, initial_contents, prompt,
1034                       Qnil, !NILP (read),
1035                       histvar, histpos, default_value,
1036                       minibuffer_allow_text_properties,
1037                       !NILP (inherit_input_method));
1038   UNGCPRO;
1039   return val;
1040 }
1041 
1042 DEFUN ("read-minibuffer", Fread_minibuffer, Sread_minibuffer, 1, 2, 0,
1043        doc: 1044 1045 1046 1047 )
1048      (prompt, initial_contents)
1049      Lisp_Object prompt, initial_contents;
1050 {
1051   CHECK_STRING (prompt);
1052   return read_minibuf (Vminibuffer_local_map, initial_contents,
1053                        prompt, Qnil, 1, Qminibuffer_history,
1054                        make_number (0), Qnil, 0, 0);
1055 }
1056 
1057 DEFUN ("eval-minibuffer", Feval_minibuffer, Seval_minibuffer, 1, 2, 0,
1058        doc: 1059 1060 1061 1062 )
1063      (prompt, initial_contents)
1064      Lisp_Object prompt, initial_contents;
1065 {
1066   return Feval (read_minibuf (Vread_expression_map, initial_contents,
1067                               prompt, Qnil, 1, Qread_expression_history,
1068                               make_number (0), Qnil, 0, 0));
1069 }
1070 
1071 
1072 
1073 DEFUN ("read-string", Fread_string, Sread_string, 1, 5, 0,
1074        doc: 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 )
1088      (prompt, initial_input, history, default_value, inherit_input_method)
1089      Lisp_Object prompt, initial_input, history, default_value;
1090      Lisp_Object inherit_input_method;
1091 {
1092   Lisp_Object val;
1093   val = Fread_from_minibuffer (prompt, initial_input, Qnil,
1094                                Qnil, history, default_value,
1095                                inherit_input_method);
1096   if (STRINGP (val) && SCHARS (val) == 0 && ! NILP (default_value))
1097     val = CONSP (default_value) ? XCAR (default_value) : default_value;
1098   return val;
1099 }
1100 
1101 DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 3, 0,
1102        doc: 1103 1104 1105 1106 1107 1108 1109 1110 )
1111      (prompt, initial, inherit_input_method)
1112      Lisp_Object prompt, initial, inherit_input_method;
1113 {
1114   CHECK_STRING (prompt);
1115   return read_minibuf (Vminibuffer_local_ns_map, initial, prompt, Qnil,
1116                        0, Qminibuffer_history, make_number (0), Qnil, 0,
1117                        !NILP (inherit_input_method));
1118 }
1119 
1120 DEFUN ("read-command", Fread_command, Sread_command, 1, 2, 0,
1121        doc: 1122 1123 )
1124      (prompt, default_value)
1125      Lisp_Object prompt, default_value;
1126 {
1127   Lisp_Object name, default_string;
1128 
1129   if (NILP (default_value))
1130     default_string = Qnil;
1131   else if (SYMBOLP (default_value))
1132     default_string = SYMBOL_NAME (default_value);
1133   else
1134     default_string = default_value;
1135 
1136   name = Fcompleting_read (prompt, Vobarray, Qcommandp, Qt,
1137                            Qnil, Qnil, default_string, Qnil);
1138   if (NILP (name))
1139     return name;
1140   return Fintern (name, Qnil);
1141 }
1142 
1143 #ifdef NOTDEF
1144 DEFUN ("read-function", Fread_function, Sread_function, 1, 1, 0,
1145        doc: 1146 )
1147      (prompt)
1148      Lisp_Object prompt;
1149 {
1150   return Fintern (Fcompleting_read (prompt, Vobarray, Qfboundp, Qt, Qnil, Qnil, Qnil, Qnil),
1151                   Qnil);
1152 }
1153 #endif 
1154 
1155 DEFUN ("read-variable", Fread_variable, Sread_variable, 1, 2, 0,
1156        doc: 1157 1158 1159 )
1160      (prompt, default_value)
1161      Lisp_Object prompt, default_value;
1162 {
1163   Lisp_Object name, default_string;
1164 
1165   if (NILP (default_value))
1166     default_string = Qnil;
1167   else if (SYMBOLP (default_value))
1168     default_string = SYMBOL_NAME (default_value);
1169   else
1170     default_string = default_value;
1171 
1172   name = Fcompleting_read (prompt, Vobarray,
1173                            Quser_variable_p, Qt,
1174                            Qnil, Qnil, default_string, Qnil);
1175   if (NILP (name))
1176     return name;
1177   return Fintern (name, Qnil);
1178 }
1179 
1180 DEFUN ("read-buffer", Fread_buffer, Sread_buffer, 1, 3, 0,
1181        doc: 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 )
1193      (prompt, def, require_match)
1194      Lisp_Object prompt, def, require_match;
1195 {
1196   Lisp_Object args[4], result;
1197   unsigned char *s;
1198   int len;
1199   int count = SPECPDL_INDEX ();
1200 
1201   if (BUFFERP (def))
1202     def = XBUFFER (def)->name;
1203 
1204   specbind (Qcompletion_ignore_case,
1205             read_buffer_completion_ignore_case ? Qt : Qnil);
1206 
1207   if (NILP (Vread_buffer_function))
1208     {
1209       if (!NILP (def))
1210         {
1211           1212 1213 1214 1215 
1216 
1217           if (STRINGP (prompt))
1218             {
1219               s = SDATA (prompt);
1220               len = strlen (s);
1221               if (len >= 2 && s[len - 2] == ':' && s[len - 1] == ' ')
1222                 len = len - 2;
1223               else if (len >= 1 && (s[len - 1] == ':' || s[len - 1] == ' '))
1224                 len--;
1225 
1226               prompt = make_specified_string (s, -1, len,
1227                                               STRING_MULTIBYTE (prompt));
1228             }
1229 
1230           args[0] = build_string ("%s (default %s): ");
1231           args[1] = prompt;
1232           args[2] = CONSP (def) ? XCAR (def) : def;
1233           prompt = Fformat (3, args);
1234         }
1235 
1236       result = Fcompleting_read (prompt, intern ("internal-complete-buffer"),
1237                                  Qnil, require_match, Qnil, Qbuffer_name_history,
1238                                  def, Qnil);
1239     }
1240   else
1241     {
1242       args[0] = Vread_buffer_function;
1243       args[1] = prompt;
1244       args[2] = def;
1245       args[3] = require_match;
1246       result = Ffuncall(4, args);
1247     }
1248   return unbind_to (count, result);
1249 }
1250 
1251 static Lisp_Object
1252 minibuf_conform_representation (string, basis)
1253      Lisp_Object string, basis;
1254 {
1255   if (STRING_MULTIBYTE (string) == STRING_MULTIBYTE (basis))
1256     return string;
1257 
1258   if (STRING_MULTIBYTE (string))
1259     return Fstring_make_unibyte (string);
1260   else
1261     return Fstring_make_multibyte (string);
1262 }
1263 
1264 DEFUN ("try-completion", Ftry_completion, Stry_completion, 2, 3, 0,
1265        doc: 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 )
1295      (string, collection, predicate)
1296      Lisp_Object string, collection, predicate;
1297 {
1298   Lisp_Object bestmatch, tail, elt, eltstring;
1299   
1300   int bestmatchsize = 0;
1301   
1302   int compare, matchsize;
1303   enum { function_table, list_table, obarray_table, hash_table}
1304     type = (HASH_TABLE_P (collection) ? hash_table
1305             : VECTORP (collection) ? obarray_table
1306             : ((NILP (collection)
1307                 || (CONSP (collection)
1308                     && (!SYMBOLP (XCAR (collection))
1309                         || NILP (XCAR (collection)))))
1310                ? list_table : function_table));
1311   int index = 0, obsize = 0;
1312   int matchcount = 0;
1313   int bindcount = -1;
1314   Lisp_Object bucket, zero, end, tem;
1315   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1316 
1317   CHECK_STRING (string);
1318   if (type == function_table)
1319     return call3 (collection, string, predicate, Qnil);
1320 
1321   bestmatch = bucket = Qnil;
1322   zero = make_number (0);
1323 
1324   
1325   tail = collection;
1326   if (type == obarray_table)
1327     {
1328       collection = check_obarray (collection);
1329       obsize = XVECTOR (collection)->size;
1330       bucket = XVECTOR (collection)->contents[index];
1331     }
1332 
1333   while (1)
1334     {
1335       
1336       
1337       1338 
1339 
1340       if (type == list_table)
1341         {
1342           if (!CONSP (tail))
1343             break;
1344           elt = XCAR (tail);
1345           eltstring = CONSP (elt) ? XCAR (elt) : elt;
1346           tail = XCDR (tail);
1347         }
1348       else if (type == obarray_table)
1349         {
1350           if (!EQ (bucket, zero))
1351             {
1352               if (!SYMBOLP (bucket))
1353                 error ("Bad data in guts of obarray");
1354               elt = bucket;
1355               eltstring = elt;
1356               if (XSYMBOL (bucket)->next)
1357                 XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
1358               else
1359                 XSETFASTINT (bucket, 0);
1360             }
1361           else if (++index >= obsize)
1362             break;
1363           else
1364             {
1365               bucket = XVECTOR (collection)->contents[index];
1366               continue;
1367             }
1368         }
1369       else 
1370         {
1371           while (index < HASH_TABLE_SIZE (XHASH_TABLE (collection))
1372                  && NILP (HASH_HASH (XHASH_TABLE (collection), index)))
1373             index++;
1374           if (index >= HASH_TABLE_SIZE (XHASH_TABLE (collection)))
1375             break;
1376           else
1377             elt = eltstring = HASH_KEY (XHASH_TABLE (collection), index++);
1378         }
1379 
1380       
1381 
1382       if (SYMBOLP (eltstring))
1383         eltstring = Fsymbol_name (eltstring);
1384 
1385       if (STRINGP (eltstring)
1386           && SCHARS (string) <= SCHARS (eltstring)
1387           && (tem = Fcompare_strings (eltstring, zero,
1388                                       make_number (SCHARS (string)),
1389                                       string, zero, Qnil,
1390                                       completion_ignore_case ? Qt : Qnil),
1391               EQ (Qt, tem)))
1392         {
1393           
1394           Lisp_Object regexps;
1395 
1396           
1397           {
1398             for (regexps = Vcompletion_regexp_list; CONSP (regexps);
1399                  regexps = XCDR (regexps))
1400               {
1401                 if (bindcount < 0) {
1402                   bindcount = SPECPDL_INDEX ();
1403                   specbind (Qcase_fold_search,
1404                             completion_ignore_case ? Qt : Qnil);
1405                 }
1406                 tem = Fstring_match (XCAR (regexps), eltstring, zero);
1407                 if (NILP (tem))
1408                   break;
1409               }
1410             if (CONSP (regexps))
1411               continue;
1412           }
1413 
1414           1415 
1416 
1417           if (!NILP (predicate))
1418             {
1419               if (EQ (predicate, Qcommandp))
1420                 tem = Fcommandp (elt, Qnil);
1421               else
1422                 {
1423                   if (bindcount >= 0)
1424                     {
1425                       unbind_to (bindcount, Qnil);
1426                       bindcount = -1;
1427                     }
1428                   GCPRO4 (tail, string, eltstring, bestmatch);
1429                   tem = (type == hash_table
1430                          ? call2 (predicate, elt,
1431                                   HASH_VALUE (XHASH_TABLE (collection),
1432                                               index - 1))
1433                          : call1 (predicate, elt));
1434                   UNGCPRO;
1435                 }
1436               if (NILP (tem)) continue;
1437             }
1438 
1439           
1440 
1441           if (NILP (bestmatch))
1442             {
1443               matchcount = 1;
1444               bestmatch = eltstring;
1445               bestmatchsize = SCHARS (eltstring);
1446             }
1447           else
1448             {
1449               compare = min (bestmatchsize, SCHARS (eltstring));
1450               tem = Fcompare_strings (bestmatch, zero,
1451                                       make_number (compare),
1452                                       eltstring, zero,
1453                                       make_number (compare),
1454                                       completion_ignore_case ? Qt : Qnil);
1455               if (EQ (tem, Qt))
1456                 matchsize = compare;
1457               else if (XINT (tem) < 0)
1458                 matchsize = - XINT (tem) - 1;
1459               else
1460                 matchsize = XINT (tem) - 1;
1461 
1462               if (completion_ignore_case)
1463                 {
1464                   1465 1466 1467 
1468                   if ((matchsize == SCHARS (eltstring)
1469                        && matchsize < SCHARS (bestmatch))
1470                       ||
1471                       1472 1473 
1474                       1475 1476 
1477                       ((matchsize == SCHARS (eltstring))
1478                        ==
1479                        (matchsize == SCHARS (bestmatch))
1480                        && (tem = Fcompare_strings (eltstring, zero,
1481                                                    make_number (SCHARS (string)),
1482                                                    string, zero,
1483                                                    Qnil,
1484                                                    Qnil),
1485                            EQ (Qt, tem))
1486                        && (tem = Fcompare_strings (bestmatch, zero,
1487                                                    make_number (SCHARS (string)),
1488                                                    string, zero,
1489                                                    Qnil,
1490                                                    Qnil),
1491                            ! EQ (Qt, tem))))
1492                     bestmatch = eltstring;
1493                 }
1494               if (bestmatchsize != SCHARS (eltstring)
1495                   || bestmatchsize != matchsize)
1496                 
1497                 matchcount++;
1498               bestmatchsize = matchsize;
1499               if (matchsize <= SCHARS (string)
1500                   1501 1502 
1503                   && !completion_ignore_case
1504                   && matchcount > 1)
1505                 
1506                 break;
1507             }
1508         }
1509     }
1510 
1511   if (bindcount >= 0) {
1512     unbind_to (bindcount, Qnil);
1513     bindcount = -1;
1514   }
1515 
1516   if (NILP (bestmatch))
1517     return Qnil;                
1518   1519 1520 
1521   if (completion_ignore_case && bestmatchsize == SCHARS (string)
1522       && SCHARS (bestmatch) > bestmatchsize)
1523     return minibuf_conform_representation (string, bestmatch);
1524 
1525   1526 
1527   if (matchcount == 1 && !NILP (Fequal (bestmatch, string)))
1528     return Qt;
1529 
1530   XSETFASTINT (zero, 0);                
1531   XSETFASTINT (end, bestmatchsize);     
1532   return Fsubstring (bestmatch, zero, end);
1533 }
1534 
1535 DEFUN ("all-completions", Fall_completions, Sall_completions, 2, 4, 0,
1536        doc: 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 )
1567      (string, collection, predicate, hide_spaces)
1568      Lisp_Object string, collection, predicate, hide_spaces;
1569 {
1570   Lisp_Object tail, elt, eltstring;
1571   Lisp_Object allmatches;
1572   int type = HASH_TABLE_P (collection) ? 3
1573     : VECTORP (collection) ? 2
1574     : NILP (collection) || (CONSP (collection)
1575                             && (!SYMBOLP (XCAR (collection))
1576                                 || NILP (XCAR (collection))));
1577   int index = 0, obsize = 0;
1578   int bindcount = -1;
1579   Lisp_Object bucket, tem, zero;
1580   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1581 
1582   CHECK_STRING (string);
1583   if (type == 0)
1584     return call3 (collection, string, predicate, Qt);
1585   allmatches = bucket = Qnil;
1586   zero = make_number (0);
1587 
1588   
1589   tail = collection;
1590   if (type == 2)
1591     {
1592       obsize = XVECTOR (collection)->size;
1593       bucket = XVECTOR (collection)->contents[index];
1594     }
1595 
1596   while (1)
1597     {
1598       
1599       
1600       1601 
1602 
1603       if (type == 1)
1604         {
1605           if (!CONSP (tail))
1606             break;
1607           elt = XCAR (tail);
1608           eltstring = CONSP (elt) ? XCAR (elt) : elt;
1609           tail = XCDR (tail);
1610         }
1611       else if (type == 2)
1612         {
1613           if (!EQ (bucket, zero))
1614             {
1615               elt = bucket;
1616               eltstring = elt;
1617               if (XSYMBOL (bucket)->next)
1618                 XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
1619               else
1620                 XSETFASTINT (bucket, 0);
1621             }
1622           else if (++index >= obsize)
1623             break;
1624           else
1625             {
1626               bucket = XVECTOR (collection)->contents[index];
1627               continue;
1628             }
1629         }
1630       else 
1631         {
1632           while (index < HASH_TABLE_SIZE (XHASH_TABLE (collection))
1633                  && NILP (HASH_HASH (XHASH_TABLE (collection), index)))
1634             index++;
1635           if (index >= HASH_TABLE_SIZE (XHASH_TABLE (collection)))
1636             break;
1637           else
1638             elt = eltstring = HASH_KEY (XHASH_TABLE (collection), index++);
1639         }
1640 
1641       
1642 
1643       if (SYMBOLP (eltstring))
1644         eltstring = Fsymbol_name (eltstring);
1645 
1646       if (STRINGP (eltstring)
1647           && SCHARS (string) <= SCHARS (eltstring)
1648           1649 
1650           && (NILP (hide_spaces)
1651               || (SBYTES (string) > 0
1652                   && SREF (string, 0) == ' ')
1653               || SREF (eltstring, 0) != ' ')
1654           && (tem = Fcompare_strings (eltstring, zero,
1655                                       make_number (SCHARS (string)),
1656                                       string, zero,
1657                                       make_number (SCHARS (string)),
1658                                       completion_ignore_case ? Qt : Qnil),
1659               EQ (Qt, tem)))
1660         {
1661           
1662           Lisp_Object regexps;
1663           Lisp_Object zero;
1664           XSETFASTINT (zero, 0);
1665 
1666           
1667           {
1668             for (regexps = Vcompletion_regexp_list; CONSP (regexps);
1669                  regexps = XCDR (regexps))
1670               {
1671                 if (bindcount < 0) {
1672                   bindcount = SPECPDL_INDEX ();
1673                   specbind (Qcase_fold_search,
1674                             completion_ignore_case ? Qt : Qnil);
1675                 }
1676                 tem = Fstring_match (XCAR (regexps), eltstring, zero);
1677                 if (NILP (tem))
1678                   break;
1679               }
1680             if (CONSP (regexps))
1681               continue;
1682           }
1683 
1684           1685 
1686 
1687           if (!NILP (predicate))
1688             {
1689               if (EQ (predicate, Qcommandp))
1690                 tem = Fcommandp (elt, Qnil);
1691               else
1692                 {
1693                   if (bindcount >= 0) {
1694                     unbind_to (bindcount, Qnil);
1695                     bindcount = -1;
1696                   }
1697                   GCPRO4 (tail, eltstring, allmatches, string);
1698                   tem = type == 3
1699                     ? call2 (predicate, elt,
1700                              HASH_VALUE (XHASH_TABLE (collection), index - 1))
1701                     : call1 (predicate, elt);
1702                   UNGCPRO;
1703                 }
1704               if (NILP (tem)) continue;
1705             }
1706           
1707           allmatches = Fcons (eltstring, allmatches);
1708         }
1709     }
1710 
1711   if (bindcount >= 0) {
1712     unbind_to (bindcount, Qnil);
1713     bindcount = -1;
1714   }
1715 
1716   return Fnreverse (allmatches);
1717 }
1718 
1719 DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 8, 0,
1720        doc: 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 )
1774      (prompt, collection, predicate, require_match, initial_input, hist, def, inherit_input_method)
1775      Lisp_Object prompt, collection, predicate, require_match, initial_input;
1776      Lisp_Object hist, def, inherit_input_method;
1777 {
1778   Lisp_Object val, histvar, histpos, position;
1779   Lisp_Object init;
1780   int pos = 0;
1781   int count = SPECPDL_INDEX ();
1782   struct gcpro gcpro1;
1783 
1784   init = initial_input;
1785   GCPRO1 (def);
1786 
1787   specbind (Qminibuffer_completion_table, collection);
1788   specbind (Qminibuffer_completion_predicate, predicate);
1789   specbind (Qminibuffer_completion_confirm,
1790             EQ (require_match, Qt) ? Qnil : require_match);
1791 
1792   position = Qnil;
1793   if (!NILP (init))
1794     {
1795       if (CONSP (init))
1796         {
1797           position = Fcdr (init);
1798           init = Fcar (init);
1799         }
1800       CHECK_STRING (init);
1801       if (!NILP (position))
1802         {
1803           CHECK_NUMBER (position);
1804           
1805           pos = XINT (position) - SCHARS (init);
1806         }
1807     }
1808 
1809   if (SYMBOLP (hist))
1810     {
1811       histvar = hist;
1812       histpos = Qnil;
1813     }
1814   else
1815     {
1816       histvar = Fcar_safe (hist);
1817       histpos = Fcdr_safe (hist);
1818     }
1819   if (NILP (histvar))
1820     histvar = Qminibuffer_history;
1821   if (NILP (histpos))
1822     XSETFASTINT (histpos, 0);
1823 
1824   val = read_minibuf (NILP (require_match)
1825                       ? (NILP (Vminibuffer_completing_file_name)
1826                          || EQ (Vminibuffer_completing_file_name, Qlambda)
1827                          ? Vminibuffer_local_completion_map
1828                          : Vminibuffer_local_filename_completion_map)
1829                       : (NILP (Vminibuffer_completing_file_name)
1830                          || EQ (Vminibuffer_completing_file_name, Qlambda)
1831                          ? Vminibuffer_local_must_match_map
1832                          : Vminibuffer_local_filename_must_match_map),
1833                       init, prompt, make_number (pos), 0,
1834                       histvar, histpos, def, 0,
1835                       !NILP (inherit_input_method));
1836 
1837   if (STRINGP (val) && SCHARS (val) == 0 && ! NILP (def))
1838     val = CONSP (def) ? XCAR (def) : def;
1839 
1840   RETURN_UNGCPRO (unbind_to (count, val));
1841 }
1842 
1843 Lisp_Object Fassoc_string ();
1844 
1845 
1846 DEFUN ("test-completion", Ftest_completion, Stest_completion, 2, 3, 0,
1847        doc: 1848 1849 1850 )
1851        (string, collection, predicate)
1852      Lisp_Object string, collection, predicate;
1853 {
1854   Lisp_Object regexps, tail, tem = Qnil;
1855   int i = 0;
1856 
1857   CHECK_STRING (string);
1858 
1859   if ((CONSP (collection)
1860        && (!SYMBOLP (XCAR (collection)) || NILP (XCAR (collection))))
1861       || NILP (collection))
1862     {
1863       tem = Fassoc_string (string, collection, completion_ignore_case ? Qt : Qnil);
1864       if (NILP (tem))
1865         return Qnil;
1866     }
1867   else if (VECTORP (collection))
1868     {
1869       
1870       tem = oblookup (collection,
1871                       SDATA (string),
1872                       SCHARS (string),
1873                       SBYTES (string));
1874       if (!SYMBOLP (tem))
1875         {
1876           if (STRING_MULTIBYTE (string))
1877             string = Fstring_make_unibyte (string);
1878           else
1879             string = Fstring_make_multibyte (string);
1880 
1881           tem = oblookup (collection,
1882                           SDATA (string),
1883                           SCHARS (string),
1884                           SBYTES (string));
1885         }
1886 
1887       if (completion_ignore_case && !SYMBOLP (tem))
1888         {
1889           for (i = XVECTOR (collection)->size - 1; i >= 0; i--)
1890             {
1891               tail = XVECTOR (collection)->contents[i];
1892               if (SYMBOLP (tail))
1893                 while (1)
1894                   {
1895                     if (EQ((Fcompare_strings (string, make_number (0), Qnil,
1896                                               Fsymbol_name (tail),
1897                                               make_number (0) , Qnil, Qt)),
1898                            Qt))
1899                       {
1900                         tem = tail;
1901                         break;
1902                       }
1903                     if (XSYMBOL (tail)->next == 0)
1904                       break;
1905                     XSETSYMBOL (tail, XSYMBOL (tail)->next);
1906                   }
1907             }
1908         }
1909 
1910       if (!SYMBOLP (tem))
1911         return Qnil;
1912     }
1913   else if (HASH_TABLE_P (collection))
1914     {
1915       struct Lisp_Hash_Table *h = XHASH_TABLE (collection);
1916       i = hash_lookup (h, string, NULL);
1917       if (i >= 0)
1918         tem = HASH_KEY (h, i);
1919       else
1920         for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
1921           if (!NILP (HASH_HASH (h, i)) &&
1922               EQ (Fcompare_strings (string, make_number (0), Qnil,
1923                                     HASH_KEY (h, i), make_number (0) , Qnil,
1924                                     completion_ignore_case ? Qt : Qnil),
1925                   Qt))
1926             {
1927               tem = HASH_KEY (h, i);
1928               break;
1929             }
1930       if (!STRINGP (tem))
1931         return Qnil;
1932     }
1933   else
1934     return call3 (collection, string, predicate, Qlambda);
1935 
1936   
1937   if (CONSP (Vcompletion_regexp_list))
1938     {
1939       int count = SPECPDL_INDEX ();
1940       specbind (Qcase_fold_search, completion_ignore_case ? Qt : Qnil);
1941       for (regexps = Vcompletion_regexp_list; CONSP (regexps);
1942            regexps = XCDR (regexps))
1943         {
1944           if (NILP (Fstring_match (XCAR (regexps),
1945                                    SYMBOLP (tem) ? string : tem,
1946                                    Qnil)))
1947             return unbind_to (count, Qnil);
1948         }
1949       unbind_to (count, Qnil);
1950     }
1951 
1952   
1953   if (!NILP (predicate))
1954     {
1955       return HASH_TABLE_P (collection)
1956         ? call2 (predicate, tem, HASH_VALUE (XHASH_TABLE (collection), i))
1957         : call1 (predicate, tem);
1958     }
1959   else
1960     return Qt;
1961 }
1962 
1963 DEFUN ("internal-complete-buffer", Finternal_complete_buffer, Sinternal_complete_buffer, 3, 3, 0,
1964        doc: 1965 1966 1967 1968 1969 )
1970      (string, predicate, flag)
1971      Lisp_Object string, predicate, flag;
1972 {
1973   if (NILP (flag))
1974     return Ftry_completion (string, Vbuffer_alist, predicate);
1975   else if (EQ (flag, Qt))
1976     {
1977       Lisp_Object res = Fall_completions (string, Vbuffer_alist, predicate, Qnil);
1978       if (SCHARS (string) > 0)
1979         return res;
1980       else
1981         { 
1982           Lisp_Object bufs = res;
1983           
1984           while (CONSP (bufs) && SREF (XCAR (bufs), 0) == ' ')
1985             bufs = XCDR (bufs);
1986           if (NILP (bufs))
1987             
1988             return res;
1989           res = bufs;
1990           while (CONSP (XCDR (bufs)))
1991             if (SREF (XCAR (XCDR (bufs)), 0) == ' ')
1992               XSETCDR (bufs, XCDR (XCDR (bufs)));
1993             else
1994               bufs = XCDR (bufs);
1995           return res;
1996         }
1997     }
1998   else                          
1999     return Ftest_completion (string, Vbuffer_alist, predicate);
2000 }
2001 
2002 
2003 
2004 DEFUN ("assoc-string", Fassoc_string, Sassoc_string, 2, 3, 0,
2005        doc: 2006 2007 2008 2009 2010 2011 2012 2013 2014 )
2015        (key, list, case_fold)
2016      register Lisp_Object key;
2017      Lisp_Object list, case_fold;
2018 {
2019   register Lisp_Object tail;
2020 
2021   if (SYMBOLP (key))
2022     key = Fsymbol_name (key);
2023 
2024   for (tail = list; CONSP (tail); tail = XCDR (tail))
2025     {
2026       register Lisp_Object elt, tem, thiscar;
2027       elt = XCAR (tail);
2028       thiscar = CONSP (elt) ? XCAR (elt) : elt;
2029       if (SYMBOLP (thiscar))
2030         thiscar = Fsymbol_name (thiscar);
2031       else if (!STRINGP (thiscar))
2032         continue;
2033       tem = Fcompare_strings (thiscar, make_number (0), Qnil,
2034                               key, make_number (0), Qnil,
2035                               case_fold);
2036       if (EQ (tem, Qt))
2037         return elt;
2038       QUIT;
2039     }
2040   return Qnil;
2041 }
2042 
2043 
2044 DEFUN ("minibuffer-depth", Fminibuffer_depth, Sminibuffer_depth, 0, 0, 0,
2045        doc: )
2046      ()
2047 {
2048   return make_number (minibuf_level);
2049 }
2050 
2051 DEFUN ("minibuffer-prompt", Fminibuffer_prompt, Sminibuffer_prompt, 0, 0, 0,
2052        doc: 2053 )
2054      ()
2055 {
2056   return Fcopy_sequence (minibuf_prompt);
2057 }
2058 
2059 
2060 void
2061 init_minibuf_once ()
2062 {
2063   Vminibuffer_list = Qnil;
2064   staticpro (&Vminibuffer_list);
2065 }
2066 
2067 void
2068 syms_of_minibuf ()
2069 {
2070   minibuf_level = 0;
2071   minibuf_prompt = Qnil;
2072   staticpro (&minibuf_prompt);
2073 
2074   minibuf_save_list = Qnil;
2075   staticpro (&minibuf_save_list);
2076 
2077   Qcompletion_ignore_case = intern_c_string ("completion-ignore-case");
2078   staticpro (&Qcompletion_ignore_case);
2079 
2080   Qread_file_name_internal = intern_c_string ("read-file-name-internal");
2081   staticpro (&Qread_file_name_internal);
2082 
2083   Qminibuffer_default = intern_c_string ("minibuffer-default");
2084   staticpro (&Qminibuffer_default);
2085   Fset (Qminibuffer_default, Qnil);
2086 
2087   Qminibuffer_completion_table = intern_c_string ("minibuffer-completion-table");
2088   staticpro (&Qminibuffer_completion_table);
2089 
2090   Qminibuffer_completion_confirm = intern_c_string ("minibuffer-completion-confirm");
2091   staticpro (&Qminibuffer_completion_confirm);
2092 
2093   Qminibuffer_completion_predicate = intern_c_string ("minibuffer-completion-predicate");
2094   staticpro (&Qminibuffer_completion_predicate);
2095 
2096   staticpro (&last_minibuf_string);
2097   last_minibuf_string = Qnil;
2098 
2099   Quser_variable_p = intern_c_string ("user-variable-p");
2100   staticpro (&Quser_variable_p);
2101 
2102   Qminibuffer_history = intern_c_string ("minibuffer-history");
2103   staticpro (&Qminibuffer_history);
2104 
2105   Qbuffer_name_history = intern_c_string ("buffer-name-history");
2106   staticpro (&Qbuffer_name_history);
2107   Fset (Qbuffer_name_history, Qnil);
2108 
2109   Qminibuffer_setup_hook = intern_c_string ("minibuffer-setup-hook");
2110   staticpro (&Qminibuffer_setup_hook);
2111 
2112   Qminibuffer_exit_hook = intern_c_string ("minibuffer-exit-hook");
2113   staticpro (&Qminibuffer_exit_hook);
2114 
2115   Qhistory_length = intern_c_string ("history-length");
2116   staticpro (&Qhistory_length);
2117 
2118   Qcurrent_input_method = intern_c_string ("current-input-method");
2119   staticpro (&Qcurrent_input_method);
2120 
2121   Qactivate_input_method = intern_c_string ("activate-input-method");
2122   staticpro (&Qactivate_input_method);
2123 
2124   Qcase_fold_search = intern_c_string ("case-fold-search");
2125   staticpro (&Qcase_fold_search);
2126 
2127   Qread_expression_history = intern_c_string ("read-expression-history");
2128   staticpro (&Qread_expression_history);
2129 
2130   DEFVAR_LISP ("read-buffer-function", &Vread_buffer_function,
2131                doc: );
2132   Vread_buffer_function = Qnil;
2133 
2134   DEFVAR_BOOL ("read-buffer-completion-ignore-case",
2135                &read_buffer_completion_ignore_case,
2136                doc: );
2137   read_buffer_completion_ignore_case = 0;
2138 
2139   DEFVAR_LISP ("minibuffer-setup-hook", &Vminibuffer_setup_hook,
2140                doc: );
2141   Vminibuffer_setup_hook = Qnil;
2142 
2143   DEFVAR_LISP ("minibuffer-exit-hook", &Vminibuffer_exit_hook,
2144                doc: );
2145   Vminibuffer_exit_hook = Qnil;
2146 
2147   DEFVAR_LISP ("history-length", &Vhistory_length,
2148                doc: 2149 2150 2151 );
2152   XSETFASTINT (Vhistory_length, 30);
2153 
2154   DEFVAR_BOOL ("history-delete-duplicates", &history_delete_duplicates,
2155                doc: 2156 2157 );
2158   history_delete_duplicates = 0;
2159 
2160   DEFVAR_LISP ("history-add-new-input", &Vhistory_add_new_input,
2161                doc: 2162 2163 2164 );
2165   Vhistory_add_new_input = Qt;
2166 
2167   DEFVAR_BOOL ("completion-ignore-case", &completion_ignore_case,
2168                doc: 2169 2170 2171 2172 );
2173   completion_ignore_case = 0;
2174 
2175   DEFVAR_BOOL ("enable-recursive-minibuffers", &enable_recursive_minibuffers,
2176                doc: 2177 );
2178   enable_recursive_minibuffers = 0;
2179 
2180   DEFVAR_LISP ("minibuffer-completion-table", &Vminibuffer_completion_table,
2181                doc: 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 );
2193   Vminibuffer_completion_table = Qnil;
2194 
2195   DEFVAR_LISP ("minibuffer-completion-predicate", &Vminibuffer_completion_predicate,
2196                doc: );
2197   Vminibuffer_completion_predicate = Qnil;
2198 
2199   DEFVAR_LISP ("minibuffer-completion-confirm", &Vminibuffer_completion_confirm,
2200                doc: 2201 2202 2203 2204 2205 2206 2207 );
2208   Vminibuffer_completion_confirm = Qnil;
2209 
2210   DEFVAR_LISP ("minibuffer-completing-file-name",
2211                &Vminibuffer_completing_file_name,
2212                doc: );
2213   Vminibuffer_completing_file_name = Qnil;
2214 
2215   DEFVAR_LISP ("minibuffer-help-form", &Vminibuffer_help_form,
2216                doc: );
2217   Vminibuffer_help_form = Qnil;
2218 
2219   DEFVAR_LISP ("minibuffer-history-variable", &Vminibuffer_history_variable,
2220                doc: 2221 2222 2223 2224 );
2225   XSETFASTINT (Vminibuffer_history_variable, 0);
2226 
2227   DEFVAR_LISP ("minibuffer-history-position", &Vminibuffer_history_position,
2228                doc: );
2229   Vminibuffer_history_position = Qnil;
2230 
2231   DEFVAR_BOOL ("minibuffer-auto-raise", &minibuffer_auto_raise,
2232                doc: 2233 );
2234   minibuffer_auto_raise = 0;
2235 
2236   DEFVAR_LISP ("completion-regexp-list", &Vcompletion_regexp_list,
2237                doc: 2238 2239 2240 2241 2242 );
2243   Vcompletion_regexp_list = Qnil;
2244 
2245   DEFVAR_BOOL ("minibuffer-allow-text-properties",
2246                &minibuffer_allow_text_properties,
2247                doc: 2248 2249 2250 );
2251   minibuffer_allow_text_properties = 0;
2252 
2253   DEFVAR_LISP ("minibuffer-prompt-properties", &Vminibuffer_prompt_properties,
2254                doc: 2255 2256 );
2257   2258 
2259   Vminibuffer_prompt_properties
2260     = Fcons (intern_c_string ("read-only"), Fcons (Qt, Qnil));
2261 
2262   DEFVAR_LISP ("read-expression-map", &Vread_expression_map,
2263                doc: );
2264   Vread_expression_map = Qnil;
2265 
2266   defsubr (&Sset_minibuffer_window);
2267   defsubr (&Sread_from_minibuffer);
2268   defsubr (&Seval_minibuffer);
2269   defsubr (&Sread_minibuffer);
2270   defsubr (&Sread_string);
2271   defsubr (&Sread_command);
2272   defsubr (&Sread_variable);
2273   defsubr (&Sinternal_complete_buffer);
2274   defsubr (&Sread_buffer);
2275   defsubr (&Sread_no_blanks_input);
2276   defsubr (&Sminibuffer_depth);
2277   defsubr (&Sminibuffer_prompt);
2278 
2279   defsubr (&Sminibufferp);
2280   defsubr (&Sminibuffer_prompt_end);
2281   defsubr (&Sminibuffer_contents);
2282   defsubr (&Sminibuffer_contents_no_properties);
2283   defsubr (&Sminibuffer_completion_contents);
2284 
2285   defsubr (&Stry_completion);
2286   defsubr (&Sall_completions);
2287   defsubr (&Stest_completion);
2288   defsubr (&Sassoc_string);
2289   defsubr (&Scompleting_read);
2290 }
2291 
2292 2293