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