Initial revision
[bpt/emacs.git] / src / lread.c
1 /* Lisp parsing and input streams.
2 Copyright (C) 1985, 1986, 1987, 1988, 1989 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21 #include <stdio.h>
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <sys/file.h>
25 #undef NULL
26 #include "config.h"
27 #include "lisp.h"
28
29 #ifndef standalone
30 #include "buffer.h"
31 #include "paths.h"
32 #include "commands.h"
33 #endif
34
35 #ifdef lint
36 #include <sys/inode.h>
37 #endif /* lint */
38
39 #ifndef X_OK
40 #define X_OK 01
41 #endif
42
43 #ifdef LISP_FLOAT_TYPE
44 #include <math.h>
45 #endif /* LISP_FLOAT_TYPE */
46
47 Lisp_Object Qread_char, Qget_file_char, Qstandard_input;
48 Lisp_Object Qvariable_documentation, Vvalues, Vstandard_input, Vafter_load_alist;
49
50 /* non-zero if inside `load' */
51 int load_in_progress;
52
53 /* Search path for files to be loaded. */
54 Lisp_Object Vload_path;
55
56 /* File for get_file_char to read from. Use by load */
57 static FILE *instream;
58
59 /* When nonzero, read conses in pure space */
60 static int read_pure;
61
62 /* For use within read-from-string (this reader is non-reentrant!!) */
63 static int read_from_string_index;
64 static int read_from_string_limit;
65 \f
66 /* Handle unreading and rereading of characters.
67 Write READCHAR to read a character,
68 UNREAD(c) to unread c to be read again. */
69
70 #define READCHAR readchar (readcharfun)
71 #define UNREAD(c) unreadchar (readcharfun, c)
72
73 static int
74 readchar (readcharfun)
75 Lisp_Object readcharfun;
76 {
77 Lisp_Object tem;
78 register struct buffer *inbuffer;
79 register int c, mpos;
80
81 if (XTYPE (readcharfun) == Lisp_Buffer)
82 {
83 inbuffer = XBUFFER (readcharfun);
84
85 if (BUF_PT (inbuffer) >= BUF_ZV (inbuffer))
86 return -1;
87 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, BUF_PT (inbuffer));
88 SET_BUF_PT (inbuffer, BUF_PT (inbuffer) + 1);
89
90 return c;
91 }
92 if (XTYPE (readcharfun) == Lisp_Marker)
93 {
94 inbuffer = XMARKER (readcharfun)->buffer;
95
96 mpos = marker_position (readcharfun);
97
98 if (mpos > BUF_ZV (inbuffer) - 1)
99 return -1;
100 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, mpos);
101 if (mpos != BUF_GPT (inbuffer))
102 XMARKER (readcharfun)->bufpos++;
103 else
104 Fset_marker (readcharfun, make_number (mpos + 1),
105 Fmarker_buffer (readcharfun));
106 return c;
107 }
108 if (EQ (readcharfun, Qget_file_char))
109 return getc (instream);
110
111 if (XTYPE (readcharfun) == Lisp_String)
112 {
113 register int c;
114 /* This used to be return of a conditional expression,
115 but that truncated -1 to a char on VMS. */
116 if (read_from_string_index < read_from_string_limit)
117 c = XSTRING (readcharfun)->data[read_from_string_index++];
118 else
119 c = -1;
120 return c;
121 }
122
123 tem = call0 (readcharfun);
124
125 if (NILP (tem))
126 return -1;
127 return XINT (tem);
128 }
129
130 /* Unread the character C in the way appropriate for the stream READCHARFUN.
131 If the stream is a user function, call it with the char as argument. */
132
133 static void
134 unreadchar (readcharfun, c)
135 Lisp_Object readcharfun;
136 int c;
137 {
138 if (XTYPE (readcharfun) == Lisp_Buffer)
139 {
140 if (XBUFFER (readcharfun) == current_buffer)
141 SET_PT (point - 1);
142 else
143 SET_BUF_PT (XBUFFER (readcharfun), BUF_PT (XBUFFER (readcharfun)) - 1);
144 }
145 else if (XTYPE (readcharfun) == Lisp_Marker)
146 XMARKER (readcharfun)->bufpos--;
147 else if (XTYPE (readcharfun) == Lisp_String)
148 read_from_string_index--;
149 else if (EQ (readcharfun, Qget_file_char))
150 ungetc (c, instream);
151 else
152 call1 (readcharfun, make_number (c));
153 }
154
155 static Lisp_Object read0 (), read1 (), read_list (), read_vector ();
156 \f
157 /* get a character from the tty */
158
159 DEFUN ("read-char", Fread_char, Sread_char, 0, 0, 0,
160 "Read a character from the command input (keyboard or macro).\n\
161 It is returned as a number.")
162 ()
163 {
164 register Lisp_Object val;
165
166 #ifndef standalone
167 val = read_char (0);
168 if (XTYPE (val) != Lisp_Int)
169 {
170 unread_command_char = val;
171 error ("Object read was not a character");
172 }
173 #else
174 val = getchar ();
175 #endif
176
177 return val;
178 }
179
180 #ifdef HAVE_X_WINDOWS
181 DEFUN ("read-event", Fread_event, Sread_event, 0, 0, 0,
182 "Read an event object from the input stream.")
183 ()
184 {
185 register Lisp_Object val;
186
187 val = read_char (0);
188 return val;
189 }
190
191 DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 0, 0,
192 "Read a character from the command input (keyboard or macro).\n\
193 It is returned as a number. Non character events are ignored.")
194 ()
195 {
196 register Lisp_Object val;
197
198 #ifndef standalone
199 val = read_char (0);
200 while (XTYPE (val) != Lisp_Int)
201 val = read_char (0);
202 #else
203 val = getchar ();
204 #endif
205
206 return val;
207 }
208 #endif /* HAVE_X_WINDOWS */
209
210 DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,
211 "Don't use this yourself.")
212 ()
213 {
214 register Lisp_Object val;
215 XSET (val, Lisp_Int, getc (instream));
216 return val;
217 }
218 \f
219 static void readevalloop ();
220 static Lisp_Object load_unwind ();
221
222 DEFUN ("load", Fload, Sload, 1, 4, 0,
223 "Execute a file of Lisp code named FILE.\n\
224 First try FILE with `.elc' appended, then try with `.el',\n\
225 then try FILE unmodified.\n\
226 This function searches the directories in `load-path'.\n\
227 If optional second arg NOERROR is non-nil,\n\
228 report no error if FILE doesn't exist.\n\
229 Print messages at start and end of loading unless\n\
230 optional third arg NOMESSAGE is non-nil.\n\
231 If optional fourth arg NOSUFFIX is non-nil, don't try adding\n\
232 suffixes `.elc' or `.el' to the specified name FILE.\n\
233 Return t if file exists.")
234 (str, noerror, nomessage, nosuffix)
235 Lisp_Object str, noerror, nomessage, nosuffix;
236 {
237 register FILE *stream;
238 register int fd = -1;
239 register Lisp_Object lispstream;
240 register FILE **ptr;
241 int count = specpdl_ptr - specpdl;
242 Lisp_Object temp;
243 struct gcpro gcpro1;
244 Lisp_Object found;
245
246 CHECK_STRING (str, 0);
247 str = Fsubstitute_in_file_name (str);
248
249 /* Avoid weird lossage with null string as arg,
250 since it would try to load a directory as a Lisp file */
251 if (XSTRING (str)->size > 0)
252 {
253 fd = openp (Vload_path, str, !NILP (nosuffix) ? "" : ".elc:.el:",
254 &found, 0);
255 }
256
257 if (fd < 0)
258 {
259 if (NILP (noerror))
260 while (1)
261 Fsignal (Qfile_error, Fcons (build_string ("Cannot open load file"),
262 Fcons (str, Qnil)));
263 else
264 return Qnil;
265 }
266
267 if (!bcmp (&(XSTRING (found)->data[XSTRING (found)->size - 4]),
268 ".elc", 4))
269 {
270 struct stat s1, s2;
271 int result;
272
273 stat (XSTRING (found)->data, &s1);
274 XSTRING (found)->data[XSTRING (found)->size - 1] = 0;
275 result = stat (XSTRING (found)->data, &s2);
276 if (result >= 0 && (unsigned) s1.st_mtime < (unsigned) s2.st_mtime)
277 message ("Source file `%s' newer than byte-compiled file",
278 XSTRING (found)->data);
279 XSTRING (found)->data[XSTRING (found)->size - 1] = 'c';
280 }
281
282 stream = fdopen (fd, "r");
283 if (stream == 0)
284 {
285 close (fd);
286 error ("Failure to create stdio stream for %s", XSTRING (str)->data);
287 }
288
289 if (NILP (nomessage))
290 message ("Loading %s...", XSTRING (str)->data);
291
292 GCPRO1 (str);
293 /* We may not be able to store STREAM itself as a Lisp_Object pointer
294 since that is guaranteed to work only for data that has been malloc'd.
295 So malloc a full-size pointer, and record the address of that pointer. */
296 ptr = (FILE **) xmalloc (sizeof (FILE *));
297 *ptr = stream;
298 XSET (lispstream, Lisp_Internal_Stream, (int) ptr);
299 record_unwind_protect (load_unwind, lispstream);
300 load_in_progress++;
301 readevalloop (Qget_file_char, stream, Feval, 0);
302 unbind_to (count, Qnil);
303
304 /* Run any load-hooks for this file. */
305 temp = Fassoc (str, Vafter_load_alist);
306 if (!NILP (temp))
307 Fprogn (Fcdr (temp));
308 UNGCPRO;
309
310 if (!noninteractive && NILP (nomessage))
311 message ("Loading %s...done", XSTRING (str)->data);
312 return Qt;
313 }
314
315 static Lisp_Object
316 load_unwind (stream) /* used as unwind-protect function in load */
317 Lisp_Object stream;
318 {
319 fclose (*(FILE **) XSTRING (stream));
320 free (XPNTR (stream));
321 if (--load_in_progress < 0) load_in_progress = 0;
322 return Qnil;
323 }
324
325 \f
326 static int
327 complete_filename_p (pathname)
328 Lisp_Object pathname;
329 {
330 register unsigned char *s = XSTRING (pathname)->data;
331 return (*s == '/'
332 #ifdef ALTOS
333 || *s == '@'
334 #endif
335 #ifdef VMS
336 || index (s, ':')
337 #endif /* VMS */
338 );
339 }
340
341 /* Search for a file whose name is STR, looking in directories
342 in the Lisp list PATH, and trying suffixes from SUFFIX.
343 SUFFIX is a string containing possible suffixes separated by colons.
344 On success, returns a file descriptor. On failure, returns -1.
345
346 EXEC_ONLY nonzero means don't open the files,
347 just look for one that is executable. In this case,
348 returns 1 on success.
349
350 If STOREPTR is nonzero, it points to a slot where the name of
351 the file actually found should be stored as a Lisp string.
352 Nil is stored there on failure. */
353
354 int
355 openp (path, str, suffix, storeptr, exec_only)
356 Lisp_Object path, str;
357 char *suffix;
358 Lisp_Object *storeptr;
359 int exec_only;
360 {
361 register int fd;
362 int fn_size = 100;
363 char buf[100];
364 register char *fn = buf;
365 int absolute = 0;
366 int want_size;
367 register Lisp_Object filename;
368 struct stat st;
369
370 if (storeptr)
371 *storeptr = Qnil;
372
373 if (complete_filename_p (str))
374 absolute = 1;
375
376 for (; !NILP (path); path = Fcdr (path))
377 {
378 char *nsuffix;
379
380 filename = Fexpand_file_name (str, Fcar (path));
381 if (!complete_filename_p (filename))
382 /* If there are non-absolute elts in PATH (eg ".") */
383 /* Of course, this could conceivably lose if luser sets
384 default-directory to be something non-absolute... */
385 {
386 filename = Fexpand_file_name (filename, current_buffer->directory);
387 if (!complete_filename_p (filename))
388 /* Give up on this path element! */
389 continue;
390 }
391
392 /* Calculate maximum size of any filename made from
393 this path element/specified file name and any possible suffix. */
394 want_size = strlen (suffix) + XSTRING (filename)->size + 1;
395 if (fn_size < want_size)
396 fn = (char *) alloca (fn_size = 100 + want_size);
397
398 nsuffix = suffix;
399
400 /* Loop over suffixes. */
401 while (1)
402 {
403 char *esuffix = (char *) index (nsuffix, ':');
404 int lsuffix = esuffix ? esuffix - nsuffix : strlen (nsuffix);
405
406 /* Concatenate path element/specified name with the suffix. */
407 strncpy (fn, XSTRING (filename)->data, XSTRING (filename)->size);
408 fn[XSTRING (filename)->size] = 0;
409 if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
410 strncat (fn, nsuffix, lsuffix);
411
412 /* Ignore file if it's a directory. */
413 if (stat (fn, &st) >= 0
414 && (st.st_mode & S_IFMT) != S_IFDIR)
415 {
416 /* Check that we can access or open it. */
417 if (exec_only)
418 fd = (access (fn, X_OK) == 0) ? 1 : -1;
419 else
420 fd = open (fn, 0, 0);
421
422 if (fd >= 0)
423 {
424 /* We succeeded; return this descriptor and filename. */
425 if (storeptr)
426 *storeptr = build_string (fn);
427 return fd;
428 }
429 }
430
431 /* Advance to next suffix. */
432 if (esuffix == 0)
433 break;
434 nsuffix += lsuffix + 1;
435 }
436 if (absolute) return -1;
437 }
438
439 return -1;
440 }
441
442 \f
443 Lisp_Object
444 unreadpure () /* Used as unwind-protect function in readevalloop */
445 {
446 read_pure = 0;
447 return Qnil;
448 }
449
450 static void
451 readevalloop (readcharfun, stream, evalfun, printflag)
452 Lisp_Object readcharfun;
453 FILE *stream;
454 Lisp_Object (*evalfun) ();
455 int printflag;
456 {
457 register int c;
458 register Lisp_Object val;
459 int count = specpdl_ptr - specpdl;
460
461 specbind (Qstandard_input, readcharfun);
462
463 while (1)
464 {
465 instream = stream;
466 c = READCHAR;
467 if (c == ';')
468 {
469 while ((c = READCHAR) != '\n' && c != -1);
470 continue;
471 }
472 if (c < 0) break;
473 if (c == ' ' || c == '\t' || c == '\n' || c == '\f') continue;
474
475 if (!NILP (Vpurify_flag) && c == '(')
476 {
477 record_unwind_protect (unreadpure, Qnil);
478 val = read_list (-1, readcharfun);
479 unbind_to (count + 1, Qnil);
480 }
481 else
482 {
483 UNREAD (c);
484 val = read0 (readcharfun);
485 }
486
487 val = (*evalfun) (val);
488 if (printflag)
489 {
490 Vvalues = Fcons (val, Vvalues);
491 if (EQ (Vstandard_output, Qt))
492 Fprin1 (val, Qnil);
493 else
494 Fprint (val, Qnil);
495 }
496 }
497
498 unbind_to (count, Qnil);
499 }
500
501 #ifndef standalone
502
503 DEFUN ("eval-current-buffer", Feval_current_buffer, Seval_current_buffer, 0, 1, "",
504 "Execute the current buffer as Lisp code.\n\
505 Programs can pass argument PRINTFLAG which controls printing of output:\n\
506 nil means discard it; anything else is stream for print.\n\
507 \n\
508 If there is no error, point does not move. If there is an error,\n\
509 point remains at the end of the last character read from the buffer.")
510 (printflag)
511 Lisp_Object printflag;
512 {
513 int count = specpdl_ptr - specpdl;
514 Lisp_Object tem;
515
516 if (NILP (printflag))
517 tem = Qsymbolp;
518 else
519 tem = printflag;
520 specbind (Qstandard_output, tem);
521 record_unwind_protect (save_excursion_restore, save_excursion_save ());
522 SET_PT (BEGV);
523 readevalloop (Fcurrent_buffer (), 0, Feval, !NILP (printflag));
524 return unbind_to (count, Qnil);
525 }
526
527 DEFUN ("eval-region", Feval_region, Seval_region, 2, 3, "r",
528 "Execute the region as Lisp code.\n\
529 When called from programs, expects two arguments,\n\
530 giving starting and ending indices in the current buffer\n\
531 of the text to be executed.\n\
532 Programs can pass third argument PRINTFLAG which controls output:\n\
533 nil means discard it; anything else is stream for printing it.\n\
534 \n\
535 If there is no error, point does not move. If there is an error,\n\
536 point remains at the end of the last character read from the buffer.")
537 (b, e, printflag)
538 Lisp_Object b, e, printflag;
539 {
540 int count = specpdl_ptr - specpdl;
541 Lisp_Object tem;
542
543 if (NILP (printflag))
544 tem = Qsymbolp;
545 else
546 tem = printflag;
547 specbind (Qstandard_output, tem);
548
549 if (NILP (printflag))
550 record_unwind_protect (save_excursion_restore, save_excursion_save ());
551 record_unwind_protect (save_restriction_restore, save_restriction_save ());
552
553 /* This both uses b and checks its type. */
554 Fgoto_char (b);
555 Fnarrow_to_region (make_number (BEGV), e);
556 readevalloop (Fcurrent_buffer (), 0, Feval, !NILP (printflag));
557
558 return unbind_to (count, Qnil);
559 }
560
561 #endif /* standalone */
562 \f
563 DEFUN ("read", Fread, Sread, 0, 1, 0,
564 "Read one Lisp expression as text from STREAM, return as Lisp object.\n\
565 If STREAM is nil, use the value of `standard-input' (which see).\n\
566 STREAM or the value of `standard-input' may be:\n\
567 a buffer (read from point and advance it)\n\
568 a marker (read from where it points and advance it)\n\
569 a function (call it with no arguments for each character,\n\
570 call it with a char as argument to push a char back)\n\
571 a string (takes text from string, starting at the beginning)\n\
572 t (read text line using minibuffer and use it).")
573 (readcharfun)
574 Lisp_Object readcharfun;
575 {
576 extern Lisp_Object Fread_minibuffer ();
577
578 if (NILP (readcharfun))
579 readcharfun = Vstandard_input;
580 if (EQ (readcharfun, Qt))
581 readcharfun = Qread_char;
582
583 #ifndef standalone
584 if (EQ (readcharfun, Qread_char))
585 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil);
586 #endif
587
588 if (XTYPE (readcharfun) == Lisp_String)
589 return Fcar (Fread_from_string (readcharfun, Qnil, Qnil));
590
591 return read0 (readcharfun);
592 }
593
594 DEFUN ("read-from-string", Fread_from_string, Sread_from_string, 1, 3, 0,
595 "Read one Lisp expression which is represented as text by STRING.\n\
596 Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).\n\
597 START and END optionally delimit a substring of STRING from which to read;\n\
598 they default to 0 and (length STRING) respectively.")
599 (string, start, end)
600 Lisp_Object string, start, end;
601 {
602 int startval, endval;
603 Lisp_Object tem;
604
605 CHECK_STRING (string,0);
606
607 if (NILP (end))
608 endval = XSTRING (string)->size;
609 else
610 { CHECK_NUMBER (end,2);
611 endval = XINT (end);
612 if (endval < 0 || endval > XSTRING (string)->size)
613 args_out_of_range (string, end);
614 }
615
616 if (NILP (start))
617 startval = 0;
618 else
619 { CHECK_NUMBER (start,1);
620 startval = XINT (start);
621 if (startval < 0 || startval > endval)
622 args_out_of_range (string, start);
623 }
624
625 read_from_string_index = startval;
626 read_from_string_limit = endval;
627
628 tem = read0 (string);
629 return Fcons (tem, make_number (read_from_string_index));
630 }
631 \f
632 /* Use this for recursive reads, in contexts where internal tokens are not allowed. */
633
634 static Lisp_Object
635 read0 (readcharfun)
636 Lisp_Object readcharfun;
637 {
638 register Lisp_Object val;
639 char c;
640
641 val = read1 (readcharfun);
642 if (XTYPE (val) == Lisp_Internal)
643 {
644 c = XINT (val);
645 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (&c, 1), Qnil));
646 }
647
648 return val;
649 }
650 \f
651 static int read_buffer_size;
652 static char *read_buffer;
653
654 static int
655 read_escape (readcharfun)
656 Lisp_Object readcharfun;
657 {
658 register int c = READCHAR;
659 switch (c)
660 {
661 case 'a':
662 return '\007';
663 case 'b':
664 return '\b';
665 case 'e':
666 return 033;
667 case 'f':
668 return '\f';
669 case 'n':
670 return '\n';
671 case 'r':
672 return '\r';
673 case 't':
674 return '\t';
675 case 'v':
676 return '\v';
677 case '\n':
678 return -1;
679
680 case 'M':
681 c = READCHAR;
682 if (c != '-')
683 error ("Invalid escape character syntax");
684 c = READCHAR;
685 if (c == '\\')
686 c = read_escape (readcharfun);
687 return c | 0200;
688
689 case 'C':
690 c = READCHAR;
691 if (c != '-')
692 error ("Invalid escape character syntax");
693 case '^':
694 c = READCHAR;
695 if (c == '\\')
696 c = read_escape (readcharfun);
697 if (c == '?')
698 return 0177;
699 else
700 return (c & (0200 | 037));
701
702 case '0':
703 case '1':
704 case '2':
705 case '3':
706 case '4':
707 case '5':
708 case '6':
709 case '7':
710 /* An octal escape, as in ANSI C. */
711 {
712 register int i = c - '0';
713 register int count = 0;
714 while (++count < 3)
715 {
716 if ((c = READCHAR) >= '0' && c <= '7')
717 {
718 i *= 8;
719 i += c - '0';
720 }
721 else
722 {
723 UNREAD (c);
724 break;
725 }
726 }
727 return i;
728 }
729
730 case 'x':
731 /* A hex escape, as in ANSI C. */
732 {
733 int i = 0;
734 while (1)
735 {
736 c = READCHAR;
737 if (c >= '0' && c <= '9')
738 {
739 i *= 16;
740 i += c - '0';
741 }
742 else if ((c >= 'a' && c <= 'f')
743 || (c >= 'A' && c <= 'F'))
744 {
745 i *= 16;
746 if (c >= 'a' && c <= 'f')
747 i += c - 'a' + 10;
748 else
749 i += c - 'A' + 10;
750 }
751 else
752 {
753 UNREAD (c);
754 break;
755 }
756 }
757 return i;
758 }
759
760 default:
761 return c;
762 }
763 }
764
765 static Lisp_Object
766 read1 (readcharfun)
767 register Lisp_Object readcharfun;
768 {
769 register int c;
770
771 retry:
772
773 c = READCHAR;
774 if (c < 0) return Fsignal (Qend_of_file, Qnil);
775
776 switch (c)
777 {
778 case '(':
779 return read_list (0, readcharfun);
780
781 case '[':
782 return read_vector (readcharfun);
783
784 case ')':
785 case ']':
786 case '.':
787 {
788 register Lisp_Object val;
789 XSET (val, Lisp_Internal, c);
790 return val;
791 }
792
793 case '#':
794 c = READCHAR;
795 if (c == '[')
796 {
797 /* Accept compiled functions at read-time so that we don't have to
798 build them using function calls. */
799 Lisp_Object tmp = read_vector (readcharfun);
800 return Fmake_byte_code (XVECTOR(tmp)->size, XVECTOR (tmp)->contents);
801 }
802 UNREAD (c);
803 return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
804
805 case ';':
806 while ((c = READCHAR) >= 0 && c != '\n');
807 goto retry;
808
809 case '\'':
810 {
811 return Fcons (Qquote, Fcons (read0 (readcharfun), Qnil));
812 }
813
814 case '?':
815 {
816 register Lisp_Object val;
817
818 c = READCHAR;
819 if (c < 0) return Fsignal (Qend_of_file, Qnil);
820
821 if (c == '\\')
822 XSET (val, Lisp_Int, read_escape (readcharfun));
823 else
824 XSET (val, Lisp_Int, c);
825
826 return val;
827 }
828
829 case '\"':
830 {
831 register char *p = read_buffer;
832 register char *end = read_buffer + read_buffer_size;
833 register int c;
834 int cancel = 0;
835
836 while ((c = READCHAR) >= 0
837 && c != '\"')
838 {
839 if (p == end)
840 {
841 char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
842 p += new - read_buffer;
843 read_buffer += new - read_buffer;
844 end = read_buffer + read_buffer_size;
845 }
846 if (c == '\\')
847 c = read_escape (readcharfun);
848 /* c is -1 if \ newline has just been seen */
849 if (c < 0)
850 {
851 if (p == read_buffer)
852 cancel = 1;
853 }
854 else
855 *p++ = c;
856 }
857 if (c < 0) return Fsignal (Qend_of_file, Qnil);
858
859 /* If purifying, and string starts with \ newline,
860 return zero instead. This is for doc strings
861 that we are really going to find in share-lib/DOC.nn.nn */
862 if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
863 return make_number (0);
864
865 if (read_pure)
866 return make_pure_string (read_buffer, p - read_buffer);
867 else
868 return make_string (read_buffer, p - read_buffer);
869 }
870
871 default:
872 if (c <= 040) goto retry;
873 {
874 register char *p = read_buffer;
875
876 {
877 register char *end = read_buffer + read_buffer_size;
878
879 while (c > 040 &&
880 !(c == '\"' || c == '\'' || c == ';' || c == '?'
881 || c == '(' || c == ')'
882 #ifndef LISP_FLOAT_TYPE /* we need to see <number><dot><number> */
883 || c =='.'
884 #endif /* not LISP_FLOAT_TYPE */
885 || c == '[' || c == ']' || c == '#'
886 ))
887 {
888 if (p == end)
889 {
890 register char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
891 p += new - read_buffer;
892 read_buffer += new - read_buffer;
893 end = read_buffer + read_buffer_size;
894 }
895 if (c == '\\')
896 c = READCHAR;
897 *p++ = c;
898 c = READCHAR;
899 }
900
901 if (p == end)
902 {
903 char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
904 p += new - read_buffer;
905 read_buffer += new - read_buffer;
906 /* end = read_buffer + read_buffer_size; */
907 }
908 *p = 0;
909 if (c >= 0)
910 UNREAD (c);
911 }
912
913 /* Is it an integer? */
914 {
915 register char *p1;
916 register Lisp_Object val;
917 p1 = read_buffer;
918 if (*p1 == '+' || *p1 == '-') p1++;
919 if (p1 != p)
920 {
921 while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
922 if (p1 == p)
923 /* It is. */
924 {
925 XSET (val, Lisp_Int, atoi (read_buffer));
926 return val;
927 }
928 }
929 #ifdef LISP_FLOAT_TYPE
930 if (isfloat_string (read_buffer))
931 return make_float (atof (read_buffer));
932 #endif
933 }
934
935 return intern (read_buffer);
936 }
937 }
938 }
939 \f
940 #ifdef LISP_FLOAT_TYPE
941
942 #include <ctype.h>
943 #define LEAD_INT 1
944 #define DOT_CHAR 2
945 #define TRAIL_INT 4
946 #define E_CHAR 8
947 #define EXP_INT 16
948
949 int
950 isfloat_string (cp)
951 register char *cp;
952 {
953 register state;
954
955 state = 0;
956 if (*cp == '+' || *cp == '-')
957 cp++;
958
959 if (isdigit(*cp))
960 {
961 state |= LEAD_INT;
962 while (isdigit (*cp))
963 cp ++;
964 }
965 if (*cp == '.')
966 {
967 state |= DOT_CHAR;
968 cp++;
969 }
970 if (isdigit(*cp))
971 {
972 state |= TRAIL_INT;
973 while (isdigit (*cp))
974 cp++;
975 }
976 if (*cp == 'e')
977 {
978 state |= E_CHAR;
979 cp++;
980 }
981 if ((*cp == '+') || (*cp == '-'))
982 cp++;
983
984 if (isdigit (*cp))
985 {
986 state |= EXP_INT;
987 while (isdigit (*cp))
988 cp++;
989 }
990 return (*cp == 0
991 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
992 || state == (LEAD_INT|E_CHAR|EXP_INT)
993 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
994 }
995 #endif /* LISP_FLOAT_TYPE */
996 \f
997 static Lisp_Object
998 read_vector (readcharfun)
999 Lisp_Object readcharfun;
1000 {
1001 register int i;
1002 register int size;
1003 register Lisp_Object *ptr;
1004 register Lisp_Object tem, vector;
1005 register struct Lisp_Cons *otem;
1006 Lisp_Object len;
1007
1008 tem = read_list (1, readcharfun);
1009 len = Flength (tem);
1010 vector = (read_pure ? make_pure_vector (XINT (len)) : Fmake_vector (len, Qnil));
1011
1012
1013 size = XVECTOR (vector)->size;
1014 ptr = XVECTOR (vector)->contents;
1015 for (i = 0; i < size; i++)
1016 {
1017 ptr[i] = read_pure ? Fpurecopy (Fcar (tem)) : Fcar (tem);
1018 otem = XCONS (tem);
1019 tem = Fcdr (tem);
1020 free_cons (otem);
1021 }
1022 return vector;
1023 }
1024
1025 /* flag = 1 means check for ] to terminate rather than ) and .
1026 flag = -1 means check for starting with defun
1027 and make structure pure. */
1028
1029 static Lisp_Object
1030 read_list (flag, readcharfun)
1031 int flag;
1032 register Lisp_Object readcharfun;
1033 {
1034 /* -1 means check next element for defun,
1035 0 means don't check,
1036 1 means already checked and found defun. */
1037 int defunflag = flag < 0 ? -1 : 0;
1038 Lisp_Object val, tail;
1039 register Lisp_Object elt, tem;
1040 struct gcpro gcpro1, gcpro2;
1041
1042 val = Qnil;
1043 tail = Qnil;
1044
1045 while (1)
1046 {
1047 GCPRO2 (val, tail);
1048 elt = read1 (readcharfun);
1049 UNGCPRO;
1050 if (XTYPE (elt) == Lisp_Internal)
1051 {
1052 if (flag > 0)
1053 {
1054 if (XINT (elt) == ']')
1055 return val;
1056 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (") or . in a vector", 18), Qnil));
1057 }
1058 if (XINT (elt) == ')')
1059 return val;
1060 if (XINT (elt) == '.')
1061 {
1062 GCPRO2 (val, tail);
1063 if (!NILP (tail))
1064 XCONS (tail)->cdr = read0 (readcharfun);
1065 else
1066 val = read0 (readcharfun);
1067 elt = read1 (readcharfun);
1068 UNGCPRO;
1069 if (XTYPE (elt) == Lisp_Internal && XINT (elt) == ')')
1070 return val;
1071 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil));
1072 }
1073 return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("] in a list", 11), Qnil));
1074 }
1075 tem = (read_pure && flag <= 0
1076 ? pure_cons (elt, Qnil)
1077 : Fcons (elt, Qnil));
1078 if (!NILP (tail))
1079 XCONS (tail)->cdr = tem;
1080 else
1081 val = tem;
1082 tail = tem;
1083 if (defunflag < 0)
1084 defunflag = EQ (elt, Qdefun);
1085 else if (defunflag > 0)
1086 read_pure = 1;
1087 }
1088 }
1089 \f
1090 Lisp_Object Vobarray;
1091 Lisp_Object initial_obarray;
1092
1093 Lisp_Object
1094 check_obarray (obarray)
1095 Lisp_Object obarray;
1096 {
1097 while (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0)
1098 {
1099 /* If Vobarray is now invalid, force it to be valid. */
1100 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray;
1101
1102 obarray = wrong_type_argument (Qvectorp, obarray);
1103 }
1104 return obarray;
1105 }
1106
1107 static int hash_string ();
1108 Lisp_Object oblookup ();
1109
1110 Lisp_Object
1111 intern (str)
1112 char *str;
1113 {
1114 Lisp_Object tem;
1115 int len = strlen (str);
1116 Lisp_Object obarray = Vobarray;
1117
1118 if (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0)
1119 obarray = check_obarray (obarray);
1120 tem = oblookup (obarray, str, len);
1121 if (XTYPE (tem) == Lisp_Symbol)
1122 return tem;
1123 return Fintern ((!NILP (Vpurify_flag)
1124 ? make_pure_string (str, len)
1125 : make_string (str, len)),
1126 obarray);
1127 }
1128
1129 DEFUN ("intern", Fintern, Sintern, 1, 2, 0,
1130 "Return the canonical symbol whose name is STRING.\n\
1131 If there is none, one is created by this function and returned.\n\
1132 A second optional argument specifies the obarray to use;\n\
1133 it defaults to the value of `obarray'.")
1134 (str, obarray)
1135 Lisp_Object str, obarray;
1136 {
1137 register Lisp_Object tem, sym, *ptr;
1138
1139 if (NILP (obarray)) obarray = Vobarray;
1140 obarray = check_obarray (obarray);
1141
1142 CHECK_STRING (str, 0);
1143
1144 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
1145 if (XTYPE (tem) != Lisp_Int)
1146 return tem;
1147
1148 if (!NILP (Vpurify_flag))
1149 str = Fpurecopy (str);
1150 sym = Fmake_symbol (str);
1151
1152 ptr = &XVECTOR (obarray)->contents[XINT (tem)];
1153 if (XTYPE (*ptr) == Lisp_Symbol)
1154 XSYMBOL (sym)->next = XSYMBOL (*ptr);
1155 else
1156 XSYMBOL (sym)->next = 0;
1157 *ptr = sym;
1158 return sym;
1159 }
1160
1161 DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,
1162 "Return the canonical symbol whose name is STRING, or nil if none exists.\n\
1163 A second optional argument specifies the obarray to use;\n\
1164 it defaults to the value of `obarray'.")
1165 (str, obarray)
1166 Lisp_Object str, obarray;
1167 {
1168 register Lisp_Object tem;
1169
1170 if (NILP (obarray)) obarray = Vobarray;
1171 obarray = check_obarray (obarray);
1172
1173 CHECK_STRING (str, 0);
1174
1175 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
1176 if (XTYPE (tem) != Lisp_Int)
1177 return tem;
1178 return Qnil;
1179 }
1180
1181 Lisp_Object
1182 oblookup (obarray, ptr, size)
1183 Lisp_Object obarray;
1184 register char *ptr;
1185 register int size;
1186 {
1187 int hash, obsize;
1188 register Lisp_Object tail;
1189 Lisp_Object bucket, tem;
1190
1191 if (XTYPE (obarray) != Lisp_Vector ||
1192 (obsize = XVECTOR (obarray)->size) == 0)
1193 {
1194 obarray = check_obarray (obarray);
1195 obsize = XVECTOR (obarray)->size;
1196 }
1197 /* Combining next two lines breaks VMS C 2.3. */
1198 hash = hash_string (ptr, size);
1199 hash %= obsize;
1200 bucket = XVECTOR (obarray)->contents[hash];
1201 if (XFASTINT (bucket) == 0)
1202 ;
1203 else if (XTYPE (bucket) != Lisp_Symbol)
1204 error ("Bad data in guts of obarray"); /* Like CADR error message */
1205 else for (tail = bucket; ; XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next))
1206 {
1207 if (XSYMBOL (tail)->name->size == size &&
1208 !bcmp (XSYMBOL (tail)->name->data, ptr, size))
1209 return tail;
1210 else if (XSYMBOL (tail)->next == 0)
1211 break;
1212 }
1213 XSET (tem, Lisp_Int, hash);
1214 return tem;
1215 }
1216
1217 static int
1218 hash_string (ptr, len)
1219 unsigned char *ptr;
1220 int len;
1221 {
1222 register unsigned char *p = ptr;
1223 register unsigned char *end = p + len;
1224 register unsigned char c;
1225 register int hash = 0;
1226
1227 while (p != end)
1228 {
1229 c = *p++;
1230 if (c >= 0140) c -= 40;
1231 hash = ((hash<<3) + (hash>>28) + c);
1232 }
1233 return hash & 07777777777;
1234 }
1235
1236 void
1237 map_obarray (obarray, fn, arg)
1238 Lisp_Object obarray;
1239 int (*fn) ();
1240 Lisp_Object arg;
1241 {
1242 register int i;
1243 register Lisp_Object tail;
1244 CHECK_VECTOR (obarray, 1);
1245 for (i = XVECTOR (obarray)->size - 1; i >= 0; i--)
1246 {
1247 tail = XVECTOR (obarray)->contents[i];
1248 if (XFASTINT (tail) != 0)
1249 while (1)
1250 {
1251 (*fn) (tail, arg);
1252 if (XSYMBOL (tail)->next == 0)
1253 break;
1254 XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next);
1255 }
1256 }
1257 }
1258
1259 mapatoms_1 (sym, function)
1260 Lisp_Object sym, function;
1261 {
1262 call1 (function, sym);
1263 }
1264
1265 DEFUN ("mapatoms", Fmapatoms, Smapatoms, 1, 2, 0,
1266 "Call FUNCTION on every symbol in OBARRAY.\n\
1267 OBARRAY defaults to the value of `obarray'.")
1268 (function, obarray)
1269 Lisp_Object function, obarray;
1270 {
1271 Lisp_Object tem;
1272
1273 if (NILP (obarray)) obarray = Vobarray;
1274 obarray = check_obarray (obarray);
1275
1276 map_obarray (obarray, mapatoms_1, function);
1277 return Qnil;
1278 }
1279
1280 #define OBARRAY_SIZE 509
1281
1282 void
1283 init_obarray ()
1284 {
1285 Lisp_Object oblength;
1286 int hash;
1287 Lisp_Object *tem;
1288
1289 XFASTINT (oblength) = OBARRAY_SIZE;
1290
1291 Qnil = Fmake_symbol (make_pure_string ("nil", 3));
1292 Vobarray = Fmake_vector (oblength, make_number (0));
1293 initial_obarray = Vobarray;
1294 staticpro (&initial_obarray);
1295 /* Intern nil in the obarray */
1296 /* These locals are to kludge around a pyramid compiler bug. */
1297 hash = hash_string ("nil", 3);
1298 /* Separate statement here to avoid VAXC bug. */
1299 hash %= OBARRAY_SIZE;
1300 tem = &XVECTOR (Vobarray)->contents[hash];
1301 *tem = Qnil;
1302
1303 Qunbound = Fmake_symbol (make_pure_string ("unbound", 7));
1304 XSYMBOL (Qnil)->function = Qunbound;
1305 XSYMBOL (Qunbound)->value = Qunbound;
1306 XSYMBOL (Qunbound)->function = Qunbound;
1307
1308 Qt = intern ("t");
1309 XSYMBOL (Qnil)->value = Qnil;
1310 XSYMBOL (Qnil)->plist = Qnil;
1311 XSYMBOL (Qt)->value = Qt;
1312
1313 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */
1314 Vpurify_flag = Qt;
1315
1316 Qvariable_documentation = intern ("variable-documentation");
1317
1318 read_buffer_size = 100;
1319 read_buffer = (char *) malloc (read_buffer_size);
1320 }
1321 \f
1322 void
1323 defsubr (sname)
1324 struct Lisp_Subr *sname;
1325 {
1326 Lisp_Object sym;
1327 sym = intern (sname->symbol_name);
1328 XSET (XSYMBOL (sym)->function, Lisp_Subr, sname);
1329 }
1330
1331 #ifdef NOTDEF /* use fset in subr.el now */
1332 void
1333 defalias (sname, string)
1334 struct Lisp_Subr *sname;
1335 char *string;
1336 {
1337 Lisp_Object sym;
1338 sym = intern (string);
1339 XSET (XSYMBOL (sym)->function, Lisp_Subr, sname);
1340 }
1341 #endif /* NOTDEF */
1342
1343 /* New replacement for DefIntVar; it ignores the doc string argument
1344 on the assumption that make-docfile will handle that. */
1345 /* Define an "integer variable"; a symbol whose value is forwarded
1346 to a C variable of type int. Sample call: */
1347 /* DEFVARINT ("indent-tabs-mode", &indent_tabs_mode, "Documentation"); */
1348
1349 void
1350 defvar_int (namestring, address, doc)
1351 char *namestring;
1352 int *address;
1353 char *doc;
1354 {
1355 Lisp_Object sym;
1356 sym = intern (namestring);
1357 XSET (XSYMBOL (sym)->value, Lisp_Intfwd, address);
1358 }
1359
1360 /* Similar but define a variable whose value is T if address contains 1,
1361 NIL if address contains 0 */
1362
1363 void
1364 defvar_bool (namestring, address, doc)
1365 char *namestring;
1366 int *address;
1367 char *doc;
1368 {
1369 Lisp_Object sym;
1370 sym = intern (namestring);
1371 XSET (XSYMBOL (sym)->value, Lisp_Boolfwd, address);
1372 }
1373
1374 /* Similar but define a variable whose value is the Lisp Object stored at address. */
1375
1376 void
1377 defvar_lisp (namestring, address, doc)
1378 char *namestring;
1379 Lisp_Object *address;
1380 char *doc;
1381 {
1382 Lisp_Object sym;
1383 sym = intern (namestring);
1384 XSET (XSYMBOL (sym)->value, Lisp_Objfwd, address);
1385 staticpro (address);
1386 }
1387
1388 /* Similar but don't request gc-marking of the C variable.
1389 Used when that variable will be gc-marked for some other reason,
1390 since marking the same slot twice can cause trouble with strings. */
1391
1392 void
1393 defvar_lisp_nopro (namestring, address, doc)
1394 char *namestring;
1395 Lisp_Object *address;
1396 char *doc;
1397 {
1398 Lisp_Object sym;
1399 sym = intern (namestring);
1400 XSET (XSYMBOL (sym)->value, Lisp_Objfwd, address);
1401 }
1402
1403 #ifndef standalone
1404
1405 /* Similar but define a variable whose value is the Lisp Object stored in
1406 the current buffer. address is the address of the slot in the buffer that is current now. */
1407
1408 void
1409 defvar_per_buffer (namestring, address, doc)
1410 char *namestring;
1411 Lisp_Object *address;
1412 char *doc;
1413 {
1414 Lisp_Object sym;
1415 int offset;
1416 extern struct buffer buffer_local_symbols;
1417
1418 sym = intern (namestring);
1419 offset = (char *)address - (char *)current_buffer;
1420
1421 XSET (XSYMBOL (sym)->value, Lisp_Buffer_Objfwd,
1422 (Lisp_Object *) offset);
1423 *(Lisp_Object *)(offset + (char *)&buffer_local_symbols) = sym;
1424 if (*(int *)(offset + (char *)&buffer_local_flags) == 0)
1425 /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
1426 slot of buffer_local_flags */
1427 abort ();
1428 }
1429
1430 #endif /* standalone */
1431 \f
1432 init_lread ()
1433 {
1434 char *normal = PATH_LOADSEARCH;
1435 Lisp_Object normal_path;
1436
1437 /* Compute the default load-path. */
1438 #ifndef CANNOT_DUMP
1439 /* If running a dumped Emacs in which load-path was set before dumping
1440 to a nonstandard value, use that value. */
1441 if (initialized
1442 && !(XTYPE (Vload_path) == Lisp_Cons
1443 && XTYPE (XCONS (Vload_path)->car) == Lisp_String
1444 && !strcmp (XSTRING (XCONS (Vload_path)->car)->data, "../lisp")))
1445 normal_path = Vload_path;
1446 else
1447 #endif
1448 {
1449 normal_path = decode_env_path ("", normal);
1450
1451 Vload_path = normal_path;
1452 }
1453
1454 /* Warn if dirs in the *standard* path don't exist. */
1455 for (; !NILP (normal_path); normal_path = XCONS (normal_path)->cdr)
1456 {
1457 Lisp_Object dirfile;
1458 dirfile = Fcar (normal_path);
1459 if (!NILP (dirfile))
1460 {
1461 dirfile = Fdirectory_file_name (dirfile);
1462 if (access (XSTRING (dirfile)->data, 0) < 0)
1463 printf ("Warning: lisp library (%s) does not exist.\n",
1464 XSTRING (Fcar (normal_path))->data);
1465 }
1466 }
1467
1468 if (egetenv ("EMACSLOADPATH"))
1469 Vload_path = decode_env_path ("EMACSLOADPATH", normal);
1470 #ifndef CANNOT_DUMP
1471 if (!NILP (Vpurify_flag))
1472 Vload_path = Fcons (build_string ("../lisp"), Vload_path);
1473 #endif
1474
1475 Vvalues = Qnil;
1476
1477 load_in_progress = 0;
1478 }
1479
1480 void
1481 syms_of_lread ()
1482 {
1483 defsubr (&Sread);
1484 defsubr (&Sread_from_string);
1485 defsubr (&Sintern);
1486 defsubr (&Sintern_soft);
1487 defsubr (&Sload);
1488 defsubr (&Seval_current_buffer);
1489 defsubr (&Seval_region);
1490 defsubr (&Sread_char);
1491 defsubr (&Sread_char_exclusive);
1492 #ifdef HAVE_X_WINDOWS
1493 defsubr (&Sread_event);
1494 #endif /* HAVE_X_WINDOWS */
1495 defsubr (&Sget_file_char);
1496 defsubr (&Smapatoms);
1497
1498 DEFVAR_LISP ("obarray", &Vobarray,
1499 "Symbol table for use by `intern' and `read'.\n\
1500 It is a vector whose length ought to be prime for best results.\n\
1501 The vector's contents don't make sense if examined from Lisp programs;\n\
1502 to find all the symbols in an obarray, use `mapatoms'.");
1503
1504 DEFVAR_LISP ("values", &Vvalues,
1505 "List of values of all expressions which were read, evaluated and printed.\n\
1506 Order is reverse chronological.");
1507
1508 DEFVAR_LISP ("standard-input", &Vstandard_input,
1509 "Stream for read to get input from.\n\
1510 See documentation of `read' for possible values.");
1511 Vstandard_input = Qt;
1512
1513 DEFVAR_LISP ("load-path", &Vload_path,
1514 "*List of directories to search for files to load.\n\
1515 Each element is a string (directory name) or nil (try default directory).\n\
1516 Initialized based on EMACSLOADPATH environment variable, if any,\n\
1517 otherwise to default specified in by file `paths.h' when Emacs was built.");
1518
1519 DEFVAR_BOOL ("load-in-progress", &load_in_progress,
1520 "Non-nil iff inside of `load'.");
1521
1522 DEFVAR_LISP ("after-load-alist", &Vafter_load_alist,
1523 "An alist of expressions to be evalled when particular files are loaded.\n\
1524 Each element looks like (FILENAME FORMS...).\n\
1525 When `load' is run and the file-name argument is FILENAME,\n\
1526 the FORMS in the corresponding element are executed at the end of loading.\n\n\
1527 FILENAME must match exactly! Normally FILENAME is the name of a library,\n\
1528 with no directory specified, since that is how `load' is normally called.\n\
1529 An error in FORMS does not undo the load,\n\
1530 but does prevent execution of the rest of the FORMS.");
1531 Vafter_load_alist = Qnil;
1532
1533 Qstandard_input = intern ("standard-input");
1534 staticpro (&Qstandard_input);
1535
1536 Qread_char = intern ("read-char");
1537 staticpro (&Qread_char);
1538
1539 Qget_file_char = intern ("get-file-char");
1540 staticpro (&Qget_file_char);
1541 }