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