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