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