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