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