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