Pass operation to Ffind_file_name_handler.
[bpt/emacs.git] / src / lread.c
CommitLineData
078e7b4a 1/* Lisp parsing and input streams.
508b171c 2 Copyright (C) 1985, 1986, 1987, 1988, 1989,
c6c5df7f 3 1993 Free Software Foundation, Inc.
078e7b4a
JB
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
46947372 9the Free Software Foundation; either version 2, or (at your option)
078e7b4a
JB
10any later version.
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
19the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21
22#include <stdio.h>
23#include <sys/types.h>
24#include <sys/stat.h>
25#include <sys/file.h>
12e94926 26#include <ctype.h>
18160b98 27#include <config.h>
078e7b4a
JB
28#include "lisp.h"
29
30#ifndef standalone
31#include "buffer.h"
2a6b3537 32#include <paths.h>
078e7b4a 33#include "commands.h"
e37c0805 34#include "keyboard.h"
7bd279cd 35#include "termhooks.h"
078e7b4a
JB
36#endif
37
38#ifdef lint
39#include <sys/inode.h>
40#endif /* lint */
41
42#ifndef X_OK
43#define X_OK 01
44#endif
45
46#ifdef LISP_FLOAT_TYPE
93b91208
JB
47#ifdef STDC_HEADERS
48#include <stdlib.h>
49#endif
23a71bd6
RS
50
51#if 0 /* That is untrue--XINT is used below, and it uses INTBITS.
52 What in the world is values.h, anyway? */
53#ifdef MSDOS
54/* These are redefined in <values.h> and not used here */
55#undef INTBITS
56#undef LONGBITS
57#undef SHORTBITS
58#endif
59#endif
60
078e7b4a
JB
61#include <math.h>
62#endif /* LISP_FLOAT_TYPE */
63
8a1f1537 64Lisp_Object Qread_char, Qget_file_char, Qstandard_input, Qcurrent_load_list;
078e7b4a 65Lisp_Object Qvariable_documentation, Vvalues, Vstandard_input, Vafter_load_alist;
c2225d00 66Lisp_Object Qascii_character, Qload;
7bd279cd
RS
67
68extern Lisp_Object Qevent_symbol_element_mask;
078e7b4a
JB
69
70/* non-zero if inside `load' */
71int load_in_progress;
72
73/* Search path for files to be loaded. */
74Lisp_Object Vload_path;
75
ae321d28
RS
76/* This is the user-visible association list that maps features to
77 lists of defs in their load files. */
78Lisp_Object Vload_history;
79
80/* This is useud to build the load history. */
81Lisp_Object Vcurrent_load_list;
82
d2c6be7f
RS
83/* List of descriptors now open for Fload. */
84static Lisp_Object load_descriptor_list;
85
078e7b4a
JB
86/* File for get_file_char to read from. Use by load */
87static FILE *instream;
88
89/* When nonzero, read conses in pure space */
90static int read_pure;
91
92/* For use within read-from-string (this reader is non-reentrant!!) */
93static int read_from_string_index;
94static int read_from_string_limit;
95\f
96/* Handle unreading and rereading of characters.
97 Write READCHAR to read a character,
98 UNREAD(c) to unread c to be read again. */
99
100#define READCHAR readchar (readcharfun)
101#define UNREAD(c) unreadchar (readcharfun, c)
102
103static int
104readchar (readcharfun)
105 Lisp_Object readcharfun;
106{
107 Lisp_Object tem;
108 register struct buffer *inbuffer;
109 register int c, mpos;
110
111 if (XTYPE (readcharfun) == Lisp_Buffer)
112 {
113 inbuffer = XBUFFER (readcharfun);
114
115 if (BUF_PT (inbuffer) >= BUF_ZV (inbuffer))
116 return -1;
117 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, BUF_PT (inbuffer));
118 SET_BUF_PT (inbuffer, BUF_PT (inbuffer) + 1);
119
120 return c;
121 }
122 if (XTYPE (readcharfun) == Lisp_Marker)
123 {
124 inbuffer = XMARKER (readcharfun)->buffer;
125
126 mpos = marker_position (readcharfun);
127
128 if (mpos > BUF_ZV (inbuffer) - 1)
129 return -1;
130 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, mpos);
131 if (mpos != BUF_GPT (inbuffer))
132 XMARKER (readcharfun)->bufpos++;
133 else
134 Fset_marker (readcharfun, make_number (mpos + 1),
135 Fmarker_buffer (readcharfun));
136 return c;
137 }
138 if (EQ (readcharfun, Qget_file_char))
139 return getc (instream);
140
141 if (XTYPE (readcharfun) == Lisp_String)
142 {
143 register int c;
144 /* This used to be return of a conditional expression,
145 but that truncated -1 to a char on VMS. */
146 if (read_from_string_index < read_from_string_limit)
147 c = XSTRING (readcharfun)->data[read_from_string_index++];
148 else
149 c = -1;
150 return c;
151 }
152
153 tem = call0 (readcharfun);
154
265a9e55 155 if (NILP (tem))
078e7b4a
JB
156 return -1;
157 return XINT (tem);
158}
159
160/* Unread the character C in the way appropriate for the stream READCHARFUN.
161 If the stream is a user function, call it with the char as argument. */
162
163static void
164unreadchar (readcharfun, c)
165 Lisp_Object readcharfun;
166 int c;
167{
92fddec9
KH
168 if (c == -1)
169 /* Don't back up the pointer if we're unreading the end-of-input mark,
170 since readchar didn't advance it when we read it. */
171 ;
172 else if (XTYPE (readcharfun) == Lisp_Buffer)
078e7b4a
JB
173 {
174 if (XBUFFER (readcharfun) == current_buffer)
175 SET_PT (point - 1);
176 else
177 SET_BUF_PT (XBUFFER (readcharfun), BUF_PT (XBUFFER (readcharfun)) - 1);
178 }
179 else if (XTYPE (readcharfun) == Lisp_Marker)
180 XMARKER (readcharfun)->bufpos--;
181 else if (XTYPE (readcharfun) == Lisp_String)
182 read_from_string_index--;
183 else if (EQ (readcharfun, Qget_file_char))
184 ungetc (c, instream);
185 else
186 call1 (readcharfun, make_number (c));
187}
188
189static Lisp_Object read0 (), read1 (), read_list (), read_vector ();
190\f
191/* get a character from the tty */
192
3d9b22be
JB
193extern Lisp_Object read_char ();
194
f42be754
JB
195/* Read input events until we get one that's acceptable for our purposes.
196
197 If NO_SWITCH_FRAME is non-zero, switch-frame events are stashed
198 until we get a character we like, and then stuffed into
199 unread_switch_frame.
200
201 If ASCII_REQUIRED is non-zero, we check function key events to see
202 if the unmodified version of the symbol has a Qascii_character
203 property, and use that character, if present.
204
205 If ERROR_NONASCII is non-zero, we signal an error if the input we
206 get isn't an ASCII character with modifiers. If it's zero but
207 ASCII_REQUIRED is non-zero, we just re-read until we get an ASCII
208 character. */
209Lisp_Object
210read_filtered_event (no_switch_frame, ascii_required, error_nonascii)
211 int no_switch_frame, ascii_required, error_nonascii;
212{
213#ifdef standalone
214 return make_number (getchar ());
215#else
153a17b7
KH
216 register Lisp_Object val, delayed_switch_frame;
217
218 delayed_switch_frame = Qnil;
f42be754
JB
219
220 /* Read until we get an acceptable event. */
221 retry:
222 val = read_char (0, 0, 0, Qnil, 0);
223
6c82d689
KH
224 if (XTYPE (val) == Lisp_Buffer)
225 goto retry;
226
f42be754
JB
227 /* switch-frame events are put off until after the next ASCII
228 character. This is better than signalling an error just because
229 the last characters were typed to a separate minibuffer frame,
230 for example. Eventually, some code which can deal with
231 switch-frame events will read it and process it. */
232 if (no_switch_frame
233 && EVENT_HAS_PARAMETERS (val)
234 && EQ (EVENT_HEAD (val), Qswitch_frame))
235 {
236 delayed_switch_frame = val;
237 goto retry;
238 }
239
240 if (ascii_required)
241 {
242 /* Convert certain symbols to their ASCII equivalents. */
243 if (XTYPE (val) == Lisp_Symbol)
244 {
245 Lisp_Object tem, tem1, tem2;
246 tem = Fget (val, Qevent_symbol_element_mask);
247 if (!NILP (tem))
248 {
249 tem1 = Fget (Fcar (tem), Qascii_character);
250 /* Merge this symbol's modifier bits
251 with the ASCII equivalent of its basic code. */
252 if (!NILP (tem1))
253 XFASTINT (val) = XINT (tem1) | XINT (Fcar (Fcdr (tem)));
254 }
255 }
256
257 /* If we don't have a character now, deal with it appropriately. */
258 if (XTYPE (val) != Lisp_Int)
259 {
260 if (error_nonascii)
261 {
262 unread_command_events = Fcons (val, Qnil);
263 error ("Non-character input-event");
264 }
265 else
266 goto retry;
267 }
268 }
269
270 if (! NILP (delayed_switch_frame))
271 unread_switch_frame = delayed_switch_frame;
272
273 return val;
274#endif
275}
276
078e7b4a
JB
277DEFUN ("read-char", Fread_char, Sread_char, 0, 0, 0,
278 "Read a character from the command input (keyboard or macro).\n\
e51e47f7
JB
279It is returned as a number.\n\
280If the user generates an event which is not a character (i.e. a mouse\n\
e37c0805
JB
281click or function key event), `read-char' signals an error. As an\n\
282exception, switch-frame events are put off until non-ASCII events can\n\
283be read.\n\
284If you want to read non-character events, or ignore them, call\n\
285`read-event' or `read-char-exclusive' instead.")
078e7b4a
JB
286 ()
287{
f42be754 288 return read_filtered_event (1, 1, 1);
078e7b4a
JB
289}
290
078e7b4a
JB
291DEFUN ("read-event", Fread_event, Sread_event, 0, 0, 0,
292 "Read an event object from the input stream.")
293 ()
294{
f42be754 295 return read_filtered_event (0, 0, 0);
078e7b4a
JB
296}
297
298DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 0, 0,
299 "Read a character from the command input (keyboard or macro).\n\
300It is returned as a number. Non character events are ignored.")
301 ()
302{
f42be754 303 return read_filtered_event (1, 1, 0);
078e7b4a 304}
078e7b4a
JB
305
306DEFUN ("get-file-char", Fget_file_char, Sget_file_char, 0, 0, 0,
307 "Don't use this yourself.")
308 ()
309{
310 register Lisp_Object val;
311 XSET (val, Lisp_Int, getc (instream));
312 return val;
313}
314\f
315static void readevalloop ();
316static Lisp_Object load_unwind ();
d2c6be7f 317static Lisp_Object load_descriptor_unwind ();
078e7b4a
JB
318
319DEFUN ("load", Fload, Sload, 1, 4, 0,
320 "Execute a file of Lisp code named FILE.\n\
321First try FILE with `.elc' appended, then try with `.el',\n\
322 then try FILE unmodified.\n\
323This function searches the directories in `load-path'.\n\
324If optional second arg NOERROR is non-nil,\n\
325 report no error if FILE doesn't exist.\n\
326Print messages at start and end of loading unless\n\
327 optional third arg NOMESSAGE is non-nil.\n\
328If optional fourth arg NOSUFFIX is non-nil, don't try adding\n\
329 suffixes `.elc' or `.el' to the specified name FILE.\n\
330Return t if file exists.")
331 (str, noerror, nomessage, nosuffix)
332 Lisp_Object str, noerror, nomessage, nosuffix;
333{
334 register FILE *stream;
335 register int fd = -1;
336 register Lisp_Object lispstream;
337 register FILE **ptr;
338 int count = specpdl_ptr - specpdl;
339 Lisp_Object temp;
340 struct gcpro gcpro1;
341 Lisp_Object found;
51ac6f83
RS
342 /* 1 means inhibit the message at the beginning. */
343 int nomessage1 = 0;
c2225d00 344 Lisp_Object handler;
23a71bd6
RS
345#ifdef MSDOS
346 char *dosmode = "rt";
347#endif
078e7b4a
JB
348
349 CHECK_STRING (str, 0);
350 str = Fsubstitute_in_file_name (str);
351
c2225d00 352 /* If file name is magic, call the handler. */
a617e913 353 handler = Ffind_file_name_handler (str, Qload);
c2225d00 354 if (!NILP (handler))
8a2c760a 355 return call5 (handler, Qload, str, noerror, nomessage, nosuffix);
c2225d00 356
078e7b4a
JB
357 /* Avoid weird lossage with null string as arg,
358 since it would try to load a directory as a Lisp file */
359 if (XSTRING (str)->size > 0)
360 {
5a6e5452 361 GCPRO1 (str);
265a9e55 362 fd = openp (Vload_path, str, !NILP (nosuffix) ? "" : ".elc:.el:",
078e7b4a 363 &found, 0);
5a6e5452 364 UNGCPRO;
078e7b4a
JB
365 }
366
367 if (fd < 0)
368 {
265a9e55 369 if (NILP (noerror))
078e7b4a
JB
370 while (1)
371 Fsignal (Qfile_error, Fcons (build_string ("Cannot open load file"),
372 Fcons (str, Qnil)));
373 else
374 return Qnil;
375 }
376
377 if (!bcmp (&(XSTRING (found)->data[XSTRING (found)->size - 4]),
378 ".elc", 4))
379 {
380 struct stat s1, s2;
381 int result;
382
23a71bd6
RS
383#ifdef MSDOS
384 dosmode = "rb";
385#endif
4ff37b08 386 stat ((char *)XSTRING (found)->data, &s1);
078e7b4a 387 XSTRING (found)->data[XSTRING (found)->size - 1] = 0;
4ff37b08 388 result = stat ((char *)XSTRING (found)->data, &s2);
078e7b4a 389 if (result >= 0 && (unsigned) s1.st_mtime < (unsigned) s2.st_mtime)
51ac6f83
RS
390 {
391 message ("Source file `%s' newer than byte-compiled file",
392 XSTRING (found)->data);
393 /* Don't immediately overwrite this message. */
394 if (!noninteractive)
395 nomessage1 = 1;
396 }
078e7b4a
JB
397 XSTRING (found)->data[XSTRING (found)->size - 1] = 'c';
398 }
399
23a71bd6
RS
400#ifdef MSDOS
401 close (fd);
402 stream = fopen ((char *) XSTRING (found)->data, dosmode);
403#else
078e7b4a 404 stream = fdopen (fd, "r");
23a71bd6 405#endif
078e7b4a
JB
406 if (stream == 0)
407 {
408 close (fd);
409 error ("Failure to create stdio stream for %s", XSTRING (str)->data);
410 }
411
51ac6f83 412 if (NILP (nomessage) && !nomessage1)
078e7b4a
JB
413 message ("Loading %s...", XSTRING (str)->data);
414
415 GCPRO1 (str);
416 /* We may not be able to store STREAM itself as a Lisp_Object pointer
417 since that is guaranteed to work only for data that has been malloc'd.
418 So malloc a full-size pointer, and record the address of that pointer. */
419 ptr = (FILE **) xmalloc (sizeof (FILE *));
420 *ptr = stream;
421 XSET (lispstream, Lisp_Internal_Stream, (int) ptr);
422 record_unwind_protect (load_unwind, lispstream);
d2c6be7f
RS
423 record_unwind_protect (load_descriptor_unwind, load_descriptor_list);
424 load_descriptor_list
425 = Fcons (make_number (fileno (stream)), load_descriptor_list);
078e7b4a 426 load_in_progress++;
ae321d28 427 readevalloop (Qget_file_char, stream, str, Feval, 0);
078e7b4a
JB
428 unbind_to (count, Qnil);
429
430 /* Run any load-hooks for this file. */
431 temp = Fassoc (str, Vafter_load_alist);
265a9e55 432 if (!NILP (temp))
078e7b4a
JB
433 Fprogn (Fcdr (temp));
434 UNGCPRO;
435
265a9e55 436 if (!noninteractive && NILP (nomessage))
078e7b4a
JB
437 message ("Loading %s...done", XSTRING (str)->data);
438 return Qt;
439}
440
441static Lisp_Object
442load_unwind (stream) /* used as unwind-protect function in load */
443 Lisp_Object stream;
444{
445 fclose (*(FILE **) XSTRING (stream));
9ac0d9e0 446 xfree (XPNTR (stream));
078e7b4a
JB
447 if (--load_in_progress < 0) load_in_progress = 0;
448 return Qnil;
449}
450
d2c6be7f
RS
451static Lisp_Object
452load_descriptor_unwind (oldlist)
453 Lisp_Object oldlist;
454{
455 load_descriptor_list = oldlist;
456}
457
458/* Close all descriptors in use for Floads.
459 This is used when starting a subprocess. */
460
461void
462close_load_descs ()
463{
464 Lisp_Object tail;
465 for (tail = load_descriptor_list; !NILP (tail); tail = XCONS (tail)->cdr)
466 close (XFASTINT (XCONS (tail)->car));
467}
078e7b4a
JB
468\f
469static int
470complete_filename_p (pathname)
471 Lisp_Object pathname;
472{
473 register unsigned char *s = XSTRING (pathname)->data;
474 return (*s == '/'
475#ifdef ALTOS
476 || *s == '@'
477#endif
478#ifdef VMS
479 || index (s, ':')
480#endif /* VMS */
23a71bd6
RS
481#ifdef MSDOS /* MW, May 1993 */
482 || (s[0] != '\0' && s[1] == ':' && s[2] == '/')
483#endif
078e7b4a
JB
484 );
485}
486
487/* Search for a file whose name is STR, looking in directories
488 in the Lisp list PATH, and trying suffixes from SUFFIX.
489 SUFFIX is a string containing possible suffixes separated by colons.
490 On success, returns a file descriptor. On failure, returns -1.
491
492 EXEC_ONLY nonzero means don't open the files,
493 just look for one that is executable. In this case,
494 returns 1 on success.
495
496 If STOREPTR is nonzero, it points to a slot where the name of
497 the file actually found should be stored as a Lisp string.
498 Nil is stored there on failure. */
499
500int
501openp (path, str, suffix, storeptr, exec_only)
502 Lisp_Object path, str;
503 char *suffix;
504 Lisp_Object *storeptr;
505 int exec_only;
506{
507 register int fd;
508 int fn_size = 100;
509 char buf[100];
510 register char *fn = buf;
511 int absolute = 0;
512 int want_size;
513 register Lisp_Object filename;
514 struct stat st;
5a6e5452 515 struct gcpro gcpro1;
078e7b4a 516
5a6e5452 517 GCPRO1 (str);
078e7b4a
JB
518 if (storeptr)
519 *storeptr = Qnil;
520
521 if (complete_filename_p (str))
522 absolute = 1;
523
265a9e55 524 for (; !NILP (path); path = Fcdr (path))
078e7b4a
JB
525 {
526 char *nsuffix;
527
528 filename = Fexpand_file_name (str, Fcar (path));
529 if (!complete_filename_p (filename))
530 /* If there are non-absolute elts in PATH (eg ".") */
531 /* Of course, this could conceivably lose if luser sets
532 default-directory to be something non-absolute... */
533 {
534 filename = Fexpand_file_name (filename, current_buffer->directory);
535 if (!complete_filename_p (filename))
536 /* Give up on this path element! */
537 continue;
538 }
539
540 /* Calculate maximum size of any filename made from
541 this path element/specified file name and any possible suffix. */
542 want_size = strlen (suffix) + XSTRING (filename)->size + 1;
543 if (fn_size < want_size)
544 fn = (char *) alloca (fn_size = 100 + want_size);
545
546 nsuffix = suffix;
547
548 /* Loop over suffixes. */
549 while (1)
550 {
551 char *esuffix = (char *) index (nsuffix, ':');
552 int lsuffix = esuffix ? esuffix - nsuffix : strlen (nsuffix);
553
554 /* Concatenate path element/specified name with the suffix. */
555 strncpy (fn, XSTRING (filename)->data, XSTRING (filename)->size);
556 fn[XSTRING (filename)->size] = 0;
557 if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
558 strncat (fn, nsuffix, lsuffix);
559
560 /* Ignore file if it's a directory. */
561 if (stat (fn, &st) >= 0
562 && (st.st_mode & S_IFMT) != S_IFDIR)
563 {
564 /* Check that we can access or open it. */
565 if (exec_only)
566 fd = (access (fn, X_OK) == 0) ? 1 : -1;
567 else
568 fd = open (fn, 0, 0);
569
570 if (fd >= 0)
571 {
572 /* We succeeded; return this descriptor and filename. */
573 if (storeptr)
574 *storeptr = build_string (fn);
5a6e5452 575 RETURN_UNGCPRO (fd);
078e7b4a
JB
576 }
577 }
578
579 /* Advance to next suffix. */
580 if (esuffix == 0)
581 break;
582 nsuffix += lsuffix + 1;
583 }
5a6e5452
KH
584 if (absolute)
585 RETURN_UNGCPRO (-1);
078e7b4a
JB
586 }
587
5a6e5452 588 RETURN_UNGCPRO (-1);
078e7b4a
JB
589}
590
591\f
ae321d28
RS
592/* Merge the list we've accumulated of globals from the current input source
593 into the load_history variable. The details depend on whether
594 the source has an associated file name or not. */
595
596static void
597build_load_history (stream, source)
598 FILE *stream;
599 Lisp_Object source;
600{
601 register Lisp_Object tail, prev, newelt;
602 register Lisp_Object tem, tem2;
603 register int foundit, loading;
604
8a1f1537
RS
605 /* Don't bother recording anything for preloaded files. */
606 if (!NILP (Vpurify_flag))
607 return;
608
ae321d28
RS
609 loading = stream || !NARROWED;
610
611 tail = Vload_history;
612 prev = Qnil;
613 foundit = 0;
614 while (!NILP (tail))
615 {
616 tem = Fcar (tail);
617
618 /* Find the feature's previous assoc list... */
619 if (!NILP (Fequal (source, Fcar (tem))))
620 {
621 foundit = 1;
622
623 /* If we're loading, remove it. */
624 if (loading)
625 {
626 if (NILP (prev))
627 Vload_history = Fcdr (tail);
628 else
629 Fsetcdr (prev, Fcdr (tail));
630 }
631
632 /* Otherwise, cons on new symbols that are not already members. */
633 else
634 {
635 tem2 = Vcurrent_load_list;
636
637 while (CONSP (tem2))
638 {
639 newelt = Fcar (tem2);
640
641 if (NILP (Fmemq (newelt, tem)))
642 Fsetcar (tail, Fcons (Fcar (tem),
643 Fcons (newelt, Fcdr (tem))));
644
645 tem2 = Fcdr (tem2);
646 QUIT;
647 }
648 }
649 }
650 else
651 prev = tail;
652 tail = Fcdr (tail);
653 QUIT;
654 }
655
8a1f1537
RS
656 /* If we're loading, cons the new assoc onto the front of load-history,
657 the most-recently-loaded position. Also do this if we didn't find
658 an existing member for the current source. */
659 if (loading || !foundit)
660 Vload_history = Fcons (Fnreverse (Vcurrent_load_list),
661 Vload_history);
ae321d28
RS
662}
663
078e7b4a
JB
664Lisp_Object
665unreadpure () /* Used as unwind-protect function in readevalloop */
666{
667 read_pure = 0;
668 return Qnil;
669}
670
671static void
ae321d28 672readevalloop (readcharfun, stream, sourcename, evalfun, printflag)
078e7b4a 673 Lisp_Object readcharfun;
ae321d28
RS
674 FILE *stream;
675 Lisp_Object sourcename;
078e7b4a
JB
676 Lisp_Object (*evalfun) ();
677 int printflag;
678{
679 register int c;
680 register Lisp_Object val;
681 int count = specpdl_ptr - specpdl;
8a1f1537 682 struct gcpro gcpro1;
49cf7ff4
RS
683 struct buffer *b = 0;
684
685 if (BUFFERP (readcharfun))
686 b = XBUFFER (readcharfun);
687 else if (MARKERP (readcharfun))
688 b = XMARKER (readcharfun)->buffer;
078e7b4a
JB
689
690 specbind (Qstandard_input, readcharfun);
8a1f1537 691 specbind (Qcurrent_load_list, Qnil);
078e7b4a 692
8a1f1537 693 GCPRO1 (sourcename);
ae321d28 694
ae321d28
RS
695 LOADHIST_ATTACH (sourcename);
696
078e7b4a
JB
697 while (1)
698 {
49cf7ff4
RS
699 if (b != 0 && NILP (b->name))
700 error ("Reading from killed buffer");
701
078e7b4a
JB
702 instream = stream;
703 c = READCHAR;
704 if (c == ';')
705 {
706 while ((c = READCHAR) != '\n' && c != -1);
707 continue;
708 }
709 if (c < 0) break;
710 if (c == ' ' || c == '\t' || c == '\n' || c == '\f') continue;
711
265a9e55 712 if (!NILP (Vpurify_flag) && c == '(')
078e7b4a
JB
713 {
714 record_unwind_protect (unreadpure, Qnil);
715 val = read_list (-1, readcharfun);
716 unbind_to (count + 1, Qnil);
717 }
718 else
719 {
720 UNREAD (c);
721 val = read0 (readcharfun);
722 }
723
724 val = (*evalfun) (val);
725 if (printflag)
726 {
727 Vvalues = Fcons (val, Vvalues);
728 if (EQ (Vstandard_output, Qt))
729 Fprin1 (val, Qnil);
730 else
731 Fprint (val, Qnil);
732 }
733 }
734
ae321d28 735 build_load_history (stream, sourcename);
ae321d28
RS
736 UNGCPRO;
737
078e7b4a
JB
738 unbind_to (count, Qnil);
739}
740
741#ifndef standalone
742
e5d77022 743DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 2, "",
94b304d7
RS
744 "Execute the current buffer as Lisp code.\n\
745Programs can pass two arguments, BUFFER and PRINTFLAG.\n\
746BUFFER is the buffer to evaluate (nil means use current buffer).\n\
747PRINTFLAG controls printing of output:\n\
228d4b1c
JA
748nil means discard it; anything else is stream for print.\n\
749\n\
750If there is no error, point does not move. If there is an error,\n\
751point remains at the end of the last character read from the buffer.")
752 (bufname, printflag)
753 Lisp_Object bufname, printflag;
754{
755 int count = specpdl_ptr - specpdl;
756 Lisp_Object tem, buf;
757
dfdb645c 758 if (NILP (bufname))
228d4b1c
JA
759 buf = Fcurrent_buffer ();
760 else
761 buf = Fget_buffer (bufname);
dfdb645c 762 if (NILP (buf))
228d4b1c
JA
763 error ("No such buffer.");
764
dfdb645c 765 if (NILP (printflag))
228d4b1c
JA
766 tem = Qsymbolp;
767 else
768 tem = printflag;
769 specbind (Qstandard_output, tem);
770 record_unwind_protect (save_excursion_restore, save_excursion_save ());
771 BUF_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
ae321d28 772 readevalloop (buf, 0, XBUFFER (buf)->filename, Feval, !NILP (printflag));
cb09ab7a 773 unbind_to (count, Qnil);
228d4b1c
JA
774
775 return Qnil;
776}
777
778#if 0
078e7b4a
JB
779DEFUN ("eval-current-buffer", Feval_current_buffer, Seval_current_buffer, 0, 1, "",
780 "Execute the current buffer as Lisp code.\n\
781Programs can pass argument PRINTFLAG which controls printing of output:\n\
782nil means discard it; anything else is stream for print.\n\
783\n\
784If there is no error, point does not move. If there is an error,\n\
785point remains at the end of the last character read from the buffer.")
786 (printflag)
787 Lisp_Object printflag;
788{
789 int count = specpdl_ptr - specpdl;
ae321d28
RS
790 Lisp_Object tem, cbuf;
791
792 cbuf = Fcurrent_buffer ()
078e7b4a 793
265a9e55 794 if (NILP (printflag))
078e7b4a
JB
795 tem = Qsymbolp;
796 else
797 tem = printflag;
798 specbind (Qstandard_output, tem);
799 record_unwind_protect (save_excursion_restore, save_excursion_save ());
800 SET_PT (BEGV);
ae321d28 801 readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, !NILP (printflag));
078e7b4a
JB
802 return unbind_to (count, Qnil);
803}
228d4b1c 804#endif
078e7b4a
JB
805
806DEFUN ("eval-region", Feval_region, Seval_region, 2, 3, "r",
807 "Execute the region as Lisp code.\n\
808When called from programs, expects two arguments,\n\
809giving starting and ending indices in the current buffer\n\
810of the text to be executed.\n\
811Programs can pass third argument PRINTFLAG which controls output:\n\
812nil means discard it; anything else is stream for printing it.\n\
813\n\
814If there is no error, point does not move. If there is an error,\n\
815point remains at the end of the last character read from the buffer.")
816 (b, e, printflag)
817 Lisp_Object b, e, printflag;
818{
819 int count = specpdl_ptr - specpdl;
ae321d28
RS
820 Lisp_Object tem, cbuf;
821
822 cbuf = Fcurrent_buffer ();
078e7b4a 823
265a9e55 824 if (NILP (printflag))
078e7b4a
JB
825 tem = Qsymbolp;
826 else
827 tem = printflag;
828 specbind (Qstandard_output, tem);
829
265a9e55 830 if (NILP (printflag))
078e7b4a
JB
831 record_unwind_protect (save_excursion_restore, save_excursion_save ());
832 record_unwind_protect (save_restriction_restore, save_restriction_save ());
833
834 /* This both uses b and checks its type. */
835 Fgoto_char (b);
836 Fnarrow_to_region (make_number (BEGV), e);
ae321d28 837 readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, !NILP (printflag));
078e7b4a
JB
838
839 return unbind_to (count, Qnil);
840}
841
842#endif /* standalone */
843\f
844DEFUN ("read", Fread, Sread, 0, 1, 0,
845 "Read one Lisp expression as text from STREAM, return as Lisp object.\n\
846If STREAM is nil, use the value of `standard-input' (which see).\n\
847STREAM or the value of `standard-input' may be:\n\
848 a buffer (read from point and advance it)\n\
849 a marker (read from where it points and advance it)\n\
850 a function (call it with no arguments for each character,\n\
851 call it with a char as argument to push a char back)\n\
852 a string (takes text from string, starting at the beginning)\n\
853 t (read text line using minibuffer and use it).")
854 (readcharfun)
855 Lisp_Object readcharfun;
856{
857 extern Lisp_Object Fread_minibuffer ();
858
265a9e55 859 if (NILP (readcharfun))
078e7b4a
JB
860 readcharfun = Vstandard_input;
861 if (EQ (readcharfun, Qt))
862 readcharfun = Qread_char;
863
864#ifndef standalone
865 if (EQ (readcharfun, Qread_char))
866 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil);
867#endif
868
869 if (XTYPE (readcharfun) == Lisp_String)
870 return Fcar (Fread_from_string (readcharfun, Qnil, Qnil));
871
872 return read0 (readcharfun);
873}
874
875DEFUN ("read-from-string", Fread_from_string, Sread_from_string, 1, 3, 0,
876 "Read one Lisp expression which is represented as text by STRING.\n\
877Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).\n\
878START and END optionally delimit a substring of STRING from which to read;\n\
879 they default to 0 and (length STRING) respectively.")
880 (string, start, end)
881 Lisp_Object string, start, end;
882{
883 int startval, endval;
884 Lisp_Object tem;
885
886 CHECK_STRING (string,0);
887
265a9e55 888 if (NILP (end))
078e7b4a
JB
889 endval = XSTRING (string)->size;
890 else
891 { CHECK_NUMBER (end,2);
892 endval = XINT (end);
893 if (endval < 0 || endval > XSTRING (string)->size)
894 args_out_of_range (string, end);
895 }
896
265a9e55 897 if (NILP (start))
078e7b4a
JB
898 startval = 0;
899 else
900 { CHECK_NUMBER (start,1);
901 startval = XINT (start);
902 if (startval < 0 || startval > endval)
903 args_out_of_range (string, start);
904 }
905
906 read_from_string_index = startval;
907 read_from_string_limit = endval;
908
909 tem = read0 (string);
910 return Fcons (tem, make_number (read_from_string_index));
911}
912\f
913/* Use this for recursive reads, in contexts where internal tokens are not allowed. */
914
915static Lisp_Object
916read0 (readcharfun)
917 Lisp_Object readcharfun;
918{
919 register Lisp_Object val;
920 char c;
921
922 val = read1 (readcharfun);
923 if (XTYPE (val) == Lisp_Internal)
924 {
925 c = XINT (val);
926 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (&c, 1), Qnil));
927 }
928
929 return val;
930}
931\f
932static int read_buffer_size;
933static char *read_buffer;
934
935static int
936read_escape (readcharfun)
937 Lisp_Object readcharfun;
938{
939 register int c = READCHAR;
940 switch (c)
941 {
942 case 'a':
265a9e55 943 return '\007';
078e7b4a
JB
944 case 'b':
945 return '\b';
f405a585
RS
946 case 'd':
947 return 0177;
078e7b4a
JB
948 case 'e':
949 return 033;
950 case 'f':
951 return '\f';
952 case 'n':
953 return '\n';
954 case 'r':
955 return '\r';
956 case 't':
957 return '\t';
958 case 'v':
959 return '\v';
960 case '\n':
961 return -1;
962
963 case 'M':
964 c = READCHAR;
965 if (c != '-')
966 error ("Invalid escape character syntax");
967 c = READCHAR;
968 if (c == '\\')
969 c = read_escape (readcharfun);
7bd279cd 970 return c | meta_modifier;
f405a585
RS
971
972 case 'S':
973 c = READCHAR;
974 if (c != '-')
975 error ("Invalid escape character syntax");
976 c = READCHAR;
977 if (c == '\\')
978 c = read_escape (readcharfun);
7bd279cd
RS
979 return c | shift_modifier;
980
981 case 'H':
982 c = READCHAR;
983 if (c != '-')
984 error ("Invalid escape character syntax");
985 c = READCHAR;
986 if (c == '\\')
987 c = read_escape (readcharfun);
988 return c | hyper_modifier;
989
990 case 'A':
991 c = READCHAR;
992 if (c != '-')
993 error ("Invalid escape character syntax");
994 c = READCHAR;
995 if (c == '\\')
996 c = read_escape (readcharfun);
997 return c | alt_modifier;
998
999 case 's':
1000 c = READCHAR;
1001 if (c != '-')
1002 error ("Invalid escape character syntax");
1003 c = READCHAR;
1004 if (c == '\\')
1005 c = read_escape (readcharfun);
1006 return c | super_modifier;
078e7b4a
JB
1007
1008 case 'C':
1009 c = READCHAR;
1010 if (c != '-')
1011 error ("Invalid escape character syntax");
1012 case '^':
1013 c = READCHAR;
1014 if (c == '\\')
1015 c = read_escape (readcharfun);
f405a585
RS
1016 if ((c & 0177) == '?')
1017 return 0177 | c;
1018 /* ASCII control chars are made from letters (both cases),
1019 as well as the non-letters within 0100...0137. */
1020 else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
1021 return (c & (037 | ~0177));
1022 else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
1023 return (c & (037 | ~0177));
078e7b4a 1024 else
7bd279cd 1025 return c | ctrl_modifier;
078e7b4a
JB
1026
1027 case '0':
1028 case '1':
1029 case '2':
1030 case '3':
1031 case '4':
1032 case '5':
1033 case '6':
1034 case '7':
1035 /* An octal escape, as in ANSI C. */
1036 {
1037 register int i = c - '0';
1038 register int count = 0;
1039 while (++count < 3)
1040 {
1041 if ((c = READCHAR) >= '0' && c <= '7')
1042 {
1043 i *= 8;
1044 i += c - '0';
1045 }
1046 else
1047 {
1048 UNREAD (c);
1049 break;
1050 }
1051 }
1052 return i;
1053 }
1054
1055 case 'x':
1056 /* A hex escape, as in ANSI C. */
1057 {
1058 int i = 0;
1059 while (1)
1060 {
1061 c = READCHAR;
1062 if (c >= '0' && c <= '9')
1063 {
1064 i *= 16;
1065 i += c - '0';
1066 }
1067 else if ((c >= 'a' && c <= 'f')
1068 || (c >= 'A' && c <= 'F'))
1069 {
1070 i *= 16;
1071 if (c >= 'a' && c <= 'f')
1072 i += c - 'a' + 10;
1073 else
1074 i += c - 'A' + 10;
1075 }
1076 else
1077 {
1078 UNREAD (c);
1079 break;
1080 }
1081 }
1082 return i;
1083 }
1084
1085 default:
1086 return c;
1087 }
1088}
1089
1090static Lisp_Object
1091read1 (readcharfun)
1092 register Lisp_Object readcharfun;
1093{
1094 register int c;
1095
1096 retry:
1097
1098 c = READCHAR;
1099 if (c < 0) return Fsignal (Qend_of_file, Qnil);
1100
1101 switch (c)
1102 {
1103 case '(':
1104 return read_list (0, readcharfun);
1105
1106 case '[':
1107 return read_vector (readcharfun);
1108
1109 case ')':
1110 case ']':
078e7b4a
JB
1111 {
1112 register Lisp_Object val;
1113 XSET (val, Lisp_Internal, c);
1114 return val;
1115 }
1116
1117 case '#':
200f684e
RS
1118 c = READCHAR;
1119 if (c == '[')
1120 {
1121 /* Accept compiled functions at read-time so that we don't have to
1122 build them using function calls. */
748ef62f
RS
1123 Lisp_Object tmp;
1124 tmp = read_vector (readcharfun);
1125 return Fmake_byte_code (XVECTOR (tmp)->size,
1126 XVECTOR (tmp)->contents);
200f684e 1127 }
748ef62f
RS
1128#ifdef USE_TEXT_PROPERTIES
1129 if (c == '(')
1130 {
1131 Lisp_Object tmp;
1132 struct gcpro gcpro1;
1133
1134 /* Read the string itself. */
1135 tmp = read1 (readcharfun);
1136 if (XTYPE (tmp) != Lisp_String)
1137 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
1138 GCPRO1 (tmp);
1139 /* Read the intervals and their properties. */
1140 while (1)
1141 {
1142 Lisp_Object beg, end, plist;
1143
1144 beg = read1 (readcharfun);
1145 if (XTYPE (beg) == Lisp_Internal)
1146 {
1147 if (XINT (beg) == ')')
1148 break;
1149 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("invalid string property list", 28), Qnil));
1150 }
1151 end = read1 (readcharfun);
1152 if (XTYPE (end) == Lisp_Internal)
1153 Fsignal (Qinvalid_read_syntax,
1154 Fcons (make_string ("invalid string property list", 28), Qnil));
1155
1156 plist = read1 (readcharfun);
1157 if (XTYPE (plist) == Lisp_Internal)
1158 Fsignal (Qinvalid_read_syntax,
1159 Fcons (make_string ("invalid string property list", 28), Qnil));
1160 Fset_text_properties (beg, end, plist, tmp);
1161 }
1162 UNGCPRO;
1163 return tmp;
1164 }
1165#endif
200f684e 1166 UNREAD (c);
748ef62f 1167 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
078e7b4a
JB
1168
1169 case ';':
1170 while ((c = READCHAR) >= 0 && c != '\n');
1171 goto retry;
1172
1173 case '\'':
1174 {
1175 return Fcons (Qquote, Fcons (read0 (readcharfun), Qnil));
1176 }
1177
1178 case '?':
1179 {
1180 register Lisp_Object val;
1181
1182 c = READCHAR;
1183 if (c < 0) return Fsignal (Qend_of_file, Qnil);
1184
1185 if (c == '\\')
1186 XSET (val, Lisp_Int, read_escape (readcharfun));
1187 else
1188 XSET (val, Lisp_Int, c);
1189
1190 return val;
1191 }
1192
1193 case '\"':
1194 {
1195 register char *p = read_buffer;
1196 register char *end = read_buffer + read_buffer_size;
1197 register int c;
1198 int cancel = 0;
1199
1200 while ((c = READCHAR) >= 0
1201 && c != '\"')
1202 {
1203 if (p == end)
1204 {
1205 char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
1206 p += new - read_buffer;
1207 read_buffer += new - read_buffer;
1208 end = read_buffer + read_buffer_size;
1209 }
1210 if (c == '\\')
1211 c = read_escape (readcharfun);
1212 /* c is -1 if \ newline has just been seen */
f405a585 1213 if (c == -1)
078e7b4a
JB
1214 {
1215 if (p == read_buffer)
1216 cancel = 1;
1217 }
1218 else
f943104a
KH
1219 {
1220 if (c & CHAR_META)
1221 /* Move the meta bit to the right place for a string. */
1222 c = (c & ~CHAR_META) | 0x80;
1223 if (c & ~0xff)
1224 error ("Invalid modifier in string");
1225 *p++ = c;
1226 }
078e7b4a
JB
1227 }
1228 if (c < 0) return Fsignal (Qend_of_file, Qnil);
1229
1230 /* If purifying, and string starts with \ newline,
1231 return zero instead. This is for doc strings
08564963 1232 that we are really going to find in etc/DOC.nn.nn */
265a9e55 1233 if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
078e7b4a
JB
1234 return make_number (0);
1235
1236 if (read_pure)
1237 return make_pure_string (read_buffer, p - read_buffer);
1238 else
1239 return make_string (read_buffer, p - read_buffer);
1240 }
1241
109d300c
JB
1242 case '.':
1243 {
1244#ifdef LISP_FLOAT_TYPE
1245 /* If a period is followed by a number, then we should read it
1246 as a floating point number. Otherwise, it denotes a dotted
1247 pair. */
1248 int next_char = READCHAR;
1249 UNREAD (next_char);
1250
1251 if (! isdigit (next_char))
1252#endif
1253 {
1254 register Lisp_Object val;
1255 XSET (val, Lisp_Internal, c);
1256 return val;
1257 }
1258
1259 /* Otherwise, we fall through! Note that the atom-reading loop
1260 below will now loop at least once, assuring that we will not
1261 try to UNREAD two characters in a row. */
1262 }
078e7b4a
JB
1263 default:
1264 if (c <= 040) goto retry;
1265 {
1266 register char *p = read_buffer;
481c6336 1267 int quoted = 0;
078e7b4a
JB
1268
1269 {
1270 register char *end = read_buffer + read_buffer_size;
1271
1272 while (c > 040 &&
1273 !(c == '\"' || c == '\'' || c == ';' || c == '?'
1274 || c == '(' || c == ')'
109d300c
JB
1275#ifndef LISP_FLOAT_TYPE
1276 /* If we have floating-point support, then we need
1277 to allow <digits><dot><digits>. */
078e7b4a
JB
1278 || c =='.'
1279#endif /* not LISP_FLOAT_TYPE */
1280 || c == '[' || c == ']' || c == '#'
1281 ))
1282 {
1283 if (p == end)
1284 {
1285 register char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
1286 p += new - read_buffer;
1287 read_buffer += new - read_buffer;
1288 end = read_buffer + read_buffer_size;
1289 }
1290 if (c == '\\')
481c6336
RS
1291 {
1292 c = READCHAR;
1293 quoted = 1;
1294 }
078e7b4a
JB
1295 *p++ = c;
1296 c = READCHAR;
1297 }
1298
1299 if (p == end)
1300 {
1301 char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
1302 p += new - read_buffer;
1303 read_buffer += new - read_buffer;
1304/* end = read_buffer + read_buffer_size; */
1305 }
1306 *p = 0;
1307 if (c >= 0)
1308 UNREAD (c);
1309 }
1310
481c6336
RS
1311 if (!quoted)
1312 {
1313 register char *p1;
1314 register Lisp_Object val;
1315 p1 = read_buffer;
1316 if (*p1 == '+' || *p1 == '-') p1++;
1317 /* Is it an integer? */
1318 if (p1 != p)
1319 {
1320 while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
dbc4e1c1 1321#ifdef LISP_FLOAT_TYPE
481c6336
RS
1322 /* Integers can have trailing decimal points. */
1323 if (p1 > read_buffer && p1 < p && *p1 == '.') p1++;
dbc4e1c1 1324#endif
481c6336
RS
1325 if (p1 == p)
1326 /* It is an integer. */
1327 {
dbc4e1c1 1328#ifdef LISP_FLOAT_TYPE
481c6336
RS
1329 if (p1[-1] == '.')
1330 p1[-1] = '\0';
dbc4e1c1 1331#endif
481c6336
RS
1332 XSET (val, Lisp_Int, atoi (read_buffer));
1333 return val;
1334 }
1335 }
078e7b4a 1336#ifdef LISP_FLOAT_TYPE
481c6336
RS
1337 if (isfloat_string (read_buffer))
1338 return make_float (atof (read_buffer));
078e7b4a 1339#endif
481c6336 1340 }
078e7b4a
JB
1341
1342 return intern (read_buffer);
1343 }
1344 }
1345}
1346\f
1347#ifdef LISP_FLOAT_TYPE
1348
078e7b4a
JB
1349#define LEAD_INT 1
1350#define DOT_CHAR 2
1351#define TRAIL_INT 4
1352#define E_CHAR 8
1353#define EXP_INT 16
1354
1355int
1356isfloat_string (cp)
1357 register char *cp;
1358{
1359 register state;
1360
1361 state = 0;
1362 if (*cp == '+' || *cp == '-')
1363 cp++;
1364
1365 if (isdigit(*cp))
1366 {
1367 state |= LEAD_INT;
1368 while (isdigit (*cp))
1369 cp ++;
1370 }
1371 if (*cp == '.')
1372 {
1373 state |= DOT_CHAR;
1374 cp++;
1375 }
1376 if (isdigit(*cp))
1377 {
1378 state |= TRAIL_INT;
1379 while (isdigit (*cp))
1380 cp++;
1381 }
1382 if (*cp == 'e')
1383 {
1384 state |= E_CHAR;
1385 cp++;
1386 }
1387 if ((*cp == '+') || (*cp == '-'))
1388 cp++;
1389
1390 if (isdigit (*cp))
1391 {
1392 state |= EXP_INT;
1393 while (isdigit (*cp))
1394 cp++;
1395 }
1396 return (*cp == 0
1397 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
151bdc83 1398 || state == (DOT_CHAR|TRAIL_INT)
078e7b4a 1399 || state == (LEAD_INT|E_CHAR|EXP_INT)
151bdc83
JB
1400 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)
1401 || state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
078e7b4a
JB
1402}
1403#endif /* LISP_FLOAT_TYPE */
1404\f
1405static Lisp_Object
1406read_vector (readcharfun)
1407 Lisp_Object readcharfun;
1408{
1409 register int i;
1410 register int size;
1411 register Lisp_Object *ptr;
1412 register Lisp_Object tem, vector;
1413 register struct Lisp_Cons *otem;
1414 Lisp_Object len;
1415
1416 tem = read_list (1, readcharfun);
1417 len = Flength (tem);
1418 vector = (read_pure ? make_pure_vector (XINT (len)) : Fmake_vector (len, Qnil));
1419
1420
1421 size = XVECTOR (vector)->size;
1422 ptr = XVECTOR (vector)->contents;
1423 for (i = 0; i < size; i++)
1424 {
1425 ptr[i] = read_pure ? Fpurecopy (Fcar (tem)) : Fcar (tem);
1426 otem = XCONS (tem);
1427 tem = Fcdr (tem);
1428 free_cons (otem);
1429 }
1430 return vector;
1431}
1432
1433/* flag = 1 means check for ] to terminate rather than ) and .
1434 flag = -1 means check for starting with defun
1435 and make structure pure. */
1436
1437static Lisp_Object
1438read_list (flag, readcharfun)
1439 int flag;
1440 register Lisp_Object readcharfun;
1441{
1442 /* -1 means check next element for defun,
1443 0 means don't check,
1444 1 means already checked and found defun. */
1445 int defunflag = flag < 0 ? -1 : 0;
1446 Lisp_Object val, tail;
1447 register Lisp_Object elt, tem;
1448 struct gcpro gcpro1, gcpro2;
1449
1450 val = Qnil;
1451 tail = Qnil;
1452
1453 while (1)
1454 {
1455 GCPRO2 (val, tail);
1456 elt = read1 (readcharfun);
1457 UNGCPRO;
1458 if (XTYPE (elt) == Lisp_Internal)
1459 {
1460 if (flag > 0)
1461 {
1462 if (XINT (elt) == ']')
1463 return val;
1464 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (") or . in a vector", 18), Qnil));
1465 }
1466 if (XINT (elt) == ')')
1467 return val;
1468 if (XINT (elt) == '.')
1469 {
1470 GCPRO2 (val, tail);
265a9e55 1471 if (!NILP (tail))
078e7b4a
JB
1472 XCONS (tail)->cdr = read0 (readcharfun);
1473 else
1474 val = read0 (readcharfun);
1475 elt = read1 (readcharfun);
1476 UNGCPRO;
1477 if (XTYPE (elt) == Lisp_Internal && XINT (elt) == ')')
1478 return val;
1479 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil));
1480 }
1481 return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("] in a list", 11), Qnil));
1482 }
1483 tem = (read_pure && flag <= 0
1484 ? pure_cons (elt, Qnil)
1485 : Fcons (elt, Qnil));
265a9e55 1486 if (!NILP (tail))
078e7b4a
JB
1487 XCONS (tail)->cdr = tem;
1488 else
1489 val = tem;
1490 tail = tem;
1491 if (defunflag < 0)
1492 defunflag = EQ (elt, Qdefun);
1493 else if (defunflag > 0)
1494 read_pure = 1;
1495 }
1496}
1497\f
1498Lisp_Object Vobarray;
1499Lisp_Object initial_obarray;
1500
1501Lisp_Object
1502check_obarray (obarray)
1503 Lisp_Object obarray;
1504{
1505 while (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0)
1506 {
1507 /* If Vobarray is now invalid, force it to be valid. */
1508 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray;
1509
1510 obarray = wrong_type_argument (Qvectorp, obarray);
1511 }
1512 return obarray;
1513}
1514
1515static int hash_string ();
1516Lisp_Object oblookup ();
1517
1518Lisp_Object
1519intern (str)
1520 char *str;
1521{
1522 Lisp_Object tem;
1523 int len = strlen (str);
153a17b7 1524 Lisp_Object obarray;
078e7b4a 1525
153a17b7 1526 obarray = Vobarray;
078e7b4a
JB
1527 if (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0)
1528 obarray = check_obarray (obarray);
1529 tem = oblookup (obarray, str, len);
1530 if (XTYPE (tem) == Lisp_Symbol)
1531 return tem;
265a9e55 1532 return Fintern ((!NILP (Vpurify_flag)
078e7b4a
JB
1533 ? make_pure_string (str, len)
1534 : make_string (str, len)),
1535 obarray);
1536}
1537
1538DEFUN ("intern", Fintern, Sintern, 1, 2, 0,
1539 "Return the canonical symbol whose name is STRING.\n\
1540If there is none, one is created by this function and returned.\n\
1541A second optional argument specifies the obarray to use;\n\
1542it defaults to the value of `obarray'.")
1543 (str, obarray)
1544 Lisp_Object str, obarray;
1545{
1546 register Lisp_Object tem, sym, *ptr;
1547
265a9e55 1548 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
1549 obarray = check_obarray (obarray);
1550
1551 CHECK_STRING (str, 0);
1552
1553 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
1554 if (XTYPE (tem) != Lisp_Int)
1555 return tem;
1556
265a9e55 1557 if (!NILP (Vpurify_flag))
078e7b4a
JB
1558 str = Fpurecopy (str);
1559 sym = Fmake_symbol (str);
1560
1561 ptr = &XVECTOR (obarray)->contents[XINT (tem)];
1562 if (XTYPE (*ptr) == Lisp_Symbol)
1563 XSYMBOL (sym)->next = XSYMBOL (*ptr);
1564 else
1565 XSYMBOL (sym)->next = 0;
1566 *ptr = sym;
1567 return sym;
1568}
1569
1570DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,
1571 "Return the canonical symbol whose name is STRING, or nil if none exists.\n\
1572A second optional argument specifies the obarray to use;\n\
1573it defaults to the value of `obarray'.")
1574 (str, obarray)
1575 Lisp_Object str, obarray;
1576{
1577 register Lisp_Object tem;
1578
265a9e55 1579 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
1580 obarray = check_obarray (obarray);
1581
1582 CHECK_STRING (str, 0);
1583
1584 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
1585 if (XTYPE (tem) != Lisp_Int)
1586 return tem;
1587 return Qnil;
1588}
1589
1590Lisp_Object
1591oblookup (obarray, ptr, size)
1592 Lisp_Object obarray;
1593 register char *ptr;
1594 register int size;
1595{
1596 int hash, obsize;
1597 register Lisp_Object tail;
1598 Lisp_Object bucket, tem;
1599
7c79a684
RS
1600 if (XTYPE (obarray) != Lisp_Vector
1601 || (obsize = XVECTOR (obarray)->size) == 0)
078e7b4a
JB
1602 {
1603 obarray = check_obarray (obarray);
1604 obsize = XVECTOR (obarray)->size;
1605 }
1606 /* Combining next two lines breaks VMS C 2.3. */
1607 hash = hash_string (ptr, size);
1608 hash %= obsize;
1609 bucket = XVECTOR (obarray)->contents[hash];
1610 if (XFASTINT (bucket) == 0)
1611 ;
1612 else if (XTYPE (bucket) != Lisp_Symbol)
1613 error ("Bad data in guts of obarray"); /* Like CADR error message */
1614 else for (tail = bucket; ; XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next))
1615 {
1616 if (XSYMBOL (tail)->name->size == size &&
1617 !bcmp (XSYMBOL (tail)->name->data, ptr, size))
1618 return tail;
1619 else if (XSYMBOL (tail)->next == 0)
1620 break;
1621 }
1622 XSET (tem, Lisp_Int, hash);
1623 return tem;
1624}
1625
1626static int
1627hash_string (ptr, len)
1628 unsigned char *ptr;
1629 int len;
1630{
1631 register unsigned char *p = ptr;
1632 register unsigned char *end = p + len;
1633 register unsigned char c;
1634 register int hash = 0;
1635
1636 while (p != end)
1637 {
1638 c = *p++;
1639 if (c >= 0140) c -= 40;
1640 hash = ((hash<<3) + (hash>>28) + c);
1641 }
1642 return hash & 07777777777;
1643}
1644
1645void
1646map_obarray (obarray, fn, arg)
1647 Lisp_Object obarray;
1648 int (*fn) ();
1649 Lisp_Object arg;
1650{
1651 register int i;
1652 register Lisp_Object tail;
1653 CHECK_VECTOR (obarray, 1);
1654 for (i = XVECTOR (obarray)->size - 1; i >= 0; i--)
1655 {
1656 tail = XVECTOR (obarray)->contents[i];
1657 if (XFASTINT (tail) != 0)
1658 while (1)
1659 {
1660 (*fn) (tail, arg);
1661 if (XSYMBOL (tail)->next == 0)
1662 break;
1663 XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next);
1664 }
1665 }
1666}
1667
1668mapatoms_1 (sym, function)
1669 Lisp_Object sym, function;
1670{
1671 call1 (function, sym);
1672}
1673
1674DEFUN ("mapatoms", Fmapatoms, Smapatoms, 1, 2, 0,
1675 "Call FUNCTION on every symbol in OBARRAY.\n\
1676OBARRAY defaults to the value of `obarray'.")
1677 (function, obarray)
1678 Lisp_Object function, obarray;
1679{
1680 Lisp_Object tem;
1681
265a9e55 1682 if (NILP (obarray)) obarray = Vobarray;
078e7b4a
JB
1683 obarray = check_obarray (obarray);
1684
1685 map_obarray (obarray, mapatoms_1, function);
1686 return Qnil;
1687}
1688
5e88a39e 1689#define OBARRAY_SIZE 1511
078e7b4a
JB
1690
1691void
1692init_obarray ()
1693{
1694 Lisp_Object oblength;
1695 int hash;
1696 Lisp_Object *tem;
1697
1698 XFASTINT (oblength) = OBARRAY_SIZE;
1699
1700 Qnil = Fmake_symbol (make_pure_string ("nil", 3));
1701 Vobarray = Fmake_vector (oblength, make_number (0));
1702 initial_obarray = Vobarray;
1703 staticpro (&initial_obarray);
1704 /* Intern nil in the obarray */
1705 /* These locals are to kludge around a pyramid compiler bug. */
1706 hash = hash_string ("nil", 3);
1707 /* Separate statement here to avoid VAXC bug. */
1708 hash %= OBARRAY_SIZE;
1709 tem = &XVECTOR (Vobarray)->contents[hash];
1710 *tem = Qnil;
1711
1712 Qunbound = Fmake_symbol (make_pure_string ("unbound", 7));
1713 XSYMBOL (Qnil)->function = Qunbound;
1714 XSYMBOL (Qunbound)->value = Qunbound;
1715 XSYMBOL (Qunbound)->function = Qunbound;
1716
1717 Qt = intern ("t");
1718 XSYMBOL (Qnil)->value = Qnil;
1719 XSYMBOL (Qnil)->plist = Qnil;
1720 XSYMBOL (Qt)->value = Qt;
1721
1722 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */
1723 Vpurify_flag = Qt;
1724
1725 Qvariable_documentation = intern ("variable-documentation");
1726
1727 read_buffer_size = 100;
1728 read_buffer = (char *) malloc (read_buffer_size);
1729}
1730\f
1731void
1732defsubr (sname)
1733 struct Lisp_Subr *sname;
1734{
1735 Lisp_Object sym;
1736 sym = intern (sname->symbol_name);
1737 XSET (XSYMBOL (sym)->function, Lisp_Subr, sname);
1738}
1739
1740#ifdef NOTDEF /* use fset in subr.el now */
1741void
1742defalias (sname, string)
1743 struct Lisp_Subr *sname;
1744 char *string;
1745{
1746 Lisp_Object sym;
1747 sym = intern (string);
1748 XSET (XSYMBOL (sym)->function, Lisp_Subr, sname);
1749}
1750#endif /* NOTDEF */
1751
1752/* New replacement for DefIntVar; it ignores the doc string argument
1753 on the assumption that make-docfile will handle that. */
1754/* Define an "integer variable"; a symbol whose value is forwarded
1755 to a C variable of type int. Sample call: */
1756 /* DEFVARINT ("indent-tabs-mode", &indent_tabs_mode, "Documentation"); */
1757
1758void
1759defvar_int (namestring, address, doc)
1760 char *namestring;
1761 int *address;
1762 char *doc;
1763{
1764 Lisp_Object sym;
1765 sym = intern (namestring);
1766 XSET (XSYMBOL (sym)->value, Lisp_Intfwd, address);
1767}
1768
1769/* Similar but define a variable whose value is T if address contains 1,
1770 NIL if address contains 0 */
1771
1772void
1773defvar_bool (namestring, address, doc)
1774 char *namestring;
1775 int *address;
1776 char *doc;
1777{
1778 Lisp_Object sym;
1779 sym = intern (namestring);
1780 XSET (XSYMBOL (sym)->value, Lisp_Boolfwd, address);
1781}
1782
1783/* Similar but define a variable whose value is the Lisp Object stored at address. */
1784
1785void
1786defvar_lisp (namestring, address, doc)
1787 char *namestring;
1788 Lisp_Object *address;
1789 char *doc;
1790{
1791 Lisp_Object sym;
1792 sym = intern (namestring);
1793 XSET (XSYMBOL (sym)->value, Lisp_Objfwd, address);
1794 staticpro (address);
1795}
1796
1797/* Similar but don't request gc-marking of the C variable.
1798 Used when that variable will be gc-marked for some other reason,
1799 since marking the same slot twice can cause trouble with strings. */
1800
1801void
1802defvar_lisp_nopro (namestring, address, doc)
1803 char *namestring;
1804 Lisp_Object *address;
1805 char *doc;
1806{
1807 Lisp_Object sym;
1808 sym = intern (namestring);
1809 XSET (XSYMBOL (sym)->value, Lisp_Objfwd, address);
1810}
1811
1812#ifndef standalone
1813
1814/* Similar but define a variable whose value is the Lisp Object stored in
1815 the current buffer. address is the address of the slot in the buffer that is current now. */
1816
1817void
4360b0c6 1818defvar_per_buffer (namestring, address, type, doc)
078e7b4a
JB
1819 char *namestring;
1820 Lisp_Object *address;
4360b0c6 1821 Lisp_Object type;
078e7b4a
JB
1822 char *doc;
1823{
1824 Lisp_Object sym;
1825 int offset;
1826 extern struct buffer buffer_local_symbols;
1827
1828 sym = intern (namestring);
1829 offset = (char *)address - (char *)current_buffer;
1830
1831 XSET (XSYMBOL (sym)->value, Lisp_Buffer_Objfwd,
1832 (Lisp_Object *) offset);
1833 *(Lisp_Object *)(offset + (char *)&buffer_local_symbols) = sym;
4360b0c6 1834 *(Lisp_Object *)(offset + (char *)&buffer_local_types) = type;
078e7b4a
JB
1835 if (*(int *)(offset + (char *)&buffer_local_flags) == 0)
1836 /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
1837 slot of buffer_local_flags */
1838 abort ();
1839}
1840
1841#endif /* standalone */
1842\f
279499f0 1843init_lread ()
078e7b4a 1844{
46947372 1845 char *normal;
078e7b4a 1846
279499f0 1847 /* Compute the default load-path. */
46947372
JB
1848#ifdef CANNOT_DUMP
1849 normal = PATH_LOADSEARCH;
e065a56e 1850 Vload_path = decode_env_path (0, normal);
46947372
JB
1851#else
1852 if (NILP (Vpurify_flag))
1853 normal = PATH_LOADSEARCH;
279499f0 1854 else
46947372 1855 normal = PATH_DUMPLOADSEARCH;
279499f0 1856
46947372
JB
1857 /* In a dumped Emacs, we normally have to reset the value of
1858 Vload_path from PATH_LOADSEARCH, since the value that was dumped
1859 uses ../lisp, instead of the path of the installed elisp
1860 libraries. However, if it appears that Vload_path was changed
1861 from the default before dumping, don't override that value. */
4746118a
JB
1862 if (initialized)
1863 {
1864 Lisp_Object dump_path;
46947372 1865
e065a56e 1866 dump_path = decode_env_path (0, PATH_DUMPLOADSEARCH);
4746118a 1867 if (! NILP (Fequal (dump_path, Vload_path)))
80667d53
RS
1868 {
1869 Vload_path = decode_env_path (0, normal);
74180aa4 1870 if (!NILP (Vinstallation_directory))
80667d53 1871 {
74180aa4 1872 /* Add to the path the lisp subdir of the
3a3056e5
RS
1873 installation dir, if it exists. */
1874 Lisp_Object tem, tem1;
74180aa4
RS
1875 tem = Fexpand_file_name (build_string ("lisp"),
1876 Vinstallation_directory);
3a3056e5
RS
1877 tem1 = Ffile_exists_p (tem);
1878 if (!NILP (tem1))
1879 {
1880 if (NILP (Fmember (tem, Vload_path)))
1881 Vload_path = nconc2 (Vload_path, Fcons (tem, Qnil));
1882 }
1883 else
1884 /* That dir doesn't exist, so add the build-time
1885 Lisp dirs instead. */
1886 Vload_path = nconc2 (Vload_path, dump_path);
80667d53
RS
1887 }
1888 }
4746118a
JB
1889 }
1890 else
e065a56e 1891 Vload_path = decode_env_path (0, normal);
46947372 1892#endif
279499f0 1893
078e7b4a 1894 /* Warn if dirs in the *standard* path don't exist. */
46947372
JB
1895 {
1896 Lisp_Object path_tail;
078e7b4a 1897
46947372
JB
1898 for (path_tail = Vload_path;
1899 !NILP (path_tail);
1900 path_tail = XCONS (path_tail)->cdr)
1901 {
1902 Lisp_Object dirfile;
1903 dirfile = Fcar (path_tail);
1904 if (XTYPE (dirfile) == Lisp_String)
1905 {
1906 dirfile = Fdirectory_file_name (dirfile);
1907 if (access (XSTRING (dirfile)->data, 0) < 0)
3a3056e5
RS
1908 fprintf (stderr,
1909 "Warning: Lisp directory `%s' does not exist.\n",
3917910a 1910 XSTRING (Fcar (path_tail))->data);
46947372
JB
1911 }
1912 }
1913 }
1914
1915 /* If the EMACSLOADPATH environment variable is set, use its value.
1916 This doesn't apply if we're dumping. */
1917 if (NILP (Vpurify_flag)
1918 && egetenv ("EMACSLOADPATH"))
279499f0 1919 Vload_path = decode_env_path ("EMACSLOADPATH", normal);
279499f0
JB
1920
1921 Vvalues = Qnil;
1922
078e7b4a 1923 load_in_progress = 0;
d2c6be7f
RS
1924
1925 load_descriptor_list = Qnil;
078e7b4a
JB
1926}
1927
1928void
279499f0 1929syms_of_lread ()
078e7b4a
JB
1930{
1931 defsubr (&Sread);
1932 defsubr (&Sread_from_string);
1933 defsubr (&Sintern);
1934 defsubr (&Sintern_soft);
1935 defsubr (&Sload);
228d4b1c 1936 defsubr (&Seval_buffer);
078e7b4a
JB
1937 defsubr (&Seval_region);
1938 defsubr (&Sread_char);
1939 defsubr (&Sread_char_exclusive);
078e7b4a 1940 defsubr (&Sread_event);
078e7b4a
JB
1941 defsubr (&Sget_file_char);
1942 defsubr (&Smapatoms);
1943
1944 DEFVAR_LISP ("obarray", &Vobarray,
1945 "Symbol table for use by `intern' and `read'.\n\
1946It is a vector whose length ought to be prime for best results.\n\
1947The vector's contents don't make sense if examined from Lisp programs;\n\
1948to find all the symbols in an obarray, use `mapatoms'.");
1949
1950 DEFVAR_LISP ("values", &Vvalues,
1951 "List of values of all expressions which were read, evaluated and printed.\n\
1952Order is reverse chronological.");
1953
1954 DEFVAR_LISP ("standard-input", &Vstandard_input,
1955 "Stream for read to get input from.\n\
1956See documentation of `read' for possible values.");
1957 Vstandard_input = Qt;
1958
1959 DEFVAR_LISP ("load-path", &Vload_path,
1960 "*List of directories to search for files to load.\n\
1961Each element is a string (directory name) or nil (try default directory).\n\
1962Initialized based on EMACSLOADPATH environment variable, if any,\n\
692f86ad 1963otherwise to default specified by file `paths.h' when Emacs was built.");
078e7b4a
JB
1964
1965 DEFVAR_BOOL ("load-in-progress", &load_in_progress,
1966 "Non-nil iff inside of `load'.");
1967
1968 DEFVAR_LISP ("after-load-alist", &Vafter_load_alist,
1969 "An alist of expressions to be evalled when particular files are loaded.\n\
1970Each element looks like (FILENAME FORMS...).\n\
1971When `load' is run and the file-name argument is FILENAME,\n\
1972the FORMS in the corresponding element are executed at the end of loading.\n\n\
1973FILENAME must match exactly! Normally FILENAME is the name of a library,\n\
1974with no directory specified, since that is how `load' is normally called.\n\
1975An error in FORMS does not undo the load,\n\
1976but does prevent execution of the rest of the FORMS.");
1977 Vafter_load_alist = Qnil;
1978
ae321d28
RS
1979 DEFVAR_LISP ("load-history", &Vload_history,
1980 "Alist mapping source file names to symbols and features.\n\
1981Each alist element is a list that starts with a file name,\n\
1982except for one element (optional) that starts with nil and describes\n\
1983definitions evaluated from buffers not visiting files.\n\
1984The remaining elements of each list are symbols defined as functions\n\
1985or variables, and cons cells `(provide . FEATURE)' and `(require . FEATURE)'.");
1986 Vload_history = Qnil;
1987
8a1f1537
RS
1988 DEFVAR_LISP ("current-load-list", &Vcurrent_load_list,
1989 "Used for internal purposes by `load'.");
ae321d28
RS
1990 Vcurrent_load_list = Qnil;
1991
d2c6be7f
RS
1992 load_descriptor_list = Qnil;
1993 staticpro (&load_descriptor_list);
1994
8a1f1537
RS
1995 Qcurrent_load_list = intern ("current-load-list");
1996 staticpro (&Qcurrent_load_list);
1997
078e7b4a
JB
1998 Qstandard_input = intern ("standard-input");
1999 staticpro (&Qstandard_input);
2000
2001 Qread_char = intern ("read-char");
2002 staticpro (&Qread_char);
2003
2004 Qget_file_char = intern ("get-file-char");
2005 staticpro (&Qget_file_char);
7bd279cd
RS
2006
2007 Qascii_character = intern ("ascii-character");
2008 staticpro (&Qascii_character);
c2225d00
RS
2009
2010 Qload = intern ("load");
2011 staticpro (&Qload);
078e7b4a 2012}