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