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