Merge from emacs-23
[emacs.git] / src / lread.c
blob945808c6e5aa1250f9ecae4c689af99d41ab97db
1 /* Lisp parsing and input streams.
3 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994, 1995, 1997,
4 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
5 2009, 2010 Free Software Foundation, Inc.
7 This file is part of GNU Emacs.
9 GNU Emacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 GNU Emacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
23 #include <config.h>
24 #include <stdio.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <sys/file.h>
28 #include <errno.h>
29 #include <setjmp.h>
30 #include "lisp.h"
31 #include "intervals.h"
32 #include "buffer.h"
33 #include "character.h"
34 #include "charset.h"
35 #include "coding.h"
36 #include <epaths.h>
37 #include "commands.h"
38 #include "keyboard.h"
39 #include "frame.h"
40 #include "termhooks.h"
41 #include "coding.h"
42 #include "blockinput.h"
44 #ifdef MSDOS
45 #include "msdos.h"
46 #endif
48 #ifdef HAVE_UNISTD_H
49 #include <unistd.h>
50 #endif
52 #include <math.h>
54 #ifdef HAVE_SETLOCALE
55 #include <locale.h>
56 #endif /* HAVE_SETLOCALE */
58 #include <fcntl.h>
60 #ifdef HAVE_FSEEKO
61 #define file_offset off_t
62 #define file_tell ftello
63 #else
64 #define file_offset long
65 #define file_tell ftell
66 #endif
68 /* hash table read constants */
69 Lisp_Object Qhash_table, Qdata;
70 Lisp_Object Qtest, Qsize;
71 Lisp_Object Qweakness;
72 Lisp_Object Qrehash_size;
73 Lisp_Object Qrehash_threshold;
75 Lisp_Object Qread_char, Qget_file_char, Qstandard_input, Qcurrent_load_list;
76 Lisp_Object Qvariable_documentation, Vvalues, Vstandard_input, Vafter_load_alist;
77 Lisp_Object Qascii_character, Qload, Qload_file_name;
78 Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction;
79 Lisp_Object Qinhibit_file_name_operation;
80 Lisp_Object Qeval_buffer_list, Veval_buffer_list;
81 Lisp_Object Qfile_truename, Qdo_after_load_evaluation; /* ACM 2006/5/16 */
83 /* Used instead of Qget_file_char while loading *.elc files compiled
84 by Emacs 21 or older. */
85 static Lisp_Object Qget_emacs_mule_file_char;
87 static Lisp_Object Qload_force_doc_strings;
89 /* non-zero if inside `load' */
90 int load_in_progress;
91 static Lisp_Object Qload_in_progress;
93 /* Directory in which the sources were found. */
94 Lisp_Object Vsource_directory;
96 /* Search path and suffixes for files to be loaded. */
97 Lisp_Object Vload_path, Vload_suffixes, Vload_file_rep_suffixes;
99 /* File name of user's init file. */
100 Lisp_Object Vuser_init_file;
102 /* This is the user-visible association list that maps features to
103 lists of defs in their load files. */
104 Lisp_Object Vload_history;
106 /* This is used to build the load history. */
107 Lisp_Object Vcurrent_load_list;
109 /* List of files that were preloaded. */
110 Lisp_Object Vpreloaded_file_list;
112 /* Name of file actually being read by `load'. */
113 Lisp_Object Vload_file_name;
115 /* Function to use for reading, in `load' and friends. */
116 Lisp_Object Vload_read_function;
118 /* Non-nil means read recursive structures using #n= and #n# syntax. */
119 Lisp_Object Vread_circle;
121 /* The association list of objects read with the #n=object form.
122 Each member of the list has the form (n . object), and is used to
123 look up the object for the corresponding #n# construct.
124 It must be set to nil before all top-level calls to read0. */
125 Lisp_Object read_objects;
127 /* Nonzero means load should forcibly load all dynamic doc strings. */
128 static int load_force_doc_strings;
130 /* Nonzero means read should convert strings to unibyte. */
131 static int load_convert_to_unibyte;
133 /* Nonzero means READCHAR should read bytes one by one (not character)
134 when READCHARFUN is Qget_file_char or Qget_emacs_mule_file_char.
135 This is set to 1 by read1 temporarily while handling #@NUMBER. */
136 static int load_each_byte;
138 /* Function to use for loading an Emacs Lisp source file (not
139 compiled) instead of readevalloop. */
140 Lisp_Object Vload_source_file_function;
142 /* List of all DEFVAR_BOOL variables. Used by the byte optimizer. */
143 Lisp_Object Vbyte_boolean_vars;
145 /* Whether or not to add a `read-positions' property to symbols
146 read. */
147 Lisp_Object Vread_with_symbol_positions;
149 /* List of (SYMBOL . POSITION) accumulated so far. */
150 Lisp_Object Vread_symbol_positions_list;
152 /* List of descriptors now open for Fload. */
153 static Lisp_Object load_descriptor_list;
155 /* File for get_file_char to read from. Use by load. */
156 static FILE *instream;
158 /* When nonzero, read conses in pure space */
159 static int read_pure;
161 /* For use within read-from-string (this reader is non-reentrant!!) */
162 static EMACS_INT read_from_string_index;
163 static EMACS_INT read_from_string_index_byte;
164 static EMACS_INT read_from_string_limit;
166 /* Number of characters read in the current call to Fread or
167 Fread_from_string. */
168 static EMACS_INT readchar_count;
170 /* This contains the last string skipped with #@. */
171 static char *saved_doc_string;
172 /* Length of buffer allocated in saved_doc_string. */
173 static int saved_doc_string_size;
174 /* Length of actual data in saved_doc_string. */
175 static int saved_doc_string_length;
176 /* This is the file position that string came from. */
177 static file_offset saved_doc_string_position;
179 /* This contains the previous string skipped with #@.
180 We copy it from saved_doc_string when a new string
181 is put in saved_doc_string. */
182 static char *prev_saved_doc_string;
183 /* Length of buffer allocated in prev_saved_doc_string. */
184 static int prev_saved_doc_string_size;
185 /* Length of actual data in prev_saved_doc_string. */
186 static int prev_saved_doc_string_length;
187 /* This is the file position that string came from. */
188 static file_offset prev_saved_doc_string_position;
190 /* Nonzero means inside a new-style backquote
191 with no surrounding parentheses.
192 Fread initializes this to zero, so we need not specbind it
193 or worry about what happens to it when there is an error. */
194 static int new_backquote_flag;
195 static Lisp_Object Vold_style_backquotes, Qold_style_backquotes;
197 /* A list of file names for files being loaded in Fload. Used to
198 check for recursive loads. */
200 static Lisp_Object Vloads_in_progress;
202 /* Non-zero means load dangerous compiled Lisp files. */
204 int load_dangerous_libraries;
206 /* Non-zero means force printing messages when loading Lisp files. */
208 int force_load_messages;
210 /* A regular expression used to detect files compiled with Emacs. */
212 static Lisp_Object Vbytecomp_version_regexp;
214 static int read_emacs_mule_char (int, int (*) (int, Lisp_Object),
215 Lisp_Object);
217 static void readevalloop (Lisp_Object, FILE*, Lisp_Object,
218 Lisp_Object (*) (Lisp_Object), int,
219 Lisp_Object, Lisp_Object,
220 Lisp_Object, Lisp_Object);
221 static Lisp_Object load_unwind (Lisp_Object);
222 static Lisp_Object load_descriptor_unwind (Lisp_Object);
224 static void invalid_syntax (const char *, int) NO_RETURN;
225 static void end_of_file_error (void) NO_RETURN;
228 /* Functions that read one byte from the current source READCHARFUN
229 or unreads one byte. If the integer argument C is -1, it returns
230 one read byte, or -1 when there's no more byte in the source. If C
231 is 0 or positive, it unreads C, and the return value is not
232 interesting. */
234 static int readbyte_for_lambda (int, Lisp_Object);
235 static int readbyte_from_file (int, Lisp_Object);
236 static int readbyte_from_string (int, Lisp_Object);
238 /* Handle unreading and rereading of characters.
239 Write READCHAR to read a character,
240 UNREAD(c) to unread c to be read again.
242 These macros correctly read/unread multibyte characters. */
244 #define READCHAR readchar (readcharfun, NULL)
245 #define UNREAD(c) unreadchar (readcharfun, c)
247 /* Same as READCHAR but set *MULTIBYTE to the multibyteness of the source. */
248 #define READCHAR_REPORT_MULTIBYTE(multibyte) readchar (readcharfun, multibyte)
250 /* When READCHARFUN is Qget_file_char, Qget_emacs_mule_file_char,
251 Qlambda, or a cons, we use this to keep an unread character because
252 a file stream can't handle multibyte-char unreading. The value -1
253 means that there's no unread character. */
254 static int unread_char;
256 static int
257 readchar (Lisp_Object readcharfun, int *multibyte)
259 Lisp_Object tem;
260 register int c;
261 int (*readbyte) (int, Lisp_Object);
262 unsigned char buf[MAX_MULTIBYTE_LENGTH];
263 int i, len;
264 int emacs_mule_encoding = 0;
266 if (multibyte)
267 *multibyte = 0;
269 readchar_count++;
271 if (BUFFERP (readcharfun))
273 register struct buffer *inbuffer = XBUFFER (readcharfun);
275 EMACS_INT pt_byte = BUF_PT_BYTE (inbuffer);
277 if (pt_byte >= BUF_ZV_BYTE (inbuffer))
278 return -1;
280 if (! NILP (inbuffer->enable_multibyte_characters))
282 /* Fetch the character code from the buffer. */
283 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, pt_byte);
284 BUF_INC_POS (inbuffer, pt_byte);
285 c = STRING_CHAR (p);
286 if (multibyte)
287 *multibyte = 1;
289 else
291 c = BUF_FETCH_BYTE (inbuffer, pt_byte);
292 if (! ASCII_BYTE_P (c))
293 c = BYTE8_TO_CHAR (c);
294 pt_byte++;
296 SET_BUF_PT_BOTH (inbuffer, BUF_PT (inbuffer) + 1, pt_byte);
298 return c;
300 if (MARKERP (readcharfun))
302 register struct buffer *inbuffer = XMARKER (readcharfun)->buffer;
304 EMACS_INT bytepos = marker_byte_position (readcharfun);
306 if (bytepos >= BUF_ZV_BYTE (inbuffer))
307 return -1;
309 if (! NILP (inbuffer->enable_multibyte_characters))
311 /* Fetch the character code from the buffer. */
312 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, bytepos);
313 BUF_INC_POS (inbuffer, bytepos);
314 c = STRING_CHAR (p);
315 if (multibyte)
316 *multibyte = 1;
318 else
320 c = BUF_FETCH_BYTE (inbuffer, bytepos);
321 if (! ASCII_BYTE_P (c))
322 c = BYTE8_TO_CHAR (c);
323 bytepos++;
326 XMARKER (readcharfun)->bytepos = bytepos;
327 XMARKER (readcharfun)->charpos++;
329 return c;
332 if (EQ (readcharfun, Qlambda))
334 readbyte = readbyte_for_lambda;
335 goto read_multibyte;
338 if (EQ (readcharfun, Qget_file_char))
340 readbyte = readbyte_from_file;
341 goto read_multibyte;
344 if (STRINGP (readcharfun))
346 if (read_from_string_index >= read_from_string_limit)
347 c = -1;
348 else if (STRING_MULTIBYTE (readcharfun))
350 if (multibyte)
351 *multibyte = 1;
352 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, readcharfun,
353 read_from_string_index,
354 read_from_string_index_byte);
356 else
358 c = SREF (readcharfun, read_from_string_index_byte);
359 read_from_string_index++;
360 read_from_string_index_byte++;
362 return c;
365 if (CONSP (readcharfun))
367 /* This is the case that read_vector is reading from a unibyte
368 string that contains a byte sequence previously skipped
369 because of #@NUMBER. The car part of readcharfun is that
370 string, and the cdr part is a value of readcharfun given to
371 read_vector. */
372 readbyte = readbyte_from_string;
373 if (EQ (XCDR (readcharfun), Qget_emacs_mule_file_char))
374 emacs_mule_encoding = 1;
375 goto read_multibyte;
378 if (EQ (readcharfun, Qget_emacs_mule_file_char))
380 readbyte = readbyte_from_file;
381 emacs_mule_encoding = 1;
382 goto read_multibyte;
385 tem = call0 (readcharfun);
387 if (NILP (tem))
388 return -1;
389 return XINT (tem);
391 read_multibyte:
392 if (unread_char >= 0)
394 c = unread_char;
395 unread_char = -1;
396 return c;
398 c = (*readbyte) (-1, readcharfun);
399 if (c < 0 || load_each_byte)
400 return c;
401 if (multibyte)
402 *multibyte = 1;
403 if (ASCII_BYTE_P (c))
404 return c;
405 if (emacs_mule_encoding)
406 return read_emacs_mule_char (c, readbyte, readcharfun);
407 i = 0;
408 buf[i++] = c;
409 len = BYTES_BY_CHAR_HEAD (c);
410 while (i < len)
412 c = (*readbyte) (-1, readcharfun);
413 if (c < 0 || ! TRAILING_CODE_P (c))
415 while (--i > 1)
416 (*readbyte) (buf[i], readcharfun);
417 return BYTE8_TO_CHAR (buf[0]);
419 buf[i++] = c;
421 return STRING_CHAR (buf);
424 /* Unread the character C in the way appropriate for the stream READCHARFUN.
425 If the stream is a user function, call it with the char as argument. */
427 static void
428 unreadchar (Lisp_Object readcharfun, int c)
430 readchar_count--;
431 if (c == -1)
432 /* Don't back up the pointer if we're unreading the end-of-input mark,
433 since readchar didn't advance it when we read it. */
435 else if (BUFFERP (readcharfun))
437 struct buffer *b = XBUFFER (readcharfun);
438 EMACS_INT bytepos = BUF_PT_BYTE (b);
440 BUF_PT (b)--;
441 if (! NILP (b->enable_multibyte_characters))
442 BUF_DEC_POS (b, bytepos);
443 else
444 bytepos--;
446 BUF_PT_BYTE (b) = bytepos;
448 else if (MARKERP (readcharfun))
450 struct buffer *b = XMARKER (readcharfun)->buffer;
451 EMACS_INT bytepos = XMARKER (readcharfun)->bytepos;
453 XMARKER (readcharfun)->charpos--;
454 if (! NILP (b->enable_multibyte_characters))
455 BUF_DEC_POS (b, bytepos);
456 else
457 bytepos--;
459 XMARKER (readcharfun)->bytepos = bytepos;
461 else if (STRINGP (readcharfun))
463 read_from_string_index--;
464 read_from_string_index_byte
465 = string_char_to_byte (readcharfun, read_from_string_index);
467 else if (CONSP (readcharfun))
469 unread_char = c;
471 else if (EQ (readcharfun, Qlambda))
473 unread_char = c;
475 else if (EQ (readcharfun, Qget_file_char)
476 || EQ (readcharfun, Qget_emacs_mule_file_char))
478 if (load_each_byte)
480 BLOCK_INPUT;
481 ungetc (c, instream);
482 UNBLOCK_INPUT;
484 else
485 unread_char = c;
487 else
488 call1 (readcharfun, make_number (c));
491 static int
492 readbyte_for_lambda (int c, Lisp_Object readcharfun)
494 return read_bytecode_char (c >= 0);
498 static int
499 readbyte_from_file (int c, Lisp_Object readcharfun)
501 if (c >= 0)
503 BLOCK_INPUT;
504 ungetc (c, instream);
505 UNBLOCK_INPUT;
506 return 0;
509 BLOCK_INPUT;
510 c = getc (instream);
512 #ifdef EINTR
513 /* Interrupted reads have been observed while reading over the network */
514 while (c == EOF && ferror (instream) && errno == EINTR)
516 UNBLOCK_INPUT;
517 QUIT;
518 BLOCK_INPUT;
519 clearerr (instream);
520 c = getc (instream);
522 #endif
524 UNBLOCK_INPUT;
526 return (c == EOF ? -1 : c);
529 static int
530 readbyte_from_string (int c, Lisp_Object readcharfun)
532 Lisp_Object string = XCAR (readcharfun);
534 if (c >= 0)
536 read_from_string_index--;
537 read_from_string_index_byte
538 = string_char_to_byte (string, read_from_string_index);
541 if (read_from_string_index >= read_from_string_limit)
542 c = -1;
543 else
544 FETCH_STRING_CHAR_ADVANCE (c, string,
545 read_from_string_index,
546 read_from_string_index_byte);
547 return c;
551 /* Read one non-ASCII character from INSTREAM. The character is
552 encoded in `emacs-mule' and the first byte is already read in
553 C. */
555 extern char emacs_mule_bytes[256];
557 static int
558 read_emacs_mule_char (int c, int (*readbyte) (int, Lisp_Object), Lisp_Object readcharfun)
560 /* Emacs-mule coding uses at most 4-byte for one character. */
561 unsigned char buf[4];
562 int len = emacs_mule_bytes[c];
563 struct charset *charset;
564 int i;
565 unsigned code;
567 if (len == 1)
568 /* C is not a valid leading-code of `emacs-mule'. */
569 return BYTE8_TO_CHAR (c);
571 i = 0;
572 buf[i++] = c;
573 while (i < len)
575 c = (*readbyte) (-1, readcharfun);
576 if (c < 0xA0)
578 while (--i > 1)
579 (*readbyte) (buf[i], readcharfun);
580 return BYTE8_TO_CHAR (buf[0]);
582 buf[i++] = c;
585 if (len == 2)
587 charset = emacs_mule_charset[buf[0]];
588 code = buf[1] & 0x7F;
590 else if (len == 3)
592 if (buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_11
593 || buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_12)
595 charset = emacs_mule_charset[buf[1]];
596 code = buf[2] & 0x7F;
598 else
600 charset = emacs_mule_charset[buf[0]];
601 code = ((buf[1] << 8) | buf[2]) & 0x7F7F;
604 else
606 charset = emacs_mule_charset[buf[1]];
607 code = ((buf[2] << 8) | buf[3]) & 0x7F7F;
609 c = DECODE_CHAR (charset, code);
610 if (c < 0)
611 Fsignal (Qinvalid_read_syntax,
612 Fcons (build_string ("invalid multibyte form"), Qnil));
613 return c;
617 static Lisp_Object read_internal_start (Lisp_Object, Lisp_Object,
618 Lisp_Object);
619 static Lisp_Object read0 (Lisp_Object);
620 static Lisp_Object read1 (Lisp_Object, int *, int);
622 static Lisp_Object read_list (int, Lisp_Object);
623 static Lisp_Object read_vector (Lisp_Object, int);
625 static Lisp_Object substitute_object_recurse (Lisp_Object, Lisp_Object,
626 Lisp_Object);
627 static void substitute_object_in_subtree (Lisp_Object,
628 Lisp_Object);
629 static void substitute_in_interval (INTERVAL, Lisp_Object);
632 /* Get a character from the tty. */
634 /* Read input events until we get one that's acceptable for our purposes.
636 If NO_SWITCH_FRAME is non-zero, switch-frame events are stashed
637 until we get a character we like, and then stuffed into
638 unread_switch_frame.
640 If ASCII_REQUIRED is non-zero, we check function key events to see
641 if the unmodified version of the symbol has a Qascii_character
642 property, and use that character, if present.
644 If ERROR_NONASCII is non-zero, we signal an error if the input we
645 get isn't an ASCII character with modifiers. If it's zero but
646 ASCII_REQUIRED is non-zero, we just re-read until we get an ASCII
647 character.
649 If INPUT_METHOD is nonzero, we invoke the current input method
650 if the character warrants that.
652 If SECONDS is a number, we wait that many seconds for input, and
653 return Qnil if no input arrives within that time. */
655 Lisp_Object
656 read_filtered_event (int no_switch_frame, int ascii_required,
657 int error_nonascii, int input_method, Lisp_Object seconds)
659 Lisp_Object val, delayed_switch_frame;
660 EMACS_TIME end_time;
662 #ifdef HAVE_WINDOW_SYSTEM
663 if (display_hourglass_p)
664 cancel_hourglass ();
665 #endif
667 delayed_switch_frame = Qnil;
669 /* Compute timeout. */
670 if (NUMBERP (seconds))
672 EMACS_TIME wait_time;
673 int sec, usec;
674 double duration = extract_float (seconds);
676 sec = (int) duration;
677 usec = (duration - sec) * 1000000;
678 EMACS_GET_TIME (end_time);
679 EMACS_SET_SECS_USECS (wait_time, sec, usec);
680 EMACS_ADD_TIME (end_time, end_time, wait_time);
683 /* Read until we get an acceptable event. */
684 retry:
686 val = read_char (0, 0, 0, (input_method ? Qnil : Qt), 0,
687 NUMBERP (seconds) ? &end_time : NULL);
688 while (INTEGERP (val) && XINT (val) == -2); /* wrong_kboard_jmpbuf */
690 if (BUFFERP (val))
691 goto retry;
693 /* switch-frame events are put off until after the next ASCII
694 character. This is better than signaling an error just because
695 the last characters were typed to a separate minibuffer frame,
696 for example. Eventually, some code which can deal with
697 switch-frame events will read it and process it. */
698 if (no_switch_frame
699 && EVENT_HAS_PARAMETERS (val)
700 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (val)), Qswitch_frame))
702 delayed_switch_frame = val;
703 goto retry;
706 if (ascii_required && !(NUMBERP (seconds) && NILP (val)))
708 /* Convert certain symbols to their ASCII equivalents. */
709 if (SYMBOLP (val))
711 Lisp_Object tem, tem1;
712 tem = Fget (val, Qevent_symbol_element_mask);
713 if (!NILP (tem))
715 tem1 = Fget (Fcar (tem), Qascii_character);
716 /* Merge this symbol's modifier bits
717 with the ASCII equivalent of its basic code. */
718 if (!NILP (tem1))
719 XSETFASTINT (val, XINT (tem1) | XINT (Fcar (Fcdr (tem))));
723 /* If we don't have a character now, deal with it appropriately. */
724 if (!INTEGERP (val))
726 if (error_nonascii)
728 Vunread_command_events = Fcons (val, Qnil);
729 error ("Non-character input-event");
731 else
732 goto retry;
736 if (! NILP (delayed_switch_frame))
737 unread_switch_frame = delayed_switch_frame;
739 #if 0
741 #ifdef HAVE_WINDOW_SYSTEM
742 if (display_hourglass_p)
743 start_hourglass ();
744 #endif
746 #endif
748 return val;
751 DEFUN ("read-char", Fread_char, Sread_char, 0, 3, 0,
752 doc: /* Read a character from the command input (keyboard or macro).
753 It is returned as a number.
754 If the character has modifiers, they are resolved and reflected to the
755 character code if possible (e.g. C-SPC -> 0).
757 If the user generates an event which is not a character (i.e. a mouse
758 click or function key event), `read-char' signals an error. As an
759 exception, switch-frame events are put off until non-character events
760 can be read.
761 If you want to read non-character events, or ignore them, call
762 `read-event' or `read-char-exclusive' instead.
764 If the optional argument PROMPT is non-nil, display that as a prompt.
765 If the optional argument INHERIT-INPUT-METHOD is non-nil and some
766 input method is turned on in the current buffer, that input method
767 is used for reading a character.
768 If the optional argument SECONDS is non-nil, it should be a number
769 specifying the maximum number of seconds to wait for input. If no
770 input arrives in that time, return nil. SECONDS may be a
771 floating-point value. */)
772 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
774 Lisp_Object val;
776 if (! NILP (prompt))
777 message_with_string ("%s", prompt, 0);
778 val = read_filtered_event (1, 1, 1, ! NILP (inherit_input_method), seconds);
780 return (NILP (val) ? Qnil
781 : make_number (char_resolve_modifier_mask (XINT (val))));
784 DEFUN ("read-event", Fread_event, Sread_event, 0, 3, 0,
785 doc: /* Read an event object from the input stream.
786 If the optional argument PROMPT is non-nil, display that as a prompt.
787 If the optional argument INHERIT-INPUT-METHOD is non-nil and some
788 input method is turned on in the current buffer, that input method
789 is used for reading a character.
790 If the optional argument SECONDS is non-nil, it should be a number
791 specifying the maximum number of seconds to wait for input. If no
792 input arrives in that time, return nil. SECONDS may be a
793 floating-point value. */)
794 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
796 if (! NILP (prompt))
797 message_with_string ("%s", prompt, 0);
798 return read_filtered_event (0, 0, 0, ! NILP (inherit_input_method), seconds);
801 DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 3, 0,
802 doc: /* Read a character from the command input (keyboard or macro).
803 It is returned as a number. Non-character events are ignored.
804 If the character has modifiers, they are resolved and reflected to the
805 character code if possible (e.g. C-SPC -> 0).
807 If the optional argument PROMPT is non-nil, display that as a prompt.
808 If the optional argument INHERIT-INPUT-METHOD is non-nil and some
809 input method is turned on in the current buffer, that input method
810 is used for reading a character.
811 If the optional argument SECONDS is non-nil, it should be a number
812 specifying the maximum number of seconds to wait for input. If no
813 input arrives in that time, return nil. SECONDS may be a
814 floating-point value. */)
815 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
817 Lisp_Object val;
819 if (! NILP (prompt))
820 message_with_string ("%s", prompt, 0);
822 val = read_filtered_event (1, 1, 0, ! NILP (inherit_input_method), seconds);
824 return (NILP (val) ? Qnil
825 : make_number (char_resolve_modifier_mask (XINT (val))));
828 DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,
829 doc: /* Don't use this yourself. */)
830 (void)
832 register Lisp_Object val;
833 BLOCK_INPUT;
834 XSETINT (val, getc (instream));
835 UNBLOCK_INPUT;
836 return val;
841 /* Value is a version number of byte compiled code if the file
842 associated with file descriptor FD is a compiled Lisp file that's
843 safe to load. Only files compiled with Emacs are safe to load.
844 Files compiled with XEmacs can lead to a crash in Fbyte_code
845 because of an incompatible change in the byte compiler. */
847 static int
848 safe_to_load_p (int fd)
850 char buf[512];
851 int nbytes, i;
852 int safe_p = 1;
853 int version = 1;
855 /* Read the first few bytes from the file, and look for a line
856 specifying the byte compiler version used. */
857 nbytes = emacs_read (fd, buf, sizeof buf - 1);
858 if (nbytes > 0)
860 buf[nbytes] = '\0';
862 /* Skip to the next newline, skipping over the initial `ELC'
863 with NUL bytes following it, but note the version. */
864 for (i = 0; i < nbytes && buf[i] != '\n'; ++i)
865 if (i == 4)
866 version = buf[i];
868 if (i == nbytes
869 || fast_c_string_match_ignore_case (Vbytecomp_version_regexp,
870 buf + i) < 0)
871 safe_p = 0;
873 if (safe_p)
874 safe_p = version;
876 lseek (fd, 0, SEEK_SET);
877 return safe_p;
881 /* Callback for record_unwind_protect. Restore the old load list OLD,
882 after loading a file successfully. */
884 static Lisp_Object
885 record_load_unwind (Lisp_Object old)
887 return Vloads_in_progress = old;
890 /* This handler function is used via internal_condition_case_1. */
892 static Lisp_Object
893 load_error_handler (Lisp_Object data)
895 return Qnil;
898 static Lisp_Object
899 load_warn_old_style_backquotes (Lisp_Object file)
901 if (!NILP (Vold_style_backquotes))
903 Lisp_Object args[2];
904 args[0] = build_string ("Loading `%s': old-style backquotes detected!");
905 args[1] = file;
906 Fmessage (2, args);
908 return Qnil;
911 DEFUN ("get-load-suffixes", Fget_load_suffixes, Sget_load_suffixes, 0, 0, 0,
912 doc: /* Return the suffixes that `load' should try if a suffix is \
913 required.
914 This uses the variables `load-suffixes' and `load-file-rep-suffixes'. */)
915 (void)
917 Lisp_Object lst = Qnil, suffixes = Vload_suffixes, suffix, ext;
918 while (CONSP (suffixes))
920 Lisp_Object exts = Vload_file_rep_suffixes;
921 suffix = XCAR (suffixes);
922 suffixes = XCDR (suffixes);
923 while (CONSP (exts))
925 ext = XCAR (exts);
926 exts = XCDR (exts);
927 lst = Fcons (concat2 (suffix, ext), lst);
930 return Fnreverse (lst);
933 DEFUN ("load", Fload, Sload, 1, 5, 0,
934 doc: /* Execute a file of Lisp code named FILE.
935 First try FILE with `.elc' appended, then try with `.el',
936 then try FILE unmodified (the exact suffixes in the exact order are
937 determined by `load-suffixes'). Environment variable references in
938 FILE are replaced with their values by calling `substitute-in-file-name'.
939 This function searches the directories in `load-path'.
941 If optional second arg NOERROR is non-nil,
942 report no error if FILE doesn't exist.
943 Print messages at start and end of loading unless
944 optional third arg NOMESSAGE is non-nil (but `force-load-messages'
945 overrides that).
946 If optional fourth arg NOSUFFIX is non-nil, don't try adding
947 suffixes `.elc' or `.el' to the specified name FILE.
948 If optional fifth arg MUST-SUFFIX is non-nil, insist on
949 the suffix `.elc' or `.el'; don't accept just FILE unless
950 it ends in one of those suffixes or includes a directory name.
952 If this function fails to find a file, it may look for different
953 representations of that file before trying another file.
954 It does so by adding the non-empty suffixes in `load-file-rep-suffixes'
955 to the file name. Emacs uses this feature mainly to find compressed
956 versions of files when Auto Compression mode is enabled.
958 The exact suffixes that this function tries out, in the exact order,
959 are given by the value of the variable `load-file-rep-suffixes' if
960 NOSUFFIX is non-nil and by the return value of the function
961 `get-load-suffixes' if MUST-SUFFIX is non-nil. If both NOSUFFIX and
962 MUST-SUFFIX are nil, this function first tries out the latter suffixes
963 and then the former.
965 Loading a file records its definitions, and its `provide' and
966 `require' calls, in an element of `load-history' whose
967 car is the file name loaded. See `load-history'.
969 While the file is in the process of being loaded, the variable
970 `load-in-progress' is non-nil and the variable `load-file-name'
971 is bound to the file's name.
973 Return t if the file exists and loads successfully. */)
974 (Lisp_Object file, Lisp_Object noerror, Lisp_Object nomessage, Lisp_Object nosuffix, Lisp_Object must_suffix)
976 register FILE *stream;
977 register int fd = -1;
978 int count = SPECPDL_INDEX ();
979 struct gcpro gcpro1, gcpro2, gcpro3;
980 Lisp_Object found, efound, hist_file_name;
981 /* 1 means we printed the ".el is newer" message. */
982 int newer = 0;
983 /* 1 means we are loading a compiled file. */
984 int compiled = 0;
985 Lisp_Object handler;
986 int safe_p = 1;
987 const char *fmode = "r";
988 Lisp_Object tmp[2];
989 int version;
991 #ifdef DOS_NT
992 fmode = "rt";
993 #endif /* DOS_NT */
995 CHECK_STRING (file);
997 /* If file name is magic, call the handler. */
998 /* This shouldn't be necessary any more now that `openp' handles it right.
999 handler = Ffind_file_name_handler (file, Qload);
1000 if (!NILP (handler))
1001 return call5 (handler, Qload, file, noerror, nomessage, nosuffix); */
1003 /* Do this after the handler to avoid
1004 the need to gcpro noerror, nomessage and nosuffix.
1005 (Below here, we care only whether they are nil or not.)
1006 The presence of this call is the result of a historical accident:
1007 it used to be in every file-operation and when it got removed
1008 everywhere, it accidentally stayed here. Since then, enough people
1009 supposedly have things like (load "$PROJECT/foo.el") in their .emacs
1010 that it seemed risky to remove. */
1011 if (! NILP (noerror))
1013 file = internal_condition_case_1 (Fsubstitute_in_file_name, file,
1014 Qt, load_error_handler);
1015 if (NILP (file))
1016 return Qnil;
1018 else
1019 file = Fsubstitute_in_file_name (file);
1022 /* Avoid weird lossage with null string as arg,
1023 since it would try to load a directory as a Lisp file */
1024 if (SCHARS (file) > 0)
1026 int size = SBYTES (file);
1028 found = Qnil;
1029 GCPRO2 (file, found);
1031 if (! NILP (must_suffix))
1033 /* Don't insist on adding a suffix if FILE already ends with one. */
1034 if (size > 3
1035 && !strcmp (SDATA (file) + size - 3, ".el"))
1036 must_suffix = Qnil;
1037 else if (size > 4
1038 && !strcmp (SDATA (file) + size - 4, ".elc"))
1039 must_suffix = Qnil;
1040 /* Don't insist on adding a suffix
1041 if the argument includes a directory name. */
1042 else if (! NILP (Ffile_name_directory (file)))
1043 must_suffix = Qnil;
1046 fd = openp (Vload_path, file,
1047 (!NILP (nosuffix) ? Qnil
1048 : !NILP (must_suffix) ? Fget_load_suffixes ()
1049 : Fappend (2, (tmp[0] = Fget_load_suffixes (),
1050 tmp[1] = Vload_file_rep_suffixes,
1051 tmp))),
1052 &found, Qnil);
1053 UNGCPRO;
1056 if (fd == -1)
1058 if (NILP (noerror))
1059 xsignal2 (Qfile_error, build_string ("Cannot open load file"), file);
1060 return Qnil;
1063 /* Tell startup.el whether or not we found the user's init file. */
1064 if (EQ (Qt, Vuser_init_file))
1065 Vuser_init_file = found;
1067 /* If FD is -2, that means openp found a magic file. */
1068 if (fd == -2)
1070 if (NILP (Fequal (found, file)))
1071 /* If FOUND is a different file name from FILE,
1072 find its handler even if we have already inhibited
1073 the `load' operation on FILE. */
1074 handler = Ffind_file_name_handler (found, Qt);
1075 else
1076 handler = Ffind_file_name_handler (found, Qload);
1077 if (! NILP (handler))
1078 return call5 (handler, Qload, found, noerror, nomessage, Qt);
1081 /* Check if we're stuck in a recursive load cycle.
1083 2000-09-21: It's not possible to just check for the file loaded
1084 being a member of Vloads_in_progress. This fails because of the
1085 way the byte compiler currently works; `provide's are not
1086 evaluated, see font-lock.el/jit-lock.el as an example. This
1087 leads to a certain amount of ``normal'' recursion.
1089 Also, just loading a file recursively is not always an error in
1090 the general case; the second load may do something different. */
1092 int count = 0;
1093 Lisp_Object tem;
1094 for (tem = Vloads_in_progress; CONSP (tem); tem = XCDR (tem))
1095 if (!NILP (Fequal (found, XCAR (tem))) && (++count > 3))
1097 if (fd >= 0)
1098 emacs_close (fd);
1099 signal_error ("Recursive load", Fcons (found, Vloads_in_progress));
1101 record_unwind_protect (record_load_unwind, Vloads_in_progress);
1102 Vloads_in_progress = Fcons (found, Vloads_in_progress);
1105 /* Get the name for load-history. */
1106 hist_file_name = (! NILP (Vpurify_flag)
1107 ? Fconcat (2, (tmp[0] = Ffile_name_directory (file),
1108 tmp[1] = Ffile_name_nondirectory (found),
1109 tmp))
1110 : found) ;
1112 version = -1;
1114 /* Check for the presence of old-style quotes and warn about them. */
1115 specbind (Qold_style_backquotes, Qnil);
1116 record_unwind_protect (load_warn_old_style_backquotes, file);
1118 if (!memcmp (SDATA (found) + SBYTES (found) - 4, ".elc", 4)
1119 || (fd >= 0 && (version = safe_to_load_p (fd)) > 0))
1120 /* Load .elc files directly, but not when they are
1121 remote and have no handler! */
1123 if (fd != -2)
1125 struct stat s1, s2;
1126 int result;
1128 GCPRO3 (file, found, hist_file_name);
1130 if (version < 0
1131 && ! (version = safe_to_load_p (fd)))
1133 safe_p = 0;
1134 if (!load_dangerous_libraries)
1136 if (fd >= 0)
1137 emacs_close (fd);
1138 error ("File `%s' was not compiled in Emacs",
1139 SDATA (found));
1141 else if (!NILP (nomessage) && !force_load_messages)
1142 message_with_string ("File `%s' not compiled in Emacs", found, 1);
1145 compiled = 1;
1147 efound = ENCODE_FILE (found);
1149 #ifdef DOS_NT
1150 fmode = "rb";
1151 #endif /* DOS_NT */
1152 stat ((char *)SDATA (efound), &s1);
1153 SSET (efound, SBYTES (efound) - 1, 0);
1154 result = stat ((char *)SDATA (efound), &s2);
1155 SSET (efound, SBYTES (efound) - 1, 'c');
1157 if (result >= 0 && (unsigned) s1.st_mtime < (unsigned) s2.st_mtime)
1159 /* Make the progress messages mention that source is newer. */
1160 newer = 1;
1162 /* If we won't print another message, mention this anyway. */
1163 if (!NILP (nomessage) && !force_load_messages)
1165 Lisp_Object msg_file;
1166 msg_file = Fsubstring (found, make_number (0), make_number (-1));
1167 message_with_string ("Source file `%s' newer than byte-compiled file",
1168 msg_file, 1);
1171 UNGCPRO;
1174 else
1176 /* We are loading a source file (*.el). */
1177 if (!NILP (Vload_source_file_function))
1179 Lisp_Object val;
1181 if (fd >= 0)
1182 emacs_close (fd);
1183 val = call4 (Vload_source_file_function, found, hist_file_name,
1184 NILP (noerror) ? Qnil : Qt,
1185 (NILP (nomessage) || force_load_messages) ? Qnil : Qt);
1186 return unbind_to (count, val);
1190 GCPRO3 (file, found, hist_file_name);
1192 #ifdef WINDOWSNT
1193 emacs_close (fd);
1194 efound = ENCODE_FILE (found);
1195 stream = fopen ((char *) SDATA (efound), fmode);
1196 #else /* not WINDOWSNT */
1197 stream = fdopen (fd, fmode);
1198 #endif /* not WINDOWSNT */
1199 if (stream == 0)
1201 emacs_close (fd);
1202 error ("Failure to create stdio stream for %s", SDATA (file));
1205 if (! NILP (Vpurify_flag))
1206 Vpreloaded_file_list = Fcons (Fpurecopy(file), Vpreloaded_file_list);
1208 if (NILP (nomessage) || force_load_messages)
1210 if (!safe_p)
1211 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...",
1212 file, 1);
1213 else if (!compiled)
1214 message_with_string ("Loading %s (source)...", file, 1);
1215 else if (newer)
1216 message_with_string ("Loading %s (compiled; note, source file is newer)...",
1217 file, 1);
1218 else /* The typical case; compiled file newer than source file. */
1219 message_with_string ("Loading %s...", file, 1);
1222 record_unwind_protect (load_unwind, make_save_value (stream, 0));
1223 record_unwind_protect (load_descriptor_unwind, load_descriptor_list);
1224 specbind (Qload_file_name, found);
1225 specbind (Qinhibit_file_name_operation, Qnil);
1226 load_descriptor_list
1227 = Fcons (make_number (fileno (stream)), load_descriptor_list);
1228 specbind (Qload_in_progress, Qt);
1229 if (! version || version >= 22)
1230 readevalloop (Qget_file_char, stream, hist_file_name,
1231 Feval, 0, Qnil, Qnil, Qnil, Qnil);
1232 else
1234 /* We can't handle a file which was compiled with
1235 byte-compile-dynamic by older version of Emacs. */
1236 specbind (Qload_force_doc_strings, Qt);
1237 readevalloop (Qget_emacs_mule_file_char, stream, hist_file_name, Feval,
1238 0, Qnil, Qnil, Qnil, Qnil);
1240 unbind_to (count, Qnil);
1242 /* Run any eval-after-load forms for this file */
1243 if (!NILP (Ffboundp (Qdo_after_load_evaluation)))
1244 call1 (Qdo_after_load_evaluation, hist_file_name) ;
1246 UNGCPRO;
1248 xfree (saved_doc_string);
1249 saved_doc_string = 0;
1250 saved_doc_string_size = 0;
1252 xfree (prev_saved_doc_string);
1253 prev_saved_doc_string = 0;
1254 prev_saved_doc_string_size = 0;
1256 if (!noninteractive && (NILP (nomessage) || force_load_messages))
1258 if (!safe_p)
1259 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...done",
1260 file, 1);
1261 else if (!compiled)
1262 message_with_string ("Loading %s (source)...done", file, 1);
1263 else if (newer)
1264 message_with_string ("Loading %s (compiled; note, source file is newer)...done",
1265 file, 1);
1266 else /* The typical case; compiled file newer than source file. */
1267 message_with_string ("Loading %s...done", file, 1);
1270 return Qt;
1273 static Lisp_Object
1274 load_unwind (Lisp_Object arg) /* used as unwind-protect function in load */
1276 FILE *stream = (FILE *) XSAVE_VALUE (arg)->pointer;
1277 if (stream != NULL)
1279 BLOCK_INPUT;
1280 fclose (stream);
1281 UNBLOCK_INPUT;
1283 return Qnil;
1286 static Lisp_Object
1287 load_descriptor_unwind (Lisp_Object oldlist)
1289 load_descriptor_list = oldlist;
1290 return Qnil;
1293 /* Close all descriptors in use for Floads.
1294 This is used when starting a subprocess. */
1296 void
1297 close_load_descs (void)
1299 #ifndef WINDOWSNT
1300 Lisp_Object tail;
1301 for (tail = load_descriptor_list; CONSP (tail); tail = XCDR (tail))
1302 emacs_close (XFASTINT (XCAR (tail)));
1303 #endif
1306 static int
1307 complete_filename_p (Lisp_Object pathname)
1309 register const unsigned char *s = SDATA (pathname);
1310 return (IS_DIRECTORY_SEP (s[0])
1311 || (SCHARS (pathname) > 2
1312 && IS_DEVICE_SEP (s[1]) && IS_DIRECTORY_SEP (s[2])));
1315 DEFUN ("locate-file-internal", Flocate_file_internal, Slocate_file_internal, 2, 4, 0,
1316 doc: /* Search for FILENAME through PATH.
1317 Returns the file's name in absolute form, or nil if not found.
1318 If SUFFIXES is non-nil, it should be a list of suffixes to append to
1319 file name when searching.
1320 If non-nil, PREDICATE is used instead of `file-readable-p'.
1321 PREDICATE can also be an integer to pass to the access(2) function,
1322 in which case file-name-handlers are ignored. */)
1323 (Lisp_Object filename, Lisp_Object path, Lisp_Object suffixes, Lisp_Object predicate)
1325 Lisp_Object file;
1326 int fd = openp (path, filename, suffixes, &file, predicate);
1327 if (NILP (predicate) && fd > 0)
1328 close (fd);
1329 return file;
1333 /* Search for a file whose name is STR, looking in directories
1334 in the Lisp list PATH, and trying suffixes from SUFFIX.
1335 On success, returns a file descriptor. On failure, returns -1.
1337 SUFFIXES is a list of strings containing possible suffixes.
1338 The empty suffix is automatically added if the list is empty.
1340 PREDICATE non-nil means don't open the files,
1341 just look for one that satisfies the predicate. In this case,
1342 returns 1 on success. The predicate can be a lisp function or
1343 an integer to pass to `access' (in which case file-name-handlers
1344 are ignored).
1346 If STOREPTR is nonzero, it points to a slot where the name of
1347 the file actually found should be stored as a Lisp string.
1348 nil is stored there on failure.
1350 If the file we find is remote, return -2
1351 but store the found remote file name in *STOREPTR. */
1354 openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *storeptr, Lisp_Object predicate)
1356 register int fd;
1357 int fn_size = 100;
1358 char buf[100];
1359 register char *fn = buf;
1360 int absolute = 0;
1361 int want_size;
1362 Lisp_Object filename;
1363 struct stat st;
1364 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
1365 Lisp_Object string, tail, encoded_fn;
1366 int max_suffix_len = 0;
1368 CHECK_STRING (str);
1370 for (tail = suffixes; CONSP (tail); tail = XCDR (tail))
1372 CHECK_STRING_CAR (tail);
1373 max_suffix_len = max (max_suffix_len,
1374 SBYTES (XCAR (tail)));
1377 string = filename = encoded_fn = Qnil;
1378 GCPRO6 (str, string, filename, path, suffixes, encoded_fn);
1380 if (storeptr)
1381 *storeptr = Qnil;
1383 if (complete_filename_p (str))
1384 absolute = 1;
1386 for (; CONSP (path); path = XCDR (path))
1388 filename = Fexpand_file_name (str, XCAR (path));
1389 if (!complete_filename_p (filename))
1390 /* If there are non-absolute elts in PATH (eg ".") */
1391 /* Of course, this could conceivably lose if luser sets
1392 default-directory to be something non-absolute... */
1394 filename = Fexpand_file_name (filename, current_buffer->directory);
1395 if (!complete_filename_p (filename))
1396 /* Give up on this path element! */
1397 continue;
1400 /* Calculate maximum size of any filename made from
1401 this path element/specified file name and any possible suffix. */
1402 want_size = max_suffix_len + SBYTES (filename) + 1;
1403 if (fn_size < want_size)
1404 fn = (char *) alloca (fn_size = 100 + want_size);
1406 /* Loop over suffixes. */
1407 for (tail = NILP (suffixes) ? Fcons (empty_unibyte_string, Qnil) : suffixes;
1408 CONSP (tail); tail = XCDR (tail))
1410 int lsuffix = SBYTES (XCAR (tail));
1411 Lisp_Object handler;
1412 int exists;
1414 /* Concatenate path element/specified name with the suffix.
1415 If the directory starts with /:, remove that. */
1416 if (SCHARS (filename) > 2
1417 && SREF (filename, 0) == '/'
1418 && SREF (filename, 1) == ':')
1420 strncpy (fn, SDATA (filename) + 2,
1421 SBYTES (filename) - 2);
1422 fn[SBYTES (filename) - 2] = 0;
1424 else
1426 strncpy (fn, SDATA (filename),
1427 SBYTES (filename));
1428 fn[SBYTES (filename)] = 0;
1431 if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
1432 strncat (fn, SDATA (XCAR (tail)), lsuffix);
1434 /* Check that the file exists and is not a directory. */
1435 /* We used to only check for handlers on non-absolute file names:
1436 if (absolute)
1437 handler = Qnil;
1438 else
1439 handler = Ffind_file_name_handler (filename, Qfile_exists_p);
1440 It's not clear why that was the case and it breaks things like
1441 (load "/bar.el") where the file is actually "/bar.el.gz". */
1442 string = build_string (fn);
1443 handler = Ffind_file_name_handler (string, Qfile_exists_p);
1444 if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate))
1446 if (NILP (predicate))
1447 exists = !NILP (Ffile_readable_p (string));
1448 else
1449 exists = !NILP (call1 (predicate, string));
1450 if (exists && !NILP (Ffile_directory_p (string)))
1451 exists = 0;
1453 if (exists)
1455 /* We succeeded; return this descriptor and filename. */
1456 if (storeptr)
1457 *storeptr = string;
1458 UNGCPRO;
1459 return -2;
1462 else
1464 const char *pfn;
1466 encoded_fn = ENCODE_FILE (string);
1467 pfn = SDATA (encoded_fn);
1468 exists = (stat (pfn, &st) >= 0
1469 && (st.st_mode & S_IFMT) != S_IFDIR);
1470 if (exists)
1472 /* Check that we can access or open it. */
1473 if (NATNUMP (predicate))
1474 fd = (access (pfn, XFASTINT (predicate)) == 0) ? 1 : -1;
1475 else
1476 fd = emacs_open (pfn, O_RDONLY, 0);
1478 if (fd >= 0)
1480 /* We succeeded; return this descriptor and filename. */
1481 if (storeptr)
1482 *storeptr = string;
1483 UNGCPRO;
1484 return fd;
1489 if (absolute)
1490 break;
1493 UNGCPRO;
1494 return -1;
1498 /* Merge the list we've accumulated of globals from the current input source
1499 into the load_history variable. The details depend on whether
1500 the source has an associated file name or not.
1502 FILENAME is the file name that we are loading from.
1503 ENTIRE is 1 if loading that entire file, 0 if evaluating part of it. */
1505 static void
1506 build_load_history (Lisp_Object filename, int entire)
1508 register Lisp_Object tail, prev, newelt;
1509 register Lisp_Object tem, tem2;
1510 register int foundit = 0;
1512 tail = Vload_history;
1513 prev = Qnil;
1515 while (CONSP (tail))
1517 tem = XCAR (tail);
1519 /* Find the feature's previous assoc list... */
1520 if (!NILP (Fequal (filename, Fcar (tem))))
1522 foundit = 1;
1524 /* If we're loading the entire file, remove old data. */
1525 if (entire)
1527 if (NILP (prev))
1528 Vload_history = XCDR (tail);
1529 else
1530 Fsetcdr (prev, XCDR (tail));
1533 /* Otherwise, cons on new symbols that are not already members. */
1534 else
1536 tem2 = Vcurrent_load_list;
1538 while (CONSP (tem2))
1540 newelt = XCAR (tem2);
1542 if (NILP (Fmember (newelt, tem)))
1543 Fsetcar (tail, Fcons (XCAR (tem),
1544 Fcons (newelt, XCDR (tem))));
1546 tem2 = XCDR (tem2);
1547 QUIT;
1551 else
1552 prev = tail;
1553 tail = XCDR (tail);
1554 QUIT;
1557 /* If we're loading an entire file, cons the new assoc onto the
1558 front of load-history, the most-recently-loaded position. Also
1559 do this if we didn't find an existing member for the file. */
1560 if (entire || !foundit)
1561 Vload_history = Fcons (Fnreverse (Vcurrent_load_list),
1562 Vload_history);
1565 static Lisp_Object
1566 unreadpure (Lisp_Object junk) /* Used as unwind-protect function in readevalloop */
1568 read_pure = 0;
1569 return Qnil;
1572 static Lisp_Object
1573 readevalloop_1 (Lisp_Object old)
1575 load_convert_to_unibyte = ! NILP (old);
1576 return Qnil;
1579 /* Signal an `end-of-file' error, if possible with file name
1580 information. */
1582 static void
1583 end_of_file_error (void)
1585 if (STRINGP (Vload_file_name))
1586 xsignal1 (Qend_of_file, Vload_file_name);
1588 xsignal0 (Qend_of_file);
1591 /* UNIBYTE specifies how to set load_convert_to_unibyte
1592 for this invocation.
1593 READFUN, if non-nil, is used instead of `read'.
1595 START, END specify region to read in current buffer (from eval-region).
1596 If the input is not from a buffer, they must be nil. */
1598 static void
1599 readevalloop (Lisp_Object readcharfun,
1600 FILE *stream,
1601 Lisp_Object sourcename,
1602 Lisp_Object (*evalfun) (Lisp_Object),
1603 int printflag,
1604 Lisp_Object unibyte, Lisp_Object readfun,
1605 Lisp_Object start, Lisp_Object end)
1607 register int c;
1608 register Lisp_Object val;
1609 int count = SPECPDL_INDEX ();
1610 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1611 struct buffer *b = 0;
1612 int continue_reading_p;
1613 /* Nonzero if reading an entire buffer. */
1614 int whole_buffer = 0;
1615 /* 1 on the first time around. */
1616 int first_sexp = 1;
1618 if (MARKERP (readcharfun))
1620 if (NILP (start))
1621 start = readcharfun;
1624 if (BUFFERP (readcharfun))
1625 b = XBUFFER (readcharfun);
1626 else if (MARKERP (readcharfun))
1627 b = XMARKER (readcharfun)->buffer;
1629 /* We assume START is nil when input is not from a buffer. */
1630 if (! NILP (start) && !b)
1631 abort ();
1633 specbind (Qstandard_input, readcharfun); /* GCPROs readcharfun. */
1634 specbind (Qcurrent_load_list, Qnil);
1635 record_unwind_protect (readevalloop_1, load_convert_to_unibyte ? Qt : Qnil);
1636 load_convert_to_unibyte = !NILP (unibyte);
1638 GCPRO4 (sourcename, readfun, start, end);
1640 /* Try to ensure sourcename is a truename, except whilst preloading. */
1641 if (NILP (Vpurify_flag)
1642 && !NILP (sourcename) && !NILP (Ffile_name_absolute_p (sourcename))
1643 && !NILP (Ffboundp (Qfile_truename)))
1644 sourcename = call1 (Qfile_truename, sourcename) ;
1646 LOADHIST_ATTACH (sourcename);
1648 continue_reading_p = 1;
1649 while (continue_reading_p)
1651 int count1 = SPECPDL_INDEX ();
1653 if (b != 0 && NILP (b->name))
1654 error ("Reading from killed buffer");
1656 if (!NILP (start))
1658 /* Switch to the buffer we are reading from. */
1659 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1660 set_buffer_internal (b);
1662 /* Save point in it. */
1663 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1664 /* Save ZV in it. */
1665 record_unwind_protect (save_restriction_restore, save_restriction_save ());
1666 /* Those get unbound after we read one expression. */
1668 /* Set point and ZV around stuff to be read. */
1669 Fgoto_char (start);
1670 if (!NILP (end))
1671 Fnarrow_to_region (make_number (BEGV), end);
1673 /* Just for cleanliness, convert END to a marker
1674 if it is an integer. */
1675 if (INTEGERP (end))
1676 end = Fpoint_max_marker ();
1679 /* On the first cycle, we can easily test here
1680 whether we are reading the whole buffer. */
1681 if (b && first_sexp)
1682 whole_buffer = (PT == BEG && ZV == Z);
1684 instream = stream;
1685 read_next:
1686 c = READCHAR;
1687 if (c == ';')
1689 while ((c = READCHAR) != '\n' && c != -1);
1690 goto read_next;
1692 if (c < 0)
1694 unbind_to (count1, Qnil);
1695 break;
1698 /* Ignore whitespace here, so we can detect eof. */
1699 if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r'
1700 || c == 0x8a0) /* NBSP */
1701 goto read_next;
1703 if (!NILP (Vpurify_flag) && c == '(')
1705 record_unwind_protect (unreadpure, Qnil);
1706 val = read_list (-1, readcharfun);
1708 else
1710 UNREAD (c);
1711 read_objects = Qnil;
1712 if (!NILP (readfun))
1714 val = call1 (readfun, readcharfun);
1716 /* If READCHARFUN has set point to ZV, we should
1717 stop reading, even if the form read sets point
1718 to a different value when evaluated. */
1719 if (BUFFERP (readcharfun))
1721 struct buffer *b = XBUFFER (readcharfun);
1722 if (BUF_PT (b) == BUF_ZV (b))
1723 continue_reading_p = 0;
1726 else if (! NILP (Vload_read_function))
1727 val = call1 (Vload_read_function, readcharfun);
1728 else
1729 val = read_internal_start (readcharfun, Qnil, Qnil);
1732 if (!NILP (start) && continue_reading_p)
1733 start = Fpoint_marker ();
1735 /* Restore saved point and BEGV. */
1736 unbind_to (count1, Qnil);
1738 /* Now eval what we just read. */
1739 val = (*evalfun) (val);
1741 if (printflag)
1743 Vvalues = Fcons (val, Vvalues);
1744 if (EQ (Vstandard_output, Qt))
1745 Fprin1 (val, Qnil);
1746 else
1747 Fprint (val, Qnil);
1750 first_sexp = 0;
1753 build_load_history (sourcename,
1754 stream || whole_buffer);
1756 UNGCPRO;
1758 unbind_to (count, Qnil);
1761 DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 5, "",
1762 doc: /* Execute the current buffer as Lisp code.
1763 When called from a Lisp program (i.e., not interactively), this
1764 function accepts up to five optional arguments:
1765 BUFFER is the buffer to evaluate (nil means use current buffer).
1766 PRINTFLAG controls printing of output:
1767 A value of nil means discard it; anything else is stream for print.
1768 FILENAME specifies the file name to use for `load-history'.
1769 UNIBYTE, if non-nil, specifies `load-convert-to-unibyte' for this
1770 invocation.
1771 DO-ALLOW-PRINT, if non-nil, specifies that `print' and related
1772 functions should work normally even if PRINTFLAG is nil.
1774 This function preserves the position of point. */)
1775 (Lisp_Object buffer, Lisp_Object printflag, Lisp_Object filename, Lisp_Object unibyte, Lisp_Object do_allow_print)
1777 int count = SPECPDL_INDEX ();
1778 Lisp_Object tem, buf;
1780 if (NILP (buffer))
1781 buf = Fcurrent_buffer ();
1782 else
1783 buf = Fget_buffer (buffer);
1784 if (NILP (buf))
1785 error ("No such buffer");
1787 if (NILP (printflag) && NILP (do_allow_print))
1788 tem = Qsymbolp;
1789 else
1790 tem = printflag;
1792 if (NILP (filename))
1793 filename = XBUFFER (buf)->filename;
1795 specbind (Qeval_buffer_list, Fcons (buf, Veval_buffer_list));
1796 specbind (Qstandard_output, tem);
1797 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1798 BUF_TEMP_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
1799 readevalloop (buf, 0, filename, Feval,
1800 !NILP (printflag), unibyte, Qnil, Qnil, Qnil);
1801 unbind_to (count, Qnil);
1803 return Qnil;
1806 DEFUN ("eval-region", Feval_region, Seval_region, 2, 4, "r",
1807 doc: /* Execute the region as Lisp code.
1808 When called from programs, expects two arguments,
1809 giving starting and ending indices in the current buffer
1810 of the text to be executed.
1811 Programs can pass third argument PRINTFLAG which controls output:
1812 A value of nil means discard it; anything else is stream for printing it.
1813 Also the fourth argument READ-FUNCTION, if non-nil, is used
1814 instead of `read' to read each expression. It gets one argument
1815 which is the input stream for reading characters.
1817 This function does not move point. */)
1818 (Lisp_Object start, Lisp_Object end, Lisp_Object printflag, Lisp_Object read_function)
1820 int count = SPECPDL_INDEX ();
1821 Lisp_Object tem, cbuf;
1823 cbuf = Fcurrent_buffer ();
1825 if (NILP (printflag))
1826 tem = Qsymbolp;
1827 else
1828 tem = printflag;
1829 specbind (Qstandard_output, tem);
1830 specbind (Qeval_buffer_list, Fcons (cbuf, Veval_buffer_list));
1832 /* readevalloop calls functions which check the type of start and end. */
1833 readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval,
1834 !NILP (printflag), Qnil, read_function,
1835 start, end);
1837 return unbind_to (count, Qnil);
1841 DEFUN ("read", Fread, Sread, 0, 1, 0,
1842 doc: /* Read one Lisp expression as text from STREAM, return as Lisp object.
1843 If STREAM is nil, use the value of `standard-input' (which see).
1844 STREAM or the value of `standard-input' may be:
1845 a buffer (read from point and advance it)
1846 a marker (read from where it points and advance it)
1847 a function (call it with no arguments for each character,
1848 call it with a char as argument to push a char back)
1849 a string (takes text from string, starting at the beginning)
1850 t (read text line using minibuffer and use it, or read from
1851 standard input in batch mode). */)
1852 (Lisp_Object stream)
1854 if (NILP (stream))
1855 stream = Vstandard_input;
1856 if (EQ (stream, Qt))
1857 stream = Qread_char;
1858 if (EQ (stream, Qread_char))
1859 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil);
1861 return read_internal_start (stream, Qnil, Qnil);
1864 DEFUN ("read-from-string", Fread_from_string, Sread_from_string, 1, 3, 0,
1865 doc: /* Read one Lisp expression which is represented as text by STRING.
1866 Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).
1867 START and END optionally delimit a substring of STRING from which to read;
1868 they default to 0 and (length STRING) respectively. */)
1869 (Lisp_Object string, Lisp_Object start, Lisp_Object end)
1871 Lisp_Object ret;
1872 CHECK_STRING (string);
1873 /* read_internal_start sets read_from_string_index. */
1874 ret = read_internal_start (string, start, end);
1875 return Fcons (ret, make_number (read_from_string_index));
1878 /* Function to set up the global context we need in toplevel read
1879 calls. */
1880 static Lisp_Object
1881 read_internal_start (Lisp_Object stream, Lisp_Object start, Lisp_Object end)
1882 /* start, end only used when stream is a string. */
1884 Lisp_Object retval;
1886 readchar_count = 0;
1887 new_backquote_flag = 0;
1888 read_objects = Qnil;
1889 if (EQ (Vread_with_symbol_positions, Qt)
1890 || EQ (Vread_with_symbol_positions, stream))
1891 Vread_symbol_positions_list = Qnil;
1893 if (STRINGP (stream)
1894 || ((CONSP (stream) && STRINGP (XCAR (stream)))))
1896 EMACS_INT startval, endval;
1897 Lisp_Object string;
1899 if (STRINGP (stream))
1900 string = stream;
1901 else
1902 string = XCAR (stream);
1904 if (NILP (end))
1905 endval = SCHARS (string);
1906 else
1908 CHECK_NUMBER (end);
1909 endval = XINT (end);
1910 if (endval < 0 || endval > SCHARS (string))
1911 args_out_of_range (string, end);
1914 if (NILP (start))
1915 startval = 0;
1916 else
1918 CHECK_NUMBER (start);
1919 startval = XINT (start);
1920 if (startval < 0 || startval > endval)
1921 args_out_of_range (string, start);
1923 read_from_string_index = startval;
1924 read_from_string_index_byte = string_char_to_byte (string, startval);
1925 read_from_string_limit = endval;
1928 retval = read0 (stream);
1929 if (EQ (Vread_with_symbol_positions, Qt)
1930 || EQ (Vread_with_symbol_positions, stream))
1931 Vread_symbol_positions_list = Fnreverse (Vread_symbol_positions_list);
1932 return retval;
1936 /* Signal Qinvalid_read_syntax error.
1937 S is error string of length N (if > 0) */
1939 static void
1940 invalid_syntax (const char *s, int n)
1942 if (!n)
1943 n = strlen (s);
1944 xsignal1 (Qinvalid_read_syntax, make_string (s, n));
1948 /* Use this for recursive reads, in contexts where internal tokens
1949 are not allowed. */
1951 static Lisp_Object
1952 read0 (Lisp_Object readcharfun)
1954 register Lisp_Object val;
1955 int c;
1957 val = read1 (readcharfun, &c, 0);
1958 if (!c)
1959 return val;
1961 xsignal1 (Qinvalid_read_syntax,
1962 Fmake_string (make_number (1), make_number (c)));
1965 static int read_buffer_size;
1966 static char *read_buffer;
1968 /* Read a \-escape sequence, assuming we already read the `\'.
1969 If the escape sequence forces unibyte, return eight-bit char. */
1971 static int
1972 read_escape (Lisp_Object readcharfun, int stringp)
1974 register int c = READCHAR;
1975 /* \u allows up to four hex digits, \U up to eight. Default to the
1976 behavior for \u, and change this value in the case that \U is seen. */
1977 int unicode_hex_count = 4;
1979 switch (c)
1981 case -1:
1982 end_of_file_error ();
1984 case 'a':
1985 return '\007';
1986 case 'b':
1987 return '\b';
1988 case 'd':
1989 return 0177;
1990 case 'e':
1991 return 033;
1992 case 'f':
1993 return '\f';
1994 case 'n':
1995 return '\n';
1996 case 'r':
1997 return '\r';
1998 case 't':
1999 return '\t';
2000 case 'v':
2001 return '\v';
2002 case '\n':
2003 return -1;
2004 case ' ':
2005 if (stringp)
2006 return -1;
2007 return ' ';
2009 case 'M':
2010 c = READCHAR;
2011 if (c != '-')
2012 error ("Invalid escape character syntax");
2013 c = READCHAR;
2014 if (c == '\\')
2015 c = read_escape (readcharfun, 0);
2016 return c | meta_modifier;
2018 case 'S':
2019 c = READCHAR;
2020 if (c != '-')
2021 error ("Invalid escape character syntax");
2022 c = READCHAR;
2023 if (c == '\\')
2024 c = read_escape (readcharfun, 0);
2025 return c | shift_modifier;
2027 case 'H':
2028 c = READCHAR;
2029 if (c != '-')
2030 error ("Invalid escape character syntax");
2031 c = READCHAR;
2032 if (c == '\\')
2033 c = read_escape (readcharfun, 0);
2034 return c | hyper_modifier;
2036 case 'A':
2037 c = READCHAR;
2038 if (c != '-')
2039 error ("Invalid escape character syntax");
2040 c = READCHAR;
2041 if (c == '\\')
2042 c = read_escape (readcharfun, 0);
2043 return c | alt_modifier;
2045 case 's':
2046 c = READCHAR;
2047 if (stringp || c != '-')
2049 UNREAD (c);
2050 return ' ';
2052 c = READCHAR;
2053 if (c == '\\')
2054 c = read_escape (readcharfun, 0);
2055 return c | super_modifier;
2057 case 'C':
2058 c = READCHAR;
2059 if (c != '-')
2060 error ("Invalid escape character syntax");
2061 case '^':
2062 c = READCHAR;
2063 if (c == '\\')
2064 c = read_escape (readcharfun, 0);
2065 if ((c & ~CHAR_MODIFIER_MASK) == '?')
2066 return 0177 | (c & CHAR_MODIFIER_MASK);
2067 else if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
2068 return c | ctrl_modifier;
2069 /* ASCII control chars are made from letters (both cases),
2070 as well as the non-letters within 0100...0137. */
2071 else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
2072 return (c & (037 | ~0177));
2073 else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
2074 return (c & (037 | ~0177));
2075 else
2076 return c | ctrl_modifier;
2078 case '0':
2079 case '1':
2080 case '2':
2081 case '3':
2082 case '4':
2083 case '5':
2084 case '6':
2085 case '7':
2086 /* An octal escape, as in ANSI C. */
2088 register int i = c - '0';
2089 register int count = 0;
2090 while (++count < 3)
2092 if ((c = READCHAR) >= '0' && c <= '7')
2094 i *= 8;
2095 i += c - '0';
2097 else
2099 UNREAD (c);
2100 break;
2104 if (i >= 0x80 && i < 0x100)
2105 i = BYTE8_TO_CHAR (i);
2106 return i;
2109 case 'x':
2110 /* A hex escape, as in ANSI C. */
2112 int i = 0;
2113 int count = 0;
2114 while (1)
2116 c = READCHAR;
2117 if (c >= '0' && c <= '9')
2119 i *= 16;
2120 i += c - '0';
2122 else if ((c >= 'a' && c <= 'f')
2123 || (c >= 'A' && c <= 'F'))
2125 i *= 16;
2126 if (c >= 'a' && c <= 'f')
2127 i += c - 'a' + 10;
2128 else
2129 i += c - 'A' + 10;
2131 else
2133 UNREAD (c);
2134 break;
2136 count++;
2139 if (count < 3 && i >= 0x80)
2140 return BYTE8_TO_CHAR (i);
2141 return i;
2144 case 'U':
2145 /* Post-Unicode-2.0: Up to eight hex chars. */
2146 unicode_hex_count = 8;
2147 case 'u':
2149 /* A Unicode escape. We only permit them in strings and characters,
2150 not arbitrarily in the source code, as in some other languages. */
2152 unsigned int i = 0;
2153 int count = 0;
2155 while (++count <= unicode_hex_count)
2157 c = READCHAR;
2158 /* isdigit and isalpha may be locale-specific, which we don't
2159 want. */
2160 if (c >= '0' && c <= '9') i = (i << 4) + (c - '0');
2161 else if (c >= 'a' && c <= 'f') i = (i << 4) + (c - 'a') + 10;
2162 else if (c >= 'A' && c <= 'F') i = (i << 4) + (c - 'A') + 10;
2163 else
2165 error ("Non-hex digit used for Unicode escape");
2166 break;
2169 if (i > 0x10FFFF)
2170 error ("Non-Unicode character: 0x%x", i);
2171 return i;
2174 default:
2175 return c;
2179 /* Read an integer in radix RADIX using READCHARFUN to read
2180 characters. RADIX must be in the interval [2..36]; if it isn't, a
2181 read error is signaled . Value is the integer read. Signals an
2182 error if encountering invalid read syntax or if RADIX is out of
2183 range. */
2185 static Lisp_Object
2186 read_integer (Lisp_Object readcharfun, int radix)
2188 int ndigits = 0, invalid_p, c, sign = 0;
2189 /* We use a floating point number because */
2190 double number = 0;
2192 if (radix < 2 || radix > 36)
2193 invalid_p = 1;
2194 else
2196 number = ndigits = invalid_p = 0;
2197 sign = 1;
2199 c = READCHAR;
2200 if (c == '-')
2202 c = READCHAR;
2203 sign = -1;
2205 else if (c == '+')
2206 c = READCHAR;
2208 while (c >= 0)
2210 int digit;
2212 if (c >= '0' && c <= '9')
2213 digit = c - '0';
2214 else if (c >= 'a' && c <= 'z')
2215 digit = c - 'a' + 10;
2216 else if (c >= 'A' && c <= 'Z')
2217 digit = c - 'A' + 10;
2218 else
2220 UNREAD (c);
2221 break;
2224 if (digit < 0 || digit >= radix)
2225 invalid_p = 1;
2227 number = radix * number + digit;
2228 ++ndigits;
2229 c = READCHAR;
2233 if (ndigits == 0 || invalid_p)
2235 char buf[50];
2236 sprintf (buf, "integer, radix %d", radix);
2237 invalid_syntax (buf, 0);
2240 return make_fixnum_or_float (sign * number);
2244 /* If the next token is ')' or ']' or '.', we store that character
2245 in *PCH and the return value is not interesting. Else, we store
2246 zero in *PCH and we read and return one lisp object.
2248 FIRST_IN_LIST is nonzero if this is the first element of a list. */
2250 static Lisp_Object
2251 read1 (register Lisp_Object readcharfun, int *pch, int first_in_list)
2253 register int c;
2254 int uninterned_symbol = 0;
2255 int multibyte;
2257 *pch = 0;
2258 load_each_byte = 0;
2260 retry:
2262 c = READCHAR_REPORT_MULTIBYTE (&multibyte);
2263 if (c < 0)
2264 end_of_file_error ();
2266 switch (c)
2268 case '(':
2269 return read_list (0, readcharfun);
2271 case '[':
2272 return read_vector (readcharfun, 0);
2274 case ')':
2275 case ']':
2277 *pch = c;
2278 return Qnil;
2281 case '#':
2282 c = READCHAR;
2283 if (c == 's')
2285 c = READCHAR;
2286 if (c == '(')
2288 /* Accept extended format for hashtables (extensible to
2289 other types), e.g.
2290 #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
2291 Lisp_Object tmp = read_list (0, readcharfun);
2292 Lisp_Object head = CAR_SAFE (tmp);
2293 Lisp_Object data = Qnil;
2294 Lisp_Object val = Qnil;
2295 /* The size is 2 * number of allowed keywords to
2296 make-hash-table. */
2297 Lisp_Object params[10];
2298 Lisp_Object ht;
2299 Lisp_Object key = Qnil;
2300 int param_count = 0;
2302 if (!EQ (head, Qhash_table))
2303 error ("Invalid extended read marker at head of #s list "
2304 "(only hash-table allowed)");
2306 tmp = CDR_SAFE (tmp);
2308 /* This is repetitive but fast and simple. */
2309 params[param_count] = QCsize;
2310 params[param_count+1] = Fplist_get (tmp, Qsize);
2311 if (!NILP (params[param_count + 1]))
2312 param_count += 2;
2314 params[param_count] = QCtest;
2315 params[param_count+1] = Fplist_get (tmp, Qtest);
2316 if (!NILP (params[param_count + 1]))
2317 param_count += 2;
2319 params[param_count] = QCweakness;
2320 params[param_count+1] = Fplist_get (tmp, Qweakness);
2321 if (!NILP (params[param_count + 1]))
2322 param_count += 2;
2324 params[param_count] = QCrehash_size;
2325 params[param_count+1] = Fplist_get (tmp, Qrehash_size);
2326 if (!NILP (params[param_count + 1]))
2327 param_count += 2;
2329 params[param_count] = QCrehash_threshold;
2330 params[param_count+1] = Fplist_get (tmp, Qrehash_threshold);
2331 if (!NILP (params[param_count + 1]))
2332 param_count += 2;
2334 /* This is the hashtable data. */
2335 data = Fplist_get (tmp, Qdata);
2337 /* Now use params to make a new hashtable and fill it. */
2338 ht = Fmake_hash_table (param_count, params);
2340 while (CONSP (data))
2342 key = XCAR (data);
2343 data = XCDR (data);
2344 if (!CONSP (data))
2345 error ("Odd number of elements in hashtable data");
2346 val = XCAR (data);
2347 data = XCDR (data);
2348 Fputhash (key, val, ht);
2351 return ht;
2353 UNREAD (c);
2354 invalid_syntax ("#", 1);
2356 if (c == '^')
2358 c = READCHAR;
2359 if (c == '[')
2361 Lisp_Object tmp;
2362 tmp = read_vector (readcharfun, 0);
2363 if (XVECTOR (tmp)->size < CHAR_TABLE_STANDARD_SLOTS)
2364 error ("Invalid size char-table");
2365 XSETPVECTYPE (XVECTOR (tmp), PVEC_CHAR_TABLE);
2366 return tmp;
2368 else if (c == '^')
2370 c = READCHAR;
2371 if (c == '[')
2373 Lisp_Object tmp;
2374 int depth, size;
2376 tmp = read_vector (readcharfun, 0);
2377 if (!INTEGERP (AREF (tmp, 0)))
2378 error ("Invalid depth in char-table");
2379 depth = XINT (AREF (tmp, 0));
2380 if (depth < 1 || depth > 3)
2381 error ("Invalid depth in char-table");
2382 size = XVECTOR (tmp)->size - 2;
2383 if (chartab_size [depth] != size)
2384 error ("Invalid size char-table");
2385 XSETPVECTYPE (XVECTOR (tmp), PVEC_SUB_CHAR_TABLE);
2386 return tmp;
2388 invalid_syntax ("#^^", 3);
2390 invalid_syntax ("#^", 2);
2392 if (c == '&')
2394 Lisp_Object length;
2395 length = read1 (readcharfun, pch, first_in_list);
2396 c = READCHAR;
2397 if (c == '"')
2399 Lisp_Object tmp, val;
2400 int size_in_chars
2401 = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
2402 / BOOL_VECTOR_BITS_PER_CHAR);
2404 UNREAD (c);
2405 tmp = read1 (readcharfun, pch, first_in_list);
2406 if (STRING_MULTIBYTE (tmp)
2407 || (size_in_chars != SCHARS (tmp)
2408 /* We used to print 1 char too many
2409 when the number of bits was a multiple of 8.
2410 Accept such input in case it came from an old
2411 version. */
2412 && ! (XFASTINT (length)
2413 == (SCHARS (tmp) - 1) * BOOL_VECTOR_BITS_PER_CHAR)))
2414 invalid_syntax ("#&...", 5);
2416 val = Fmake_bool_vector (length, Qnil);
2417 memcpy (XBOOL_VECTOR (val)->data, SDATA (tmp), size_in_chars);
2418 /* Clear the extraneous bits in the last byte. */
2419 if (XINT (length) != size_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
2420 XBOOL_VECTOR (val)->data[size_in_chars - 1]
2421 &= (1 << (XINT (length) % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
2422 return val;
2424 invalid_syntax ("#&...", 5);
2426 if (c == '[')
2428 /* Accept compiled functions at read-time so that we don't have to
2429 build them using function calls. */
2430 Lisp_Object tmp;
2431 tmp = read_vector (readcharfun, 1);
2432 return Fmake_byte_code (XVECTOR (tmp)->size,
2433 XVECTOR (tmp)->contents);
2435 if (c == '(')
2437 Lisp_Object tmp;
2438 struct gcpro gcpro1;
2439 int ch;
2441 /* Read the string itself. */
2442 tmp = read1 (readcharfun, &ch, 0);
2443 if (ch != 0 || !STRINGP (tmp))
2444 invalid_syntax ("#", 1);
2445 GCPRO1 (tmp);
2446 /* Read the intervals and their properties. */
2447 while (1)
2449 Lisp_Object beg, end, plist;
2451 beg = read1 (readcharfun, &ch, 0);
2452 end = plist = Qnil;
2453 if (ch == ')')
2454 break;
2455 if (ch == 0)
2456 end = read1 (readcharfun, &ch, 0);
2457 if (ch == 0)
2458 plist = read1 (readcharfun, &ch, 0);
2459 if (ch)
2460 invalid_syntax ("Invalid string property list", 0);
2461 Fset_text_properties (beg, end, plist, tmp);
2463 UNGCPRO;
2464 return tmp;
2467 /* #@NUMBER is used to skip NUMBER following characters.
2468 That's used in .elc files to skip over doc strings
2469 and function definitions. */
2470 if (c == '@')
2472 int i, nskip = 0;
2474 load_each_byte = 1;
2475 /* Read a decimal integer. */
2476 while ((c = READCHAR) >= 0
2477 && c >= '0' && c <= '9')
2479 nskip *= 10;
2480 nskip += c - '0';
2482 if (c >= 0)
2483 UNREAD (c);
2485 if (load_force_doc_strings
2486 && (EQ (readcharfun, Qget_file_char)
2487 || EQ (readcharfun, Qget_emacs_mule_file_char)))
2489 /* If we are supposed to force doc strings into core right now,
2490 record the last string that we skipped,
2491 and record where in the file it comes from. */
2493 /* But first exchange saved_doc_string
2494 with prev_saved_doc_string, so we save two strings. */
2496 char *temp = saved_doc_string;
2497 int temp_size = saved_doc_string_size;
2498 file_offset temp_pos = saved_doc_string_position;
2499 int temp_len = saved_doc_string_length;
2501 saved_doc_string = prev_saved_doc_string;
2502 saved_doc_string_size = prev_saved_doc_string_size;
2503 saved_doc_string_position = prev_saved_doc_string_position;
2504 saved_doc_string_length = prev_saved_doc_string_length;
2506 prev_saved_doc_string = temp;
2507 prev_saved_doc_string_size = temp_size;
2508 prev_saved_doc_string_position = temp_pos;
2509 prev_saved_doc_string_length = temp_len;
2512 if (saved_doc_string_size == 0)
2514 saved_doc_string_size = nskip + 100;
2515 saved_doc_string = (char *) xmalloc (saved_doc_string_size);
2517 if (nskip > saved_doc_string_size)
2519 saved_doc_string_size = nskip + 100;
2520 saved_doc_string = (char *) xrealloc (saved_doc_string,
2521 saved_doc_string_size);
2524 saved_doc_string_position = file_tell (instream);
2526 /* Copy that many characters into saved_doc_string. */
2527 for (i = 0; i < nskip && c >= 0; i++)
2528 saved_doc_string[i] = c = READCHAR;
2530 saved_doc_string_length = i;
2532 else
2534 /* Skip that many characters. */
2535 for (i = 0; i < nskip && c >= 0; i++)
2536 c = READCHAR;
2539 load_each_byte = 0;
2540 goto retry;
2542 if (c == '!')
2544 /* #! appears at the beginning of an executable file.
2545 Skip the first line. */
2546 while (c != '\n' && c >= 0)
2547 c = READCHAR;
2548 goto retry;
2550 if (c == '$')
2551 return Vload_file_name;
2552 if (c == '\'')
2553 return Fcons (Qfunction, Fcons (read0 (readcharfun), Qnil));
2554 /* #:foo is the uninterned symbol named foo. */
2555 if (c == ':')
2557 uninterned_symbol = 1;
2558 c = READCHAR;
2559 goto default_label;
2561 /* Reader forms that can reuse previously read objects. */
2562 if (c >= '0' && c <= '9')
2564 int n = 0;
2565 Lisp_Object tem;
2567 /* Read a non-negative integer. */
2568 while (c >= '0' && c <= '9')
2570 n *= 10;
2571 n += c - '0';
2572 c = READCHAR;
2574 /* #n=object returns object, but associates it with n for #n#. */
2575 if (c == '=' && !NILP (Vread_circle))
2577 /* Make a placeholder for #n# to use temporarily */
2578 Lisp_Object placeholder;
2579 Lisp_Object cell;
2581 placeholder = Fcons (Qnil, Qnil);
2582 cell = Fcons (make_number (n), placeholder);
2583 read_objects = Fcons (cell, read_objects);
2585 /* Read the object itself. */
2586 tem = read0 (readcharfun);
2588 /* Now put it everywhere the placeholder was... */
2589 substitute_object_in_subtree (tem, placeholder);
2591 /* ...and #n# will use the real value from now on. */
2592 Fsetcdr (cell, tem);
2594 return tem;
2596 /* #n# returns a previously read object. */
2597 if (c == '#' && !NILP (Vread_circle))
2599 tem = Fassq (make_number (n), read_objects);
2600 if (CONSP (tem))
2601 return XCDR (tem);
2602 /* Fall through to error message. */
2604 else if (c == 'r' || c == 'R')
2605 return read_integer (readcharfun, n);
2607 /* Fall through to error message. */
2609 else if (c == 'x' || c == 'X')
2610 return read_integer (readcharfun, 16);
2611 else if (c == 'o' || c == 'O')
2612 return read_integer (readcharfun, 8);
2613 else if (c == 'b' || c == 'B')
2614 return read_integer (readcharfun, 2);
2616 UNREAD (c);
2617 invalid_syntax ("#", 1);
2619 case ';':
2620 while ((c = READCHAR) >= 0 && c != '\n');
2621 goto retry;
2623 case '\'':
2625 return Fcons (Qquote, Fcons (read0 (readcharfun), Qnil));
2628 case '`':
2630 int next_char = READCHAR;
2631 UNREAD (next_char);
2632 /* Transition from old-style to new-style:
2633 If we see "(`" it used to mean old-style, which usually works
2634 fine because ` should almost never appear in such a position
2635 for new-style. But occasionally we need "(`" to mean new
2636 style, so we try to distinguish the two by the fact that we
2637 can either write "( `foo" or "(` foo", where the first
2638 intends to use new-style whereas the second intends to use
2639 old-style. For Emacs-25, we should completely remove this
2640 first_in_list exception (old-style can still be obtained via
2641 "(\`" anyway). */
2642 if (first_in_list && next_char == ' ')
2644 Vold_style_backquotes = Qt;
2645 goto default_label;
2647 else
2649 Lisp_Object value;
2651 new_backquote_flag++;
2652 value = read0 (readcharfun);
2653 new_backquote_flag--;
2655 return Fcons (Qbackquote, Fcons (value, Qnil));
2658 case ',':
2659 if (new_backquote_flag)
2661 Lisp_Object comma_type = Qnil;
2662 Lisp_Object value;
2663 int ch = READCHAR;
2665 if (ch == '@')
2666 comma_type = Qcomma_at;
2667 else if (ch == '.')
2668 comma_type = Qcomma_dot;
2669 else
2671 if (ch >= 0) UNREAD (ch);
2672 comma_type = Qcomma;
2675 new_backquote_flag--;
2676 value = read0 (readcharfun);
2677 new_backquote_flag++;
2678 return Fcons (comma_type, Fcons (value, Qnil));
2680 else
2682 Vold_style_backquotes = Qt;
2683 goto default_label;
2686 case '?':
2688 int modifiers;
2689 int next_char;
2690 int ok;
2692 c = READCHAR;
2693 if (c < 0)
2694 end_of_file_error ();
2696 /* Accept `single space' syntax like (list ? x) where the
2697 whitespace character is SPC or TAB.
2698 Other literal whitespace like NL, CR, and FF are not accepted,
2699 as there are well-established escape sequences for these. */
2700 if (c == ' ' || c == '\t')
2701 return make_number (c);
2703 if (c == '\\')
2704 c = read_escape (readcharfun, 0);
2705 modifiers = c & CHAR_MODIFIER_MASK;
2706 c &= ~CHAR_MODIFIER_MASK;
2707 if (CHAR_BYTE8_P (c))
2708 c = CHAR_TO_BYTE8 (c);
2709 c |= modifiers;
2711 next_char = READCHAR;
2712 if (next_char == '.')
2714 /* Only a dotted-pair dot is valid after a char constant. */
2715 int next_next_char = READCHAR;
2716 UNREAD (next_next_char);
2718 ok = (next_next_char <= 040
2719 || (next_next_char < 0200
2720 && (strchr ("\"';([#?", next_next_char)
2721 || (!first_in_list && next_next_char == '`')
2722 || (new_backquote_flag && next_next_char == ','))));
2724 else
2726 ok = (next_char <= 040
2727 || (next_char < 0200
2728 && (strchr ("\"';()[]#?", next_char)
2729 || (!first_in_list && next_char == '`')
2730 || (new_backquote_flag && next_char == ','))));
2732 UNREAD (next_char);
2733 if (ok)
2734 return make_number (c);
2736 invalid_syntax ("?", 1);
2739 case '"':
2741 char *p = read_buffer;
2742 char *end = read_buffer + read_buffer_size;
2743 register int c;
2744 /* Nonzero if we saw an escape sequence specifying
2745 a multibyte character. */
2746 int force_multibyte = 0;
2747 /* Nonzero if we saw an escape sequence specifying
2748 a single-byte character. */
2749 int force_singlebyte = 0;
2750 int cancel = 0;
2751 int nchars = 0;
2753 while ((c = READCHAR) >= 0
2754 && c != '\"')
2756 if (end - p < MAX_MULTIBYTE_LENGTH)
2758 int offset = p - read_buffer;
2759 read_buffer = (char *) xrealloc (read_buffer,
2760 read_buffer_size *= 2);
2761 p = read_buffer + offset;
2762 end = read_buffer + read_buffer_size;
2765 if (c == '\\')
2767 int modifiers;
2769 c = read_escape (readcharfun, 1);
2771 /* C is -1 if \ newline has just been seen */
2772 if (c == -1)
2774 if (p == read_buffer)
2775 cancel = 1;
2776 continue;
2779 modifiers = c & CHAR_MODIFIER_MASK;
2780 c = c & ~CHAR_MODIFIER_MASK;
2782 if (CHAR_BYTE8_P (c))
2783 force_singlebyte = 1;
2784 else if (! ASCII_CHAR_P (c))
2785 force_multibyte = 1;
2786 else /* i.e. ASCII_CHAR_P (c) */
2788 /* Allow `\C- ' and `\C-?'. */
2789 if (modifiers == CHAR_CTL)
2791 if (c == ' ')
2792 c = 0, modifiers = 0;
2793 else if (c == '?')
2794 c = 127, modifiers = 0;
2796 if (modifiers & CHAR_SHIFT)
2798 /* Shift modifier is valid only with [A-Za-z]. */
2799 if (c >= 'A' && c <= 'Z')
2800 modifiers &= ~CHAR_SHIFT;
2801 else if (c >= 'a' && c <= 'z')
2802 c -= ('a' - 'A'), modifiers &= ~CHAR_SHIFT;
2805 if (modifiers & CHAR_META)
2807 /* Move the meta bit to the right place for a
2808 string. */
2809 modifiers &= ~CHAR_META;
2810 c = BYTE8_TO_CHAR (c | 0x80);
2811 force_singlebyte = 1;
2815 /* Any modifiers remaining are invalid. */
2816 if (modifiers)
2817 error ("Invalid modifier in string");
2818 p += CHAR_STRING (c, (unsigned char *) p);
2820 else
2822 p += CHAR_STRING (c, (unsigned char *) p);
2823 if (CHAR_BYTE8_P (c))
2824 force_singlebyte = 1;
2825 else if (! ASCII_CHAR_P (c))
2826 force_multibyte = 1;
2828 nchars++;
2831 if (c < 0)
2832 end_of_file_error ();
2834 /* If purifying, and string starts with \ newline,
2835 return zero instead. This is for doc strings
2836 that we are really going to find in etc/DOC.nn.nn */
2837 if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
2838 return make_number (0);
2840 if (force_multibyte)
2841 /* READ_BUFFER already contains valid multibyte forms. */
2843 else if (force_singlebyte)
2845 nchars = str_as_unibyte (read_buffer, p - read_buffer);
2846 p = read_buffer + nchars;
2848 else
2849 /* Otherwise, READ_BUFFER contains only ASCII. */
2852 /* We want readchar_count to be the number of characters, not
2853 bytes. Hence we adjust for multibyte characters in the
2854 string. ... But it doesn't seem to be necessary, because
2855 READCHAR *does* read multibyte characters from buffers. */
2856 /* readchar_count -= (p - read_buffer) - nchars; */
2857 if (read_pure)
2858 return make_pure_string (read_buffer, nchars, p - read_buffer,
2859 (force_multibyte
2860 || (p - read_buffer != nchars)));
2861 return make_specified_string (read_buffer, nchars, p - read_buffer,
2862 (force_multibyte
2863 || (p - read_buffer != nchars)));
2866 case '.':
2868 int next_char = READCHAR;
2869 UNREAD (next_char);
2871 if (next_char <= 040
2872 || (next_char < 0200
2873 && (strchr ("\"';([#?", next_char)
2874 || (!first_in_list && next_char == '`')
2875 || (new_backquote_flag && next_char == ','))))
2877 *pch = c;
2878 return Qnil;
2881 /* Otherwise, we fall through! Note that the atom-reading loop
2882 below will now loop at least once, assuring that we will not
2883 try to UNREAD two characters in a row. */
2885 default:
2886 default_label:
2887 if (c <= 040) goto retry;
2888 if (c == 0x8a0) /* NBSP */
2889 goto retry;
2891 char *p = read_buffer;
2892 int quoted = 0;
2895 char *end = read_buffer + read_buffer_size;
2897 while (c > 040
2898 && c != 0x8a0 /* NBSP */
2899 && (c >= 0200
2900 || (!strchr ("\"';()[]#", c)
2901 && !(!first_in_list && c == '`')
2902 && !(new_backquote_flag && c == ','))))
2904 if (end - p < MAX_MULTIBYTE_LENGTH)
2906 int offset = p - read_buffer;
2907 read_buffer = (char *) xrealloc (read_buffer,
2908 read_buffer_size *= 2);
2909 p = read_buffer + offset;
2910 end = read_buffer + read_buffer_size;
2913 if (c == '\\')
2915 c = READCHAR;
2916 if (c == -1)
2917 end_of_file_error ();
2918 quoted = 1;
2921 if (multibyte)
2922 p += CHAR_STRING (c, p);
2923 else
2924 *p++ = c;
2925 c = READCHAR;
2928 if (p == end)
2930 int offset = p - read_buffer;
2931 read_buffer = (char *) xrealloc (read_buffer,
2932 read_buffer_size *= 2);
2933 p = read_buffer + offset;
2934 end = read_buffer + read_buffer_size;
2936 *p = 0;
2937 if (c >= 0)
2938 UNREAD (c);
2941 if (!quoted && !uninterned_symbol)
2943 register char *p1;
2944 p1 = read_buffer;
2945 if (*p1 == '+' || *p1 == '-') p1++;
2946 /* Is it an integer? */
2947 if (p1 != p)
2949 while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
2950 /* Integers can have trailing decimal points. */
2951 if (p1 > read_buffer && p1 < p && *p1 == '.') p1++;
2952 if (p1 == p)
2953 /* It is an integer. */
2955 if (p1[-1] == '.')
2956 p1[-1] = '\0';
2958 /* EMACS_INT n = atol (read_buffer); */
2959 char *endptr = NULL;
2960 EMACS_INT n = (errno = 0,
2961 strtol (read_buffer, &endptr, 10));
2962 if (errno == ERANGE && endptr)
2964 Lisp_Object args
2965 = Fcons (make_string (read_buffer,
2966 endptr - read_buffer),
2967 Qnil);
2968 xsignal (Qoverflow_error, args);
2970 return make_fixnum_or_float (n);
2974 if (isfloat_string (read_buffer, 0))
2976 /* Compute NaN and infinities using 0.0 in a variable,
2977 to cope with compilers that think they are smarter
2978 than we are. */
2979 double zero = 0.0;
2981 double value;
2983 /* Negate the value ourselves. This treats 0, NaNs,
2984 and infinity properly on IEEE floating point hosts,
2985 and works around a common bug where atof ("-0.0")
2986 drops the sign. */
2987 int negative = read_buffer[0] == '-';
2989 /* The only way p[-1] can be 'F' or 'N', after isfloat_string
2990 returns 1, is if the input ends in e+INF or e+NaN. */
2991 switch (p[-1])
2993 case 'F':
2994 value = 1.0 / zero;
2995 break;
2996 case 'N':
2997 value = zero / zero;
2999 /* If that made a "negative" NaN, negate it. */
3002 int i;
3003 union { double d; char c[sizeof (double)]; } u_data, u_minus_zero;
3005 u_data.d = value;
3006 u_minus_zero.d = - 0.0;
3007 for (i = 0; i < sizeof (double); i++)
3008 if (u_data.c[i] & u_minus_zero.c[i])
3010 value = - value;
3011 break;
3014 /* Now VALUE is a positive NaN. */
3015 break;
3016 default:
3017 value = atof (read_buffer + negative);
3018 break;
3021 return make_float (negative ? - value : value);
3025 Lisp_Object name, result;
3026 EMACS_INT nbytes = p - read_buffer;
3027 EMACS_INT nchars
3028 = (multibyte ? multibyte_chars_in_text (read_buffer, nbytes)
3029 : nbytes);
3031 if (uninterned_symbol && ! NILP (Vpurify_flag))
3032 name = make_pure_string (read_buffer, nchars, nbytes, multibyte);
3033 else
3034 name = make_specified_string (read_buffer, nchars, nbytes,multibyte);
3035 result = (uninterned_symbol ? Fmake_symbol (name)
3036 : Fintern (name, Qnil));
3038 if (EQ (Vread_with_symbol_positions, Qt)
3039 || EQ (Vread_with_symbol_positions, readcharfun))
3040 Vread_symbol_positions_list =
3041 /* Kind of a hack; this will probably fail if characters
3042 in the symbol name were escaped. Not really a big
3043 deal, though. */
3044 Fcons (Fcons (result,
3045 make_number (readchar_count
3046 - XFASTINT (Flength (Fsymbol_name (result))))),
3047 Vread_symbol_positions_list);
3048 return result;
3055 /* List of nodes we've seen during substitute_object_in_subtree. */
3056 static Lisp_Object seen_list;
3058 static void
3059 substitute_object_in_subtree (Lisp_Object object, Lisp_Object placeholder)
3061 Lisp_Object check_object;
3063 /* We haven't seen any objects when we start. */
3064 seen_list = Qnil;
3066 /* Make all the substitutions. */
3067 check_object
3068 = substitute_object_recurse (object, placeholder, object);
3070 /* Clear seen_list because we're done with it. */
3071 seen_list = Qnil;
3073 /* The returned object here is expected to always eq the
3074 original. */
3075 if (!EQ (check_object, object))
3076 error ("Unexpected mutation error in reader");
3079 /* Feval doesn't get called from here, so no gc protection is needed. */
3080 #define SUBSTITUTE(get_val, set_val) \
3081 do { \
3082 Lisp_Object old_value = get_val; \
3083 Lisp_Object true_value \
3084 = substitute_object_recurse (object, placeholder, \
3085 old_value); \
3087 if (!EQ (old_value, true_value)) \
3089 set_val; \
3091 } while (0)
3093 static Lisp_Object
3094 substitute_object_recurse (Lisp_Object object, Lisp_Object placeholder, Lisp_Object subtree)
3096 /* If we find the placeholder, return the target object. */
3097 if (EQ (placeholder, subtree))
3098 return object;
3100 /* If we've been to this node before, don't explore it again. */
3101 if (!EQ (Qnil, Fmemq (subtree, seen_list)))
3102 return subtree;
3104 /* If this node can be the entry point to a cycle, remember that
3105 we've seen it. It can only be such an entry point if it was made
3106 by #n=, which means that we can find it as a value in
3107 read_objects. */
3108 if (!EQ (Qnil, Frassq (subtree, read_objects)))
3109 seen_list = Fcons (subtree, seen_list);
3111 /* Recurse according to subtree's type.
3112 Every branch must return a Lisp_Object. */
3113 switch (XTYPE (subtree))
3115 case Lisp_Vectorlike:
3117 int i, length = 0;
3118 if (BOOL_VECTOR_P (subtree))
3119 return subtree; /* No sub-objects anyway. */
3120 else if (CHAR_TABLE_P (subtree) || SUB_CHAR_TABLE_P (subtree)
3121 || COMPILEDP (subtree))
3122 length = ASIZE (subtree) & PSEUDOVECTOR_SIZE_MASK;
3123 else if (VECTORP (subtree))
3124 length = ASIZE (subtree);
3125 else
3126 /* An unknown pseudovector may contain non-Lisp fields, so we
3127 can't just blindly traverse all its fields. We used to call
3128 `Flength' which signaled `sequencep', so I just preserved this
3129 behavior. */
3130 wrong_type_argument (Qsequencep, subtree);
3132 for (i = 0; i < length; i++)
3133 SUBSTITUTE (AREF (subtree, i),
3134 ASET (subtree, i, true_value));
3135 return subtree;
3138 case Lisp_Cons:
3140 SUBSTITUTE (XCAR (subtree),
3141 XSETCAR (subtree, true_value));
3142 SUBSTITUTE (XCDR (subtree),
3143 XSETCDR (subtree, true_value));
3144 return subtree;
3147 case Lisp_String:
3149 /* Check for text properties in each interval.
3150 substitute_in_interval contains part of the logic. */
3152 INTERVAL root_interval = STRING_INTERVALS (subtree);
3153 Lisp_Object arg = Fcons (object, placeholder);
3155 traverse_intervals_noorder (root_interval,
3156 &substitute_in_interval, arg);
3158 return subtree;
3161 /* Other types don't recurse any further. */
3162 default:
3163 return subtree;
3167 /* Helper function for substitute_object_recurse. */
3168 static void
3169 substitute_in_interval (INTERVAL interval, Lisp_Object arg)
3171 Lisp_Object object = Fcar (arg);
3172 Lisp_Object placeholder = Fcdr (arg);
3174 SUBSTITUTE (interval->plist, interval->plist = true_value);
3178 #define LEAD_INT 1
3179 #define DOT_CHAR 2
3180 #define TRAIL_INT 4
3181 #define E_CHAR 8
3182 #define EXP_INT 16
3185 isfloat_string (const char *cp, int ignore_trailing)
3187 int state;
3188 const char *start = cp;
3190 state = 0;
3191 if (*cp == '+' || *cp == '-')
3192 cp++;
3194 if (*cp >= '0' && *cp <= '9')
3196 state |= LEAD_INT;
3197 while (*cp >= '0' && *cp <= '9')
3198 cp++;
3200 if (*cp == '.')
3202 state |= DOT_CHAR;
3203 cp++;
3205 if (*cp >= '0' && *cp <= '9')
3207 state |= TRAIL_INT;
3208 while (*cp >= '0' && *cp <= '9')
3209 cp++;
3211 if (*cp == 'e' || *cp == 'E')
3213 state |= E_CHAR;
3214 cp++;
3215 if (*cp == '+' || *cp == '-')
3216 cp++;
3219 if (*cp >= '0' && *cp <= '9')
3221 state |= EXP_INT;
3222 while (*cp >= '0' && *cp <= '9')
3223 cp++;
3225 else if (cp == start)
3227 else if (cp[-1] == '+' && cp[0] == 'I' && cp[1] == 'N' && cp[2] == 'F')
3229 state |= EXP_INT;
3230 cp += 3;
3232 else if (cp[-1] == '+' && cp[0] == 'N' && cp[1] == 'a' && cp[2] == 'N')
3234 state |= EXP_INT;
3235 cp += 3;
3238 return ((ignore_trailing
3239 || *cp == 0 || *cp == ' ' || *cp == '\t' || *cp == '\n'
3240 || *cp == '\r' || *cp == '\f')
3241 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
3242 || state == (DOT_CHAR|TRAIL_INT)
3243 || state == (LEAD_INT|E_CHAR|EXP_INT)
3244 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)
3245 || state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
3249 static Lisp_Object
3250 read_vector (Lisp_Object readcharfun, int bytecodeflag)
3252 register int i;
3253 register int size;
3254 register Lisp_Object *ptr;
3255 register Lisp_Object tem, item, vector;
3256 register struct Lisp_Cons *otem;
3257 Lisp_Object len;
3259 tem = read_list (1, readcharfun);
3260 len = Flength (tem);
3261 vector = (read_pure ? make_pure_vector (XINT (len)) : Fmake_vector (len, Qnil));
3263 size = XVECTOR (vector)->size;
3264 ptr = XVECTOR (vector)->contents;
3265 for (i = 0; i < size; i++)
3267 item = Fcar (tem);
3268 /* If `load-force-doc-strings' is t when reading a lazily-loaded
3269 bytecode object, the docstring containing the bytecode and
3270 constants values must be treated as unibyte and passed to
3271 Fread, to get the actual bytecode string and constants vector. */
3272 if (bytecodeflag && load_force_doc_strings)
3274 if (i == COMPILED_BYTECODE)
3276 if (!STRINGP (item))
3277 error ("Invalid byte code");
3279 /* Delay handling the bytecode slot until we know whether
3280 it is lazily-loaded (we can tell by whether the
3281 constants slot is nil). */
3282 ptr[COMPILED_CONSTANTS] = item;
3283 item = Qnil;
3285 else if (i == COMPILED_CONSTANTS)
3287 Lisp_Object bytestr = ptr[COMPILED_CONSTANTS];
3289 if (NILP (item))
3291 /* Coerce string to unibyte (like string-as-unibyte,
3292 but without generating extra garbage and
3293 guaranteeing no change in the contents). */
3294 STRING_SET_CHARS (bytestr, SBYTES (bytestr));
3295 STRING_SET_UNIBYTE (bytestr);
3297 item = Fread (Fcons (bytestr, readcharfun));
3298 if (!CONSP (item))
3299 error ("Invalid byte code");
3301 otem = XCONS (item);
3302 bytestr = XCAR (item);
3303 item = XCDR (item);
3304 free_cons (otem);
3307 /* Now handle the bytecode slot. */
3308 ptr[COMPILED_BYTECODE] = read_pure ? Fpurecopy (bytestr) : bytestr;
3310 else if (i == COMPILED_DOC_STRING
3311 && STRINGP (item)
3312 && ! STRING_MULTIBYTE (item))
3314 if (EQ (readcharfun, Qget_emacs_mule_file_char))
3315 item = Fdecode_coding_string (item, Qemacs_mule, Qnil, Qnil);
3316 else
3317 item = Fstring_as_multibyte (item);
3320 ptr[i] = read_pure ? Fpurecopy (item) : item;
3321 otem = XCONS (tem);
3322 tem = Fcdr (tem);
3323 free_cons (otem);
3325 return vector;
3328 /* FLAG = 1 means check for ] to terminate rather than ) and .
3329 FLAG = -1 means check for starting with defun
3330 and make structure pure. */
3332 static Lisp_Object
3333 read_list (int flag, register Lisp_Object readcharfun)
3335 /* -1 means check next element for defun,
3336 0 means don't check,
3337 1 means already checked and found defun. */
3338 int defunflag = flag < 0 ? -1 : 0;
3339 Lisp_Object val, tail;
3340 register Lisp_Object elt, tem;
3341 struct gcpro gcpro1, gcpro2;
3342 /* 0 is the normal case.
3343 1 means this list is a doc reference; replace it with the number 0.
3344 2 means this list is a doc reference; replace it with the doc string. */
3345 int doc_reference = 0;
3347 /* Initialize this to 1 if we are reading a list. */
3348 int first_in_list = flag <= 0;
3350 val = Qnil;
3351 tail = Qnil;
3353 while (1)
3355 int ch;
3356 GCPRO2 (val, tail);
3357 elt = read1 (readcharfun, &ch, first_in_list);
3358 UNGCPRO;
3360 first_in_list = 0;
3362 /* While building, if the list starts with #$, treat it specially. */
3363 if (EQ (elt, Vload_file_name)
3364 && ! NILP (elt)
3365 && !NILP (Vpurify_flag))
3367 if (NILP (Vdoc_file_name))
3368 /* We have not yet called Snarf-documentation, so assume
3369 this file is described in the DOC-MM.NN file
3370 and Snarf-documentation will fill in the right value later.
3371 For now, replace the whole list with 0. */
3372 doc_reference = 1;
3373 else
3374 /* We have already called Snarf-documentation, so make a relative
3375 file name for this file, so it can be found properly
3376 in the installed Lisp directory.
3377 We don't use Fexpand_file_name because that would make
3378 the directory absolute now. */
3379 elt = concat2 (build_string ("../lisp/"),
3380 Ffile_name_nondirectory (elt));
3382 else if (EQ (elt, Vload_file_name)
3383 && ! NILP (elt)
3384 && load_force_doc_strings)
3385 doc_reference = 2;
3387 if (ch)
3389 if (flag > 0)
3391 if (ch == ']')
3392 return val;
3393 invalid_syntax (") or . in a vector", 18);
3395 if (ch == ')')
3396 return val;
3397 if (ch == '.')
3399 GCPRO2 (val, tail);
3400 if (!NILP (tail))
3401 XSETCDR (tail, read0 (readcharfun));
3402 else
3403 val = read0 (readcharfun);
3404 read1 (readcharfun, &ch, 0);
3405 UNGCPRO;
3406 if (ch == ')')
3408 if (doc_reference == 1)
3409 return make_number (0);
3410 if (doc_reference == 2)
3412 /* Get a doc string from the file we are loading.
3413 If it's in saved_doc_string, get it from there.
3415 Here, we don't know if the string is a
3416 bytecode string or a doc string. As a
3417 bytecode string must be unibyte, we always
3418 return a unibyte string. If it is actually a
3419 doc string, caller must make it
3420 multibyte. */
3422 int pos = XINT (XCDR (val));
3423 /* Position is negative for user variables. */
3424 if (pos < 0) pos = -pos;
3425 if (pos >= saved_doc_string_position
3426 && pos < (saved_doc_string_position
3427 + saved_doc_string_length))
3429 int start = pos - saved_doc_string_position;
3430 int from, to;
3432 /* Process quoting with ^A,
3433 and find the end of the string,
3434 which is marked with ^_ (037). */
3435 for (from = start, to = start;
3436 saved_doc_string[from] != 037;)
3438 int c = saved_doc_string[from++];
3439 if (c == 1)
3441 c = saved_doc_string[from++];
3442 if (c == 1)
3443 saved_doc_string[to++] = c;
3444 else if (c == '0')
3445 saved_doc_string[to++] = 0;
3446 else if (c == '_')
3447 saved_doc_string[to++] = 037;
3449 else
3450 saved_doc_string[to++] = c;
3453 return make_unibyte_string (saved_doc_string + start,
3454 to - start);
3456 /* Look in prev_saved_doc_string the same way. */
3457 else if (pos >= prev_saved_doc_string_position
3458 && pos < (prev_saved_doc_string_position
3459 + prev_saved_doc_string_length))
3461 int start = pos - prev_saved_doc_string_position;
3462 int from, to;
3464 /* Process quoting with ^A,
3465 and find the end of the string,
3466 which is marked with ^_ (037). */
3467 for (from = start, to = start;
3468 prev_saved_doc_string[from] != 037;)
3470 int c = prev_saved_doc_string[from++];
3471 if (c == 1)
3473 c = prev_saved_doc_string[from++];
3474 if (c == 1)
3475 prev_saved_doc_string[to++] = c;
3476 else if (c == '0')
3477 prev_saved_doc_string[to++] = 0;
3478 else if (c == '_')
3479 prev_saved_doc_string[to++] = 037;
3481 else
3482 prev_saved_doc_string[to++] = c;
3485 return make_unibyte_string (prev_saved_doc_string
3486 + start,
3487 to - start);
3489 else
3490 return get_doc_string (val, 1, 0);
3493 return val;
3495 invalid_syntax (". in wrong context", 18);
3497 invalid_syntax ("] in a list", 11);
3499 tem = (read_pure && flag <= 0
3500 ? pure_cons (elt, Qnil)
3501 : Fcons (elt, Qnil));
3502 if (!NILP (tail))
3503 XSETCDR (tail, tem);
3504 else
3505 val = tem;
3506 tail = tem;
3507 if (defunflag < 0)
3508 defunflag = EQ (elt, Qdefun);
3509 else if (defunflag > 0)
3510 read_pure = 1;
3514 Lisp_Object Vobarray;
3515 Lisp_Object initial_obarray;
3517 /* oblookup stores the bucket number here, for the sake of Funintern. */
3519 int oblookup_last_bucket_number;
3521 static int hash_string (const unsigned char *ptr, int len);
3523 /* Get an error if OBARRAY is not an obarray.
3524 If it is one, return it. */
3526 Lisp_Object
3527 check_obarray (Lisp_Object obarray)
3529 if (!VECTORP (obarray) || XVECTOR (obarray)->size == 0)
3531 /* If Vobarray is now invalid, force it to be valid. */
3532 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray;
3533 wrong_type_argument (Qvectorp, obarray);
3535 return obarray;
3538 /* Intern the C string STR: return a symbol with that name,
3539 interned in the current obarray. */
3541 Lisp_Object
3542 intern (const char *str)
3544 Lisp_Object tem;
3545 int len = strlen (str);
3546 Lisp_Object obarray;
3548 obarray = Vobarray;
3549 if (!VECTORP (obarray) || XVECTOR (obarray)->size == 0)
3550 obarray = check_obarray (obarray);
3551 tem = oblookup (obarray, str, len, len);
3552 if (SYMBOLP (tem))
3553 return tem;
3554 return Fintern (make_string (str, len), obarray);
3557 Lisp_Object
3558 intern_c_string (const char *str)
3560 Lisp_Object tem;
3561 int len = strlen (str);
3562 Lisp_Object obarray;
3564 obarray = Vobarray;
3565 if (!VECTORP (obarray) || XVECTOR (obarray)->size == 0)
3566 obarray = check_obarray (obarray);
3567 tem = oblookup (obarray, str, len, len);
3568 if (SYMBOLP (tem))
3569 return tem;
3571 if (NILP (Vpurify_flag))
3572 /* Creating a non-pure string from a string literal not
3573 implemented yet. We could just use make_string here and live
3574 with the extra copy. */
3575 abort ();
3577 return Fintern (make_pure_c_string (str), obarray);
3580 /* Create an uninterned symbol with name STR. */
3582 Lisp_Object
3583 make_symbol (const char *str)
3585 int len = strlen (str);
3587 return Fmake_symbol (!NILP (Vpurify_flag)
3588 ? make_pure_string (str, len, len, 0)
3589 : make_string (str, len));
3592 DEFUN ("intern", Fintern, Sintern, 1, 2, 0,
3593 doc: /* Return the canonical symbol whose name is STRING.
3594 If there is none, one is created by this function and returned.
3595 A second optional argument specifies the obarray to use;
3596 it defaults to the value of `obarray'. */)
3597 (Lisp_Object string, Lisp_Object obarray)
3599 register Lisp_Object tem, sym, *ptr;
3601 if (NILP (obarray)) obarray = Vobarray;
3602 obarray = check_obarray (obarray);
3604 CHECK_STRING (string);
3606 tem = oblookup (obarray, SDATA (string),
3607 SCHARS (string),
3608 SBYTES (string));
3609 if (!INTEGERP (tem))
3610 return tem;
3612 if (!NILP (Vpurify_flag))
3613 string = Fpurecopy (string);
3614 sym = Fmake_symbol (string);
3616 if (EQ (obarray, initial_obarray))
3617 XSYMBOL (sym)->interned = SYMBOL_INTERNED_IN_INITIAL_OBARRAY;
3618 else
3619 XSYMBOL (sym)->interned = SYMBOL_INTERNED;
3621 if ((SREF (string, 0) == ':')
3622 && EQ (obarray, initial_obarray))
3624 XSYMBOL (sym)->constant = 1;
3625 XSYMBOL (sym)->redirect = SYMBOL_PLAINVAL;
3626 SET_SYMBOL_VAL (XSYMBOL (sym), sym);
3629 ptr = &XVECTOR (obarray)->contents[XINT (tem)];
3630 if (SYMBOLP (*ptr))
3631 XSYMBOL (sym)->next = XSYMBOL (*ptr);
3632 else
3633 XSYMBOL (sym)->next = 0;
3634 *ptr = sym;
3635 return sym;
3638 DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,
3639 doc: /* Return the canonical symbol named NAME, or nil if none exists.
3640 NAME may be a string or a symbol. If it is a symbol, that exact
3641 symbol is searched for.
3642 A second optional argument specifies the obarray to use;
3643 it defaults to the value of `obarray'. */)
3644 (Lisp_Object name, Lisp_Object obarray)
3646 register Lisp_Object tem, string;
3648 if (NILP (obarray)) obarray = Vobarray;
3649 obarray = check_obarray (obarray);
3651 if (!SYMBOLP (name))
3653 CHECK_STRING (name);
3654 string = name;
3656 else
3657 string = SYMBOL_NAME (name);
3659 tem = oblookup (obarray, SDATA (string), SCHARS (string), SBYTES (string));
3660 if (INTEGERP (tem) || (SYMBOLP (name) && !EQ (name, tem)))
3661 return Qnil;
3662 else
3663 return tem;
3666 DEFUN ("unintern", Funintern, Sunintern, 1, 2, 0,
3667 doc: /* Delete the symbol named NAME, if any, from OBARRAY.
3668 The value is t if a symbol was found and deleted, nil otherwise.
3669 NAME may be a string or a symbol. If it is a symbol, that symbol
3670 is deleted, if it belongs to OBARRAY--no other symbol is deleted.
3671 OBARRAY defaults to the value of the variable `obarray'. */)
3672 (Lisp_Object name, Lisp_Object obarray)
3674 register Lisp_Object string, tem;
3675 int hash;
3677 if (NILP (obarray)) obarray = Vobarray;
3678 obarray = check_obarray (obarray);
3680 if (SYMBOLP (name))
3681 string = SYMBOL_NAME (name);
3682 else
3684 CHECK_STRING (name);
3685 string = name;
3688 tem = oblookup (obarray, SDATA (string),
3689 SCHARS (string),
3690 SBYTES (string));
3691 if (INTEGERP (tem))
3692 return Qnil;
3693 /* If arg was a symbol, don't delete anything but that symbol itself. */
3694 if (SYMBOLP (name) && !EQ (name, tem))
3695 return Qnil;
3697 /* There are plenty of other symbols which will screw up the Emacs
3698 session if we unintern them, as well as even more ways to use
3699 `setq' or `fset' or whatnot to make the Emacs session
3700 unusable. Let's not go down this silly road. --Stef */
3701 /* if (EQ (tem, Qnil) || EQ (tem, Qt))
3702 error ("Attempt to unintern t or nil"); */
3704 XSYMBOL (tem)->interned = SYMBOL_UNINTERNED;
3706 hash = oblookup_last_bucket_number;
3708 if (EQ (XVECTOR (obarray)->contents[hash], tem))
3710 if (XSYMBOL (tem)->next)
3711 XSETSYMBOL (XVECTOR (obarray)->contents[hash], XSYMBOL (tem)->next);
3712 else
3713 XSETINT (XVECTOR (obarray)->contents[hash], 0);
3715 else
3717 Lisp_Object tail, following;
3719 for (tail = XVECTOR (obarray)->contents[hash];
3720 XSYMBOL (tail)->next;
3721 tail = following)
3723 XSETSYMBOL (following, XSYMBOL (tail)->next);
3724 if (EQ (following, tem))
3726 XSYMBOL (tail)->next = XSYMBOL (following)->next;
3727 break;
3732 return Qt;
3735 /* Return the symbol in OBARRAY whose names matches the string
3736 of SIZE characters (SIZE_BYTE bytes) at PTR.
3737 If there is no such symbol in OBARRAY, return nil.
3739 Also store the bucket number in oblookup_last_bucket_number. */
3741 Lisp_Object
3742 oblookup (Lisp_Object obarray, register const char *ptr, EMACS_INT size, EMACS_INT size_byte)
3744 int hash;
3745 int obsize;
3746 register Lisp_Object tail;
3747 Lisp_Object bucket, tem;
3749 if (!VECTORP (obarray)
3750 || (obsize = XVECTOR (obarray)->size) == 0)
3752 obarray = check_obarray (obarray);
3753 obsize = XVECTOR (obarray)->size;
3755 /* This is sometimes needed in the middle of GC. */
3756 obsize &= ~ARRAY_MARK_FLAG;
3757 hash = hash_string (ptr, size_byte) % obsize;
3758 bucket = XVECTOR (obarray)->contents[hash];
3759 oblookup_last_bucket_number = hash;
3760 if (EQ (bucket, make_number (0)))
3762 else if (!SYMBOLP (bucket))
3763 error ("Bad data in guts of obarray"); /* Like CADR error message */
3764 else
3765 for (tail = bucket; ; XSETSYMBOL (tail, XSYMBOL (tail)->next))
3767 if (SBYTES (SYMBOL_NAME (tail)) == size_byte
3768 && SCHARS (SYMBOL_NAME (tail)) == size
3769 && !memcmp (SDATA (SYMBOL_NAME (tail)), ptr, size_byte))
3770 return tail;
3771 else if (XSYMBOL (tail)->next == 0)
3772 break;
3774 XSETINT (tem, hash);
3775 return tem;
3778 static int
3779 hash_string (const unsigned char *ptr, int len)
3781 register const unsigned char *p = ptr;
3782 register const unsigned char *end = p + len;
3783 register unsigned char c;
3784 register int hash = 0;
3786 while (p != end)
3788 c = *p++;
3789 if (c >= 0140) c -= 40;
3790 hash = ((hash<<3) + (hash>>28) + c);
3792 return hash & 07777777777;
3795 void
3796 map_obarray (Lisp_Object obarray, void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg)
3798 register int i;
3799 register Lisp_Object tail;
3800 CHECK_VECTOR (obarray);
3801 for (i = XVECTOR (obarray)->size - 1; i >= 0; i--)
3803 tail = XVECTOR (obarray)->contents[i];
3804 if (SYMBOLP (tail))
3805 while (1)
3807 (*fn) (tail, arg);
3808 if (XSYMBOL (tail)->next == 0)
3809 break;
3810 XSETSYMBOL (tail, XSYMBOL (tail)->next);
3815 static void
3816 mapatoms_1 (Lisp_Object sym, Lisp_Object function)
3818 call1 (function, sym);
3821 DEFUN ("mapatoms", Fmapatoms, Smapatoms, 1, 2, 0,
3822 doc: /* Call FUNCTION on every symbol in OBARRAY.
3823 OBARRAY defaults to the value of `obarray'. */)
3824 (Lisp_Object function, Lisp_Object obarray)
3826 if (NILP (obarray)) obarray = Vobarray;
3827 obarray = check_obarray (obarray);
3829 map_obarray (obarray, mapatoms_1, function);
3830 return Qnil;
3833 #define OBARRAY_SIZE 1511
3835 void
3836 init_obarray (void)
3838 Lisp_Object oblength;
3840 XSETFASTINT (oblength, OBARRAY_SIZE);
3842 Vobarray = Fmake_vector (oblength, make_number (0));
3843 initial_obarray = Vobarray;
3844 staticpro (&initial_obarray);
3846 Qunbound = Fmake_symbol (make_pure_c_string ("unbound"));
3847 /* Set temporary dummy values to Qnil and Vpurify_flag to satisfy the
3848 NILP (Vpurify_flag) check in intern_c_string. */
3849 Qnil = make_number (-1); Vpurify_flag = make_number (1);
3850 Qnil = intern_c_string ("nil");
3852 /* Fmake_symbol inits fields of new symbols with Qunbound and Qnil,
3853 so those two need to be fixed manally. */
3854 SET_SYMBOL_VAL (XSYMBOL (Qunbound), Qunbound);
3855 XSYMBOL (Qunbound)->function = Qunbound;
3856 XSYMBOL (Qunbound)->plist = Qnil;
3857 /* XSYMBOL (Qnil)->function = Qunbound; */
3858 SET_SYMBOL_VAL (XSYMBOL (Qnil), Qnil);
3859 XSYMBOL (Qnil)->constant = 1;
3860 XSYMBOL (Qnil)->plist = Qnil;
3862 Qt = intern_c_string ("t");
3863 SET_SYMBOL_VAL (XSYMBOL (Qt), Qt);
3864 XSYMBOL (Qt)->constant = 1;
3866 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */
3867 Vpurify_flag = Qt;
3869 Qvariable_documentation = intern_c_string ("variable-documentation");
3870 staticpro (&Qvariable_documentation);
3872 read_buffer_size = 100 + MAX_MULTIBYTE_LENGTH;
3873 read_buffer = (char *) xmalloc (read_buffer_size);
3876 void
3877 defsubr (struct Lisp_Subr *sname)
3879 Lisp_Object sym;
3880 sym = intern_c_string (sname->symbol_name);
3881 XSETPVECTYPE (sname, PVEC_SUBR);
3882 XSETSUBR (XSYMBOL (sym)->function, sname);
3885 #ifdef NOTDEF /* use fset in subr.el now */
3886 void
3887 defalias (sname, string)
3888 struct Lisp_Subr *sname;
3889 char *string;
3891 Lisp_Object sym;
3892 sym = intern (string);
3893 XSETSUBR (XSYMBOL (sym)->function, sname);
3895 #endif /* NOTDEF */
3897 /* Define an "integer variable"; a symbol whose value is forwarded to a
3898 C variable of type int. Sample call (munged w "xx" to fool make-docfile):
3899 DEFxxVAR_INT ("emacs-priority", &emacs_priority, "Documentation"); */
3900 void
3901 defvar_int (struct Lisp_Intfwd *i_fwd,
3902 const char *namestring, EMACS_INT *address)
3904 Lisp_Object sym;
3905 sym = intern_c_string (namestring);
3906 i_fwd->type = Lisp_Fwd_Int;
3907 i_fwd->intvar = address;
3908 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
3909 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)i_fwd);
3912 /* Similar but define a variable whose value is t if address contains 1,
3913 nil if address contains 0. */
3914 void
3915 defvar_bool (struct Lisp_Boolfwd *b_fwd,
3916 const char *namestring, int *address)
3918 Lisp_Object sym;
3919 sym = intern_c_string (namestring);
3920 b_fwd->type = Lisp_Fwd_Bool;
3921 b_fwd->boolvar = address;
3922 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
3923 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)b_fwd);
3924 Vbyte_boolean_vars = Fcons (sym, Vbyte_boolean_vars);
3927 /* Similar but define a variable whose value is the Lisp Object stored
3928 at address. Two versions: with and without gc-marking of the C
3929 variable. The nopro version is used when that variable will be
3930 gc-marked for some other reason, since marking the same slot twice
3931 can cause trouble with strings. */
3932 void
3933 defvar_lisp_nopro (struct Lisp_Objfwd *o_fwd,
3934 const char *namestring, Lisp_Object *address)
3936 Lisp_Object sym;
3937 sym = intern_c_string (namestring);
3938 o_fwd->type = Lisp_Fwd_Obj;
3939 o_fwd->objvar = address;
3940 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
3941 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)o_fwd);
3944 void
3945 defvar_lisp (struct Lisp_Objfwd *o_fwd,
3946 const char *namestring, Lisp_Object *address)
3948 defvar_lisp_nopro (o_fwd, namestring, address);
3949 staticpro (address);
3952 /* Similar but define a variable whose value is the Lisp Object stored
3953 at a particular offset in the current kboard object. */
3955 void
3956 defvar_kboard (struct Lisp_Kboard_Objfwd *ko_fwd,
3957 const char *namestring, int offset)
3959 Lisp_Object sym;
3960 sym = intern_c_string (namestring);
3961 ko_fwd->type = Lisp_Fwd_Kboard_Obj;
3962 ko_fwd->offset = offset;
3963 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
3964 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)ko_fwd);
3967 /* Record the value of load-path used at the start of dumping
3968 so we can see if the site changed it later during dumping. */
3969 static Lisp_Object dump_path;
3971 void
3972 init_lread (void)
3974 const char *normal;
3975 int turn_off_warning = 0;
3977 /* Compute the default load-path. */
3978 #ifdef CANNOT_DUMP
3979 normal = PATH_LOADSEARCH;
3980 Vload_path = decode_env_path (0, normal);
3981 #else
3982 if (NILP (Vpurify_flag))
3983 normal = PATH_LOADSEARCH;
3984 else
3985 normal = PATH_DUMPLOADSEARCH;
3987 /* In a dumped Emacs, we normally have to reset the value of
3988 Vload_path from PATH_LOADSEARCH, since the value that was dumped
3989 uses ../lisp, instead of the path of the installed elisp
3990 libraries. However, if it appears that Vload_path was changed
3991 from the default before dumping, don't override that value. */
3992 if (initialized)
3994 if (! NILP (Fequal (dump_path, Vload_path)))
3996 Vload_path = decode_env_path (0, normal);
3997 if (!NILP (Vinstallation_directory))
3999 Lisp_Object tem, tem1, sitelisp;
4001 /* Remove site-lisp dirs from path temporarily and store
4002 them in sitelisp, then conc them on at the end so
4003 they're always first in path. */
4004 sitelisp = Qnil;
4005 while (1)
4007 tem = Fcar (Vload_path);
4008 tem1 = Fstring_match (build_string ("site-lisp"),
4009 tem, Qnil);
4010 if (!NILP (tem1))
4012 Vload_path = Fcdr (Vload_path);
4013 sitelisp = Fcons (tem, sitelisp);
4015 else
4016 break;
4019 /* Add to the path the lisp subdir of the
4020 installation dir, if it exists. */
4021 tem = Fexpand_file_name (build_string ("lisp"),
4022 Vinstallation_directory);
4023 tem1 = Ffile_exists_p (tem);
4024 if (!NILP (tem1))
4026 if (NILP (Fmember (tem, Vload_path)))
4028 turn_off_warning = 1;
4029 Vload_path = Fcons (tem, Vload_path);
4032 else
4033 /* That dir doesn't exist, so add the build-time
4034 Lisp dirs instead. */
4035 Vload_path = nconc2 (Vload_path, dump_path);
4037 /* Add leim under the installation dir, if it exists. */
4038 tem = Fexpand_file_name (build_string ("leim"),
4039 Vinstallation_directory);
4040 tem1 = Ffile_exists_p (tem);
4041 if (!NILP (tem1))
4043 if (NILP (Fmember (tem, Vload_path)))
4044 Vload_path = Fcons (tem, Vload_path);
4047 /* Add site-lisp under the installation dir, if it exists. */
4048 tem = Fexpand_file_name (build_string ("site-lisp"),
4049 Vinstallation_directory);
4050 tem1 = Ffile_exists_p (tem);
4051 if (!NILP (tem1))
4053 if (NILP (Fmember (tem, Vload_path)))
4054 Vload_path = Fcons (tem, Vload_path);
4057 /* If Emacs was not built in the source directory,
4058 and it is run from where it was built, add to load-path
4059 the lisp, leim and site-lisp dirs under that directory. */
4061 if (NILP (Fequal (Vinstallation_directory, Vsource_directory)))
4063 Lisp_Object tem2;
4065 tem = Fexpand_file_name (build_string ("src/Makefile"),
4066 Vinstallation_directory);
4067 tem1 = Ffile_exists_p (tem);
4069 /* Don't be fooled if they moved the entire source tree
4070 AFTER dumping Emacs. If the build directory is indeed
4071 different from the source dir, src/Makefile.in and
4072 src/Makefile will not be found together. */
4073 tem = Fexpand_file_name (build_string ("src/Makefile.in"),
4074 Vinstallation_directory);
4075 tem2 = Ffile_exists_p (tem);
4076 if (!NILP (tem1) && NILP (tem2))
4078 tem = Fexpand_file_name (build_string ("lisp"),
4079 Vsource_directory);
4081 if (NILP (Fmember (tem, Vload_path)))
4082 Vload_path = Fcons (tem, Vload_path);
4084 tem = Fexpand_file_name (build_string ("leim"),
4085 Vsource_directory);
4087 if (NILP (Fmember (tem, Vload_path)))
4088 Vload_path = Fcons (tem, Vload_path);
4090 tem = Fexpand_file_name (build_string ("site-lisp"),
4091 Vsource_directory);
4093 if (NILP (Fmember (tem, Vload_path)))
4094 Vload_path = Fcons (tem, Vload_path);
4097 if (!NILP (sitelisp))
4098 Vload_path = nconc2 (Fnreverse (sitelisp), Vload_path);
4102 else
4104 /* NORMAL refers to the lisp dir in the source directory. */
4105 /* We used to add ../lisp at the front here, but
4106 that caused trouble because it was copied from dump_path
4107 into Vload_path, above, when Vinstallation_directory was non-nil.
4108 It should be unnecessary. */
4109 Vload_path = decode_env_path (0, normal);
4110 dump_path = Vload_path;
4112 #endif
4114 #if (!(defined (WINDOWSNT) || (defined (HAVE_NS))))
4115 /* When Emacs is invoked over network shares on NT, PATH_LOADSEARCH is
4116 almost never correct, thereby causing a warning to be printed out that
4117 confuses users. Since PATH_LOADSEARCH is always overridden by the
4118 EMACSLOADPATH environment variable below, disable the warning on NT. */
4120 /* Warn if dirs in the *standard* path don't exist. */
4121 if (!turn_off_warning)
4123 Lisp_Object path_tail;
4125 for (path_tail = Vload_path;
4126 !NILP (path_tail);
4127 path_tail = XCDR (path_tail))
4129 Lisp_Object dirfile;
4130 dirfile = Fcar (path_tail);
4131 if (STRINGP (dirfile))
4133 dirfile = Fdirectory_file_name (dirfile);
4134 if (access (SDATA (dirfile), 0) < 0)
4135 dir_warning ("Warning: Lisp directory `%s' does not exist.\n",
4136 XCAR (path_tail));
4140 #endif /* !(WINDOWSNT || HAVE_NS) */
4142 /* If the EMACSLOADPATH environment variable is set, use its value.
4143 This doesn't apply if we're dumping. */
4144 #ifndef CANNOT_DUMP
4145 if (NILP (Vpurify_flag)
4146 && egetenv ("EMACSLOADPATH"))
4147 #endif
4148 Vload_path = decode_env_path ("EMACSLOADPATH", normal);
4150 Vvalues = Qnil;
4152 load_in_progress = 0;
4153 Vload_file_name = Qnil;
4155 load_descriptor_list = Qnil;
4157 Vstandard_input = Qt;
4158 Vloads_in_progress = Qnil;
4161 /* Print a warning, using format string FORMAT, that directory DIRNAME
4162 does not exist. Print it on stderr and put it in *Messages*. */
4164 void
4165 dir_warning (const char *format, Lisp_Object dirname)
4167 char *buffer
4168 = (char *) alloca (SCHARS (dirname) + strlen (format) + 5);
4170 fprintf (stderr, format, SDATA (dirname));
4171 sprintf (buffer, format, SDATA (dirname));
4172 /* Don't log the warning before we've initialized!! */
4173 if (initialized)
4174 message_dolog (buffer, strlen (buffer), 0, STRING_MULTIBYTE (dirname));
4177 void
4178 syms_of_lread (void)
4180 defsubr (&Sread);
4181 defsubr (&Sread_from_string);
4182 defsubr (&Sintern);
4183 defsubr (&Sintern_soft);
4184 defsubr (&Sunintern);
4185 defsubr (&Sget_load_suffixes);
4186 defsubr (&Sload);
4187 defsubr (&Seval_buffer);
4188 defsubr (&Seval_region);
4189 defsubr (&Sread_char);
4190 defsubr (&Sread_char_exclusive);
4191 defsubr (&Sread_event);
4192 defsubr (&Sget_file_char);
4193 defsubr (&Smapatoms);
4194 defsubr (&Slocate_file_internal);
4196 DEFVAR_LISP ("obarray", &Vobarray,
4197 doc: /* Symbol table for use by `intern' and `read'.
4198 It is a vector whose length ought to be prime for best results.
4199 The vector's contents don't make sense if examined from Lisp programs;
4200 to find all the symbols in an obarray, use `mapatoms'. */);
4202 DEFVAR_LISP ("values", &Vvalues,
4203 doc: /* List of values of all expressions which were read, evaluated and printed.
4204 Order is reverse chronological. */);
4206 DEFVAR_LISP ("standard-input", &Vstandard_input,
4207 doc: /* Stream for read to get input from.
4208 See documentation of `read' for possible values. */);
4209 Vstandard_input = Qt;
4211 DEFVAR_LISP ("read-with-symbol-positions", &Vread_with_symbol_positions,
4212 doc: /* If non-nil, add position of read symbols to `read-symbol-positions-list'.
4214 If this variable is a buffer, then only forms read from that buffer
4215 will be added to `read-symbol-positions-list'.
4216 If this variable is t, then all read forms will be added.
4217 The effect of all other values other than nil are not currently
4218 defined, although they may be in the future.
4220 The positions are relative to the last call to `read' or
4221 `read-from-string'. It is probably a bad idea to set this variable at
4222 the toplevel; bind it instead. */);
4223 Vread_with_symbol_positions = Qnil;
4225 DEFVAR_LISP ("read-symbol-positions-list", &Vread_symbol_positions_list,
4226 doc: /* A list mapping read symbols to their positions.
4227 This variable is modified during calls to `read' or
4228 `read-from-string', but only when `read-with-symbol-positions' is
4229 non-nil.
4231 Each element of the list looks like (SYMBOL . CHAR-POSITION), where
4232 CHAR-POSITION is an integer giving the offset of that occurrence of the
4233 symbol from the position where `read' or `read-from-string' started.
4235 Note that a symbol will appear multiple times in this list, if it was
4236 read multiple times. The list is in the same order as the symbols
4237 were read in. */);
4238 Vread_symbol_positions_list = Qnil;
4240 DEFVAR_LISP ("read-circle", &Vread_circle,
4241 doc: /* Non-nil means read recursive structures using #N= and #N# syntax. */);
4242 Vread_circle = Qt;
4244 DEFVAR_LISP ("load-path", &Vload_path,
4245 doc: /* *List of directories to search for files to load.
4246 Each element is a string (directory name) or nil (try default directory).
4247 Initialized based on EMACSLOADPATH environment variable, if any,
4248 otherwise to default specified by file `epaths.h' when Emacs was built. */);
4250 DEFVAR_LISP ("load-suffixes", &Vload_suffixes,
4251 doc: /* List of suffixes for (compiled or source) Emacs Lisp files.
4252 This list should not include the empty string.
4253 `load' and related functions try to append these suffixes, in order,
4254 to the specified file name if a Lisp suffix is allowed or required. */);
4255 Vload_suffixes = Fcons (make_pure_c_string (".elc"),
4256 Fcons (make_pure_c_string (".el"), Qnil));
4257 DEFVAR_LISP ("load-file-rep-suffixes", &Vload_file_rep_suffixes,
4258 doc: /* List of suffixes that indicate representations of \
4259 the same file.
4260 This list should normally start with the empty string.
4262 Enabling Auto Compression mode appends the suffixes in
4263 `jka-compr-load-suffixes' to this list and disabling Auto Compression
4264 mode removes them again. `load' and related functions use this list to
4265 determine whether they should look for compressed versions of a file
4266 and, if so, which suffixes they should try to append to the file name
4267 in order to do so. However, if you want to customize which suffixes
4268 the loading functions recognize as compression suffixes, you should
4269 customize `jka-compr-load-suffixes' rather than the present variable. */);
4270 Vload_file_rep_suffixes = Fcons (empty_unibyte_string, Qnil);
4272 DEFVAR_BOOL ("load-in-progress", &load_in_progress,
4273 doc: /* Non-nil if inside of `load'. */);
4274 Qload_in_progress = intern_c_string ("load-in-progress");
4275 staticpro (&Qload_in_progress);
4277 DEFVAR_LISP ("after-load-alist", &Vafter_load_alist,
4278 doc: /* An alist of expressions to be evalled when particular files are loaded.
4279 Each element looks like (REGEXP-OR-FEATURE FORMS...).
4281 REGEXP-OR-FEATURE is either a regular expression to match file names, or
4282 a symbol \(a feature name).
4284 When `load' is run and the file-name argument matches an element's
4285 REGEXP-OR-FEATURE, or when `provide' is run and provides the symbol
4286 REGEXP-OR-FEATURE, the FORMS in the element are executed.
4288 An error in FORMS does not undo the load, but does prevent execution of
4289 the rest of the FORMS. */);
4290 Vafter_load_alist = Qnil;
4292 DEFVAR_LISP ("load-history", &Vload_history,
4293 doc: /* Alist mapping loaded file names to symbols and features.
4294 Each alist element should be a list (FILE-NAME ENTRIES...), where
4295 FILE-NAME is the name of a file that has been loaded into Emacs.
4296 The file name is absolute and true (i.e. it doesn't contain symlinks).
4297 As an exception, one of the alist elements may have FILE-NAME nil,
4298 for symbols and features not associated with any file.
4300 The remaining ENTRIES in the alist element describe the functions and
4301 variables defined in that file, the features provided, and the
4302 features required. Each entry has the form `(provide . FEATURE)',
4303 `(require . FEATURE)', `(defun . FUNCTION)', `(autoload . SYMBOL)',
4304 `(defface . SYMBOL)', or `(t . SYMBOL)'. In addition, an entry `(t
4305 . SYMBOL)' may precede an entry `(defun . FUNCTION)', and means that
4306 SYMBOL was an autoload before this file redefined it as a function.
4308 During preloading, the file name recorded is relative to the main Lisp
4309 directory. These file names are converted to absolute at startup. */);
4310 Vload_history = Qnil;
4312 DEFVAR_LISP ("load-file-name", &Vload_file_name,
4313 doc: /* Full name of file being loaded by `load'. */);
4314 Vload_file_name = Qnil;
4316 DEFVAR_LISP ("user-init-file", &Vuser_init_file,
4317 doc: /* File name, including directory, of user's initialization file.
4318 If the file loaded had extension `.elc', and the corresponding source file
4319 exists, this variable contains the name of source file, suitable for use
4320 by functions like `custom-save-all' which edit the init file.
4321 While Emacs loads and evaluates the init file, value is the real name
4322 of the file, regardless of whether or not it has the `.elc' extension. */);
4323 Vuser_init_file = Qnil;
4325 DEFVAR_LISP ("current-load-list", &Vcurrent_load_list,
4326 doc: /* Used for internal purposes by `load'. */);
4327 Vcurrent_load_list = Qnil;
4329 DEFVAR_LISP ("load-read-function", &Vload_read_function,
4330 doc: /* Function used by `load' and `eval-region' for reading expressions.
4331 The default is nil, which means use the function `read'. */);
4332 Vload_read_function = Qnil;
4334 DEFVAR_LISP ("load-source-file-function", &Vload_source_file_function,
4335 doc: /* Function called in `load' for loading an Emacs Lisp source file.
4336 This function is for doing code conversion before reading the source file.
4337 If nil, loading is done without any code conversion.
4338 Arguments are FULLNAME, FILE, NOERROR, NOMESSAGE, where
4339 FULLNAME is the full name of FILE.
4340 See `load' for the meaning of the remaining arguments. */);
4341 Vload_source_file_function = Qnil;
4343 DEFVAR_BOOL ("load-force-doc-strings", &load_force_doc_strings,
4344 doc: /* Non-nil means `load' should force-load all dynamic doc strings.
4345 This is useful when the file being loaded is a temporary copy. */);
4346 load_force_doc_strings = 0;
4348 DEFVAR_BOOL ("load-convert-to-unibyte", &load_convert_to_unibyte,
4349 doc: /* Non-nil means `read' converts strings to unibyte whenever possible.
4350 This is normally bound by `load' and `eval-buffer' to control `read',
4351 and is not meant for users to change. */);
4352 load_convert_to_unibyte = 0;
4354 DEFVAR_LISP ("source-directory", &Vsource_directory,
4355 doc: /* Directory in which Emacs sources were found when Emacs was built.
4356 You cannot count on them to still be there! */);
4357 Vsource_directory
4358 = Fexpand_file_name (build_string ("../"),
4359 Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH)));
4361 DEFVAR_LISP ("preloaded-file-list", &Vpreloaded_file_list,
4362 doc: /* List of files that were preloaded (when dumping Emacs). */);
4363 Vpreloaded_file_list = Qnil;
4365 DEFVAR_LISP ("byte-boolean-vars", &Vbyte_boolean_vars,
4366 doc: /* List of all DEFVAR_BOOL variables, used by the byte code optimizer. */);
4367 Vbyte_boolean_vars = Qnil;
4369 DEFVAR_BOOL ("load-dangerous-libraries", &load_dangerous_libraries,
4370 doc: /* Non-nil means load dangerous compiled Lisp files.
4371 Some versions of XEmacs use different byte codes than Emacs. These
4372 incompatible byte codes can make Emacs crash when it tries to execute
4373 them. */);
4374 load_dangerous_libraries = 0;
4376 DEFVAR_BOOL ("force-load-messages", &force_load_messages,
4377 doc: /* Non-nil means force printing messages when loading Lisp files.
4378 This overrides the value of the NOMESSAGE argument to `load'. */);
4379 force_load_messages = 0;
4381 DEFVAR_LISP ("bytecomp-version-regexp", &Vbytecomp_version_regexp,
4382 doc: /* Regular expression matching safe to load compiled Lisp files.
4383 When Emacs loads a compiled Lisp file, it reads the first 512 bytes
4384 from the file, and matches them against this regular expression.
4385 When the regular expression matches, the file is considered to be safe
4386 to load. See also `load-dangerous-libraries'. */);
4387 Vbytecomp_version_regexp
4388 = make_pure_c_string ("^;;;.\\(in Emacs version\\|bytecomp version FSF\\)");
4390 DEFVAR_LISP ("eval-buffer-list", &Veval_buffer_list,
4391 doc: /* List of buffers being read from by calls to `eval-buffer' and `eval-region'. */);
4392 Veval_buffer_list = Qnil;
4394 DEFVAR_LISP ("old-style-backquotes", &Vold_style_backquotes,
4395 doc: /* Set to non-nil when `read' encounters an old-style backquote. */);
4396 Vold_style_backquotes = Qnil;
4397 Qold_style_backquotes = intern_c_string ("old-style-backquotes");
4398 staticpro (&Qold_style_backquotes);
4400 /* Vsource_directory was initialized in init_lread. */
4402 load_descriptor_list = Qnil;
4403 staticpro (&load_descriptor_list);
4405 Qcurrent_load_list = intern_c_string ("current-load-list");
4406 staticpro (&Qcurrent_load_list);
4408 Qstandard_input = intern_c_string ("standard-input");
4409 staticpro (&Qstandard_input);
4411 Qread_char = intern_c_string ("read-char");
4412 staticpro (&Qread_char);
4414 Qget_file_char = intern_c_string ("get-file-char");
4415 staticpro (&Qget_file_char);
4417 Qget_emacs_mule_file_char = intern_c_string ("get-emacs-mule-file-char");
4418 staticpro (&Qget_emacs_mule_file_char);
4420 Qload_force_doc_strings = intern_c_string ("load-force-doc-strings");
4421 staticpro (&Qload_force_doc_strings);
4423 Qbackquote = intern_c_string ("`");
4424 staticpro (&Qbackquote);
4425 Qcomma = intern_c_string (",");
4426 staticpro (&Qcomma);
4427 Qcomma_at = intern_c_string (",@");
4428 staticpro (&Qcomma_at);
4429 Qcomma_dot = intern_c_string (",.");
4430 staticpro (&Qcomma_dot);
4432 Qinhibit_file_name_operation = intern_c_string ("inhibit-file-name-operation");
4433 staticpro (&Qinhibit_file_name_operation);
4435 Qascii_character = intern_c_string ("ascii-character");
4436 staticpro (&Qascii_character);
4438 Qfunction = intern_c_string ("function");
4439 staticpro (&Qfunction);
4441 Qload = intern_c_string ("load");
4442 staticpro (&Qload);
4444 Qload_file_name = intern_c_string ("load-file-name");
4445 staticpro (&Qload_file_name);
4447 Qeval_buffer_list = intern_c_string ("eval-buffer-list");
4448 staticpro (&Qeval_buffer_list);
4450 Qfile_truename = intern_c_string ("file-truename");
4451 staticpro (&Qfile_truename) ;
4453 Qdo_after_load_evaluation = intern_c_string ("do-after-load-evaluation");
4454 staticpro (&Qdo_after_load_evaluation) ;
4456 staticpro (&dump_path);
4458 staticpro (&read_objects);
4459 read_objects = Qnil;
4460 staticpro (&seen_list);
4461 seen_list = Qnil;
4463 Vloads_in_progress = Qnil;
4464 staticpro (&Vloads_in_progress);
4466 Qhash_table = intern_c_string ("hash-table");
4467 staticpro (&Qhash_table);
4468 Qdata = intern_c_string ("data");
4469 staticpro (&Qdata);
4470 Qtest = intern_c_string ("test");
4471 staticpro (&Qtest);
4472 Qsize = intern_c_string ("size");
4473 staticpro (&Qsize);
4474 Qweakness = intern_c_string ("weakness");
4475 staticpro (&Qweakness);
4476 Qrehash_size = intern_c_string ("rehash-size");
4477 staticpro (&Qrehash_size);
4478 Qrehash_threshold = intern_c_string ("rehash-threshold");
4479 staticpro (&Qrehash_threshold);