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