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