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