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