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