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