* lisp/minibuffer.el (minibuffer-force-complete): Make the next completion use
[bpt/emacs.git] / src / lread.c
CommitLineData
078e7b4a 1/* Lisp parsing and input streams.
039c6cc3 2
acaf905b 3Copyright (C) 1985-1989, 1993-1995, 1997-2012 Free Software Foundation, Inc.
078e7b4a
JB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
078e7b4a 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
078e7b4a
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
078e7b4a
JB
19
20
98280b76 21#include <config.h>
078e7b4a
JB
22#include <stdio.h>
23#include <sys/types.h>
24#include <sys/stat.h>
25#include <sys/file.h>
2c1b5dbe 26#include <errno.h>
9660f5fc 27#include <limits.h> /* For CHAR_BIT. */
39adff0d 28#include <stat-time.h>
078e7b4a 29#include "lisp.h"
95384e1e 30#include "intervals.h"
1571601b 31#include "character.h"
e5560ff7 32#include "buffer.h"
fe0e03f3 33#include "charset.h"
8792be66 34#include "coding.h"
57bda87a 35#include <epaths.h>
078e7b4a 36#include "commands.h"
e37c0805 37#include "keyboard.h"
428a555e 38#include "frame.h"
7bd279cd 39#include "termhooks.h"
eb191db2 40#include "coding.h"
66cd0949 41#include "blockinput.h"
078e7b4a 42
79051982 43#ifdef MSDOS
79051982
RS
44#include "msdos.h"
45#endif
46
9e059e3f
GM
47#ifdef HAVE_NS
48#include "nsterm.h"
49#endif
50
c1a2f60a 51#include <unistd.h>
078e7b4a 52
c011e9a5
RS
53#ifdef HAVE_SETLOCALE
54#include <locale.h>
55#endif /* HAVE_SETLOCALE */
56
bcdec28b 57#include <fcntl.h>
f7d279f0 58
79cf851c 59#ifdef HAVE_FSEEKO
68c45bf0
PE
60#define file_offset off_t
61#define file_tell ftello
62#else
63#define file_offset long
64#define file_tell ftell
65#endif
66
48def666 67/* Hash table read constants. */
955cbe7b
PE
68static Lisp_Object Qhash_table, Qdata;
69static Lisp_Object Qtest, Qsize;
70static Lisp_Object Qweakness;
71static Lisp_Object Qrehash_size;
72static Lisp_Object Qrehash_threshold;
73
74static Lisp_Object Qread_char, Qget_file_char, Qcurrent_load_list;
75Lisp_Object Qstandard_input;
29208e82 76Lisp_Object Qvariable_documentation;
955cbe7b 77static Lisp_Object Qascii_character, Qload, Qload_file_name;
2b6cae0c 78Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction;
955cbe7b
PE
79static Lisp_Object Qinhibit_file_name_operation;
80static Lisp_Object Qeval_buffer_list;
8be3a09c 81Lisp_Object Qlexical_binding;
955cbe7b 82static Lisp_Object Qfile_truename, Qdo_after_load_evaluation; /* ACM 2006/5/16 */
7bd279cd 83
8792be66
KH
84/* Used instead of Qget_file_char while loading *.elc files compiled
85 by Emacs 21 or older. */
86static Lisp_Object Qget_emacs_mule_file_char;
87
88static Lisp_Object Qload_force_doc_strings;
89
2baf5e76 90static Lisp_Object Qload_in_progress;
ece435a5 91
4ad679f9
EN
92/* The association list of objects read with the #n=object form.
93 Each member of the list has the form (n . object), and is used to
94 look up the object for the corresponding #n# construct.
95 It must be set to nil before all top-level calls to read0. */
1e3890d1 96static Lisp_Object read_objects;
4ad679f9 97
7cded46f 98/* True means READCHAR should read bytes one by one (not character)
8792be66 99 when READCHARFUN is Qget_file_char or Qget_emacs_mule_file_char.
7cded46f
PE
100 This is set by read1 temporarily while handling #@NUMBER. */
101static bool load_each_byte;
8792be66 102
d2c6be7f
RS
103/* List of descriptors now open for Fload. */
104static Lisp_Object load_descriptor_list;
105
b2a30870 106/* File for get_file_char to read from. Use by load. */
078e7b4a
JB
107static FILE *instream;
108
b2a30870 109/* For use within read-from-string (this reader is non-reentrant!!) */
d311d28c
PE
110static ptrdiff_t read_from_string_index;
111static ptrdiff_t read_from_string_index_byte;
112static ptrdiff_t read_from_string_limit;
17634846 113
abb13b09 114/* Number of characters read in the current call to Fread or
48def666 115 Fread_from_string. */
da43f021 116static EMACS_INT readchar_count;
6f7f43d5 117
c15cfd1f 118/* This contains the last string skipped with #@. */
b2a30870
RS
119static char *saved_doc_string;
120/* Length of buffer allocated in saved_doc_string. */
bfbbd7e7 121static ptrdiff_t saved_doc_string_size;
b2a30870 122/* Length of actual data in saved_doc_string. */
bfbbd7e7 123static ptrdiff_t saved_doc_string_length;
b2a30870 124/* This is the file position that string came from. */
68c45bf0 125static file_offset saved_doc_string_position;
b2a30870 126
c15cfd1f
RS
127/* This contains the previous string skipped with #@.
128 We copy it from saved_doc_string when a new string
129 is put in saved_doc_string. */
130static char *prev_saved_doc_string;
131/* Length of buffer allocated in prev_saved_doc_string. */
bfbbd7e7 132static ptrdiff_t prev_saved_doc_string_size;
c15cfd1f 133/* Length of actual data in prev_saved_doc_string. */
bfbbd7e7 134static ptrdiff_t prev_saved_doc_string_length;
c15cfd1f 135/* This is the file position that string came from. */
68c45bf0 136static file_offset prev_saved_doc_string_position;
c15cfd1f 137
7cded46f 138/* True means inside a new-style backquote
17634846 139 with no surrounding parentheses.
7cded46f 140 Fread initializes this to false, so we need not specbind it
17634846 141 or worry about what happens to it when there is an error. */
7cded46f 142static bool new_backquote_flag;
29208e82 143static Lisp_Object Qold_style_backquotes;
7ee3bd7b
GM
144
145/* A list of file names for files being loaded in Fload. Used to
146 check for recursive loads. */
147
9942fa0c 148static Lisp_Object Vloads_in_progress;
7ee3bd7b 149
f57e2426
J
150static int read_emacs_mule_char (int, int (*) (int, Lisp_Object),
151 Lisp_Object);
8792be66 152
7cded46f 153static void readevalloop (Lisp_Object, FILE *, Lisp_Object, bool,
f57e2426
J
154 Lisp_Object, Lisp_Object,
155 Lisp_Object, Lisp_Object);
156static Lisp_Object load_unwind (Lisp_Object);
157static Lisp_Object load_descriptor_unwind (Lisp_Object);
078e7b4a 158\f
8792be66
KH
159/* Functions that read one byte from the current source READCHARFUN
160 or unreads one byte. If the integer argument C is -1, it returns
161 one read byte, or -1 when there's no more byte in the source. If C
162 is 0 or positive, it unreads C, and the return value is not
163 interesting. */
164
f57e2426
J
165static int readbyte_for_lambda (int, Lisp_Object);
166static int readbyte_from_file (int, Lisp_Object);
167static int readbyte_from_string (int, Lisp_Object);
8792be66 168
078e7b4a
JB
169/* Handle unreading and rereading of characters.
170 Write READCHAR to read a character,
fe0e03f3
KH
171 UNREAD(c) to unread c to be read again.
172
8792be66 173 These macros correctly read/unread multibyte characters. */
078e7b4a 174
1202434b 175#define READCHAR readchar (readcharfun, NULL)
078e7b4a
JB
176#define UNREAD(c) unreadchar (readcharfun, c)
177
1202434b
KH
178/* Same as READCHAR but set *MULTIBYTE to the multibyteness of the source. */
179#define READCHAR_REPORT_MULTIBYTE(multibyte) readchar (readcharfun, multibyte)
180
8792be66 181/* When READCHARFUN is Qget_file_char, Qget_emacs_mule_file_char,
8f924df7
KH
182 Qlambda, or a cons, we use this to keep an unread character because
183 a file stream can't handle multibyte-char unreading. The value -1
48def666 184 means that there's no unread character. */
8792be66
KH
185static int unread_char;
186
078e7b4a 187static int
fce31d69 188readchar (Lisp_Object readcharfun, bool *multibyte)
078e7b4a
JB
189{
190 Lisp_Object tem;
95384e1e 191 register int c;
f57e2426 192 int (*readbyte) (int, Lisp_Object);
8792be66
KH
193 unsigned char buf[MAX_MULTIBYTE_LENGTH];
194 int i, len;
7cded46f 195 bool emacs_mule_encoding = 0;
078e7b4a 196
1202434b
KH
197 if (multibyte)
198 *multibyte = 0;
199
abb13b09 200 readchar_count++;
177c0ea7 201
cfff016d 202 if (BUFFERP (readcharfun))
078e7b4a 203 {
bed23cb2 204 register struct buffer *inbuffer = XBUFFER (readcharfun);
078e7b4a 205
d311d28c 206 ptrdiff_t pt_byte = BUF_PT_BYTE (inbuffer);
00a9a935 207
bed23cb2
RS
208 if (pt_byte >= BUF_ZV_BYTE (inbuffer))
209 return -1;
078e7b4a 210
4b4deea2 211 if (! NILP (BVAR (inbuffer, enable_multibyte_characters)))
bed23cb2 212 {
00a9a935 213 /* Fetch the character code from the buffer. */
bed23cb2
RS
214 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, pt_byte);
215 BUF_INC_POS (inbuffer, pt_byte);
62a6e103 216 c = STRING_CHAR (p);
1202434b
KH
217 if (multibyte)
218 *multibyte = 1;
bed23cb2
RS
219 }
220 else
221 {
222 c = BUF_FETCH_BYTE (inbuffer, pt_byte);
8792be66
KH
223 if (! ASCII_BYTE_P (c))
224 c = BYTE8_TO_CHAR (c);
bed23cb2 225 pt_byte++;
6f7f43d5 226 }
bed23cb2 227 SET_BUF_PT_BOTH (inbuffer, BUF_PT (inbuffer) + 1, pt_byte);
6f7f43d5 228
bed23cb2 229 return c;
078e7b4a 230 }
cfff016d 231 if (MARKERP (readcharfun))
078e7b4a 232 {
bed23cb2 233 register struct buffer *inbuffer = XMARKER (readcharfun)->buffer;
078e7b4a 234
d311d28c 235 ptrdiff_t bytepos = marker_byte_position (readcharfun);
00a9a935 236
bed23cb2
RS
237 if (bytepos >= BUF_ZV_BYTE (inbuffer))
238 return -1;
6f7f43d5 239
4b4deea2 240 if (! NILP (BVAR (inbuffer, enable_multibyte_characters)))
bed23cb2 241 {
00a9a935 242 /* Fetch the character code from the buffer. */
bed23cb2
RS
243 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, bytepos);
244 BUF_INC_POS (inbuffer, bytepos);
62a6e103 245 c = STRING_CHAR (p);
1202434b
KH
246 if (multibyte)
247 *multibyte = 1;
bed23cb2
RS
248 }
249 else
250 {
251 c = BUF_FETCH_BYTE (inbuffer, bytepos);
8792be66
KH
252 if (! ASCII_BYTE_P (c))
253 c = BYTE8_TO_CHAR (c);
bed23cb2 254 bytepos++;
6f7f43d5
RS
255 }
256
bed23cb2
RS
257 XMARKER (readcharfun)->bytepos = bytepos;
258 XMARKER (readcharfun)->charpos++;
259
260 return c;
078e7b4a 261 }
ad0153e4
RS
262
263 if (EQ (readcharfun, Qlambda))
8792be66
KH
264 {
265 readbyte = readbyte_for_lambda;
266 goto read_multibyte;
267 }
ad0153e4 268
078e7b4a 269 if (EQ (readcharfun, Qget_file_char))
2c1b5dbe 270 {
8792be66
KH
271 readbyte = readbyte_from_file;
272 goto read_multibyte;
2c1b5dbe 273 }
078e7b4a 274
cfff016d 275 if (STRINGP (readcharfun))
078e7b4a 276 {
bed23cb2 277 if (read_from_string_index >= read_from_string_limit)
078e7b4a 278 c = -1;
1202434b
KH
279 else if (STRING_MULTIBYTE (readcharfun))
280 {
281 if (multibyte)
282 *multibyte = 1;
283 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, readcharfun,
284 read_from_string_index,
285 read_from_string_index_byte);
286 }
f0354c03 287 else
1202434b
KH
288 {
289 c = SREF (readcharfun, read_from_string_index_byte);
290 read_from_string_index++;
291 read_from_string_index_byte++;
292 }
078e7b4a
JB
293 return c;
294 }
295
8792be66
KH
296 if (CONSP (readcharfun))
297 {
298 /* This is the case that read_vector is reading from a unibyte
299 string that contains a byte sequence previously skipped
300 because of #@NUMBER. The car part of readcharfun is that
301 string, and the cdr part is a value of readcharfun given to
302 read_vector. */
303 readbyte = readbyte_from_string;
304 if (EQ (XCDR (readcharfun), Qget_emacs_mule_file_char))
305 emacs_mule_encoding = 1;
306 goto read_multibyte;
307 }
8f924df7 308
8792be66
KH
309 if (EQ (readcharfun, Qget_emacs_mule_file_char))
310 {
311 readbyte = readbyte_from_file;
312 emacs_mule_encoding = 1;
313 goto read_multibyte;
314 }
078e7b4a
JB
315
316 tem = call0 (readcharfun);
317
265a9e55 318 if (NILP (tem))
078e7b4a
JB
319 return -1;
320 return XINT (tem);
8792be66
KH
321
322 read_multibyte:
323 if (unread_char >= 0)
324 {
325 c = unread_char;
326 unread_char = -1;
327 return c;
328 }
329 c = (*readbyte) (-1, readcharfun);
1202434b
KH
330 if (c < 0 || load_each_byte)
331 return c;
332 if (multibyte)
333 *multibyte = 1;
334 if (ASCII_BYTE_P (c))
8792be66
KH
335 return c;
336 if (emacs_mule_encoding)
337 return read_emacs_mule_char (c, readbyte, readcharfun);
338 i = 0;
339 buf[i++] = c;
340 len = BYTES_BY_CHAR_HEAD (c);
341 while (i < len)
342 {
343 c = (*readbyte) (-1, readcharfun);
344 if (c < 0 || ! TRAILING_CODE_P (c))
345 {
346 while (--i > 1)
347 (*readbyte) (buf[i], readcharfun);
348 return BYTE8_TO_CHAR (buf[0]);
349 }
350 buf[i++] = c;
351 }
62a6e103 352 return STRING_CHAR (buf);
078e7b4a
JB
353}
354
355/* Unread the character C in the way appropriate for the stream READCHARFUN.
356 If the stream is a user function, call it with the char as argument. */
357
358static void
971de7fb 359unreadchar (Lisp_Object readcharfun, int c)
078e7b4a 360{
abb13b09 361 readchar_count--;
92fddec9
KH
362 if (c == -1)
363 /* Don't back up the pointer if we're unreading the end-of-input mark,
364 since readchar didn't advance it when we read it. */
365 ;
cfff016d 366 else if (BUFFERP (readcharfun))
d7760ca9 367 {
bed23cb2 368 struct buffer *b = XBUFFER (readcharfun);
d311d28c
PE
369 ptrdiff_t charpos = BUF_PT (b);
370 ptrdiff_t bytepos = BUF_PT_BYTE (b);
d7760ca9 371
4b4deea2 372 if (! NILP (BVAR (b, enable_multibyte_characters)))
8792be66 373 BUF_DEC_POS (b, bytepos);
bed23cb2 374 else
8792be66 375 bytepos--;
d7760ca9 376
cffc6f3b 377 SET_BUF_PT_BOTH (b, charpos - 1, bytepos);
d7760ca9 378 }
cfff016d 379 else if (MARKERP (readcharfun))
d7760ca9 380 {
bed23cb2 381 struct buffer *b = XMARKER (readcharfun)->buffer;
d311d28c 382 ptrdiff_t bytepos = XMARKER (readcharfun)->bytepos;
d7760ca9 383
8792be66 384 XMARKER (readcharfun)->charpos--;
4b4deea2 385 if (! NILP (BVAR (b, enable_multibyte_characters)))
8792be66 386 BUF_DEC_POS (b, bytepos);
bed23cb2 387 else
8792be66 388 bytepos--;
d7760ca9 389
8792be66 390 XMARKER (readcharfun)->bytepos = bytepos;
d7760ca9 391 }
cfff016d 392 else if (STRINGP (readcharfun))
bed23cb2
RS
393 {
394 read_from_string_index--;
395 read_from_string_index_byte
396 = string_char_to_byte (readcharfun, read_from_string_index);
397 }
8792be66
KH
398 else if (CONSP (readcharfun))
399 {
400 unread_char = c;
401 }
ad0153e4 402 else if (EQ (readcharfun, Qlambda))
8792be66
KH
403 {
404 unread_char = c;
405 }
406 else if (EQ (readcharfun, Qget_file_char)
407 || EQ (readcharfun, Qget_emacs_mule_file_char))
408 {
409 if (load_each_byte)
d85d3839 410 {
4d7e6e51 411 block_input ();
d85d3839 412 ungetc (c, instream);
4d7e6e51 413 unblock_input ();
d85d3839 414 }
8792be66
KH
415 else
416 unread_char = c;
417 }
078e7b4a
JB
418 else
419 call1 (readcharfun, make_number (c));
420}
421
8792be66 422static int
971de7fb 423readbyte_for_lambda (int c, Lisp_Object readcharfun)
8792be66
KH
424{
425 return read_bytecode_char (c >= 0);
426}
427
428
429static int
971de7fb 430readbyte_from_file (int c, Lisp_Object readcharfun)
8792be66
KH
431{
432 if (c >= 0)
433 {
4d7e6e51 434 block_input ();
8792be66 435 ungetc (c, instream);
4d7e6e51 436 unblock_input ();
8792be66
KH
437 return 0;
438 }
439
4d7e6e51 440 block_input ();
8792be66 441 c = getc (instream);
d85d3839 442
8792be66 443#ifdef EINTR
48def666 444 /* Interrupted reads have been observed while reading over the network. */
d85d3839
MB
445 while (c == EOF && ferror (instream) && errno == EINTR)
446 {
4d7e6e51 447 unblock_input ();
d85d3839 448 QUIT;
4d7e6e51 449 block_input ();
57cb2e6f 450 clearerr (instream);
d85d3839 451 c = getc (instream);
66cd0949 452 }
8792be66 453#endif
d85d3839 454
4d7e6e51 455 unblock_input ();
57cb2e6f 456
8792be66
KH
457 return (c == EOF ? -1 : c);
458}
459
460static int
971de7fb 461readbyte_from_string (int c, Lisp_Object readcharfun)
8792be66
KH
462{
463 Lisp_Object string = XCAR (readcharfun);
464
465 if (c >= 0)
466 {
467 read_from_string_index--;
468 read_from_string_index_byte
469 = string_char_to_byte (string, read_from_string_index);
470 }
8f924df7 471
8792be66
KH
472 if (read_from_string_index >= read_from_string_limit)
473 c = -1;
474 else
475 FETCH_STRING_CHAR_ADVANCE (c, string,
476 read_from_string_index,
477 read_from_string_index_byte);
478 return c;
479}
480
481
482/* Read one non-ASCII character from INSTREAM. The character is
483 encoded in `emacs-mule' and the first byte is already read in
484 C. */
485
8792be66 486static int
971de7fb 487read_emacs_mule_char (int c, int (*readbyte) (int, Lisp_Object), Lisp_Object readcharfun)
8792be66
KH
488{
489 /* Emacs-mule coding uses at most 4-byte for one character. */
490 unsigned char buf[4];
491 int len = emacs_mule_bytes[c];
492 struct charset *charset;
493 int i;
494 unsigned code;
495
496 if (len == 1)
497 /* C is not a valid leading-code of `emacs-mule'. */
498 return BYTE8_TO_CHAR (c);
499
500 i = 0;
501 buf[i++] = c;
502 while (i < len)
503 {
504 c = (*readbyte) (-1, readcharfun);
505 if (c < 0xA0)
506 {
507 while (--i > 1)
508 (*readbyte) (buf[i], readcharfun);
509 return BYTE8_TO_CHAR (buf[0]);
510 }
511 buf[i++] = c;
512 }
513
514 if (len == 2)
515 {
b84ae584 516 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[0]]);
8792be66
KH
517 code = buf[1] & 0x7F;
518 }
519 else if (len == 3)
520 {
521 if (buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_11
522 || buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_12)
523 {
b84ae584 524 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[1]]);
8792be66
KH
525 code = buf[2] & 0x7F;
526 }
527 else
528 {
b84ae584 529 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[0]]);
8792be66
KH
530 code = ((buf[1] << 8) | buf[2]) & 0x7F7F;
531 }
532 }
533 else
534 {
b84ae584 535 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[1]]);
8f924df7 536 code = ((buf[2] << 8) | buf[3]) & 0x7F7F;
8792be66
KH
537 }
538 c = DECODE_CHAR (charset, code);
539 if (c < 0)
540 Fsignal (Qinvalid_read_syntax,
541 Fcons (build_string ("invalid multibyte form"), Qnil));
542 return c;
543}
544
545
f57e2426
J
546static Lisp_Object read_internal_start (Lisp_Object, Lisp_Object,
547 Lisp_Object);
548static Lisp_Object read0 (Lisp_Object);
7cded46f 549static Lisp_Object read1 (Lisp_Object, int *, bool);
abb13b09 550
7cded46f
PE
551static Lisp_Object read_list (bool, Lisp_Object);
552static Lisp_Object read_vector (Lisp_Object, bool);
abb13b09 553
f57e2426
J
554static Lisp_Object substitute_object_recurse (Lisp_Object, Lisp_Object,
555 Lisp_Object);
556static void substitute_object_in_subtree (Lisp_Object,
557 Lisp_Object);
558static void substitute_in_interval (INTERVAL, Lisp_Object);
9e062b6c 559
078e7b4a 560\f
bed23cb2 561/* Get a character from the tty. */
078e7b4a 562
f42be754
JB
563/* Read input events until we get one that's acceptable for our purposes.
564
7cded46f 565 If NO_SWITCH_FRAME, switch-frame events are stashed
f42be754
JB
566 until we get a character we like, and then stuffed into
567 unread_switch_frame.
568
7cded46f 569 If ASCII_REQUIRED, check function key events to see
f42be754
JB
570 if the unmodified version of the symbol has a Qascii_character
571 property, and use that character, if present.
572
7cded46f
PE
573 If ERROR_NONASCII, signal an error if the input we
574 get isn't an ASCII character with modifiers. If it's false but
575 ASCII_REQUIRED is true, just re-read until we get an ASCII
bb49a192
RS
576 character.
577
7cded46f 578 If INPUT_METHOD, invoke the current input method
50e48299
CY
579 if the character warrants that.
580
7cded46f 581 If SECONDS is a number, wait that many seconds for input, and
50e48299 582 return Qnil if no input arrives within that time. */
cc39bc38 583
2f7c71a1 584static Lisp_Object
7cded46f
PE
585read_filtered_event (bool no_switch_frame, bool ascii_required,
586 bool error_nonascii, bool input_method, Lisp_Object seconds)
f42be754 587{
4332cf50 588 Lisp_Object val, delayed_switch_frame;
50e48299 589 EMACS_TIME end_time;
153a17b7 590
5dbf89bc 591#ifdef HAVE_WINDOW_SYSTEM
df6c90d8
GM
592 if (display_hourglass_p)
593 cancel_hourglass ();
5dbf89bc 594#endif
177c0ea7 595
153a17b7 596 delayed_switch_frame = Qnil;
f42be754 597
50e48299
CY
598 /* Compute timeout. */
599 if (NUMBERP (seconds))
600 {
51d8b30e 601 double duration = extract_float (seconds);
d35af63c 602 EMACS_TIME wait_time = EMACS_TIME_FROM_DOUBLE (duration);
e9a9ae03 603 end_time = add_emacs_time (current_emacs_time (), wait_time);
50e48299
CY
604 }
605
251bc578 606/* Read until we get an acceptable event. */
f42be754 607 retry:
88852d45 608 do
251bc578
KL
609 val = read_char (0, 0, 0, (input_method ? Qnil : Qt), 0,
610 NUMBERP (seconds) ? &end_time : NULL);
9688ff53 611 while (INTEGERP (val) && XINT (val) == -2); /* wrong_kboard_jmpbuf */
f42be754 612
cfff016d 613 if (BUFFERP (val))
6c82d689
KH
614 goto retry;
615
f42be754 616 /* switch-frame events are put off until after the next ASCII
8e6208c5 617 character. This is better than signaling an error just because
f42be754
JB
618 the last characters were typed to a separate minibuffer frame,
619 for example. Eventually, some code which can deal with
620 switch-frame events will read it and process it. */
621 if (no_switch_frame
622 && EVENT_HAS_PARAMETERS (val)
ca77ee45 623 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (val)), Qswitch_frame))
f42be754
JB
624 {
625 delayed_switch_frame = val;
626 goto retry;
627 }
628
50e48299 629 if (ascii_required && !(NUMBERP (seconds) && NILP (val)))
f42be754
JB
630 {
631 /* Convert certain symbols to their ASCII equivalents. */
cfff016d 632 if (SYMBOLP (val))
f42be754 633 {
95384e1e 634 Lisp_Object tem, tem1;
f42be754
JB
635 tem = Fget (val, Qevent_symbol_element_mask);
636 if (!NILP (tem))
637 {
638 tem1 = Fget (Fcar (tem), Qascii_character);
639 /* Merge this symbol's modifier bits
640 with the ASCII equivalent of its basic code. */
641 if (!NILP (tem1))
baf69866 642 XSETFASTINT (val, XINT (tem1) | XINT (Fcar (Fcdr (tem))));
f42be754
JB
643 }
644 }
177c0ea7 645
f42be754 646 /* If we don't have a character now, deal with it appropriately. */
cfff016d 647 if (!INTEGERP (val))
f42be754
JB
648 {
649 if (error_nonascii)
650 {
1ec84625 651 Vunread_command_events = Fcons (val, Qnil);
f42be754
JB
652 error ("Non-character input-event");
653 }
654 else
655 goto retry;
656 }
657 }
658
659 if (! NILP (delayed_switch_frame))
660 unread_switch_frame = delayed_switch_frame;
661
67868d27
PJ
662#if 0
663
5dbf89bc 664#ifdef HAVE_WINDOW_SYSTEM
df6c90d8
GM
665 if (display_hourglass_p)
666 start_hourglass ();
5dbf89bc 667#endif
67868d27
PJ
668
669#endif
670
f42be754 671 return val;
f42be754
JB
672}
673
a7ca3326 674DEFUN ("read-char", Fread_char, Sread_char, 0, 3, 0,
5de38842
PJ
675 doc: /* Read a character from the command input (keyboard or macro).
676It is returned as a number.
fb26c2af
KH
677If the character has modifiers, they are resolved and reflected to the
678character code if possible (e.g. C-SPC -> 0).
679
5de38842
PJ
680If the user generates an event which is not a character (i.e. a mouse
681click or function key event), `read-char' signals an error. As an
fb26c2af
KH
682exception, switch-frame events are put off until non-character events
683can be read.
5de38842
PJ
684If you want to read non-character events, or ignore them, call
685`read-event' or `read-char-exclusive' instead.
686
687If the optional argument PROMPT is non-nil, display that as a prompt.
688If the optional argument INHERIT-INPUT-METHOD is non-nil and some
689input method is turned on in the current buffer, that input method
50e48299
CY
690is used for reading a character.
691If the optional argument SECONDS is non-nil, it should be a number
692specifying the maximum number of seconds to wait for input. If no
693input arrives in that time, return nil. SECONDS may be a
694floating-point value. */)
5842a27b 695 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
078e7b4a 696{
fb26c2af 697 Lisp_Object val;
fb26c2af 698
bb49a192
RS
699 if (! NILP (prompt))
700 message_with_string ("%s", prompt, 0);
fb26c2af 701 val = read_filtered_event (1, 1, 1, ! NILP (inherit_input_method), seconds);
66c410ce
CY
702
703 return (NILP (val) ? Qnil
704 : make_number (char_resolve_modifier_mask (XINT (val))));
078e7b4a
JB
705}
706
a7ca3326 707DEFUN ("read-event", Fread_event, Sread_event, 0, 3, 0,
5de38842
PJ
708 doc: /* Read an event object from the input stream.
709If the optional argument PROMPT is non-nil, display that as a prompt.
710If the optional argument INHERIT-INPUT-METHOD is non-nil and some
711input method is turned on in the current buffer, that input method
50e48299
CY
712is used for reading a character.
713If the optional argument SECONDS is non-nil, it should be a number
714specifying the maximum number of seconds to wait for input. If no
715input arrives in that time, return nil. SECONDS may be a
716floating-point value. */)
5842a27b 717 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
078e7b4a 718{
bb49a192
RS
719 if (! NILP (prompt))
720 message_with_string ("%s", prompt, 0);
50e48299 721 return read_filtered_event (0, 0, 0, ! NILP (inherit_input_method), seconds);
078e7b4a
JB
722}
723
50e48299 724DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 3, 0,
5de38842
PJ
725 doc: /* Read a character from the command input (keyboard or macro).
726It is returned as a number. Non-character events are ignored.
fb26c2af
KH
727If the character has modifiers, they are resolved and reflected to the
728character code if possible (e.g. C-SPC -> 0).
5de38842
PJ
729
730If the optional argument PROMPT is non-nil, display that as a prompt.
731If the optional argument INHERIT-INPUT-METHOD is non-nil and some
732input method is turned on in the current buffer, that input method
50e48299
CY
733is used for reading a character.
734If the optional argument SECONDS is non-nil, it should be a number
735specifying the maximum number of seconds to wait for input. If no
736input arrives in that time, return nil. SECONDS may be a
737floating-point value. */)
5842a27b 738 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
078e7b4a 739{
fb26c2af 740 Lisp_Object val;
fb26c2af 741
bb49a192
RS
742 if (! NILP (prompt))
743 message_with_string ("%s", prompt, 0);
66c410ce 744
fb26c2af 745 val = read_filtered_event (1, 1, 0, ! NILP (inherit_input_method), seconds);
66c410ce
CY
746
747 return (NILP (val) ? Qnil
748 : make_number (char_resolve_modifier_mask (XINT (val))));
078e7b4a 749}
078e7b4a
JB
750
751DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,
5de38842 752 doc: /* Don't use this yourself. */)
5842a27b 753 (void)
078e7b4a
JB
754{
755 register Lisp_Object val;
4d7e6e51 756 block_input ();
1805de4f 757 XSETINT (val, getc (instream));
4d7e6e51 758 unblock_input ();
078e7b4a
JB
759 return val;
760}
da84f340
GM
761
762
550a625e 763\f
b9598260
SM
764
765/* Return true if the lisp code read using READCHARFUN defines a non-nil
766 `lexical-binding' file variable. After returning, the stream is
757140ff
GM
767 positioned following the first line, if it is a comment or #! line,
768 otherwise nothing is read. */
b9598260 769
7cded46f 770static bool
c566235d 771lisp_file_lexically_bound_p (Lisp_Object readcharfun)
b9598260
SM
772{
773 int ch = READCHAR;
757140ff
GM
774
775 if (ch == '#')
776 {
777 ch = READCHAR;
778 if (ch != '!')
779 {
780 UNREAD (ch);
781 UNREAD ('#');
782 return 0;
783 }
784 while (ch != '\n' && ch != EOF)
785 ch = READCHAR;
786 if (ch == '\n') ch = READCHAR;
d2dd3694
GM
787 /* It is OK to leave the position after a #! line, since
788 that is what read1 does. */
757140ff
GM
789 }
790
b9598260
SM
791 if (ch != ';')
792 /* The first line isn't a comment, just give up. */
793 {
794 UNREAD (ch);
795 return 0;
796 }
797 else
798 /* Look for an appropriate file-variable in the first line. */
799 {
7cded46f 800 bool rv = 0;
b9598260
SM
801 enum {
802 NOMINAL, AFTER_FIRST_DASH, AFTER_ASTERIX,
803 } beg_end_state = NOMINAL;
7cded46f 804 bool in_file_vars = 0;
b9598260 805
7200d79c
SM
806#define UPDATE_BEG_END_STATE(ch) \
807 if (beg_end_state == NOMINAL) \
808 beg_end_state = (ch == '-' ? AFTER_FIRST_DASH : NOMINAL); \
809 else if (beg_end_state == AFTER_FIRST_DASH) \
810 beg_end_state = (ch == '*' ? AFTER_ASTERIX : NOMINAL); \
811 else if (beg_end_state == AFTER_ASTERIX) \
812 { \
813 if (ch == '-') \
814 in_file_vars = !in_file_vars; \
815 beg_end_state = NOMINAL; \
b9598260
SM
816 }
817
818 /* Skip until we get to the file vars, if any. */
819 do
820 {
821 ch = READCHAR;
822 UPDATE_BEG_END_STATE (ch);
823 }
824 while (!in_file_vars && ch != '\n' && ch != EOF);
825
826 while (in_file_vars)
827 {
06a0259a 828 char var[100], val[100];
3c346cc3 829 unsigned i;
b9598260
SM
830
831 ch = READCHAR;
832
833 /* Read a variable name. */
834 while (ch == ' ' || ch == '\t')
835 ch = READCHAR;
836
06a0259a 837 i = 0;
db7a0b4f 838 while (ch != ':' && ch != '\n' && ch != EOF && in_file_vars)
b9598260 839 {
06a0259a
PE
840 if (i < sizeof var - 1)
841 var[i++] = ch;
b9598260
SM
842 UPDATE_BEG_END_STATE (ch);
843 ch = READCHAR;
844 }
7200d79c 845
db7a0b4f 846 /* Stop scanning if no colon was found before end marker. */
ad3a2b41 847 if (!in_file_vars || ch == '\n' || ch == EOF)
db7a0b4f
AS
848 break;
849
06a0259a
PE
850 while (i > 0 && (var[i - 1] == ' ' || var[i - 1] == '\t'))
851 i--;
852 var[i] = '\0';
b9598260
SM
853
854 if (ch == ':')
855 {
856 /* Read a variable value. */
857 ch = READCHAR;
858
859 while (ch == ' ' || ch == '\t')
860 ch = READCHAR;
861
06a0259a 862 i = 0;
b9598260
SM
863 while (ch != ';' && ch != '\n' && ch != EOF && in_file_vars)
864 {
06a0259a
PE
865 if (i < sizeof val - 1)
866 val[i++] = ch;
b9598260
SM
867 UPDATE_BEG_END_STATE (ch);
868 ch = READCHAR;
869 }
870 if (! in_file_vars)
ad3a2b41 871 /* The value was terminated by an end-marker, which remove. */
06a0259a
PE
872 i -= 3;
873 while (i > 0 && (val[i - 1] == ' ' || val[i - 1] == '\t'))
874 i--;
875 val[i] = '\0';
b9598260
SM
876
877 if (strcmp (var, "lexical-binding") == 0)
878 /* This is it... */
879 {
880 rv = (strcmp (val, "nil") != 0);
881 break;
882 }
883 }
884 }
885
886 while (ch != '\n' && ch != EOF)
887 ch = READCHAR;
888
889 return rv;
890 }
891}
b9598260 892\f
8792be66 893/* Value is a version number of byte compiled code if the file
c73bd236 894 associated with file descriptor FD is a compiled Lisp file that's
8792be66
KH
895 safe to load. Only files compiled with Emacs are safe to load.
896 Files compiled with XEmacs can lead to a crash in Fbyte_code
897 because of an incompatible change in the byte compiler. */
da84f340
GM
898
899static int
7cded46f 900safe_to_load_version (int fd)
da84f340
GM
901{
902 char buf[512];
903 int nbytes, i;
8f924df7 904 int version = 1;
da84f340
GM
905
906 /* Read the first few bytes from the file, and look for a line
907 specifying the byte compiler version used. */
7cded46f 908 nbytes = emacs_read (fd, buf, sizeof buf);
da84f340
GM
909 if (nbytes > 0)
910 {
da84f340 911 /* Skip to the next newline, skipping over the initial `ELC'
1da3b9e4 912 with NUL bytes following it, but note the version. */
da84f340 913 for (i = 0; i < nbytes && buf[i] != '\n'; ++i)
1da3b9e4 914 if (i == 4)
8792be66 915 version = buf[i];
da84f340 916
e6eb4e9e 917 if (i >= nbytes
927f12da 918 || fast_c_string_match_ignore_case (Vbytecomp_version_regexp,
d923b542 919 buf + i, nbytes - i) < 0)
7cded46f 920 version = 0;
da84f340
GM
921 }
922
923 lseek (fd, 0, SEEK_SET);
7cded46f 924 return version;
da84f340
GM
925}
926
927
7ee3bd7b
GM
928/* Callback for record_unwind_protect. Restore the old load list OLD,
929 after loading a file successfully. */
930
931static Lisp_Object
971de7fb 932record_load_unwind (Lisp_Object old)
7ee3bd7b
GM
933{
934 return Vloads_in_progress = old;
935}
936
164c8bfe
RS
937/* This handler function is used via internal_condition_case_1. */
938
939static Lisp_Object
971de7fb 940load_error_handler (Lisp_Object data)
164c8bfe
RS
941{
942 return Qnil;
943}
7ee3bd7b 944
1d064697 945static Lisp_Object
971de7fb 946load_warn_old_style_backquotes (Lisp_Object file)
1d064697
SM
947{
948 if (!NILP (Vold_style_backquotes))
949 {
b636b4c1 950 Lisp_Object args[2];
18a4a65e 951 args[0] = build_string ("Loading `%s': old-style backquotes detected!");
1d064697
SM
952 args[1] = file;
953 Fmessage (2, args);
954 }
955 return Qnil;
956}
957
a7ca3326 958DEFUN ("get-load-suffixes", Fget_load_suffixes, Sget_load_suffixes, 0, 0, 0,
971a4293
LT
959 doc: /* Return the suffixes that `load' should try if a suffix is \
960required.
961This uses the variables `load-suffixes' and `load-file-rep-suffixes'. */)
5842a27b 962 (void)
971a4293
LT
963{
964 Lisp_Object lst = Qnil, suffixes = Vload_suffixes, suffix, ext;
965 while (CONSP (suffixes))
966 {
967 Lisp_Object exts = Vload_file_rep_suffixes;
968 suffix = XCAR (suffixes);
969 suffixes = XCDR (suffixes);
970 while (CONSP (exts))
971 {
972 ext = XCAR (exts);
973 exts = XCDR (exts);
974 lst = Fcons (concat2 (suffix, ext), lst);
975 }
976 }
977 return Fnreverse (lst);
978}
979
a7ca3326 980DEFUN ("load", Fload, Sload, 1, 5, 0,
5de38842
PJ
981 doc: /* Execute a file of Lisp code named FILE.
982First try FILE with `.elc' appended, then try with `.el',
971a4293 983then try FILE unmodified (the exact suffixes in the exact order are
88852d45 984determined by `load-suffixes'). Environment variable references in
971a4293 985FILE are replaced with their values by calling `substitute-in-file-name'.
5de38842 986This function searches the directories in `load-path'.
971a4293 987
5de38842 988If optional second arg NOERROR is non-nil,
971a4293 989report no error if FILE doesn't exist.
5de38842 990Print messages at start and end of loading unless
beb0b7f9
EZ
991optional third arg NOMESSAGE is non-nil (but `force-load-messages'
992overrides that).
5de38842 993If optional fourth arg NOSUFFIX is non-nil, don't try adding
971a4293 994suffixes `.elc' or `.el' to the specified name FILE.
5de38842 995If optional fifth arg MUST-SUFFIX is non-nil, insist on
971a4293
LT
996the suffix `.elc' or `.el'; don't accept just FILE unless
997it ends in one of those suffixes or includes a directory name.
998
999If this function fails to find a file, it may look for different
1000representations of that file before trying another file.
1001It does so by adding the non-empty suffixes in `load-file-rep-suffixes'
1002to the file name. Emacs uses this feature mainly to find compressed
1003versions of files when Auto Compression mode is enabled.
1004
1005The exact suffixes that this function tries out, in the exact order,
1006are given by the value of the variable `load-file-rep-suffixes' if
1007NOSUFFIX is non-nil and by the return value of the function
1008`get-load-suffixes' if MUST-SUFFIX is non-nil. If both NOSUFFIX and
1009MUST-SUFFIX are nil, this function first tries out the latter suffixes
1010and then the former.
0fc213e9
RS
1011
1012Loading a file records its definitions, and its `provide' and
1013`require' calls, in an element of `load-history' whose
1014car is the file name loaded. See `load-history'.
1015
c7926fe2
EZ
1016While the file is in the process of being loaded, the variable
1017`load-in-progress' is non-nil and the variable `load-file-name'
1018is bound to the file's name.
1019
971a4293 1020Return t if the file exists and loads successfully. */)
5842a27b 1021 (Lisp_Object file, Lisp_Object noerror, Lisp_Object nomessage, Lisp_Object nosuffix, Lisp_Object must_suffix)
078e7b4a
JB
1022{
1023 register FILE *stream;
1024 register int fd = -1;
d311d28c 1025 ptrdiff_t count = SPECPDL_INDEX ();
6bb6da3e
AM
1026 struct gcpro gcpro1, gcpro2, gcpro3;
1027 Lisp_Object found, efound, hist_file_name;
7cded46f
PE
1028 /* True means we printed the ".el is newer" message. */
1029 bool newer = 0;
1030 /* True means we are loading a compiled file. */
1031 bool compiled = 0;
c2225d00 1032 Lisp_Object handler;
7cded46f 1033 bool safe_p = 1;
8ea90aa3 1034 const char *fmode = "r";
6bb6da3e 1035 Lisp_Object tmp[2];
8792be66
KH
1036 int version;
1037
317073d5 1038#ifdef DOS_NT
229ba775 1039 fmode = "rt";
317073d5 1040#endif /* DOS_NT */
078e7b4a 1041
b7826503 1042 CHECK_STRING (file);
078e7b4a 1043
c2225d00 1044 /* If file name is magic, call the handler. */
e61b9b87
SM
1045 /* This shouldn't be necessary any more now that `openp' handles it right.
1046 handler = Ffind_file_name_handler (file, Qload);
1047 if (!NILP (handler))
1048 return call5 (handler, Qload, file, noerror, nomessage, nosuffix); */
c2225d00 1049
07a0bda3
RS
1050 /* Do this after the handler to avoid
1051 the need to gcpro noerror, nomessage and nosuffix.
e61b9b87
SM
1052 (Below here, we care only whether they are nil or not.)
1053 The presence of this call is the result of a historical accident:
6bb6da3e 1054 it used to be in every file-operation and when it got removed
e61b9b87
SM
1055 everywhere, it accidentally stayed here. Since then, enough people
1056 supposedly have things like (load "$PROJECT/foo.el") in their .emacs
1057 that it seemed risky to remove. */
164c8bfe
RS
1058 if (! NILP (noerror))
1059 {
1060 file = internal_condition_case_1 (Fsubstitute_in_file_name, file,
1061 Qt, load_error_handler);
1062 if (NILP (file))
1063 return Qnil;
1064 }
1065 else
1066 file = Fsubstitute_in_file_name (file);
177c0ea7 1067
07a0bda3 1068
078e7b4a 1069 /* Avoid weird lossage with null string as arg,
48def666 1070 since it would try to load a directory as a Lisp file. */
82cb60d3 1071 if (SBYTES (file) > 0)
078e7b4a 1072 {
82cb60d3 1073 ptrdiff_t size = SBYTES (file);
211f7dcd 1074
0fc213e9
RS
1075 found = Qnil;
1076 GCPRO2 (file, found);
211f7dcd
RS
1077
1078 if (! NILP (must_suffix))
1079 {
1080 /* Don't insist on adding a suffix if FILE already ends with one. */
1081 if (size > 3
42a5b22f 1082 && !strcmp (SSDATA (file) + size - 3, ".el"))
211f7dcd
RS
1083 must_suffix = Qnil;
1084 else if (size > 4
42a5b22f 1085 && !strcmp (SSDATA (file) + size - 4, ".elc"))
211f7dcd
RS
1086 must_suffix = Qnil;
1087 /* Don't insist on adding a suffix
1088 if the argument includes a directory name. */
1089 else if (! NILP (Ffile_name_directory (file)))
1090 must_suffix = Qnil;
1091 }
1092
f0a50954 1093 fd = openp (Vload_path, file,
e61b9b87 1094 (!NILP (nosuffix) ? Qnil
971a4293
LT
1095 : !NILP (must_suffix) ? Fget_load_suffixes ()
1096 : Fappend (2, (tmp[0] = Fget_load_suffixes (),
1097 tmp[1] = Vload_file_rep_suffixes,
e61b9b87 1098 tmp))),
86d00812 1099 &found, Qnil);
5a6e5452 1100 UNGCPRO;
078e7b4a
JB
1101 }
1102
96dc0f4e 1103 if (fd == -1)
078e7b4a 1104 {
265a9e55 1105 if (NILP (noerror))
336d4a9c
KS
1106 xsignal2 (Qfile_error, build_string ("Cannot open load file"), file);
1107 return Qnil;
078e7b4a
JB
1108 }
1109
ba0d1195 1110 /* Tell startup.el whether or not we found the user's init file. */
4116ab9f
KH
1111 if (EQ (Qt, Vuser_init_file))
1112 Vuser_init_file = found;
1113
96dc0f4e
MB
1114 /* If FD is -2, that means openp found a magic file. */
1115 if (fd == -2)
74549846 1116 {
5e24a1f7
KH
1117 if (NILP (Fequal (found, file)))
1118 /* If FOUND is a different file name from FILE,
1119 find its handler even if we have already inhibited
1120 the `load' operation on FILE. */
1121 handler = Ffind_file_name_handler (found, Qt);
1122 else
1123 handler = Ffind_file_name_handler (found, Qload);
1124 if (! NILP (handler))
1125 return call5 (handler, Qload, found, noerror, nomessage, Qt);
35774242
EZ
1126#ifdef DOS_NT
1127 /* Tramp has to deal with semi-broken packages that prepend
1128 drive letters to remote files. For that reason, Tramp
1129 catches file operations that test for file existence, which
1130 makes openp think X:/foo.elc files are remote. However,
1131 Tramp does not catch `load' operations for such files, so we
1132 end up with a nil as the `load' handler above. If we would
1133 continue with fd = -2, we will behave wrongly, and in
1134 particular try reading a .elc file in the "rt" mode instead
1135 of "rb". See bug #9311 for the results. To work around
1136 this, we try to open the file locally, and go with that if it
1137 succeeds. */
1138 fd = emacs_open (SSDATA (ENCODE_FILE (found)), O_RDONLY, 0);
1139 if (fd == -1)
1140 fd = -2;
1141#endif
74549846
RS
1142 }
1143
550a625e
GM
1144 /* Check if we're stuck in a recursive load cycle.
1145
1146 2000-09-21: It's not possible to just check for the file loaded
1147 being a member of Vloads_in_progress. This fails because of the
1148 way the byte compiler currently works; `provide's are not
9d438325 1149 evaluated, see font-lock.el/jit-lock.el as an example. This
550a625e
GM
1150 leads to a certain amount of ``normal'' recursion.
1151
1152 Also, just loading a file recursively is not always an error in
1153 the general case; the second load may do something different. */
3ba6fd9a 1154 {
0902fe45 1155 int load_count = 0;
3ba6fd9a
RS
1156 Lisp_Object tem;
1157 for (tem = Vloads_in_progress; CONSP (tem); tem = XCDR (tem))
0902fe45 1158 if (!NILP (Fequal (found, XCAR (tem))) && (++load_count > 3))
8fc45744
JB
1159 {
1160 if (fd >= 0)
1161 emacs_close (fd);
1162 signal_error ("Recursive load", Fcons (found, Vloads_in_progress));
1163 }
3ba6fd9a
RS
1164 record_unwind_protect (record_load_unwind, Vloads_in_progress);
1165 Vloads_in_progress = Fcons (found, Vloads_in_progress);
1166 }
7ee3bd7b 1167
b9598260
SM
1168 /* All loads are by default dynamic, unless the file itself specifies
1169 otherwise using a file-variable in the first line. This is bound here
1170 so that it takes effect whether or not we use
1171 Vload_source_file_function. */
1172 specbind (Qlexical_binding, Qnil);
1173
48def666 1174 /* Get the name for load-history. */
6bb6da3e
AM
1175 hist_file_name = (! NILP (Vpurify_flag)
1176 ? Fconcat (2, (tmp[0] = Ffile_name_directory (file),
1177 tmp[1] = Ffile_name_nondirectory (found),
1178 tmp))
1179 : found) ;
1180
8792be66 1181 version = -1;
1bb9a689 1182
88852d45 1183 /* Check for the presence of old-style quotes and warn about them. */
1d064697
SM
1184 specbind (Qold_style_backquotes, Qnil);
1185 record_unwind_protect (load_warn_old_style_backquotes, file);
1186
72af86bd 1187 if (!memcmp (SDATA (found) + SBYTES (found) - 4, ".elc", 4)
7cded46f 1188 || (fd >= 0 && (version = safe_to_load_version (fd)) > 0))
96dc0f4e
MB
1189 /* Load .elc files directly, but not when they are
1190 remote and have no handler! */
078e7b4a 1191 {
96dc0f4e 1192 if (fd != -2)
da84f340 1193 {
96dc0f4e
MB
1194 struct stat s1, s2;
1195 int result;
da84f340 1196
6bb6da3e 1197 GCPRO3 (file, found, hist_file_name);
0fc213e9 1198
8792be66 1199 if (version < 0
7cded46f 1200 && ! (version = safe_to_load_version (fd)))
96dc0f4e
MB
1201 {
1202 safe_p = 0;
1203 if (!load_dangerous_libraries)
e63304b7
DL
1204 {
1205 if (fd >= 0)
1206 emacs_close (fd);
1207 error ("File `%s' was not compiled in Emacs",
1208 SDATA (found));
1209 }
beb0b7f9 1210 else if (!NILP (nomessage) && !force_load_messages)
96dc0f4e
MB
1211 message_with_string ("File `%s' not compiled in Emacs", found, 1);
1212 }
04fc68e7 1213
96dc0f4e
MB
1214 compiled = 1;
1215
eb191db2
EZ
1216 efound = ENCODE_FILE (found);
1217
26fbf20b 1218#ifdef DOS_NT
96dc0f4e 1219 fmode = "rb";
26fbf20b 1220#endif /* DOS_NT */
e5533da6
PE
1221 result = stat (SSDATA (efound), &s1);
1222 if (result == 0)
1223 {
1224 SSET (efound, SBYTES (efound) - 1, 0);
1225 result = stat (SSDATA (efound), &s2);
1226 SSET (efound, SBYTES (efound) - 1, 'c');
1227 }
eb191db2 1228
39adff0d
PE
1229 if (result == 0
1230 && EMACS_TIME_LT (get_stat_mtime (&s1), get_stat_mtime (&s2)))
96dc0f4e
MB
1231 {
1232 /* Make the progress messages mention that source is newer. */
1233 newer = 1;
04fc68e7 1234
96dc0f4e 1235 /* If we won't print another message, mention this anyway. */
beb0b7f9 1236 if (!NILP (nomessage) && !force_load_messages)
714d8c39 1237 {
0fc213e9
RS
1238 Lisp_Object msg_file;
1239 msg_file = Fsubstring (found, make_number (0), make_number (-1));
714d8c39 1240 message_with_string ("Source file `%s' newer than byte-compiled file",
0fc213e9 1241 msg_file, 1);
714d8c39 1242 }
96dc0f4e 1243 }
0fc213e9 1244 UNGCPRO;
51ac6f83 1245 }
078e7b4a 1246 }
fe0e03f3
KH
1247 else
1248 {
1249 /* We are loading a source file (*.el). */
1250 if (!NILP (Vload_source_file_function))
1251 {
7ee3bd7b 1252 Lisp_Object val;
96dc0f4e
MB
1253
1254 if (fd >= 0)
68c45bf0 1255 emacs_close (fd);
6bb6da3e 1256 val = call4 (Vload_source_file_function, found, hist_file_name,
7ee3bd7b 1257 NILP (noerror) ? Qnil : Qt,
beb0b7f9 1258 (NILP (nomessage) || force_load_messages) ? Qnil : Qt);
7ee3bd7b 1259 return unbind_to (count, val);
fe0e03f3
KH
1260 }
1261 }
078e7b4a 1262
6bb6da3e 1263 GCPRO3 (file, found, hist_file_name);
0fc213e9 1264
229ba775 1265#ifdef WINDOWSNT
eb191db2 1266 efound = ENCODE_FILE (found);
35774242
EZ
1267 /* If we somehow got here with fd == -2, meaning the file is deemed
1268 to be remote, don't even try to reopen the file locally; just
1269 force a failure instead. */
1270 if (fd >= 0)
1271 {
1272 emacs_close (fd);
1273 stream = fopen (SSDATA (efound), fmode);
1274 }
1275 else
1276 stream = NULL;
229ba775
EZ
1277#else /* not WINDOWSNT */
1278 stream = fdopen (fd, fmode);
1279#endif /* not WINDOWSNT */
078e7b4a
JB
1280 if (stream == 0)
1281 {
68c45bf0 1282 emacs_close (fd);
d5db4077 1283 error ("Failure to create stdio stream for %s", SDATA (file));
078e7b4a
JB
1284 }
1285
4b104c41 1286 if (! NILP (Vpurify_flag))
5e617bc2 1287 Vpreloaded_file_list = Fcons (Fpurecopy (file), Vpreloaded_file_list);
4b104c41 1288
beb0b7f9 1289 if (NILP (nomessage) || force_load_messages)
04fc68e7 1290 {
da84f340
GM
1291 if (!safe_p)
1292 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...",
1293 file, 1);
1294 else if (!compiled)
e28552a4 1295 message_with_string ("Loading %s (source)...", file, 1);
db5cae4b 1296 else if (newer)
e28552a4
RS
1297 message_with_string ("Loading %s (compiled; note, source file is newer)...",
1298 file, 1);
db5cae4b 1299 else /* The typical case; compiled file newer than source file. */
e28552a4 1300 message_with_string ("Loading %s...", file, 1);
04fc68e7 1301 }
078e7b4a 1302
c04d9e70 1303 record_unwind_protect (load_unwind, make_save_value (stream, 0));
d2c6be7f 1304 record_unwind_protect (load_descriptor_unwind, load_descriptor_list);
20ea2964 1305 specbind (Qload_file_name, found);
74549846 1306 specbind (Qinhibit_file_name_operation, Qnil);
d2c6be7f
RS
1307 load_descriptor_list
1308 = Fcons (make_number (fileno (stream)), load_descriptor_list);
2baf5e76 1309 specbind (Qload_in_progress, Qt);
b9598260
SM
1310
1311 instream = stream;
1312 if (lisp_file_lexically_bound_p (Qget_file_char))
1313 Fset (Qlexical_binding, Qt);
1314
ab2a47e1 1315 if (! version || version >= 22)
b883cdb2 1316 readevalloop (Qget_file_char, stream, hist_file_name,
defb1411 1317 0, Qnil, Qnil, Qnil, Qnil);
8792be66
KH
1318 else
1319 {
1320 /* We can't handle a file which was compiled with
1321 byte-compile-dynamic by older version of Emacs. */
1322 specbind (Qload_force_doc_strings, Qt);
defb1411 1323 readevalloop (Qget_emacs_mule_file_char, stream, hist_file_name,
768d4533 1324 0, Qnil, Qnil, Qnil, Qnil);
8792be66 1325 }
078e7b4a
JB
1326 unbind_to (count, Qnil);
1327
48def666 1328 /* Run any eval-after-load forms for this file. */
428b13d6 1329 if (!NILP (Ffboundp (Qdo_after_load_evaluation)))
6bb6da3e
AM
1330 call1 (Qdo_after_load_evaluation, hist_file_name) ;
1331
078e7b4a
JB
1332 UNGCPRO;
1333
97dead2d 1334 xfree (saved_doc_string);
b2a30870
RS
1335 saved_doc_string = 0;
1336 saved_doc_string_size = 0;
1337
70fdbb46 1338 xfree (prev_saved_doc_string);
c15cfd1f
RS
1339 prev_saved_doc_string = 0;
1340 prev_saved_doc_string_size = 0;
1341
beb0b7f9 1342 if (!noninteractive && (NILP (nomessage) || force_load_messages))
04fc68e7 1343 {
da84f340
GM
1344 if (!safe_p)
1345 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...done",
1346 file, 1);
1347 else if (!compiled)
e28552a4 1348 message_with_string ("Loading %s (source)...done", file, 1);
db5cae4b 1349 else if (newer)
e28552a4
RS
1350 message_with_string ("Loading %s (compiled; note, source file is newer)...done",
1351 file, 1);
db5cae4b 1352 else /* The typical case; compiled file newer than source file. */
e28552a4 1353 message_with_string ("Loading %s...done", file, 1);
04fc68e7 1354 }
7ee3bd7b 1355
078e7b4a
JB
1356 return Qt;
1357}
1358
1359static Lisp_Object
48def666 1360load_unwind (Lisp_Object arg) /* Used as unwind-protect function in load. */
078e7b4a 1361{
ebfe97a2
KS
1362 FILE *stream = (FILE *) XSAVE_VALUE (arg)->pointer;
1363 if (stream != NULL)
66cd0949 1364 {
4d7e6e51 1365 block_input ();
66cd0949 1366 fclose (stream);
4d7e6e51 1367 unblock_input ();
66cd0949 1368 }
078e7b4a
JB
1369 return Qnil;
1370}
1371
d2c6be7f 1372static Lisp_Object
971de7fb 1373load_descriptor_unwind (Lisp_Object oldlist)
d2c6be7f
RS
1374{
1375 load_descriptor_list = oldlist;
838abf56 1376 return Qnil;
d2c6be7f
RS
1377}
1378
1379/* Close all descriptors in use for Floads.
1380 This is used when starting a subprocess. */
1381
1382void
971de7fb 1383close_load_descs (void)
d2c6be7f 1384{
f3849f25 1385#ifndef WINDOWSNT
d2c6be7f 1386 Lisp_Object tail;
9beb8baa 1387 for (tail = load_descriptor_list; CONSP (tail); tail = XCDR (tail))
68c45bf0 1388 emacs_close (XFASTINT (XCAR (tail)));
f3849f25 1389#endif
d2c6be7f 1390}
078e7b4a 1391\f
7cded46f 1392static bool
971de7fb 1393complete_filename_p (Lisp_Object pathname)
078e7b4a 1394{
7cded46f 1395 const unsigned char *s = SDATA (pathname);
317073d5 1396 return (IS_DIRECTORY_SEP (s[0])
d5db4077 1397 || (SCHARS (pathname) > 2
7c2fb837 1398 && IS_DEVICE_SEP (s[1]) && IS_DIRECTORY_SEP (s[2])));
078e7b4a
JB
1399}
1400
86d00812
SM
1401DEFUN ("locate-file-internal", Flocate_file_internal, Slocate_file_internal, 2, 4, 0,
1402 doc: /* Search for FILENAME through PATH.
57a131fb 1403Returns the file's name in absolute form, or nil if not found.
86d00812
SM
1404If SUFFIXES is non-nil, it should be a list of suffixes to append to
1405file name when searching.
1406If non-nil, PREDICATE is used instead of `file-readable-p'.
e752e0b0 1407PREDICATE can also be an integer to pass to the faccessat(2) function,
aa56f361
SM
1408in which case file-name-handlers are ignored.
1409This function will normally skip directories, so if you want it to find
1410directories, make sure the PREDICATE function returns `dir-ok' for them. */)
5842a27b 1411 (Lisp_Object filename, Lisp_Object path, Lisp_Object suffixes, Lisp_Object predicate)
86d00812
SM
1412{
1413 Lisp_Object file;
1414 int fd = openp (path, filename, suffixes, &file, predicate);
1415 if (NILP (predicate) && fd > 0)
1416 close (fd);
1417 return file;
1418}
1419
aa56f361 1420static Lisp_Object Qdir_ok;
86d00812 1421
078e7b4a
JB
1422/* Search for a file whose name is STR, looking in directories
1423 in the Lisp list PATH, and trying suffixes from SUFFIX.
078e7b4a
JB
1424 On success, returns a file descriptor. On failure, returns -1.
1425
e61b9b87 1426 SUFFIXES is a list of strings containing possible suffixes.
e0f24100 1427 The empty suffix is automatically added if the list is empty.
e61b9b87 1428
86d00812
SM
1429 PREDICATE non-nil means don't open the files,
1430 just look for one that satisfies the predicate. In this case,
1431 returns 1 on success. The predicate can be a lisp function or
1432 an integer to pass to `access' (in which case file-name-handlers
1433 are ignored).
078e7b4a
JB
1434
1435 If STOREPTR is nonzero, it points to a slot where the name of
1436 the file actually found should be stored as a Lisp string.
74549846
RS
1437 nil is stored there on failure.
1438
96dc0f4e 1439 If the file we find is remote, return -2
86d00812 1440 but store the found remote file name in *STOREPTR. */
078e7b4a
JB
1441
1442int
971de7fb 1443openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *storeptr, Lisp_Object predicate)
078e7b4a 1444{
d311d28c 1445 ptrdiff_t fn_size = 100;
078e7b4a 1446 char buf[100];
7cded46f
PE
1447 char *fn = buf;
1448 bool absolute = 0;
d311d28c 1449 ptrdiff_t want_length;
74549846 1450 Lisp_Object filename;
eb191db2
EZ
1451 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
1452 Lisp_Object string, tail, encoded_fn;
d311d28c 1453 ptrdiff_t max_suffix_len = 0;
e61b9b87 1454
6f8eafd1
SM
1455 CHECK_STRING (str);
1456
e61b9b87
SM
1457 for (tail = suffixes; CONSP (tail); tail = XCDR (tail))
1458 {
f5df591a 1459 CHECK_STRING_CAR (tail);
e61b9b87 1460 max_suffix_len = max (max_suffix_len,
d5db4077 1461 SBYTES (XCAR (tail)));
e61b9b87 1462 }
078e7b4a 1463
8b9d426a 1464 string = filename = encoded_fn = Qnil;
eb191db2
EZ
1465 GCPRO6 (str, string, filename, path, suffixes, encoded_fn);
1466
078e7b4a
JB
1467 if (storeptr)
1468 *storeptr = Qnil;
1469
1470 if (complete_filename_p (str))
1471 absolute = 1;
1472
e61b9b87 1473 for (; CONSP (path); path = XCDR (path))
078e7b4a 1474 {
e61b9b87 1475 filename = Fexpand_file_name (str, XCAR (path));
078e7b4a 1476 if (!complete_filename_p (filename))
48def666 1477 /* If there are non-absolute elts in PATH (eg "."). */
078e7b4a 1478 /* Of course, this could conceivably lose if luser sets
48def666 1479 default-directory to be something non-absolute... */
078e7b4a 1480 {
4b4deea2 1481 filename = Fexpand_file_name (filename, BVAR (current_buffer, directory));
078e7b4a 1482 if (!complete_filename_p (filename))
48def666 1483 /* Give up on this path element! */
078e7b4a
JB
1484 continue;
1485 }
1486
640ee02d 1487 /* Calculate maximum length of any filename made from
078e7b4a 1488 this path element/specified file name and any possible suffix. */
640ee02d
PE
1489 want_length = max_suffix_len + SBYTES (filename);
1490 if (fn_size <= want_length)
38182d90 1491 fn = alloca (fn_size = 100 + want_length);
078e7b4a 1492
078e7b4a 1493 /* Loop over suffixes. */
a74d1c97 1494 for (tail = NILP (suffixes) ? Fcons (empty_unibyte_string, Qnil) : suffixes;
e61b9b87 1495 CONSP (tail); tail = XCDR (tail))
078e7b4a 1496 {
cb1caeaf 1497 ptrdiff_t fnlen, lsuffix = SBYTES (XCAR (tail));
74549846 1498 Lisp_Object handler;
078e7b4a 1499
c49afcd7
RS
1500 /* Concatenate path element/specified name with the suffix.
1501 If the directory starts with /:, remove that. */
e99a530f
PE
1502 int prefixlen = ((SCHARS (filename) > 2
1503 && SREF (filename, 0) == '/'
1504 && SREF (filename, 1) == ':')
1505 ? 2 : 0);
1506 fnlen = SBYTES (filename) - prefixlen;
1507 memcpy (fn, SDATA (filename) + prefixlen, fnlen);
1508 memcpy (fn + fnlen, SDATA (XCAR (tail)), lsuffix + 1);
1509 fnlen += lsuffix;
74549846 1510 /* Check that the file exists and is not a directory. */
e61b9b87
SM
1511 /* We used to only check for handlers on non-absolute file names:
1512 if (absolute)
1513 handler = Qnil;
1514 else
1515 handler = Ffind_file_name_handler (filename, Qfile_exists_p);
1516 It's not clear why that was the case and it breaks things like
1517 (load "/bar.el") where the file is actually "/bar.el.gz". */
cb1caeaf 1518 string = make_string (fn, fnlen);
4773b8ca 1519 handler = Ffind_file_name_handler (string, Qfile_exists_p);
86d00812
SM
1520 if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate))
1521 {
e752e0b0 1522 bool exists;
86d00812
SM
1523 if (NILP (predicate))
1524 exists = !NILP (Ffile_readable_p (string));
1525 else
aa56f361
SM
1526 {
1527 Lisp_Object tmp = call1 (predicate, string);
1528 exists = !NILP (tmp)
1529 && (EQ (tmp, Qdir_ok)
aa0f73d1 1530 || NILP (Ffile_directory_p (string)));
aa56f361 1531 }
74549846
RS
1532
1533 if (exists)
078e7b4a
JB
1534 {
1535 /* We succeeded; return this descriptor and filename. */
1536 if (storeptr)
eb191db2 1537 *storeptr = string;
5ef2a3c0 1538 UNGCPRO;
96dc0f4e 1539 return -2;
74549846
RS
1540 }
1541 }
1542 else
1543 {
e752e0b0 1544 int fd;
4b2dd274 1545 const char *pfn;
eb191db2
EZ
1546
1547 encoded_fn = ENCODE_FILE (string);
42a5b22f 1548 pfn = SSDATA (encoded_fn);
74549846 1549
e752e0b0
PE
1550 /* Check that we can access or open it. */
1551 if (NATNUMP (predicate))
1552 fd = (((XFASTINT (predicate) & ~INT_MAX) == 0
1553 && (faccessat (AT_FDCWD, pfn, XFASTINT (predicate),
1554 AT_EACCESS)
1555 == 0)
1556 && ! file_directory_p (pfn))
1557 ? 1 : -1);
1558 else
1559 {
1560 struct stat st;
1561 fd = emacs_open (pfn, O_RDONLY, 0);
1562 if (0 <= fd
1563 && (fstat (fd, &st) != 0 || S_ISDIR (st.st_mode)))
74549846 1564 {
e752e0b0
PE
1565 emacs_close (fd);
1566 fd = -1;
74549846 1567 }
078e7b4a 1568 }
e752e0b0
PE
1569
1570 if (fd >= 0)
1571 {
1572 /* We succeeded; return this descriptor and filename. */
1573 if (storeptr)
1574 *storeptr = string;
1575 UNGCPRO;
1576 return fd;
1577 }
078e7b4a 1578 }
078e7b4a 1579 }
5a6e5452 1580 if (absolute)
5ef2a3c0 1581 break;
078e7b4a
JB
1582 }
1583
5ef2a3c0
KH
1584 UNGCPRO;
1585 return -1;
078e7b4a
JB
1586}
1587
1588\f
ae321d28
RS
1589/* Merge the list we've accumulated of globals from the current input source
1590 into the load_history variable. The details depend on whether
b502a9a1
RS
1591 the source has an associated file name or not.
1592
1593 FILENAME is the file name that we are loading from.
7cded46f
PE
1594
1595 ENTIRE is true if loading that entire file, false if evaluating
1596 part of it. */
ae321d28
RS
1597
1598static void
7cded46f 1599build_load_history (Lisp_Object filename, bool entire)
ae321d28 1600{
7cded46f
PE
1601 Lisp_Object tail, prev, newelt;
1602 Lisp_Object tem, tem2;
1603 bool foundit = 0;
ae321d28
RS
1604
1605 tail = Vload_history;
1606 prev = Qnil;
b502a9a1 1607
86d00812 1608 while (CONSP (tail))
ae321d28 1609 {
86d00812 1610 tem = XCAR (tail);
ae321d28 1611
48def666 1612 /* Find the feature's previous assoc list... */
b502a9a1 1613 if (!NILP (Fequal (filename, Fcar (tem))))
ae321d28
RS
1614 {
1615 foundit = 1;
1616
48def666 1617 /* If we're loading the entire file, remove old data. */
b502a9a1 1618 if (entire)
86d00812 1619 {
ae321d28 1620 if (NILP (prev))
86d00812 1621 Vload_history = XCDR (tail);
ae321d28 1622 else
86d00812 1623 Fsetcdr (prev, XCDR (tail));
ae321d28
RS
1624 }
1625
1626 /* Otherwise, cons on new symbols that are not already members. */
1627 else
1628 {
1629 tem2 = Vcurrent_load_list;
1630
1631 while (CONSP (tem2))
1632 {
86d00812 1633 newelt = XCAR (tem2);
ae321d28 1634
d642e4f9 1635 if (NILP (Fmember (newelt, tem)))
86d00812
SM
1636 Fsetcar (tail, Fcons (XCAR (tem),
1637 Fcons (newelt, XCDR (tem))));
ae321d28 1638
86d00812 1639 tem2 = XCDR (tem2);
ae321d28
RS
1640 QUIT;
1641 }
1642 }
1643 }
1644 else
1645 prev = tail;
86d00812 1646 tail = XCDR (tail);
ae321d28
RS
1647 QUIT;
1648 }
1649
b502a9a1
RS
1650 /* If we're loading an entire file, cons the new assoc onto the
1651 front of load-history, the most-recently-loaded position. Also
1652 do this if we didn't find an existing member for the file. */
1653 if (entire || !foundit)
8a1f1537
RS
1654 Vload_history = Fcons (Fnreverse (Vcurrent_load_list),
1655 Vload_history);
ae321d28
RS
1656}
1657
94e554db 1658static Lisp_Object
971de7fb 1659readevalloop_1 (Lisp_Object old)
94e554db
RS
1660{
1661 load_convert_to_unibyte = ! NILP (old);
1662 return Qnil;
1663}
1664
9c97398c
GM
1665/* Signal an `end-of-file' error, if possible with file name
1666 information. */
1667
845ca893 1668static _Noreturn void
971de7fb 1669end_of_file_error (void)
9c97398c 1670{
9c97398c 1671 if (STRINGP (Vload_file_name))
336d4a9c 1672 xsignal1 (Qend_of_file, Vload_file_name);
9c97398c 1673
336d4a9c 1674 xsignal0 (Qend_of_file);
9c97398c
GM
1675}
1676
94e554db 1677/* UNIBYTE specifies how to set load_convert_to_unibyte
976350af 1678 for this invocation.
4c03c46d 1679 READFUN, if non-nil, is used instead of `read'.
1ed7b9ae
RS
1680
1681 START, END specify region to read in current buffer (from eval-region).
1682 If the input is not from a buffer, they must be nil. */
94e554db 1683
078e7b4a 1684static void
dd4c5104
DN
1685readevalloop (Lisp_Object readcharfun,
1686 FILE *stream,
1687 Lisp_Object sourcename,
7cded46f 1688 bool printflag,
dd4c5104
DN
1689 Lisp_Object unibyte, Lisp_Object readfun,
1690 Lisp_Object start, Lisp_Object end)
078e7b4a
JB
1691{
1692 register int c;
1693 register Lisp_Object val;
d311d28c 1694 ptrdiff_t count = SPECPDL_INDEX ();
0a37f512 1695 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
49cf7ff4 1696 struct buffer *b = 0;
7cded46f 1697 bool continue_reading_p;
b9598260 1698 Lisp_Object lex_bound;
7cded46f
PE
1699 /* True if reading an entire buffer. */
1700 bool whole_buffer = 0;
1701 /* True on the first time around. */
1702 bool first_sexp = 1;
972debf2
SM
1703 Lisp_Object macroexpand = intern ("internal-macroexpand-for-load");
1704
1705 if (NILP (Ffboundp (macroexpand))
1706 /* Don't macroexpand in .elc files, since it should have been done
1707 already. We actually don't know whether we're in a .elc file or not,
735135f9 1708 so we use circumstantial evidence: .el files normally go through
972debf2
SM
1709 Vload_source_file_function -> load-with-code-conversion
1710 -> eval-buffer. */
1711 || EQ (readcharfun, Qget_file_char)
1712 || EQ (readcharfun, Qget_emacs_mule_file_char))
1713 macroexpand = Qnil;
d11db2c8
RS
1714
1715 if (MARKERP (readcharfun))
1716 {
1717 if (NILP (start))
8878319c 1718 start = readcharfun;
d11db2c8 1719 }
49cf7ff4
RS
1720
1721 if (BUFFERP (readcharfun))
1722 b = XBUFFER (readcharfun);
1723 else if (MARKERP (readcharfun))
1724 b = XMARKER (readcharfun)->buffer;
078e7b4a 1725
1ed7b9ae
RS
1726 /* We assume START is nil when input is not from a buffer. */
1727 if (! NILP (start) && !b)
1088b922 1728 emacs_abort ();
1ed7b9ae 1729
0a37f512 1730 specbind (Qstandard_input, readcharfun); /* GCPROs readcharfun. */
8a1f1537 1731 specbind (Qcurrent_load_list, Qnil);
94e554db
RS
1732 record_unwind_protect (readevalloop_1, load_convert_to_unibyte ? Qt : Qnil);
1733 load_convert_to_unibyte = !NILP (unibyte);
078e7b4a 1734
b9598260
SM
1735 /* If lexical binding is active (either because it was specified in
1736 the file's header, or via a buffer-local variable), create an empty
1737 lexical environment, otherwise, turn off lexical binding. */
1738 lex_bound = find_symbol_value (Qlexical_binding);
f07a954e
SM
1739 specbind (Qinternal_interpreter_environment,
1740 NILP (lex_bound) || EQ (lex_bound, Qunbound)
1741 ? Qnil : Fcons (Qt, Qnil));
b9598260 1742
0a37f512 1743 GCPRO4 (sourcename, readfun, start, end);
ae321d28 1744
48def666 1745 /* Try to ensure sourcename is a truename, except whilst preloading. */
6bb6da3e 1746 if (NILP (Vpurify_flag)
91fe9496
SM
1747 && !NILP (sourcename) && !NILP (Ffile_name_absolute_p (sourcename))
1748 && !NILP (Ffboundp (Qfile_truename)))
6bb6da3e
AM
1749 sourcename = call1 (Qfile_truename, sourcename) ;
1750
ae321d28
RS
1751 LOADHIST_ATTACH (sourcename);
1752
f38952fe
GM
1753 continue_reading_p = 1;
1754 while (continue_reading_p)
078e7b4a 1755 {
d311d28c 1756 ptrdiff_t count1 = SPECPDL_INDEX ();
4c03c46d 1757
e578f381 1758 if (b != 0 && !BUFFER_LIVE_P (b))
49cf7ff4
RS
1759 error ("Reading from killed buffer");
1760
4c03c46d
KS
1761 if (!NILP (start))
1762 {
721b7d9e 1763 /* Switch to the buffer we are reading from. */
4c03c46d 1764 record_unwind_protect (save_excursion_restore, save_excursion_save ());
721b7d9e
RS
1765 set_buffer_internal (b);
1766
1767 /* Save point in it. */
4c03c46d 1768 record_unwind_protect (save_excursion_restore, save_excursion_save ());
721b7d9e 1769 /* Save ZV in it. */
4c03c46d 1770 record_unwind_protect (save_restriction_restore, save_restriction_save ());
721b7d9e
RS
1771 /* Those get unbound after we read one expression. */
1772
1773 /* Set point and ZV around stuff to be read. */
4c03c46d 1774 Fgoto_char (start);
d11db2c8
RS
1775 if (!NILP (end))
1776 Fnarrow_to_region (make_number (BEGV), end);
1777
1778 /* Just for cleanliness, convert END to a marker
1779 if it is an integer. */
1780 if (INTEGERP (end))
1781 end = Fpoint_max_marker ();
4c03c46d
KS
1782 }
1783
d11db2c8
RS
1784 /* On the first cycle, we can easily test here
1785 whether we are reading the whole buffer. */
1786 if (b && first_sexp)
1787 whole_buffer = (PT == BEG && ZV == Z);
1788
078e7b4a 1789 instream = stream;
4c03c46d 1790 read_next:
078e7b4a
JB
1791 c = READCHAR;
1792 if (c == ';')
1793 {
1794 while ((c = READCHAR) != '\n' && c != -1);
4c03c46d
KS
1795 goto read_next;
1796 }
1797 if (c < 0)
1798 {
1799 unbind_to (count1, Qnil);
1800 break;
078e7b4a 1801 }
6069d957
RS
1802
1803 /* Ignore whitespace here, so we can detect eof. */
adef3de7 1804 if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r'
ed497dd4 1805 || c == 0xa0) /* NBSP */
4c03c46d 1806 goto read_next;
078e7b4a 1807
265a9e55 1808 if (!NILP (Vpurify_flag) && c == '(')
078e7b4a 1809 {
48def666 1810 val = read_list (0, readcharfun);
078e7b4a
JB
1811 }
1812 else
1813 {
1814 UNREAD (c);
4ad679f9 1815 read_objects = Qnil;
f38952fe
GM
1816 if (!NILP (readfun))
1817 {
1818 val = call1 (readfun, readcharfun);
1819
1820 /* If READCHARFUN has set point to ZV, we should
1821 stop reading, even if the form read sets point
1822 to a different value when evaluated. */
1823 if (BUFFERP (readcharfun))
1824 {
0902fe45
PE
1825 struct buffer *buf = XBUFFER (readcharfun);
1826 if (BUF_PT (buf) == BUF_ZV (buf))
f38952fe
GM
1827 continue_reading_p = 0;
1828 }
1829 }
976350af 1830 else if (! NILP (Vload_read_function))
84a15045 1831 val = call1 (Vload_read_function, readcharfun);
976350af 1832 else
abb13b09 1833 val = read_internal_start (readcharfun, Qnil, Qnil);
078e7b4a
JB
1834 }
1835
4c03c46d
KS
1836 if (!NILP (start) && continue_reading_p)
1837 start = Fpoint_marker ();
d11db2c8
RS
1838
1839 /* Restore saved point and BEGV. */
4c03c46d
KS
1840 unbind_to (count1, Qnil);
1841
d11db2c8 1842 /* Now eval what we just read. */
972debf2
SM
1843 if (!NILP (macroexpand))
1844 val = call1 (macroexpand, val);
defb1411 1845 val = eval_sub (val);
f38952fe 1846
078e7b4a
JB
1847 if (printflag)
1848 {
1849 Vvalues = Fcons (val, Vvalues);
1850 if (EQ (Vstandard_output, Qt))
1851 Fprin1 (val, Qnil);
1852 else
1853 Fprint (val, Qnil);
1854 }
d11db2c8
RS
1855
1856 first_sexp = 0;
078e7b4a
JB
1857 }
1858
8878319c 1859 build_load_history (sourcename,
d11db2c8 1860 stream || whole_buffer);
b502a9a1 1861
ae321d28
RS
1862 UNGCPRO;
1863
078e7b4a
JB
1864 unbind_to (count, Qnil);
1865}
1866
1076254d 1867DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 5, "",
5de38842 1868 doc: /* Execute the current buffer as Lisp code.
72097cd9
CY
1869When called from a Lisp program (i.e., not interactively), this
1870function accepts up to five optional arguments:
5de38842
PJ
1871BUFFER is the buffer to evaluate (nil means use current buffer).
1872PRINTFLAG controls printing of output:
72097cd9
CY
1873 A value of nil means discard it; anything else is stream for print.
1874FILENAME specifies the file name to use for `load-history'.
1875UNIBYTE, if non-nil, specifies `load-convert-to-unibyte' for this
1876 invocation.
1877DO-ALLOW-PRINT, if non-nil, specifies that `print' and related
1878 functions should work normally even if PRINTFLAG is nil.
5de38842
PJ
1879
1880This function preserves the position of point. */)
5842a27b 1881 (Lisp_Object buffer, Lisp_Object printflag, Lisp_Object filename, Lisp_Object unibyte, Lisp_Object do_allow_print)
228d4b1c 1882{
d311d28c 1883 ptrdiff_t count = SPECPDL_INDEX ();
228d4b1c
JA
1884 Lisp_Object tem, buf;
1885
9391b698 1886 if (NILP (buffer))
228d4b1c
JA
1887 buf = Fcurrent_buffer ();
1888 else
9391b698 1889 buf = Fget_buffer (buffer);
dfdb645c 1890 if (NILP (buf))
13febd85 1891 error ("No such buffer");
228d4b1c 1892
1076254d 1893 if (NILP (printflag) && NILP (do_allow_print))
228d4b1c
JA
1894 tem = Qsymbolp;
1895 else
1896 tem = printflag;
13febd85
RS
1897
1898 if (NILP (filename))
4b4deea2 1899 filename = BVAR (XBUFFER (buf), filename);
13febd85 1900
3f39f996 1901 specbind (Qeval_buffer_list, Fcons (buf, Veval_buffer_list));
228d4b1c
JA
1902 specbind (Qstandard_output, tem);
1903 record_unwind_protect (save_excursion_restore, save_excursion_save ());
bf1c0f27 1904 BUF_TEMP_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
7200d79c 1905 specbind (Qlexical_binding, lisp_file_lexically_bound_p (buf) ? Qt : Qnil);
defb1411 1906 readevalloop (buf, 0, filename,
4c03c46d 1907 !NILP (printflag), unibyte, Qnil, Qnil, Qnil);
cb09ab7a 1908 unbind_to (count, Qnil);
228d4b1c
JA
1909
1910 return Qnil;
1911}
1912
976350af 1913DEFUN ("eval-region", Feval_region, Seval_region, 2, 4, "r",
5de38842
PJ
1914 doc: /* Execute the region as Lisp code.
1915When called from programs, expects two arguments,
1916giving starting and ending indices in the current buffer
1917of the text to be executed.
1918Programs can pass third argument PRINTFLAG which controls output:
51d8b30e 1919A value of nil means discard it; anything else is stream for printing it.
5de38842
PJ
1920Also the fourth argument READ-FUNCTION, if non-nil, is used
1921instead of `read' to read each expression. It gets one argument
1922which is the input stream for reading characters.
1923
1924This function does not move point. */)
5842a27b 1925 (Lisp_Object start, Lisp_Object end, Lisp_Object printflag, Lisp_Object read_function)
078e7b4a 1926{
e4769531 1927 /* FIXME: Do the eval-sexp-add-defvars dance! */
d311d28c 1928 ptrdiff_t count = SPECPDL_INDEX ();
ae321d28
RS
1929 Lisp_Object tem, cbuf;
1930
1931 cbuf = Fcurrent_buffer ();
078e7b4a 1932
265a9e55 1933 if (NILP (printflag))
078e7b4a
JB
1934 tem = Qsymbolp;
1935 else
1936 tem = printflag;
1937 specbind (Qstandard_output, tem);
3f39f996 1938 specbind (Qeval_buffer_list, Fcons (cbuf, Veval_buffer_list));
078e7b4a 1939
48def666 1940 /* `readevalloop' calls functions which check the type of start and end. */
f619ad4c 1941 readevalloop (cbuf, 0, BVAR (XBUFFER (cbuf), filename),
4c03c46d
KS
1942 !NILP (printflag), Qnil, read_function,
1943 start, end);
078e7b4a
JB
1944
1945 return unbind_to (count, Qnil);
1946}
1947
078e7b4a 1948\f
a7ca3326 1949DEFUN ("read", Fread, Sread, 0, 1, 0,
5de38842
PJ
1950 doc: /* Read one Lisp expression as text from STREAM, return as Lisp object.
1951If STREAM is nil, use the value of `standard-input' (which see).
1952STREAM or the value of `standard-input' may be:
1953 a buffer (read from point and advance it)
1954 a marker (read from where it points and advance it)
1955 a function (call it with no arguments for each character,
1956 call it with a char as argument to push a char back)
1957 a string (takes text from string, starting at the beginning)
1958 t (read text line using minibuffer and use it, or read from
1959 standard input in batch mode). */)
5842a27b 1960 (Lisp_Object stream)
078e7b4a 1961{
5be02dff
KH
1962 if (NILP (stream))
1963 stream = Vstandard_input;
1964 if (EQ (stream, Qt))
1965 stream = Qread_char;
5be02dff 1966 if (EQ (stream, Qread_char))
078e7b4a 1967 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil);
078e7b4a 1968
abb13b09 1969 return read_internal_start (stream, Qnil, Qnil);
078e7b4a
JB
1970}
1971
a7ca3326 1972DEFUN ("read-from-string", Fread_from_string, Sread_from_string, 1, 3, 0,
5de38842
PJ
1973 doc: /* Read one Lisp expression which is represented as text by STRING.
1974Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).
a4824228 1975FINAL-STRING-INDEX is an integer giving the position of the next
a239d4e9 1976 remaining character in STRING.
5de38842
PJ
1977START and END optionally delimit a substring of STRING from which to read;
1978 they default to 0 and (length STRING) respectively. */)
5842a27b 1979 (Lisp_Object string, Lisp_Object start, Lisp_Object end)
078e7b4a 1980{
2530ceaf 1981 Lisp_Object ret;
b7826503 1982 CHECK_STRING (string);
48def666 1983 /* `read_internal_start' sets `read_from_string_index'. */
2530ceaf 1984 ret = read_internal_start (string, start, end);
5135ab39 1985 return Fcons (ret, make_number (read_from_string_index));
abb13b09 1986}
078e7b4a 1987
abb13b09 1988/* Function to set up the global context we need in toplevel read
48def666 1989 calls. */
abb13b09 1990static Lisp_Object
971de7fb 1991read_internal_start (Lisp_Object stream, Lisp_Object start, Lisp_Object end)
48def666 1992/* `start', `end' only used when stream is a string. */
abb13b09
CW
1993{
1994 Lisp_Object retval;
078e7b4a 1995
abb13b09 1996 readchar_count = 0;
17634846 1997 new_backquote_flag = 0;
4ad679f9 1998 read_objects = Qnil;
abb13b09
CW
1999 if (EQ (Vread_with_symbol_positions, Qt)
2000 || EQ (Vread_with_symbol_positions, stream))
2001 Vread_symbol_positions_list = Qnil;
2002
8f924df7
KH
2003 if (STRINGP (stream)
2004 || ((CONSP (stream) && STRINGP (XCAR (stream)))))
abb13b09 2005 {
d311d28c 2006 ptrdiff_t startval, endval;
8f924df7 2007 Lisp_Object string;
078e7b4a 2008
8f924df7
KH
2009 if (STRINGP (stream))
2010 string = stream;
2011 else
2012 string = XCAR (stream);
078e7b4a 2013
abb13b09 2014 if (NILP (end))
8f924df7 2015 endval = SCHARS (string);
abb13b09
CW
2016 else
2017 {
2018 CHECK_NUMBER (end);
d311d28c 2019 if (! (0 <= XINT (end) && XINT (end) <= SCHARS (string)))
8f924df7 2020 args_out_of_range (string, end);
d311d28c 2021 endval = XINT (end);
abb13b09 2022 }
17634846 2023
abb13b09
CW
2024 if (NILP (start))
2025 startval = 0;
2026 else
2027 {
2028 CHECK_NUMBER (start);
d311d28c 2029 if (! (0 <= XINT (start) && XINT (start) <= endval))
8f924df7 2030 args_out_of_range (string, start);
d311d28c 2031 startval = XINT (start);
abb13b09
CW
2032 }
2033 read_from_string_index = startval;
8f924df7 2034 read_from_string_index_byte = string_char_to_byte (string, startval);
abb13b09
CW
2035 read_from_string_limit = endval;
2036 }
177c0ea7 2037
abb13b09
CW
2038 retval = read0 (stream);
2039 if (EQ (Vread_with_symbol_positions, Qt)
2040 || EQ (Vread_with_symbol_positions, stream))
2041 Vread_symbol_positions_list = Fnreverse (Vread_symbol_positions_list);
2042 return retval;
078e7b4a
JB
2043}
2044\f
336d4a9c
KS
2045
2046/* Signal Qinvalid_read_syntax error.
2047 S is error string of length N (if > 0) */
2048
845ca893 2049static _Noreturn void
e4d29b33 2050invalid_syntax (const char *s)
336d4a9c 2051{
e4d29b33 2052 xsignal1 (Qinvalid_read_syntax, build_string (s));
336d4a9c
KS
2053}
2054
2055
6428369f 2056/* Use this for recursive reads, in contexts where internal tokens
48def666 2057 are not allowed. */
e28552a4 2058
078e7b4a 2059static Lisp_Object
971de7fb 2060read0 (Lisp_Object readcharfun)
078e7b4a
JB
2061{
2062 register Lisp_Object val;
e28552a4 2063 int c;
078e7b4a 2064
17634846 2065 val = read1 (readcharfun, &c, 0);
336d4a9c
KS
2066 if (!c)
2067 return val;
078e7b4a 2068
336d4a9c
KS
2069 xsignal1 (Qinvalid_read_syntax,
2070 Fmake_string (make_number (1), make_number (c)));
078e7b4a
JB
2071}
2072\f
82cb60d3 2073static ptrdiff_t read_buffer_size;
078e7b4a
JB
2074static char *read_buffer;
2075
f6f79b37 2076/* Read a \-escape sequence, assuming we already read the `\'.
8f924df7 2077 If the escape sequence forces unibyte, return eight-bit char. */
6f7f43d5 2078
078e7b4a 2079static int
7cded46f 2080read_escape (Lisp_Object readcharfun, bool stringp)
078e7b4a 2081{
7cded46f 2082 int c = READCHAR;
9735b9ce 2083 /* \u allows up to four hex digits, \U up to eight. Default to the
48def666 2084 behavior for \u, and change this value in the case that \U is seen. */
71b169b8 2085 int unicode_hex_count = 4;
f6f79b37 2086
078e7b4a
JB
2087 switch (c)
2088 {
f3849f25 2089 case -1:
da3b886d 2090 end_of_file_error ();
f3849f25 2091
078e7b4a 2092 case 'a':
265a9e55 2093 return '\007';
078e7b4a
JB
2094 case 'b':
2095 return '\b';
f405a585
RS
2096 case 'd':
2097 return 0177;
078e7b4a
JB
2098 case 'e':
2099 return 033;
2100 case 'f':
2101 return '\f';
2102 case 'n':
2103 return '\n';
2104 case 'r':
2105 return '\r';
2106 case 't':
2107 return '\t';
2108 case 'v':
2109 return '\v';
2110 case '\n':
2111 return -1;
e28552a4 2112 case ' ':
e7fc914b
KH
2113 if (stringp)
2114 return -1;
2115 return ' ';
078e7b4a
JB
2116
2117 case 'M':
2118 c = READCHAR;
2119 if (c != '-')
2120 error ("Invalid escape character syntax");
2121 c = READCHAR;
2122 if (c == '\\')
8792be66 2123 c = read_escape (readcharfun, 0);
7bd279cd 2124 return c | meta_modifier;
f405a585
RS
2125
2126 case 'S':
2127 c = READCHAR;
2128 if (c != '-')
2129 error ("Invalid escape character syntax");
2130 c = READCHAR;
2131 if (c == '\\')
8792be66 2132 c = read_escape (readcharfun, 0);
7bd279cd
RS
2133 return c | shift_modifier;
2134
2135 case 'H':
2136 c = READCHAR;
2137 if (c != '-')
2138 error ("Invalid escape character syntax");
2139 c = READCHAR;
2140 if (c == '\\')
8792be66 2141 c = read_escape (readcharfun, 0);
7bd279cd
RS
2142 return c | hyper_modifier;
2143
2144 case 'A':
2145 c = READCHAR;
2146 if (c != '-')
2147 error ("Invalid escape character syntax");
2148 c = READCHAR;
2149 if (c == '\\')
8792be66 2150 c = read_escape (readcharfun, 0);
7bd279cd
RS
2151 return c | alt_modifier;
2152
2153 case 's':
2154 c = READCHAR;
4d7528d0 2155 if (stringp || c != '-')
010b7eac
RS
2156 {
2157 UNREAD (c);
2158 return ' ';
2159 }
7bd279cd
RS
2160 c = READCHAR;
2161 if (c == '\\')
8792be66 2162 c = read_escape (readcharfun, 0);
7bd279cd 2163 return c | super_modifier;
078e7b4a
JB
2164
2165 case 'C':
2166 c = READCHAR;
2167 if (c != '-')
2168 error ("Invalid escape character syntax");
2169 case '^':
2170 c = READCHAR;
2171 if (c == '\\')
8792be66 2172 c = read_escape (readcharfun, 0);
164d590d
KH
2173 if ((c & ~CHAR_MODIFIER_MASK) == '?')
2174 return 0177 | (c & CHAR_MODIFIER_MASK);
2175 else if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
2176 return c | ctrl_modifier;
f405a585
RS
2177 /* ASCII control chars are made from letters (both cases),
2178 as well as the non-letters within 0100...0137. */
2179 else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
2180 return (c & (037 | ~0177));
2181 else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
2182 return (c & (037 | ~0177));
078e7b4a 2183 else
7bd279cd 2184 return c | ctrl_modifier;
078e7b4a
JB
2185
2186 case '0':
2187 case '1':
2188 case '2':
2189 case '3':
2190 case '4':
2191 case '5':
2192 case '6':
2193 case '7':
2194 /* An octal escape, as in ANSI C. */
2195 {
2196 register int i = c - '0';
2197 register int count = 0;
2198 while (++count < 3)
2199 {
2200 if ((c = READCHAR) >= '0' && c <= '7')
2201 {
2202 i *= 8;
2203 i += c - '0';
2204 }
2205 else
2206 {
2207 UNREAD (c);
2208 break;
2209 }
2210 }
177c0ea7 2211
8f924df7 2212 if (i >= 0x80 && i < 0x100)
8792be66 2213 i = BYTE8_TO_CHAR (i);
078e7b4a
JB
2214 return i;
2215 }
2216
2217 case 'x':
2218 /* A hex escape, as in ANSI C. */
2219 {
0324f3af 2220 unsigned int i = 0;
1571601b 2221 int count = 0;
078e7b4a
JB
2222 while (1)
2223 {
2224 c = READCHAR;
2225 if (c >= '0' && c <= '9')
2226 {
2227 i *= 16;
2228 i += c - '0';
2229 }
2230 else if ((c >= 'a' && c <= 'f')
2231 || (c >= 'A' && c <= 'F'))
2232 {
2233 i *= 16;
2234 if (c >= 'a' && c <= 'f')
2235 i += c - 'a' + 10;
2236 else
2237 i += c - 'A' + 10;
2238 }
2239 else
2240 {
2241 UNREAD (c);
2242 break;
2243 }
0324f3af
PE
2244 /* Allow hex escapes as large as ?\xfffffff, because some
2245 packages use them to denote characters with modifiers. */
2246 if ((CHAR_META | (CHAR_META - 1)) < i)
39019e54 2247 error ("Hex character out of range: \\x%x...", i);
82cb60d3 2248 count += count < 3;
078e7b4a 2249 }
f6f79b37 2250
1571601b 2251 if (count < 3 && i >= 0x80)
8792be66 2252 return BYTE8_TO_CHAR (i);
078e7b4a
JB
2253 return i;
2254 }
2255
71b169b8
EZ
2256 case 'U':
2257 /* Post-Unicode-2.0: Up to eight hex chars. */
2258 unicode_hex_count = 8;
2259 case 'u':
2260
9735b9ce 2261 /* A Unicode escape. We only permit them in strings and characters,
71b169b8
EZ
2262 not arbitrarily in the source code, as in some other languages. */
2263 {
a808f22d 2264 unsigned int i = 0;
71b169b8 2265 int count = 0;
71b169b8
EZ
2266
2267 while (++count <= unicode_hex_count)
2268 {
2269 c = READCHAR;
48def666
SM
2270 /* `isdigit' and `isalpha' may be locale-specific, which we don't
2271 want. */
71b169b8
EZ
2272 if (c >= '0' && c <= '9') i = (i << 4) + (c - '0');
2273 else if (c >= 'a' && c <= 'f') i = (i << 4) + (c - 'a') + 10;
2274 else if (c >= 'A' && c <= 'F') i = (i << 4) + (c - 'A') + 10;
2275 else
39019e54 2276 error ("Non-hex digit used for Unicode escape");
71b169b8 2277 }
a808f22d
KH
2278 if (i > 0x10FFFF)
2279 error ("Non-Unicode character: 0x%x", i);
7ea7f636 2280 return i;
71b169b8
EZ
2281 }
2282
078e7b4a
JB
2283 default:
2284 return c;
2285 }
2286}
2287
a108c10b
PE
2288/* Return the digit that CHARACTER stands for in the given BASE.
2289 Return -1 if CHARACTER is out of range for BASE,
2290 and -2 if CHARACTER is not valid for any supported BASE. */
b0ab8123 2291static int
a108c10b
PE
2292digit_to_number (int character, int base)
2293{
2294 int digit;
2295
2296 if ('0' <= character && character <= '9')
2297 digit = character - '0';
2298 else if ('a' <= character && character <= 'z')
2299 digit = character - 'a' + 10;
2300 else if ('A' <= character && character <= 'Z')
2301 digit = character - 'A' + 10;
2302 else
2303 return -2;
2304
2305 return digit < base ? digit : -1;
2306}
2307
bf5d1a17
GM
2308/* Read an integer in radix RADIX using READCHARFUN to read
2309 characters. RADIX must be in the interval [2..36]; if it isn't, a
2310 read error is signaled . Value is the integer read. Signals an
2311 error if encountering invalid read syntax or if RADIX is out of
2312 range. */
2313
2314static Lisp_Object
8b9ac8b4 2315read_integer (Lisp_Object readcharfun, EMACS_INT radix)
bf5d1a17 2316{
8b9ac8b4
PE
2317 /* Room for sign, leading 0, other digits, trailing null byte.
2318 Also, room for invalid syntax diagnostic. */
2319 char buf[max (1 + 1 + sizeof (uintmax_t) * CHAR_BIT + 1,
2320 sizeof "integer, radix " + INT_STRLEN_BOUND (EMACS_INT))];
a108c10b
PE
2321
2322 int valid = -1; /* 1 if valid, 0 if not, -1 if incomplete. */
bf5d1a17
GM
2323
2324 if (radix < 2 || radix > 36)
a108c10b 2325 valid = 0;
bf5d1a17
GM
2326 else
2327 {
a108c10b
PE
2328 char *p = buf;
2329 int c, digit;
bf5d1a17
GM
2330
2331 c = READCHAR;
a108c10b 2332 if (c == '-' || c == '+')
bf5d1a17 2333 {
a108c10b 2334 *p++ = c;
bf5d1a17 2335 c = READCHAR;
bf5d1a17 2336 }
177c0ea7 2337
a108c10b 2338 if (c == '0')
bf5d1a17 2339 {
a108c10b
PE
2340 *p++ = c;
2341 valid = 1;
bf5d1a17 2342
a108c10b
PE
2343 /* Ignore redundant leading zeros, so the buffer doesn't
2344 fill up with them. */
2345 do
2346 c = READCHAR;
2347 while (c == '0');
2348 }
2349
2350 while (-1 <= (digit = digit_to_number (c, radix)))
2351 {
2352 if (digit == -1)
2353 valid = 0;
2354 if (valid < 0)
2355 valid = 1;
2356
2357 if (p < buf + sizeof buf - 1)
2358 *p++ = c;
2359 else
2360 valid = 0;
bf5d1a17 2361
bf5d1a17
GM
2362 c = READCHAR;
2363 }
a108c10b 2364
0a6a104b 2365 UNREAD (c);
a108c10b 2366 *p = '\0';
bf5d1a17
GM
2367 }
2368
a108c10b 2369 if (! valid)
bf5d1a17 2370 {
8b9ac8b4 2371 sprintf (buf, "integer, radix %"pI"d", radix);
e4d29b33 2372 invalid_syntax (buf);
bf5d1a17
GM
2373 }
2374
a108c10b 2375 return string_to_number (buf, radix, 0);
bf5d1a17
GM
2376}
2377
2378
6428369f
KH
2379/* If the next token is ')' or ']' or '.', we store that character
2380 in *PCH and the return value is not interesting. Else, we store
17634846
RS
2381 zero in *PCH and we read and return one lisp object.
2382
7cded46f 2383 FIRST_IN_LIST is true if this is the first element of a list. */
17634846 2384
078e7b4a 2385static Lisp_Object
7cded46f 2386read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
078e7b4a 2387{
fce31d69
PE
2388 int c;
2389 bool uninterned_symbol = 0;
2390 bool multibyte;
4ad679f9 2391
6428369f 2392 *pch = 0;
8792be66 2393 load_each_byte = 0;
078e7b4a
JB
2394
2395 retry:
2396
1202434b 2397 c = READCHAR_REPORT_MULTIBYTE (&multibyte);
9c97398c
GM
2398 if (c < 0)
2399 end_of_file_error ();
078e7b4a
JB
2400
2401 switch (c)
2402 {
2403 case '(':
2404 return read_list (0, readcharfun);
2405
2406 case '[':
c15cfd1f 2407 return read_vector (readcharfun, 0);
078e7b4a
JB
2408
2409 case ')':
2410 case ']':
078e7b4a 2411 {
6428369f
KH
2412 *pch = c;
2413 return Qnil;
078e7b4a
JB
2414 }
2415
2416 case '#':
200f684e 2417 c = READCHAR;
f19a0f5b
TZ
2418 if (c == 's')
2419 {
2420 c = READCHAR;
2421 if (c == '(')
2422 {
2423 /* Accept extended format for hashtables (extensible to
2424 other types), e.g.
48def666 2425 #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
f19a0f5b
TZ
2426 Lisp_Object tmp = read_list (0, readcharfun);
2427 Lisp_Object head = CAR_SAFE (tmp);
2428 Lisp_Object data = Qnil;
2429 Lisp_Object val = Qnil;
2430 /* The size is 2 * number of allowed keywords to
48def666 2431 make-hash-table. */
9735b9ce 2432 Lisp_Object params[10];
f19a0f5b
TZ
2433 Lisp_Object ht;
2434 Lisp_Object key = Qnil;
2435 int param_count = 0;
9735b9ce 2436
f19a0f5b
TZ
2437 if (!EQ (head, Qhash_table))
2438 error ("Invalid extended read marker at head of #s list "
2439 "(only hash-table allowed)");
9735b9ce 2440
f19a0f5b
TZ
2441 tmp = CDR_SAFE (tmp);
2442
48def666 2443 /* This is repetitive but fast and simple. */
f19a0f5b 2444 params[param_count] = QCsize;
48def666 2445 params[param_count + 1] = Fplist_get (tmp, Qsize);
5721b4ed
AS
2446 if (!NILP (params[param_count + 1]))
2447 param_count += 2;
f19a0f5b
TZ
2448
2449 params[param_count] = QCtest;
48def666 2450 params[param_count + 1] = Fplist_get (tmp, Qtest);
5721b4ed
AS
2451 if (!NILP (params[param_count + 1]))
2452 param_count += 2;
f19a0f5b
TZ
2453
2454 params[param_count] = QCweakness;
48def666 2455 params[param_count + 1] = Fplist_get (tmp, Qweakness);
5721b4ed
AS
2456 if (!NILP (params[param_count + 1]))
2457 param_count += 2;
f19a0f5b
TZ
2458
2459 params[param_count] = QCrehash_size;
48def666 2460 params[param_count + 1] = Fplist_get (tmp, Qrehash_size);
5721b4ed
AS
2461 if (!NILP (params[param_count + 1]))
2462 param_count += 2;
f19a0f5b
TZ
2463
2464 params[param_count] = QCrehash_threshold;
48def666 2465 params[param_count + 1] = Fplist_get (tmp, Qrehash_threshold);
5721b4ed
AS
2466 if (!NILP (params[param_count + 1]))
2467 param_count += 2;
f19a0f5b 2468
48def666 2469 /* This is the hashtable data. */
f19a0f5b
TZ
2470 data = Fplist_get (tmp, Qdata);
2471
48def666 2472 /* Now use params to make a new hashtable and fill it. */
f19a0f5b 2473 ht = Fmake_hash_table (param_count, params);
9735b9ce 2474
f19a0f5b
TZ
2475 while (CONSP (data))
2476 {
2477 key = XCAR (data);
2478 data = XCDR (data);
2479 if (!CONSP (data))
2480 error ("Odd number of elements in hashtable data");
2481 val = XCAR (data);
2482 data = XCDR (data);
2483 Fputhash (key, val, ht);
2484 }
9735b9ce 2485
f19a0f5b
TZ
2486 return ht;
2487 }
5721b4ed 2488 UNREAD (c);
e4d29b33 2489 invalid_syntax ("#");
f19a0f5b 2490 }
c2390933
RS
2491 if (c == '^')
2492 {
2493 c = READCHAR;
2494 if (c == '[')
2495 {
2496 Lisp_Object tmp;
c15cfd1f 2497 tmp = read_vector (readcharfun, 0);
77b37c05 2498 if (ASIZE (tmp) < CHAR_TABLE_STANDARD_SLOTS)
c2390933 2499 error ("Invalid size char-table");
985773c9 2500 XSETPVECTYPE (XVECTOR (tmp), PVEC_CHAR_TABLE);
c2390933
RS
2501 return tmp;
2502 }
3701b5de
KH
2503 else if (c == '^')
2504 {
2505 c = READCHAR;
2506 if (c == '[')
2507 {
2508 Lisp_Object tmp;
d311d28c
PE
2509 int depth;
2510 ptrdiff_t size;
8f924df7 2511
c15cfd1f 2512 tmp = read_vector (readcharfun, 0);
6efdadfd
PE
2513 size = ASIZE (tmp);
2514 if (size == 0)
2515 error ("Invalid size char-table");
d311d28c 2516 if (! RANGED_INTEGERP (1, AREF (tmp, 0), 3))
1571601b
KH
2517 error ("Invalid depth in char-table");
2518 depth = XINT (AREF (tmp, 0));
6efdadfd 2519 if (chartab_size[depth] != size - 2)
3701b5de 2520 error ("Invalid size char-table");
985773c9 2521 XSETPVECTYPE (XVECTOR (tmp), PVEC_SUB_CHAR_TABLE);
3701b5de
KH
2522 return tmp;
2523 }
e4d29b33 2524 invalid_syntax ("#^^");
3701b5de 2525 }
e4d29b33 2526 invalid_syntax ("#^");
c2390933
RS
2527 }
2528 if (c == '&')
2529 {
2530 Lisp_Object length;
2531 length = read1 (readcharfun, pch, first_in_list);
2532 c = READCHAR;
2533 if (c == '"')
2534 {
2535 Lisp_Object tmp, val;
82cb60d3 2536 EMACS_INT size_in_chars
d1ca81d9
AS
2537 = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
2538 / BOOL_VECTOR_BITS_PER_CHAR);
c2390933
RS
2539
2540 UNREAD (c);
2541 tmp = read1 (readcharfun, pch, first_in_list);
8792be66 2542 if (STRING_MULTIBYTE (tmp)
8f924df7 2543 || (size_in_chars != SCHARS (tmp)
8792be66
KH
2544 /* We used to print 1 char too many
2545 when the number of bits was a multiple of 8.
2546 Accept such input in case it came from an old
2547 version. */
2548 && ! (XFASTINT (length)
327719ee 2549 == (SCHARS (tmp) - 1) * BOOL_VECTOR_BITS_PER_CHAR)))
e4d29b33 2550 invalid_syntax ("#&...");
177c0ea7 2551
c2390933 2552 val = Fmake_bool_vector (length, Qnil);
72af86bd 2553 memcpy (XBOOL_VECTOR (val)->data, SDATA (tmp), size_in_chars);
67d3b149 2554 /* Clear the extraneous bits in the last byte. */
d1ca81d9 2555 if (XINT (length) != size_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
67d3b149 2556 XBOOL_VECTOR (val)->data[size_in_chars - 1]
d1ca81d9 2557 &= (1 << (XINT (length) % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
c2390933
RS
2558 return val;
2559 }
e4d29b33 2560 invalid_syntax ("#&...");
c2390933 2561 }
200f684e 2562 if (c == '[')
876c194c
SM
2563 {
2564 /* Accept compiled functions at read-time so that we don't have to
2565 build them using function calls. */
2566 Lisp_Object tmp;
2567 tmp = read_vector (readcharfun, 1);
3017f87f
SM
2568 make_byte_code (XVECTOR (tmp));
2569 return tmp;
876c194c 2570 }
748ef62f
RS
2571 if (c == '(')
2572 {
2573 Lisp_Object tmp;
2574 struct gcpro gcpro1;
e28552a4 2575 int ch;
748ef62f
RS
2576
2577 /* Read the string itself. */
17634846 2578 tmp = read1 (readcharfun, &ch, 0);
6428369f 2579 if (ch != 0 || !STRINGP (tmp))
e4d29b33 2580 invalid_syntax ("#");
748ef62f
RS
2581 GCPRO1 (tmp);
2582 /* Read the intervals and their properties. */
2583 while (1)
2584 {
2585 Lisp_Object beg, end, plist;
2586
17634846 2587 beg = read1 (readcharfun, &ch, 0);
7ee3bd7b 2588 end = plist = Qnil;
6428369f
KH
2589 if (ch == ')')
2590 break;
2591 if (ch == 0)
17634846 2592 end = read1 (readcharfun, &ch, 0);
6428369f 2593 if (ch == 0)
17634846 2594 plist = read1 (readcharfun, &ch, 0);
6428369f 2595 if (ch)
e4d29b33 2596 invalid_syntax ("Invalid string property list");
748ef62f
RS
2597 Fset_text_properties (beg, end, plist, tmp);
2598 }
2599 UNGCPRO;
2600 return tmp;
2601 }
177c0ea7 2602
20ea2964
RS
2603 /* #@NUMBER is used to skip NUMBER following characters.
2604 That's used in .elc files to skip over doc strings
2605 and function definitions. */
2606 if (c == '@')
2607 {
bfbbd7e7
PE
2608 enum { extra = 100 };
2609 ptrdiff_t i, nskip = 0;
20ea2964 2610
8792be66 2611 load_each_byte = 1;
20ea2964
RS
2612 /* Read a decimal integer. */
2613 while ((c = READCHAR) >= 0
2614 && c >= '0' && c <= '9')
2615 {
bfbbd7e7
PE
2616 if ((STRING_BYTES_BOUND - extra) / 10 <= nskip)
2617 string_overflow ();
20ea2964
RS
2618 nskip *= 10;
2619 nskip += c - '0';
2620 }
0a6a104b 2621 UNREAD (c);
177c0ea7 2622
8792be66
KH
2623 if (load_force_doc_strings
2624 && (EQ (readcharfun, Qget_file_char)
2625 || EQ (readcharfun, Qget_emacs_mule_file_char)))
b2a30870
RS
2626 {
2627 /* If we are supposed to force doc strings into core right now,
2628 record the last string that we skipped,
2629 and record where in the file it comes from. */
c15cfd1f
RS
2630
2631 /* But first exchange saved_doc_string
2632 with prev_saved_doc_string, so we save two strings. */
2633 {
2634 char *temp = saved_doc_string;
bfbbd7e7 2635 ptrdiff_t temp_size = saved_doc_string_size;
68c45bf0 2636 file_offset temp_pos = saved_doc_string_position;
bfbbd7e7 2637 ptrdiff_t temp_len = saved_doc_string_length;
c15cfd1f
RS
2638
2639 saved_doc_string = prev_saved_doc_string;
2640 saved_doc_string_size = prev_saved_doc_string_size;
2641 saved_doc_string_position = prev_saved_doc_string_position;
2642 saved_doc_string_length = prev_saved_doc_string_length;
2643
2644 prev_saved_doc_string = temp;
2645 prev_saved_doc_string_size = temp_size;
2646 prev_saved_doc_string_position = temp_pos;
2647 prev_saved_doc_string_length = temp_len;
2648 }
2649
b2a30870
RS
2650 if (saved_doc_string_size == 0)
2651 {
23f86fce 2652 saved_doc_string = xmalloc (nskip + extra);
bfbbd7e7 2653 saved_doc_string_size = nskip + extra;
b2a30870
RS
2654 }
2655 if (nskip > saved_doc_string_size)
2656 {
38182d90 2657 saved_doc_string = xrealloc (saved_doc_string, nskip + extra);
37d0112b 2658 saved_doc_string_size = nskip + extra;
b2a30870
RS
2659 }
2660
68c45bf0 2661 saved_doc_string_position = file_tell (instream);
b2a30870
RS
2662
2663 /* Copy that many characters into saved_doc_string. */
2664 for (i = 0; i < nskip && c >= 0; i++)
2665 saved_doc_string[i] = c = READCHAR;
2666
2667 saved_doc_string_length = i;
2668 }
2669 else
b2a30870
RS
2670 {
2671 /* Skip that many characters. */
2672 for (i = 0; i < nskip && c >= 0; i++)
2673 c = READCHAR;
2674 }
d49f0c1a 2675
8792be66 2676 load_each_byte = 0;
20ea2964
RS
2677 goto retry;
2678 }
e2518d02
RS
2679 if (c == '!')
2680 {
2681 /* #! appears at the beginning of an executable file.
2682 Skip the first line. */
225c7a07 2683 while (c != '\n' && c >= 0)
e2518d02
RS
2684 c = READCHAR;
2685 goto retry;
2686 }
20ea2964
RS
2687 if (c == '$')
2688 return Vload_file_name;
2b6cae0c
RS
2689 if (c == '\'')
2690 return Fcons (Qfunction, Fcons (read0 (readcharfun), Qnil));
4ad679f9
EN
2691 /* #:foo is the uninterned symbol named foo. */
2692 if (c == ':')
2693 {
2694 uninterned_symbol = 1;
2695 c = READCHAR;
52968808 2696 if (!(c > 040
ed497dd4 2697 && c != 0xa0 /* NBSP */
52968808 2698 && (c >= 0200
0a6a104b 2699 || strchr ("\"';()[]#`,", c) == NULL)))
52968808
AS
2700 {
2701 /* No symbol character follows, this is the empty
2702 symbol. */
0a6a104b 2703 UNREAD (c);
4a7edc24 2704 return Fmake_symbol (empty_unibyte_string);
52968808
AS
2705 }
2706 goto read_symbol;
4ad679f9 2707 }
9a79b20c
AS
2708 /* ## is the empty symbol. */
2709 if (c == '#')
4a7edc24 2710 return Fintern (empty_unibyte_string, Qnil);
4ad679f9
EN
2711 /* Reader forms that can reuse previously read objects. */
2712 if (c >= '0' && c <= '9')
2713 {
8b9ac8b4 2714 EMACS_INT n = 0;
4ad679f9 2715 Lisp_Object tem;
2b6cae0c 2716
4ad679f9
EN
2717 /* Read a non-negative integer. */
2718 while (c >= '0' && c <= '9')
2719 {
8b9ac8b4
PE
2720 if (MOST_POSITIVE_FIXNUM / 10 < n
2721 || MOST_POSITIVE_FIXNUM < n * 10 + c - '0')
2722 n = MOST_POSITIVE_FIXNUM + 1;
2723 else
2724 n = n * 10 + c - '0';
4ad679f9
EN
2725 c = READCHAR;
2726 }
8b9ac8b4
PE
2727
2728 if (n <= MOST_POSITIVE_FIXNUM)
4ad679f9 2729 {
8b9ac8b4
PE
2730 if (c == 'r' || c == 'R')
2731 return read_integer (readcharfun, n);
9e062b6c 2732
8b9ac8b4
PE
2733 if (! NILP (Vread_circle))
2734 {
2735 /* #n=object returns object, but associates it with
2736 n for #n#. */
2737 if (c == '=')
2738 {
48def666 2739 /* Make a placeholder for #n# to use temporarily. */
8b9ac8b4
PE
2740 Lisp_Object placeholder;
2741 Lisp_Object cell;
9e062b6c 2742
8b9ac8b4
PE
2743 placeholder = Fcons (Qnil, Qnil);
2744 cell = Fcons (make_number (n), placeholder);
2745 read_objects = Fcons (cell, read_objects);
9e062b6c 2746
48def666 2747 /* Read the object itself. */
8b9ac8b4 2748 tem = read0 (readcharfun);
9e062b6c 2749
48def666 2750 /* Now put it everywhere the placeholder was... */
8b9ac8b4 2751 substitute_object_in_subtree (tem, placeholder);
177c0ea7 2752
8b9ac8b4
PE
2753 /* ...and #n# will use the real value from now on. */
2754 Fsetcdr (cell, tem);
177c0ea7 2755
8b9ac8b4
PE
2756 return tem;
2757 }
2758
2759 /* #n# returns a previously read object. */
2760 if (c == '#')
2761 {
2762 tem = Fassq (make_number (n), read_objects);
2763 if (CONSP (tem))
2764 return XCDR (tem);
2765 }
2766 }
2767 }
4ad679f9
EN
2768 /* Fall through to error message. */
2769 }
bf5d1a17
GM
2770 else if (c == 'x' || c == 'X')
2771 return read_integer (readcharfun, 16);
2772 else if (c == 'o' || c == 'O')
2773 return read_integer (readcharfun, 8);
2774 else if (c == 'b' || c == 'B')
2775 return read_integer (readcharfun, 2);
20ea2964 2776
200f684e 2777 UNREAD (c);
e4d29b33 2778 invalid_syntax ("#");
078e7b4a
JB
2779
2780 case ';':
2781 while ((c = READCHAR) >= 0 && c != '\n');
2782 goto retry;
2783
2784 case '\'':
2785 {
2786 return Fcons (Qquote, Fcons (read0 (readcharfun), Qnil));
2787 }
2788
17634846 2789 case '`':
9a39b306
TO
2790 {
2791 int next_char = READCHAR;
2792 UNREAD (next_char);
2793 /* Transition from old-style to new-style:
2794 If we see "(`" it used to mean old-style, which usually works
2795 fine because ` should almost never appear in such a position
2796 for new-style. But occasionally we need "(`" to mean new
2797 style, so we try to distinguish the two by the fact that we
2798 can either write "( `foo" or "(` foo", where the first
2799 intends to use new-style whereas the second intends to use
2800 old-style. For Emacs-25, we should completely remove this
2801 first_in_list exception (old-style can still be obtained via
2802 "(\`" anyway). */
bba3e508 2803 if (!new_backquote_flag && first_in_list && next_char == ' ')
9a39b306
TO
2804 {
2805 Vold_style_backquotes = Qt;
2806 goto default_label;
2807 }
2808 else
2809 {
2810 Lisp_Object value;
7cded46f 2811 bool saved_new_backquote_flag = new_backquote_flag;
17634846 2812
7cded46f 2813 new_backquote_flag = 1;
9a39b306 2814 value = read0 (readcharfun);
7cded46f 2815 new_backquote_flag = saved_new_backquote_flag;
17634846 2816
9a39b306
TO
2817 return Fcons (Qbackquote, Fcons (value, Qnil));
2818 }
2819 }
17634846 2820 case ',':
bba3e508
SM
2821 {
2822 int next_char = READCHAR;
2823 UNREAD (next_char);
2824 /* Transition from old-style to new-style:
2825 It used to be impossible to have a new-style , other than within
2826 a new-style `. This is sufficient when ` and , are used in the
2827 normal way, but ` and , can also appear in args to macros that
2828 will not interpret them in the usual way, in which case , may be
2829 used without any ` anywhere near.
2830 So we now use the same heuristic as for backquote: old-style
2831 unquotes are only recognized when first on a list, and when
2832 followed by a space.
333f9019 2833 Because it's more difficult to peek 2 chars ahead, a new-style
bba3e508
SM
2834 ,@ can still not be used outside of a `, unless it's in the middle
2835 of a list. */
2836 if (new_backquote_flag
2837 || !first_in_list
2838 || (next_char != ' ' && next_char != '@'))
2839 {
2840 Lisp_Object comma_type = Qnil;
2841 Lisp_Object value;
2842 int ch = READCHAR;
17634846 2843
bba3e508
SM
2844 if (ch == '@')
2845 comma_type = Qcomma_at;
2846 else if (ch == '.')
2847 comma_type = Qcomma_dot;
2848 else
2849 {
2850 if (ch >= 0) UNREAD (ch);
2851 comma_type = Qcomma;
2852 }
17634846 2853
bba3e508
SM
2854 value = read0 (readcharfun);
2855 return Fcons (comma_type, Fcons (value, Qnil));
2856 }
2857 else
2858 {
2859 Vold_style_backquotes = Qt;
2860 goto default_label;
2861 }
2862 }
078e7b4a
JB
2863 case '?':
2864 {
8792be66 2865 int modifiers;
df9c2be7 2866 int next_char;
7cded46f 2867 bool ok;
f6f79b37 2868
078e7b4a 2869 c = READCHAR;
9c97398c
GM
2870 if (c < 0)
2871 end_of_file_error ();
078e7b4a 2872
b9284371
KS
2873 /* Accept `single space' syntax like (list ? x) where the
2874 whitespace character is SPC or TAB.
2875 Other literal whitespace like NL, CR, and FF are not accepted,
2876 as there are well-established escape sequences for these. */
2877 if (c == ' ' || c == '\t')
2878 return make_number (c);
2879
078e7b4a 2880 if (c == '\\')
8792be66
KH
2881 c = read_escape (readcharfun, 0);
2882 modifiers = c & CHAR_MODIFIER_MASK;
2883 c &= ~CHAR_MODIFIER_MASK;
2884 if (CHAR_BYTE8_P (c))
2885 c = CHAR_TO_BYTE8 (c);
2886 c |= modifiers;
078e7b4a 2887
df9c2be7 2888 next_char = READCHAR;
bba3e508
SM
2889 ok = (next_char <= 040
2890 || (next_char < 0200
0a6a104b 2891 && strchr ("\"';()[]#?`,.", next_char) != NULL));
df9c2be7 2892 UNREAD (next_char);
336d4a9c
KS
2893 if (ok)
2894 return make_number (c);
37cd4238 2895
e4d29b33 2896 invalid_syntax ("?");
078e7b4a
JB
2897 }
2898
00a9a935 2899 case '"':
078e7b4a 2900 {
a742d646
GM
2901 char *p = read_buffer;
2902 char *end = read_buffer + read_buffer_size;
7cded46f
PE
2903 int ch;
2904 /* True if we saw an escape sequence specifying
1571601b 2905 a multibyte character. */
7cded46f
PE
2906 bool force_multibyte = 0;
2907 /* True if we saw an escape sequence specifying
e7fc914b 2908 a single-byte character. */
7cded46f
PE
2909 bool force_singlebyte = 0;
2910 bool cancel = 0;
82cb60d3 2911 ptrdiff_t nchars = 0;
078e7b4a 2912
0902fe45
PE
2913 while ((ch = READCHAR) >= 0
2914 && ch != '\"')
078e7b4a 2915 {
449fea39 2916 if (end - p < MAX_MULTIBYTE_LENGTH)
078e7b4a 2917 {
82cb60d3 2918 ptrdiff_t offset = p - read_buffer;
20270765
PE
2919 if (min (PTRDIFF_MAX, SIZE_MAX) / 2 < read_buffer_size)
2920 memory_full (SIZE_MAX);
38182d90 2921 read_buffer = xrealloc (read_buffer, read_buffer_size * 2);
37d0112b 2922 read_buffer_size *= 2;
5d65df0d 2923 p = read_buffer + offset;
078e7b4a
JB
2924 end = read_buffer + read_buffer_size;
2925 }
bed23cb2 2926
0902fe45 2927 if (ch == '\\')
03e88613 2928 {
1571601b 2929 int modifiers;
f6f79b37 2930
0902fe45 2931 ch = read_escape (readcharfun, 1);
bed23cb2 2932
48def666 2933 /* CH is -1 if \ newline has just been seen. */
0902fe45 2934 if (ch == -1)
03e88613 2935 {
bed23cb2
RS
2936 if (p == read_buffer)
2937 cancel = 1;
03e88613
RS
2938 continue;
2939 }
bed23cb2 2940
0902fe45
PE
2941 modifiers = ch & CHAR_MODIFIER_MASK;
2942 ch = ch & ~CHAR_MODIFIER_MASK;
1571601b 2943
0902fe45 2944 if (CHAR_BYTE8_P (ch))
e7fc914b 2945 force_singlebyte = 1;
0902fe45 2946 else if (! ASCII_CHAR_P (ch))
f6f79b37 2947 force_multibyte = 1;
48def666 2948 else /* I.e. ASCII_CHAR_P (ch). */
1571601b
KH
2949 {
2950 /* Allow `\C- ' and `\C-?'. */
2951 if (modifiers == CHAR_CTL)
2952 {
0902fe45
PE
2953 if (ch == ' ')
2954 ch = 0, modifiers = 0;
2955 else if (ch == '?')
2956 ch = 127, modifiers = 0;
1571601b
KH
2957 }
2958 if (modifiers & CHAR_SHIFT)
2959 {
2960 /* Shift modifier is valid only with [A-Za-z]. */
0902fe45 2961 if (ch >= 'A' && ch <= 'Z')
1571601b 2962 modifiers &= ~CHAR_SHIFT;
0902fe45
PE
2963 else if (ch >= 'a' && ch <= 'z')
2964 ch -= ('a' - 'A'), modifiers &= ~CHAR_SHIFT;
1571601b
KH
2965 }
2966
2967 if (modifiers & CHAR_META)
2968 {
2969 /* Move the meta bit to the right place for a
2970 string. */
2971 modifiers &= ~CHAR_META;
0902fe45 2972 ch = BYTE8_TO_CHAR (ch | 0x80);
1571601b
KH
2973 force_singlebyte = 1;
2974 }
2975 }
5150eeec 2976
1571601b
KH
2977 /* Any modifiers remaining are invalid. */
2978 if (modifiers)
2979 error ("Invalid modifier in string");
0902fe45 2980 p += CHAR_STRING (ch, (unsigned char *) p);
078e7b4a 2981 }
8792be66 2982 else
5150eeec 2983 {
0902fe45
PE
2984 p += CHAR_STRING (ch, (unsigned char *) p);
2985 if (CHAR_BYTE8_P (ch))
988f7a0c 2986 force_singlebyte = 1;
0902fe45 2987 else if (! ASCII_CHAR_P (ch))
988f7a0c 2988 force_multibyte = 1;
f943104a 2989 }
5150eeec 2990 nchars++;
078e7b4a 2991 }
5150eeec 2992
0902fe45 2993 if (ch < 0)
9c97398c 2994 end_of_file_error ();
078e7b4a
JB
2995
2996 /* If purifying, and string starts with \ newline,
2997 return zero instead. This is for doc strings
61b108cc 2998 that we are really going to find in etc/DOC.nn.nn. */
265a9e55 2999 if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
078e7b4a
JB
3000 return make_number (0);
3001
4cfd81f6 3002 if (! force_multibyte && force_singlebyte)
a742d646 3003 {
4cfd81f6
PE
3004 /* READ_BUFFER contains raw 8-bit bytes and no multibyte
3005 forms. Convert it to unibyte. */
4a25e32a
PE
3006 nchars = str_as_unibyte ((unsigned char *) read_buffer,
3007 p - read_buffer);
1571601b 3008 p = read_buffer + nchars;
a742d646 3009 }
e7fc914b 3010
491f16a2 3011 return make_specified_string (read_buffer, nchars, p - read_buffer,
1571601b
KH
3012 (force_multibyte
3013 || (p - read_buffer != nchars)));
078e7b4a
JB
3014 }
3015
109d300c
JB
3016 case '.':
3017 {
109d300c
JB
3018 int next_char = READCHAR;
3019 UNREAD (next_char);
3020
035eec48 3021 if (next_char <= 040
e613ea97 3022 || (next_char < 0200
0a6a104b 3023 && strchr ("\"';([#?`,", next_char) != NULL))
109d300c 3024 {
6428369f
KH
3025 *pch = c;
3026 return Qnil;
109d300c
JB
3027 }
3028
3029 /* Otherwise, we fall through! Note that the atom-reading loop
3030 below will now loop at least once, assuring that we will not
3031 try to UNREAD two characters in a row. */
3032 }
078e7b4a 3033 default:
17634846 3034 default_label:
88852d45 3035 if (c <= 040) goto retry;
ed497dd4 3036 if (c == 0xa0) /* NBSP */
adef3de7 3037 goto retry;
52968808
AS
3038
3039 read_symbol:
078e7b4a 3040 {
38404229 3041 char *p = read_buffer;
7cded46f 3042 bool quoted = 0;
46cfea45 3043 EMACS_INT start_position = readchar_count - 1;
078e7b4a
JB
3044
3045 {
38404229 3046 char *end = read_buffer + read_buffer_size;
078e7b4a 3047
ef1b0ba7 3048 do
078e7b4a 3049 {
449fea39 3050 if (end - p < MAX_MULTIBYTE_LENGTH)
078e7b4a 3051 {
82cb60d3 3052 ptrdiff_t offset = p - read_buffer;
20270765
PE
3053 if (min (PTRDIFF_MAX, SIZE_MAX) / 2 < read_buffer_size)
3054 memory_full (SIZE_MAX);
38182d90 3055 read_buffer = xrealloc (read_buffer, read_buffer_size * 2);
37d0112b 3056 read_buffer_size *= 2;
5d65df0d 3057 p = read_buffer + offset;
078e7b4a
JB
3058 end = read_buffer + read_buffer_size;
3059 }
177c0ea7 3060
078e7b4a 3061 if (c == '\\')
481c6336
RS
3062 {
3063 c = READCHAR;
4ab11c09
GM
3064 if (c == -1)
3065 end_of_file_error ();
481c6336
RS
3066 quoted = 1;
3067 }
6f7f43d5 3068
1202434b 3069 if (multibyte)
4a25e32a 3070 p += CHAR_STRING (c, (unsigned char *) p);
1202434b
KH
3071 else
3072 *p++ = c;
078e7b4a 3073 c = READCHAR;
0a6a104b
AS
3074 }
3075 while (c > 040
ed497dd4 3076 && c != 0xa0 /* NBSP */
0a6a104b
AS
3077 && (c >= 0200
3078 || strchr ("\"';()[]#`,", c) == NULL));
078e7b4a
JB
3079
3080 if (p == end)
3081 {
82cb60d3 3082 ptrdiff_t offset = p - read_buffer;
20270765
PE
3083 if (min (PTRDIFF_MAX, SIZE_MAX) / 2 < read_buffer_size)
3084 memory_full (SIZE_MAX);
38182d90 3085 read_buffer = xrealloc (read_buffer, read_buffer_size * 2);
37d0112b 3086 read_buffer_size *= 2;
5d65df0d
GM
3087 p = read_buffer + offset;
3088 end = read_buffer + read_buffer_size;
078e7b4a
JB
3089 }
3090 *p = 0;
0a6a104b 3091 UNREAD (c);
078e7b4a
JB
3092 }
3093
4ad679f9 3094 if (!quoted && !uninterned_symbol)
481c6336 3095 {
452f4150
PE
3096 Lisp_Object result = string_to_number (read_buffer, 10, 0);
3097 if (! NILP (result))
8b9587d7 3098 return result;
481c6336 3099 }
abb13b09 3100 {
e93abe3d 3101 Lisp_Object name, result;
d311d28c
PE
3102 ptrdiff_t nbytes = p - read_buffer;
3103 ptrdiff_t nchars
4a25e32a
PE
3104 = (multibyte
3105 ? multibyte_chars_in_text ((unsigned char *) read_buffer,
3106 nbytes)
e93abe3d
KH
3107 : nbytes);
3108
61b108cc
SM
3109 name = ((uninterned_symbol && ! NILP (Vpurify_flag)
3110 ? make_pure_string : make_specified_string)
3111 (read_buffer, nchars, nbytes, multibyte));
e93abe3d
KH
3112 result = (uninterned_symbol ? Fmake_symbol (name)
3113 : Fintern (name, Qnil));
1202434b 3114
abb13b09
CW
3115 if (EQ (Vread_with_symbol_positions, Qt)
3116 || EQ (Vread_with_symbol_positions, readcharfun))
61b108cc
SM
3117 Vread_symbol_positions_list
3118 = Fcons (Fcons (result, make_number (start_position)),
3119 Vread_symbol_positions_list);
abb13b09
CW
3120 return result;
3121 }
078e7b4a
JB
3122 }
3123 }
3124}
3125\f
9e062b6c 3126
48def666 3127/* List of nodes we've seen during substitute_object_in_subtree. */
9e062b6c
RS
3128static Lisp_Object seen_list;
3129
3130static void
971de7fb 3131substitute_object_in_subtree (Lisp_Object object, Lisp_Object placeholder)
9e062b6c
RS
3132{
3133 Lisp_Object check_object;
3134
48def666 3135 /* We haven't seen any objects when we start. */
9e062b6c
RS
3136 seen_list = Qnil;
3137
48def666 3138 /* Make all the substitutions. */
9e062b6c
RS
3139 check_object
3140 = substitute_object_recurse (object, placeholder, object);
177c0ea7 3141
48def666 3142 /* Clear seen_list because we're done with it. */
9e062b6c
RS
3143 seen_list = Qnil;
3144
3145 /* The returned object here is expected to always eq the
48def666 3146 original. */
9e062b6c
RS
3147 if (!EQ (check_object, object))
3148 error ("Unexpected mutation error in reader");
3149}
3150
48def666 3151/* Feval doesn't get called from here, so no gc protection is needed. */
7a3d90dc
SM
3152#define SUBSTITUTE(get_val, set_val) \
3153 do { \
3154 Lisp_Object old_value = get_val; \
3155 Lisp_Object true_value \
3156 = substitute_object_recurse (object, placeholder, \
3157 old_value); \
3158 \
3159 if (!EQ (old_value, true_value)) \
3160 { \
3161 set_val; \
3162 } \
3163 } while (0)
9e062b6c
RS
3164
3165static Lisp_Object
971de7fb 3166substitute_object_recurse (Lisp_Object object, Lisp_Object placeholder, Lisp_Object subtree)
9e062b6c 3167{
48def666 3168 /* If we find the placeholder, return the target object. */
9e062b6c
RS
3169 if (EQ (placeholder, subtree))
3170 return object;
3171
48def666 3172 /* If we've been to this node before, don't explore it again. */
9e062b6c
RS
3173 if (!EQ (Qnil, Fmemq (subtree, seen_list)))
3174 return subtree;
3175
3176 /* If this node can be the entry point to a cycle, remember that
3177 we've seen it. It can only be such an entry point if it was made
3178 by #n=, which means that we can find it as a value in
3179 read_objects. */
3180 if (!EQ (Qnil, Frassq (subtree, read_objects)))
3181 seen_list = Fcons (subtree, seen_list);
177c0ea7 3182
9e062b6c
RS
3183 /* Recurse according to subtree's type.
3184 Every branch must return a Lisp_Object. */
3185 switch (XTYPE (subtree))
3186 {
3187 case Lisp_Vectorlike:
3188 {
82cb60d3 3189 ptrdiff_t i, length = 0;
7a3d90dc
SM
3190 if (BOOL_VECTOR_P (subtree))
3191 return subtree; /* No sub-objects anyway. */
3192 else if (CHAR_TABLE_P (subtree) || SUB_CHAR_TABLE_P (subtree)
3193 || COMPILEDP (subtree))
3194 length = ASIZE (subtree) & PSEUDOVECTOR_SIZE_MASK;
3195 else if (VECTORP (subtree))
3196 length = ASIZE (subtree);
3197 else
3198 /* An unknown pseudovector may contain non-Lisp fields, so we
3199 can't just blindly traverse all its fields. We used to call
04bf5b65 3200 `Flength' which signaled `sequencep', so I just preserved this
7a3d90dc
SM
3201 behavior. */
3202 wrong_type_argument (Qsequencep, subtree);
3203
9e062b6c 3204 for (i = 0; i < length; i++)
7a3d90dc
SM
3205 SUBSTITUTE (AREF (subtree, i),
3206 ASET (subtree, i, true_value));
9e062b6c
RS
3207 return subtree;
3208 }
3209
3210 case Lisp_Cons:
3211 {
7a3d90dc
SM
3212 SUBSTITUTE (XCAR (subtree),
3213 XSETCAR (subtree, true_value));
3214 SUBSTITUTE (XCDR (subtree),
3215 XSETCDR (subtree, true_value));
9e062b6c
RS
3216 return subtree;
3217 }
3218
9e062b6c
RS
3219 case Lisp_String:
3220 {
3221 /* Check for text properties in each interval.
48def666 3222 substitute_in_interval contains part of the logic. */
9e062b6c 3223
0c94c8d6
PE
3224 INTERVAL root_interval = string_intervals (subtree);
3225 Lisp_Object arg = Fcons (object, placeholder);
177c0ea7 3226
0d74b006
SM
3227 traverse_intervals_noorder (root_interval,
3228 &substitute_in_interval, arg);
9e062b6c
RS
3229
3230 return subtree;
3231 }
9e062b6c 3232
48def666 3233 /* Other types don't recurse any further. */
9e062b6c
RS
3234 default:
3235 return subtree;
3236 }
3237}
3238
3239/* Helper function for substitute_object_recurse. */
3240static void
971de7fb 3241substitute_in_interval (INTERVAL interval, Lisp_Object arg)
9e062b6c
RS
3242{
3243 Lisp_Object object = Fcar (arg);
3244 Lisp_Object placeholder = Fcdr (arg);
3245
0c94c8d6 3246 SUBSTITUTE (interval->plist, set_interval_plist (interval, true_value));
9e062b6c
RS
3247}
3248
3249\f
078e7b4a
JB
3250#define LEAD_INT 1
3251#define DOT_CHAR 2
3252#define TRAIL_INT 4
452f4150 3253#define E_EXP 16
078e7b4a 3254
8b9587d7 3255
452f4150
PE
3256/* Convert STRING to a number, assuming base BASE. Return a fixnum if CP has
3257 integer syntax and fits in a fixnum, else return the nearest float if CP has
3258 either floating point or integer syntax and BASE is 10, else return nil. If
7cded46f 3259 IGNORE_TRAILING, consider just the longest prefix of CP that has
452f4150
PE
3260 valid floating point syntax. Signal an overflow if BASE is not 10 and the
3261 number has integer syntax but does not fit. */
8b9587d7
PE
3262
3263Lisp_Object
7cded46f 3264string_to_number (char const *string, int base, bool ignore_trailing)
078e7b4a 3265{
a8fe7202 3266 int state;
452f4150
PE
3267 char const *cp = string;
3268 int leading_digit;
7cded46f 3269 bool float_syntax = 0;
452f4150 3270 double value = 0;
d8578e58 3271
8b9587d7
PE
3272 /* Compute NaN and infinities using a variable, to cope with compilers that
3273 think they are smarter than we are. */
3274 double zero = 0;
3275
3276 /* Negate the value ourselves. This treats 0, NaNs, and infinity properly on
3277 IEEE floating point hosts, and works around a formerly-common bug where
3278 atof ("-0.0") drops the sign. */
7cded46f 3279 bool negative = *cp == '-';
8b9587d7 3280
7cded46f 3281 bool signedp = negative || *cp == '+';
452f4150 3282 cp += signedp;
8b9587d7 3283
078e7b4a 3284 state = 0;
078e7b4a 3285
452f4150
PE
3286 leading_digit = digit_to_number (*cp, base);
3287 if (0 <= leading_digit)
078e7b4a
JB
3288 {
3289 state |= LEAD_INT;
452f4150
PE
3290 do
3291 ++cp;
3292 while (0 <= digit_to_number (*cp, base));
078e7b4a
JB
3293 }
3294 if (*cp == '.')
3295 {
3296 state |= DOT_CHAR;
3297 cp++;
3298 }
078e7b4a 3299
452f4150 3300 if (base == 10)
eb659c41 3301 {
452f4150
PE
3302 if ('0' <= *cp && *cp <= '9')
3303 {
3304 state |= TRAIL_INT;
3305 do
3306 cp++;
3307 while ('0' <= *cp && *cp <= '9');
3308 }
3309 if (*cp == 'e' || *cp == 'E')
3310 {
3311 char const *ecp = cp;
3312 cp++;
3313 if (*cp == '+' || *cp == '-')
3314 cp++;
3315 if ('0' <= *cp && *cp <= '9')
3316 {
3317 state |= E_EXP;
3318 do
3319 cp++;
3320 while ('0' <= *cp && *cp <= '9');
3321 }
3322 else if (cp[-1] == '+'
3323 && cp[0] == 'I' && cp[1] == 'N' && cp[2] == 'F')
3324 {
3325 state |= E_EXP;
3326 cp += 3;
3327 value = 1.0 / zero;
3328 }
3329 else if (cp[-1] == '+'
3330 && cp[0] == 'N' && cp[1] == 'a' && cp[2] == 'N')
3331 {
3332 state |= E_EXP;
3333 cp += 3;
3334 value = zero / zero;
3335
3336 /* If that made a "negative" NaN, negate it. */
3337 {
3338 int i;
3339 union { double d; char c[sizeof (double)]; }
3340 u_data, u_minus_zero;
3341 u_data.d = value;
3342 u_minus_zero.d = -0.0;
3343 for (i = 0; i < sizeof (double); i++)
3344 if (u_data.c[i] & u_minus_zero.c[i])
3345 {
3346 value = -value;
3347 break;
3348 }
3349 }
3350 /* Now VALUE is a positive NaN. */
3351 }
3352 else
3353 cp = ecp;
3354 }
3355
3356 float_syntax = ((state & (DOT_CHAR|TRAIL_INT)) == (DOT_CHAR|TRAIL_INT)
3357 || state == (LEAD_INT|E_EXP));
eb659c41 3358 }
8b9587d7 3359
452f4150
PE
3360 /* Return nil if the number uses invalid syntax. If IGNORE_TRAILING, accept
3361 any prefix that matches. Otherwise, the entire string must match. */
3362 if (! (ignore_trailing
3363 ? ((state & LEAD_INT) != 0 || float_syntax)
3364 : (!*cp && ((state & ~DOT_CHAR) == LEAD_INT || float_syntax))))
3365 return Qnil;
8b9587d7 3366
d78050d6
PE
3367 /* If the number uses integer and not float syntax, and is in C-language
3368 range, use its value, preferably as a fixnum. */
452f4150
PE
3369 if (0 <= leading_digit && ! float_syntax)
3370 {
d78050d6
PE
3371 uintmax_t n;
3372
3373 /* Fast special case for single-digit integers. This also avoids a
7cded46f 3374 glitch when BASE is 16 and IGNORE_TRAILING, because in that
d78050d6
PE
3375 case some versions of strtoumax accept numbers like "0x1" that Emacs
3376 does not allow. */
3377 if (digit_to_number (string[signedp + 1], base) < 0)
3378 return make_number (negative ? -leading_digit : leading_digit);
3379
3380 errno = 0;
3381 n = strtoumax (string + signedp, NULL, base);
3382 if (errno == ERANGE)
452f4150 3383 {
d78050d6
PE
3384 /* Unfortunately there's no simple and accurate way to convert
3385 non-base-10 numbers that are out of C-language range. */
3386 if (base != 10)
f14ed477 3387 xsignal1 (Qoverflow_error, build_string (string));
452f4150 3388 }
d78050d6
PE
3389 else if (n <= (negative ? -MOST_NEGATIVE_FIXNUM : MOST_POSITIVE_FIXNUM))
3390 {
3391 EMACS_INT signed_n = n;
3392 return make_number (negative ? -signed_n : signed_n);
3393 }
3394 else
3395 value = n;
452f4150 3396 }
8b9587d7 3397
452f4150
PE
3398 /* Either the number uses float syntax, or it does not fit into a fixnum.
3399 Convert it from string to floating point, unless the value is already
d78050d6
PE
3400 known because it is an infinity, a NAN, or its absolute value fits in
3401 uintmax_t. */
8b9587d7 3402 if (! value)
452f4150
PE
3403 value = atof (string + signedp);
3404
d78050d6 3405 return make_float (negative ? -value : value);
078e7b4a 3406}
cc94f3b2 3407
078e7b4a
JB
3408\f
3409static Lisp_Object
7cded46f 3410read_vector (Lisp_Object readcharfun, bool bytecodeflag)
078e7b4a 3411{
82cb60d3 3412 ptrdiff_t i, size;
7cded46f
PE
3413 Lisp_Object *ptr;
3414 Lisp_Object tem, item, vector;
3415 struct Lisp_Cons *otem;
078e7b4a
JB
3416 Lisp_Object len;
3417
3418 tem = read_list (1, readcharfun);
3419 len = Flength (tem);
48def666 3420 vector = Fmake_vector (len, Qnil);
078e7b4a 3421
77b37c05 3422 size = ASIZE (vector);
078e7b4a
JB
3423 ptr = XVECTOR (vector)->contents;
3424 for (i = 0; i < size; i++)
3425 {
c15cfd1f
RS
3426 item = Fcar (tem);
3427 /* If `load-force-doc-strings' is t when reading a lazily-loaded
3428 bytecode object, the docstring containing the bytecode and
3429 constants values must be treated as unibyte and passed to
3430 Fread, to get the actual bytecode string and constants vector. */
876c194c 3431 if (bytecodeflag && load_force_doc_strings)
c15cfd1f
RS
3432 {
3433 if (i == COMPILED_BYTECODE)
3434 {
3435 if (!STRINGP (item))
6fa2b890 3436 error ("Invalid byte code");
c15cfd1f
RS
3437
3438 /* Delay handling the bytecode slot until we know whether
3439 it is lazily-loaded (we can tell by whether the
3440 constants slot is nil). */
086ca913 3441 ASET (vector, COMPILED_CONSTANTS, item);
c15cfd1f
RS
3442 item = Qnil;
3443 }
3444 else if (i == COMPILED_CONSTANTS)
3445 {
3446 Lisp_Object bytestr = ptr[COMPILED_CONSTANTS];
3447
3448 if (NILP (item))
3449 {
3450 /* Coerce string to unibyte (like string-as-unibyte,
3451 but without generating extra garbage and
3452 guaranteeing no change in the contents). */
bee91904 3453 STRING_SET_CHARS (bytestr, SBYTES (bytestr));
d5db4077 3454 STRING_SET_UNIBYTE (bytestr);
c15cfd1f 3455
8792be66 3456 item = Fread (Fcons (bytestr, readcharfun));
c15cfd1f 3457 if (!CONSP (item))
6fa2b890 3458 error ("Invalid byte code");
c15cfd1f
RS
3459
3460 otem = XCONS (item);
c1d497be
KR
3461 bytestr = XCAR (item);
3462 item = XCDR (item);
c15cfd1f
RS
3463 free_cons (otem);
3464 }
3465
3466 /* Now handle the bytecode slot. */
086ca913 3467 ASET (vector, COMPILED_BYTECODE, bytestr);
c15cfd1f 3468 }
8792be66
KH
3469 else if (i == COMPILED_DOC_STRING
3470 && STRINGP (item)
3471 && ! STRING_MULTIBYTE (item))
3472 {
3473 if (EQ (readcharfun, Qget_emacs_mule_file_char))
3474 item = Fdecode_coding_string (item, Qemacs_mule, Qnil, Qnil);
3475 else
3476 item = Fstring_as_multibyte (item);
3477 }
c15cfd1f 3478 }
086ca913 3479 ASET (vector, i, item);
078e7b4a
JB
3480 otem = XCONS (tem);
3481 tem = Fcdr (tem);
3482 free_cons (otem);
3483 }
3484 return vector;
3485}
177c0ea7 3486
7cded46f 3487/* FLAG means check for ] to terminate rather than ) and . */
078e7b4a
JB
3488
3489static Lisp_Object
7cded46f 3490read_list (bool flag, Lisp_Object readcharfun)
078e7b4a 3491{
078e7b4a 3492 Lisp_Object val, tail;
7cded46f 3493 Lisp_Object elt, tem;
078e7b4a 3494 struct gcpro gcpro1, gcpro2;
821d417e 3495 /* 0 is the normal case.
b2a30870 3496 1 means this list is a doc reference; replace it with the number 0.
177c0ea7 3497 2 means this list is a doc reference; replace it with the doc string. */
821d417e 3498 int doc_reference = 0;
078e7b4a 3499
17634846 3500 /* Initialize this to 1 if we are reading a list. */
7cded46f 3501 bool first_in_list = flag <= 0;
17634846 3502
078e7b4a
JB
3503 val = Qnil;
3504 tail = Qnil;
3505
3506 while (1)
3507 {
e28552a4 3508 int ch;
078e7b4a 3509 GCPRO2 (val, tail);
17634846 3510 elt = read1 (readcharfun, &ch, first_in_list);
078e7b4a 3511 UNGCPRO;
20ea2964 3512
17634846
RS
3513 first_in_list = 0;
3514
821d417e 3515 /* While building, if the list starts with #$, treat it specially. */
20ea2964 3516 if (EQ (elt, Vload_file_name)
d49f0c1a 3517 && ! NILP (elt)
821d417e
RS
3518 && !NILP (Vpurify_flag))
3519 {
3520 if (NILP (Vdoc_file_name))
3521 /* We have not yet called Snarf-documentation, so assume
3522 this file is described in the DOC-MM.NN file
3523 and Snarf-documentation will fill in the right value later.
3524 For now, replace the whole list with 0. */
3525 doc_reference = 1;
3526 else
3527 /* We have already called Snarf-documentation, so make a relative
3528 file name for this file, so it can be found properly
3529 in the installed Lisp directory.
3530 We don't use Fexpand_file_name because that would make
3531 the directory absolute now. */
3532 elt = concat2 (build_string ("../lisp/"),
61b108cc 3533 Ffile_name_nondirectory (elt));
821d417e 3534 }
b2a30870 3535 else if (EQ (elt, Vload_file_name)
d49f0c1a 3536 && ! NILP (elt)
b2a30870
RS
3537 && load_force_doc_strings)
3538 doc_reference = 2;
20ea2964 3539
6428369f 3540 if (ch)
078e7b4a
JB
3541 {
3542 if (flag > 0)
3543 {
6428369f 3544 if (ch == ']')
078e7b4a 3545 return val;
e4d29b33 3546 invalid_syntax (") or . in a vector");
078e7b4a 3547 }
6428369f 3548 if (ch == ')')
078e7b4a 3549 return val;
6428369f 3550 if (ch == '.')
078e7b4a
JB
3551 {
3552 GCPRO2 (val, tail);
265a9e55 3553 if (!NILP (tail))
f5df591a 3554 XSETCDR (tail, read0 (readcharfun));
078e7b4a
JB
3555 else
3556 val = read0 (readcharfun);
17634846 3557 read1 (readcharfun, &ch, 0);
078e7b4a 3558 UNGCPRO;
6428369f 3559 if (ch == ')')
821d417e
RS
3560 {
3561 if (doc_reference == 1)
3562 return make_number (0);
b2a30870
RS
3563 if (doc_reference == 2)
3564 {
3565 /* Get a doc string from the file we are loading.
8792be66
KH
3566 If it's in saved_doc_string, get it from there.
3567
3568 Here, we don't know if the string is a
3569 bytecode string or a doc string. As a
3570 bytecode string must be unibyte, we always
3571 return a unibyte string. If it is actually a
3572 doc string, caller must make it
3573 multibyte. */
8f924df7 3574
bfbbd7e7 3575 EMACS_INT pos = XINT (XCDR (val));
c15cfd1f
RS
3576 /* Position is negative for user variables. */
3577 if (pos < 0) pos = -pos;
b2a30870
RS
3578 if (pos >= saved_doc_string_position
3579 && pos < (saved_doc_string_position
3580 + saved_doc_string_length))
3581 {
82cb60d3
PE
3582 ptrdiff_t start = pos - saved_doc_string_position;
3583 ptrdiff_t from, to;
b2a30870
RS
3584
3585 /* Process quoting with ^A,
3586 and find the end of the string,
3587 which is marked with ^_ (037). */
3588 for (from = start, to = start;
3589 saved_doc_string[from] != 037;)
3590 {
3591 int c = saved_doc_string[from++];
3592 if (c == 1)
3593 {
3594 c = saved_doc_string[from++];
3595 if (c == 1)
3596 saved_doc_string[to++] = c;
3597 else if (c == '0')
3598 saved_doc_string[to++] = 0;
3599 else if (c == '_')
3600 saved_doc_string[to++] = 037;
3601 }
3602 else
3603 saved_doc_string[to++] = c;
3604 }
3605
8792be66
KH
3606 return make_unibyte_string (saved_doc_string + start,
3607 to - start);
b2a30870 3608 }
c15cfd1f
RS
3609 /* Look in prev_saved_doc_string the same way. */
3610 else if (pos >= prev_saved_doc_string_position
3611 && pos < (prev_saved_doc_string_position
3612 + prev_saved_doc_string_length))
3613 {
82cb60d3
PE
3614 ptrdiff_t start =
3615 pos - prev_saved_doc_string_position;
3616 ptrdiff_t from, to;
c15cfd1f
RS
3617
3618 /* Process quoting with ^A,
3619 and find the end of the string,
3620 which is marked with ^_ (037). */
3621 for (from = start, to = start;
3622 prev_saved_doc_string[from] != 037;)
3623 {
3624 int c = prev_saved_doc_string[from++];
3625 if (c == 1)
3626 {
3627 c = prev_saved_doc_string[from++];
3628 if (c == 1)
3629 prev_saved_doc_string[to++] = c;
3630 else if (c == '0')
3631 prev_saved_doc_string[to++] = 0;
3632 else if (c == '_')
3633 prev_saved_doc_string[to++] = 037;
3634 }
3635 else
3636 prev_saved_doc_string[to++] = c;
3637 }
3638
8792be66
KH
3639 return make_unibyte_string (prev_saved_doc_string
3640 + start,
3641 to - start);
c15cfd1f 3642 }
b2a30870 3643 else
8792be66 3644 return get_doc_string (val, 1, 0);
b2a30870
RS
3645 }
3646
821d417e
RS
3647 return val;
3648 }
e4d29b33 3649 invalid_syntax (". in wrong context");
078e7b4a 3650 }
e4d29b33 3651 invalid_syntax ("] in a list");
078e7b4a 3652 }
48def666 3653 tem = Fcons (elt, Qnil);
265a9e55 3654 if (!NILP (tail))
f5df591a 3655 XSETCDR (tail, tem);
078e7b4a
JB
3656 else
3657 val = tem;
3658 tail = tem;
078e7b4a
JB
3659 }
3660}
3661\f
1e3890d1 3662static Lisp_Object initial_obarray;
078e7b4a 3663
48def666 3664/* `oblookup' stores the bucket number here, for the sake of Funintern. */
d007f5c8 3665
2f30ecd0 3666static size_t oblookup_last_bucket_number;
d007f5c8 3667
d007f5c8
RS
3668/* Get an error if OBARRAY is not an obarray.
3669 If it is one, return it. */
3670
078e7b4a 3671Lisp_Object
971de7fb 3672check_obarray (Lisp_Object obarray)
078e7b4a 3673{
77b37c05 3674 if (!VECTORP (obarray) || ASIZE (obarray) == 0)
078e7b4a
JB
3675 {
3676 /* If Vobarray is now invalid, force it to be valid. */
3677 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray;
8878319c 3678 wrong_type_argument (Qvectorp, obarray);
078e7b4a
JB
3679 }
3680 return obarray;
3681}
3682
d007f5c8
RS
3683/* Intern the C string STR: return a symbol with that name,
3684 interned in the current obarray. */
078e7b4a
JB
3685
3686Lisp_Object
e8df9267 3687intern_1 (const char *str, ptrdiff_t len)
078e7b4a 3688{
e8df9267
DA
3689 Lisp_Object obarray = check_obarray (Vobarray);
3690 Lisp_Object tem = oblookup (obarray, str, len, len);
078e7b4a 3691
e8df9267 3692 return SYMBOLP (tem) ? tem : Fintern (make_string (str, len), obarray);
078e7b4a 3693}
4ad679f9 3694
5e2327cf 3695Lisp_Object
e8df9267 3696intern_c_string_1 (const char *str, ptrdiff_t len)
5e2327cf 3697{
e8df9267
DA
3698 Lisp_Object obarray = check_obarray (Vobarray);
3699 Lisp_Object tem = oblookup (obarray, str, len, len);
5e2327cf 3700
5e2327cf
DN
3701 if (SYMBOLP (tem))
3702 return tem;
3703
3704 if (NILP (Vpurify_flag))
3705 /* Creating a non-pure string from a string literal not
3706 implemented yet. We could just use make_string here and live
3707 with the extra copy. */
1088b922 3708 emacs_abort ();
5e2327cf 3709
2a0213a6 3710 return Fintern (make_pure_c_string (str, len), obarray);
5e2327cf 3711}
d007f5c8 3712\f
a7ca3326 3713DEFUN ("intern", Fintern, Sintern, 1, 2, 0,
5de38842
PJ
3714 doc: /* Return the canonical symbol whose name is STRING.
3715If there is none, one is created by this function and returned.
3716A second optional argument specifies the obarray to use;
3717it defaults to the value of `obarray'. */)
5842a27b 3718 (Lisp_Object string, Lisp_Object obarray)
078e7b4a
JB
3719{
3720 register Lisp_Object tem, sym, *ptr;
3721
265a9e55 3722 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
3723 obarray = check_obarray (obarray);
3724
b7826503 3725 CHECK_STRING (string);
078e7b4a 3726
42a5b22f 3727 tem = oblookup (obarray, SSDATA (string),
d5db4077
KR
3728 SCHARS (string),
3729 SBYTES (string));
cfff016d 3730 if (!INTEGERP (tem))
078e7b4a
JB
3731 return tem;
3732
265a9e55 3733 if (!NILP (Vpurify_flag))
9391b698
EN
3734 string = Fpurecopy (string);
3735 sym = Fmake_symbol (string);
44c6c019
GM
3736
3737 if (EQ (obarray, initial_obarray))
3738 XSYMBOL (sym)->interned = SYMBOL_INTERNED_IN_INITIAL_OBARRAY;
3739 else
3740 XSYMBOL (sym)->interned = SYMBOL_INTERNED;
078e7b4a 3741
d5db4077 3742 if ((SREF (string, 0) == ':')
a458d45d 3743 && EQ (obarray, initial_obarray))
44c6c019
GM
3744 {
3745 XSYMBOL (sym)->constant = 1;
ce5b453a
SM
3746 XSYMBOL (sym)->redirect = SYMBOL_PLAINVAL;
3747 SET_SYMBOL_VAL (XSYMBOL (sym), sym);
44c6c019 3748 }
a0549832 3749
4939150c 3750 ptr = aref_addr (obarray, XINT(tem));
cfff016d 3751 if (SYMBOLP (*ptr))
c644523b 3752 set_symbol_next (sym, XSYMBOL (*ptr));
078e7b4a 3753 else
c644523b 3754 set_symbol_next (sym, NULL);
078e7b4a
JB
3755 *ptr = sym;
3756 return sym;
3757}
3758
a7ca3326 3759DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,
5de38842
PJ
3760 doc: /* Return the canonical symbol named NAME, or nil if none exists.
3761NAME may be a string or a symbol. If it is a symbol, that exact
3762symbol is searched for.
3763A second optional argument specifies the obarray to use;
3764it defaults to the value of `obarray'. */)
5842a27b 3765 (Lisp_Object name, Lisp_Object obarray)
078e7b4a 3766{
c2d47f4b 3767 register Lisp_Object tem, string;
078e7b4a 3768
265a9e55 3769 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
3770 obarray = check_obarray (obarray);
3771
b55048d4
GM
3772 if (!SYMBOLP (name))
3773 {
b7826503 3774 CHECK_STRING (name);
c2d47f4b 3775 string = name;
b55048d4
GM
3776 }
3777 else
c2d47f4b 3778 string = SYMBOL_NAME (name);
078e7b4a 3779
42a5b22f 3780 tem = oblookup (obarray, SSDATA (string), SCHARS (string), SBYTES (string));
b55048d4
GM
3781 if (INTEGERP (tem) || (SYMBOLP (name) && !EQ (name, tem)))
3782 return Qnil;
3783 else
078e7b4a 3784 return tem;
078e7b4a 3785}
d007f5c8 3786\f
a7ca3326 3787DEFUN ("unintern", Funintern, Sunintern, 1, 2, 0,
5de38842
PJ
3788 doc: /* Delete the symbol named NAME, if any, from OBARRAY.
3789The value is t if a symbol was found and deleted, nil otherwise.
3790NAME may be a string or a symbol. If it is a symbol, that symbol
3791is deleted, if it belongs to OBARRAY--no other symbol is deleted.
3792OBARRAY defaults to the value of the variable `obarray'. */)
5842a27b 3793 (Lisp_Object name, Lisp_Object obarray)
d007f5c8
RS
3794{
3795 register Lisp_Object string, tem;
2f30ecd0 3796 size_t hash;
d007f5c8
RS
3797
3798 if (NILP (obarray)) obarray = Vobarray;
3799 obarray = check_obarray (obarray);
3800
3801 if (SYMBOLP (name))
d4c83cae 3802 string = SYMBOL_NAME (name);
d007f5c8
RS
3803 else
3804 {
b7826503 3805 CHECK_STRING (name);
d007f5c8
RS
3806 string = name;
3807 }
3808
42a5b22f 3809 tem = oblookup (obarray, SSDATA (string),
d5db4077
KR
3810 SCHARS (string),
3811 SBYTES (string));
d007f5c8
RS
3812 if (INTEGERP (tem))
3813 return Qnil;
3814 /* If arg was a symbol, don't delete anything but that symbol itself. */
3815 if (SYMBOLP (name) && !EQ (name, tem))
3816 return Qnil;
3817
8ab1650e
SM
3818 /* There are plenty of other symbols which will screw up the Emacs
3819 session if we unintern them, as well as even more ways to use
3820 `setq' or `fset' or whatnot to make the Emacs session
3821 unusable. Let's not go down this silly road. --Stef */
3822 /* if (EQ (tem, Qnil) || EQ (tem, Qt))
3823 error ("Attempt to unintern t or nil"); */
82c602f0 3824
44c6c019 3825 XSYMBOL (tem)->interned = SYMBOL_UNINTERNED;
ca69c42f 3826
d007f5c8
RS
3827 hash = oblookup_last_bucket_number;
3828
28be1ada 3829 if (EQ (AREF (obarray, hash), tem))
b2a30870
RS
3830 {
3831 if (XSYMBOL (tem)->next)
4939150c
PE
3832 {
3833 Lisp_Object sym;
3834 XSETSYMBOL (sym, XSYMBOL (tem)->next);
3835 ASET (obarray, hash, sym);
3836 }
b2a30870 3837 else
4939150c 3838 ASET (obarray, hash, make_number (0));
b2a30870 3839 }
d007f5c8
RS
3840 else
3841 {
3842 Lisp_Object tail, following;
3843
28be1ada 3844 for (tail = AREF (obarray, hash);
d007f5c8
RS
3845 XSYMBOL (tail)->next;
3846 tail = following)
3847 {
3848 XSETSYMBOL (following, XSYMBOL (tail)->next);
3849 if (EQ (following, tem))
3850 {
c644523b 3851 set_symbol_next (tail, XSYMBOL (following)->next);
d007f5c8
RS
3852 break;
3853 }
3854 }
3855 }
3856
3857 return Qt;
3858}
3859\f
3860/* Return the symbol in OBARRAY whose names matches the string
e28552a4
RS
3861 of SIZE characters (SIZE_BYTE bytes) at PTR.
3862 If there is no such symbol in OBARRAY, return nil.
d007f5c8
RS
3863
3864 Also store the bucket number in oblookup_last_bucket_number. */
078e7b4a
JB
3865
3866Lisp_Object
d311d28c 3867oblookup (Lisp_Object obarray, register const char *ptr, ptrdiff_t size, ptrdiff_t size_byte)
078e7b4a 3868{
2f30ecd0
PE
3869 size_t hash;
3870 size_t obsize;
078e7b4a
JB
3871 register Lisp_Object tail;
3872 Lisp_Object bucket, tem;
3873
2bce5643
DA
3874 obarray = check_obarray (obarray);
3875 obsize = ASIZE (obarray);
3876
519418b3
RS
3877 /* This is sometimes needed in the middle of GC. */
3878 obsize &= ~ARRAY_MARK_FLAG;
7c2fb837 3879 hash = hash_string (ptr, size_byte) % obsize;
28be1ada 3880 bucket = AREF (obarray, hash);
d007f5c8 3881 oblookup_last_bucket_number = hash;
8bc285a2 3882 if (EQ (bucket, make_number (0)))
078e7b4a 3883 ;
cfff016d 3884 else if (!SYMBOLP (bucket))
48def666 3885 error ("Bad data in guts of obarray"); /* Like CADR error message. */
d007f5c8
RS
3886 else
3887 for (tail = bucket; ; XSETSYMBOL (tail, XSYMBOL (tail)->next))
078e7b4a 3888 {
d5db4077
KR
3889 if (SBYTES (SYMBOL_NAME (tail)) == size_byte
3890 && SCHARS (SYMBOL_NAME (tail)) == size
72af86bd 3891 && !memcmp (SDATA (SYMBOL_NAME (tail)), ptr, size_byte))
078e7b4a
JB
3892 return tail;
3893 else if (XSYMBOL (tail)->next == 0)
3894 break;
3895 }
1805de4f 3896 XSETINT (tem, hash);
078e7b4a
JB
3897 return tem;
3898}
d007f5c8 3899\f
078e7b4a 3900void
971de7fb 3901map_obarray (Lisp_Object obarray, void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg)
078e7b4a 3902{
82cb60d3 3903 ptrdiff_t i;
078e7b4a 3904 register Lisp_Object tail;
b7826503 3905 CHECK_VECTOR (obarray);
77b37c05 3906 for (i = ASIZE (obarray) - 1; i >= 0; i--)
078e7b4a 3907 {
28be1ada 3908 tail = AREF (obarray, i);
4f5c4403 3909 if (SYMBOLP (tail))
078e7b4a
JB
3910 while (1)
3911 {
3912 (*fn) (tail, arg);
3913 if (XSYMBOL (tail)->next == 0)
3914 break;
1805de4f 3915 XSETSYMBOL (tail, XSYMBOL (tail)->next);
078e7b4a
JB
3916 }
3917 }
3918}
3919
7d383292 3920static void
971de7fb 3921mapatoms_1 (Lisp_Object sym, Lisp_Object function)
078e7b4a
JB
3922{
3923 call1 (function, sym);
3924}
3925
3926DEFUN ("mapatoms", Fmapatoms, Smapatoms, 1, 2, 0,
5de38842
PJ
3927 doc: /* Call FUNCTION on every symbol in OBARRAY.
3928OBARRAY defaults to the value of `obarray'. */)
5842a27b 3929 (Lisp_Object function, Lisp_Object obarray)
078e7b4a 3930{
265a9e55 3931 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
3932 obarray = check_obarray (obarray);
3933
3934 map_obarray (obarray, mapatoms_1, function);
3935 return Qnil;
3936}
3937
5e88a39e 3938#define OBARRAY_SIZE 1511
078e7b4a
JB
3939
3940void
971de7fb 3941init_obarray (void)
078e7b4a
JB
3942{
3943 Lisp_Object oblength;
37d0112b 3944 ptrdiff_t size = 100 + MAX_MULTIBYTE_LENGTH;
078e7b4a 3945
baf69866 3946 XSETFASTINT (oblength, OBARRAY_SIZE);
078e7b4a 3947
078e7b4a
JB
3948 Vobarray = Fmake_vector (oblength, make_number (0));
3949 initial_obarray = Vobarray;
3950 staticpro (&initial_obarray);
078e7b4a 3951
2a0213a6 3952 Qunbound = Fmake_symbol (build_pure_c_string ("unbound"));
ce5b453a
SM
3953 /* Set temporary dummy values to Qnil and Vpurify_flag to satisfy the
3954 NILP (Vpurify_flag) check in intern_c_string. */
3955 Qnil = make_number (-1); Vpurify_flag = make_number (1);
3956 Qnil = intern_c_string ("nil");
3957
3958 /* Fmake_symbol inits fields of new symbols with Qunbound and Qnil,
53964682 3959 so those two need to be fixed manually. */
ce5b453a 3960 SET_SYMBOL_VAL (XSYMBOL (Qunbound), Qunbound);
c644523b
DA
3961 set_symbol_function (Qunbound, Qunbound);
3962 set_symbol_plist (Qunbound, Qnil);
ce5b453a
SM
3963 SET_SYMBOL_VAL (XSYMBOL (Qnil), Qnil);
3964 XSYMBOL (Qnil)->constant = 1;
9660f5fc 3965 XSYMBOL (Qnil)->declared_special = 1;
c644523b 3966 set_symbol_plist (Qnil, Qnil);
078e7b4a 3967
d67b4f80 3968 Qt = intern_c_string ("t");
ce5b453a 3969 SET_SYMBOL_VAL (XSYMBOL (Qt), Qt);
9660f5fc 3970 XSYMBOL (Qnil)->declared_special = 1;
44c6c019 3971 XSYMBOL (Qt)->constant = 1;
078e7b4a
JB
3972
3973 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */
3974 Vpurify_flag = Qt;
3975
cd3520a4 3976 DEFSYM (Qvariable_documentation, "variable-documentation");
078e7b4a 3977
23f86fce 3978 read_buffer = xmalloc (size);
37d0112b 3979 read_buffer_size = size;
078e7b4a
JB
3980}
3981\f
3982void
971de7fb 3983defsubr (struct Lisp_Subr *sname)
078e7b4a 3984{
c644523b 3985 Lisp_Object sym, tem;
d67b4f80 3986 sym = intern_c_string (sname->symbol_name);
eab3844f 3987 XSETTYPED_PVECTYPE (sname, size, PVEC_SUBR);
c644523b
DA
3988 XSETSUBR (tem, sname);
3989 set_symbol_function (sym, tem);
078e7b4a
JB
3990}
3991
48def666 3992#ifdef NOTDEF /* Use fset in subr.el now! */
078e7b4a 3993void
1dae0f0a 3994defalias (struct Lisp_Subr *sname, char *string)
078e7b4a
JB
3995{
3996 Lisp_Object sym;
3997 sym = intern (string);
1805de4f 3998 XSETSUBR (XSYMBOL (sym)->function, sname);
078e7b4a
JB
3999}
4000#endif /* NOTDEF */
4001
039c6cc3 4002/* Define an "integer variable"; a symbol whose value is forwarded to a
82cb60d3 4003 C variable of type EMACS_INT. Sample call (with "xx" to fool make-docfile):
039c6cc3 4004 DEFxxVAR_INT ("emacs-priority", &emacs_priority, "Documentation"); */
078e7b4a 4005void
ce5b453a
SM
4006defvar_int (struct Lisp_Intfwd *i_fwd,
4007 const char *namestring, EMACS_INT *address)
078e7b4a 4008{
ce5b453a 4009 Lisp_Object sym;
5e2327cf 4010 sym = intern_c_string (namestring);
ce5b453a
SM
4011 i_fwd->type = Lisp_Fwd_Int;
4012 i_fwd->intvar = address;
b9598260 4013 XSYMBOL (sym)->declared_special = 1;
ce5b453a
SM
4014 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
4015 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)i_fwd);
078e7b4a
JB
4016}
4017
f0529b5b 4018/* Similar but define a variable whose value is t if address contains 1,
0f011df0 4019 nil if address contains 0. */
078e7b4a 4020void
ce5b453a 4021defvar_bool (struct Lisp_Boolfwd *b_fwd,
f5d9e83a 4022 const char *namestring, bool *address)
078e7b4a 4023{
ce5b453a 4024 Lisp_Object sym;
5e2327cf 4025 sym = intern_c_string (namestring);
ce5b453a
SM
4026 b_fwd->type = Lisp_Fwd_Bool;
4027 b_fwd->boolvar = address;
b9598260 4028 XSYMBOL (sym)->declared_special = 1;
ce5b453a
SM
4029 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
4030 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)b_fwd);
1ffcc3b1 4031 Vbyte_boolean_vars = Fcons (sym, Vbyte_boolean_vars);
078e7b4a
JB
4032}
4033
1a0f90f7
KH
4034/* Similar but define a variable whose value is the Lisp Object stored
4035 at address. Two versions: with and without gc-marking of the C
4036 variable. The nopro version is used when that variable will be
4037 gc-marked for some other reason, since marking the same slot twice
4038 can cause trouble with strings. */
078e7b4a 4039void
ce5b453a
SM
4040defvar_lisp_nopro (struct Lisp_Objfwd *o_fwd,
4041 const char *namestring, Lisp_Object *address)
078e7b4a 4042{
ce5b453a 4043 Lisp_Object sym;
5e2327cf 4044 sym = intern_c_string (namestring);
ce5b453a
SM
4045 o_fwd->type = Lisp_Fwd_Obj;
4046 o_fwd->objvar = address;
b9598260 4047 XSYMBOL (sym)->declared_special = 1;
ce5b453a
SM
4048 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
4049 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)o_fwd);
078e7b4a
JB
4050}
4051
078e7b4a 4052void
ce5b453a
SM
4053defvar_lisp (struct Lisp_Objfwd *o_fwd,
4054 const char *namestring, Lisp_Object *address)
078e7b4a 4055{
ce5b453a 4056 defvar_lisp_nopro (o_fwd, namestring, address);
1a0f90f7 4057 staticpro (address);
078e7b4a
JB
4058}
4059
950c215d 4060/* Similar but define a variable whose value is the Lisp Object stored
4ac38690 4061 at a particular offset in the current kboard object. */
950c215d
KH
4062
4063void
ce5b453a
SM
4064defvar_kboard (struct Lisp_Kboard_Objfwd *ko_fwd,
4065 const char *namestring, int offset)
950c215d 4066{
ce5b453a 4067 Lisp_Object sym;
5e2327cf 4068 sym = intern_c_string (namestring);
ce5b453a
SM
4069 ko_fwd->type = Lisp_Fwd_Kboard_Obj;
4070 ko_fwd->offset = offset;
b9598260 4071 XSYMBOL (sym)->declared_special = 1;
ce5b453a
SM
4072 XSYMBOL (sym)->redirect = SYMBOL_FORWARDED;
4073 SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)ko_fwd);
950c215d 4074}
078e7b4a 4075\f
929e7845
GM
4076/* Check that the elements of Vload_path exist. */
4077
b3350bf9 4078static void
929e7845
GM
4079load_path_check (void)
4080{
4081 Lisp_Object path_tail;
4082
4083 /* The only elements that might not exist are those from
4084 PATH_LOADSEARCH, EMACSLOADPATH. Anything else is only added if
4085 it exists. */
4086 for (path_tail = Vload_path; !NILP (path_tail); path_tail = XCDR (path_tail))
4087 {
4088 Lisp_Object dirfile;
4089 dirfile = Fcar (path_tail);
4090 if (STRINGP (dirfile))
4091 {
4092 dirfile = Fdirectory_file_name (dirfile);
e752e0b0 4093 if (faccessat (AT_FDCWD, SSDATA (dirfile), F_OK, AT_EACCESS) != 0)
929e7845
GM
4094 dir_warning ("Warning: Lisp directory `%s' does not exist.\n",
4095 XCAR (path_tail));
4096 }
4097 }
4098}
4099
11938f10
KH
4100/* Record the value of load-path used at the start of dumping
4101 so we can see if the site changed it later during dumping. */
4102static Lisp_Object dump_path;
4103
929e7845
GM
4104/* Compute the default Vload_path, with the following logic:
4105 If CANNOT_DUMP:
4106 use EMACSLOADPATH env-var if set; otherwise use PATH_LOADSEARCH,
4107 prepending PATH_SITELOADSEARCH unless --no-site-lisp.
4108 The remainder is what happens when dumping works:
4109 If purify-flag (ie dumping) just use PATH_DUMPLOADSEARCH.
4110 Otherwise use EMACSLOADPATH if set, else PATH_LOADSEARCH.
4111
4112 If !initialized, then just set both Vload_path and dump_path.
4113 If initialized, then if Vload_path != dump_path, do nothing.
4114 (Presumably the load-path has already been changed by something.
4115 This can only be from a site-load file during dumping,
4116 or because EMACSLOADPATH is set.)
4117 If Vinstallation_directory is not nil (ie, running uninstalled):
4118 If installation-dir/lisp exists and not already a member,
4119 we must be running uninstalled. Reset the load-path
4120 to just installation-dir/lisp. (The default PATH_LOADSEARCH
4121 refers to the eventual installation directories. Since we
4122 are not yet installed, we should not use them, even if they exist.)
4123 If installation-dir/lisp does not exist, just add dump_path at the
4124 end instead.
4125 Add installation-dir/leim (if exists and not already a member) at the front.
4126 Add installation-dir/site-lisp (if !no_site_lisp, and exists
4127 and not already a member) at the front.
4128 If installation-dir != source-dir (ie running an uninstalled,
4129 out-of-tree build) AND install-dir/src/Makefile exists BUT
4130 install-dir/src/Makefile.in does NOT exist (this is a sanity
4131 check), then repeat the above steps for source-dir/lisp,
4132 leim and site-lisp.
4133 Finally, add the site-lisp directories at the front (if !no_site_lisp).
4134*/
4135
d5b28a9d 4136void
971de7fb 4137init_lread (void)
078e7b4a 4138{
8ea90aa3 4139 const char *normal;
ca26824c 4140
46947372 4141#ifdef CANNOT_DUMP
9e059e3f
GM
4142#ifdef HAVE_NS
4143 const char *loadpath = ns_load_path ();
4144#endif
4145
46947372 4146 normal = PATH_LOADSEARCH;
9e059e3f
GM
4147#ifdef HAVE_NS
4148 Vload_path = decode_env_path ("EMACSLOADPATH", loadpath ? loadpath : normal);
4149#else
929e7845 4150 Vload_path = decode_env_path ("EMACSLOADPATH", normal);
9e059e3f 4151#endif
929e7845
GM
4152
4153 load_path_check ();
4154
4155 /* FIXME CANNOT_DUMP platforms should get source-dir/lisp etc added
4156 to their load-path too, AFAICS. I don't think we can tell the
4157 difference between initialized and !initialized in this case,
4158 so we'll have to do it unconditionally when Vinstallation_directory
4159 is non-nil. */
4160 if (!no_site_lisp && !egetenv ("EMACSLOADPATH"))
ca26824c
GM
4161 {
4162 Lisp_Object sitelisp;
4163 sitelisp = decode_env_path (0, PATH_SITELOADSEARCH);
4164 if (! NILP (sitelisp)) Vload_path = nconc2 (sitelisp, Vload_path);
4165 }
76151e2c 4166#else /* !CANNOT_DUMP */
46947372 4167 if (NILP (Vpurify_flag))
929e7845
GM
4168 {
4169 normal = PATH_LOADSEARCH;
4170 /* If the EMACSLOADPATH environment variable is set, use its value.
4171 This doesn't apply if we're dumping. */
4172 if (egetenv ("EMACSLOADPATH"))
4173 Vload_path = decode_env_path ("EMACSLOADPATH", normal);
4174 }
279499f0 4175 else
46947372 4176 normal = PATH_DUMPLOADSEARCH;
279499f0 4177
9d8d07e5
GM
4178 /* In a dumped Emacs, we normally reset the value of Vload_path using
4179 PATH_LOADSEARCH, since the value that was dumped uses lisp/ in
4180 the source directory, instead of the path of the installed elisp
4181 libraries. However, if it appears that Vload_path has already been
4182 changed from the default that was saved before dumping, don't
929e7845
GM
4183 change it further. Changes can only be due to EMACSLOADPATH, or
4184 site-lisp files that were processed during dumping. */
4746118a
JB
4185 if (initialized)
4186 {
929e7845
GM
4187 if (NILP (Fequal (dump_path, Vload_path)))
4188 {
4189 /* Do not make any changes, just check the elements exist. */
4190 /* Note: --no-site-lisp is ignored.
4191 I don't know what to do about this. */
4192 load_path_check ();
4193 }
4194 else
80667d53 4195 {
9e059e3f
GM
4196#ifdef HAVE_NS
4197 const char *loadpath = ns_load_path ();
4198 Vload_path = decode_env_path (0, loadpath ? loadpath : normal);
4199#else
80667d53 4200 Vload_path = decode_env_path (0, normal);
9e059e3f 4201#endif
ca26824c 4202 if (!NILP (Vinstallation_directory))
80667d53 4203 {
ca26824c
GM
4204 Lisp_Object tem, tem1;
4205
929e7845
GM
4206 /* Add to the path the lisp subdir of the installation
4207 dir, if it exists. Note: in out-of-tree builds,
4208 this directory is empty save for Makefile. */
ca26824c
GM
4209 tem = Fexpand_file_name (build_string ("lisp"),
4210 Vinstallation_directory);
4211 tem1 = Ffile_exists_p (tem);
4212 if (!NILP (tem1))
4213 {
4214 if (NILP (Fmember (tem, Vload_path)))
4215 {
929e7845
GM
4216 /* We are running uninstalled. The default load-path
4217 points to the eventual installed lisp, leim
4218 directories. We should not use those now, even
4219 if they exist, so start over from a clean slate. */
4220 Vload_path = Fcons (tem, Qnil);
ca26824c
GM
4221 }
4222 }
4223 else
4224 /* That dir doesn't exist, so add the build-time
4225 Lisp dirs instead. */
4226 Vload_path = nconc2 (Vload_path, dump_path);
4227
4228 /* Add leim under the installation dir, if it exists. */
4229 tem = Fexpand_file_name (build_string ("leim"),
4230 Vinstallation_directory);
4231 tem1 = Ffile_exists_p (tem);
4232 if (!NILP (tem1))
4233 {
4234 if (NILP (Fmember (tem, Vload_path)))
4235 Vload_path = Fcons (tem, Vload_path);
4236 }
4237
4238 /* Add site-lisp under the installation dir, if it exists. */
4239 if (!no_site_lisp)
4240 {
4241 tem = Fexpand_file_name (build_string ("site-lisp"),
4242 Vinstallation_directory);
4243 tem1 = Ffile_exists_p (tem);
4244 if (!NILP (tem1))
4245 {
4246 if (NILP (Fmember (tem, Vload_path)))
4247 Vload_path = Fcons (tem, Vload_path);
4248 }
4249 }
4250
4251 /* If Emacs was not built in the source directory,
4252 and it is run from where it was built, add to load-path
4253 the lisp, leim and site-lisp dirs under that directory. */
4254
4255 if (NILP (Fequal (Vinstallation_directory, Vsource_directory)))
4256 {
4257 Lisp_Object tem2;
4258
4259 tem = Fexpand_file_name (build_string ("src/Makefile"),
4260 Vinstallation_directory);
4261 tem1 = Ffile_exists_p (tem);
4262
4263 /* Don't be fooled if they moved the entire source tree
4264 AFTER dumping Emacs. If the build directory is indeed
4265 different from the source dir, src/Makefile.in and
4266 src/Makefile will not be found together. */
4267 tem = Fexpand_file_name (build_string ("src/Makefile.in"),
4268 Vinstallation_directory);
4269 tem2 = Ffile_exists_p (tem);
4270 if (!NILP (tem1) && NILP (tem2))
4271 {
4272 tem = Fexpand_file_name (build_string ("lisp"),
4273 Vsource_directory);
4274
4275 if (NILP (Fmember (tem, Vload_path)))
4276 Vload_path = Fcons (tem, Vload_path);
4277
4278 tem = Fexpand_file_name (build_string ("leim"),
4279 Vsource_directory);
4280
4281 if (NILP (Fmember (tem, Vload_path)))
4282 Vload_path = Fcons (tem, Vload_path);
4283
4284 if (!no_site_lisp)
4285 {
4286 tem = Fexpand_file_name (build_string ("site-lisp"),
4287 Vsource_directory);
31d02438
GM
4288 tem1 = Ffile_exists_p (tem);
4289 if (!NILP (tem1))
4290 {
4291 if (NILP (Fmember (tem, Vload_path)))
4292 Vload_path = Fcons (tem, Vload_path);
4293 }
ca26824c
GM
4294 }
4295 }
4296 } /* Vinstallation_directory != Vsource_directory */
4297
4298 } /* if Vinstallation_directory */
4299
929e7845
GM
4300 /* Check before adding the site-lisp directories.
4301 The install should have created them, but they are not
4302 required, so no need to warn if they are absent.
4303 Or we might be running before installation. */
4304 load_path_check ();
4305
ca26824c 4306 /* Add the site-lisp directories at the front. */
ca26824c
GM
4307 if (!no_site_lisp)
4308 {
4309 Lisp_Object sitelisp;
4310 sitelisp = decode_env_path (0, PATH_SITELOADSEARCH);
4311 if (! NILP (sitelisp)) Vload_path = nconc2 (sitelisp, Vload_path);
4312 }
4313 } /* if dump_path == Vload_path */
4746118a 4314 }
9d8d07e5 4315 else /* !initialized */
11938f10 4316 {
929e7845
GM
4317 /* NORMAL refers to PATH_DUMPLOADSEARCH, ie the lisp dir in the
4318 source directory. We used to add ../lisp (ie the lisp dir in
4319 the build directory) at the front here, but that caused trouble
4320 because it was copied from dump_path into Vload_path, above,
4321 when Vinstallation_directory was non-nil. It should not be
4322 necessary, since in out of tree builds lisp/ is empty, save
4323 for Makefile. */
7b396c6c 4324 Vload_path = decode_env_path (0, normal);
11938f10 4325 dump_path = Vload_path;
929e7845
GM
4326 /* No point calling load_path_check; load-path only contains essential
4327 elements from the source directory at this point. They cannot
4328 be missing unless something went extremely (and improbably)
4329 wrong, in which case the build will fail in obvious ways. */
11938f10 4330 }
76151e2c 4331#endif /* !CANNOT_DUMP */
279499f0 4332
279499f0
JB
4333 Vvalues = Qnil;
4334
078e7b4a 4335 load_in_progress = 0;
4e53f562 4336 Vload_file_name = Qnil;
d2c6be7f
RS
4337
4338 load_descriptor_list = Qnil;
8f6b0411
RS
4339
4340 Vstandard_input = Qt;
f74b0705 4341 Vloads_in_progress = Qnil;
078e7b4a
JB
4342}
4343
85496b8c 4344/* Print a warning, using format string FORMAT, that directory DIRNAME
88852d45 4345 does not exist. Print it on stderr and put it in *Messages*. */
85496b8c 4346
d5b28a9d 4347void
a8fe7202 4348dir_warning (const char *format, Lisp_Object dirname)
85496b8c 4349{
d5db4077 4350 fprintf (stderr, format, SDATA (dirname));
0df02bf3 4351
48def666 4352 /* Don't log the warning before we've initialized!! */
9b69357e 4353 if (initialized)
0df02bf3 4354 {
0df02bf3 4355 USE_SAFE_ALLOCA;
98c6f1e3
PE
4356 char *buffer = SAFE_ALLOCA (SBYTES (dirname)
4357 + strlen (format) - (sizeof "%s" - 1) + 1);
4358 ptrdiff_t message_len = esprintf (buffer, format, SDATA (dirname));
0df02bf3
PE
4359 message_dolog (buffer, message_len, 0, STRING_MULTIBYTE (dirname));
4360 SAFE_FREE ();
4361 }
85496b8c
RS
4362}
4363
078e7b4a 4364void
971de7fb 4365syms_of_lread (void)
078e7b4a
JB
4366{
4367 defsubr (&Sread);
4368 defsubr (&Sread_from_string);
4369 defsubr (&Sintern);
4370 defsubr (&Sintern_soft);
d007f5c8 4371 defsubr (&Sunintern);
971a4293 4372 defsubr (&Sget_load_suffixes);
078e7b4a 4373 defsubr (&Sload);
228d4b1c 4374 defsubr (&Seval_buffer);
078e7b4a
JB
4375 defsubr (&Seval_region);
4376 defsubr (&Sread_char);
4377 defsubr (&Sread_char_exclusive);
078e7b4a 4378 defsubr (&Sread_event);
078e7b4a
JB
4379 defsubr (&Sget_file_char);
4380 defsubr (&Smapatoms);
86d00812 4381 defsubr (&Slocate_file_internal);
078e7b4a 4382
29208e82 4383 DEFVAR_LISP ("obarray", Vobarray,
5de38842
PJ
4384 doc: /* Symbol table for use by `intern' and `read'.
4385It is a vector whose length ought to be prime for best results.
4386The vector's contents don't make sense if examined from Lisp programs;
4387to find all the symbols in an obarray, use `mapatoms'. */);
078e7b4a 4388
29208e82 4389 DEFVAR_LISP ("values", Vvalues,
5de38842 4390 doc: /* List of values of all expressions which were read, evaluated and printed.
513749ee
SM
4391 Order is reverse chronological. */);
4392 XSYMBOL (intern ("values"))->declared_special = 0;
078e7b4a 4393
29208e82 4394 DEFVAR_LISP ("standard-input", Vstandard_input,
5de38842
PJ
4395 doc: /* Stream for read to get input from.
4396See documentation of `read' for possible values. */);
078e7b4a
JB
4397 Vstandard_input = Qt;
4398
29208e82 4399 DEFVAR_LISP ("read-with-symbol-positions", Vread_with_symbol_positions,
abb13b09
CW
4400 doc: /* If non-nil, add position of read symbols to `read-symbol-positions-list'.
4401
4402If this variable is a buffer, then only forms read from that buffer
4403will be added to `read-symbol-positions-list'.
4404If this variable is t, then all read forms will be added.
4405The effect of all other values other than nil are not currently
4406defined, although they may be in the future.
4407
4408The positions are relative to the last call to `read' or
4409`read-from-string'. It is probably a bad idea to set this variable at
513749ee 4410the toplevel; bind it instead. */);
abb13b09
CW
4411 Vread_with_symbol_positions = Qnil;
4412
29208e82 4413 DEFVAR_LISP ("read-symbol-positions-list", Vread_symbol_positions_list,
d6567030 4414 doc: /* A list mapping read symbols to their positions.
abb13b09
CW
4415This variable is modified during calls to `read' or
4416`read-from-string', but only when `read-with-symbol-positions' is
4417non-nil.
4418
4419Each element of the list looks like (SYMBOL . CHAR-POSITION), where
d6567030 4420CHAR-POSITION is an integer giving the offset of that occurrence of the
abb13b09
CW
4421symbol from the position where `read' or `read-from-string' started.
4422
4423Note that a symbol will appear multiple times in this list, if it was
4424read multiple times. The list is in the same order as the symbols
513749ee 4425were read in. */);
177c0ea7 4426 Vread_symbol_positions_list = Qnil;
abb13b09 4427
29208e82 4428 DEFVAR_LISP ("read-circle", Vread_circle,
91f68422
CY
4429 doc: /* Non-nil means read recursive structures using #N= and #N# syntax. */);
4430 Vread_circle = Qt;
4431
29208e82 4432 DEFVAR_LISP ("load-path", Vload_path,
fb7ada5f 4433 doc: /* List of directories to search for files to load.
5de38842
PJ
4434Each element is a string (directory name) or nil (try default directory).
4435Initialized based on EMACSLOADPATH environment variable, if any,
4436otherwise to default specified by file `epaths.h' when Emacs was built. */);
078e7b4a 4437
29208e82 4438 DEFVAR_LISP ("load-suffixes", Vload_suffixes,
971a4293
LT
4439 doc: /* List of suffixes for (compiled or source) Emacs Lisp files.
4440This list should not include the empty string.
4441`load' and related functions try to append these suffixes, in order,
4442to the specified file name if a Lisp suffix is allowed or required. */);
2a0213a6
DA
4443 Vload_suffixes = Fcons (build_pure_c_string (".elc"),
4444 Fcons (build_pure_c_string (".el"), Qnil));
29208e82 4445 DEFVAR_LISP ("load-file-rep-suffixes", Vload_file_rep_suffixes,
971a4293
LT
4446 doc: /* List of suffixes that indicate representations of \
4447the same file.
4448This list should normally start with the empty string.
4449
4450Enabling Auto Compression mode appends the suffixes in
4451`jka-compr-load-suffixes' to this list and disabling Auto Compression
4452mode removes them again. `load' and related functions use this list to
4453determine whether they should look for compressed versions of a file
4454and, if so, which suffixes they should try to append to the file name
4455in order to do so. However, if you want to customize which suffixes
4456the loading functions recognize as compression suffixes, you should
4457customize `jka-compr-load-suffixes' rather than the present variable. */);
a74d1c97 4458 Vload_file_rep_suffixes = Fcons (empty_unibyte_string, Qnil);
e61b9b87 4459
29208e82 4460 DEFVAR_BOOL ("load-in-progress", load_in_progress,
e0f24100 4461 doc: /* Non-nil if inside of `load'. */);
cd3520a4 4462 DEFSYM (Qload_in_progress, "load-in-progress");
078e7b4a 4463
29208e82 4464 DEFVAR_LISP ("after-load-alist", Vafter_load_alist,
5de38842 4465 doc: /* An alist of expressions to be evalled when particular files are loaded.
6bb6da3e
AM
4466Each element looks like (REGEXP-OR-FEATURE FORMS...).
4467
4468REGEXP-OR-FEATURE is either a regular expression to match file names, or
4469a symbol \(a feature name).
4470
4471When `load' is run and the file-name argument matches an element's
4472REGEXP-OR-FEATURE, or when `provide' is run and provides the symbol
4473REGEXP-OR-FEATURE, the FORMS in the element are executed.
4474
4475An error in FORMS does not undo the load, but does prevent execution of
4476the rest of the FORMS. */);
078e7b4a
JB
4477 Vafter_load_alist = Qnil;
4478
29208e82 4479 DEFVAR_LISP ("load-history", Vload_history,
4801c5fa
CY
4480 doc: /* Alist mapping loaded file names to symbols and features.
4481Each alist element should be a list (FILE-NAME ENTRIES...), where
4482FILE-NAME is the name of a file that has been loaded into Emacs.
4483The file name is absolute and true (i.e. it doesn't contain symlinks).
4484As an exception, one of the alist elements may have FILE-NAME nil,
4485for symbols and features not associated with any file.
4486
4487The remaining ENTRIES in the alist element describe the functions and
4488variables defined in that file, the features provided, and the
4489features required. Each entry has the form `(provide . FEATURE)',
4490`(require . FEATURE)', `(defun . FUNCTION)', `(autoload . SYMBOL)',
69bb1ef7
LMI
4491`(defface . SYMBOL)', or `(t . SYMBOL)'. Entries like `(t . SYMBOL)'
4492may precede a `(defun . FUNCTION)' entry, and means that SYMBOL was an
4493autoload before this file redefined it as a function. In addition,
4494entries may also be single symbols, which means that SYMBOL was
4495defined by `defvar' or `defconst'.
0fc213e9 4496
b502a9a1
RS
4497During preloading, the file name recorded is relative to the main Lisp
4498directory. These file names are converted to absolute at startup. */);
ae321d28
RS
4499 Vload_history = Qnil;
4500
29208e82 4501 DEFVAR_LISP ("load-file-name", Vload_file_name,
5de38842 4502 doc: /* Full name of file being loaded by `load'. */);
20ea2964
RS
4503 Vload_file_name = Qnil;
4504
29208e82 4505 DEFVAR_LISP ("user-init-file", Vuser_init_file,
5de38842 4506 doc: /* File name, including directory, of user's initialization file.
0a25a201
RS
4507If the file loaded had extension `.elc', and the corresponding source file
4508exists, this variable contains the name of source file, suitable for use
099de390
JB
4509by functions like `custom-save-all' which edit the init file.
4510While Emacs loads and evaluates the init file, value is the real name
4511of the file, regardless of whether or not it has the `.elc' extension. */);
4116ab9f
KH
4512 Vuser_init_file = Qnil;
4513
29208e82 4514 DEFVAR_LISP ("current-load-list", Vcurrent_load_list,
5de38842 4515 doc: /* Used for internal purposes by `load'. */);
ae321d28
RS
4516 Vcurrent_load_list = Qnil;
4517
29208e82 4518 DEFVAR_LISP ("load-read-function", Vload_read_function,
5de38842
PJ
4519 doc: /* Function used by `load' and `eval-region' for reading expressions.
4520The default is nil, which means use the function `read'. */);
84a15045
RS
4521 Vload_read_function = Qnil;
4522
29208e82 4523 DEFVAR_LISP ("load-source-file-function", Vload_source_file_function,
9b33a603 4524 doc: /* Function called in `load' for loading an Emacs Lisp source file.
5de38842
PJ
4525This function is for doing code conversion before reading the source file.
4526If nil, loading is done without any code conversion.
4527Arguments are FULLNAME, FILE, NOERROR, NOMESSAGE, where
4528 FULLNAME is the full name of FILE.
4529See `load' for the meaning of the remaining arguments. */);
fe0e03f3
KH
4530 Vload_source_file_function = Qnil;
4531
29208e82 4532 DEFVAR_BOOL ("load-force-doc-strings", load_force_doc_strings,
5de38842
PJ
4533 doc: /* Non-nil means `load' should force-load all dynamic doc strings.
4534This is useful when the file being loaded is a temporary copy. */);
b2a30870
RS
4535 load_force_doc_strings = 0;
4536
29208e82 4537 DEFVAR_BOOL ("load-convert-to-unibyte", load_convert_to_unibyte,
5de38842
PJ
4538 doc: /* Non-nil means `read' converts strings to unibyte whenever possible.
4539This is normally bound by `load' and `eval-buffer' to control `read',
4540and is not meant for users to change. */);
94e554db
RS
4541 load_convert_to_unibyte = 0;
4542
29208e82 4543 DEFVAR_LISP ("source-directory", Vsource_directory,
5de38842
PJ
4544 doc: /* Directory in which Emacs sources were found when Emacs was built.
4545You cannot count on them to still be there! */);
a90ba1e2
KH
4546 Vsource_directory
4547 = Fexpand_file_name (build_string ("../"),
4548 Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH)));
4549
29208e82 4550 DEFVAR_LISP ("preloaded-file-list", Vpreloaded_file_list,
5de38842 4551 doc: /* List of files that were preloaded (when dumping Emacs). */);
4b104c41
RS
4552 Vpreloaded_file_list = Qnil;
4553
29208e82 4554 DEFVAR_LISP ("byte-boolean-vars", Vbyte_boolean_vars,
5de38842 4555 doc: /* List of all DEFVAR_BOOL variables, used by the byte code optimizer. */);
1ffcc3b1
DL
4556 Vbyte_boolean_vars = Qnil;
4557
29208e82 4558 DEFVAR_BOOL ("load-dangerous-libraries", load_dangerous_libraries,
5de38842
PJ
4559 doc: /* Non-nil means load dangerous compiled Lisp files.
4560Some versions of XEmacs use different byte codes than Emacs. These
4561incompatible byte codes can make Emacs crash when it tries to execute
4562them. */);
da84f340
GM
4563 load_dangerous_libraries = 0;
4564
29208e82 4565 DEFVAR_BOOL ("force-load-messages", force_load_messages,
beb0b7f9
EZ
4566 doc: /* Non-nil means force printing messages when loading Lisp files.
4567This overrides the value of the NOMESSAGE argument to `load'. */);
4568 force_load_messages = 0;
4569
29208e82 4570 DEFVAR_LISP ("bytecomp-version-regexp", Vbytecomp_version_regexp,
5de38842
PJ
4571 doc: /* Regular expression matching safe to load compiled Lisp files.
4572When Emacs loads a compiled Lisp file, it reads the first 512 bytes
4573from the file, and matches them against this regular expression.
4574When the regular expression matches, the file is considered to be safe
4575to load. See also `load-dangerous-libraries'. */);
bb970e67 4576 Vbytecomp_version_regexp
2a0213a6 4577 = build_pure_c_string ("^;;;.\\(in Emacs version\\|bytecomp version FSF\\)");
da84f340 4578
14ae4239 4579 DEFSYM (Qlexical_binding, "lexical-binding");
8f1d2ef6 4580 DEFVAR_LISP ("lexical-binding", Vlexical_binding,
f41628b2
LMI
4581 doc: /* Whether to use lexical binding when evaluating code.
4582Non-nil means that the code in the current buffer should be evaluated
4583with lexical binding.
1d698799 4584This variable is automatically set from the file variables of an
48da7392
GM
4585interpreted Lisp file read using `load'. Unlike other file local
4586variables, this must be set in the first line of a file. */);
14ae4239 4587 Vlexical_binding = Qnil;
b9598260
SM
4588 Fmake_variable_buffer_local (Qlexical_binding);
4589
29208e82 4590 DEFVAR_LISP ("eval-buffer-list", Veval_buffer_list,
3f39f996
RS
4591 doc: /* List of buffers being read from by calls to `eval-buffer' and `eval-region'. */);
4592 Veval_buffer_list = Qnil;
4593
29208e82 4594 DEFVAR_LISP ("old-style-backquotes", Vold_style_backquotes,
5aa273b0
SM
4595 doc: /* Set to non-nil when `read' encounters an old-style backquote. */);
4596 Vold_style_backquotes = Qnil;
cd3520a4 4597 DEFSYM (Qold_style_backquotes, "old-style-backquotes");
5aa273b0 4598
a90ba1e2
KH
4599 /* Vsource_directory was initialized in init_lread. */
4600
d2c6be7f
RS
4601 load_descriptor_list = Qnil;
4602 staticpro (&load_descriptor_list);
4603
cd3520a4
JB
4604 DEFSYM (Qcurrent_load_list, "current-load-list");
4605 DEFSYM (Qstandard_input, "standard-input");
4606 DEFSYM (Qread_char, "read-char");
4607 DEFSYM (Qget_file_char, "get-file-char");
4608 DEFSYM (Qget_emacs_mule_file_char, "get-emacs-mule-file-char");
4609 DEFSYM (Qload_force_doc_strings, "load-force-doc-strings");
4610
4611 DEFSYM (Qbackquote, "`");
4612 DEFSYM (Qcomma, ",");
4613 DEFSYM (Qcomma_at, ",@");
4614 DEFSYM (Qcomma_dot, ",.");
4615
4616 DEFSYM (Qinhibit_file_name_operation, "inhibit-file-name-operation");
4617 DEFSYM (Qascii_character, "ascii-character");
4618 DEFSYM (Qfunction, "function");
4619 DEFSYM (Qload, "load");
4620 DEFSYM (Qload_file_name, "load-file-name");
4621 DEFSYM (Qeval_buffer_list, "eval-buffer-list");
4622 DEFSYM (Qfile_truename, "file-truename");
4623 DEFSYM (Qdir_ok, "dir-ok");
4624 DEFSYM (Qdo_after_load_evaluation, "do-after-load-evaluation");
6bb6da3e 4625
11938f10 4626 staticpro (&dump_path);
4ad679f9
EN
4627
4628 staticpro (&read_objects);
4629 read_objects = Qnil;
9e062b6c 4630 staticpro (&seen_list);
f153db13 4631 seen_list = Qnil;
177c0ea7 4632
7ee3bd7b
GM
4633 Vloads_in_progress = Qnil;
4634 staticpro (&Vloads_in_progress);
f19a0f5b 4635
cd3520a4
JB
4636 DEFSYM (Qhash_table, "hash-table");
4637 DEFSYM (Qdata, "data");
4638 DEFSYM (Qtest, "test");
4639 DEFSYM (Qsize, "size");
4640 DEFSYM (Qweakness, "weakness");
4641 DEFSYM (Qrehash_size, "rehash-size");
4642 DEFSYM (Qrehash_threshold, "rehash-threshold");
078e7b4a 4643}