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