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