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