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