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