(read1): When reading from a file, default string to
[bpt/emacs.git] / src / lread.c
CommitLineData
078e7b4a 1/* Lisp parsing and input streams.
df6c90d8 2 Copyright (C) 1985, 86, 87, 88, 89, 93, 94, 95, 97, 98, 99, 2000, 2001
33046fc9 3 Free Software Foundation, Inc.
078e7b4a
JB
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
46947372 9the Free Software Foundation; either version 2, or (at your option)
078e7b4a
JB
10any later version.
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
19the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
078e7b4a
JB
21
22
98280b76 23#include <config.h>
078e7b4a
JB
24#include <stdio.h>
25#include <sys/types.h>
26#include <sys/stat.h>
27#include <sys/file.h>
2c1b5dbe 28#include <errno.h>
078e7b4a 29#include "lisp.h"
95384e1e 30#include "intervals.h"
078e7b4a 31#include "buffer.h"
fe0e03f3 32#include "charset.h"
57bda87a 33#include <epaths.h>
078e7b4a 34#include "commands.h"
e37c0805 35#include "keyboard.h"
7bd279cd 36#include "termhooks.h"
078e7b4a
JB
37
38#ifdef lint
39#include <sys/inode.h>
40#endif /* lint */
41
79051982
RS
42#ifdef MSDOS
43#if __DJGPP__ < 2
44#include <unistd.h> /* to get X_OK */
45#endif
46#include "msdos.h"
47#endif
48
c1a2f60a
AS
49#ifdef HAVE_UNISTD_H
50#include <unistd.h>
51#endif
52
078e7b4a
JB
53#ifndef X_OK
54#define X_OK 01
55#endif
56
078e7b4a 57#include <math.h>
078e7b4a 58
c011e9a5
RS
59#ifdef HAVE_SETLOCALE
60#include <locale.h>
61#endif /* HAVE_SETLOCALE */
62
f7d279f0
RS
63#ifndef O_RDONLY
64#define O_RDONLY 0
65#endif
66
79cf851c 67#ifdef HAVE_FSEEKO
68c45bf0
PE
68#define file_offset off_t
69#define file_tell ftello
70#else
71#define file_offset long
72#define file_tell ftell
73#endif
74
03695ace 75#ifndef USE_CRT_DLL
2c1b5dbe 76extern int errno;
03695ace 77#endif
2c1b5dbe 78
8a1f1537 79Lisp_Object Qread_char, Qget_file_char, Qstandard_input, Qcurrent_load_list;
078e7b4a 80Lisp_Object Qvariable_documentation, Vvalues, Vstandard_input, Vafter_load_alist;
20ea2964 81Lisp_Object Qascii_character, Qload, Qload_file_name;
2b6cae0c 82Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction;
74549846 83Lisp_Object Qinhibit_file_name_operation;
7bd279cd
RS
84
85extern Lisp_Object Qevent_symbol_element_mask;
74549846 86extern Lisp_Object Qfile_exists_p;
078e7b4a
JB
87
88/* non-zero if inside `load' */
89int load_in_progress;
90
1521a8fa
RS
91/* Directory in which the sources were found. */
92Lisp_Object Vsource_directory;
93
e61b9b87
SM
94/* Search path and suffixes for files to be loaded. */
95Lisp_Object Vload_path, Vload_suffixes, default_suffixes;
078e7b4a 96
4116ab9f
KH
97/* File name of user's init file. */
98Lisp_Object Vuser_init_file;
99
ae321d28
RS
100/* This is the user-visible association list that maps features to
101 lists of defs in their load files. */
102Lisp_Object Vload_history;
103
20ea2964 104/* This is used to build the load history. */
ae321d28
RS
105Lisp_Object Vcurrent_load_list;
106
4b104c41
RS
107/* List of files that were preloaded. */
108Lisp_Object Vpreloaded_file_list;
109
20ea2964
RS
110/* Name of file actually being read by `load'. */
111Lisp_Object Vload_file_name;
112
84a15045
RS
113/* Function to use for reading, in `load' and friends. */
114Lisp_Object Vload_read_function;
115
4ad679f9
EN
116/* The association list of objects read with the #n=object form.
117 Each member of the list has the form (n . object), and is used to
118 look up the object for the corresponding #n# construct.
119 It must be set to nil before all top-level calls to read0. */
120Lisp_Object read_objects;
121
b2a30870
RS
122/* Nonzero means load should forcibly load all dynamic doc strings. */
123static int load_force_doc_strings;
124
94e554db
RS
125/* Nonzero means read should convert strings to unibyte. */
126static int load_convert_to_unibyte;
127
fe0e03f3
KH
128/* Function to use for loading an Emacs lisp source file (not
129 compiled) instead of readevalloop. */
130Lisp_Object Vload_source_file_function;
131
1ffcc3b1
DL
132/* List of all DEFVAR_BOOL variables. Used by the byte optimizer. */
133Lisp_Object Vbyte_boolean_vars;
134
d2c6be7f
RS
135/* List of descriptors now open for Fload. */
136static Lisp_Object load_descriptor_list;
137
b2a30870 138/* File for get_file_char to read from. Use by load. */
078e7b4a
JB
139static FILE *instream;
140
141/* When nonzero, read conses in pure space */
142static int read_pure;
143
b2a30870 144/* For use within read-from-string (this reader is non-reentrant!!) */
078e7b4a 145static int read_from_string_index;
bed23cb2 146static int read_from_string_index_byte;
078e7b4a 147static int read_from_string_limit;
17634846 148
6f7f43d5
RS
149/* Number of bytes left to read in the buffer character
150 that `readchar' has already advanced over. */
151static int readchar_backlog;
152
c15cfd1f 153/* This contains the last string skipped with #@. */
b2a30870
RS
154static char *saved_doc_string;
155/* Length of buffer allocated in saved_doc_string. */
156static int saved_doc_string_size;
157/* Length of actual data in saved_doc_string. */
158static int saved_doc_string_length;
159/* This is the file position that string came from. */
68c45bf0 160static file_offset saved_doc_string_position;
b2a30870 161
c15cfd1f
RS
162/* This contains the previous string skipped with #@.
163 We copy it from saved_doc_string when a new string
164 is put in saved_doc_string. */
165static char *prev_saved_doc_string;
166/* Length of buffer allocated in prev_saved_doc_string. */
167static int prev_saved_doc_string_size;
168/* Length of actual data in prev_saved_doc_string. */
169static int prev_saved_doc_string_length;
170/* This is the file position that string came from. */
68c45bf0 171static file_offset prev_saved_doc_string_position;
c15cfd1f 172
17634846
RS
173/* Nonzero means inside a new-style backquote
174 with no surrounding parentheses.
175 Fread initializes this to zero, so we need not specbind it
176 or worry about what happens to it when there is an error. */
177static int new_backquote_flag;
7ee3bd7b
GM
178
179/* A list of file names for files being loaded in Fload. Used to
180 check for recursive loads. */
181
182static Lisp_Object Vloads_in_progress;
183
550a625e
GM
184/* Non-zero means load dangerous compiled Lisp files. */
185
186int load_dangerous_libraries;
187
188/* A regular expression used to detect files compiled with Emacs. */
189
190static Lisp_Object Vbytecomp_version_regexp;
191
a742d646 192static void to_multibyte P_ ((char **, char **, int *));
550a625e
GM
193static void readevalloop P_ ((Lisp_Object, FILE*, Lisp_Object,
194 Lisp_Object (*) (), int,
195 Lisp_Object, Lisp_Object));
196static Lisp_Object load_unwind P_ ((Lisp_Object));
197static Lisp_Object load_descriptor_unwind P_ ((Lisp_Object));
198
078e7b4a
JB
199\f
200/* Handle unreading and rereading of characters.
201 Write READCHAR to read a character,
fe0e03f3
KH
202 UNREAD(c) to unread c to be read again.
203
204 These macros actually read/unread a byte code, multibyte characters
205 are not handled here. The caller should manage them if necessary.
206 */
078e7b4a
JB
207
208#define READCHAR readchar (readcharfun)
209#define UNREAD(c) unreadchar (readcharfun, c)
210
211static int
212readchar (readcharfun)
213 Lisp_Object readcharfun;
214{
215 Lisp_Object tem;
95384e1e 216 register int c;
078e7b4a 217
cfff016d 218 if (BUFFERP (readcharfun))
078e7b4a 219 {
bed23cb2 220 register struct buffer *inbuffer = XBUFFER (readcharfun);
078e7b4a 221
bed23cb2
RS
222 int pt_byte = BUF_PT_BYTE (inbuffer);
223 int orig_pt_byte = pt_byte;
6f7f43d5 224
00a9a935
RS
225 if (readchar_backlog > 0)
226 /* We get the address of the byte just passed,
227 which is the last byte of the character.
228 The other bytes in this character are consecutive with it,
229 because the gap can't be in the middle of a character. */
230 return *(BUF_BYTE_ADDRESS (inbuffer, BUF_PT_BYTE (inbuffer) - 1)
231 - --readchar_backlog);
232
bed23cb2
RS
233 if (pt_byte >= BUF_ZV_BYTE (inbuffer))
234 return -1;
078e7b4a 235
00a9a935
RS
236 readchar_backlog = -1;
237
bed23cb2
RS
238 if (! NILP (inbuffer->enable_multibyte_characters))
239 {
00a9a935 240 /* Fetch the character code from the buffer. */
bed23cb2
RS
241 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, pt_byte);
242 BUF_INC_POS (inbuffer, pt_byte);
243 c = STRING_CHAR (p, pt_byte - orig_pt_byte);
244 }
245 else
246 {
247 c = BUF_FETCH_BYTE (inbuffer, pt_byte);
248 pt_byte++;
6f7f43d5 249 }
bed23cb2 250 SET_BUF_PT_BOTH (inbuffer, BUF_PT (inbuffer) + 1, pt_byte);
6f7f43d5 251
bed23cb2 252 return c;
078e7b4a 253 }
cfff016d 254 if (MARKERP (readcharfun))
078e7b4a 255 {
bed23cb2 256 register struct buffer *inbuffer = XMARKER (readcharfun)->buffer;
078e7b4a 257
bed23cb2
RS
258 int bytepos = marker_byte_position (readcharfun);
259 int orig_bytepos = bytepos;
6f7f43d5 260
00a9a935
RS
261 if (readchar_backlog > 0)
262 /* We get the address of the byte just passed,
263 which is the last byte of the character.
264 The other bytes in this character are consecutive with it,
265 because the gap can't be in the middle of a character. */
266 return *(BUF_BYTE_ADDRESS (inbuffer, XMARKER (readcharfun)->bytepos - 1)
267 - --readchar_backlog);
268
bed23cb2
RS
269 if (bytepos >= BUF_ZV_BYTE (inbuffer))
270 return -1;
6f7f43d5 271
00a9a935
RS
272 readchar_backlog = -1;
273
bed23cb2
RS
274 if (! NILP (inbuffer->enable_multibyte_characters))
275 {
00a9a935 276 /* Fetch the character code from the buffer. */
bed23cb2
RS
277 unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, bytepos);
278 BUF_INC_POS (inbuffer, bytepos);
279 c = STRING_CHAR (p, bytepos - orig_bytepos);
280 }
281 else
282 {
283 c = BUF_FETCH_BYTE (inbuffer, bytepos);
284 bytepos++;
6f7f43d5
RS
285 }
286
bed23cb2
RS
287 XMARKER (readcharfun)->bytepos = bytepos;
288 XMARKER (readcharfun)->charpos++;
289
290 return c;
078e7b4a 291 }
ad0153e4
RS
292
293 if (EQ (readcharfun, Qlambda))
294 return read_bytecode_char (0);
295
078e7b4a 296 if (EQ (readcharfun, Qget_file_char))
2c1b5dbe
KH
297 {
298 c = getc (instream);
299#ifdef EINTR
300 /* Interrupted reads have been observed while reading over the network */
301 while (c == EOF && ferror (instream) && errno == EINTR)
302 {
303 clearerr (instream);
304 c = getc (instream);
305 }
306#endif
307 return c;
308 }
078e7b4a 309
cfff016d 310 if (STRINGP (readcharfun))
078e7b4a 311 {
bed23cb2 312 if (read_from_string_index >= read_from_string_limit)
078e7b4a 313 c = -1;
f0354c03 314 else
bed23cb2
RS
315 FETCH_STRING_CHAR_ADVANCE (c, readcharfun,
316 read_from_string_index,
317 read_from_string_index_byte);
6f7f43d5 318
078e7b4a
JB
319 return c;
320 }
321
322 tem = call0 (readcharfun);
323
265a9e55 324 if (NILP (tem))
078e7b4a
JB
325 return -1;
326 return XINT (tem);
327}
328
329/* Unread the character C in the way appropriate for the stream READCHARFUN.
330 If the stream is a user function, call it with the char as argument. */
331
332static void
333unreadchar (readcharfun, c)
334 Lisp_Object readcharfun;
335 int c;
336{
92fddec9
KH
337 if (c == -1)
338 /* Don't back up the pointer if we're unreading the end-of-input mark,
339 since readchar didn't advance it when we read it. */
340 ;
cfff016d 341 else if (BUFFERP (readcharfun))
d7760ca9 342 {
bed23cb2
RS
343 struct buffer *b = XBUFFER (readcharfun);
344 int bytepos = BUF_PT_BYTE (b);
d7760ca9 345
00a9a935
RS
346 if (readchar_backlog >= 0)
347 readchar_backlog++;
bed23cb2 348 else
00a9a935
RS
349 {
350 BUF_PT (b)--;
351 if (! NILP (b->enable_multibyte_characters))
352 BUF_DEC_POS (b, bytepos);
353 else
354 bytepos--;
d7760ca9 355
00a9a935
RS
356 BUF_PT_BYTE (b) = bytepos;
357 }
d7760ca9 358 }
cfff016d 359 else if (MARKERP (readcharfun))
d7760ca9 360 {
bed23cb2
RS
361 struct buffer *b = XMARKER (readcharfun)->buffer;
362 int bytepos = XMARKER (readcharfun)->bytepos;
d7760ca9 363
00a9a935
RS
364 if (readchar_backlog >= 0)
365 readchar_backlog++;
bed23cb2 366 else
00a9a935
RS
367 {
368 XMARKER (readcharfun)->charpos--;
369 if (! NILP (b->enable_multibyte_characters))
370 BUF_DEC_POS (b, bytepos);
371 else
372 bytepos--;
d7760ca9 373
00a9a935
RS
374 XMARKER (readcharfun)->bytepos = bytepos;
375 }
d7760ca9 376 }
cfff016d 377 else if (STRINGP (readcharfun))
bed23cb2
RS
378 {
379 read_from_string_index--;
380 read_from_string_index_byte
381 = string_char_to_byte (readcharfun, read_from_string_index);
382 }
ad0153e4
RS
383 else if (EQ (readcharfun, Qlambda))
384 read_bytecode_char (1);
078e7b4a
JB
385 else if (EQ (readcharfun, Qget_file_char))
386 ungetc (c, instream);
387 else
388 call1 (readcharfun, make_number (c));
389}
390
391static Lisp_Object read0 (), read1 (), read_list (), read_vector ();
6f7f43d5 392static int read_multibyte ();
9e062b6c
RS
393static Lisp_Object substitute_object_recurse ();
394static void substitute_object_in_subtree (), substitute_in_interval ();
395
078e7b4a 396\f
bed23cb2 397/* Get a character from the tty. */
078e7b4a 398
3d9b22be
JB
399extern Lisp_Object read_char ();
400
f42be754
JB
401/* Read input events until we get one that's acceptable for our purposes.
402
403 If NO_SWITCH_FRAME is non-zero, switch-frame events are stashed
404 until we get a character we like, and then stuffed into
405 unread_switch_frame.
406
407 If ASCII_REQUIRED is non-zero, we check function key events to see
408 if the unmodified version of the symbol has a Qascii_character
409 property, and use that character, if present.
410
411 If ERROR_NONASCII is non-zero, we signal an error if the input we
412 get isn't an ASCII character with modifiers. If it's zero but
413 ASCII_REQUIRED is non-zero, we just re-read until we get an ASCII
bb49a192
RS
414 character.
415
416 If INPUT_METHOD is nonzero, we invoke the current input method
417 if the character warrants that. */
cc39bc38 418
f42be754 419Lisp_Object
bb49a192
RS
420read_filtered_event (no_switch_frame, ascii_required, error_nonascii,
421 input_method)
422 int no_switch_frame, ascii_required, error_nonascii, input_method;
f42be754 423{
153a17b7
KH
424 register Lisp_Object val, delayed_switch_frame;
425
5dbf89bc 426#ifdef HAVE_WINDOW_SYSTEM
df6c90d8
GM
427 if (display_hourglass_p)
428 cancel_hourglass ();
5dbf89bc
GM
429#endif
430
153a17b7 431 delayed_switch_frame = Qnil;
f42be754
JB
432
433 /* Read until we get an acceptable event. */
434 retry:
bb49a192
RS
435 val = read_char (0, 0, 0,
436 (input_method ? Qnil : Qt),
437 0);
f42be754 438
cfff016d 439 if (BUFFERP (val))
6c82d689
KH
440 goto retry;
441
f42be754 442 /* switch-frame events are put off until after the next ASCII
8e6208c5 443 character. This is better than signaling an error just because
f42be754
JB
444 the last characters were typed to a separate minibuffer frame,
445 for example. Eventually, some code which can deal with
446 switch-frame events will read it and process it. */
447 if (no_switch_frame
448 && EVENT_HAS_PARAMETERS (val)
449 && EQ (EVENT_HEAD (val), Qswitch_frame))
450 {
451 delayed_switch_frame = val;
452 goto retry;
453 }
454
455 if (ascii_required)
456 {
457 /* Convert certain symbols to their ASCII equivalents. */
cfff016d 458 if (SYMBOLP (val))
f42be754 459 {
95384e1e 460 Lisp_Object tem, tem1;
f42be754
JB
461 tem = Fget (val, Qevent_symbol_element_mask);
462 if (!NILP (tem))
463 {
464 tem1 = Fget (Fcar (tem), Qascii_character);
465 /* Merge this symbol's modifier bits
466 with the ASCII equivalent of its basic code. */
467 if (!NILP (tem1))
baf69866 468 XSETFASTINT (val, XINT (tem1) | XINT (Fcar (Fcdr (tem))));
f42be754
JB
469 }
470 }
471
472 /* If we don't have a character now, deal with it appropriately. */
cfff016d 473 if (!INTEGERP (val))
f42be754
JB
474 {
475 if (error_nonascii)
476 {
1ec84625 477 Vunread_command_events = Fcons (val, Qnil);
f42be754
JB
478 error ("Non-character input-event");
479 }
480 else
481 goto retry;
482 }
483 }
484
485 if (! NILP (delayed_switch_frame))
486 unread_switch_frame = delayed_switch_frame;
487
5dbf89bc 488#ifdef HAVE_WINDOW_SYSTEM
df6c90d8
GM
489 if (display_hourglass_p)
490 start_hourglass ();
5dbf89bc 491#endif
f42be754 492 return val;
f42be754
JB
493}
494
bb49a192 495DEFUN ("read-char", Fread_char, Sread_char, 0, 2, 0,
5de38842
PJ
496 doc: /* Read a character from the command input (keyboard or macro).
497It is returned as a number.
498If the user generates an event which is not a character (i.e. a mouse
499click or function key event), `read-char' signals an error. As an
500exception, switch-frame events are put off until non-ASCII events can
501be read.
502If you want to read non-character events, or ignore them, call
503`read-event' or `read-char-exclusive' instead.
504
505If the optional argument PROMPT is non-nil, display that as a prompt.
506If the optional argument INHERIT-INPUT-METHOD is non-nil and some
507input method is turned on in the current buffer, that input method
508is used for reading a character. */)
509 (prompt, inherit_input_method)
fc351d2f 510 Lisp_Object prompt, inherit_input_method;
078e7b4a 511{
bb49a192
RS
512 if (! NILP (prompt))
513 message_with_string ("%s", prompt, 0);
fc351d2f 514 return read_filtered_event (1, 1, 1, ! NILP (inherit_input_method));
078e7b4a
JB
515}
516
bb49a192 517DEFUN ("read-event", Fread_event, Sread_event, 0, 2, 0,
5de38842
PJ
518 doc: /* Read an event object from the input stream.
519If the optional argument PROMPT is non-nil, display that as a prompt.
520If the optional argument INHERIT-INPUT-METHOD is non-nil and some
521input method is turned on in the current buffer, that input method
522is used for reading a character. */)
523 (prompt, inherit_input_method)
fc351d2f 524 Lisp_Object prompt, inherit_input_method;
078e7b4a 525{
bb49a192
RS
526 if (! NILP (prompt))
527 message_with_string ("%s", prompt, 0);
fc351d2f 528 return read_filtered_event (0, 0, 0, ! NILP (inherit_input_method));
078e7b4a
JB
529}
530
bb49a192 531DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 2, 0,
5de38842
PJ
532 doc: /* Read a character from the command input (keyboard or macro).
533It is returned as a number. Non-character events are ignored.
534
535If the optional argument PROMPT is non-nil, display that as a prompt.
536If the optional argument INHERIT-INPUT-METHOD is non-nil and some
537input method is turned on in the current buffer, that input method
538is used for reading a character. */)
539 (prompt, inherit_input_method)
fc351d2f 540 Lisp_Object prompt, inherit_input_method;
078e7b4a 541{
bb49a192
RS
542 if (! NILP (prompt))
543 message_with_string ("%s", prompt, 0);
fc351d2f 544 return read_filtered_event (1, 1, 0, ! NILP (inherit_input_method));
078e7b4a 545}
078e7b4a
JB
546
547DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,
5de38842
PJ
548 doc: /* Don't use this yourself. */)
549 ()
078e7b4a
JB
550{
551 register Lisp_Object val;
1805de4f 552 XSETINT (val, getc (instream));
078e7b4a
JB
553 return val;
554}
da84f340
GM
555
556
550a625e 557\f
da84f340
GM
558/* Value is non-zero if the file asswociated with file descriptor FD
559 is a compiled Lisp file that's safe to load. Only files compiled
560 with Emacs are safe to load. Files compiled with XEmacs can lead
561 to a crash in Fbyte_code because of an incompatible change in the
562 byte compiler. */
563
564static int
565safe_to_load_p (fd)
566 int fd;
567{
568 char buf[512];
569 int nbytes, i;
570 int safe_p = 1;
571
572 /* Read the first few bytes from the file, and look for a line
573 specifying the byte compiler version used. */
574 nbytes = emacs_read (fd, buf, sizeof buf - 1);
575 if (nbytes > 0)
576 {
577 buf[nbytes] = '\0';
578
579 /* Skip to the next newline, skipping over the initial `ELC'
580 with NUL bytes following it. */
581 for (i = 0; i < nbytes && buf[i] != '\n'; ++i)
582 ;
583
584 if (i < nbytes
585 && fast_c_string_match_ignore_case (Vbytecomp_version_regexp,
586 buf + i) < 0)
587 safe_p = 0;
588 }
589
590 lseek (fd, 0, SEEK_SET);
591 return safe_p;
592}
593
594
7ee3bd7b
GM
595/* Callback for record_unwind_protect. Restore the old load list OLD,
596 after loading a file successfully. */
597
598static Lisp_Object
599record_load_unwind (old)
600 Lisp_Object old;
601{
602 return Vloads_in_progress = old;
603}
604
605
f0a50954 606DEFUN ("load", Fload, Sload, 1, 5, 0,
5de38842
PJ
607 doc: /* Execute a file of Lisp code named FILE.
608First try FILE with `.elc' appended, then try with `.el',
609 then try FILE unmodified. Environment variable references in FILE
610 are replaced with their values by calling `substitute-in-file-name'.
611This function searches the directories in `load-path'.
612If optional second arg NOERROR is non-nil,
613 report no error if FILE doesn't exist.
614Print messages at start and end of loading unless
615 optional third arg NOMESSAGE is non-nil.
616If optional fourth arg NOSUFFIX is non-nil, don't try adding
617 suffixes `.elc' or `.el' to the specified name FILE.
618If optional fifth arg MUST-SUFFIX is non-nil, insist on
619 the suffix `.elc' or `.el'; don't accept just FILE unless
620 it ends in one of those suffixes or includes a directory name.
621Return t if file exists. */)
622 (file, noerror, nomessage, nosuffix, must_suffix)
f0a50954 623 Lisp_Object file, noerror, nomessage, nosuffix, must_suffix;
078e7b4a
JB
624{
625 register FILE *stream;
626 register int fd = -1;
627 register Lisp_Object lispstream;
078e7b4a
JB
628 int count = specpdl_ptr - specpdl;
629 Lisp_Object temp;
630 struct gcpro gcpro1;
631 Lisp_Object found;
04fc68e7
RS
632 /* 1 means we printed the ".el is newer" message. */
633 int newer = 0;
634 /* 1 means we are loading a compiled file. */
635 int compiled = 0;
c2225d00 636 Lisp_Object handler;
456c67a4 637 int safe_p = 1;
229ba775 638 char *fmode = "r";
317073d5 639#ifdef DOS_NT
229ba775 640 fmode = "rt";
317073d5 641#endif /* DOS_NT */
078e7b4a 642
b7826503 643 CHECK_STRING (file);
078e7b4a 644
c2225d00 645 /* If file name is magic, call the handler. */
e61b9b87
SM
646 /* This shouldn't be necessary any more now that `openp' handles it right.
647 handler = Ffind_file_name_handler (file, Qload);
648 if (!NILP (handler))
649 return call5 (handler, Qload, file, noerror, nomessage, nosuffix); */
c2225d00 650
07a0bda3
RS
651 /* Do this after the handler to avoid
652 the need to gcpro noerror, nomessage and nosuffix.
e61b9b87
SM
653 (Below here, we care only whether they are nil or not.)
654 The presence of this call is the result of a historical accident:
655 it used to be in every file-operations and when it got removed
656 everywhere, it accidentally stayed here. Since then, enough people
657 supposedly have things like (load "$PROJECT/foo.el") in their .emacs
658 that it seemed risky to remove. */
0745dce9 659 file = Fsubstitute_in_file_name (file);
07a0bda3 660
078e7b4a
JB
661 /* Avoid weird lossage with null string as arg,
662 since it would try to load a directory as a Lisp file */
0745dce9 663 if (XSTRING (file)->size > 0)
078e7b4a 664 {
471aa4a0 665 int size = STRING_BYTES (XSTRING (file));
e61b9b87 666 Lisp_Object tmp[2];
211f7dcd 667
0745dce9 668 GCPRO1 (file);
211f7dcd
RS
669
670 if (! NILP (must_suffix))
671 {
672 /* Don't insist on adding a suffix if FILE already ends with one. */
673 if (size > 3
674 && !strcmp (XSTRING (file)->data + size - 3, ".el"))
675 must_suffix = Qnil;
676 else if (size > 4
677 && !strcmp (XSTRING (file)->data + size - 4, ".elc"))
678 must_suffix = Qnil;
679 /* Don't insist on adding a suffix
680 if the argument includes a directory name. */
681 else if (! NILP (Ffile_name_directory (file)))
682 must_suffix = Qnil;
683 }
684
f0a50954 685 fd = openp (Vload_path, file,
e61b9b87
SM
686 (!NILP (nosuffix) ? Qnil
687 : !NILP (must_suffix) ? Vload_suffixes
688 : Fappend (2, (tmp[0] = Vload_suffixes,
689 tmp[1] = default_suffixes,
690 tmp))),
078e7b4a 691 &found, 0);
5a6e5452 692 UNGCPRO;
078e7b4a
JB
693 }
694
96dc0f4e 695 if (fd == -1)
078e7b4a 696 {
265a9e55 697 if (NILP (noerror))
078e7b4a
JB
698 while (1)
699 Fsignal (Qfile_error, Fcons (build_string ("Cannot open load file"),
0745dce9 700 Fcons (file, Qnil)));
078e7b4a
JB
701 else
702 return Qnil;
703 }
704
ba0d1195 705 /* Tell startup.el whether or not we found the user's init file. */
4116ab9f
KH
706 if (EQ (Qt, Vuser_init_file))
707 Vuser_init_file = found;
708
96dc0f4e
MB
709 /* If FD is -2, that means openp found a magic file. */
710 if (fd == -2)
74549846 711 {
5e24a1f7
KH
712 if (NILP (Fequal (found, file)))
713 /* If FOUND is a different file name from FILE,
714 find its handler even if we have already inhibited
715 the `load' operation on FILE. */
716 handler = Ffind_file_name_handler (found, Qt);
717 else
718 handler = Ffind_file_name_handler (found, Qload);
719 if (! NILP (handler))
720 return call5 (handler, Qload, found, noerror, nomessage, Qt);
74549846
RS
721 }
722
550a625e
GM
723 /* Check if we're stuck in a recursive load cycle.
724
725 2000-09-21: It's not possible to just check for the file loaded
726 being a member of Vloads_in_progress. This fails because of the
727 way the byte compiler currently works; `provide's are not
728 evaluted, see font-lock.el/jit-lock.el as an example. This
729 leads to a certain amount of ``normal'' recursion.
730
731 Also, just loading a file recursively is not always an error in
732 the general case; the second load may do something different. */
3ba6fd9a
RS
733 {
734 int count = 0;
735 Lisp_Object tem;
736 for (tem = Vloads_in_progress; CONSP (tem); tem = XCDR (tem))
737 if (!NILP (Fequal (found, XCAR (tem))))
738 count++;
739 if (count > 3)
740 Fsignal (Qerror, Fcons (build_string ("Recursive load"),
741 Fcons (found, Vloads_in_progress)));
742 record_unwind_protect (record_load_unwind, Vloads_in_progress);
743 Vloads_in_progress = Fcons (found, Vloads_in_progress);
744 }
7ee3bd7b 745
471aa4a0 746 if (!bcmp (&(XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 4]),
96dc0f4e
MB
747 ".elc", 4))
748 /* Load .elc files directly, but not when they are
749 remote and have no handler! */
078e7b4a 750 {
96dc0f4e 751 if (fd != -2)
da84f340 752 {
96dc0f4e
MB
753 struct stat s1, s2;
754 int result;
da84f340 755
96dc0f4e
MB
756 if (!safe_to_load_p (fd))
757 {
758 safe_p = 0;
759 if (!load_dangerous_libraries)
760 error ("File `%s' was not compiled in Emacs",
761 XSTRING (found)->data);
762 else if (!NILP (nomessage))
763 message_with_string ("File `%s' not compiled in Emacs", found, 1);
764 }
04fc68e7 765
96dc0f4e
MB
766 compiled = 1;
767
26fbf20b 768#ifdef DOS_NT
96dc0f4e 769 fmode = "rb";
26fbf20b 770#endif /* DOS_NT */
96dc0f4e
MB
771 stat ((char *)XSTRING (found)->data, &s1);
772 XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 0;
773 result = stat ((char *)XSTRING (found)->data, &s2);
774 if (result >= 0 && (unsigned) s1.st_mtime < (unsigned) s2.st_mtime)
775 {
776 /* Make the progress messages mention that source is newer. */
777 newer = 1;
04fc68e7 778
96dc0f4e
MB
779 /* If we won't print another message, mention this anyway. */
780 if (! NILP (nomessage))
781 message_with_string ("Source file `%s' newer than byte-compiled file",
782 found, 1);
783 }
784 XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 'c';
51ac6f83 785 }
078e7b4a 786 }
fe0e03f3
KH
787 else
788 {
789 /* We are loading a source file (*.el). */
790 if (!NILP (Vload_source_file_function))
791 {
7ee3bd7b 792 Lisp_Object val;
96dc0f4e
MB
793
794 if (fd >= 0)
68c45bf0 795 emacs_close (fd);
7ee3bd7b
GM
796 val = call4 (Vload_source_file_function, found, file,
797 NILP (noerror) ? Qnil : Qt,
798 NILP (nomessage) ? Qnil : Qt);
799 return unbind_to (count, val);
fe0e03f3
KH
800 }
801 }
078e7b4a 802
229ba775 803#ifdef WINDOWSNT
68c45bf0 804 emacs_close (fd);
229ba775
EZ
805 stream = fopen ((char *) XSTRING (found)->data, fmode);
806#else /* not WINDOWSNT */
807 stream = fdopen (fd, fmode);
808#endif /* not WINDOWSNT */
078e7b4a
JB
809 if (stream == 0)
810 {
68c45bf0 811 emacs_close (fd);
0745dce9 812 error ("Failure to create stdio stream for %s", XSTRING (file)->data);
078e7b4a
JB
813 }
814
4b104c41
RS
815 if (! NILP (Vpurify_flag))
816 Vpreloaded_file_list = Fcons (file, Vpreloaded_file_list);
817
04fc68e7
RS
818 if (NILP (nomessage))
819 {
da84f340
GM
820 if (!safe_p)
821 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...",
822 file, 1);
823 else if (!compiled)
e28552a4 824 message_with_string ("Loading %s (source)...", file, 1);
db5cae4b 825 else if (newer)
e28552a4
RS
826 message_with_string ("Loading %s (compiled; note, source file is newer)...",
827 file, 1);
db5cae4b 828 else /* The typical case; compiled file newer than source file. */
e28552a4 829 message_with_string ("Loading %s...", file, 1);
04fc68e7 830 }
078e7b4a 831
0745dce9 832 GCPRO1 (file);
838abf56 833 lispstream = Fcons (Qnil, Qnil);
f5df591a
KR
834 XSETCARFASTINT (lispstream, (EMACS_UINT)stream >> 16);
835 XSETCDRFASTINT (lispstream, (EMACS_UINT)stream & 0xffff);
078e7b4a 836 record_unwind_protect (load_unwind, lispstream);
d2c6be7f 837 record_unwind_protect (load_descriptor_unwind, load_descriptor_list);
20ea2964 838 specbind (Qload_file_name, found);
74549846 839 specbind (Qinhibit_file_name_operation, Qnil);
d2c6be7f
RS
840 load_descriptor_list
841 = Fcons (make_number (fileno (stream)), load_descriptor_list);
078e7b4a 842 load_in_progress++;
976350af 843 readevalloop (Qget_file_char, stream, file, Feval, 0, Qnil, Qnil);
078e7b4a
JB
844 unbind_to (count, Qnil);
845
846 /* Run any load-hooks for this file. */
0745dce9 847 temp = Fassoc (file, Vafter_load_alist);
265a9e55 848 if (!NILP (temp))
078e7b4a
JB
849 Fprogn (Fcdr (temp));
850 UNGCPRO;
851
b2a30870
RS
852 if (saved_doc_string)
853 free (saved_doc_string);
854 saved_doc_string = 0;
855 saved_doc_string_size = 0;
856
c15cfd1f 857 if (prev_saved_doc_string)
3cb65b0e 858 xfree (prev_saved_doc_string);
c15cfd1f
RS
859 prev_saved_doc_string = 0;
860 prev_saved_doc_string_size = 0;
861
265a9e55 862 if (!noninteractive && NILP (nomessage))
04fc68e7 863 {
da84f340
GM
864 if (!safe_p)
865 message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...done",
866 file, 1);
867 else if (!compiled)
e28552a4 868 message_with_string ("Loading %s (source)...done", file, 1);
db5cae4b 869 else if (newer)
e28552a4
RS
870 message_with_string ("Loading %s (compiled; note, source file is newer)...done",
871 file, 1);
db5cae4b 872 else /* The typical case; compiled file newer than source file. */
e28552a4 873 message_with_string ("Loading %s...done", file, 1);
04fc68e7 874 }
7ee3bd7b 875
078e7b4a
JB
876 return Qt;
877}
878
879static Lisp_Object
880load_unwind (stream) /* used as unwind-protect function in load */
881 Lisp_Object stream;
882{
c1d497be
KR
883 fclose ((FILE *) (XFASTINT (XCAR (stream)) << 16
884 | XFASTINT (XCDR (stream))));
078e7b4a
JB
885 if (--load_in_progress < 0) load_in_progress = 0;
886 return Qnil;
887}
888
d2c6be7f
RS
889static Lisp_Object
890load_descriptor_unwind (oldlist)
891 Lisp_Object oldlist;
892{
893 load_descriptor_list = oldlist;
838abf56 894 return Qnil;
d2c6be7f
RS
895}
896
897/* Close all descriptors in use for Floads.
898 This is used when starting a subprocess. */
899
900void
901close_load_descs ()
902{
f3849f25 903#ifndef WINDOWSNT
d2c6be7f 904 Lisp_Object tail;
c1d497be 905 for (tail = load_descriptor_list; !NILP (tail); tail = XCDR (tail))
68c45bf0 906 emacs_close (XFASTINT (XCAR (tail)));
f3849f25 907#endif
d2c6be7f 908}
078e7b4a
JB
909\f
910static int
911complete_filename_p (pathname)
912 Lisp_Object pathname;
913{
914 register unsigned char *s = XSTRING (pathname)->data;
317073d5
RS
915 return (IS_DIRECTORY_SEP (s[0])
916 || (XSTRING (pathname)->size > 2
917 && IS_DEVICE_SEP (s[1]) && IS_DIRECTORY_SEP (s[2]))
078e7b4a
JB
918#ifdef ALTOS
919 || *s == '@'
920#endif
921#ifdef VMS
922 || index (s, ':')
923#endif /* VMS */
924 );
925}
926
927/* Search for a file whose name is STR, looking in directories
928 in the Lisp list PATH, and trying suffixes from SUFFIX.
078e7b4a
JB
929 On success, returns a file descriptor. On failure, returns -1.
930
e61b9b87
SM
931 SUFFIXES is a list of strings containing possible suffixes.
932 The empty suffix is automatically added iff the list is empty.
933
078e7b4a
JB
934 EXEC_ONLY nonzero means don't open the files,
935 just look for one that is executable. In this case,
936 returns 1 on success.
937
938 If STOREPTR is nonzero, it points to a slot where the name of
939 the file actually found should be stored as a Lisp string.
74549846
RS
940 nil is stored there on failure.
941
96dc0f4e 942 If the file we find is remote, return -2
74549846
RS
943 but store the found remote file name in *STOREPTR.
944 We do not check for remote files if EXEC_ONLY is nonzero. */
078e7b4a
JB
945
946int
e61b9b87 947openp (path, str, suffixes, storeptr, exec_only)
078e7b4a 948 Lisp_Object path, str;
e61b9b87 949 Lisp_Object suffixes;
078e7b4a
JB
950 Lisp_Object *storeptr;
951 int exec_only;
952{
953 register int fd;
954 int fn_size = 100;
955 char buf[100];
956 register char *fn = buf;
957 int absolute = 0;
958 int want_size;
74549846 959 Lisp_Object filename;
078e7b4a 960 struct stat st;
e61b9b87
SM
961 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
962 Lisp_Object string, tail;
963 int max_suffix_len = 0;
964
965 for (tail = suffixes; CONSP (tail); tail = XCDR (tail))
966 {
f5df591a 967 CHECK_STRING_CAR (tail);
e61b9b87 968 max_suffix_len = max (max_suffix_len,
990ff03c 969 STRING_BYTES (XSTRING (XCAR (tail))));
e61b9b87 970 }
078e7b4a 971
990ff03c
GM
972 string = filename = Qnil;
973 GCPRO5 (str, string, filename, path, suffixes);
974
078e7b4a
JB
975 if (storeptr)
976 *storeptr = Qnil;
977
978 if (complete_filename_p (str))
979 absolute = 1;
980
e61b9b87 981 for (; CONSP (path); path = XCDR (path))
078e7b4a 982 {
e61b9b87 983 filename = Fexpand_file_name (str, XCAR (path));
078e7b4a
JB
984 if (!complete_filename_p (filename))
985 /* If there are non-absolute elts in PATH (eg ".") */
986 /* Of course, this could conceivably lose if luser sets
987 default-directory to be something non-absolute... */
988 {
989 filename = Fexpand_file_name (filename, current_buffer->directory);
990 if (!complete_filename_p (filename))
991 /* Give up on this path element! */
992 continue;
993 }
994
995 /* Calculate maximum size of any filename made from
996 this path element/specified file name and any possible suffix. */
e61b9b87 997 want_size = max_suffix_len + STRING_BYTES (XSTRING (filename)) + 1;
078e7b4a
JB
998 if (fn_size < want_size)
999 fn = (char *) alloca (fn_size = 100 + want_size);
1000
078e7b4a 1001 /* Loop over suffixes. */
e61b9b87
SM
1002 for (tail = NILP (suffixes) ? default_suffixes : suffixes;
1003 CONSP (tail); tail = XCDR (tail))
078e7b4a 1004 {
e61b9b87 1005 int lsuffix = STRING_BYTES (XSTRING (XCAR (tail)));
74549846 1006 Lisp_Object handler;
078e7b4a 1007
c49afcd7
RS
1008 /* Concatenate path element/specified name with the suffix.
1009 If the directory starts with /:, remove that. */
1010 if (XSTRING (filename)->size > 2
1011 && XSTRING (filename)->data[0] == '/'
1012 && XSTRING (filename)->data[1] == ':')
1013 {
1014 strncpy (fn, XSTRING (filename)->data + 2,
471aa4a0
KH
1015 STRING_BYTES (XSTRING (filename)) - 2);
1016 fn[STRING_BYTES (XSTRING (filename)) - 2] = 0;
c49afcd7
RS
1017 }
1018 else
1019 {
471aa4a0
KH
1020 strncpy (fn, XSTRING (filename)->data,
1021 STRING_BYTES (XSTRING (filename)));
1022 fn[STRING_BYTES (XSTRING (filename))] = 0;
c49afcd7
RS
1023 }
1024
078e7b4a 1025 if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
e61b9b87
SM
1026 strncat (fn, XSTRING (XCAR (tail))->data, lsuffix);
1027
74549846 1028 /* Check that the file exists and is not a directory. */
e61b9b87
SM
1029 /* We used to only check for handlers on non-absolute file names:
1030 if (absolute)
1031 handler = Qnil;
1032 else
1033 handler = Ffind_file_name_handler (filename, Qfile_exists_p);
1034 It's not clear why that was the case and it breaks things like
1035 (load "/bar.el") where the file is actually "/bar.el.gz". */
1036 handler = Ffind_file_name_handler (filename, Qfile_exists_p);
1037 if (!NILP (handler) && !exec_only)
078e7b4a 1038 {
74549846 1039 int exists;
078e7b4a 1040
74549846 1041 string = build_string (fn);
e61b9b87
SM
1042 exists = !NILP (Ffile_readable_p (string));
1043 if (exists && !NILP (Ffile_directory_p (build_string (fn))))
74549846
RS
1044 exists = 0;
1045
1046 if (exists)
078e7b4a
JB
1047 {
1048 /* We succeeded; return this descriptor and filename. */
1049 if (storeptr)
1050 *storeptr = build_string (fn);
5ef2a3c0 1051 UNGCPRO;
96dc0f4e 1052 return -2;
74549846
RS
1053 }
1054 }
1055 else
1056 {
1057 int exists = (stat (fn, &st) >= 0
1058 && (st.st_mode & S_IFMT) != S_IFDIR);
1059 if (exists)
1060 {
1061 /* Check that we can access or open it. */
1062 if (exec_only)
1063 fd = (access (fn, X_OK) == 0) ? 1 : -1;
1064 else
68c45bf0 1065 fd = emacs_open (fn, O_RDONLY, 0);
74549846
RS
1066
1067 if (fd >= 0)
1068 {
1069 /* We succeeded; return this descriptor and filename. */
1070 if (storeptr)
1071 *storeptr = build_string (fn);
1072 UNGCPRO;
1073 return fd;
1074 }
078e7b4a
JB
1075 }
1076 }
078e7b4a 1077 }
5a6e5452 1078 if (absolute)
5ef2a3c0 1079 break;
078e7b4a
JB
1080 }
1081
5ef2a3c0
KH
1082 UNGCPRO;
1083 return -1;
078e7b4a
JB
1084}
1085
1086\f
ae321d28
RS
1087/* Merge the list we've accumulated of globals from the current input source
1088 into the load_history variable. The details depend on whether
1089 the source has an associated file name or not. */
1090
1091static void
1092build_load_history (stream, source)
1093 FILE *stream;
1094 Lisp_Object source;
1095{
1096 register Lisp_Object tail, prev, newelt;
1097 register Lisp_Object tem, tem2;
1098 register int foundit, loading;
1099
1100 loading = stream || !NARROWED;
1101
1102 tail = Vload_history;
1103 prev = Qnil;
1104 foundit = 0;
1105 while (!NILP (tail))
1106 {
1107 tem = Fcar (tail);
1108
1109 /* Find the feature's previous assoc list... */
1110 if (!NILP (Fequal (source, Fcar (tem))))
1111 {
1112 foundit = 1;
1113
1114 /* If we're loading, remove it. */
1115 if (loading)
1116 {
1117 if (NILP (prev))
1118 Vload_history = Fcdr (tail);
1119 else
1120 Fsetcdr (prev, Fcdr (tail));
1121 }
1122
1123 /* Otherwise, cons on new symbols that are not already members. */
1124 else
1125 {
1126 tem2 = Vcurrent_load_list;
1127
1128 while (CONSP (tem2))
1129 {
1130 newelt = Fcar (tem2);
1131
1132 if (NILP (Fmemq (newelt, tem)))
1133 Fsetcar (tail, Fcons (Fcar (tem),
1134 Fcons (newelt, Fcdr (tem))));
1135
1136 tem2 = Fcdr (tem2);
1137 QUIT;
1138 }
1139 }
1140 }
1141 else
1142 prev = tail;
1143 tail = Fcdr (tail);
1144 QUIT;
1145 }
1146
8a1f1537
RS
1147 /* If we're loading, cons the new assoc onto the front of load-history,
1148 the most-recently-loaded position. Also do this if we didn't find
1149 an existing member for the current source. */
1150 if (loading || !foundit)
1151 Vload_history = Fcons (Fnreverse (Vcurrent_load_list),
1152 Vload_history);
ae321d28
RS
1153}
1154
078e7b4a 1155Lisp_Object
232ccf27
DL
1156unreadpure (junk) /* Used as unwind-protect function in readevalloop */
1157 Lisp_Object junk;
078e7b4a
JB
1158{
1159 read_pure = 0;
1160 return Qnil;
1161}
1162
94e554db
RS
1163static Lisp_Object
1164readevalloop_1 (old)
1165 Lisp_Object old;
1166{
1167 load_convert_to_unibyte = ! NILP (old);
1168 return Qnil;
1169}
1170
9c97398c
GM
1171/* Signal an `end-of-file' error, if possible with file name
1172 information. */
1173
1174static void
1175end_of_file_error ()
1176{
1177 Lisp_Object data;
1178
1179 if (STRINGP (Vload_file_name))
1180 data = Fcons (Vload_file_name, Qnil);
1181 else
1182 data = Qnil;
1183
1184 Fsignal (Qend_of_file, data);
1185}
1186
94e554db 1187/* UNIBYTE specifies how to set load_convert_to_unibyte
976350af
RS
1188 for this invocation.
1189 READFUN, if non-nil, is used instead of `read'. */
94e554db 1190
078e7b4a 1191static void
976350af 1192readevalloop (readcharfun, stream, sourcename, evalfun, printflag, unibyte, readfun)
078e7b4a 1193 Lisp_Object readcharfun;
ae321d28
RS
1194 FILE *stream;
1195 Lisp_Object sourcename;
078e7b4a
JB
1196 Lisp_Object (*evalfun) ();
1197 int printflag;
976350af 1198 Lisp_Object unibyte, readfun;
078e7b4a
JB
1199{
1200 register int c;
1201 register Lisp_Object val;
1202 int count = specpdl_ptr - specpdl;
8a1f1537 1203 struct gcpro gcpro1;
49cf7ff4 1204 struct buffer *b = 0;
f38952fe 1205 int continue_reading_p;
49cf7ff4
RS
1206
1207 if (BUFFERP (readcharfun))
1208 b = XBUFFER (readcharfun);
1209 else if (MARKERP (readcharfun))
1210 b = XMARKER (readcharfun)->buffer;
078e7b4a
JB
1211
1212 specbind (Qstandard_input, readcharfun);
8a1f1537 1213 specbind (Qcurrent_load_list, Qnil);
94e554db
RS
1214 record_unwind_protect (readevalloop_1, load_convert_to_unibyte ? Qt : Qnil);
1215 load_convert_to_unibyte = !NILP (unibyte);
078e7b4a 1216
00a9a935 1217 readchar_backlog = -1;
6f7f43d5 1218
8a1f1537 1219 GCPRO1 (sourcename);
ae321d28 1220
ae321d28
RS
1221 LOADHIST_ATTACH (sourcename);
1222
f38952fe
GM
1223 continue_reading_p = 1;
1224 while (continue_reading_p)
078e7b4a 1225 {
49cf7ff4
RS
1226 if (b != 0 && NILP (b->name))
1227 error ("Reading from killed buffer");
1228
078e7b4a
JB
1229 instream = stream;
1230 c = READCHAR;
1231 if (c == ';')
1232 {
1233 while ((c = READCHAR) != '\n' && c != -1);
1234 continue;
1235 }
1236 if (c < 0) break;
6069d957
RS
1237
1238 /* Ignore whitespace here, so we can detect eof. */
1239 if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r')
1240 continue;
078e7b4a 1241
265a9e55 1242 if (!NILP (Vpurify_flag) && c == '(')
078e7b4a 1243 {
0e326373 1244 int count1 = specpdl_ptr - specpdl;
078e7b4a
JB
1245 record_unwind_protect (unreadpure, Qnil);
1246 val = read_list (-1, readcharfun);
0e326373 1247 unbind_to (count1, Qnil);
078e7b4a
JB
1248 }
1249 else
1250 {
1251 UNREAD (c);
4ad679f9 1252 read_objects = Qnil;
f38952fe
GM
1253 if (!NILP (readfun))
1254 {
1255 val = call1 (readfun, readcharfun);
1256
1257 /* If READCHARFUN has set point to ZV, we should
1258 stop reading, even if the form read sets point
1259 to a different value when evaluated. */
1260 if (BUFFERP (readcharfun))
1261 {
1262 struct buffer *b = XBUFFER (readcharfun);
1263 if (BUF_PT (b) == BUF_ZV (b))
1264 continue_reading_p = 0;
1265 }
1266 }
976350af 1267 else if (! NILP (Vload_read_function))
84a15045 1268 val = call1 (Vload_read_function, readcharfun);
976350af
RS
1269 else
1270 val = read0 (readcharfun);
078e7b4a
JB
1271 }
1272
1273 val = (*evalfun) (val);
f38952fe 1274
078e7b4a
JB
1275 if (printflag)
1276 {
1277 Vvalues = Fcons (val, Vvalues);
1278 if (EQ (Vstandard_output, Qt))
1279 Fprin1 (val, Qnil);
1280 else
1281 Fprint (val, Qnil);
1282 }
1283 }
1284
ae321d28 1285 build_load_history (stream, sourcename);
ae321d28
RS
1286 UNGCPRO;
1287
078e7b4a
JB
1288 unbind_to (count, Qnil);
1289}
1290
1076254d 1291DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 5, "",
5de38842
PJ
1292 doc: /* Execute the current buffer as Lisp code.
1293Programs can pass two arguments, BUFFER and PRINTFLAG.
1294BUFFER is the buffer to evaluate (nil means use current buffer).
1295PRINTFLAG controls printing of output:
1296nil means discard it; anything else is stream for print.
1297
1298If the optional third argument FILENAME is non-nil,
1299it specifies the file name to use for `load-history'.
1300The optional fourth argument UNIBYTE specifies `load-convert-to-unibyte'
1301for this invocation.
1302
1303The optional fifth argument DO-ALLOW-PRINT, if not-nil, specifies that
1304`print' and related functions should work normally even if PRINTFLAG is nil.
1305
1306This function preserves the position of point. */)
1307 (buffer, printflag, filename, unibyte, do_allow_print)
1076254d 1308 Lisp_Object buffer, printflag, filename, unibyte, do_allow_print;
228d4b1c
JA
1309{
1310 int count = specpdl_ptr - specpdl;
1311 Lisp_Object tem, buf;
1312
9391b698 1313 if (NILP (buffer))
228d4b1c
JA
1314 buf = Fcurrent_buffer ();
1315 else
9391b698 1316 buf = Fget_buffer (buffer);
dfdb645c 1317 if (NILP (buf))
13febd85 1318 error ("No such buffer");
228d4b1c 1319
1076254d 1320 if (NILP (printflag) && NILP (do_allow_print))
228d4b1c
JA
1321 tem = Qsymbolp;
1322 else
1323 tem = printflag;
13febd85
RS
1324
1325 if (NILP (filename))
1326 filename = XBUFFER (buf)->filename;
1327
228d4b1c
JA
1328 specbind (Qstandard_output, tem);
1329 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1330 BUF_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
976350af 1331 readevalloop (buf, 0, filename, Feval, !NILP (printflag), unibyte, Qnil);
cb09ab7a 1332 unbind_to (count, Qnil);
228d4b1c
JA
1333
1334 return Qnil;
1335}
1336
976350af 1337DEFUN ("eval-region", Feval_region, Seval_region, 2, 4, "r",
5de38842
PJ
1338 doc: /* Execute the region as Lisp code.
1339When called from programs, expects two arguments,
1340giving starting and ending indices in the current buffer
1341of the text to be executed.
1342Programs can pass third argument PRINTFLAG which controls output:
1343nil means discard it; anything else is stream for printing it.
1344Also the fourth argument READ-FUNCTION, if non-nil, is used
1345instead of `read' to read each expression. It gets one argument
1346which is the input stream for reading characters.
1347
1348This function does not move point. */)
1349 (start, end, printflag, read_function)
976350af 1350 Lisp_Object start, end, printflag, read_function;
078e7b4a
JB
1351{
1352 int count = specpdl_ptr - specpdl;
ae321d28
RS
1353 Lisp_Object tem, cbuf;
1354
1355 cbuf = Fcurrent_buffer ();
078e7b4a 1356
265a9e55 1357 if (NILP (printflag))
078e7b4a
JB
1358 tem = Qsymbolp;
1359 else
1360 tem = printflag;
1361 specbind (Qstandard_output, tem);
1362
265a9e55 1363 if (NILP (printflag))
078e7b4a
JB
1364 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1365 record_unwind_protect (save_restriction_restore, save_restriction_save ());
1366
9391b698
EN
1367 /* This both uses start and checks its type. */
1368 Fgoto_char (start);
1369 Fnarrow_to_region (make_number (BEGV), end);
94e554db 1370 readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval,
976350af 1371 !NILP (printflag), Qnil, read_function);
078e7b4a
JB
1372
1373 return unbind_to (count, Qnil);
1374}
1375
078e7b4a
JB
1376\f
1377DEFUN ("read", Fread, Sread, 0, 1, 0,
5de38842
PJ
1378 doc: /* Read one Lisp expression as text from STREAM, return as Lisp object.
1379If STREAM is nil, use the value of `standard-input' (which see).
1380STREAM or the value of `standard-input' may be:
1381 a buffer (read from point and advance it)
1382 a marker (read from where it points and advance it)
1383 a function (call it with no arguments for each character,
1384 call it with a char as argument to push a char back)
1385 a string (takes text from string, starting at the beginning)
1386 t (read text line using minibuffer and use it, or read from
1387 standard input in batch mode). */)
1388 (stream)
5be02dff 1389 Lisp_Object stream;
078e7b4a
JB
1390{
1391 extern Lisp_Object Fread_minibuffer ();
1392
5be02dff
KH
1393 if (NILP (stream))
1394 stream = Vstandard_input;
1395 if (EQ (stream, Qt))
1396 stream = Qread_char;
078e7b4a 1397
00a9a935 1398 readchar_backlog = -1;
17634846 1399 new_backquote_flag = 0;
4ad679f9 1400 read_objects = Qnil;
17634846 1401
5be02dff 1402 if (EQ (stream, Qread_char))
078e7b4a 1403 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil);
078e7b4a 1404
5be02dff
KH
1405 if (STRINGP (stream))
1406 return Fcar (Fread_from_string (stream, Qnil, Qnil));
078e7b4a 1407
5be02dff 1408 return read0 (stream);
078e7b4a
JB
1409}
1410
1411DEFUN ("read-from-string", Fread_from_string, Sread_from_string, 1, 3, 0,
5de38842
PJ
1412 doc: /* Read one Lisp expression which is represented as text by STRING.
1413Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).
1414START and END optionally delimit a substring of STRING from which to read;
1415 they default to 0 and (length STRING) respectively. */)
1416 (string, start, end)
078e7b4a
JB
1417 Lisp_Object string, start, end;
1418{
1419 int startval, endval;
1420 Lisp_Object tem;
1421
b7826503 1422 CHECK_STRING (string);
078e7b4a 1423
265a9e55 1424 if (NILP (end))
bed23cb2 1425 endval = XSTRING (string)->size;
078e7b4a 1426 else
e28552a4 1427 {
b7826503 1428 CHECK_NUMBER (end);
8028e0ed 1429 endval = XINT (end);
bed23cb2 1430 if (endval < 0 || endval > XSTRING (string)->size)
078e7b4a
JB
1431 args_out_of_range (string, end);
1432 }
1433
265a9e55 1434 if (NILP (start))
078e7b4a
JB
1435 startval = 0;
1436 else
e28552a4 1437 {
b7826503 1438 CHECK_NUMBER (start);
8028e0ed 1439 startval = XINT (start);
078e7b4a
JB
1440 if (startval < 0 || startval > endval)
1441 args_out_of_range (string, start);
1442 }
1443
1444 read_from_string_index = startval;
bed23cb2 1445 read_from_string_index_byte = string_char_to_byte (string, startval);
078e7b4a
JB
1446 read_from_string_limit = endval;
1447
17634846 1448 new_backquote_flag = 0;
4ad679f9 1449 read_objects = Qnil;
17634846 1450
078e7b4a 1451 tem = read0 (string);
bed23cb2 1452 return Fcons (tem, make_number (read_from_string_index));
078e7b4a
JB
1453}
1454\f
6428369f
KH
1455/* Use this for recursive reads, in contexts where internal tokens
1456 are not allowed. */
e28552a4 1457
078e7b4a
JB
1458static Lisp_Object
1459read0 (readcharfun)
1460 Lisp_Object readcharfun;
1461{
1462 register Lisp_Object val;
e28552a4 1463 int c;
078e7b4a 1464
17634846 1465 val = read1 (readcharfun, &c, 0);
6428369f 1466 if (c)
93d75e4c
RS
1467 Fsignal (Qinvalid_read_syntax, Fcons (Fmake_string (make_number (1),
1468 make_number (c)),
e28552a4 1469 Qnil));
078e7b4a
JB
1470
1471 return val;
1472}
1473\f
1474static int read_buffer_size;
1475static char *read_buffer;
1476
fe0e03f3
KH
1477/* Read multibyte form and return it as a character. C is a first
1478 byte of multibyte form, and rest of them are read from
1479 READCHARFUN. */
6f7f43d5 1480
fe0e03f3
KH
1481static int
1482read_multibyte (c, readcharfun)
1483 register int c;
1484 Lisp_Object readcharfun;
1485{
1486 /* We need the actual character code of this multibyte
1487 characters. */
449fea39 1488 unsigned char str[MAX_MULTIBYTE_LENGTH];
fe0e03f3 1489 int len = 0;
0d5e5843 1490 int bytes;
fe0e03f3
KH
1491
1492 str[len++] = c;
1493 while ((c = READCHAR) >= 0xA0
449fea39 1494 && len < MAX_MULTIBYTE_LENGTH)
fe0e03f3
KH
1495 str[len++] = c;
1496 UNREAD (c);
0d5e5843
KH
1497 if (UNIBYTE_STR_AS_MULTIBYTE_P (str, len, bytes))
1498 return STRING_CHAR (str, len);
1499 /* The byte sequence is not valid as multibyte. Unread all bytes
1500 but the first one, and return the first byte. */
1501 while (--len > 0)
1502 UNREAD (str[len]);
1503 return str[0];
fe0e03f3
KH
1504}
1505
f6f79b37
RS
1506/* Read a \-escape sequence, assuming we already read the `\'.
1507 If the escape sequence forces unibyte, store 1 into *BYTEREP.
1508 If the escape sequence forces multibyte, store 2 into *BYTEREP.
1509 Otherwise store 0 into *BYTEREP. */
6f7f43d5 1510
078e7b4a 1511static int
f6f79b37 1512read_escape (readcharfun, stringp, byterep)
078e7b4a 1513 Lisp_Object readcharfun;
e7fc914b 1514 int stringp;
f6f79b37 1515 int *byterep;
078e7b4a
JB
1516{
1517 register int c = READCHAR;
f6f79b37
RS
1518
1519 *byterep = 0;
1520
078e7b4a
JB
1521 switch (c)
1522 {
f3849f25 1523 case -1:
da3b886d 1524 end_of_file_error ();
f3849f25 1525
078e7b4a 1526 case 'a':
265a9e55 1527 return '\007';
078e7b4a
JB
1528 case 'b':
1529 return '\b';
f405a585
RS
1530 case 'd':
1531 return 0177;
078e7b4a
JB
1532 case 'e':
1533 return 033;
1534 case 'f':
1535 return '\f';
1536 case 'n':
1537 return '\n';
1538 case 'r':
1539 return '\r';
1540 case 't':
1541 return '\t';
1542 case 'v':
1543 return '\v';
1544 case '\n':
1545 return -1;
e28552a4 1546 case ' ':
e7fc914b
KH
1547 if (stringp)
1548 return -1;
1549 return ' ';
078e7b4a
JB
1550
1551 case 'M':
1552 c = READCHAR;
1553 if (c != '-')
1554 error ("Invalid escape character syntax");
1555 c = READCHAR;
1556 if (c == '\\')
f6f79b37 1557 c = read_escape (readcharfun, 0, byterep);
7bd279cd 1558 return c | meta_modifier;
f405a585
RS
1559
1560 case 'S':
1561 c = READCHAR;
1562 if (c != '-')
1563 error ("Invalid escape character syntax");
1564 c = READCHAR;
1565 if (c == '\\')
f6f79b37 1566 c = read_escape (readcharfun, 0, byterep);
7bd279cd
RS
1567 return c | shift_modifier;
1568
1569 case 'H':
1570 c = READCHAR;
1571 if (c != '-')
1572 error ("Invalid escape character syntax");
1573 c = READCHAR;
1574 if (c == '\\')
f6f79b37 1575 c = read_escape (readcharfun, 0, byterep);
7bd279cd
RS
1576 return c | hyper_modifier;
1577
1578 case 'A':
1579 c = READCHAR;
1580 if (c != '-')
1581 error ("Invalid escape character syntax");
1582 c = READCHAR;
1583 if (c == '\\')
f6f79b37 1584 c = read_escape (readcharfun, 0, byterep);
7bd279cd
RS
1585 return c | alt_modifier;
1586
1587 case 's':
1588 c = READCHAR;
1589 if (c != '-')
1590 error ("Invalid escape character syntax");
1591 c = READCHAR;
1592 if (c == '\\')
f6f79b37 1593 c = read_escape (readcharfun, 0, byterep);
7bd279cd 1594 return c | super_modifier;
078e7b4a
JB
1595
1596 case 'C':
1597 c = READCHAR;
1598 if (c != '-')
1599 error ("Invalid escape character syntax");
1600 case '^':
1601 c = READCHAR;
1602 if (c == '\\')
f6f79b37 1603 c = read_escape (readcharfun, 0, byterep);
164d590d
KH
1604 if ((c & ~CHAR_MODIFIER_MASK) == '?')
1605 return 0177 | (c & CHAR_MODIFIER_MASK);
1606 else if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
1607 return c | ctrl_modifier;
f405a585
RS
1608 /* ASCII control chars are made from letters (both cases),
1609 as well as the non-letters within 0100...0137. */
1610 else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
1611 return (c & (037 | ~0177));
1612 else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
1613 return (c & (037 | ~0177));
078e7b4a 1614 else
7bd279cd 1615 return c | ctrl_modifier;
078e7b4a
JB
1616
1617 case '0':
1618 case '1':
1619 case '2':
1620 case '3':
1621 case '4':
1622 case '5':
1623 case '6':
1624 case '7':
1625 /* An octal escape, as in ANSI C. */
1626 {
1627 register int i = c - '0';
1628 register int count = 0;
1629 while (++count < 3)
1630 {
1631 if ((c = READCHAR) >= '0' && c <= '7')
1632 {
1633 i *= 8;
1634 i += c - '0';
1635 }
1636 else
1637 {
1638 UNREAD (c);
1639 break;
1640 }
1641 }
f6f79b37
RS
1642
1643 *byterep = 1;
078e7b4a
JB
1644 return i;
1645 }
1646
1647 case 'x':
1648 /* A hex escape, as in ANSI C. */
1649 {
1650 int i = 0;
1651 while (1)
1652 {
1653 c = READCHAR;
1654 if (c >= '0' && c <= '9')
1655 {
1656 i *= 16;
1657 i += c - '0';
1658 }
1659 else if ((c >= 'a' && c <= 'f')
1660 || (c >= 'A' && c <= 'F'))
1661 {
1662 i *= 16;
1663 if (c >= 'a' && c <= 'f')
1664 i += c - 'a' + 10;
1665 else
1666 i += c - 'A' + 10;
1667 }
1668 else
1669 {
1670 UNREAD (c);
1671 break;
1672 }
1673 }
f6f79b37
RS
1674
1675 *byterep = 2;
078e7b4a
JB
1676 return i;
1677 }
1678
1679 default:
fe0e03f3
KH
1680 if (BASE_LEADING_CODE_P (c))
1681 c = read_multibyte (c, readcharfun);
078e7b4a
JB
1682 return c;
1683 }
1684}
1685
bf5d1a17
GM
1686
1687/* Read an integer in radix RADIX using READCHARFUN to read
1688 characters. RADIX must be in the interval [2..36]; if it isn't, a
1689 read error is signaled . Value is the integer read. Signals an
1690 error if encountering invalid read syntax or if RADIX is out of
1691 range. */
1692
1693static Lisp_Object
1694read_integer (readcharfun, radix)
1695 Lisp_Object readcharfun;
1696 int radix;
1697{
5e37dc22
GM
1698 int ndigits = 0, invalid_p, c, sign = 0;
1699 EMACS_INT number = 0;
bf5d1a17
GM
1700
1701 if (radix < 2 || radix > 36)
1702 invalid_p = 1;
1703 else
1704 {
1705 number = ndigits = invalid_p = 0;
1706 sign = 1;
1707
1708 c = READCHAR;
1709 if (c == '-')
1710 {
1711 c = READCHAR;
1712 sign = -1;
1713 }
1714 else if (c == '+')
1715 c = READCHAR;
1716
1717 while (c >= 0)
1718 {
1719 int digit;
1720
1721 if (c >= '0' && c <= '9')
1722 digit = c - '0';
1723 else if (c >= 'a' && c <= 'z')
1724 digit = c - 'a' + 10;
1725 else if (c >= 'A' && c <= 'Z')
1726 digit = c - 'A' + 10;
1727 else
b632fa48
GM
1728 {
1729 UNREAD (c);
1730 break;
1731 }
bf5d1a17
GM
1732
1733 if (digit < 0 || digit >= radix)
1734 invalid_p = 1;
1735
1736 number = radix * number + digit;
1737 ++ndigits;
1738 c = READCHAR;
1739 }
1740 }
1741
1742 if (ndigits == 0 || invalid_p)
1743 {
1744 char buf[50];
1745 sprintf (buf, "integer, radix %d", radix);
1746 Fsignal (Qinvalid_read_syntax, Fcons (build_string (buf), Qnil));
1747 }
1748
1749 return make_number (sign * number);
1750}
1751
1752
a742d646
GM
1753/* Convert unibyte text in read_buffer to multibyte.
1754
1755 Initially, *P is a pointer after the end of the unibyte text, and
1756 the pointer *END points after the end of read_buffer.
1757
1758 If read_buffer doesn't have enough room to hold the result
1759 of the conversion, reallocate it and adjust *P and *END.
1760
1761 At the end, make *P point after the result of the conversion, and
1762 return in *NCHARS the number of characters in the converted
1763 text. */
1764
1765static void
1766to_multibyte (p, end, nchars)
1767 char **p, **end;
1768 int *nchars;
1769{
1770 int nbytes;
1771
1772 parse_str_as_multibyte (read_buffer, *p - read_buffer, &nbytes, nchars);
b4a3be43 1773 if (read_buffer_size < 2 * nbytes)
a742d646
GM
1774 {
1775 int offset = *p - read_buffer;
fe957e65 1776 read_buffer_size = 2 * max (read_buffer_size, nbytes);
a742d646
GM
1777 read_buffer = (char *) xrealloc (read_buffer, read_buffer_size);
1778 *p = read_buffer + offset;
1779 *end = read_buffer + read_buffer_size;
1780 }
1781
1782 if (nbytes != *nchars)
1783 nbytes = str_as_multibyte (read_buffer, read_buffer_size,
1784 *p - read_buffer, nchars);
1785
1786 *p = read_buffer + nbytes;
1787}
1788
1789
6428369f
KH
1790/* If the next token is ')' or ']' or '.', we store that character
1791 in *PCH and the return value is not interesting. Else, we store
17634846
RS
1792 zero in *PCH and we read and return one lisp object.
1793
1794 FIRST_IN_LIST is nonzero if this is the first element of a list. */
1795
078e7b4a 1796static Lisp_Object
17634846 1797read1 (readcharfun, pch, first_in_list)
078e7b4a 1798 register Lisp_Object readcharfun;
e28552a4 1799 int *pch;
17634846 1800 int first_in_list;
078e7b4a
JB
1801{
1802 register int c;
4ad679f9
EN
1803 int uninterned_symbol = 0;
1804
6428369f 1805 *pch = 0;
078e7b4a
JB
1806
1807 retry:
1808
1809 c = READCHAR;
9c97398c
GM
1810 if (c < 0)
1811 end_of_file_error ();
078e7b4a
JB
1812
1813 switch (c)
1814 {
1815 case '(':
1816 return read_list (0, readcharfun);
1817
1818 case '[':
c15cfd1f 1819 return read_vector (readcharfun, 0);
078e7b4a
JB
1820
1821 case ')':
1822 case ']':
078e7b4a 1823 {
6428369f
KH
1824 *pch = c;
1825 return Qnil;
078e7b4a
JB
1826 }
1827
1828 case '#':
200f684e 1829 c = READCHAR;
c2390933
RS
1830 if (c == '^')
1831 {
1832 c = READCHAR;
1833 if (c == '[')
1834 {
1835 Lisp_Object tmp;
c15cfd1f 1836 tmp = read_vector (readcharfun, 0);
c2390933
RS
1837 if (XVECTOR (tmp)->size < CHAR_TABLE_STANDARD_SLOTS
1838 || XVECTOR (tmp)->size > CHAR_TABLE_STANDARD_SLOTS + 10)
1839 error ("Invalid size char-table");
1840 XSETCHAR_TABLE (tmp, XCHAR_TABLE (tmp));
3701b5de 1841 XCHAR_TABLE (tmp)->top = Qt;
c2390933
RS
1842 return tmp;
1843 }
3701b5de
KH
1844 else if (c == '^')
1845 {
1846 c = READCHAR;
1847 if (c == '[')
1848 {
1849 Lisp_Object tmp;
c15cfd1f 1850 tmp = read_vector (readcharfun, 0);
3701b5de
KH
1851 if (XVECTOR (tmp)->size != SUB_CHAR_TABLE_STANDARD_SLOTS)
1852 error ("Invalid size char-table");
1853 XSETCHAR_TABLE (tmp, XCHAR_TABLE (tmp));
1854 XCHAR_TABLE (tmp)->top = Qnil;
1855 return tmp;
1856 }
1857 Fsignal (Qinvalid_read_syntax,
1858 Fcons (make_string ("#^^", 3), Qnil));
1859 }
c2390933
RS
1860 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#^", 2), Qnil));
1861 }
1862 if (c == '&')
1863 {
1864 Lisp_Object length;
1865 length = read1 (readcharfun, pch, first_in_list);
1866 c = READCHAR;
1867 if (c == '"')
1868 {
1869 Lisp_Object tmp, val;
90ed3ec5 1870 int size_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1)
68be917d 1871 / BITS_PER_CHAR);
c2390933
RS
1872
1873 UNREAD (c);
1874 tmp = read1 (readcharfun, pch, first_in_list);
90ed3ec5
RS
1875 if (size_in_chars != XSTRING (tmp)->size
1876 /* We used to print 1 char too many
1877 when the number of bits was a multiple of 8.
1878 Accept such input in case it came from an old version. */
1879 && ! (XFASTINT (length)
1880 == (XSTRING (tmp)->size - 1) * BITS_PER_CHAR))
c2390933 1881 Fsignal (Qinvalid_read_syntax,
ec3bbd7d 1882 Fcons (make_string ("#&...", 5), Qnil));
c2390933
RS
1883
1884 val = Fmake_bool_vector (length, Qnil);
1885 bcopy (XSTRING (tmp)->data, XBOOL_VECTOR (val)->data,
1886 size_in_chars);
67d3b149
EZ
1887 /* Clear the extraneous bits in the last byte. */
1888 if (XINT (length) != size_in_chars * BITS_PER_CHAR)
1889 XBOOL_VECTOR (val)->data[size_in_chars - 1]
1890 &= (1 << (XINT (length) % BITS_PER_CHAR)) - 1;
c2390933
RS
1891 return val;
1892 }
ec3bbd7d 1893 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#&...", 5),
039dc30b 1894 Qnil));
c2390933 1895 }
200f684e
RS
1896 if (c == '[')
1897 {
1898 /* Accept compiled functions at read-time so that we don't have to
1899 build them using function calls. */
748ef62f 1900 Lisp_Object tmp;
c15cfd1f 1901 tmp = read_vector (readcharfun, 1);
748ef62f
RS
1902 return Fmake_byte_code (XVECTOR (tmp)->size,
1903 XVECTOR (tmp)->contents);
200f684e 1904 }
748ef62f
RS
1905 if (c == '(')
1906 {
1907 Lisp_Object tmp;
1908 struct gcpro gcpro1;
e28552a4 1909 int ch;
748ef62f
RS
1910
1911 /* Read the string itself. */
17634846 1912 tmp = read1 (readcharfun, &ch, 0);
6428369f 1913 if (ch != 0 || !STRINGP (tmp))
748ef62f
RS
1914 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
1915 GCPRO1 (tmp);
1916 /* Read the intervals and their properties. */
1917 while (1)
1918 {
1919 Lisp_Object beg, end, plist;
1920
17634846 1921 beg = read1 (readcharfun, &ch, 0);
7ee3bd7b 1922 end = plist = Qnil;
6428369f
KH
1923 if (ch == ')')
1924 break;
1925 if (ch == 0)
17634846 1926 end = read1 (readcharfun, &ch, 0);
6428369f 1927 if (ch == 0)
17634846 1928 plist = read1 (readcharfun, &ch, 0);
6428369f 1929 if (ch)
748ef62f 1930 Fsignal (Qinvalid_read_syntax,
6428369f
KH
1931 Fcons (build_string ("invalid string property list"),
1932 Qnil));
748ef62f
RS
1933 Fset_text_properties (beg, end, plist, tmp);
1934 }
1935 UNGCPRO;
1936 return tmp;
1937 }
339ee979 1938
20ea2964
RS
1939 /* #@NUMBER is used to skip NUMBER following characters.
1940 That's used in .elc files to skip over doc strings
1941 and function definitions. */
1942 if (c == '@')
1943 {
1944 int i, nskip = 0;
1945
1946 /* Read a decimal integer. */
1947 while ((c = READCHAR) >= 0
1948 && c >= '0' && c <= '9')
1949 {
1950 nskip *= 10;
1951 nskip += c - '0';
1952 }
1953 if (c >= 0)
1954 UNREAD (c);
1955
b2a30870
RS
1956 if (load_force_doc_strings && EQ (readcharfun, Qget_file_char))
1957 {
1958 /* If we are supposed to force doc strings into core right now,
1959 record the last string that we skipped,
1960 and record where in the file it comes from. */
c15cfd1f
RS
1961
1962 /* But first exchange saved_doc_string
1963 with prev_saved_doc_string, so we save two strings. */
1964 {
1965 char *temp = saved_doc_string;
1966 int temp_size = saved_doc_string_size;
68c45bf0 1967 file_offset temp_pos = saved_doc_string_position;
c15cfd1f
RS
1968 int temp_len = saved_doc_string_length;
1969
1970 saved_doc_string = prev_saved_doc_string;
1971 saved_doc_string_size = prev_saved_doc_string_size;
1972 saved_doc_string_position = prev_saved_doc_string_position;
1973 saved_doc_string_length = prev_saved_doc_string_length;
1974
1975 prev_saved_doc_string = temp;
1976 prev_saved_doc_string_size = temp_size;
1977 prev_saved_doc_string_position = temp_pos;
1978 prev_saved_doc_string_length = temp_len;
1979 }
1980
b2a30870
RS
1981 if (saved_doc_string_size == 0)
1982 {
1983 saved_doc_string_size = nskip + 100;
11938f10 1984 saved_doc_string = (char *) xmalloc (saved_doc_string_size);
b2a30870
RS
1985 }
1986 if (nskip > saved_doc_string_size)
1987 {
1988 saved_doc_string_size = nskip + 100;
11938f10
KH
1989 saved_doc_string = (char *) xrealloc (saved_doc_string,
1990 saved_doc_string_size);
b2a30870
RS
1991 }
1992
68c45bf0 1993 saved_doc_string_position = file_tell (instream);
b2a30870
RS
1994
1995 /* Copy that many characters into saved_doc_string. */
1996 for (i = 0; i < nskip && c >= 0; i++)
1997 saved_doc_string[i] = c = READCHAR;
1998
1999 saved_doc_string_length = i;
2000 }
2001 else
b2a30870
RS
2002 {
2003 /* Skip that many characters. */
2004 for (i = 0; i < nskip && c >= 0; i++)
2005 c = READCHAR;
2006 }
d49f0c1a 2007
20ea2964
RS
2008 goto retry;
2009 }
2010 if (c == '$')
2011 return Vload_file_name;
2b6cae0c
RS
2012 if (c == '\'')
2013 return Fcons (Qfunction, Fcons (read0 (readcharfun), Qnil));
4ad679f9
EN
2014 /* #:foo is the uninterned symbol named foo. */
2015 if (c == ':')
2016 {
2017 uninterned_symbol = 1;
2018 c = READCHAR;
2019 goto default_label;
2020 }
2021 /* Reader forms that can reuse previously read objects. */
2022 if (c >= '0' && c <= '9')
2023 {
2024 int n = 0;
2025 Lisp_Object tem;
2b6cae0c 2026
4ad679f9
EN
2027 /* Read a non-negative integer. */
2028 while (c >= '0' && c <= '9')
2029 {
2030 n *= 10;
2031 n += c - '0';
2032 c = READCHAR;
2033 }
2034 /* #n=object returns object, but associates it with n for #n#. */
2035 if (c == '=')
2036 {
9e062b6c
RS
2037 /* Make a placeholder for #n# to use temporarily */
2038 Lisp_Object placeholder;
2039 Lisp_Object cell;
2040
2041 placeholder = Fcons(Qnil, Qnil);
2042 cell = Fcons (make_number (n), placeholder);
2043 read_objects = Fcons (cell, read_objects);
2044
2045 /* Read the object itself. */
4ad679f9 2046 tem = read0 (readcharfun);
9e062b6c
RS
2047
2048 /* Now put it everywhere the placeholder was... */
2049 substitute_object_in_subtree (tem, placeholder);
2050
2051 /* ...and #n# will use the real value from now on. */
2052 Fsetcdr (cell, tem);
2053
4ad679f9
EN
2054 return tem;
2055 }
2056 /* #n# returns a previously read object. */
2057 if (c == '#')
2058 {
2059 tem = Fassq (make_number (n), read_objects);
2060 if (CONSP (tem))
2061 return XCDR (tem);
2062 /* Fall through to error message. */
2063 }
bf5d1a17
GM
2064 else if (c == 'r' || c == 'R')
2065 return read_integer (readcharfun, n);
2066
4ad679f9
EN
2067 /* Fall through to error message. */
2068 }
bf5d1a17
GM
2069 else if (c == 'x' || c == 'X')
2070 return read_integer (readcharfun, 16);
2071 else if (c == 'o' || c == 'O')
2072 return read_integer (readcharfun, 8);
2073 else if (c == 'b' || c == 'B')
2074 return read_integer (readcharfun, 2);
20ea2964 2075
200f684e 2076 UNREAD (c);
748ef62f 2077 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
078e7b4a
JB
2078
2079 case ';':
2080 while ((c = READCHAR) >= 0 && c != '\n');
2081 goto retry;
2082
2083 case '\'':
2084 {
2085 return Fcons (Qquote, Fcons (read0 (readcharfun), Qnil));
2086 }
2087
17634846
RS
2088 case '`':
2089 if (first_in_list)
2090 goto default_label;
2091 else
2092 {
2093 Lisp_Object value;
2094
0ffbbdeb 2095 new_backquote_flag++;
17634846 2096 value = read0 (readcharfun);
0ffbbdeb 2097 new_backquote_flag--;
17634846
RS
2098
2099 return Fcons (Qbackquote, Fcons (value, Qnil));
2100 }
2101
2102 case ',':
2103 if (new_backquote_flag)
2104 {
2105 Lisp_Object comma_type = Qnil;
2106 Lisp_Object value;
2107 int ch = READCHAR;
2108
2109 if (ch == '@')
2110 comma_type = Qcomma_at;
2111 else if (ch == '.')
2112 comma_type = Qcomma_dot;
2113 else
2114 {
2115 if (ch >= 0) UNREAD (ch);
2116 comma_type = Qcomma;
2117 }
2118
0ffbbdeb 2119 new_backquote_flag--;
17634846 2120 value = read0 (readcharfun);
0ffbbdeb 2121 new_backquote_flag++;
17634846
RS
2122 return Fcons (comma_type, Fcons (value, Qnil));
2123 }
2124 else
2125 goto default_label;
2126
078e7b4a
JB
2127 case '?':
2128 {
f6f79b37
RS
2129 int discard;
2130
078e7b4a 2131 c = READCHAR;
9c97398c
GM
2132 if (c < 0)
2133 end_of_file_error ();
078e7b4a
JB
2134
2135 if (c == '\\')
f6f79b37 2136 c = read_escape (readcharfun, 0, &discard);
fe0e03f3
KH
2137 else if (BASE_LEADING_CODE_P (c))
2138 c = read_multibyte (c, readcharfun);
078e7b4a 2139
6f7f43d5 2140 return make_number (c);
078e7b4a
JB
2141 }
2142
00a9a935 2143 case '"':
078e7b4a 2144 {
a742d646
GM
2145 char *p = read_buffer;
2146 char *end = read_buffer + read_buffer_size;
078e7b4a 2147 register int c;
5150eeec
RS
2148 /* 1 if we saw an escape sequence specifying
2149 a multibyte character, or a multibyte character. */
e7fc914b 2150 int force_multibyte = 0;
5150eeec 2151 /* 1 if we saw an escape sequence specifying
e7fc914b
KH
2152 a single-byte character. */
2153 int force_singlebyte = 0;
5150eeec
RS
2154 /* 1 if read_buffer contains multibyte text now. */
2155 int is_multibyte = 0;
078e7b4a 2156 int cancel = 0;
5150eeec 2157 int nchars = 0;
078e7b4a
JB
2158
2159 while ((c = READCHAR) >= 0
2160 && c != '\"')
2161 {
449fea39 2162 if (end - p < MAX_MULTIBYTE_LENGTH)
078e7b4a 2163 {
5d65df0d
GM
2164 int offset = p - read_buffer;
2165 read_buffer = (char *) xrealloc (read_buffer,
2166 read_buffer_size *= 2);
2167 p = read_buffer + offset;
078e7b4a
JB
2168 end = read_buffer + read_buffer_size;
2169 }
bed23cb2 2170
078e7b4a 2171 if (c == '\\')
03e88613 2172 {
f6f79b37
RS
2173 int byterep;
2174
2175 c = read_escape (readcharfun, 1, &byterep);
bed23cb2
RS
2176
2177 /* C is -1 if \ newline has just been seen */
2178 if (c == -1)
03e88613 2179 {
bed23cb2
RS
2180 if (p == read_buffer)
2181 cancel = 1;
03e88613
RS
2182 continue;
2183 }
bed23cb2 2184
f6f79b37 2185 if (byterep == 1)
e7fc914b 2186 force_singlebyte = 1;
f6f79b37
RS
2187 else if (byterep == 2)
2188 force_multibyte = 1;
03e88613 2189 }
6f7f43d5 2190
5150eeec
RS
2191 /* A character that must be multibyte forces multibyte. */
2192 if (! SINGLE_BYTE_CHAR_P (c & ~CHAR_MODIFIER_MASK))
2193 force_multibyte = 1;
2194
2195 /* If we just discovered the need to be multibyte,
2196 convert the text accumulated thus far. */
2197 if (force_multibyte && ! is_multibyte)
078e7b4a 2198 {
5150eeec
RS
2199 is_multibyte = 1;
2200 to_multibyte (&p, &end, &nchars);
078e7b4a 2201 }
988c2f83 2202
5150eeec
RS
2203 /* Allow `\C- ' and `\C-?'. */
2204 if (c == (CHAR_CTL | ' '))
2205 c = 0;
2206 else if (c == (CHAR_CTL | '?'))
2207 c = 127;
164d590d 2208
5150eeec
RS
2209 if (c & CHAR_SHIFT)
2210 {
2211 /* Shift modifier is valid only with [A-Za-z]. */
2212 if ((c & 0377) >= 'A' && (c & 0377) <= 'Z')
2213 c &= ~CHAR_SHIFT;
2214 else if ((c & 0377) >= 'a' && (c & 0377) <= 'z')
2215 c = (c & ~CHAR_SHIFT) - ('a' - 'A');
f943104a 2216 }
5150eeec
RS
2217
2218 if (c & CHAR_META)
2219 /* Move the meta bit to the right place for a string. */
2220 c = (c & ~CHAR_META) | 0x80;
2221 if (c & CHAR_MODIFIER_MASK)
2222 error ("Invalid modifier in string");
2223
2224 if (is_multibyte)
2225 p += CHAR_STRING (c, p);
2226 else
2227 *p++ = c;
2228
2229 nchars++;
078e7b4a 2230 }
5150eeec 2231
6f7f43d5 2232 if (c < 0)
9c97398c 2233 end_of_file_error ();
078e7b4a
JB
2234
2235 /* If purifying, and string starts with \ newline,
2236 return zero instead. This is for doc strings
08564963 2237 that we are really going to find in etc/DOC.nn.nn */
265a9e55 2238 if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
078e7b4a
JB
2239 return make_number (0);
2240
5150eeec
RS
2241 if (is_multibyte || force_singlebyte)
2242 ;
94e554db
RS
2243 else if (load_convert_to_unibyte)
2244 {
2245 Lisp_Object string;
a742d646 2246 to_multibyte (&p, &end, &nchars);
94e554db
RS
2247 if (p - read_buffer != nchars)
2248 {
2249 string = make_multibyte_string (read_buffer, nchars,
2250 p - read_buffer);
2251 return Fstring_make_unibyte (string);
2252 }
5150eeec
RS
2253 /* We can make a unibyte string directly. */
2254 is_multibyte = 0;
94e554db 2255 }
8db9dc66
RS
2256 else if (EQ (readcharfun, Qget_file_char)
2257 || EQ (readcharfun, Qlambda))
a742d646
GM
2258 {
2259 /* Nowadays, reading directly from a file is used only for
2260 compiled Emacs Lisp files, and those always use the
2261 Emacs internal encoding. Meanwhile, Qlambda is used
2262 for reading dynamic byte code (compiled with
81a268b4
RS
2263 byte-compile-dynamic = t). So make the string multibyte
2264 if the string contains any multibyte sequences.
2265 (to_multibyte is a no-op if not.) */
a742d646 2266 to_multibyte (&p, &end, &nchars);
81a268b4 2267 is_multibyte = (p - read_buffer) != nchars;
a742d646 2268 }
e28552a4 2269 else
bed23cb2
RS
2270 /* In all other cases, if we read these bytes as
2271 separate characters, treat them as separate characters now. */
5150eeec 2272 ;
e7fc914b
KH
2273
2274 if (read_pure)
491f16a2 2275 return make_pure_string (read_buffer, nchars, p - read_buffer,
5150eeec 2276 is_multibyte);
491f16a2 2277 return make_specified_string (read_buffer, nchars, p - read_buffer,
5150eeec 2278 is_multibyte);
078e7b4a
JB
2279 }
2280
109d300c
JB
2281 case '.':
2282 {
109d300c
JB
2283 int next_char = READCHAR;
2284 UNREAD (next_char);
2285
035eec48
GM
2286 if (next_char <= 040
2287 || index ("\"'`,(", next_char))
109d300c 2288 {
6428369f
KH
2289 *pch = c;
2290 return Qnil;
109d300c
JB
2291 }
2292
2293 /* Otherwise, we fall through! Note that the atom-reading loop
2294 below will now loop at least once, assuring that we will not
2295 try to UNREAD two characters in a row. */
2296 }
078e7b4a 2297 default:
17634846 2298 default_label:
078e7b4a
JB
2299 if (c <= 040) goto retry;
2300 {
38404229 2301 char *p = read_buffer;
481c6336 2302 int quoted = 0;
078e7b4a
JB
2303
2304 {
38404229 2305 char *end = read_buffer + read_buffer_size;
078e7b4a 2306
6f7f43d5 2307 while (c > 040
38404229 2308 && !(c == '\"' || c == '\'' || c == ';'
6f7f43d5 2309 || c == '(' || c == ')'
38404229 2310 || c == '[' || c == ']' || c == '#'))
078e7b4a 2311 {
449fea39 2312 if (end - p < MAX_MULTIBYTE_LENGTH)
078e7b4a 2313 {
5d65df0d
GM
2314 int offset = p - read_buffer;
2315 read_buffer = (char *) xrealloc (read_buffer,
2316 read_buffer_size *= 2);
2317 p = read_buffer + offset;
078e7b4a
JB
2318 end = read_buffer + read_buffer_size;
2319 }
38404229 2320
078e7b4a 2321 if (c == '\\')
481c6336
RS
2322 {
2323 c = READCHAR;
4ab11c09
GM
2324 if (c == -1)
2325 end_of_file_error ();
481c6336
RS
2326 quoted = 1;
2327 }
6f7f43d5 2328
bed23cb2 2329 if (! SINGLE_BYTE_CHAR_P (c))
449fea39 2330 p += CHAR_STRING (c, p);
bed23cb2
RS
2331 else
2332 *p++ = c;
6f7f43d5 2333
078e7b4a
JB
2334 c = READCHAR;
2335 }
2336
2337 if (p == end)
2338 {
5d65df0d
GM
2339 int offset = p - read_buffer;
2340 read_buffer = (char *) xrealloc (read_buffer,
2341 read_buffer_size *= 2);
2342 p = read_buffer + offset;
2343 end = read_buffer + read_buffer_size;
078e7b4a
JB
2344 }
2345 *p = 0;
2346 if (c >= 0)
2347 UNREAD (c);
2348 }
2349
4ad679f9 2350 if (!quoted && !uninterned_symbol)
481c6336
RS
2351 {
2352 register char *p1;
2353 register Lisp_Object val;
2354 p1 = read_buffer;
2355 if (*p1 == '+' || *p1 == '-') p1++;
2356 /* Is it an integer? */
2357 if (p1 != p)
2358 {
2359 while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
481c6336
RS
2360 /* Integers can have trailing decimal points. */
2361 if (p1 > read_buffer && p1 < p && *p1 == '.') p1++;
481c6336
RS
2362 if (p1 == p)
2363 /* It is an integer. */
2364 {
481c6336
RS
2365 if (p1[-1] == '.')
2366 p1[-1] = '\0';
faca07fb
RS
2367 if (sizeof (int) == sizeof (EMACS_INT))
2368 XSETINT (val, atoi (read_buffer));
2369 else if (sizeof (long) == sizeof (EMACS_INT))
2370 XSETINT (val, atol (read_buffer));
2371 else
2372 abort ();
481c6336
RS
2373 return val;
2374 }
2375 }
481c6336 2376 if (isfloat_string (read_buffer))
eb659c41 2377 {
a8972052
PE
2378 /* Compute NaN and infinities using 0.0 in a variable,
2379 to cope with compilers that think they are smarter
5e24a1f7 2380 than we are. */
3c329963 2381 double zero = 0.0;
a8972052
PE
2382
2383 double value;
2384
2385 /* Negate the value ourselves. This treats 0, NaNs,
2386 and infinity properly on IEEE floating point hosts,
2387 and works around a common bug where atof ("-0.0")
2388 drops the sign. */
2389 int negative = read_buffer[0] == '-';
2390
2391 /* The only way p[-1] can be 'F' or 'N', after isfloat_string
eb659c41 2392 returns 1, is if the input ends in e+INF or e+NaN. */
a8972052 2393 switch (p[-1])
eb659c41 2394 {
a8972052
PE
2395 case 'F':
2396 value = 1.0 / zero;
2397 break;
2398 case 'N':
2399 value = zero / zero;
2400 break;
2401 default:
2402 value = atof (read_buffer + negative);
2403 break;
eb659c41 2404 }
a8972052
PE
2405
2406 return make_float (negative ? - value : value);
eb659c41 2407 }
481c6336 2408 }
078e7b4a 2409
4ad679f9
EN
2410 if (uninterned_symbol)
2411 return make_symbol (read_buffer);
2412 else
2413 return intern (read_buffer);
078e7b4a
JB
2414 }
2415 }
2416}
2417\f
9e062b6c
RS
2418
2419/* List of nodes we've seen during substitute_object_in_subtree. */
2420static Lisp_Object seen_list;
2421
2422static void
2423substitute_object_in_subtree (object, placeholder)
2424 Lisp_Object object;
2425 Lisp_Object placeholder;
2426{
2427 Lisp_Object check_object;
2428
2429 /* We haven't seen any objects when we start. */
2430 seen_list = Qnil;
2431
2432 /* Make all the substitutions. */
2433 check_object
2434 = substitute_object_recurse (object, placeholder, object);
2435
2436 /* Clear seen_list because we're done with it. */
2437 seen_list = Qnil;
2438
2439 /* The returned object here is expected to always eq the
2440 original. */
2441 if (!EQ (check_object, object))
2442 error ("Unexpected mutation error in reader");
2443}
2444
2445/* Feval doesn't get called from here, so no gc protection is needed. */
2446#define SUBSTITUTE(get_val, set_val) \
2447{ \
2448 Lisp_Object old_value = get_val; \
2449 Lisp_Object true_value \
2450 = substitute_object_recurse (object, placeholder,\
2451 old_value); \
2452 \
2453 if (!EQ (old_value, true_value)) \
2454 { \
2455 set_val; \
2456 } \
2457}
2458
2459static Lisp_Object
2460substitute_object_recurse (object, placeholder, subtree)
2461 Lisp_Object object;
2462 Lisp_Object placeholder;
2463 Lisp_Object subtree;
2464{
2465 /* If we find the placeholder, return the target object. */
2466 if (EQ (placeholder, subtree))
2467 return object;
2468
2469 /* If we've been to this node before, don't explore it again. */
2470 if (!EQ (Qnil, Fmemq (subtree, seen_list)))
2471 return subtree;
2472
2473 /* If this node can be the entry point to a cycle, remember that
2474 we've seen it. It can only be such an entry point if it was made
2475 by #n=, which means that we can find it as a value in
2476 read_objects. */
2477 if (!EQ (Qnil, Frassq (subtree, read_objects)))
2478 seen_list = Fcons (subtree, seen_list);
2479
2480 /* Recurse according to subtree's type.
2481 Every branch must return a Lisp_Object. */
2482 switch (XTYPE (subtree))
2483 {
2484 case Lisp_Vectorlike:
2485 {
2486 int i;
7c752c80 2487 int length = XINT (Flength(subtree));
9e062b6c
RS
2488 for (i = 0; i < length; i++)
2489 {
2490 Lisp_Object idx = make_number (i);
2491 SUBSTITUTE (Faref (subtree, idx),
2492 Faset (subtree, idx, true_value));
2493 }
2494 return subtree;
2495 }
2496
2497 case Lisp_Cons:
2498 {
2499 SUBSTITUTE (Fcar_safe (subtree),
e61b9b87 2500 Fsetcar (subtree, true_value));
9e062b6c 2501 SUBSTITUTE (Fcdr_safe (subtree),
e61b9b87 2502 Fsetcdr (subtree, true_value));
9e062b6c
RS
2503 return subtree;
2504 }
2505
9e062b6c
RS
2506 case Lisp_String:
2507 {
2508 /* Check for text properties in each interval.
e61b9b87 2509 substitute_in_interval contains part of the logic. */
9e062b6c
RS
2510
2511 INTERVAL root_interval = XSTRING (subtree)->intervals;
2512 Lisp_Object arg = Fcons (object, placeholder);
2513
0d74b006
SM
2514 traverse_intervals_noorder (root_interval,
2515 &substitute_in_interval, arg);
9e062b6c
RS
2516
2517 return subtree;
2518 }
9e062b6c
RS
2519
2520 /* Other types don't recurse any further. */
2521 default:
2522 return subtree;
2523 }
2524}
2525
2526/* Helper function for substitute_object_recurse. */
2527static void
2528substitute_in_interval (interval, arg)
2529 INTERVAL interval;
2530 Lisp_Object arg;
2531{
2532 Lisp_Object object = Fcar (arg);
2533 Lisp_Object placeholder = Fcdr (arg);
2534
2535 SUBSTITUTE(interval->plist, interval->plist = true_value);
2536}
2537
2538\f
078e7b4a
JB
2539#define LEAD_INT 1
2540#define DOT_CHAR 2
2541#define TRAIL_INT 4
2542#define E_CHAR 8
2543#define EXP_INT 16
2544
2545int
2546isfloat_string (cp)
2547 register char *cp;
2548{
c1a2f60a 2549 register int state;
078e7b4a 2550
d8578e58
RS
2551 char *start = cp;
2552
078e7b4a
JB
2553 state = 0;
2554 if (*cp == '+' || *cp == '-')
2555 cp++;
2556
075027b1 2557 if (*cp >= '0' && *cp <= '9')
078e7b4a
JB
2558 {
2559 state |= LEAD_INT;
075027b1
RS
2560 while (*cp >= '0' && *cp <= '9')
2561 cp++;
078e7b4a
JB
2562 }
2563 if (*cp == '.')
2564 {
2565 state |= DOT_CHAR;
2566 cp++;
2567 }
075027b1 2568 if (*cp >= '0' && *cp <= '9')
078e7b4a
JB
2569 {
2570 state |= TRAIL_INT;
075027b1 2571 while (*cp >= '0' && *cp <= '9')
078e7b4a
JB
2572 cp++;
2573 }
a35f88bf 2574 if (*cp == 'e' || *cp == 'E')
078e7b4a
JB
2575 {
2576 state |= E_CHAR;
2577 cp++;
e73997a1
RS
2578 if (*cp == '+' || *cp == '-')
2579 cp++;
078e7b4a 2580 }
078e7b4a 2581
075027b1 2582 if (*cp >= '0' && *cp <= '9')
078e7b4a
JB
2583 {
2584 state |= EXP_INT;
075027b1 2585 while (*cp >= '0' && *cp <= '9')
078e7b4a
JB
2586 cp++;
2587 }
d8578e58
RS
2588 else if (cp == start)
2589 ;
eb659c41
RS
2590 else if (cp[-1] == '+' && cp[0] == 'I' && cp[1] == 'N' && cp[2] == 'F')
2591 {
2592 state |= EXP_INT;
2593 cp += 3;
2594 }
2595 else if (cp[-1] == '+' && cp[0] == 'N' && cp[1] == 'a' && cp[2] == 'N')
2596 {
2597 state |= EXP_INT;
2598 cp += 3;
2599 }
2600
37579d7c 2601 return (((*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f'))
078e7b4a 2602 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
151bdc83 2603 || state == (DOT_CHAR|TRAIL_INT)
078e7b4a 2604 || state == (LEAD_INT|E_CHAR|EXP_INT)
151bdc83
JB
2605 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)
2606 || state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
078e7b4a 2607}
cc94f3b2 2608
078e7b4a
JB
2609\f
2610static Lisp_Object
c15cfd1f 2611read_vector (readcharfun, bytecodeflag)
078e7b4a 2612 Lisp_Object readcharfun;
c15cfd1f 2613 int bytecodeflag;
078e7b4a
JB
2614{
2615 register int i;
2616 register int size;
2617 register Lisp_Object *ptr;
c15cfd1f 2618 register Lisp_Object tem, item, vector;
078e7b4a
JB
2619 register struct Lisp_Cons *otem;
2620 Lisp_Object len;
2621
2622 tem = read_list (1, readcharfun);
2623 len = Flength (tem);
2624 vector = (read_pure ? make_pure_vector (XINT (len)) : Fmake_vector (len, Qnil));
2625
078e7b4a
JB
2626 size = XVECTOR (vector)->size;
2627 ptr = XVECTOR (vector)->contents;
2628 for (i = 0; i < size; i++)
2629 {
c15cfd1f
RS
2630 item = Fcar (tem);
2631 /* If `load-force-doc-strings' is t when reading a lazily-loaded
2632 bytecode object, the docstring containing the bytecode and
2633 constants values must be treated as unibyte and passed to
2634 Fread, to get the actual bytecode string and constants vector. */
2635 if (bytecodeflag && load_force_doc_strings)
2636 {
2637 if (i == COMPILED_BYTECODE)
2638 {
2639 if (!STRINGP (item))
2640 error ("invalid byte code");
2641
2642 /* Delay handling the bytecode slot until we know whether
2643 it is lazily-loaded (we can tell by whether the
2644 constants slot is nil). */
2645 ptr[COMPILED_CONSTANTS] = item;
2646 item = Qnil;
2647 }
2648 else if (i == COMPILED_CONSTANTS)
2649 {
2650 Lisp_Object bytestr = ptr[COMPILED_CONSTANTS];
2651
2652 if (NILP (item))
2653 {
2654 /* Coerce string to unibyte (like string-as-unibyte,
2655 but without generating extra garbage and
2656 guaranteeing no change in the contents). */
2657 XSTRING (bytestr)->size = STRING_BYTES (XSTRING (bytestr));
2658 SET_STRING_BYTES (XSTRING (bytestr), -1);
2659
2660 item = Fread (bytestr);
2661 if (!CONSP (item))
2662 error ("invalid byte code");
2663
2664 otem = XCONS (item);
c1d497be
KR
2665 bytestr = XCAR (item);
2666 item = XCDR (item);
c15cfd1f
RS
2667 free_cons (otem);
2668 }
2669
2670 /* Now handle the bytecode slot. */
2671 ptr[COMPILED_BYTECODE] = read_pure ? Fpurecopy (bytestr) : bytestr;
2672 }
2673 }
2674 ptr[i] = read_pure ? Fpurecopy (item) : item;
078e7b4a
JB
2675 otem = XCONS (tem);
2676 tem = Fcdr (tem);
2677 free_cons (otem);
2678 }
2679 return vector;
2680}
2681
6f7f43d5
RS
2682/* FLAG = 1 means check for ] to terminate rather than ) and .
2683 FLAG = -1 means check for starting with defun
078e7b4a
JB
2684 and make structure pure. */
2685
2686static Lisp_Object
2687read_list (flag, readcharfun)
2688 int flag;
2689 register Lisp_Object readcharfun;
2690{
2691 /* -1 means check next element for defun,
2692 0 means don't check,
2693 1 means already checked and found defun. */
2694 int defunflag = flag < 0 ? -1 : 0;
2695 Lisp_Object val, tail;
2696 register Lisp_Object elt, tem;
2697 struct gcpro gcpro1, gcpro2;
821d417e 2698 /* 0 is the normal case.
b2a30870
RS
2699 1 means this list is a doc reference; replace it with the number 0.
2700 2 means this list is a doc reference; replace it with the doc string. */
821d417e 2701 int doc_reference = 0;
078e7b4a 2702
17634846
RS
2703 /* Initialize this to 1 if we are reading a list. */
2704 int first_in_list = flag <= 0;
2705
078e7b4a
JB
2706 val = Qnil;
2707 tail = Qnil;
2708
2709 while (1)
2710 {
e28552a4 2711 int ch;
078e7b4a 2712 GCPRO2 (val, tail);
17634846 2713 elt = read1 (readcharfun, &ch, first_in_list);
078e7b4a 2714 UNGCPRO;
20ea2964 2715
17634846
RS
2716 first_in_list = 0;
2717
821d417e 2718 /* While building, if the list starts with #$, treat it specially. */
20ea2964 2719 if (EQ (elt, Vload_file_name)
d49f0c1a 2720 && ! NILP (elt)
821d417e
RS
2721 && !NILP (Vpurify_flag))
2722 {
2723 if (NILP (Vdoc_file_name))
2724 /* We have not yet called Snarf-documentation, so assume
2725 this file is described in the DOC-MM.NN file
2726 and Snarf-documentation will fill in the right value later.
2727 For now, replace the whole list with 0. */
2728 doc_reference = 1;
2729 else
2730 /* We have already called Snarf-documentation, so make a relative
2731 file name for this file, so it can be found properly
2732 in the installed Lisp directory.
2733 We don't use Fexpand_file_name because that would make
2734 the directory absolute now. */
2735 elt = concat2 (build_string ("../lisp/"),
2736 Ffile_name_nondirectory (elt));
2737 }
b2a30870 2738 else if (EQ (elt, Vload_file_name)
d49f0c1a 2739 && ! NILP (elt)
b2a30870
RS
2740 && load_force_doc_strings)
2741 doc_reference = 2;
20ea2964 2742
6428369f 2743 if (ch)
078e7b4a
JB
2744 {
2745 if (flag > 0)
2746 {
6428369f 2747 if (ch == ']')
078e7b4a 2748 return val;
821d417e
RS
2749 Fsignal (Qinvalid_read_syntax,
2750 Fcons (make_string (") or . in a vector", 18), Qnil));
078e7b4a 2751 }
6428369f 2752 if (ch == ')')
078e7b4a 2753 return val;
6428369f 2754 if (ch == '.')
078e7b4a
JB
2755 {
2756 GCPRO2 (val, tail);
265a9e55 2757 if (!NILP (tail))
f5df591a 2758 XSETCDR (tail, read0 (readcharfun));
078e7b4a
JB
2759 else
2760 val = read0 (readcharfun);
17634846 2761 read1 (readcharfun, &ch, 0);
078e7b4a 2762 UNGCPRO;
6428369f 2763 if (ch == ')')
821d417e
RS
2764 {
2765 if (doc_reference == 1)
2766 return make_number (0);
b2a30870
RS
2767 if (doc_reference == 2)
2768 {
2769 /* Get a doc string from the file we are loading.
2770 If it's in saved_doc_string, get it from there. */
c1d497be 2771 int pos = XINT (XCDR (val));
c15cfd1f
RS
2772 /* Position is negative for user variables. */
2773 if (pos < 0) pos = -pos;
b2a30870
RS
2774 if (pos >= saved_doc_string_position
2775 && pos < (saved_doc_string_position
2776 + saved_doc_string_length))
2777 {
2778 int start = pos - saved_doc_string_position;
2779 int from, to;
2780
2781 /* Process quoting with ^A,
2782 and find the end of the string,
2783 which is marked with ^_ (037). */
2784 for (from = start, to = start;
2785 saved_doc_string[from] != 037;)
2786 {
2787 int c = saved_doc_string[from++];
2788 if (c == 1)
2789 {
2790 c = saved_doc_string[from++];
2791 if (c == 1)
2792 saved_doc_string[to++] = c;
2793 else if (c == '0')
2794 saved_doc_string[to++] = 0;
2795 else if (c == '_')
2796 saved_doc_string[to++] = 037;
2797 }
2798 else
2799 saved_doc_string[to++] = c;
2800 }
2801
2802 return make_string (saved_doc_string + start,
2803 to - start);
2804 }
c15cfd1f
RS
2805 /* Look in prev_saved_doc_string the same way. */
2806 else if (pos >= prev_saved_doc_string_position
2807 && pos < (prev_saved_doc_string_position
2808 + prev_saved_doc_string_length))
2809 {
2810 int start = pos - prev_saved_doc_string_position;
2811 int from, to;
2812
2813 /* Process quoting with ^A,
2814 and find the end of the string,
2815 which is marked with ^_ (037). */
2816 for (from = start, to = start;
2817 prev_saved_doc_string[from] != 037;)
2818 {
2819 int c = prev_saved_doc_string[from++];
2820 if (c == 1)
2821 {
2822 c = prev_saved_doc_string[from++];
2823 if (c == 1)
2824 prev_saved_doc_string[to++] = c;
2825 else if (c == '0')
2826 prev_saved_doc_string[to++] = 0;
2827 else if (c == '_')
2828 prev_saved_doc_string[to++] = 037;
2829 }
2830 else
2831 prev_saved_doc_string[to++] = c;
2832 }
2833
2834 return make_string (prev_saved_doc_string + start,
2835 to - start);
2836 }
b2a30870 2837 else
6fe9cce5 2838 return get_doc_string (val, 0, 0);
b2a30870
RS
2839 }
2840
821d417e
RS
2841 return val;
2842 }
078e7b4a
JB
2843 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil));
2844 }
2845 return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("] in a list", 11), Qnil));
2846 }
2847 tem = (read_pure && flag <= 0
2848 ? pure_cons (elt, Qnil)
2849 : Fcons (elt, Qnil));
265a9e55 2850 if (!NILP (tail))
f5df591a 2851 XSETCDR (tail, tem);
078e7b4a
JB
2852 else
2853 val = tem;
2854 tail = tem;
2855 if (defunflag < 0)
2856 defunflag = EQ (elt, Qdefun);
2857 else if (defunflag > 0)
2858 read_pure = 1;
2859 }
2860}
2861\f
2862Lisp_Object Vobarray;
2863Lisp_Object initial_obarray;
2864
d007f5c8
RS
2865/* oblookup stores the bucket number here, for the sake of Funintern. */
2866
2867int oblookup_last_bucket_number;
2868
2869static int hash_string ();
2870Lisp_Object oblookup ();
2871
2872/* Get an error if OBARRAY is not an obarray.
2873 If it is one, return it. */
2874
078e7b4a
JB
2875Lisp_Object
2876check_obarray (obarray)
2877 Lisp_Object obarray;
2878{
cfff016d 2879 while (!VECTORP (obarray) || XVECTOR (obarray)->size == 0)
078e7b4a
JB
2880 {
2881 /* If Vobarray is now invalid, force it to be valid. */
2882 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray;
2883
2884 obarray = wrong_type_argument (Qvectorp, obarray);
2885 }
2886 return obarray;
2887}
2888
d007f5c8
RS
2889/* Intern the C string STR: return a symbol with that name,
2890 interned in the current obarray. */
078e7b4a
JB
2891
2892Lisp_Object
2893intern (str)
2894 char *str;
2895{
2896 Lisp_Object tem;
2897 int len = strlen (str);
153a17b7 2898 Lisp_Object obarray;
078e7b4a 2899
153a17b7 2900 obarray = Vobarray;
cfff016d 2901 if (!VECTORP (obarray) || XVECTOR (obarray)->size == 0)
078e7b4a 2902 obarray = check_obarray (obarray);
e28552a4 2903 tem = oblookup (obarray, str, len, len);
cfff016d 2904 if (SYMBOLP (tem))
078e7b4a 2905 return tem;
87631ef7 2906 return Fintern (make_string (str, len), obarray);
078e7b4a 2907}
4ad679f9
EN
2908
2909/* Create an uninterned symbol with name STR. */
2910
2911Lisp_Object
2912make_symbol (str)
2913 char *str;
2914{
2915 int len = strlen (str);
2916
2917 return Fmake_symbol ((!NILP (Vpurify_flag)
491f16a2 2918 ? make_pure_string (str, len, len, 0)
4ad679f9
EN
2919 : make_string (str, len)));
2920}
d007f5c8 2921\f
078e7b4a 2922DEFUN ("intern", Fintern, Sintern, 1, 2, 0,
5de38842
PJ
2923 doc: /* Return the canonical symbol whose name is STRING.
2924If there is none, one is created by this function and returned.
2925A second optional argument specifies the obarray to use;
2926it defaults to the value of `obarray'. */)
2927 (string, obarray)
9391b698 2928 Lisp_Object string, obarray;
078e7b4a
JB
2929{
2930 register Lisp_Object tem, sym, *ptr;
2931
265a9e55 2932 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
2933 obarray = check_obarray (obarray);
2934
b7826503 2935 CHECK_STRING (string);
078e7b4a 2936
e28552a4
RS
2937 tem = oblookup (obarray, XSTRING (string)->data,
2938 XSTRING (string)->size,
fc932ac6 2939 STRING_BYTES (XSTRING (string)));
cfff016d 2940 if (!INTEGERP (tem))
078e7b4a
JB
2941 return tem;
2942
265a9e55 2943 if (!NILP (Vpurify_flag))
9391b698
EN
2944 string = Fpurecopy (string);
2945 sym = Fmake_symbol (string);
44c6c019
GM
2946
2947 if (EQ (obarray, initial_obarray))
2948 XSYMBOL (sym)->interned = SYMBOL_INTERNED_IN_INITIAL_OBARRAY;
2949 else
2950 XSYMBOL (sym)->interned = SYMBOL_INTERNED;
078e7b4a 2951
bdd47b1c 2952 if ((XSTRING (string)->data[0] == ':')
a458d45d 2953 && EQ (obarray, initial_obarray))
44c6c019
GM
2954 {
2955 XSYMBOL (sym)->constant = 1;
2956 XSYMBOL (sym)->value = sym;
2957 }
a0549832 2958
078e7b4a 2959 ptr = &XVECTOR (obarray)->contents[XINT (tem)];
cfff016d 2960 if (SYMBOLP (*ptr))
078e7b4a
JB
2961 XSYMBOL (sym)->next = XSYMBOL (*ptr);
2962 else
2963 XSYMBOL (sym)->next = 0;
2964 *ptr = sym;
2965 return sym;
2966}
2967
2968DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,
5de38842
PJ
2969 doc: /* Return the canonical symbol named NAME, or nil if none exists.
2970NAME may be a string or a symbol. If it is a symbol, that exact
2971symbol is searched for.
2972A second optional argument specifies the obarray to use;
2973it defaults to the value of `obarray'. */)
2974 (name, obarray)
b55048d4 2975 Lisp_Object name, obarray;
078e7b4a
JB
2976{
2977 register Lisp_Object tem;
b55048d4 2978 struct Lisp_String *string;
078e7b4a 2979
265a9e55 2980 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
2981 obarray = check_obarray (obarray);
2982
b55048d4
GM
2983 if (!SYMBOLP (name))
2984 {
b7826503 2985 CHECK_STRING (name);
b55048d4
GM
2986 string = XSTRING (name);
2987 }
2988 else
2989 string = XSYMBOL (name)->name;
078e7b4a 2990
b55048d4
GM
2991 tem = oblookup (obarray, string->data, string->size, STRING_BYTES (string));
2992 if (INTEGERP (tem) || (SYMBOLP (name) && !EQ (name, tem)))
2993 return Qnil;
2994 else
078e7b4a 2995 return tem;
078e7b4a 2996}
d007f5c8
RS
2997\f
2998DEFUN ("unintern", Funintern, Sunintern, 1, 2, 0,
5de38842
PJ
2999 doc: /* Delete the symbol named NAME, if any, from OBARRAY.
3000The value is t if a symbol was found and deleted, nil otherwise.
3001NAME may be a string or a symbol. If it is a symbol, that symbol
3002is deleted, if it belongs to OBARRAY--no other symbol is deleted.
3003OBARRAY defaults to the value of the variable `obarray'. */)
3004 (name, obarray)
d007f5c8
RS
3005 Lisp_Object name, obarray;
3006{
3007 register Lisp_Object string, tem;
3008 int hash;
3009
3010 if (NILP (obarray)) obarray = Vobarray;
3011 obarray = check_obarray (obarray);
3012
3013 if (SYMBOLP (name))
3014 XSETSTRING (string, XSYMBOL (name)->name);
3015 else
3016 {
b7826503 3017 CHECK_STRING (name);
d007f5c8
RS
3018 string = name;
3019 }
3020
e28552a4
RS
3021 tem = oblookup (obarray, XSTRING (string)->data,
3022 XSTRING (string)->size,
fc932ac6 3023 STRING_BYTES (XSTRING (string)));
d007f5c8
RS
3024 if (INTEGERP (tem))
3025 return Qnil;
3026 /* If arg was a symbol, don't delete anything but that symbol itself. */
3027 if (SYMBOLP (name) && !EQ (name, tem))
3028 return Qnil;
3029
44c6c019
GM
3030 XSYMBOL (tem)->interned = SYMBOL_UNINTERNED;
3031 XSYMBOL (tem)->constant = 0;
3032 XSYMBOL (tem)->indirect_variable = 0;
ca69c42f 3033
d007f5c8
RS
3034 hash = oblookup_last_bucket_number;
3035
3036 if (EQ (XVECTOR (obarray)->contents[hash], tem))
b2a30870
RS
3037 {
3038 if (XSYMBOL (tem)->next)
3039 XSETSYMBOL (XVECTOR (obarray)->contents[hash], XSYMBOL (tem)->next);
3040 else
3041 XSETINT (XVECTOR (obarray)->contents[hash], 0);
3042 }
d007f5c8
RS
3043 else
3044 {
3045 Lisp_Object tail, following;
3046
3047 for (tail = XVECTOR (obarray)->contents[hash];
3048 XSYMBOL (tail)->next;
3049 tail = following)
3050 {
3051 XSETSYMBOL (following, XSYMBOL (tail)->next);
3052 if (EQ (following, tem))
3053 {
3054 XSYMBOL (tail)->next = XSYMBOL (following)->next;
3055 break;
3056 }
3057 }
3058 }
3059
3060 return Qt;
3061}
3062\f
3063/* Return the symbol in OBARRAY whose names matches the string
e28552a4
RS
3064 of SIZE characters (SIZE_BYTE bytes) at PTR.
3065 If there is no such symbol in OBARRAY, return nil.
d007f5c8
RS
3066
3067 Also store the bucket number in oblookup_last_bucket_number. */
078e7b4a
JB
3068
3069Lisp_Object
e28552a4 3070oblookup (obarray, ptr, size, size_byte)
078e7b4a
JB
3071 Lisp_Object obarray;
3072 register char *ptr;
e28552a4 3073 int size, size_byte;
078e7b4a 3074{
7a70b397
RS
3075 int hash;
3076 int obsize;
078e7b4a
JB
3077 register Lisp_Object tail;
3078 Lisp_Object bucket, tem;
3079
cfff016d 3080 if (!VECTORP (obarray)
7c79a684 3081 || (obsize = XVECTOR (obarray)->size) == 0)
078e7b4a
JB
3082 {
3083 obarray = check_obarray (obarray);
3084 obsize = XVECTOR (obarray)->size;
3085 }
519418b3
RS
3086 /* This is sometimes needed in the middle of GC. */
3087 obsize &= ~ARRAY_MARK_FLAG;
078e7b4a 3088 /* Combining next two lines breaks VMS C 2.3. */
e28552a4 3089 hash = hash_string (ptr, size_byte);
078e7b4a
JB
3090 hash %= obsize;
3091 bucket = XVECTOR (obarray)->contents[hash];
d007f5c8 3092 oblookup_last_bucket_number = hash;
078e7b4a
JB
3093 if (XFASTINT (bucket) == 0)
3094 ;
cfff016d 3095 else if (!SYMBOLP (bucket))
078e7b4a 3096 error ("Bad data in guts of obarray"); /* Like CADR error message */
d007f5c8
RS
3097 else
3098 for (tail = bucket; ; XSETSYMBOL (tail, XSYMBOL (tail)->next))
078e7b4a 3099 {
fc932ac6 3100 if (STRING_BYTES (XSYMBOL (tail)->name) == size_byte
e28552a4
RS
3101 && XSYMBOL (tail)->name->size == size
3102 && !bcmp (XSYMBOL (tail)->name->data, ptr, size_byte))
078e7b4a
JB
3103 return tail;
3104 else if (XSYMBOL (tail)->next == 0)
3105 break;
3106 }
1805de4f 3107 XSETINT (tem, hash);
078e7b4a
JB
3108 return tem;
3109}
3110
3111static int
3112hash_string (ptr, len)
3113 unsigned char *ptr;
3114 int len;
3115{
3116 register unsigned char *p = ptr;
3117 register unsigned char *end = p + len;
3118 register unsigned char c;
3119 register int hash = 0;
3120
3121 while (p != end)
3122 {
3123 c = *p++;
3124 if (c >= 0140) c -= 40;
3125 hash = ((hash<<3) + (hash>>28) + c);
3126 }
3127 return hash & 07777777777;
3128}
d007f5c8 3129\f
078e7b4a
JB
3130void
3131map_obarray (obarray, fn, arg)
3132 Lisp_Object obarray;
d5b28a9d 3133 void (*fn) P_ ((Lisp_Object, Lisp_Object));
078e7b4a
JB
3134 Lisp_Object arg;
3135{
3136 register int i;
3137 register Lisp_Object tail;
b7826503 3138 CHECK_VECTOR (obarray);
078e7b4a
JB
3139 for (i = XVECTOR (obarray)->size - 1; i >= 0; i--)
3140 {
3141 tail = XVECTOR (obarray)->contents[i];
4f5c4403 3142 if (SYMBOLP (tail))
078e7b4a
JB
3143 while (1)
3144 {
3145 (*fn) (tail, arg);
3146 if (XSYMBOL (tail)->next == 0)
3147 break;
1805de4f 3148 XSETSYMBOL (tail, XSYMBOL (tail)->next);
078e7b4a
JB
3149 }
3150 }
3151}
3152
d5b28a9d 3153void
078e7b4a
JB
3154mapatoms_1 (sym, function)
3155 Lisp_Object sym, function;
3156{
3157 call1 (function, sym);
3158}
3159
3160DEFUN ("mapatoms", Fmapatoms, Smapatoms, 1, 2, 0,
5de38842
PJ
3161 doc: /* Call FUNCTION on every symbol in OBARRAY.
3162OBARRAY defaults to the value of `obarray'. */)
3163 (function, obarray)
078e7b4a
JB
3164 Lisp_Object function, obarray;
3165{
265a9e55 3166 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
3167 obarray = check_obarray (obarray);
3168
3169 map_obarray (obarray, mapatoms_1, function);
3170 return Qnil;
3171}
3172
5e88a39e 3173#define OBARRAY_SIZE 1511
078e7b4a
JB
3174
3175void
3176init_obarray ()
3177{
3178 Lisp_Object oblength;
3179 int hash;
3180 Lisp_Object *tem;
3181
baf69866 3182 XSETFASTINT (oblength, OBARRAY_SIZE);
078e7b4a 3183
491f16a2 3184 Qnil = Fmake_symbol (make_pure_string ("nil", 3, 3, 0));
078e7b4a
JB
3185 Vobarray = Fmake_vector (oblength, make_number (0));
3186 initial_obarray = Vobarray;
3187 staticpro (&initial_obarray);
3188 /* Intern nil in the obarray */
44c6c019
GM
3189 XSYMBOL (Qnil)->interned = SYMBOL_INTERNED_IN_INITIAL_OBARRAY;
3190 XSYMBOL (Qnil)->constant = 1;
3191
078e7b4a
JB
3192 /* These locals are to kludge around a pyramid compiler bug. */
3193 hash = hash_string ("nil", 3);
3194 /* Separate statement here to avoid VAXC bug. */
3195 hash %= OBARRAY_SIZE;
3196 tem = &XVECTOR (Vobarray)->contents[hash];
3197 *tem = Qnil;
3198
491f16a2 3199 Qunbound = Fmake_symbol (make_pure_string ("unbound", 7, 7, 0));
078e7b4a
JB
3200 XSYMBOL (Qnil)->function = Qunbound;
3201 XSYMBOL (Qunbound)->value = Qunbound;
3202 XSYMBOL (Qunbound)->function = Qunbound;
3203
3204 Qt = intern ("t");
3205 XSYMBOL (Qnil)->value = Qnil;
3206 XSYMBOL (Qnil)->plist = Qnil;
3207 XSYMBOL (Qt)->value = Qt;
44c6c019 3208 XSYMBOL (Qt)->constant = 1;
078e7b4a
JB
3209
3210 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */
3211 Vpurify_flag = Qt;
3212
3213 Qvariable_documentation = intern ("variable-documentation");
0f73bb1c 3214 staticpro (&Qvariable_documentation);
078e7b4a 3215
449fea39 3216 read_buffer_size = 100 + MAX_MULTIBYTE_LENGTH;
3cb65b0e 3217 read_buffer = (char *) xmalloc (read_buffer_size);
078e7b4a
JB
3218}
3219\f
3220void
3221defsubr (sname)
3222 struct Lisp_Subr *sname;
3223{
3224 Lisp_Object sym;
3225 sym = intern (sname->symbol_name);
1805de4f 3226 XSETSUBR (XSYMBOL (sym)->function, sname);
078e7b4a
JB
3227}
3228
3229#ifdef NOTDEF /* use fset in subr.el now */
3230void
3231defalias (sname, string)
3232 struct Lisp_Subr *sname;
3233 char *string;
3234{
3235 Lisp_Object sym;
3236 sym = intern (string);
1805de4f 3237 XSETSUBR (XSYMBOL (sym)->function, sname);
078e7b4a
JB
3238}
3239#endif /* NOTDEF */
3240
078e7b4a 3241/* Define an "integer variable"; a symbol whose value is forwarded
1a0f90f7 3242 to a C variable of type int. Sample call: */
5de38842 3243 /* DEFVAR_INT ("indent-tabs-mode", &indent_tabs_mode, "Documentation"); */
078e7b4a 3244void
e9e00ff2 3245defvar_int (namestring, address)
078e7b4a
JB
3246 char *namestring;
3247 int *address;
078e7b4a 3248{
1a0f90f7 3249 Lisp_Object sym, val;
078e7b4a 3250 sym = intern (namestring);
1a0f90f7 3251 val = allocate_misc ();
47e28b2c 3252 XMISCTYPE (val) = Lisp_Misc_Intfwd;
fc1e7df5 3253 XINTFWD (val)->intvar = address;
44c6c019 3254 SET_SYMBOL_VALUE (sym, val);
078e7b4a
JB
3255}
3256
f0529b5b
PJ
3257/* Similar but define a variable whose value is t if address contains 1,
3258 nil if address contains 0 */
078e7b4a 3259void
e9e00ff2 3260defvar_bool (namestring, address)
078e7b4a
JB
3261 char *namestring;
3262 int *address;
078e7b4a 3263{
1a0f90f7 3264 Lisp_Object sym, val;
078e7b4a 3265 sym = intern (namestring);
1a0f90f7 3266 val = allocate_misc ();
47e28b2c 3267 XMISCTYPE (val) = Lisp_Misc_Boolfwd;
fc1e7df5 3268 XBOOLFWD (val)->boolvar = address;
44c6c019 3269 SET_SYMBOL_VALUE (sym, val);
1ffcc3b1 3270 Vbyte_boolean_vars = Fcons (sym, Vbyte_boolean_vars);
078e7b4a
JB
3271}
3272
1a0f90f7
KH
3273/* Similar but define a variable whose value is the Lisp Object stored
3274 at address. Two versions: with and without gc-marking of the C
3275 variable. The nopro version is used when that variable will be
3276 gc-marked for some other reason, since marking the same slot twice
3277 can cause trouble with strings. */
078e7b4a 3278void
1a0f90f7 3279defvar_lisp_nopro (namestring, address)
078e7b4a
JB
3280 char *namestring;
3281 Lisp_Object *address;
078e7b4a 3282{
1a0f90f7 3283 Lisp_Object sym, val;
078e7b4a 3284 sym = intern (namestring);
1a0f90f7 3285 val = allocate_misc ();
47e28b2c 3286 XMISCTYPE (val) = Lisp_Misc_Objfwd;
fc1e7df5 3287 XOBJFWD (val)->objvar = address;
44c6c019 3288 SET_SYMBOL_VALUE (sym, val);
078e7b4a
JB
3289}
3290
078e7b4a 3291void
1a0f90f7 3292defvar_lisp (namestring, address)
078e7b4a
JB
3293 char *namestring;
3294 Lisp_Object *address;
078e7b4a 3295{
1a0f90f7
KH
3296 defvar_lisp_nopro (namestring, address);
3297 staticpro (address);
078e7b4a
JB
3298}
3299
078e7b4a 3300/* Similar but define a variable whose value is the Lisp Object stored in
2836d9a4
KH
3301 the current buffer. address is the address of the slot in the buffer
3302 that is current now. */
078e7b4a
JB
3303
3304void
4360b0c6 3305defvar_per_buffer (namestring, address, type, doc)
078e7b4a
JB
3306 char *namestring;
3307 Lisp_Object *address;
4360b0c6 3308 Lisp_Object type;
078e7b4a
JB
3309 char *doc;
3310{
1a0f90f7 3311 Lisp_Object sym, val;
078e7b4a
JB
3312 int offset;
3313 extern struct buffer buffer_local_symbols;
3314
3315 sym = intern (namestring);
1a0f90f7 3316 val = allocate_misc ();
078e7b4a
JB
3317 offset = (char *)address - (char *)current_buffer;
3318
47e28b2c 3319 XMISCTYPE (val) = Lisp_Misc_Buffer_Objfwd;
fc1e7df5 3320 XBUFFER_OBJFWD (val)->offset = offset;
44c6c019 3321 SET_SYMBOL_VALUE (sym, val);
11fd416e
GM
3322 PER_BUFFER_SYMBOL (offset) = sym;
3323 PER_BUFFER_TYPE (offset) = type;
cf611f01 3324
11fd416e 3325 if (PER_BUFFER_IDX (offset) == 0)
078e7b4a
JB
3326 /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
3327 slot of buffer_local_flags */
3328 abort ();
3329}
3330
950c215d
KH
3331
3332/* Similar but define a variable whose value is the Lisp Object stored
4ac38690 3333 at a particular offset in the current kboard object. */
950c215d
KH
3334
3335void
4ac38690 3336defvar_kboard (namestring, offset)
950c215d
KH
3337 char *namestring;
3338 int offset;
3339{
3340 Lisp_Object sym, val;
3341 sym = intern (namestring);
3342 val = allocate_misc ();
47e28b2c 3343 XMISCTYPE (val) = Lisp_Misc_Kboard_Objfwd;
4ac38690 3344 XKBOARD_OBJFWD (val)->offset = offset;
44c6c019 3345 SET_SYMBOL_VALUE (sym, val);
950c215d 3346}
078e7b4a 3347\f
11938f10
KH
3348/* Record the value of load-path used at the start of dumping
3349 so we can see if the site changed it later during dumping. */
3350static Lisp_Object dump_path;
3351
d5b28a9d 3352void
279499f0 3353init_lread ()
078e7b4a 3354{
46947372 3355 char *normal;
e73997a1 3356 int turn_off_warning = 0;
078e7b4a 3357
279499f0 3358 /* Compute the default load-path. */
46947372
JB
3359#ifdef CANNOT_DUMP
3360 normal = PATH_LOADSEARCH;
e065a56e 3361 Vload_path = decode_env_path (0, normal);
46947372
JB
3362#else
3363 if (NILP (Vpurify_flag))
3364 normal = PATH_LOADSEARCH;
279499f0 3365 else
46947372 3366 normal = PATH_DUMPLOADSEARCH;
279499f0 3367
46947372
JB
3368 /* In a dumped Emacs, we normally have to reset the value of
3369 Vload_path from PATH_LOADSEARCH, since the value that was dumped
3370 uses ../lisp, instead of the path of the installed elisp
3371 libraries. However, if it appears that Vload_path was changed
3372 from the default before dumping, don't override that value. */
4746118a
JB
3373 if (initialized)
3374 {
4746118a 3375 if (! NILP (Fequal (dump_path, Vload_path)))
80667d53
RS
3376 {
3377 Vload_path = decode_env_path (0, normal);
74180aa4 3378 if (!NILP (Vinstallation_directory))
80667d53 3379 {
3ddff138
RS
3380 Lisp_Object tem, tem1, sitelisp;
3381
3382 /* Remove site-lisp dirs from path temporarily and store
3383 them in sitelisp, then conc them on at the end so
3384 they're always first in path. */
3385 sitelisp = Qnil;
3386 while (1)
3387 {
3388 tem = Fcar (Vload_path);
3389 tem1 = Fstring_match (build_string ("site-lisp"),
3390 tem, Qnil);
3391 if (!NILP (tem1))
3392 {
3393 Vload_path = Fcdr (Vload_path);
3394 sitelisp = Fcons (tem, sitelisp);
3395 }
3396 else
3397 break;
3398 }
3399
74180aa4 3400 /* Add to the path the lisp subdir of the
3a3056e5 3401 installation dir, if it exists. */
74180aa4
RS
3402 tem = Fexpand_file_name (build_string ("lisp"),
3403 Vinstallation_directory);
3a3056e5
RS
3404 tem1 = Ffile_exists_p (tem);
3405 if (!NILP (tem1))
3406 {
3407 if (NILP (Fmember (tem, Vload_path)))
e73997a1
RS
3408 {
3409 turn_off_warning = 1;
3ddff138 3410 Vload_path = Fcons (tem, Vload_path);
e73997a1 3411 }
3a3056e5
RS
3412 }
3413 else
3414 /* That dir doesn't exist, so add the build-time
3415 Lisp dirs instead. */
3416 Vload_path = nconc2 (Vload_path, dump_path);
c478f98c 3417
9fbc0116
RS
3418 /* Add leim under the installation dir, if it exists. */
3419 tem = Fexpand_file_name (build_string ("leim"),
3420 Vinstallation_directory);
3421 tem1 = Ffile_exists_p (tem);
3422 if (!NILP (tem1))
3423 {
3424 if (NILP (Fmember (tem, Vload_path)))
3ddff138 3425 Vload_path = Fcons (tem, Vload_path);
9fbc0116
RS
3426 }
3427
c478f98c
RS
3428 /* Add site-list under the installation dir, if it exists. */
3429 tem = Fexpand_file_name (build_string ("site-lisp"),
3430 Vinstallation_directory);
3431 tem1 = Ffile_exists_p (tem);
3432 if (!NILP (tem1))
3433 {
3434 if (NILP (Fmember (tem, Vload_path)))
3ddff138 3435 Vload_path = Fcons (tem, Vload_path);
c478f98c 3436 }
0f337465
RS
3437
3438 /* If Emacs was not built in the source directory,
9fbc0116
RS
3439 and it is run from where it was built, add to load-path
3440 the lisp, leim and site-lisp dirs under that directory. */
0f337465
RS
3441
3442 if (NILP (Fequal (Vinstallation_directory, Vsource_directory)))
3443 {
33046fc9
RS
3444 Lisp_Object tem2;
3445
0f337465
RS
3446 tem = Fexpand_file_name (build_string ("src/Makefile"),
3447 Vinstallation_directory);
3448 tem1 = Ffile_exists_p (tem);
33046fc9
RS
3449
3450 /* Don't be fooled if they moved the entire source tree
3451 AFTER dumping Emacs. If the build directory is indeed
3452 different from the source dir, src/Makefile.in and
3453 src/Makefile will not be found together. */
3454 tem = Fexpand_file_name (build_string ("src/Makefile.in"),
3455 Vinstallation_directory);
3456 tem2 = Ffile_exists_p (tem);
3457 if (!NILP (tem1) && NILP (tem2))
0f337465
RS
3458 {
3459 tem = Fexpand_file_name (build_string ("lisp"),
3460 Vsource_directory);
3461
3462 if (NILP (Fmember (tem, Vload_path)))
3ddff138 3463 Vload_path = Fcons (tem, Vload_path);
0f337465 3464
9fbc0116
RS
3465 tem = Fexpand_file_name (build_string ("leim"),
3466 Vsource_directory);
3467
3468 if (NILP (Fmember (tem, Vload_path)))
3ddff138 3469 Vload_path = Fcons (tem, Vload_path);
9fbc0116 3470
0f337465
RS
3471 tem = Fexpand_file_name (build_string ("site-lisp"),
3472 Vsource_directory);
3473
3474 if (NILP (Fmember (tem, Vload_path)))
3ddff138 3475 Vload_path = Fcons (tem, Vload_path);
0f337465
RS
3476 }
3477 }
3ddff138
RS
3478 if (!NILP (sitelisp))
3479 Vload_path = nconc2 (Fnreverse (sitelisp), Vload_path);
80667d53
RS
3480 }
3481 }
4746118a
JB
3482 }
3483 else
11938f10 3484 {
7b396c6c
RS
3485 /* NORMAL refers to the lisp dir in the source directory. */
3486 /* We used to add ../lisp at the front here, but
3487 that caused trouble because it was copied from dump_path
3488 into Vload_path, aboe, when Vinstallation_directory was non-nil.
3489 It should be unnecessary. */
3490 Vload_path = decode_env_path (0, normal);
11938f10
KH
3491 dump_path = Vload_path;
3492 }
46947372 3493#endif
279499f0 3494
317073d5
RS
3495#ifndef WINDOWSNT
3496 /* When Emacs is invoked over network shares on NT, PATH_LOADSEARCH is
3497 almost never correct, thereby causing a warning to be printed out that
8e6208c5 3498 confuses users. Since PATH_LOADSEARCH is always overridden by the
317073d5
RS
3499 EMACSLOADPATH environment variable below, disable the warning on NT. */
3500
078e7b4a 3501 /* Warn if dirs in the *standard* path don't exist. */
e73997a1
RS
3502 if (!turn_off_warning)
3503 {
3504 Lisp_Object path_tail;
078e7b4a 3505
e73997a1
RS
3506 for (path_tail = Vload_path;
3507 !NILP (path_tail);
c1d497be 3508 path_tail = XCDR (path_tail))
e73997a1
RS
3509 {
3510 Lisp_Object dirfile;
3511 dirfile = Fcar (path_tail);
3512 if (STRINGP (dirfile))
3513 {
3514 dirfile = Fdirectory_file_name (dirfile);
3515 if (access (XSTRING (dirfile)->data, 0) < 0)
85496b8c 3516 dir_warning ("Warning: Lisp directory `%s' does not exist.\n",
c1d497be 3517 XCAR (path_tail));
e73997a1
RS
3518 }
3519 }
3520 }
317073d5 3521#endif /* WINDOWSNT */
46947372
JB
3522
3523 /* If the EMACSLOADPATH environment variable is set, use its value.
3524 This doesn't apply if we're dumping. */
ffd9c2a1 3525#ifndef CANNOT_DUMP
46947372
JB
3526 if (NILP (Vpurify_flag)
3527 && egetenv ("EMACSLOADPATH"))
ffd9c2a1 3528#endif
279499f0 3529 Vload_path = decode_env_path ("EMACSLOADPATH", normal);
279499f0
JB
3530
3531 Vvalues = Qnil;
3532
078e7b4a 3533 load_in_progress = 0;
4e53f562 3534 Vload_file_name = Qnil;
d2c6be7f
RS
3535
3536 load_descriptor_list = Qnil;
8f6b0411
RS
3537
3538 Vstandard_input = Qt;
f74b0705 3539 Vloads_in_progress = Qnil;
078e7b4a
JB
3540}
3541
85496b8c
RS
3542/* Print a warning, using format string FORMAT, that directory DIRNAME
3543 does not exist. Print it on stderr and put it in *Message*. */
3544
d5b28a9d 3545void
85496b8c
RS
3546dir_warning (format, dirname)
3547 char *format;
3548 Lisp_Object dirname;
3549{
3550 char *buffer
3551 = (char *) alloca (XSTRING (dirname)->size + strlen (format) + 5);
3552
3553 fprintf (stderr, format, XSTRING (dirname)->data);
3554 sprintf (buffer, format, XSTRING (dirname)->data);
9b69357e
GV
3555 /* Don't log the warning before we've initialized!! */
3556 if (initialized)
3557 message_dolog (buffer, strlen (buffer), 0, STRING_MULTIBYTE (dirname));
85496b8c
RS
3558}
3559
078e7b4a 3560void
279499f0 3561syms_of_lread ()
078e7b4a
JB
3562{
3563 defsubr (&Sread);
3564 defsubr (&Sread_from_string);
3565 defsubr (&Sintern);
3566 defsubr (&Sintern_soft);
d007f5c8 3567 defsubr (&Sunintern);
078e7b4a 3568 defsubr (&Sload);
228d4b1c 3569 defsubr (&Seval_buffer);
078e7b4a
JB
3570 defsubr (&Seval_region);
3571 defsubr (&Sread_char);
3572 defsubr (&Sread_char_exclusive);
078e7b4a 3573 defsubr (&Sread_event);
078e7b4a
JB
3574 defsubr (&Sget_file_char);
3575 defsubr (&Smapatoms);
3576
3577 DEFVAR_LISP ("obarray", &Vobarray,
5de38842
PJ
3578 doc: /* Symbol table for use by `intern' and `read'.
3579It is a vector whose length ought to be prime for best results.
3580The vector's contents don't make sense if examined from Lisp programs;
3581to find all the symbols in an obarray, use `mapatoms'. */);
078e7b4a
JB
3582
3583 DEFVAR_LISP ("values", &Vvalues,
5de38842
PJ
3584 doc: /* List of values of all expressions which were read, evaluated and printed.
3585Order is reverse chronological. */);
078e7b4a
JB
3586
3587 DEFVAR_LISP ("standard-input", &Vstandard_input,
5de38842
PJ
3588 doc: /* Stream for read to get input from.
3589See documentation of `read' for possible values. */);
078e7b4a
JB
3590 Vstandard_input = Qt;
3591
3592 DEFVAR_LISP ("load-path", &Vload_path,
5de38842
PJ
3593 doc: /* *List of directories to search for files to load.
3594Each element is a string (directory name) or nil (try default directory).
3595Initialized based on EMACSLOADPATH environment variable, if any,
3596otherwise to default specified by file `epaths.h' when Emacs was built. */);
078e7b4a 3597
e61b9b87 3598 DEFVAR_LISP ("load-suffixes", &Vload_suffixes,
5de38842
PJ
3599 doc: /* *List of suffixes to try for files to load.
3600This list should not include the empty string. */);
e61b9b87
SM
3601 Vload_suffixes = Fcons (build_string (".elc"),
3602 Fcons (build_string (".el"), Qnil));
ddb716ef
SM
3603 /* We don't use empty_string because it's not initialized yet. */
3604 default_suffixes = Fcons (build_string (""), Qnil);
e61b9b87
SM
3605 staticpro (&default_suffixes);
3606
078e7b4a 3607 DEFVAR_BOOL ("load-in-progress", &load_in_progress,
5de38842 3608 doc: /* Non-nil iff inside of `load'. */);
078e7b4a
JB
3609
3610 DEFVAR_LISP ("after-load-alist", &Vafter_load_alist,
5de38842
PJ
3611 doc: /* An alist of expressions to be evalled when particular files are loaded.
3612Each element looks like (FILENAME FORMS...).
3613When `load' is run and the file-name argument is FILENAME,
3614the FORMS in the corresponding element are executed at the end of loading.
3615
3616FILENAME must match exactly! Normally FILENAME is the name of a library,
3617with no directory specified, since that is how `load' is normally called.
3618An error in FORMS does not undo the load,
3619but does prevent execution of the rest of the FORMS.
3620FILENAME can also be a symbol (a feature) and FORMS are then executed
3621when the corresponding call to `provide' is made. */);
078e7b4a
JB
3622 Vafter_load_alist = Qnil;
3623
ae321d28 3624 DEFVAR_LISP ("load-history", &Vload_history,
5de38842
PJ
3625 doc: /* Alist mapping source file names to symbols and features.
3626Each alist element is a list that starts with a file name,
3627except for one element (optional) that starts with nil and describes
3628definitions evaluated from buffers not visiting files.
3629The remaining elements of each list are symbols defined as functions
3630or variables, and cons cells `(provide . FEATURE)', `(require . FEATURE)',
3631and `(autoload . SYMBOL)'. */);
ae321d28
RS
3632 Vload_history = Qnil;
3633
20ea2964 3634 DEFVAR_LISP ("load-file-name", &Vload_file_name,
5de38842 3635 doc: /* Full name of file being loaded by `load'. */);
20ea2964
RS
3636 Vload_file_name = Qnil;
3637
4116ab9f 3638 DEFVAR_LISP ("user-init-file", &Vuser_init_file,
5de38842
PJ
3639 doc: /* File name, including directory, of user's initialization file.
3640If the file loaded had extension `.elc' and there was a corresponding `.el'
3641file, this variable contains the name of the .el file, suitable for use
3642by functions like `custom-save-all' which edit the init file. */);
4116ab9f
KH
3643 Vuser_init_file = Qnil;
3644
8a1f1537 3645 DEFVAR_LISP ("current-load-list", &Vcurrent_load_list,
5de38842 3646 doc: /* Used for internal purposes by `load'. */);
ae321d28
RS
3647 Vcurrent_load_list = Qnil;
3648
84a15045 3649 DEFVAR_LISP ("load-read-function", &Vload_read_function,
5de38842
PJ
3650 doc: /* Function used by `load' and `eval-region' for reading expressions.
3651The default is nil, which means use the function `read'. */);
84a15045
RS
3652 Vload_read_function = Qnil;
3653
fe0e03f3 3654 DEFVAR_LISP ("load-source-file-function", &Vload_source_file_function,
5de38842
PJ
3655 doc: /* Function called in `load' for loading an Emacs lisp source file.
3656This function is for doing code conversion before reading the source file.
3657If nil, loading is done without any code conversion.
3658Arguments are FULLNAME, FILE, NOERROR, NOMESSAGE, where
3659 FULLNAME is the full name of FILE.
3660See `load' for the meaning of the remaining arguments. */);
fe0e03f3
KH
3661 Vload_source_file_function = Qnil;
3662
b2a30870 3663 DEFVAR_BOOL ("load-force-doc-strings", &load_force_doc_strings,
5de38842
PJ
3664 doc: /* Non-nil means `load' should force-load all dynamic doc strings.
3665This is useful when the file being loaded is a temporary copy. */);
b2a30870
RS
3666 load_force_doc_strings = 0;
3667
94e554db 3668 DEFVAR_BOOL ("load-convert-to-unibyte", &load_convert_to_unibyte,
5de38842
PJ
3669 doc: /* Non-nil means `read' converts strings to unibyte whenever possible.
3670This is normally bound by `load' and `eval-buffer' to control `read',
3671and is not meant for users to change. */);
94e554db
RS
3672 load_convert_to_unibyte = 0;
3673
1521a8fa 3674 DEFVAR_LISP ("source-directory", &Vsource_directory,
5de38842
PJ
3675 doc: /* Directory in which Emacs sources were found when Emacs was built.
3676You cannot count on them to still be there! */);
a90ba1e2
KH
3677 Vsource_directory
3678 = Fexpand_file_name (build_string ("../"),
3679 Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH)));
3680
4b104c41 3681 DEFVAR_LISP ("preloaded-file-list", &Vpreloaded_file_list,
5de38842 3682 doc: /* List of files that were preloaded (when dumping Emacs). */);
4b104c41
RS
3683 Vpreloaded_file_list = Qnil;
3684
1ffcc3b1 3685 DEFVAR_LISP ("byte-boolean-vars", &Vbyte_boolean_vars,
5de38842 3686 doc: /* List of all DEFVAR_BOOL variables, used by the byte code optimizer. */);
1ffcc3b1
DL
3687 Vbyte_boolean_vars = Qnil;
3688
da84f340 3689 DEFVAR_BOOL ("load-dangerous-libraries", &load_dangerous_libraries,
5de38842
PJ
3690 doc: /* Non-nil means load dangerous compiled Lisp files.
3691Some versions of XEmacs use different byte codes than Emacs. These
3692incompatible byte codes can make Emacs crash when it tries to execute
3693them. */);
da84f340
GM
3694 load_dangerous_libraries = 0;
3695
bb970e67 3696 DEFVAR_LISP ("bytecomp-version-regexp", &Vbytecomp_version_regexp,
5de38842
PJ
3697 doc: /* Regular expression matching safe to load compiled Lisp files.
3698When Emacs loads a compiled Lisp file, it reads the first 512 bytes
3699from the file, and matches them against this regular expression.
3700When the regular expression matches, the file is considered to be safe
3701to load. See also `load-dangerous-libraries'. */);
bb970e67 3702 Vbytecomp_version_regexp
f2e7d5eb 3703 = build_string ("^;;;.\\(in Emacs version\\|bytecomp version FSF\\)");
da84f340 3704
a90ba1e2
KH
3705 /* Vsource_directory was initialized in init_lread. */
3706
d2c6be7f
RS
3707 load_descriptor_list = Qnil;
3708 staticpro (&load_descriptor_list);
3709
8a1f1537
RS
3710 Qcurrent_load_list = intern ("current-load-list");
3711 staticpro (&Qcurrent_load_list);
3712
078e7b4a
JB
3713 Qstandard_input = intern ("standard-input");
3714 staticpro (&Qstandard_input);
3715
3716 Qread_char = intern ("read-char");
3717 staticpro (&Qread_char);
3718
3719 Qget_file_char = intern ("get-file-char");
3720 staticpro (&Qget_file_char);
7bd279cd 3721
17634846
RS
3722 Qbackquote = intern ("`");
3723 staticpro (&Qbackquote);
3724 Qcomma = intern (",");
3725 staticpro (&Qcomma);
3726 Qcomma_at = intern (",@");
3727 staticpro (&Qcomma_at);
3728 Qcomma_dot = intern (",.");
3729 staticpro (&Qcomma_dot);
3730
74549846
RS
3731 Qinhibit_file_name_operation = intern ("inhibit-file-name-operation");
3732 staticpro (&Qinhibit_file_name_operation);
3733
7bd279cd
RS
3734 Qascii_character = intern ("ascii-character");
3735 staticpro (&Qascii_character);
c2225d00 3736
2b6cae0c
RS
3737 Qfunction = intern ("function");
3738 staticpro (&Qfunction);
3739
c2225d00
RS
3740 Qload = intern ("load");
3741 staticpro (&Qload);
20ea2964
RS
3742
3743 Qload_file_name = intern ("load-file-name");
3744 staticpro (&Qload_file_name);
11938f10
KH
3745
3746 staticpro (&dump_path);
4ad679f9
EN
3747
3748 staticpro (&read_objects);
3749 read_objects = Qnil;
9e062b6c
RS
3750 staticpro (&seen_list);
3751
7ee3bd7b
GM
3752 Vloads_in_progress = Qnil;
3753 staticpro (&Vloads_in_progress);
078e7b4a 3754}