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