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