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