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