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