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