Merge from emacs-24; up to 2012-12-30T19:34:25Z!jan.h.d@swipnet.se
[bpt/emacs.git] / src / lread.c
CommitLineData
078e7b4a 1/* Lisp parsing and input streams.
039c6cc3 2
ab422c4d
PE
3Copyright (C) 1985-1989, 1993-1995, 1997-2013 Free Software Foundation,
4Inc.
078e7b4a
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
078e7b4a 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
078e7b4a
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
078e7b4a
JB
20
21
98280b76 22#include <config.h>
078e7b4a
JB
23#include <stdio.h>
24#include <sys/types.h>
25#include <sys/stat.h>
26#include <sys/file.h>
2c1b5dbe 27#include <errno.h>
9660f5fc 28#include <limits.h> /* For CHAR_BIT. */
39adff0d 29#include <stat-time.h>
078e7b4a 30#include "lisp.h"
95384e1e 31#include "intervals.h"
1571601b 32#include "character.h"
e5560ff7 33#include "buffer.h"
fe0e03f3 34#include "charset.h"
8792be66 35#include "coding.h"
57bda87a 36#include <epaths.h>
078e7b4a 37#include "commands.h"
e37c0805 38#include "keyboard.h"
428a555e 39#include "frame.h"
7bd279cd 40#include "termhooks.h"
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
d2c6be7f
RS
98/* List of descriptors now open for Fload. */
99static Lisp_Object load_descriptor_list;
100
b2a30870 101/* File for get_file_char to read from. Use by load. */
078e7b4a
JB
102static FILE *instream;
103
b2a30870 104/* For use within read-from-string (this reader is non-reentrant!!) */
d311d28c
PE
105static ptrdiff_t read_from_string_index;
106static ptrdiff_t read_from_string_index_byte;
107static ptrdiff_t read_from_string_limit;
17634846 108
abb13b09 109/* Number of characters read in the current call to Fread or
48def666 110 Fread_from_string. */
da43f021 111static EMACS_INT readchar_count;
6f7f43d5 112
c15cfd1f 113/* This contains the last string skipped with #@. */
b2a30870
RS
114static char *saved_doc_string;
115/* Length of buffer allocated in saved_doc_string. */
bfbbd7e7 116static ptrdiff_t saved_doc_string_size;
b2a30870 117/* Length of actual data in saved_doc_string. */
bfbbd7e7 118static ptrdiff_t saved_doc_string_length;
b2a30870 119/* This is the file position that string came from. */
68c45bf0 120static file_offset saved_doc_string_position;
b2a30870 121
c15cfd1f
RS
122/* This contains the previous string skipped with #@.
123 We copy it from saved_doc_string when a new string
124 is put in saved_doc_string. */
125static char *prev_saved_doc_string;
126/* Length of buffer allocated in prev_saved_doc_string. */
bfbbd7e7 127static ptrdiff_t prev_saved_doc_string_size;
c15cfd1f 128/* Length of actual data in prev_saved_doc_string. */
bfbbd7e7 129static ptrdiff_t prev_saved_doc_string_length;
c15cfd1f 130/* This is the file position that string came from. */
68c45bf0 131static file_offset prev_saved_doc_string_position;
c15cfd1f 132
7cded46f 133/* True means inside a new-style backquote
17634846 134 with no surrounding parentheses.
7cded46f 135 Fread initializes this to false, so we need not specbind it
17634846 136 or worry about what happens to it when there is an error. */
7cded46f 137static bool new_backquote_flag;
29208e82 138static Lisp_Object Qold_style_backquotes;
7ee3bd7b
GM
139
140/* A list of file names for files being loaded in Fload. Used to
141 check for recursive loads. */
142
9942fa0c 143static Lisp_Object Vloads_in_progress;
7ee3bd7b 144
f57e2426
J
145static int read_emacs_mule_char (int, int (*) (int, Lisp_Object),
146 Lisp_Object);
8792be66 147
7cded46f 148static void readevalloop (Lisp_Object, FILE *, Lisp_Object, bool,
f57e2426
J
149 Lisp_Object, Lisp_Object,
150 Lisp_Object, Lisp_Object);
151static Lisp_Object load_unwind (Lisp_Object);
152static Lisp_Object load_descriptor_unwind (Lisp_Object);
078e7b4a 153\f
8792be66
KH
154/* Functions that read one byte from the current source READCHARFUN
155 or unreads one byte. If the integer argument C is -1, it returns
156 one read byte, or -1 when there's no more byte in the source. If C
157 is 0 or positive, it unreads C, and the return value is not
158 interesting. */
159
f57e2426
J
160static int readbyte_for_lambda (int, Lisp_Object);
161static int readbyte_from_file (int, Lisp_Object);
162static int readbyte_from_string (int, Lisp_Object);
8792be66 163
078e7b4a
JB
164/* Handle unreading and rereading of characters.
165 Write READCHAR to read a character,
fe0e03f3
KH
166 UNREAD(c) to unread c to be read again.
167
8792be66 168 These macros correctly read/unread multibyte characters. */
078e7b4a 169
1202434b 170#define READCHAR readchar (readcharfun, NULL)
078e7b4a
JB
171#define UNREAD(c) unreadchar (readcharfun, c)
172
1202434b
KH
173/* Same as READCHAR but set *MULTIBYTE to the multibyteness of the source. */
174#define READCHAR_REPORT_MULTIBYTE(multibyte) readchar (readcharfun, multibyte)
175
8792be66 176/* When READCHARFUN is Qget_file_char, Qget_emacs_mule_file_char,
8f924df7
KH
177 Qlambda, or a cons, we use this to keep an unread character because
178 a file stream can't handle multibyte-char unreading. The value -1
48def666 179 means that there's no unread character. */
8792be66
KH
180static int unread_char;
181
078e7b4a 182static int
fce31d69 183readchar (Lisp_Object readcharfun, bool *multibyte)
078e7b4a
JB
184{
185 Lisp_Object tem;
95384e1e 186 register int c;
f57e2426 187 int (*readbyte) (int, Lisp_Object);
8792be66
KH
188 unsigned char buf[MAX_MULTIBYTE_LENGTH];
189 int i, len;
7cded46f 190 bool emacs_mule_encoding = 0;
078e7b4a 191
1202434b
KH
192 if (multibyte)
193 *multibyte = 0;
194
abb13b09 195 readchar_count++;
177c0ea7 196
cfff016d 197 if (BUFFERP (readcharfun))
078e7b4a 198 {
bed23cb2 199 register struct buffer *inbuffer = XBUFFER (readcharfun);
078e7b4a 200
d311d28c 201 ptrdiff_t pt_byte = BUF_PT_BYTE (inbuffer);
00a9a935 202
15acfe41
GM
203 if (! BUFFER_LIVE_P (inbuffer))
204 return -1;
205
bed23cb2
RS
206 if (pt_byte >= BUF_ZV_BYTE (inbuffer))
207 return -1;
078e7b4a 208
4b4deea2 209 if (! NILP (BVAR (inbuffer, enable_multibyte_characters)))
bed23cb2 210 {
00a9a935 211 /* Fetch the character code from the buffer. */
bed23cb2
RS
212 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, pt_byte);
213 BUF_INC_POS (inbuffer, pt_byte);
62a6e103 214 c = STRING_CHAR (p);
1202434b
KH
215 if (multibyte)
216 *multibyte = 1;
bed23cb2
RS
217 }
218 else
219 {
220 c = BUF_FETCH_BYTE (inbuffer, pt_byte);
8792be66
KH
221 if (! ASCII_BYTE_P (c))
222 c = BYTE8_TO_CHAR (c);
bed23cb2 223 pt_byte++;
6f7f43d5 224 }
bed23cb2 225 SET_BUF_PT_BOTH (inbuffer, BUF_PT (inbuffer) + 1, pt_byte);
6f7f43d5 226
bed23cb2 227 return c;
078e7b4a 228 }
cfff016d 229 if (MARKERP (readcharfun))
078e7b4a 230 {
bed23cb2 231 register struct buffer *inbuffer = XMARKER (readcharfun)->buffer;
078e7b4a 232
d311d28c 233 ptrdiff_t bytepos = marker_byte_position (readcharfun);
00a9a935 234
bed23cb2
RS
235 if (bytepos >= BUF_ZV_BYTE (inbuffer))
236 return -1;
6f7f43d5 237
4b4deea2 238 if (! NILP (BVAR (inbuffer, enable_multibyte_characters)))
bed23cb2 239 {
00a9a935 240 /* Fetch the character code from the buffer. */
bed23cb2
RS
241 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, bytepos);
242 BUF_INC_POS (inbuffer, bytepos);
62a6e103 243 c = STRING_CHAR (p);
1202434b
KH
244 if (multibyte)
245 *multibyte = 1;
bed23cb2
RS
246 }
247 else
248 {
249 c = BUF_FETCH_BYTE (inbuffer, bytepos);
8792be66
KH
250 if (! ASCII_BYTE_P (c))
251 c = BYTE8_TO_CHAR (c);
bed23cb2 252 bytepos++;
6f7f43d5
RS
253 }
254
bed23cb2
RS
255 XMARKER (readcharfun)->bytepos = bytepos;
256 XMARKER (readcharfun)->charpos++;
257
258 return c;
078e7b4a 259 }
ad0153e4
RS
260
261 if (EQ (readcharfun, Qlambda))
8792be66
KH
262 {
263 readbyte = readbyte_for_lambda;
264 goto read_multibyte;
265 }
ad0153e4 266
078e7b4a 267 if (EQ (readcharfun, Qget_file_char))
2c1b5dbe 268 {
8792be66
KH
269 readbyte = readbyte_from_file;
270 goto read_multibyte;
2c1b5dbe 271 }
078e7b4a 272
cfff016d 273 if (STRINGP (readcharfun))
078e7b4a 274 {
bed23cb2 275 if (read_from_string_index >= read_from_string_limit)
078e7b4a 276 c = -1;
1202434b
KH
277 else if (STRING_MULTIBYTE (readcharfun))
278 {
279 if (multibyte)
280 *multibyte = 1;
281 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, readcharfun,
282 read_from_string_index,
283 read_from_string_index_byte);
284 }
f0354c03 285 else
1202434b
KH
286 {
287 c = SREF (readcharfun, read_from_string_index_byte);
288 read_from_string_index++;
289 read_from_string_index_byte++;
290 }
078e7b4a
JB
291 return c;
292 }
293
8792be66
KH
294 if (CONSP (readcharfun))
295 {
296 /* This is the case that read_vector is reading from a unibyte
297 string that contains a byte sequence previously skipped
298 because of #@NUMBER. The car part of readcharfun is that
299 string, and the cdr part is a value of readcharfun given to
300 read_vector. */
301 readbyte = readbyte_from_string;
302 if (EQ (XCDR (readcharfun), Qget_emacs_mule_file_char))
303 emacs_mule_encoding = 1;
304 goto read_multibyte;
305 }
8f924df7 306
8792be66
KH
307 if (EQ (readcharfun, Qget_emacs_mule_file_char))
308 {
309 readbyte = readbyte_from_file;
310 emacs_mule_encoding = 1;
311 goto read_multibyte;
312 }
078e7b4a
JB
313
314 tem = call0 (readcharfun);
315
265a9e55 316 if (NILP (tem))
078e7b4a
JB
317 return -1;
318 return XINT (tem);
8792be66
KH
319
320 read_multibyte:
321 if (unread_char >= 0)
322 {
323 c = unread_char;
324 unread_char = -1;
325 return c;
326 }
327 c = (*readbyte) (-1, readcharfun);
75a65c7e 328 if (c < 0)
1202434b
KH
329 return c;
330 if (multibyte)
331 *multibyte = 1;
332 if (ASCII_BYTE_P (c))
8792be66
KH
333 return c;
334 if (emacs_mule_encoding)
335 return read_emacs_mule_char (c, readbyte, readcharfun);
336 i = 0;
337 buf[i++] = c;
338 len = BYTES_BY_CHAR_HEAD (c);
339 while (i < len)
340 {
341 c = (*readbyte) (-1, readcharfun);
342 if (c < 0 || ! TRAILING_CODE_P (c))
343 {
344 while (--i > 1)
345 (*readbyte) (buf[i], readcharfun);
346 return BYTE8_TO_CHAR (buf[0]);
347 }
348 buf[i++] = c;
349 }
62a6e103 350 return STRING_CHAR (buf);
078e7b4a
JB
351}
352
d2e24f92
SM
353#define FROM_FILE_P(readcharfun) \
354 (EQ (readcharfun, Qget_file_char) \
355 || EQ (readcharfun, Qget_emacs_mule_file_char))
356
75a65c7e
SM
357static void
358skip_dyn_bytes (Lisp_Object readcharfun, ptrdiff_t n)
359{
d2e24f92 360 if (FROM_FILE_P (readcharfun))
75a65c7e
SM
361 {
362 block_input (); /* FIXME: Not sure if it's needed. */
363 fseek (instream, n, SEEK_CUR);
364 unblock_input ();
365 }
366 else
367 { /* We're not reading directly from a file. In that case, it's difficult
368 to reliably count bytes, since these are usually meant for the file's
369 encoding, whereas we're now typically in the internal encoding.
370 But luckily, skip_dyn_bytes is used to skip over a single
371 dynamic-docstring (or dynamic byte-code) which is always quoted such
372 that \037 is the final char. */
373 int c;
374 do {
375 c = READCHAR;
376 } while (c >= 0 && c != '\037');
377 }
378}
379
759fd763
SM
380static void
381skip_dyn_eof (Lisp_Object readcharfun)
382{
383 if (FROM_FILE_P (readcharfun))
384 {
385 block_input (); /* FIXME: Not sure if it's needed. */
386 fseek (instream, 0, SEEK_END);
387 unblock_input ();
388 }
389 else
390 while (READCHAR >= 0);
391}
392
078e7b4a
JB
393/* Unread the character C in the way appropriate for the stream READCHARFUN.
394 If the stream is a user function, call it with the char as argument. */
395
396static void
971de7fb 397unreadchar (Lisp_Object readcharfun, int c)
078e7b4a 398{
abb13b09 399 readchar_count--;
92fddec9
KH
400 if (c == -1)
401 /* Don't back up the pointer if we're unreading the end-of-input mark,
402 since readchar didn't advance it when we read it. */
403 ;
cfff016d 404 else if (BUFFERP (readcharfun))
d7760ca9 405 {
bed23cb2 406 struct buffer *b = XBUFFER (readcharfun);
d311d28c
PE
407 ptrdiff_t charpos = BUF_PT (b);
408 ptrdiff_t bytepos = BUF_PT_BYTE (b);
d7760ca9 409
4b4deea2 410 if (! NILP (BVAR (b, enable_multibyte_characters)))
8792be66 411 BUF_DEC_POS (b, bytepos);
bed23cb2 412 else
8792be66 413 bytepos--;
d7760ca9 414
cffc6f3b 415 SET_BUF_PT_BOTH (b, charpos - 1, bytepos);
d7760ca9 416 }
cfff016d 417 else if (MARKERP (readcharfun))
d7760ca9 418 {
bed23cb2 419 struct buffer *b = XMARKER (readcharfun)->buffer;
d311d28c 420 ptrdiff_t bytepos = XMARKER (readcharfun)->bytepos;
d7760ca9 421
8792be66 422 XMARKER (readcharfun)->charpos--;
4b4deea2 423 if (! NILP (BVAR (b, enable_multibyte_characters)))
8792be66 424 BUF_DEC_POS (b, bytepos);
bed23cb2 425 else
8792be66 426 bytepos--;
d7760ca9 427
8792be66 428 XMARKER (readcharfun)->bytepos = bytepos;
d7760ca9 429 }
cfff016d 430 else if (STRINGP (readcharfun))
bed23cb2
RS
431 {
432 read_from_string_index--;
433 read_from_string_index_byte
434 = string_char_to_byte (readcharfun, read_from_string_index);
435 }
8792be66
KH
436 else if (CONSP (readcharfun))
437 {
438 unread_char = c;
439 }
ad0153e4 440 else if (EQ (readcharfun, Qlambda))
8792be66
KH
441 {
442 unread_char = c;
443 }
d2e24f92 444 else if (FROM_FILE_P (readcharfun))
8792be66 445 {
75a65c7e 446 unread_char = c;
8792be66 447 }
078e7b4a
JB
448 else
449 call1 (readcharfun, make_number (c));
450}
451
8792be66 452static int
971de7fb 453readbyte_for_lambda (int c, Lisp_Object readcharfun)
8792be66
KH
454{
455 return read_bytecode_char (c >= 0);
456}
457
458
459static int
971de7fb 460readbyte_from_file (int c, Lisp_Object readcharfun)
8792be66
KH
461{
462 if (c >= 0)
463 {
4d7e6e51 464 block_input ();
8792be66 465 ungetc (c, instream);
4d7e6e51 466 unblock_input ();
8792be66
KH
467 return 0;
468 }
469
4d7e6e51 470 block_input ();
8792be66 471 c = getc (instream);
d85d3839 472
48def666 473 /* Interrupted reads have been observed while reading over the network. */
d85d3839
MB
474 while (c == EOF && ferror (instream) && errno == EINTR)
475 {
4d7e6e51 476 unblock_input ();
d85d3839 477 QUIT;
4d7e6e51 478 block_input ();
57cb2e6f 479 clearerr (instream);
d85d3839 480 c = getc (instream);
66cd0949 481 }
d85d3839 482
4d7e6e51 483 unblock_input ();
57cb2e6f 484
8792be66
KH
485 return (c == EOF ? -1 : c);
486}
487
488static int
971de7fb 489readbyte_from_string (int c, Lisp_Object readcharfun)
8792be66
KH
490{
491 Lisp_Object string = XCAR (readcharfun);
492
493 if (c >= 0)
494 {
495 read_from_string_index--;
496 read_from_string_index_byte
497 = string_char_to_byte (string, read_from_string_index);
498 }
8f924df7 499
8792be66
KH
500 if (read_from_string_index >= read_from_string_limit)
501 c = -1;
502 else
503 FETCH_STRING_CHAR_ADVANCE (c, string,
504 read_from_string_index,
505 read_from_string_index_byte);
506 return c;
507}
508
509
510/* Read one non-ASCII character from INSTREAM. The character is
511 encoded in `emacs-mule' and the first byte is already read in
512 C. */
513
8792be66 514static int
971de7fb 515read_emacs_mule_char (int c, int (*readbyte) (int, Lisp_Object), Lisp_Object readcharfun)
8792be66
KH
516{
517 /* Emacs-mule coding uses at most 4-byte for one character. */
518 unsigned char buf[4];
519 int len = emacs_mule_bytes[c];
520 struct charset *charset;
521 int i;
522 unsigned code;
523
524 if (len == 1)
525 /* C is not a valid leading-code of `emacs-mule'. */
526 return BYTE8_TO_CHAR (c);
527
528 i = 0;
529 buf[i++] = c;
530 while (i < len)
531 {
532 c = (*readbyte) (-1, readcharfun);
533 if (c < 0xA0)
534 {
535 while (--i > 1)
536 (*readbyte) (buf[i], readcharfun);
537 return BYTE8_TO_CHAR (buf[0]);
538 }
539 buf[i++] = c;
540 }
541
542 if (len == 2)
543 {
b84ae584 544 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[0]]);
8792be66
KH
545 code = buf[1] & 0x7F;
546 }
547 else if (len == 3)
548 {
549 if (buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_11
550 || buf[0] == EMACS_MULE_LEADING_CODE_PRIVATE_12)
551 {
b84ae584 552 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[1]]);
8792be66
KH
553 code = buf[2] & 0x7F;
554 }
555 else
556 {
b84ae584 557 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[0]]);
8792be66
KH
558 code = ((buf[1] << 8) | buf[2]) & 0x7F7F;
559 }
560 }
561 else
562 {
b84ae584 563 charset = CHARSET_FROM_ID (emacs_mule_charset[buf[1]]);
8f924df7 564 code = ((buf[2] << 8) | buf[3]) & 0x7F7F;
8792be66
KH
565 }
566 c = DECODE_CHAR (charset, code);
567 if (c < 0)
568 Fsignal (Qinvalid_read_syntax,
569 Fcons (build_string ("invalid multibyte form"), Qnil));
570 return c;
571}
572
573
f57e2426
J
574static Lisp_Object read_internal_start (Lisp_Object, Lisp_Object,
575 Lisp_Object);
576static Lisp_Object read0 (Lisp_Object);
7cded46f 577static Lisp_Object read1 (Lisp_Object, int *, bool);
abb13b09 578
7cded46f
PE
579static Lisp_Object read_list (bool, Lisp_Object);
580static Lisp_Object read_vector (Lisp_Object, bool);
abb13b09 581
f57e2426
J
582static Lisp_Object substitute_object_recurse (Lisp_Object, Lisp_Object,
583 Lisp_Object);
584static void substitute_object_in_subtree (Lisp_Object,
585 Lisp_Object);
586static void substitute_in_interval (INTERVAL, Lisp_Object);
9e062b6c 587
078e7b4a 588\f
bed23cb2 589/* Get a character from the tty. */
078e7b4a 590
f42be754
JB
591/* Read input events until we get one that's acceptable for our purposes.
592
7cded46f 593 If NO_SWITCH_FRAME, switch-frame events are stashed
f42be754
JB
594 until we get a character we like, and then stuffed into
595 unread_switch_frame.
596
7cded46f 597 If ASCII_REQUIRED, check function key events to see
f42be754
JB
598 if the unmodified version of the symbol has a Qascii_character
599 property, and use that character, if present.
600
7cded46f
PE
601 If ERROR_NONASCII, signal an error if the input we
602 get isn't an ASCII character with modifiers. If it's false but
603 ASCII_REQUIRED is true, just re-read until we get an ASCII
bb49a192
RS
604 character.
605
7cded46f 606 If INPUT_METHOD, invoke the current input method
50e48299
CY
607 if the character warrants that.
608
7cded46f 609 If SECONDS is a number, wait that many seconds for input, and
50e48299 610 return Qnil if no input arrives within that time. */
cc39bc38 611
2f7c71a1 612static Lisp_Object
7cded46f
PE
613read_filtered_event (bool no_switch_frame, bool ascii_required,
614 bool error_nonascii, bool input_method, Lisp_Object seconds)
f42be754 615{
4332cf50 616 Lisp_Object val, delayed_switch_frame;
50e48299 617 EMACS_TIME end_time;
153a17b7 618
5dbf89bc 619#ifdef HAVE_WINDOW_SYSTEM
df6c90d8
GM
620 if (display_hourglass_p)
621 cancel_hourglass ();
5dbf89bc 622#endif
177c0ea7 623
153a17b7 624 delayed_switch_frame = Qnil;
f42be754 625
50e48299
CY
626 /* Compute timeout. */
627 if (NUMBERP (seconds))
628 {
51d8b30e 629 double duration = extract_float (seconds);
d35af63c 630 EMACS_TIME wait_time = EMACS_TIME_FROM_DOUBLE (duration);
e9a9ae03 631 end_time = add_emacs_time (current_emacs_time (), wait_time);
50e48299
CY
632 }
633
99d0d6dc 634 /* Read until we get an acceptable event. */
f42be754 635 retry:
88852d45 636 do
99d0d6dc 637 val = read_char (0, Qnil, (input_method ? Qnil : Qt), 0,
251bc578 638 NUMBERP (seconds) ? &end_time : NULL);
9688ff53 639 while (INTEGERP (val) && XINT (val) == -2); /* wrong_kboard_jmpbuf */
f42be754 640
cfff016d 641 if (BUFFERP (val))
6c82d689
KH
642 goto retry;
643
99d0d6dc 644 /* `switch-frame' events are put off until after the next ASCII
8e6208c5 645 character. This is better than signaling an error just because
f42be754
JB
646 the last characters were typed to a separate minibuffer frame,
647 for example. Eventually, some code which can deal with
648 switch-frame events will read it and process it. */
649 if (no_switch_frame
650 && EVENT_HAS_PARAMETERS (val)
ca77ee45 651 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (val)), Qswitch_frame))
f42be754
JB
652 {
653 delayed_switch_frame = val;
654 goto retry;
655 }
656
50e48299 657 if (ascii_required && !(NUMBERP (seconds) && NILP (val)))
f42be754
JB
658 {
659 /* Convert certain symbols to their ASCII equivalents. */
cfff016d 660 if (SYMBOLP (val))
f42be754 661 {
95384e1e 662 Lisp_Object tem, tem1;
f42be754
JB
663 tem = Fget (val, Qevent_symbol_element_mask);
664 if (!NILP (tem))
665 {
666 tem1 = Fget (Fcar (tem), Qascii_character);
667 /* Merge this symbol's modifier bits
668 with the ASCII equivalent of its basic code. */
669 if (!NILP (tem1))
baf69866 670 XSETFASTINT (val, XINT (tem1) | XINT (Fcar (Fcdr (tem))));
f42be754
JB
671 }
672 }
177c0ea7 673
f42be754 674 /* If we don't have a character now, deal with it appropriately. */
cfff016d 675 if (!INTEGERP (val))
f42be754
JB
676 {
677 if (error_nonascii)
678 {
1ec84625 679 Vunread_command_events = Fcons (val, Qnil);
f42be754
JB
680 error ("Non-character input-event");
681 }
682 else
683 goto retry;
684 }
685 }
686
687 if (! NILP (delayed_switch_frame))
688 unread_switch_frame = delayed_switch_frame;
689
67868d27
PJ
690#if 0
691
5dbf89bc 692#ifdef HAVE_WINDOW_SYSTEM
df6c90d8
GM
693 if (display_hourglass_p)
694 start_hourglass ();
5dbf89bc 695#endif
67868d27
PJ
696
697#endif
698
f42be754 699 return val;
f42be754
JB
700}
701
a7ca3326 702DEFUN ("read-char", Fread_char, Sread_char, 0, 3, 0,
5de38842
PJ
703 doc: /* Read a character from the command input (keyboard or macro).
704It is returned as a number.
fb26c2af
KH
705If the character has modifiers, they are resolved and reflected to the
706character code if possible (e.g. C-SPC -> 0).
707
5de38842
PJ
708If the user generates an event which is not a character (i.e. a mouse
709click or function key event), `read-char' signals an error. As an
fb26c2af
KH
710exception, switch-frame events are put off until non-character events
711can be read.
5de38842
PJ
712If you want to read non-character events, or ignore them, call
713`read-event' or `read-char-exclusive' instead.
714
715If the optional argument PROMPT is non-nil, display that as a prompt.
716If the optional argument INHERIT-INPUT-METHOD is non-nil and some
717input method is turned on in the current buffer, that input method
50e48299
CY
718is used for reading a character.
719If the optional argument SECONDS is non-nil, it should be a number
720specifying the maximum number of seconds to wait for input. If no
721input arrives in that time, return nil. SECONDS may be a
722floating-point value. */)
5842a27b 723 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
078e7b4a 724{
fb26c2af 725 Lisp_Object val;
fb26c2af 726
bb49a192
RS
727 if (! NILP (prompt))
728 message_with_string ("%s", prompt, 0);
fb26c2af 729 val = read_filtered_event (1, 1, 1, ! NILP (inherit_input_method), seconds);
66c410ce
CY
730
731 return (NILP (val) ? Qnil
732 : make_number (char_resolve_modifier_mask (XINT (val))));
078e7b4a
JB
733}
734
a7ca3326 735DEFUN ("read-event", Fread_event, Sread_event, 0, 3, 0,
5de38842
PJ
736 doc: /* Read an event object from the input stream.
737If the optional argument PROMPT is non-nil, display that as a prompt.
738If the optional argument INHERIT-INPUT-METHOD is non-nil and some
739input method is turned on in the current buffer, that input method
50e48299
CY
740is used for reading a character.
741If the optional argument SECONDS is non-nil, it should be a number
742specifying the maximum number of seconds to wait for input. If no
743input arrives in that time, return nil. SECONDS may be a
744floating-point value. */)
5842a27b 745 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
078e7b4a 746{
bb49a192
RS
747 if (! NILP (prompt))
748 message_with_string ("%s", prompt, 0);
50e48299 749 return read_filtered_event (0, 0, 0, ! NILP (inherit_input_method), seconds);
078e7b4a
JB
750}
751
50e48299 752DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 3, 0,
5de38842
PJ
753 doc: /* Read a character from the command input (keyboard or macro).
754It is returned as a number. Non-character events are ignored.
fb26c2af
KH
755If the character has modifiers, they are resolved and reflected to the
756character code if possible (e.g. C-SPC -> 0).
5de38842
PJ
757
758If the optional argument PROMPT is non-nil, display that as a prompt.
759If the optional argument INHERIT-INPUT-METHOD is non-nil and some
760input method is turned on in the current buffer, that input method
50e48299
CY
761is used for reading a character.
762If the optional argument SECONDS is non-nil, it should be a number
763specifying the maximum number of seconds to wait for input. If no
764input arrives in that time, return nil. SECONDS may be a
765floating-point value. */)
5842a27b 766 (Lisp_Object prompt, Lisp_Object inherit_input_method, Lisp_Object seconds)
078e7b4a 767{
fb26c2af 768 Lisp_Object val;
fb26c2af 769
bb49a192
RS
770 if (! NILP (prompt))
771 message_with_string ("%s", prompt, 0);
66c410ce 772
fb26c2af 773 val = read_filtered_event (1, 1, 0, ! NILP (inherit_input_method), seconds);
66c410ce
CY
774
775 return (NILP (val) ? Qnil
776 : make_number (char_resolve_modifier_mask (XINT (val))));
078e7b4a 777}
078e7b4a
JB
778
779DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,
5de38842 780 doc: /* Don't use this yourself. */)
5842a27b 781 (void)
078e7b4a
JB
782{
783 register Lisp_Object val;
4d7e6e51 784 block_input ();
1805de4f 785 XSETINT (val, getc (instream));
4d7e6e51 786 unblock_input ();
078e7b4a
JB
787 return val;
788}
da84f340
GM
789
790
550a625e 791\f
b9598260
SM
792
793/* Return true if the lisp code read using READCHARFUN defines a non-nil
794 `lexical-binding' file variable. After returning, the stream is
757140ff
GM
795 positioned following the first line, if it is a comment or #! line,
796 otherwise nothing is read. */
b9598260 797
7cded46f 798static bool
c566235d 799lisp_file_lexically_bound_p (Lisp_Object readcharfun)
b9598260
SM
800{
801 int ch = READCHAR;
757140ff
GM
802
803 if (ch == '#')
804 {
805 ch = READCHAR;
806 if (ch != '!')
807 {
808 UNREAD (ch);
809 UNREAD ('#');
810 return 0;
811 }
812 while (ch != '\n' && ch != EOF)
813 ch = READCHAR;
814 if (ch == '\n') ch = READCHAR;
d2dd3694
GM
815 /* It is OK to leave the position after a #! line, since
816 that is what read1 does. */
757140ff
GM
817 }
818
b9598260
SM
819 if (ch != ';')
820 /* The first line isn't a comment, just give up. */
821 {
822 UNREAD (ch);
823 return 0;
824 }
825 else
826 /* Look for an appropriate file-variable in the first line. */
827 {
7cded46f 828 bool rv = 0;
b9598260
SM
829 enum {
830 NOMINAL, AFTER_FIRST_DASH, AFTER_ASTERIX,
831 } beg_end_state = NOMINAL;
7cded46f 832 bool in_file_vars = 0;
b9598260 833
7200d79c
SM
834#define UPDATE_BEG_END_STATE(ch) \
835 if (beg_end_state == NOMINAL) \
836 beg_end_state = (ch == '-' ? AFTER_FIRST_DASH : NOMINAL); \
837 else if (beg_end_state == AFTER_FIRST_DASH) \
838 beg_end_state = (ch == '*' ? AFTER_ASTERIX : NOMINAL); \
839 else if (beg_end_state == AFTER_ASTERIX) \
840 { \
841 if (ch == '-') \
842 in_file_vars = !in_file_vars; \
843 beg_end_state = NOMINAL; \
b9598260
SM
844 }
845
846 /* Skip until we get to the file vars, if any. */
847 do
848 {
849 ch = READCHAR;
850 UPDATE_BEG_END_STATE (ch);
851 }
852 while (!in_file_vars && ch != '\n' && ch != EOF);
853
854 while (in_file_vars)
855 {
06a0259a 856 char var[100], val[100];
3c346cc3 857 unsigned i;
b9598260
SM
858
859 ch = READCHAR;
860
861 /* Read a variable name. */
862 while (ch == ' ' || ch == '\t')
863 ch = READCHAR;
864
06a0259a 865 i = 0;
db7a0b4f 866 while (ch != ':' && ch != '\n' && ch != EOF && in_file_vars)
b9598260 867 {
06a0259a
PE
868 if (i < sizeof var - 1)
869 var[i++] = ch;
b9598260
SM
870 UPDATE_BEG_END_STATE (ch);
871 ch = READCHAR;
872 }
7200d79c 873
db7a0b4f 874 /* Stop scanning if no colon was found before end marker. */
ad3a2b41 875 if (!in_file_vars || ch == '\n' || ch == EOF)
db7a0b4f
AS
876 break;
877
06a0259a
PE
878 while (i > 0 && (var[i - 1] == ' ' || var[i - 1] == '\t'))
879 i--;
880 var[i] = '\0';
b9598260
SM
881
882 if (ch == ':')
883 {
884 /* Read a variable value. */
885 ch = READCHAR;
886
887 while (ch == ' ' || ch == '\t')
888 ch = READCHAR;
889
06a0259a 890 i = 0;
b9598260
SM
891 while (ch != ';' && ch != '\n' && ch != EOF && in_file_vars)
892 {
06a0259a
PE
893 if (i < sizeof val - 1)
894 val[i++] = ch;
b9598260
SM
895 UPDATE_BEG_END_STATE (ch);
896 ch = READCHAR;
897 }
898 if (! in_file_vars)
ad3a2b41 899 /* The value was terminated by an end-marker, which remove. */
06a0259a
PE
900 i -= 3;
901 while (i > 0 && (val[i - 1] == ' ' || val[i - 1] == '\t'))
902 i--;
903 val[i] = '\0';
b9598260
SM
904
905 if (strcmp (var, "lexical-binding") == 0)
906 /* This is it... */
907 {
908 rv = (strcmp (val, "nil") != 0);
909 break;
910 }
911 }
912 }
913
914 while (ch != '\n' && ch != EOF)
915 ch = READCHAR;
916
917 return rv;
918 }
919}
b9598260 920\f
8792be66 921/* Value is a version number of byte compiled code if the file
c73bd236 922 associated with file descriptor FD is a compiled Lisp file that's
8792be66
KH
923 safe to load. Only files compiled with Emacs are safe to load.
924 Files compiled with XEmacs can lead to a crash in Fbyte_code
925 because of an incompatible change in the byte compiler. */
da84f340
GM
926
927static int
7cded46f 928safe_to_load_version (int fd)
da84f340
GM
929{
930 char buf[512];
931 int nbytes, i;
8f924df7 932 int version = 1;
da84f340
GM
933
934 /* Read the first few bytes from the file, and look for a line
935 specifying the byte compiler version used. */
7cded46f 936 nbytes = emacs_read (fd, buf, sizeof buf);
da84f340
GM
937 if (nbytes > 0)
938 {
da84f340 939 /* Skip to the next newline, skipping over the initial `ELC'
1da3b9e4 940 with NUL bytes following it, but note the version. */
da84f340 941 for (i = 0; i < nbytes && buf[i] != '\n'; ++i)
1da3b9e4 942 if (i == 4)
8792be66 943 version = buf[i];
da84f340 944
e6eb4e9e 945 if (i >= nbytes
927f12da 946 || fast_c_string_match_ignore_case (Vbytecomp_version_regexp,
d923b542 947 buf + i, nbytes - i) < 0)
7cded46f 948 version = 0;
da84f340
GM
949 }
950
951 lseek (fd, 0, SEEK_SET);
7cded46f 952 return version;
da84f340
GM
953}
954
955
7ee3bd7b
GM
956/* Callback for record_unwind_protect. Restore the old load list OLD,
957 after loading a file successfully. */
958
959static Lisp_Object
971de7fb 960record_load_unwind (Lisp_Object old)
7ee3bd7b
GM
961{
962 return Vloads_in_progress = old;
963}
964
164c8bfe
RS
965/* This handler function is used via internal_condition_case_1. */
966
967static Lisp_Object
971de7fb 968load_error_handler (Lisp_Object data)
164c8bfe
RS
969{
970 return Qnil;
971}
7ee3bd7b 972
1d064697 973static Lisp_Object
971de7fb 974load_warn_old_style_backquotes (Lisp_Object file)
1d064697
SM
975{
976 if (!NILP (Vold_style_backquotes))
977 {
b636b4c1 978 Lisp_Object args[2];
18a4a65e 979 args[0] = build_string ("Loading `%s': old-style backquotes detected!");
1d064697
SM
980 args[1] = file;
981 Fmessage (2, args);
982 }
983 return Qnil;
984}
985
a7ca3326 986DEFUN ("get-load-suffixes", Fget_load_suffixes, Sget_load_suffixes, 0, 0, 0,
971a4293
LT
987 doc: /* Return the suffixes that `load' should try if a suffix is \
988required.
989This uses the variables `load-suffixes' and `load-file-rep-suffixes'. */)
5842a27b 990 (void)
971a4293
LT
991{
992 Lisp_Object lst = Qnil, suffixes = Vload_suffixes, suffix, ext;
993 while (CONSP (suffixes))
994 {
995 Lisp_Object exts = Vload_file_rep_suffixes;
996 suffix = XCAR (suffixes);
997 suffixes = XCDR (suffixes);
998 while (CONSP (exts))
999 {
1000 ext = XCAR (exts);
1001 exts = XCDR (exts);
1002 lst = Fcons (concat2 (suffix, ext), lst);
1003 }
1004 }
1005 return Fnreverse (lst);
1006}
1007
a7ca3326 1008DEFUN ("load", Fload, Sload, 1, 5, 0,
5de38842
PJ
1009 doc: /* Execute a file of Lisp code named FILE.
1010First try FILE with `.elc' appended, then try with `.el',
971a4293 1011then try FILE unmodified (the exact suffixes in the exact order are
88852d45 1012determined by `load-suffixes'). Environment variable references in
971a4293 1013FILE are replaced with their values by calling `substitute-in-file-name'.
5de38842 1014This function searches the directories in `load-path'.
971a4293 1015
5de38842 1016If optional second arg NOERROR is non-nil,
971a4293 1017report no error if FILE doesn't exist.
5de38842 1018Print messages at start and end of loading unless
beb0b7f9
EZ
1019optional third arg NOMESSAGE is non-nil (but `force-load-messages'
1020overrides that).
5de38842 1021If optional fourth arg NOSUFFIX is non-nil, don't try adding
971a4293 1022suffixes `.elc' or `.el' to the specified name FILE.
5de38842 1023If optional fifth arg MUST-SUFFIX is non-nil, insist on
971a4293
LT
1024the suffix `.elc' or `.el'; don't accept just FILE unless
1025it ends in one of those suffixes or includes a directory name.
1026
c664f463
CY
1027If NOSUFFIX is nil, then if a file could not be found, try looking for
1028a different representation of the file by adding non-empty suffixes to
1029its name, before trying another file. Emacs uses this feature to find
1030compressed versions of files when Auto Compression mode is enabled.
1031If NOSUFFIX is non-nil, disable this feature.
1032
1033The suffixes that this function tries out, when NOSUFFIX is nil, are
1034given by the return value of `get-load-suffixes' and the values listed
1035in `load-file-rep-suffixes'. If MUST-SUFFIX is non-nil, only the
1036return value of `get-load-suffixes' is used, i.e. the file name is
1037required to have a non-empty suffix.
0fc213e9
RS
1038
1039Loading a file records its definitions, and its `provide' and
1040`require' calls, in an element of `load-history' whose
1041car is the file name loaded. See `load-history'.
1042
c7926fe2
EZ
1043While the file is in the process of being loaded, the variable
1044`load-in-progress' is non-nil and the variable `load-file-name'
1045is bound to the file's name.
1046
971a4293 1047Return t if the file exists and loads successfully. */)
5842a27b 1048 (Lisp_Object file, Lisp_Object noerror, Lisp_Object nomessage, Lisp_Object nosuffix, Lisp_Object must_suffix)
078e7b4a
JB
1049{
1050 register FILE *stream;
1051 register int fd = -1;
d311d28c 1052 ptrdiff_t count = SPECPDL_INDEX ();
6bb6da3e
AM
1053 struct gcpro gcpro1, gcpro2, gcpro3;
1054 Lisp_Object found, efound, hist_file_name;
7cded46f
PE
1055 /* True means we printed the ".el is newer" message. */
1056 bool newer = 0;
1057 /* True means we are loading a compiled file. */
1058 bool compiled = 0;
c2225d00 1059 Lisp_Object handler;
7cded46f 1060 bool safe_p = 1;
8ea90aa3 1061 const char *fmode = "r";
6bb6da3e 1062 Lisp_Object tmp[2];
8792be66
KH
1063 int version;
1064
317073d5 1065#ifdef DOS_NT
229ba775 1066 fmode = "rt";
317073d5 1067#endif /* DOS_NT */
078e7b4a 1068
b7826503 1069 CHECK_STRING (file);
078e7b4a 1070
c2225d00 1071 /* If file name is magic, call the handler. */
e61b9b87
SM
1072 /* This shouldn't be necessary any more now that `openp' handles it right.
1073 handler = Ffind_file_name_handler (file, Qload);
1074 if (!NILP (handler))
1075 return call5 (handler, Qload, file, noerror, nomessage, nosuffix); */
c2225d00 1076
07a0bda3
RS
1077 /* Do this after the handler to avoid
1078 the need to gcpro noerror, nomessage and nosuffix.
e61b9b87
SM
1079 (Below here, we care only whether they are nil or not.)
1080 The presence of this call is the result of a historical accident:
6bb6da3e 1081 it used to be in every file-operation and when it got removed
e61b9b87
SM
1082 everywhere, it accidentally stayed here. Since then, enough people
1083 supposedly have things like (load "$PROJECT/foo.el") in their .emacs
1084 that it seemed risky to remove. */
164c8bfe
RS
1085 if (! NILP (noerror))
1086 {
1087 file = internal_condition_case_1 (Fsubstitute_in_file_name, file,
1088 Qt, load_error_handler);
1089 if (NILP (file))
1090 return Qnil;
1091 }
1092 else
1093 file = Fsubstitute_in_file_name (file);
177c0ea7 1094
07a0bda3 1095
078e7b4a 1096 /* Avoid weird lossage with null string as arg,
48def666 1097 since it would try to load a directory as a Lisp file. */
82cb60d3 1098 if (SBYTES (file) > 0)
078e7b4a 1099 {
82cb60d3 1100 ptrdiff_t size = SBYTES (file);
211f7dcd 1101
0fc213e9
RS
1102 found = Qnil;
1103 GCPRO2 (file, found);
211f7dcd
RS
1104
1105 if (! NILP (must_suffix))
1106 {
1107 /* Don't insist on adding a suffix if FILE already ends with one. */
1108 if (size > 3
42a5b22f 1109 && !strcmp (SSDATA (file) + size - 3, ".el"))
211f7dcd
RS
1110 must_suffix = Qnil;
1111 else if (size > 4
42a5b22f 1112 && !strcmp (SSDATA (file) + size - 4, ".elc"))
211f7dcd
RS
1113 must_suffix = Qnil;
1114 /* Don't insist on adding a suffix
1115 if the argument includes a directory name. */
1116 else if (! NILP (Ffile_name_directory (file)))
1117 must_suffix = Qnil;
1118 }
1119
f0a50954 1120 fd = openp (Vload_path, file,
e61b9b87 1121 (!NILP (nosuffix) ? Qnil
971a4293
LT
1122 : !NILP (must_suffix) ? Fget_load_suffixes ()
1123 : Fappend (2, (tmp[0] = Fget_load_suffixes (),
1124 tmp[1] = Vload_file_rep_suffixes,
e61b9b87 1125 tmp))),
86d00812 1126 &found, Qnil);
5a6e5452 1127 UNGCPRO;
078e7b4a
JB
1128 }
1129
96dc0f4e 1130 if (fd == -1)
078e7b4a 1131 {
265a9e55 1132 if (NILP (noerror))
336d4a9c
KS
1133 xsignal2 (Qfile_error, build_string ("Cannot open load file"), file);
1134 return Qnil;
078e7b4a
JB
1135 }
1136
ba0d1195 1137 /* Tell startup.el whether or not we found the user's init file. */
4116ab9f
KH
1138 if (EQ (Qt, Vuser_init_file))
1139 Vuser_init_file = found;
1140
96dc0f4e
MB
1141 /* If FD is -2, that means openp found a magic file. */
1142 if (fd == -2)
74549846 1143 {
5e24a1f7
KH
1144 if (NILP (Fequal (found, file)))
1145 /* If FOUND is a different file name from FILE,
1146 find its handler even if we have already inhibited
1147 the `load' operation on FILE. */
1148 handler = Ffind_file_name_handler (found, Qt);
1149 else
1150 handler = Ffind_file_name_handler (found, Qload);
1151 if (! NILP (handler))
1152 return call5 (handler, Qload, found, noerror, nomessage, Qt);
35774242
EZ
1153#ifdef DOS_NT
1154 /* Tramp has to deal with semi-broken packages that prepend
1155 drive letters to remote files. For that reason, Tramp
1156 catches file operations that test for file existence, which
1157 makes openp think X:/foo.elc files are remote. However,
1158 Tramp does not catch `load' operations for such files, so we
1159 end up with a nil as the `load' handler above. If we would
1160 continue with fd = -2, we will behave wrongly, and in
1161 particular try reading a .elc file in the "rt" mode instead
1162 of "rb". See bug #9311 for the results. To work around
1163 this, we try to open the file locally, and go with that if it
1164 succeeds. */
1165 fd = emacs_open (SSDATA (ENCODE_FILE (found)), O_RDONLY, 0);
1166 if (fd == -1)
1167 fd = -2;
1168#endif
74549846
RS
1169 }
1170
550a625e
GM
1171 /* Check if we're stuck in a recursive load cycle.
1172
1173 2000-09-21: It's not possible to just check for the file loaded
1174 being a member of Vloads_in_progress. This fails because of the
1175 way the byte compiler currently works; `provide's are not
9d438325 1176 evaluated, see font-lock.el/jit-lock.el as an example. This
550a625e
GM
1177 leads to a certain amount of ``normal'' recursion.
1178
1179 Also, just loading a file recursively is not always an error in
1180 the general case; the second load may do something different. */
3ba6fd9a 1181 {
0902fe45 1182 int load_count = 0;
3ba6fd9a
RS
1183 Lisp_Object tem;
1184 for (tem = Vloads_in_progress; CONSP (tem); tem = XCDR (tem))
0902fe45 1185 if (!NILP (Fequal (found, XCAR (tem))) && (++load_count > 3))
8fc45744
JB
1186 {
1187 if (fd >= 0)
1188 emacs_close (fd);
1189 signal_error ("Recursive load", Fcons (found, Vloads_in_progress));
1190 }
3ba6fd9a
RS
1191 record_unwind_protect (record_load_unwind, Vloads_in_progress);
1192 Vloads_in_progress = Fcons (found, Vloads_in_progress);
1193 }
7ee3bd7b 1194
b9598260
SM
1195 /* All loads are by default dynamic, unless the file itself specifies
1196 otherwise using a file-variable in the first line. This is bound here
1197 so that it takes effect whether or not we use
1198 Vload_source_file_function. */
1199 specbind (Qlexical_binding, Qnil);
1200
48def666 1201 /* Get the name for load-history. */
6bb6da3e
AM
1202 hist_file_name = (! NILP (Vpurify_flag)
1203 ? Fconcat (2, (tmp[0] = Ffile_name_directory (file),
1204 tmp[1] = Ffile_name_nondirectory (found),
1205 tmp))
1206 : found) ;
1207
8792be66 1208 version = -1;
1bb9a689 1209
88852d45 1210 /* Check for the presence of old-style quotes and warn about them. */
1d064697
SM
1211 specbind (Qold_style_backquotes, Qnil);
1212 record_unwind_protect (load_warn_old_style_backquotes, file);
1213
72af86bd 1214 if (!memcmp (SDATA (found) + SBYTES (found) - 4, ".elc", 4)
7cded46f 1215 || (fd >= 0 && (version = safe_to_load_version (fd)) > 0))
96dc0f4e
MB
1216 /* Load .elc files directly, but not when they are
1217 remote and have no handler! */
078e7b4a 1218 {
96dc0f4e 1219 if (fd != -2)
da84f340 1220 {
96dc0f4e
MB
1221 struct stat s1, s2;
1222 int result;
da84f340 1223
6bb6da3e 1224 GCPRO3 (file, found, hist_file_name);
0fc213e9 1225
8792be66 1226 if (version < 0
7cded46f 1227 && ! (version = safe_to_load_version (fd)))
96dc0f4e
MB
1228 {
1229 safe_p = 0;
1230 if (!load_dangerous_libraries)
e63304b7
DL
1231 {
1232 if (fd >= 0)
1233 emacs_close (fd);
1234 error ("File `%s' was not compiled in Emacs",
1235 SDATA (found));
1236 }
beb0b7f9 1237 else if (!NILP (nomessage) && !force_load_messages)
96dc0f4e
MB
1238 message_with_string ("File `%s' not compiled in Emacs", found, 1);
1239 }
04fc68e7 1240
96dc0f4e
MB
1241 compiled = 1;
1242
eb191db2
EZ
1243 efound = ENCODE_FILE (found);
1244
26fbf20b 1245#ifdef DOS_NT
96dc0f4e 1246 fmode = "rb";
26fbf20b 1247#endif /* DOS_NT */
e5533da6
PE
1248 result = stat (SSDATA (efound), &s1);
1249 if (result == 0)
1250 {
1251 SSET (efound, SBYTES (efound) - 1, 0);
1252 result = stat (SSDATA (efound), &s2);
1253 SSET (efound, SBYTES (efound) - 1, 'c');
1254 }
eb191db2 1255
39adff0d
PE
1256 if (result == 0
1257 && EMACS_TIME_LT (get_stat_mtime (&s1), get_stat_mtime (&s2)))
96dc0f4e
MB
1258 {
1259 /* Make the progress messages mention that source is newer. */
1260 newer = 1;
04fc68e7 1261
96dc0f4e 1262 /* If we won't print another message, mention this anyway. */
beb0b7f9 1263 if (!NILP (nomessage) && !force_load_messages)
714d8c39 1264 {
0fc213e9
RS
1265 Lisp_Object msg_file;
1266 msg_file = Fsubstring (found, make_number (0), make_number (-1));
714d8c39 1267 message_with_string ("Source file `%s' newer than byte-compiled file",
0fc213e9 1268 msg_file, 1);
714d8c39 1269 }
96dc0f4e 1270 }
0fc213e9 1271 UNGCPRO;
51ac6f83 1272 }
078e7b4a 1273 }
fe0e03f3
KH
1274 else
1275 {
1276 /* We are loading a source file (*.el). */
1277 if (!NILP (Vload_source_file_function))
1278 {
7ee3bd7b 1279 Lisp_Object val;
96dc0f4e
MB
1280
1281 if (fd >= 0)
68c45bf0 1282 emacs_close (fd);
6bb6da3e 1283 val = call4 (Vload_source_file_function, found, hist_file_name,
7ee3bd7b 1284 NILP (noerror) ? Qnil : Qt,
beb0b7f9 1285 (NILP (nomessage) || force_load_messages) ? Qnil : Qt);
7ee3bd7b 1286 return unbind_to (count, val);
fe0e03f3
KH
1287 }
1288 }
078e7b4a 1289
6bb6da3e 1290 GCPRO3 (file, found, hist_file_name);
0fc213e9 1291
229ba775 1292#ifdef WINDOWSNT
eb191db2 1293 efound = ENCODE_FILE (found);
35774242
EZ
1294 /* If we somehow got here with fd == -2, meaning the file is deemed
1295 to be remote, don't even try to reopen the file locally; just
1296 force a failure instead. */
1297 if (fd >= 0)
1298 {
1299 emacs_close (fd);
1300 stream = fopen (SSDATA (efound), fmode);
1301 }
1302 else
1303 stream = NULL;
229ba775
EZ
1304#else /* not WINDOWSNT */
1305 stream = fdopen (fd, fmode);
1306#endif /* not WINDOWSNT */
078e7b4a
JB
1307 if (stream == 0)
1308 {
68c45bf0 1309 emacs_close (fd);
d5db4077 1310 error ("Failure to create stdio stream for %s", SDATA (file));
078e7b4a
JB
1311 }
1312
4b104c41 1313 if (! NILP (Vpurify_flag))
5e617bc2 1314 Vpreloaded_file_list = Fcons (Fpurecopy (file), Vpreloaded_file_list);
4b104c41 1315
beb0b7f9 1316 if (NILP (nomessage) || force_load_messages)
04fc68e7 1317 {
da84f340
GM
1318 if (!safe_p)
1319 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...",
1320 file, 1);
1321 else if (!compiled)
e28552a4 1322 message_with_string ("Loading %s (source)...", file, 1);
db5cae4b 1323 else if (newer)
e28552a4
RS
1324 message_with_string ("Loading %s (compiled; note, source file is newer)...",
1325 file, 1);
db5cae4b 1326 else /* The typical case; compiled file newer than source file. */
e28552a4 1327 message_with_string ("Loading %s...", file, 1);
04fc68e7 1328 }
078e7b4a 1329
468afbac 1330 record_unwind_protect (load_unwind, make_save_pointer (stream));
d2c6be7f 1331 record_unwind_protect (load_descriptor_unwind, load_descriptor_list);
20ea2964 1332 specbind (Qload_file_name, found);
74549846 1333 specbind (Qinhibit_file_name_operation, Qnil);
d2c6be7f
RS
1334 load_descriptor_list
1335 = Fcons (make_number (fileno (stream)), load_descriptor_list);
2baf5e76 1336 specbind (Qload_in_progress, Qt);
b9598260
SM
1337
1338 instream = stream;
1339 if (lisp_file_lexically_bound_p (Qget_file_char))
1340 Fset (Qlexical_binding, Qt);
1341
ab2a47e1 1342 if (! version || version >= 22)
b883cdb2 1343 readevalloop (Qget_file_char, stream, hist_file_name,
defb1411 1344 0, Qnil, Qnil, Qnil, Qnil);
8792be66
KH
1345 else
1346 {
1347 /* We can't handle a file which was compiled with
1348 byte-compile-dynamic by older version of Emacs. */
1349 specbind (Qload_force_doc_strings, Qt);
defb1411 1350 readevalloop (Qget_emacs_mule_file_char, stream, hist_file_name,
768d4533 1351 0, Qnil, Qnil, Qnil, Qnil);
8792be66 1352 }
078e7b4a
JB
1353 unbind_to (count, Qnil);
1354
48def666 1355 /* Run any eval-after-load forms for this file. */
428b13d6 1356 if (!NILP (Ffboundp (Qdo_after_load_evaluation)))
6bb6da3e
AM
1357 call1 (Qdo_after_load_evaluation, hist_file_name) ;
1358
078e7b4a
JB
1359 UNGCPRO;
1360
97dead2d 1361 xfree (saved_doc_string);
b2a30870
RS
1362 saved_doc_string = 0;
1363 saved_doc_string_size = 0;
1364
70fdbb46 1365 xfree (prev_saved_doc_string);
c15cfd1f
RS
1366 prev_saved_doc_string = 0;
1367 prev_saved_doc_string_size = 0;
1368
beb0b7f9 1369 if (!noninteractive && (NILP (nomessage) || force_load_messages))
04fc68e7 1370 {
da84f340
GM
1371 if (!safe_p)
1372 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...done",
1373 file, 1);
1374 else if (!compiled)
e28552a4 1375 message_with_string ("Loading %s (source)...done", file, 1);
db5cae4b 1376 else if (newer)
e28552a4
RS
1377 message_with_string ("Loading %s (compiled; note, source file is newer)...done",
1378 file, 1);
db5cae4b 1379 else /* The typical case; compiled file newer than source file. */
e28552a4 1380 message_with_string ("Loading %s...done", file, 1);
04fc68e7 1381 }
7ee3bd7b 1382
078e7b4a
JB
1383 return Qt;
1384}
1385
1386static Lisp_Object
48def666 1387load_unwind (Lisp_Object arg) /* Used as unwind-protect function in load. */
078e7b4a 1388{
2b30549c 1389 FILE *stream = XSAVE_POINTER (arg, 0);
ebfe97a2 1390 if (stream != NULL)
66cd0949 1391 {
4d7e6e51 1392 block_input ();
66cd0949 1393 fclose (stream);
4d7e6e51 1394 unblock_input ();
66cd0949 1395 }
078e7b4a
JB
1396 return Qnil;
1397}
1398
d2c6be7f 1399static Lisp_Object
971de7fb 1400load_descriptor_unwind (Lisp_Object oldlist)
d2c6be7f
RS
1401{
1402 load_descriptor_list = oldlist;
838abf56 1403 return Qnil;
d2c6be7f
RS
1404}
1405
1406/* Close all descriptors in use for Floads.
1407 This is used when starting a subprocess. */
1408
1409void
971de7fb 1410close_load_descs (void)
d2c6be7f 1411{
f3849f25 1412#ifndef WINDOWSNT
d2c6be7f 1413 Lisp_Object tail;
9beb8baa 1414 for (tail = load_descriptor_list; CONSP (tail); tail = XCDR (tail))
68c45bf0 1415 emacs_close (XFASTINT (XCAR (tail)));
f3849f25 1416#endif
d2c6be7f 1417}
078e7b4a 1418\f
7cded46f 1419static bool
971de7fb 1420complete_filename_p (Lisp_Object pathname)
078e7b4a 1421{
7cded46f 1422 const unsigned char *s = SDATA (pathname);
317073d5 1423 return (IS_DIRECTORY_SEP (s[0])
d5db4077 1424 || (SCHARS (pathname) > 2
7c2fb837 1425 && IS_DEVICE_SEP (s[1]) && IS_DIRECTORY_SEP (s[2])));
078e7b4a
JB
1426}
1427
86d00812
SM
1428DEFUN ("locate-file-internal", Flocate_file_internal, Slocate_file_internal, 2, 4, 0,
1429 doc: /* Search for FILENAME through PATH.
57a131fb 1430Returns the file's name in absolute form, or nil if not found.
86d00812
SM
1431If SUFFIXES is non-nil, it should be a list of suffixes to append to
1432file name when searching.
1433If non-nil, PREDICATE is used instead of `file-readable-p'.
73dcdb9f 1434PREDICATE can also be an integer to pass to the faccessat(2) function,
aa56f361
SM
1435in which case file-name-handlers are ignored.
1436This function will normally skip directories, so if you want it to find
1437directories, make sure the PREDICATE function returns `dir-ok' for them. */)
5842a27b 1438 (Lisp_Object filename, Lisp_Object path, Lisp_Object suffixes, Lisp_Object predicate)
86d00812
SM
1439{
1440 Lisp_Object file;
1441 int fd = openp (path, filename, suffixes, &file, predicate);
1442 if (NILP (predicate) && fd > 0)
1443 close (fd);
1444 return file;
1445}
1446
aa56f361 1447static Lisp_Object Qdir_ok;
86d00812 1448
078e7b4a
JB
1449/* Search for a file whose name is STR, looking in directories
1450 in the Lisp list PATH, and trying suffixes from SUFFIX.
078e7b4a
JB
1451 On success, returns a file descriptor. On failure, returns -1.
1452
e61b9b87 1453 SUFFIXES is a list of strings containing possible suffixes.
e0f24100 1454 The empty suffix is automatically added if the list is empty.
e61b9b87 1455
86d00812
SM
1456 PREDICATE non-nil means don't open the files,
1457 just look for one that satisfies the predicate. In this case,
1458 returns 1 on success. The predicate can be a lisp function or
1459 an integer to pass to `access' (in which case file-name-handlers
1460 are ignored).
078e7b4a
JB
1461
1462 If STOREPTR is nonzero, it points to a slot where the name of
1463 the file actually found should be stored as a Lisp string.
74549846
RS
1464 nil is stored there on failure.
1465
96dc0f4e 1466 If the file we find is remote, return -2
86d00812 1467 but store the found remote file name in *STOREPTR. */
078e7b4a
JB
1468
1469int
971de7fb 1470openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *storeptr, Lisp_Object predicate)
078e7b4a 1471{
d311d28c 1472 ptrdiff_t fn_size = 100;
078e7b4a 1473 char buf[100];
7cded46f
PE
1474 char *fn = buf;
1475 bool absolute = 0;
d311d28c 1476 ptrdiff_t want_length;
74549846 1477 Lisp_Object filename;
eb191db2
EZ
1478 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
1479 Lisp_Object string, tail, encoded_fn;
d311d28c 1480 ptrdiff_t max_suffix_len = 0;
e61b9b87 1481
6f8eafd1
SM
1482 CHECK_STRING (str);
1483
e61b9b87
SM
1484 for (tail = suffixes; CONSP (tail); tail = XCDR (tail))
1485 {
f5df591a 1486 CHECK_STRING_CAR (tail);
e61b9b87 1487 max_suffix_len = max (max_suffix_len,
d5db4077 1488 SBYTES (XCAR (tail)));
e61b9b87 1489 }
078e7b4a 1490
8b9d426a 1491 string = filename = encoded_fn = Qnil;
eb191db2
EZ
1492 GCPRO6 (str, string, filename, path, suffixes, encoded_fn);
1493
078e7b4a
JB
1494 if (storeptr)
1495 *storeptr = Qnil;
1496
1497 if (complete_filename_p (str))
1498 absolute = 1;
1499
e61b9b87 1500 for (; CONSP (path); path = XCDR (path))
078e7b4a 1501 {
e61b9b87 1502 filename = Fexpand_file_name (str, XCAR (path));
078e7b4a 1503 if (!complete_filename_p (filename))
48def666 1504 /* If there are non-absolute elts in PATH (eg "."). */
078e7b4a 1505 /* Of course, this could conceivably lose if luser sets
48def666 1506 default-directory to be something non-absolute... */
078e7b4a 1507 {
4b4deea2 1508 filename = Fexpand_file_name (filename, BVAR (current_buffer, directory));
078e7b4a 1509 if (!complete_filename_p (filename))
48def666 1510 /* Give up on this path element! */
078e7b4a
JB
1511 continue;
1512 }
1513
640ee02d 1514 /* Calculate maximum length of any filename made from
078e7b4a 1515 this path element/specified file name and any possible suffix. */
640ee02d
PE
1516 want_length = max_suffix_len + SBYTES (filename);
1517 if (fn_size <= want_length)
38182d90 1518 fn = alloca (fn_size = 100 + want_length);
078e7b4a 1519
078e7b4a 1520 /* Loop over suffixes. */
a74d1c97 1521 for (tail = NILP (suffixes) ? Fcons (empty_unibyte_string, Qnil) : suffixes;
e61b9b87 1522 CONSP (tail); tail = XCDR (tail))
078e7b4a 1523 {
cb1caeaf 1524 ptrdiff_t fnlen, lsuffix = SBYTES (XCAR (tail));
74549846 1525 Lisp_Object handler;
078e7b4a 1526
c49afcd7
RS
1527 /* Concatenate path element/specified name with the suffix.
1528 If the directory starts with /:, remove that. */
e99a530f
PE
1529 int prefixlen = ((SCHARS (filename) > 2
1530 && SREF (filename, 0) == '/'
1531 && SREF (filename, 1) == ':')
1532 ? 2 : 0);
1533 fnlen = SBYTES (filename) - prefixlen;
1534 memcpy (fn, SDATA (filename) + prefixlen, fnlen);
1535 memcpy (fn + fnlen, SDATA (XCAR (tail)), lsuffix + 1);
1536 fnlen += lsuffix;
74549846 1537 /* Check that the file exists and is not a directory. */
e61b9b87
SM
1538 /* We used to only check for handlers on non-absolute file names:
1539 if (absolute)
1540 handler = Qnil;
1541 else
1542 handler = Ffind_file_name_handler (filename, Qfile_exists_p);
1543 It's not clear why that was the case and it breaks things like
1544 (load "/bar.el") where the file is actually "/bar.el.gz". */
cb1caeaf 1545 string = make_string (fn, fnlen);
4773b8ca 1546 handler = Ffind_file_name_handler (string, Qfile_exists_p);
86d00812
SM
1547 if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate))
1548 {
73dcdb9f 1549 bool exists;
86d00812
SM
1550 if (NILP (predicate))
1551 exists = !NILP (Ffile_readable_p (string));
1552 else
aa56f361
SM
1553 {
1554 Lisp_Object tmp = call1 (predicate, string);
1555 exists = !NILP (tmp)
1556 && (EQ (tmp, Qdir_ok)
aa0f73d1 1557 || NILP (Ffile_directory_p (string)));
aa56f361 1558 }
74549846
RS
1559
1560 if (exists)
078e7b4a
JB
1561 {
1562 /* We succeeded; return this descriptor and filename. */
1563 if (storeptr)
eb191db2 1564 *storeptr = string;
5ef2a3c0 1565 UNGCPRO;
96dc0f4e 1566 return -2;
74549846
RS
1567 }
1568 }
1569 else
1570 {
73dcdb9f 1571 int fd;
4b2dd274 1572 const char *pfn;
eb191db2
EZ
1573
1574 encoded_fn = ENCODE_FILE (string);
42a5b22f 1575 pfn = SSDATA (encoded_fn);
f0a80175 1576
73dcdb9f
PE
1577 /* Check that we can access or open it. */
1578 if (NATNUMP (predicate))
1579 fd = (((XFASTINT (predicate) & ~INT_MAX) == 0
1580 && (faccessat (AT_FDCWD, pfn, XFASTINT (predicate),
1581 AT_EACCESS)
1582 == 0)
1583 && ! file_directory_p (pfn))
1584 ? 1 : -1);
1585 else
1586 {
1587 struct stat st;
1588 fd = emacs_open (pfn, O_RDONLY, 0);
908589fd 1589 if (fd >= 0
73dcdb9f 1590 && (fstat (fd, &st) != 0 || S_ISDIR (st.st_mode)))
74549846 1591 {
73dcdb9f
PE
1592 emacs_close (fd);
1593 fd = -1;
74549846 1594 }
078e7b4a 1595 }
73dcdb9f
PE
1596
1597 if (fd >= 0)
1598 {
1599 /* We succeeded; return this descriptor and filename. */
1600 if (storeptr)
1601 *storeptr = string;
1602 UNGCPRO;
1603 return fd;
1604 }
078e7b4a 1605 }
078e7b4a 1606 }
5a6e5452 1607 if (absolute)
5ef2a3c0 1608 break;
078e7b4a
JB
1609 }
1610
5ef2a3c0
KH
1611 UNGCPRO;
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;
d2c6be7f
RS
4352
4353 load_descriptor_list = Qnil;
8f6b0411
RS
4354
4355 Vstandard_input = Qt;
f74b0705 4356 Vloads_in_progress = Qnil;
078e7b4a
JB
4357}
4358
73dcdb9f
PE
4359/* Print a warning that directory intended for use USE and with name
4360 DIRNAME cannot be accessed. On entry, errno should correspond to
4361 the access failure. Print the warning on stderr and put it in
4362 *Messages*. */
85496b8c 4363
d5b28a9d 4364void
73dcdb9f 4365dir_warning (char const *use, Lisp_Object dirname)
85496b8c 4366{
73dcdb9f
PE
4367 static char const format[] = "Warning: %s `%s': %s\n";
4368 int access_errno = errno;
4369 fprintf (stderr, format, use, SSDATA (dirname), strerror (access_errno));
0df02bf3 4370
48def666 4371 /* Don't log the warning before we've initialized!! */
9b69357e 4372 if (initialized)
0df02bf3 4373 {
73dcdb9f 4374 char const *diagnostic = emacs_strerror (access_errno);
0df02bf3 4375 USE_SAFE_ALLOCA;
73dcdb9f
PE
4376 char *buffer = SAFE_ALLOCA (sizeof format - 3 * (sizeof "%s" - 1)
4377 + strlen (use) + SBYTES (dirname)
4378 + strlen (diagnostic));
4379 ptrdiff_t message_len = esprintf (buffer, format, use, SSDATA (dirname),
4380 diagnostic);
0df02bf3
PE
4381 message_dolog (buffer, message_len, 0, STRING_MULTIBYTE (dirname));
4382 SAFE_FREE ();
4383 }
85496b8c
RS
4384}
4385
078e7b4a 4386void
971de7fb 4387syms_of_lread (void)
078e7b4a
JB
4388{
4389 defsubr (&Sread);
4390 defsubr (&Sread_from_string);
4391 defsubr (&Sintern);
4392 defsubr (&Sintern_soft);
d007f5c8 4393 defsubr (&Sunintern);
971a4293 4394 defsubr (&Sget_load_suffixes);
078e7b4a 4395 defsubr (&Sload);
228d4b1c 4396 defsubr (&Seval_buffer);
078e7b4a
JB
4397 defsubr (&Seval_region);
4398 defsubr (&Sread_char);
4399 defsubr (&Sread_char_exclusive);
078e7b4a 4400 defsubr (&Sread_event);
078e7b4a
JB
4401 defsubr (&Sget_file_char);
4402 defsubr (&Smapatoms);
86d00812 4403 defsubr (&Slocate_file_internal);
078e7b4a 4404
29208e82 4405 DEFVAR_LISP ("obarray", Vobarray,
5de38842
PJ
4406 doc: /* Symbol table for use by `intern' and `read'.
4407It is a vector whose length ought to be prime for best results.
4408The vector's contents don't make sense if examined from Lisp programs;
4409to find all the symbols in an obarray, use `mapatoms'. */);
078e7b4a 4410
29208e82 4411 DEFVAR_LISP ("values", Vvalues,
5de38842 4412 doc: /* List of values of all expressions which were read, evaluated and printed.
513749ee
SM
4413 Order is reverse chronological. */);
4414 XSYMBOL (intern ("values"))->declared_special = 0;
078e7b4a 4415
29208e82 4416 DEFVAR_LISP ("standard-input", Vstandard_input,
5de38842
PJ
4417 doc: /* Stream for read to get input from.
4418See documentation of `read' for possible values. */);
078e7b4a
JB
4419 Vstandard_input = Qt;
4420
29208e82 4421 DEFVAR_LISP ("read-with-symbol-positions", Vread_with_symbol_positions,
abb13b09
CW
4422 doc: /* If non-nil, add position of read symbols to `read-symbol-positions-list'.
4423
4424If this variable is a buffer, then only forms read from that buffer
4425will be added to `read-symbol-positions-list'.
4426If this variable is t, then all read forms will be added.
4427The effect of all other values other than nil are not currently
4428defined, although they may be in the future.
4429
4430The positions are relative to the last call to `read' or
4431`read-from-string'. It is probably a bad idea to set this variable at
513749ee 4432the toplevel; bind it instead. */);
abb13b09
CW
4433 Vread_with_symbol_positions = Qnil;
4434
29208e82 4435 DEFVAR_LISP ("read-symbol-positions-list", Vread_symbol_positions_list,
d6567030 4436 doc: /* A list mapping read symbols to their positions.
abb13b09
CW
4437This variable is modified during calls to `read' or
4438`read-from-string', but only when `read-with-symbol-positions' is
4439non-nil.
4440
4441Each element of the list looks like (SYMBOL . CHAR-POSITION), where
d6567030 4442CHAR-POSITION is an integer giving the offset of that occurrence of the
abb13b09
CW
4443symbol from the position where `read' or `read-from-string' started.
4444
4445Note that a symbol will appear multiple times in this list, if it was
4446read multiple times. The list is in the same order as the symbols
513749ee 4447were read in. */);
177c0ea7 4448 Vread_symbol_positions_list = Qnil;
abb13b09 4449
29208e82 4450 DEFVAR_LISP ("read-circle", Vread_circle,
91f68422
CY
4451 doc: /* Non-nil means read recursive structures using #N= and #N# syntax. */);
4452 Vread_circle = Qt;
4453
29208e82 4454 DEFVAR_LISP ("load-path", Vload_path,
fb7ada5f 4455 doc: /* List of directories to search for files to load.
5de38842
PJ
4456Each element is a string (directory name) or nil (try default directory).
4457Initialized based on EMACSLOADPATH environment variable, if any,
4458otherwise to default specified by file `epaths.h' when Emacs was built. */);
078e7b4a 4459
29208e82 4460 DEFVAR_LISP ("load-suffixes", Vload_suffixes,
971a4293
LT
4461 doc: /* List of suffixes for (compiled or source) Emacs Lisp files.
4462This list should not include the empty string.
4463`load' and related functions try to append these suffixes, in order,
4464to the specified file name if a Lisp suffix is allowed or required. */);
2a0213a6
DA
4465 Vload_suffixes = Fcons (build_pure_c_string (".elc"),
4466 Fcons (build_pure_c_string (".el"), Qnil));
29208e82 4467 DEFVAR_LISP ("load-file-rep-suffixes", Vload_file_rep_suffixes,
971a4293
LT
4468 doc: /* List of suffixes that indicate representations of \
4469the same file.
4470This list should normally start with the empty string.
4471
4472Enabling Auto Compression mode appends the suffixes in
4473`jka-compr-load-suffixes' to this list and disabling Auto Compression
4474mode removes them again. `load' and related functions use this list to
4475determine whether they should look for compressed versions of a file
4476and, if so, which suffixes they should try to append to the file name
4477in order to do so. However, if you want to customize which suffixes
4478the loading functions recognize as compression suffixes, you should
4479customize `jka-compr-load-suffixes' rather than the present variable. */);
a74d1c97 4480 Vload_file_rep_suffixes = Fcons (empty_unibyte_string, Qnil);
e61b9b87 4481
29208e82 4482 DEFVAR_BOOL ("load-in-progress", load_in_progress,
e0f24100 4483 doc: /* Non-nil if inside of `load'. */);
cd3520a4 4484 DEFSYM (Qload_in_progress, "load-in-progress");
078e7b4a 4485
29208e82 4486 DEFVAR_LISP ("after-load-alist", Vafter_load_alist,
de0503df
SM
4487 doc: /* An alist of functions to be evalled when particular files are loaded.
4488Each element looks like (REGEXP-OR-FEATURE FUNCS...).
6bb6da3e
AM
4489
4490REGEXP-OR-FEATURE is either a regular expression to match file names, or
4491a symbol \(a feature name).
4492
4493When `load' is run and the file-name argument matches an element's
4494REGEXP-OR-FEATURE, or when `provide' is run and provides the symbol
de0503df 4495REGEXP-OR-FEATURE, the FUNCS in the element are called.
6bb6da3e
AM
4496
4497An error in FORMS does not undo the load, but does prevent execution of
4498the rest of the FORMS. */);
078e7b4a
JB
4499 Vafter_load_alist = Qnil;
4500
29208e82 4501 DEFVAR_LISP ("load-history", Vload_history,
4801c5fa
CY
4502 doc: /* Alist mapping loaded file names to symbols and features.
4503Each alist element should be a list (FILE-NAME ENTRIES...), where
4504FILE-NAME is the name of a file that has been loaded into Emacs.
4505The file name is absolute and true (i.e. it doesn't contain symlinks).
4506As an exception, one of the alist elements may have FILE-NAME nil,
4507for symbols and features not associated with any file.
4508
4509The remaining ENTRIES in the alist element describe the functions and
4510variables defined in that file, the features provided, and the
4511features required. Each entry has the form `(provide . FEATURE)',
4512`(require . FEATURE)', `(defun . FUNCTION)', `(autoload . SYMBOL)',
69bb1ef7
LMI
4513`(defface . SYMBOL)', or `(t . SYMBOL)'. Entries like `(t . SYMBOL)'
4514may precede a `(defun . FUNCTION)' entry, and means that SYMBOL was an
4515autoload before this file redefined it as a function. In addition,
4516entries may also be single symbols, which means that SYMBOL was
4517defined by `defvar' or `defconst'.
0fc213e9 4518
b502a9a1
RS
4519During preloading, the file name recorded is relative to the main Lisp
4520directory. These file names are converted to absolute at startup. */);
ae321d28
RS
4521 Vload_history = Qnil;
4522
29208e82 4523 DEFVAR_LISP ("load-file-name", Vload_file_name,
5de38842 4524 doc: /* Full name of file being loaded by `load'. */);
20ea2964
RS
4525 Vload_file_name = Qnil;
4526
29208e82 4527 DEFVAR_LISP ("user-init-file", Vuser_init_file,
5de38842 4528 doc: /* File name, including directory, of user's initialization file.
0a25a201
RS
4529If the file loaded had extension `.elc', and the corresponding source file
4530exists, this variable contains the name of source file, suitable for use
099de390
JB
4531by functions like `custom-save-all' which edit the init file.
4532While Emacs loads and evaluates the init file, value is the real name
4533of the file, regardless of whether or not it has the `.elc' extension. */);
4116ab9f
KH
4534 Vuser_init_file = Qnil;
4535
29208e82 4536 DEFVAR_LISP ("current-load-list", Vcurrent_load_list,
5de38842 4537 doc: /* Used for internal purposes by `load'. */);
ae321d28
RS
4538 Vcurrent_load_list = Qnil;
4539
29208e82 4540 DEFVAR_LISP ("load-read-function", Vload_read_function,
5de38842
PJ
4541 doc: /* Function used by `load' and `eval-region' for reading expressions.
4542The default is nil, which means use the function `read'. */);
84a15045
RS
4543 Vload_read_function = Qnil;
4544
29208e82 4545 DEFVAR_LISP ("load-source-file-function", Vload_source_file_function,
76b92fee
CS
4546 doc: /* Function called in `load' to load an Emacs Lisp source file.
4547The value should be a function for doing code conversion before
4548reading a source file. It can also be nil, in which case loading is
4549done without any code conversion.
4550
4551If the value is a function, it is called with four arguments,
4552FULLNAME, FILE, NOERROR, NOMESSAGE. FULLNAME is the absolute name of
4553the file to load, FILE is the non-absolute name (for messages etc.),
4554and NOERROR and NOMESSAGE are the corresponding arguments passed to
4555`load'. The function should return t if the file was loaded. */);
fe0e03f3
KH
4556 Vload_source_file_function = Qnil;
4557
29208e82 4558 DEFVAR_BOOL ("load-force-doc-strings", load_force_doc_strings,
5de38842
PJ
4559 doc: /* Non-nil means `load' should force-load all dynamic doc strings.
4560This is useful when the file being loaded is a temporary copy. */);
b2a30870
RS
4561 load_force_doc_strings = 0;
4562
29208e82 4563 DEFVAR_BOOL ("load-convert-to-unibyte", load_convert_to_unibyte,
5de38842
PJ
4564 doc: /* Non-nil means `read' converts strings to unibyte whenever possible.
4565This is normally bound by `load' and `eval-buffer' to control `read',
4566and is not meant for users to change. */);
94e554db
RS
4567 load_convert_to_unibyte = 0;
4568
29208e82 4569 DEFVAR_LISP ("source-directory", Vsource_directory,
5de38842
PJ
4570 doc: /* Directory in which Emacs sources were found when Emacs was built.
4571You cannot count on them to still be there! */);
a90ba1e2
KH
4572 Vsource_directory
4573 = Fexpand_file_name (build_string ("../"),
4574 Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH)));
4575
29208e82 4576 DEFVAR_LISP ("preloaded-file-list", Vpreloaded_file_list,
5de38842 4577 doc: /* List of files that were preloaded (when dumping Emacs). */);
4b104c41
RS
4578 Vpreloaded_file_list = Qnil;
4579
29208e82 4580 DEFVAR_LISP ("byte-boolean-vars", Vbyte_boolean_vars,
5de38842 4581 doc: /* List of all DEFVAR_BOOL variables, used by the byte code optimizer. */);
1ffcc3b1
DL
4582 Vbyte_boolean_vars = Qnil;
4583
29208e82 4584 DEFVAR_BOOL ("load-dangerous-libraries", load_dangerous_libraries,
5de38842
PJ
4585 doc: /* Non-nil means load dangerous compiled Lisp files.
4586Some versions of XEmacs use different byte codes than Emacs. These
4587incompatible byte codes can make Emacs crash when it tries to execute
4588them. */);
da84f340
GM
4589 load_dangerous_libraries = 0;
4590
29208e82 4591 DEFVAR_BOOL ("force-load-messages", force_load_messages,
beb0b7f9
EZ
4592 doc: /* Non-nil means force printing messages when loading Lisp files.
4593This overrides the value of the NOMESSAGE argument to `load'. */);
4594 force_load_messages = 0;
4595
29208e82 4596 DEFVAR_LISP ("bytecomp-version-regexp", Vbytecomp_version_regexp,
5de38842
PJ
4597 doc: /* Regular expression matching safe to load compiled Lisp files.
4598When Emacs loads a compiled Lisp file, it reads the first 512 bytes
4599from the file, and matches them against this regular expression.
4600When the regular expression matches, the file is considered to be safe
4601to load. See also `load-dangerous-libraries'. */);
bb970e67 4602 Vbytecomp_version_regexp
2a0213a6 4603 = build_pure_c_string ("^;;;.\\(in Emacs version\\|bytecomp version FSF\\)");
da84f340 4604
14ae4239 4605 DEFSYM (Qlexical_binding, "lexical-binding");
8f1d2ef6 4606 DEFVAR_LISP ("lexical-binding", Vlexical_binding,
f41628b2
LMI
4607 doc: /* Whether to use lexical binding when evaluating code.
4608Non-nil means that the code in the current buffer should be evaluated
4609with lexical binding.
1d698799 4610This variable is automatically set from the file variables of an
48da7392
GM
4611interpreted Lisp file read using `load'. Unlike other file local
4612variables, this must be set in the first line of a file. */);
14ae4239 4613 Vlexical_binding = Qnil;
b9598260
SM
4614 Fmake_variable_buffer_local (Qlexical_binding);
4615
29208e82 4616 DEFVAR_LISP ("eval-buffer-list", Veval_buffer_list,
3f39f996
RS
4617 doc: /* List of buffers being read from by calls to `eval-buffer' and `eval-region'. */);
4618 Veval_buffer_list = Qnil;
4619
29208e82 4620 DEFVAR_LISP ("old-style-backquotes", Vold_style_backquotes,
5aa273b0
SM
4621 doc: /* Set to non-nil when `read' encounters an old-style backquote. */);
4622 Vold_style_backquotes = Qnil;
cd3520a4 4623 DEFSYM (Qold_style_backquotes, "old-style-backquotes");
5aa273b0 4624
a90ba1e2
KH
4625 /* Vsource_directory was initialized in init_lread. */
4626
d2c6be7f
RS
4627 load_descriptor_list = Qnil;
4628 staticpro (&load_descriptor_list);
4629
cd3520a4
JB
4630 DEFSYM (Qcurrent_load_list, "current-load-list");
4631 DEFSYM (Qstandard_input, "standard-input");
4632 DEFSYM (Qread_char, "read-char");
4633 DEFSYM (Qget_file_char, "get-file-char");
4634 DEFSYM (Qget_emacs_mule_file_char, "get-emacs-mule-file-char");
4635 DEFSYM (Qload_force_doc_strings, "load-force-doc-strings");
4636
4637 DEFSYM (Qbackquote, "`");
4638 DEFSYM (Qcomma, ",");
4639 DEFSYM (Qcomma_at, ",@");
4640 DEFSYM (Qcomma_dot, ",.");
4641
4642 DEFSYM (Qinhibit_file_name_operation, "inhibit-file-name-operation");
4643 DEFSYM (Qascii_character, "ascii-character");
4644 DEFSYM (Qfunction, "function");
4645 DEFSYM (Qload, "load");
4646 DEFSYM (Qload_file_name, "load-file-name");
4647 DEFSYM (Qeval_buffer_list, "eval-buffer-list");
4648 DEFSYM (Qfile_truename, "file-truename");
4649 DEFSYM (Qdir_ok, "dir-ok");
4650 DEFSYM (Qdo_after_load_evaluation, "do-after-load-evaluation");
6bb6da3e 4651
11938f10 4652 staticpro (&dump_path);
4ad679f9
EN
4653
4654 staticpro (&read_objects);
4655 read_objects = Qnil;
9e062b6c 4656 staticpro (&seen_list);
f153db13 4657 seen_list = Qnil;
177c0ea7 4658
7ee3bd7b
GM
4659 Vloads_in_progress = Qnil;
4660 staticpro (&Vloads_in_progress);
f19a0f5b 4661
cd3520a4
JB
4662 DEFSYM (Qhash_table, "hash-table");
4663 DEFSYM (Qdata, "data");
4664 DEFSYM (Qtest, "test");
4665 DEFSYM (Qsize, "size");
4666 DEFSYM (Qweakness, "weakness");
4667 DEFSYM (Qrehash_size, "rehash-size");
4668 DEFSYM (Qrehash_threshold, "rehash-threshold");
078e7b4a 4669}