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