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