(Fsingle_key_description): Accept strings as keys since the buffer menu uses
[bpt/emacs.git] / src / lread.c
1 /* Lisp parsing and input streams.
2 Copyright (C) 1985, 1986, 1987, 1988, 1989,
3 1993 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21
22 #include <stdio.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <sys/file.h>
26 #include <ctype.h>
27 #include <config.h>
28 #include "lisp.h"
29
30 #ifndef standalone
31 #include "buffer.h"
32 #include <paths.h>
33 #include "commands.h"
34 #include "keyboard.h"
35 #include "termhooks.h"
36 #endif
37
38 #ifdef lint
39 #include <sys/inode.h>
40 #endif /* lint */
41
42 #ifndef X_OK
43 #define X_OK 01
44 #endif
45
46 #ifdef LISP_FLOAT_TYPE
47 #ifdef STDC_HEADERS
48 #include <stdlib.h>
49 #endif
50
51 #if 0 /* That is untrue--XINT is used below, and it uses INTBITS.
52 What in the world is values.h, anyway? */
53 #ifdef MSDOS
54 /* These are redefined in <values.h> and not used here */
55 #undef INTBITS
56 #undef LONGBITS
57 #undef SHORTBITS
58 #endif
59 #endif
60
61 #include <math.h>
62 #endif /* LISP_FLOAT_TYPE */
63
64 Lisp_Object Qread_char, Qget_file_char, Qstandard_input, Qcurrent_load_list;
65 Lisp_Object Qvariable_documentation, Vvalues, Vstandard_input, Vafter_load_alist;
66 Lisp_Object Qascii_character, Qload;
67
68 extern Lisp_Object Qevent_symbol_element_mask;
69
70 /* non-zero if inside `load' */
71 int load_in_progress;
72
73 /* Search path for files to be loaded. */
74 Lisp_Object Vload_path;
75
76 /* This is the user-visible association list that maps features to
77 lists of defs in their load files. */
78 Lisp_Object Vload_history;
79
80 /* This is useud to build the load history. */
81 Lisp_Object Vcurrent_load_list;
82
83 /* List of descriptors now open for Fload. */
84 static Lisp_Object load_descriptor_list;
85
86 /* File for get_file_char to read from. Use by load */
87 static FILE *instream;
88
89 /* When nonzero, read conses in pure space */
90 static int read_pure;
91
92 /* For use within read-from-string (this reader is non-reentrant!!) */
93 static int read_from_string_index;
94 static int read_from_string_limit;
95 \f
96 /* Handle unreading and rereading of characters.
97 Write READCHAR to read a character,
98 UNREAD(c) to unread c to be read again. */
99
100 #define READCHAR readchar (readcharfun)
101 #define UNREAD(c) unreadchar (readcharfun, c)
102
103 static int
104 readchar (readcharfun)
105 Lisp_Object readcharfun;
106 {
107 Lisp_Object tem;
108 register struct buffer *inbuffer;
109 register int c, mpos;
110
111 if (XTYPE (readcharfun) == Lisp_Buffer)
112 {
113 inbuffer = XBUFFER (readcharfun);
114
115 if (BUF_PT (inbuffer) >= BUF_ZV (inbuffer))
116 return -1;
117 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, BUF_PT (inbuffer));
118 SET_BUF_PT (inbuffer, BUF_PT (inbuffer) + 1);
119
120 return c;
121 }
122 if (XTYPE (readcharfun) == Lisp_Marker)
123 {
124 inbuffer = XMARKER (readcharfun)->buffer;
125
126 mpos = marker_position (readcharfun);
127
128 if (mpos > BUF_ZV (inbuffer) - 1)
129 return -1;
130 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, mpos);
131 if (mpos != BUF_GPT (inbuffer))
132 XMARKER (readcharfun)->bufpos++;
133 else
134 Fset_marker (readcharfun, make_number (mpos + 1),
135 Fmarker_buffer (readcharfun));
136 return c;
137 }
138 if (EQ (readcharfun, Qget_file_char))
139 return getc (instream);
140
141 if (XTYPE (readcharfun) == Lisp_String)
142 {
143 register int c;
144 /* This used to be return of a conditional expression,
145 but that truncated -1 to a char on VMS. */
146 if (read_from_string_index < read_from_string_limit)
147 c = XSTRING (readcharfun)->data[read_from_string_index++];
148 else
149 c = -1;
150 return c;
151 }
152
153 tem = call0 (readcharfun);
154
155 if (NILP (tem))
156 return -1;
157 return XINT (tem);
158 }
159
160 /* Unread the character C in the way appropriate for the stream READCHARFUN.
161 If the stream is a user function, call it with the char as argument. */
162
163 static void
164 unreadchar (readcharfun, c)
165 Lisp_Object readcharfun;
166 int c;
167 {
168 if (c == -1)
169 /* Don't back up the pointer if we're unreading the end-of-input mark,
170 since readchar didn't advance it when we read it. */
171 ;
172 else if (XTYPE (readcharfun) == Lisp_Buffer)
173 {
174 if (XBUFFER (readcharfun) == current_buffer)
175 SET_PT (point - 1);
176 else
177 SET_BUF_PT (XBUFFER (readcharfun), BUF_PT (XBUFFER (readcharfun)) - 1);
178 }
179 else if (XTYPE (readcharfun) == Lisp_Marker)
180 XMARKER (readcharfun)->bufpos--;
181 else if (XTYPE (readcharfun) == Lisp_String)
182 read_from_string_index--;
183 else if (EQ (readcharfun, Qget_file_char))
184 ungetc (c, instream);
185 else
186 call1 (readcharfun, make_number (c));
187 }
188
189 static Lisp_Object read0 (), read1 (), read_list (), read_vector ();
190 \f
191 /* get a character from the tty */
192
193 extern Lisp_Object read_char ();
194
195 /* Read input events until we get one that's acceptable for our purposes.
196
197 If NO_SWITCH_FRAME is non-zero, switch-frame events are stashed
198 until we get a character we like, and then stuffed into
199 unread_switch_frame.
200
201 If ASCII_REQUIRED is non-zero, we check function key events to see
202 if the unmodified version of the symbol has a Qascii_character
203 property, and use that character, if present.
204
205 If ERROR_NONASCII is non-zero, we signal an error if the input we
206 get isn't an ASCII character with modifiers. If it's zero but
207 ASCII_REQUIRED is non-zero, we just re-read until we get an ASCII
208 character. */
209 Lisp_Object
210 read_filtered_event (no_switch_frame, ascii_required, error_nonascii)
211 int no_switch_frame, ascii_required, error_nonascii;
212 {
213 #ifdef standalone
214 return make_number (getchar ());
215 #else
216 register Lisp_Object val, delayed_switch_frame;
217
218 delayed_switch_frame = Qnil;
219
220 /* Read until we get an acceptable event. */
221 retry:
222 val = read_char (0, 0, 0, Qnil, 0);
223
224 if (XTYPE (val) == Lisp_Buffer)
225 goto retry;
226
227 /* switch-frame events are put off until after the next ASCII
228 character. This is better than signalling an error just because
229 the last characters were typed to a separate minibuffer frame,
230 for example. Eventually, some code which can deal with
231 switch-frame events will read it and process it. */
232 if (no_switch_frame
233 && EVENT_HAS_PARAMETERS (val)
234 && EQ (EVENT_HEAD (val), Qswitch_frame))
235 {
236 delayed_switch_frame = val;
237 goto retry;
238 }
239
240 if (ascii_required)
241 {
242 /* Convert certain symbols to their ASCII equivalents. */
243 if (XTYPE (val) == Lisp_Symbol)
244 {
245 Lisp_Object tem, tem1, tem2;
246 tem = Fget (val, Qevent_symbol_element_mask);
247 if (!NILP (tem))
248 {
249 tem1 = Fget (Fcar (tem), Qascii_character);
250 /* Merge this symbol's modifier bits
251 with the ASCII equivalent of its basic code. */
252 if (!NILP (tem1))
253 XFASTINT (val) = XINT (tem1) | XINT (Fcar (Fcdr (tem)));
254 }
255 }
256
257 /* If we don't have a character now, deal with it appropriately. */
258 if (XTYPE (val) != Lisp_Int)
259 {
260 if (error_nonascii)
261 {
262 Vunread_command_events = Fcons (val, Qnil);
263 error ("Non-character input-event");
264 }
265 else
266 goto retry;
267 }
268 }
269
270 if (! NILP (delayed_switch_frame))
271 unread_switch_frame = delayed_switch_frame;
272
273 return val;
274 #endif
275 }
276
277 DEFUN ("read-char", Fread_char, Sread_char, 0, 0, 0,
278 "Read a character from the command input (keyboard or macro).\n\
279 It is returned as a number.\n\
280 If the user generates an event which is not a character (i.e. a mouse\n\
281 click or function key event), `read-char' signals an error. As an\n\
282 exception, switch-frame events are put off until non-ASCII events can\n\
283 be read.\n\
284 If you want to read non-character events, or ignore them, call\n\
285 `read-event' or `read-char-exclusive' instead.")
286 ()
287 {
288 return read_filtered_event (1, 1, 1);
289 }
290
291 DEFUN ("read-event", Fread_event, Sread_event, 0, 0, 0,
292 "Read an event object from the input stream.")
293 ()
294 {
295 return read_filtered_event (0, 0, 0);
296 }
297
298 DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 0, 0,
299 "Read a character from the command input (keyboard or macro).\n\
300 It is returned as a number. Non character events are ignored.")
301 ()
302 {
303 return read_filtered_event (1, 1, 0);
304 }
305
306 DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,
307 "Don't use this yourself.")
308 ()
309 {
310 register Lisp_Object val;
311 XSET (val, Lisp_Int, getc (instream));
312 return val;
313 }
314 \f
315 static void readevalloop ();
316 static Lisp_Object load_unwind ();
317 static Lisp_Object load_descriptor_unwind ();
318
319 DEFUN ("load", Fload, Sload, 1, 4, 0,
320 "Execute a file of Lisp code named FILE.\n\
321 First try FILE with `.elc' appended, then try with `.el',\n\
322 then try FILE unmodified.\n\
323 This function searches the directories in `load-path'.\n\
324 If optional second arg NOERROR is non-nil,\n\
325 report no error if FILE doesn't exist.\n\
326 Print messages at start and end of loading unless\n\
327 optional third arg NOMESSAGE is non-nil.\n\
328 If optional fourth arg NOSUFFIX is non-nil, don't try adding\n\
329 suffixes `.elc' or `.el' to the specified name FILE.\n\
330 Return t if file exists.")
331 (str, noerror, nomessage, nosuffix)
332 Lisp_Object str, noerror, nomessage, nosuffix;
333 {
334 register FILE *stream;
335 register int fd = -1;
336 register Lisp_Object lispstream;
337 register FILE **ptr;
338 int count = specpdl_ptr - specpdl;
339 Lisp_Object temp;
340 struct gcpro gcpro1;
341 Lisp_Object found;
342 /* 1 means inhibit the message at the beginning. */
343 int nomessage1 = 0;
344 Lisp_Object handler;
345 #ifdef MSDOS
346 char *dosmode = "rt";
347 #endif
348
349 CHECK_STRING (str, 0);
350 str = Fsubstitute_in_file_name (str);
351
352 /* If file name is magic, call the handler. */
353 handler = Ffind_file_name_handler (str, Qload);
354 if (!NILP (handler))
355 return call5 (handler, Qload, str, noerror, nomessage, nosuffix);
356
357 /* Avoid weird lossage with null string as arg,
358 since it would try to load a directory as a Lisp file */
359 if (XSTRING (str)->size > 0)
360 {
361 GCPRO1 (str);
362 fd = openp (Vload_path, str, !NILP (nosuffix) ? "" : ".elc:.el:",
363 &found, 0);
364 UNGCPRO;
365 }
366
367 if (fd < 0)
368 {
369 if (NILP (noerror))
370 while (1)
371 Fsignal (Qfile_error, Fcons (build_string ("Cannot open load file"),
372 Fcons (str, Qnil)));
373 else
374 return Qnil;
375 }
376
377 if (!bcmp (&(XSTRING (found)->data[XSTRING (found)->size - 4]),
378 ".elc", 4))
379 {
380 struct stat s1, s2;
381 int result;
382
383 #ifdef MSDOS
384 dosmode = "rb";
385 #endif
386 stat ((char *)XSTRING (found)->data, &s1);
387 XSTRING (found)->data[XSTRING (found)->size - 1] = 0;
388 result = stat ((char *)XSTRING (found)->data, &s2);
389 if (result >= 0 && (unsigned) s1.st_mtime < (unsigned) s2.st_mtime)
390 {
391 message ("Source file `%s' newer than byte-compiled file",
392 XSTRING (found)->data);
393 /* Don't immediately overwrite this message. */
394 if (!noninteractive)
395 nomessage1 = 1;
396 }
397 XSTRING (found)->data[XSTRING (found)->size - 1] = 'c';
398 }
399
400 #ifdef MSDOS
401 close (fd);
402 stream = fopen ((char *) XSTRING (found)->data, dosmode);
403 #else
404 stream = fdopen (fd, "r");
405 #endif
406 if (stream == 0)
407 {
408 close (fd);
409 error ("Failure to create stdio stream for %s", XSTRING (str)->data);
410 }
411
412 if (NILP (nomessage) && !nomessage1)
413 message ("Loading %s...", XSTRING (str)->data);
414
415 GCPRO1 (str);
416 /* We may not be able to store STREAM itself as a Lisp_Object pointer
417 since that is guaranteed to work only for data that has been malloc'd.
418 So malloc a full-size pointer, and record the address of that pointer. */
419 ptr = (FILE **) xmalloc (sizeof (FILE *));
420 *ptr = stream;
421 XSET (lispstream, Lisp_Internal_Stream, (int) ptr);
422 record_unwind_protect (load_unwind, lispstream);
423 record_unwind_protect (load_descriptor_unwind, load_descriptor_list);
424 load_descriptor_list
425 = Fcons (make_number (fileno (stream)), load_descriptor_list);
426 load_in_progress++;
427 readevalloop (Qget_file_char, stream, str, Feval, 0);
428 unbind_to (count, Qnil);
429
430 /* Run any load-hooks for this file. */
431 temp = Fassoc (str, Vafter_load_alist);
432 if (!NILP (temp))
433 Fprogn (Fcdr (temp));
434 UNGCPRO;
435
436 if (!noninteractive && NILP (nomessage))
437 message ("Loading %s...done", XSTRING (str)->data);
438 return Qt;
439 }
440
441 static Lisp_Object
442 load_unwind (stream) /* used as unwind-protect function in load */
443 Lisp_Object stream;
444 {
445 fclose (*(FILE **) XSTRING (stream));
446 xfree (XPNTR (stream));
447 if (--load_in_progress < 0) load_in_progress = 0;
448 return Qnil;
449 }
450
451 static Lisp_Object
452 load_descriptor_unwind (oldlist)
453 Lisp_Object oldlist;
454 {
455 load_descriptor_list = oldlist;
456 }
457
458 /* Close all descriptors in use for Floads.
459 This is used when starting a subprocess. */
460
461 void
462 close_load_descs ()
463 {
464 Lisp_Object tail;
465 for (tail = load_descriptor_list; !NILP (tail); tail = XCONS (tail)->cdr)
466 close (XFASTINT (XCONS (tail)->car));
467 }
468 \f
469 static int
470 complete_filename_p (pathname)
471 Lisp_Object pathname;
472 {
473 register unsigned char *s = XSTRING (pathname)->data;
474 return (*s == '/'
475 #ifdef ALTOS
476 || *s == '@'
477 #endif
478 #ifdef VMS
479 || index (s, ':')
480 #endif /* VMS */
481 #ifdef MSDOS /* MW, May 1993 */
482 || (s[0] != '\0' && s[1] == ':' && s[2] == '/')
483 #endif
484 );
485 }
486
487 /* Search for a file whose name is STR, looking in directories
488 in the Lisp list PATH, and trying suffixes from SUFFIX.
489 SUFFIX is a string containing possible suffixes separated by colons.
490 On success, returns a file descriptor. On failure, returns -1.
491
492 EXEC_ONLY nonzero means don't open the files,
493 just look for one that is executable. In this case,
494 returns 1 on success.
495
496 If STOREPTR is nonzero, it points to a slot where the name of
497 the file actually found should be stored as a Lisp string.
498 Nil is stored there on failure. */
499
500 int
501 openp (path, str, suffix, storeptr, exec_only)
502 Lisp_Object path, str;
503 char *suffix;
504 Lisp_Object *storeptr;
505 int exec_only;
506 {
507 register int fd;
508 int fn_size = 100;
509 char buf[100];
510 register char *fn = buf;
511 int absolute = 0;
512 int want_size;
513 register Lisp_Object filename;
514 struct stat st;
515 struct gcpro gcpro1;
516
517 GCPRO1 (str);
518 if (storeptr)
519 *storeptr = Qnil;
520
521 if (complete_filename_p (str))
522 absolute = 1;
523
524 for (; !NILP (path); path = Fcdr (path))
525 {
526 char *nsuffix;
527
528 filename = Fexpand_file_name (str, Fcar (path));
529 if (!complete_filename_p (filename))
530 /* If there are non-absolute elts in PATH (eg ".") */
531 /* Of course, this could conceivably lose if luser sets
532 default-directory to be something non-absolute... */
533 {
534 filename = Fexpand_file_name (filename, current_buffer->directory);
535 if (!complete_filename_p (filename))
536 /* Give up on this path element! */
537 continue;
538 }
539
540 /* Calculate maximum size of any filename made from
541 this path element/specified file name and any possible suffix. */
542 want_size = strlen (suffix) + XSTRING (filename)->size + 1;
543 if (fn_size < want_size)
544 fn = (char *) alloca (fn_size = 100 + want_size);
545
546 nsuffix = suffix;
547
548 /* Loop over suffixes. */
549 while (1)
550 {
551 char *esuffix = (char *) index (nsuffix, ':');
552 int lsuffix = esuffix ? esuffix - nsuffix : strlen (nsuffix);
553
554 /* Concatenate path element/specified name with the suffix. */
555 strncpy (fn, XSTRING (filename)->data, XSTRING (filename)->size);
556 fn[XSTRING (filename)->size] = 0;
557 if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
558 strncat (fn, nsuffix, lsuffix);
559
560 /* Ignore file if it's a directory. */
561 if (stat (fn, &st) >= 0
562 && (st.st_mode & S_IFMT) != S_IFDIR)
563 {
564 /* Check that we can access or open it. */
565 if (exec_only)
566 fd = (access (fn, X_OK) == 0) ? 1 : -1;
567 else
568 fd = open (fn, 0, 0);
569
570 if (fd >= 0)
571 {
572 /* We succeeded; return this descriptor and filename. */
573 if (storeptr)
574 *storeptr = build_string (fn);
575 RETURN_UNGCPRO (fd);
576 }
577 }
578
579 /* Advance to next suffix. */
580 if (esuffix == 0)
581 break;
582 nsuffix += lsuffix + 1;
583 }
584 if (absolute)
585 RETURN_UNGCPRO (-1);
586 }
587
588 RETURN_UNGCPRO (-1);
589 }
590
591 \f
592 /* Merge the list we've accumulated of globals from the current input source
593 into the load_history variable. The details depend on whether
594 the source has an associated file name or not. */
595
596 static void
597 build_load_history (stream, source)
598 FILE *stream;
599 Lisp_Object source;
600 {
601 register Lisp_Object tail, prev, newelt;
602 register Lisp_Object tem, tem2;
603 register int foundit, loading;
604
605 /* Don't bother recording anything for preloaded files. */
606 if (!NILP (Vpurify_flag))
607 return;
608
609 loading = stream || !NARROWED;
610
611 tail = Vload_history;
612 prev = Qnil;
613 foundit = 0;
614 while (!NILP (tail))
615 {
616 tem = Fcar (tail);
617
618 /* Find the feature's previous assoc list... */
619 if (!NILP (Fequal (source, Fcar (tem))))
620 {
621 foundit = 1;
622
623 /* If we're loading, remove it. */
624 if (loading)
625 {
626 if (NILP (prev))
627 Vload_history = Fcdr (tail);
628 else
629 Fsetcdr (prev, Fcdr (tail));
630 }
631
632 /* Otherwise, cons on new symbols that are not already members. */
633 else
634 {
635 tem2 = Vcurrent_load_list;
636
637 while (CONSP (tem2))
638 {
639 newelt = Fcar (tem2);
640
641 if (NILP (Fmemq (newelt, tem)))
642 Fsetcar (tail, Fcons (Fcar (tem),
643 Fcons (newelt, Fcdr (tem))));
644
645 tem2 = Fcdr (tem2);
646 QUIT;
647 }
648 }
649 }
650 else
651 prev = tail;
652 tail = Fcdr (tail);
653 QUIT;
654 }
655
656 /* If we're loading, cons the new assoc onto the front of load-history,
657 the most-recently-loaded position. Also do this if we didn't find
658 an existing member for the current source. */
659 if (loading || !foundit)
660 Vload_history = Fcons (Fnreverse (Vcurrent_load_list),
661 Vload_history);
662 }
663
664 Lisp_Object
665 unreadpure () /* Used as unwind-protect function in readevalloop */
666 {
667 read_pure = 0;
668 return Qnil;
669 }
670
671 static void
672 readevalloop (readcharfun, stream, sourcename, evalfun, printflag)
673 Lisp_Object readcharfun;
674 FILE *stream;
675 Lisp_Object sourcename;
676 Lisp_Object (*evalfun) ();
677 int printflag;
678 {
679 register int c;
680 register Lisp_Object val;
681 int count = specpdl_ptr - specpdl;
682 struct gcpro gcpro1;
683 struct buffer *b = 0;
684
685 if (BUFFERP (readcharfun))
686 b = XBUFFER (readcharfun);
687 else if (MARKERP (readcharfun))
688 b = XMARKER (readcharfun)->buffer;
689
690 specbind (Qstandard_input, readcharfun);
691 specbind (Qcurrent_load_list, Qnil);
692
693 GCPRO1 (sourcename);
694
695 LOADHIST_ATTACH (sourcename);
696
697 while (1)
698 {
699 if (b != 0 && NILP (b->name))
700 error ("Reading from killed buffer");
701
702 instream = stream;
703 c = READCHAR;
704 if (c == ';')
705 {
706 while ((c = READCHAR) != '\n' && c != -1);
707 continue;
708 }
709 if (c < 0) break;
710 if (c == ' ' || c == '\t' || c == '\n' || c == '\f') continue;
711
712 if (!NILP (Vpurify_flag) && c == '(')
713 {
714 record_unwind_protect (unreadpure, Qnil);
715 val = read_list (-1, readcharfun);
716 unbind_to (count + 1, Qnil);
717 }
718 else
719 {
720 UNREAD (c);
721 val = read0 (readcharfun);
722 }
723
724 val = (*evalfun) (val);
725 if (printflag)
726 {
727 Vvalues = Fcons (val, Vvalues);
728 if (EQ (Vstandard_output, Qt))
729 Fprin1 (val, Qnil);
730 else
731 Fprint (val, Qnil);
732 }
733 }
734
735 build_load_history (stream, sourcename);
736 UNGCPRO;
737
738 unbind_to (count, Qnil);
739 }
740
741 #ifndef standalone
742
743 DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 2, "",
744 "Execute the current buffer as Lisp code.\n\
745 Programs can pass two arguments, BUFFER and PRINTFLAG.\n\
746 BUFFER is the buffer to evaluate (nil means use current buffer).\n\
747 PRINTFLAG controls printing of output:\n\
748 nil means discard it; anything else is stream for print.\n\
749 \n\
750 If there is no error, point does not move. If there is an error,\n\
751 point remains at the end of the last character read from the buffer.")
752 (bufname, printflag)
753 Lisp_Object bufname, printflag;
754 {
755 int count = specpdl_ptr - specpdl;
756 Lisp_Object tem, buf;
757
758 if (NILP (bufname))
759 buf = Fcurrent_buffer ();
760 else
761 buf = Fget_buffer (bufname);
762 if (NILP (buf))
763 error ("No such buffer.");
764
765 if (NILP (printflag))
766 tem = Qsymbolp;
767 else
768 tem = printflag;
769 specbind (Qstandard_output, tem);
770 record_unwind_protect (save_excursion_restore, save_excursion_save ());
771 BUF_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
772 readevalloop (buf, 0, XBUFFER (buf)->filename, Feval, !NILP (printflag));
773 unbind_to (count, Qnil);
774
775 return Qnil;
776 }
777
778 #if 0
779 DEFUN ("eval-current-buffer", Feval_current_buffer, Seval_current_buffer, 0, 1, "",
780 "Execute the current buffer as Lisp code.\n\
781 Programs can pass argument PRINTFLAG which controls printing of output:\n\
782 nil means discard it; anything else is stream for print.\n\
783 \n\
784 If there is no error, point does not move. If there is an error,\n\
785 point remains at the end of the last character read from the buffer.")
786 (printflag)
787 Lisp_Object printflag;
788 {
789 int count = specpdl_ptr - specpdl;
790 Lisp_Object tem, cbuf;
791
792 cbuf = Fcurrent_buffer ()
793
794 if (NILP (printflag))
795 tem = Qsymbolp;
796 else
797 tem = printflag;
798 specbind (Qstandard_output, tem);
799 record_unwind_protect (save_excursion_restore, save_excursion_save ());
800 SET_PT (BEGV);
801 readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, !NILP (printflag));
802 return unbind_to (count, Qnil);
803 }
804 #endif
805
806 DEFUN ("eval-region", Feval_region, Seval_region, 2, 3, "r",
807 "Execute the region as Lisp code.\n\
808 When called from programs, expects two arguments,\n\
809 giving starting and ending indices in the current buffer\n\
810 of the text to be executed.\n\
811 Programs can pass third argument PRINTFLAG which controls output:\n\
812 nil means discard it; anything else is stream for printing it.\n\
813 \n\
814 If there is no error, point does not move. If there is an error,\n\
815 point remains at the end of the last character read from the buffer.")
816 (b, e, printflag)
817 Lisp_Object b, e, printflag;
818 {
819 int count = specpdl_ptr - specpdl;
820 Lisp_Object tem, cbuf;
821
822 cbuf = Fcurrent_buffer ();
823
824 if (NILP (printflag))
825 tem = Qsymbolp;
826 else
827 tem = printflag;
828 specbind (Qstandard_output, tem);
829
830 if (NILP (printflag))
831 record_unwind_protect (save_excursion_restore, save_excursion_save ());
832 record_unwind_protect (save_restriction_restore, save_restriction_save ());
833
834 /* This both uses b and checks its type. */
835 Fgoto_char (b);
836 Fnarrow_to_region (make_number (BEGV), e);
837 readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, !NILP (printflag));
838
839 return unbind_to (count, Qnil);
840 }
841
842 #endif /* standalone */
843 \f
844 DEFUN ("read", Fread, Sread, 0, 1, 0,
845 "Read one Lisp expression as text from STREAM, return as Lisp object.\n\
846 If STREAM is nil, use the value of `standard-input' (which see).\n\
847 STREAM or the value of `standard-input' may be:\n\
848 a buffer (read from point and advance it)\n\
849 a marker (read from where it points and advance it)\n\
850 a function (call it with no arguments for each character,\n\
851 call it with a char as argument to push a char back)\n\
852 a string (takes text from string, starting at the beginning)\n\
853 t (read text line using minibuffer and use it).")
854 (readcharfun)
855 Lisp_Object readcharfun;
856 {
857 extern Lisp_Object Fread_minibuffer ();
858
859 if (NILP (readcharfun))
860 readcharfun = Vstandard_input;
861 if (EQ (readcharfun, Qt))
862 readcharfun = Qread_char;
863
864 #ifndef standalone
865 if (EQ (readcharfun, Qread_char))
866 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil);
867 #endif
868
869 if (XTYPE (readcharfun) == Lisp_String)
870 return Fcar (Fread_from_string (readcharfun, Qnil, Qnil));
871
872 return read0 (readcharfun);
873 }
874
875 DEFUN ("read-from-string", Fread_from_string, Sread_from_string, 1, 3, 0,
876 "Read one Lisp expression which is represented as text by STRING.\n\
877 Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).\n\
878 START and END optionally delimit a substring of STRING from which to read;\n\
879 they default to 0 and (length STRING) respectively.")
880 (string, start, end)
881 Lisp_Object string, start, end;
882 {
883 int startval, endval;
884 Lisp_Object tem;
885
886 CHECK_STRING (string,0);
887
888 if (NILP (end))
889 endval = XSTRING (string)->size;
890 else
891 { CHECK_NUMBER (end,2);
892 endval = XINT (end);
893 if (endval < 0 || endval > XSTRING (string)->size)
894 args_out_of_range (string, end);
895 }
896
897 if (NILP (start))
898 startval = 0;
899 else
900 { CHECK_NUMBER (start,1);
901 startval = XINT (start);
902 if (startval < 0 || startval > endval)
903 args_out_of_range (string, start);
904 }
905
906 read_from_string_index = startval;
907 read_from_string_limit = endval;
908
909 tem = read0 (string);
910 return Fcons (tem, make_number (read_from_string_index));
911 }
912 \f
913 /* Use this for recursive reads, in contexts where internal tokens are not allowed. */
914
915 static Lisp_Object
916 read0 (readcharfun)
917 Lisp_Object readcharfun;
918 {
919 register Lisp_Object val;
920 char c;
921
922 val = read1 (readcharfun);
923 if (XTYPE (val) == Lisp_Internal)
924 {
925 c = XINT (val);
926 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (&c, 1), Qnil));
927 }
928
929 return val;
930 }
931 \f
932 static int read_buffer_size;
933 static char *read_buffer;
934
935 static int
936 read_escape (readcharfun)
937 Lisp_Object readcharfun;
938 {
939 register int c = READCHAR;
940 switch (c)
941 {
942 case 'a':
943 return '\007';
944 case 'b':
945 return '\b';
946 case 'd':
947 return 0177;
948 case 'e':
949 return 033;
950 case 'f':
951 return '\f';
952 case 'n':
953 return '\n';
954 case 'r':
955 return '\r';
956 case 't':
957 return '\t';
958 case 'v':
959 return '\v';
960 case '\n':
961 return -1;
962
963 case 'M':
964 c = READCHAR;
965 if (c != '-')
966 error ("Invalid escape character syntax");
967 c = READCHAR;
968 if (c == '\\')
969 c = read_escape (readcharfun);
970 return c | meta_modifier;
971
972 case 'S':
973 c = READCHAR;
974 if (c != '-')
975 error ("Invalid escape character syntax");
976 c = READCHAR;
977 if (c == '\\')
978 c = read_escape (readcharfun);
979 return c | shift_modifier;
980
981 case 'H':
982 c = READCHAR;
983 if (c != '-')
984 error ("Invalid escape character syntax");
985 c = READCHAR;
986 if (c == '\\')
987 c = read_escape (readcharfun);
988 return c | hyper_modifier;
989
990 case 'A':
991 c = READCHAR;
992 if (c != '-')
993 error ("Invalid escape character syntax");
994 c = READCHAR;
995 if (c == '\\')
996 c = read_escape (readcharfun);
997 return c | alt_modifier;
998
999 case 's':
1000 c = READCHAR;
1001 if (c != '-')
1002 error ("Invalid escape character syntax");
1003 c = READCHAR;
1004 if (c == '\\')
1005 c = read_escape (readcharfun);
1006 return c | super_modifier;
1007
1008 case 'C':
1009 c = READCHAR;
1010 if (c != '-')
1011 error ("Invalid escape character syntax");
1012 case '^':
1013 c = READCHAR;
1014 if (c == '\\')
1015 c = read_escape (readcharfun);
1016 if ((c & 0177) == '?')
1017 return 0177 | c;
1018 /* ASCII control chars are made from letters (both cases),
1019 as well as the non-letters within 0100...0137. */
1020 else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
1021 return (c & (037 | ~0177));
1022 else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
1023 return (c & (037 | ~0177));
1024 else
1025 return c | ctrl_modifier;
1026
1027 case '0':
1028 case '1':
1029 case '2':
1030 case '3':
1031 case '4':
1032 case '5':
1033 case '6':
1034 case '7':
1035 /* An octal escape, as in ANSI C. */
1036 {
1037 register int i = c - '0';
1038 register int count = 0;
1039 while (++count < 3)
1040 {
1041 if ((c = READCHAR) >= '0' && c <= '7')
1042 {
1043 i *= 8;
1044 i += c - '0';
1045 }
1046 else
1047 {
1048 UNREAD (c);
1049 break;
1050 }
1051 }
1052 return i;
1053 }
1054
1055 case 'x':
1056 /* A hex escape, as in ANSI C. */
1057 {
1058 int i = 0;
1059 while (1)
1060 {
1061 c = READCHAR;
1062 if (c >= '0' && c <= '9')
1063 {
1064 i *= 16;
1065 i += c - '0';
1066 }
1067 else if ((c >= 'a' && c <= 'f')
1068 || (c >= 'A' && c <= 'F'))
1069 {
1070 i *= 16;
1071 if (c >= 'a' && c <= 'f')
1072 i += c - 'a' + 10;
1073 else
1074 i += c - 'A' + 10;
1075 }
1076 else
1077 {
1078 UNREAD (c);
1079 break;
1080 }
1081 }
1082 return i;
1083 }
1084
1085 default:
1086 return c;
1087 }
1088 }
1089
1090 static Lisp_Object
1091 read1 (readcharfun)
1092 register Lisp_Object readcharfun;
1093 {
1094 register int c;
1095
1096 retry:
1097
1098 c = READCHAR;
1099 if (c < 0) return Fsignal (Qend_of_file, Qnil);
1100
1101 switch (c)
1102 {
1103 case '(':
1104 return read_list (0, readcharfun);
1105
1106 case '[':
1107 return read_vector (readcharfun);
1108
1109 case ')':
1110 case ']':
1111 {
1112 register Lisp_Object val;
1113 XSET (val, Lisp_Internal, c);
1114 return val;
1115 }
1116
1117 case '#':
1118 c = READCHAR;
1119 if (c == '[')
1120 {
1121 /* Accept compiled functions at read-time so that we don't have to
1122 build them using function calls. */
1123 Lisp_Object tmp;
1124 tmp = read_vector (readcharfun);
1125 return Fmake_byte_code (XVECTOR (tmp)->size,
1126 XVECTOR (tmp)->contents);
1127 }
1128 #ifdef USE_TEXT_PROPERTIES
1129 if (c == '(')
1130 {
1131 Lisp_Object tmp;
1132 struct gcpro gcpro1;
1133
1134 /* Read the string itself. */
1135 tmp = read1 (readcharfun);
1136 if (XTYPE (tmp) != Lisp_String)
1137 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
1138 GCPRO1 (tmp);
1139 /* Read the intervals and their properties. */
1140 while (1)
1141 {
1142 Lisp_Object beg, end, plist;
1143
1144 beg = read1 (readcharfun);
1145 if (XTYPE (beg) == Lisp_Internal)
1146 {
1147 if (XINT (beg) == ')')
1148 break;
1149 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("invalid string property list", 28), Qnil));
1150 }
1151 end = read1 (readcharfun);
1152 if (XTYPE (end) == Lisp_Internal)
1153 Fsignal (Qinvalid_read_syntax,
1154 Fcons (make_string ("invalid string property list", 28), Qnil));
1155
1156 plist = read1 (readcharfun);
1157 if (XTYPE (plist) == Lisp_Internal)
1158 Fsignal (Qinvalid_read_syntax,
1159 Fcons (make_string ("invalid string property list", 28), Qnil));
1160 Fset_text_properties (beg, end, plist, tmp);
1161 }
1162 UNGCPRO;
1163 return tmp;
1164 }
1165 #endif
1166 UNREAD (c);
1167 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
1168
1169 case ';':
1170 while ((c = READCHAR) >= 0 && c != '\n');
1171 goto retry;
1172
1173 case '\'':
1174 {
1175 return Fcons (Qquote, Fcons (read0 (readcharfun), Qnil));
1176 }
1177
1178 case '?':
1179 {
1180 register Lisp_Object val;
1181
1182 c = READCHAR;
1183 if (c < 0) return Fsignal (Qend_of_file, Qnil);
1184
1185 if (c == '\\')
1186 XSET (val, Lisp_Int, read_escape (readcharfun));
1187 else
1188 XSET (val, Lisp_Int, c);
1189
1190 return val;
1191 }
1192
1193 case '\"':
1194 {
1195 register char *p = read_buffer;
1196 register char *end = read_buffer + read_buffer_size;
1197 register int c;
1198 int cancel = 0;
1199
1200 while ((c = READCHAR) >= 0
1201 && c != '\"')
1202 {
1203 if (p == end)
1204 {
1205 char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
1206 p += new - read_buffer;
1207 read_buffer += new - read_buffer;
1208 end = read_buffer + read_buffer_size;
1209 }
1210 if (c == '\\')
1211 c = read_escape (readcharfun);
1212 /* c is -1 if \ newline has just been seen */
1213 if (c == -1)
1214 {
1215 if (p == read_buffer)
1216 cancel = 1;
1217 }
1218 else
1219 {
1220 /* Allow `\C- ' and `\C-?'. */
1221 if (c == (CHAR_CTL | ' '))
1222 c = 0;
1223 else if (c == (CHAR_CTL | '?'))
1224 c = 127;
1225
1226 if (c & CHAR_META)
1227 /* Move the meta bit to the right place for a string. */
1228 c = (c & ~CHAR_META) | 0x80;
1229 if (c & ~0xff)
1230 error ("Invalid modifier in string");
1231 *p++ = c;
1232 }
1233 }
1234 if (c < 0) return Fsignal (Qend_of_file, Qnil);
1235
1236 /* If purifying, and string starts with \ newline,
1237 return zero instead. This is for doc strings
1238 that we are really going to find in etc/DOC.nn.nn */
1239 if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
1240 return make_number (0);
1241
1242 if (read_pure)
1243 return make_pure_string (read_buffer, p - read_buffer);
1244 else
1245 return make_string (read_buffer, p - read_buffer);
1246 }
1247
1248 case '.':
1249 {
1250 #ifdef LISP_FLOAT_TYPE
1251 /* If a period is followed by a number, then we should read it
1252 as a floating point number. Otherwise, it denotes a dotted
1253 pair. */
1254 int next_char = READCHAR;
1255 UNREAD (next_char);
1256
1257 if (! isdigit (next_char))
1258 #endif
1259 {
1260 register Lisp_Object val;
1261 XSET (val, Lisp_Internal, c);
1262 return val;
1263 }
1264
1265 /* Otherwise, we fall through! Note that the atom-reading loop
1266 below will now loop at least once, assuring that we will not
1267 try to UNREAD two characters in a row. */
1268 }
1269 default:
1270 if (c <= 040) goto retry;
1271 {
1272 register char *p = read_buffer;
1273 int quoted = 0;
1274
1275 {
1276 register char *end = read_buffer + read_buffer_size;
1277
1278 while (c > 040 &&
1279 !(c == '\"' || c == '\'' || c == ';' || c == '?'
1280 || c == '(' || c == ')'
1281 #ifndef LISP_FLOAT_TYPE
1282 /* If we have floating-point support, then we need
1283 to allow <digits><dot><digits>. */
1284 || c =='.'
1285 #endif /* not LISP_FLOAT_TYPE */
1286 || c == '[' || c == ']' || c == '#'
1287 ))
1288 {
1289 if (p == end)
1290 {
1291 register char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
1292 p += new - read_buffer;
1293 read_buffer += new - read_buffer;
1294 end = read_buffer + read_buffer_size;
1295 }
1296 if (c == '\\')
1297 {
1298 c = READCHAR;
1299 quoted = 1;
1300 }
1301 *p++ = c;
1302 c = READCHAR;
1303 }
1304
1305 if (p == end)
1306 {
1307 char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
1308 p += new - read_buffer;
1309 read_buffer += new - read_buffer;
1310 /* end = read_buffer + read_buffer_size; */
1311 }
1312 *p = 0;
1313 if (c >= 0)
1314 UNREAD (c);
1315 }
1316
1317 if (!quoted)
1318 {
1319 register char *p1;
1320 register Lisp_Object val;
1321 p1 = read_buffer;
1322 if (*p1 == '+' || *p1 == '-') p1++;
1323 /* Is it an integer? */
1324 if (p1 != p)
1325 {
1326 while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
1327 #ifdef LISP_FLOAT_TYPE
1328 /* Integers can have trailing decimal points. */
1329 if (p1 > read_buffer && p1 < p && *p1 == '.') p1++;
1330 #endif
1331 if (p1 == p)
1332 /* It is an integer. */
1333 {
1334 #ifdef LISP_FLOAT_TYPE
1335 if (p1[-1] == '.')
1336 p1[-1] = '\0';
1337 #endif
1338 XSET (val, Lisp_Int, atoi (read_buffer));
1339 return val;
1340 }
1341 }
1342 #ifdef LISP_FLOAT_TYPE
1343 if (isfloat_string (read_buffer))
1344 return make_float (atof (read_buffer));
1345 #endif
1346 }
1347
1348 return intern (read_buffer);
1349 }
1350 }
1351 }
1352 \f
1353 #ifdef LISP_FLOAT_TYPE
1354
1355 #define LEAD_INT 1
1356 #define DOT_CHAR 2
1357 #define TRAIL_INT 4
1358 #define E_CHAR 8
1359 #define EXP_INT 16
1360
1361 int
1362 isfloat_string (cp)
1363 register char *cp;
1364 {
1365 register state;
1366
1367 state = 0;
1368 if (*cp == '+' || *cp == '-')
1369 cp++;
1370
1371 if (isdigit(*cp))
1372 {
1373 state |= LEAD_INT;
1374 while (isdigit (*cp))
1375 cp ++;
1376 }
1377 if (*cp == '.')
1378 {
1379 state |= DOT_CHAR;
1380 cp++;
1381 }
1382 if (isdigit(*cp))
1383 {
1384 state |= TRAIL_INT;
1385 while (isdigit (*cp))
1386 cp++;
1387 }
1388 if (*cp == 'e')
1389 {
1390 state |= E_CHAR;
1391 cp++;
1392 }
1393 if ((*cp == '+') || (*cp == '-'))
1394 cp++;
1395
1396 if (isdigit (*cp))
1397 {
1398 state |= EXP_INT;
1399 while (isdigit (*cp))
1400 cp++;
1401 }
1402 return (*cp == 0
1403 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
1404 || state == (DOT_CHAR|TRAIL_INT)
1405 || state == (LEAD_INT|E_CHAR|EXP_INT)
1406 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)
1407 || state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
1408 }
1409 #endif /* LISP_FLOAT_TYPE */
1410 \f
1411 static Lisp_Object
1412 read_vector (readcharfun)
1413 Lisp_Object readcharfun;
1414 {
1415 register int i;
1416 register int size;
1417 register Lisp_Object *ptr;
1418 register Lisp_Object tem, vector;
1419 register struct Lisp_Cons *otem;
1420 Lisp_Object len;
1421
1422 tem = read_list (1, readcharfun);
1423 len = Flength (tem);
1424 vector = (read_pure ? make_pure_vector (XINT (len)) : Fmake_vector (len, Qnil));
1425
1426
1427 size = XVECTOR (vector)->size;
1428 ptr = XVECTOR (vector)->contents;
1429 for (i = 0; i < size; i++)
1430 {
1431 ptr[i] = read_pure ? Fpurecopy (Fcar (tem)) : Fcar (tem);
1432 otem = XCONS (tem);
1433 tem = Fcdr (tem);
1434 free_cons (otem);
1435 }
1436 return vector;
1437 }
1438
1439 /* flag = 1 means check for ] to terminate rather than ) and .
1440 flag = -1 means check for starting with defun
1441 and make structure pure. */
1442
1443 static Lisp_Object
1444 read_list (flag, readcharfun)
1445 int flag;
1446 register Lisp_Object readcharfun;
1447 {
1448 /* -1 means check next element for defun,
1449 0 means don't check,
1450 1 means already checked and found defun. */
1451 int defunflag = flag < 0 ? -1 : 0;
1452 Lisp_Object val, tail;
1453 register Lisp_Object elt, tem;
1454 struct gcpro gcpro1, gcpro2;
1455
1456 val = Qnil;
1457 tail = Qnil;
1458
1459 while (1)
1460 {
1461 GCPRO2 (val, tail);
1462 elt = read1 (readcharfun);
1463 UNGCPRO;
1464 if (XTYPE (elt) == Lisp_Internal)
1465 {
1466 if (flag > 0)
1467 {
1468 if (XINT (elt) == ']')
1469 return val;
1470 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (") or . in a vector", 18), Qnil));
1471 }
1472 if (XINT (elt) == ')')
1473 return val;
1474 if (XINT (elt) == '.')
1475 {
1476 GCPRO2 (val, tail);
1477 if (!NILP (tail))
1478 XCONS (tail)->cdr = read0 (readcharfun);
1479 else
1480 val = read0 (readcharfun);
1481 elt = read1 (readcharfun);
1482 UNGCPRO;
1483 if (XTYPE (elt) == Lisp_Internal && XINT (elt) == ')')
1484 return val;
1485 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil));
1486 }
1487 return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("] in a list", 11), Qnil));
1488 }
1489 tem = (read_pure && flag <= 0
1490 ? pure_cons (elt, Qnil)
1491 : Fcons (elt, Qnil));
1492 if (!NILP (tail))
1493 XCONS (tail)->cdr = tem;
1494 else
1495 val = tem;
1496 tail = tem;
1497 if (defunflag < 0)
1498 defunflag = EQ (elt, Qdefun);
1499 else if (defunflag > 0)
1500 read_pure = 1;
1501 }
1502 }
1503 \f
1504 Lisp_Object Vobarray;
1505 Lisp_Object initial_obarray;
1506
1507 Lisp_Object
1508 check_obarray (obarray)
1509 Lisp_Object obarray;
1510 {
1511 while (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0)
1512 {
1513 /* If Vobarray is now invalid, force it to be valid. */
1514 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray;
1515
1516 obarray = wrong_type_argument (Qvectorp, obarray);
1517 }
1518 return obarray;
1519 }
1520
1521 static int hash_string ();
1522 Lisp_Object oblookup ();
1523
1524 Lisp_Object
1525 intern (str)
1526 char *str;
1527 {
1528 Lisp_Object tem;
1529 int len = strlen (str);
1530 Lisp_Object obarray;
1531
1532 obarray = Vobarray;
1533 if (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0)
1534 obarray = check_obarray (obarray);
1535 tem = oblookup (obarray, str, len);
1536 if (XTYPE (tem) == Lisp_Symbol)
1537 return tem;
1538 return Fintern ((!NILP (Vpurify_flag)
1539 ? make_pure_string (str, len)
1540 : make_string (str, len)),
1541 obarray);
1542 }
1543
1544 DEFUN ("intern", Fintern, Sintern, 1, 2, 0,
1545 "Return the canonical symbol whose name is STRING.\n\
1546 If there is none, one is created by this function and returned.\n\
1547 A second optional argument specifies the obarray to use;\n\
1548 it defaults to the value of `obarray'.")
1549 (str, obarray)
1550 Lisp_Object str, obarray;
1551 {
1552 register Lisp_Object tem, sym, *ptr;
1553
1554 if (NILP (obarray)) obarray = Vobarray;
1555 obarray = check_obarray (obarray);
1556
1557 CHECK_STRING (str, 0);
1558
1559 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
1560 if (XTYPE (tem) != Lisp_Int)
1561 return tem;
1562
1563 if (!NILP (Vpurify_flag))
1564 str = Fpurecopy (str);
1565 sym = Fmake_symbol (str);
1566
1567 ptr = &XVECTOR (obarray)->contents[XINT (tem)];
1568 if (XTYPE (*ptr) == Lisp_Symbol)
1569 XSYMBOL (sym)->next = XSYMBOL (*ptr);
1570 else
1571 XSYMBOL (sym)->next = 0;
1572 *ptr = sym;
1573 return sym;
1574 }
1575
1576 DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,
1577 "Return the canonical symbol whose name is STRING, or nil if none exists.\n\
1578 A second optional argument specifies the obarray to use;\n\
1579 it defaults to the value of `obarray'.")
1580 (str, obarray)
1581 Lisp_Object str, obarray;
1582 {
1583 register Lisp_Object tem;
1584
1585 if (NILP (obarray)) obarray = Vobarray;
1586 obarray = check_obarray (obarray);
1587
1588 CHECK_STRING (str, 0);
1589
1590 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
1591 if (XTYPE (tem) != Lisp_Int)
1592 return tem;
1593 return Qnil;
1594 }
1595
1596 Lisp_Object
1597 oblookup (obarray, ptr, size)
1598 Lisp_Object obarray;
1599 register char *ptr;
1600 register int size;
1601 {
1602 int hash, obsize;
1603 register Lisp_Object tail;
1604 Lisp_Object bucket, tem;
1605
1606 if (XTYPE (obarray) != Lisp_Vector
1607 || (obsize = XVECTOR (obarray)->size) == 0)
1608 {
1609 obarray = check_obarray (obarray);
1610 obsize = XVECTOR (obarray)->size;
1611 }
1612 /* Combining next two lines breaks VMS C 2.3. */
1613 hash = hash_string (ptr, size);
1614 hash %= obsize;
1615 bucket = XVECTOR (obarray)->contents[hash];
1616 if (XFASTINT (bucket) == 0)
1617 ;
1618 else if (XTYPE (bucket) != Lisp_Symbol)
1619 error ("Bad data in guts of obarray"); /* Like CADR error message */
1620 else for (tail = bucket; ; XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next))
1621 {
1622 if (XSYMBOL (tail)->name->size == size &&
1623 !bcmp (XSYMBOL (tail)->name->data, ptr, size))
1624 return tail;
1625 else if (XSYMBOL (tail)->next == 0)
1626 break;
1627 }
1628 XSET (tem, Lisp_Int, hash);
1629 return tem;
1630 }
1631
1632 static int
1633 hash_string (ptr, len)
1634 unsigned char *ptr;
1635 int len;
1636 {
1637 register unsigned char *p = ptr;
1638 register unsigned char *end = p + len;
1639 register unsigned char c;
1640 register int hash = 0;
1641
1642 while (p != end)
1643 {
1644 c = *p++;
1645 if (c >= 0140) c -= 40;
1646 hash = ((hash<<3) + (hash>>28) + c);
1647 }
1648 return hash & 07777777777;
1649 }
1650
1651 void
1652 map_obarray (obarray, fn, arg)
1653 Lisp_Object obarray;
1654 int (*fn) ();
1655 Lisp_Object arg;
1656 {
1657 register int i;
1658 register Lisp_Object tail;
1659 CHECK_VECTOR (obarray, 1);
1660 for (i = XVECTOR (obarray)->size - 1; i >= 0; i--)
1661 {
1662 tail = XVECTOR (obarray)->contents[i];
1663 if (XFASTINT (tail) != 0)
1664 while (1)
1665 {
1666 (*fn) (tail, arg);
1667 if (XSYMBOL (tail)->next == 0)
1668 break;
1669 XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next);
1670 }
1671 }
1672 }
1673
1674 mapatoms_1 (sym, function)
1675 Lisp_Object sym, function;
1676 {
1677 call1 (function, sym);
1678 }
1679
1680 DEFUN ("mapatoms", Fmapatoms, Smapatoms, 1, 2, 0,
1681 "Call FUNCTION on every symbol in OBARRAY.\n\
1682 OBARRAY defaults to the value of `obarray'.")
1683 (function, obarray)
1684 Lisp_Object function, obarray;
1685 {
1686 Lisp_Object tem;
1687
1688 if (NILP (obarray)) obarray = Vobarray;
1689 obarray = check_obarray (obarray);
1690
1691 map_obarray (obarray, mapatoms_1, function);
1692 return Qnil;
1693 }
1694
1695 #define OBARRAY_SIZE 1511
1696
1697 void
1698 init_obarray ()
1699 {
1700 Lisp_Object oblength;
1701 int hash;
1702 Lisp_Object *tem;
1703
1704 XFASTINT (oblength) = OBARRAY_SIZE;
1705
1706 Qnil = Fmake_symbol (make_pure_string ("nil", 3));
1707 Vobarray = Fmake_vector (oblength, make_number (0));
1708 initial_obarray = Vobarray;
1709 staticpro (&initial_obarray);
1710 /* Intern nil in the obarray */
1711 /* These locals are to kludge around a pyramid compiler bug. */
1712 hash = hash_string ("nil", 3);
1713 /* Separate statement here to avoid VAXC bug. */
1714 hash %= OBARRAY_SIZE;
1715 tem = &XVECTOR (Vobarray)->contents[hash];
1716 *tem = Qnil;
1717
1718 Qunbound = Fmake_symbol (make_pure_string ("unbound", 7));
1719 XSYMBOL (Qnil)->function = Qunbound;
1720 XSYMBOL (Qunbound)->value = Qunbound;
1721 XSYMBOL (Qunbound)->function = Qunbound;
1722
1723 Qt = intern ("t");
1724 XSYMBOL (Qnil)->value = Qnil;
1725 XSYMBOL (Qnil)->plist = Qnil;
1726 XSYMBOL (Qt)->value = Qt;
1727
1728 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */
1729 Vpurify_flag = Qt;
1730
1731 Qvariable_documentation = intern ("variable-documentation");
1732
1733 read_buffer_size = 100;
1734 read_buffer = (char *) malloc (read_buffer_size);
1735 }
1736 \f
1737 void
1738 defsubr (sname)
1739 struct Lisp_Subr *sname;
1740 {
1741 Lisp_Object sym;
1742 sym = intern (sname->symbol_name);
1743 XSET (XSYMBOL (sym)->function, Lisp_Subr, sname);
1744 }
1745
1746 #ifdef NOTDEF /* use fset in subr.el now */
1747 void
1748 defalias (sname, string)
1749 struct Lisp_Subr *sname;
1750 char *string;
1751 {
1752 Lisp_Object sym;
1753 sym = intern (string);
1754 XSET (XSYMBOL (sym)->function, Lisp_Subr, sname);
1755 }
1756 #endif /* NOTDEF */
1757
1758 /* New replacement for DefIntVar; it ignores the doc string argument
1759 on the assumption that make-docfile will handle that. */
1760 /* Define an "integer variable"; a symbol whose value is forwarded
1761 to a C variable of type int. Sample call: */
1762 /* DEFVARINT ("indent-tabs-mode", &indent_tabs_mode, "Documentation"); */
1763
1764 void
1765 defvar_int (namestring, address, doc)
1766 char *namestring;
1767 int *address;
1768 char *doc;
1769 {
1770 Lisp_Object sym;
1771 sym = intern (namestring);
1772 XSET (XSYMBOL (sym)->value, Lisp_Intfwd, address);
1773 }
1774
1775 /* Similar but define a variable whose value is T if address contains 1,
1776 NIL if address contains 0 */
1777
1778 void
1779 defvar_bool (namestring, address, doc)
1780 char *namestring;
1781 int *address;
1782 char *doc;
1783 {
1784 Lisp_Object sym;
1785 sym = intern (namestring);
1786 XSET (XSYMBOL (sym)->value, Lisp_Boolfwd, address);
1787 }
1788
1789 /* Similar but define a variable whose value is the Lisp Object stored at address. */
1790
1791 void
1792 defvar_lisp (namestring, address, doc)
1793 char *namestring;
1794 Lisp_Object *address;
1795 char *doc;
1796 {
1797 Lisp_Object sym;
1798 sym = intern (namestring);
1799 XSET (XSYMBOL (sym)->value, Lisp_Objfwd, address);
1800 staticpro (address);
1801 }
1802
1803 /* Similar but don't request gc-marking of the C variable.
1804 Used when that variable will be gc-marked for some other reason,
1805 since marking the same slot twice can cause trouble with strings. */
1806
1807 void
1808 defvar_lisp_nopro (namestring, address, doc)
1809 char *namestring;
1810 Lisp_Object *address;
1811 char *doc;
1812 {
1813 Lisp_Object sym;
1814 sym = intern (namestring);
1815 XSET (XSYMBOL (sym)->value, Lisp_Objfwd, address);
1816 }
1817
1818 #ifndef standalone
1819
1820 /* Similar but define a variable whose value is the Lisp Object stored in
1821 the current buffer. address is the address of the slot in the buffer that is current now. */
1822
1823 void
1824 defvar_per_buffer (namestring, address, type, doc)
1825 char *namestring;
1826 Lisp_Object *address;
1827 Lisp_Object type;
1828 char *doc;
1829 {
1830 Lisp_Object sym;
1831 int offset;
1832 extern struct buffer buffer_local_symbols;
1833
1834 sym = intern (namestring);
1835 offset = (char *)address - (char *)current_buffer;
1836
1837 XSET (XSYMBOL (sym)->value, Lisp_Buffer_Objfwd,
1838 (Lisp_Object *) offset);
1839 *(Lisp_Object *)(offset + (char *)&buffer_local_symbols) = sym;
1840 *(Lisp_Object *)(offset + (char *)&buffer_local_types) = type;
1841 if (*(int *)(offset + (char *)&buffer_local_flags) == 0)
1842 /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
1843 slot of buffer_local_flags */
1844 abort ();
1845 }
1846
1847 #endif /* standalone */
1848 \f
1849 init_lread ()
1850 {
1851 char *normal;
1852
1853 /* Compute the default load-path. */
1854 #ifdef CANNOT_DUMP
1855 normal = PATH_LOADSEARCH;
1856 Vload_path = decode_env_path (0, normal);
1857 #else
1858 if (NILP (Vpurify_flag))
1859 normal = PATH_LOADSEARCH;
1860 else
1861 normal = PATH_DUMPLOADSEARCH;
1862
1863 /* In a dumped Emacs, we normally have to reset the value of
1864 Vload_path from PATH_LOADSEARCH, since the value that was dumped
1865 uses ../lisp, instead of the path of the installed elisp
1866 libraries. However, if it appears that Vload_path was changed
1867 from the default before dumping, don't override that value. */
1868 if (initialized)
1869 {
1870 Lisp_Object dump_path;
1871
1872 dump_path = decode_env_path (0, PATH_DUMPLOADSEARCH);
1873 if (! NILP (Fequal (dump_path, Vload_path)))
1874 {
1875 Vload_path = decode_env_path (0, normal);
1876 if (!NILP (Vinstallation_directory))
1877 {
1878 /* Add to the path the lisp subdir of the
1879 installation dir, if it exists. */
1880 Lisp_Object tem, tem1;
1881 tem = Fexpand_file_name (build_string ("lisp"),
1882 Vinstallation_directory);
1883 tem1 = Ffile_exists_p (tem);
1884 if (!NILP (tem1))
1885 {
1886 if (NILP (Fmember (tem, Vload_path)))
1887 Vload_path = nconc2 (Vload_path, Fcons (tem, Qnil));
1888 }
1889 else
1890 /* That dir doesn't exist, so add the build-time
1891 Lisp dirs instead. */
1892 Vload_path = nconc2 (Vload_path, dump_path);
1893 }
1894 }
1895 }
1896 else
1897 Vload_path = decode_env_path (0, normal);
1898 #endif
1899
1900 /* Warn if dirs in the *standard* path don't exist. */
1901 {
1902 Lisp_Object path_tail;
1903
1904 for (path_tail = Vload_path;
1905 !NILP (path_tail);
1906 path_tail = XCONS (path_tail)->cdr)
1907 {
1908 Lisp_Object dirfile;
1909 dirfile = Fcar (path_tail);
1910 if (XTYPE (dirfile) == Lisp_String)
1911 {
1912 dirfile = Fdirectory_file_name (dirfile);
1913 if (access (XSTRING (dirfile)->data, 0) < 0)
1914 fprintf (stderr,
1915 "Warning: Lisp directory `%s' does not exist.\n",
1916 XSTRING (Fcar (path_tail))->data);
1917 }
1918 }
1919 }
1920
1921 /* If the EMACSLOADPATH environment variable is set, use its value.
1922 This doesn't apply if we're dumping. */
1923 if (NILP (Vpurify_flag)
1924 && egetenv ("EMACSLOADPATH"))
1925 Vload_path = decode_env_path ("EMACSLOADPATH", normal);
1926
1927 Vvalues = Qnil;
1928
1929 load_in_progress = 0;
1930
1931 load_descriptor_list = Qnil;
1932 }
1933
1934 void
1935 syms_of_lread ()
1936 {
1937 defsubr (&Sread);
1938 defsubr (&Sread_from_string);
1939 defsubr (&Sintern);
1940 defsubr (&Sintern_soft);
1941 defsubr (&Sload);
1942 defsubr (&Seval_buffer);
1943 defsubr (&Seval_region);
1944 defsubr (&Sread_char);
1945 defsubr (&Sread_char_exclusive);
1946 defsubr (&Sread_event);
1947 defsubr (&Sget_file_char);
1948 defsubr (&Smapatoms);
1949
1950 DEFVAR_LISP ("obarray", &Vobarray,
1951 "Symbol table for use by `intern' and `read'.\n\
1952 It is a vector whose length ought to be prime for best results.\n\
1953 The vector's contents don't make sense if examined from Lisp programs;\n\
1954 to find all the symbols in an obarray, use `mapatoms'.");
1955
1956 DEFVAR_LISP ("values", &Vvalues,
1957 "List of values of all expressions which were read, evaluated and printed.\n\
1958 Order is reverse chronological.");
1959
1960 DEFVAR_LISP ("standard-input", &Vstandard_input,
1961 "Stream for read to get input from.\n\
1962 See documentation of `read' for possible values.");
1963 Vstandard_input = Qt;
1964
1965 DEFVAR_LISP ("load-path", &Vload_path,
1966 "*List of directories to search for files to load.\n\
1967 Each element is a string (directory name) or nil (try default directory).\n\
1968 Initialized based on EMACSLOADPATH environment variable, if any,\n\
1969 otherwise to default specified by file `paths.h' when Emacs was built.");
1970
1971 DEFVAR_BOOL ("load-in-progress", &load_in_progress,
1972 "Non-nil iff inside of `load'.");
1973
1974 DEFVAR_LISP ("after-load-alist", &Vafter_load_alist,
1975 "An alist of expressions to be evalled when particular files are loaded.\n\
1976 Each element looks like (FILENAME FORMS...).\n\
1977 When `load' is run and the file-name argument is FILENAME,\n\
1978 the FORMS in the corresponding element are executed at the end of loading.\n\n\
1979 FILENAME must match exactly! Normally FILENAME is the name of a library,\n\
1980 with no directory specified, since that is how `load' is normally called.\n\
1981 An error in FORMS does not undo the load,\n\
1982 but does prevent execution of the rest of the FORMS.");
1983 Vafter_load_alist = Qnil;
1984
1985 DEFVAR_LISP ("load-history", &Vload_history,
1986 "Alist mapping source file names to symbols and features.\n\
1987 Each alist element is a list that starts with a file name,\n\
1988 except for one element (optional) that starts with nil and describes\n\
1989 definitions evaluated from buffers not visiting files.\n\
1990 The remaining elements of each list are symbols defined as functions\n\
1991 or variables, and cons cells `(provide . FEATURE)' and `(require . FEATURE)'.");
1992 Vload_history = Qnil;
1993
1994 DEFVAR_LISP ("current-load-list", &Vcurrent_load_list,
1995 "Used for internal purposes by `load'.");
1996 Vcurrent_load_list = Qnil;
1997
1998 load_descriptor_list = Qnil;
1999 staticpro (&load_descriptor_list);
2000
2001 Qcurrent_load_list = intern ("current-load-list");
2002 staticpro (&Qcurrent_load_list);
2003
2004 Qstandard_input = intern ("standard-input");
2005 staticpro (&Qstandard_input);
2006
2007 Qread_char = intern ("read-char");
2008 staticpro (&Qread_char);
2009
2010 Qget_file_char = intern ("get-file-char");
2011 staticpro (&Qget_file_char);
2012
2013 Qascii_character = intern ("ascii-character");
2014 staticpro (&Qascii_character);
2015
2016 Qload = intern ("load");
2017 staticpro (&Qload);
2018 }