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