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