1 /* Lisp parsing and input streams.
2 Copyright (C) 1985, 1986, 1987, 1988, 1989,
3 1993 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
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)
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.
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. */
23 #include <sys/types.h>
35 #include "termhooks.h"
39 #include <sys/inode.h>
46 #ifdef LISP_FLOAT_TYPE
51 #if 0 /* That is untrue--XINT is used below, and it uses INTBITS.
52 What in the world is values.h, anyway? */
54 /* These are redefined in <values.h> and not used here */
62 #endif /* LISP_FLOAT_TYPE */
64 Lisp_Object Qread_char
, Qget_file_char
, Qstandard_input
, Qcurrent_load_list
;
65 Lisp_Object Qvariable_documentation
, Vvalues
, Vstandard_input
, Vafter_load_alist
;
66 Lisp_Object Qascii_character
, Qload
;
68 extern Lisp_Object Qevent_symbol_element_mask
;
70 /* non-zero if inside `load' */
73 /* Search path for files to be loaded. */
74 Lisp_Object Vload_path
;
76 /* This is the user-visible association list that maps features to
77 lists of defs in their load files. */
78 Lisp_Object Vload_history
;
80 /* This is useud to build the load history. */
81 Lisp_Object Vcurrent_load_list
;
83 /* List of descriptors now open for Fload. */
84 static Lisp_Object load_descriptor_list
;
86 /* File for get_file_char to read from. Use by load */
87 static FILE *instream
;
89 /* When nonzero, read conses in pure space */
92 /* For use within read-from-string (this reader is non-reentrant!!) */
93 static int read_from_string_index
;
94 static int read_from_string_limit
;
96 /* Handle unreading and rereading of characters.
97 Write READCHAR to read a character,
98 UNREAD(c) to unread c to be read again. */
100 #define READCHAR readchar (readcharfun)
101 #define UNREAD(c) unreadchar (readcharfun, c)
104 readchar (readcharfun
)
105 Lisp_Object readcharfun
;
108 register struct buffer
*inbuffer
;
109 register int c
, mpos
;
111 if (XTYPE (readcharfun
) == Lisp_Buffer
)
113 inbuffer
= XBUFFER (readcharfun
);
115 if (BUF_PT (inbuffer
) >= BUF_ZV (inbuffer
))
117 c
= *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer
, BUF_PT (inbuffer
));
118 SET_BUF_PT (inbuffer
, BUF_PT (inbuffer
) + 1);
122 if (XTYPE (readcharfun
) == Lisp_Marker
)
124 inbuffer
= XMARKER (readcharfun
)->buffer
;
126 mpos
= marker_position (readcharfun
);
128 if (mpos
> BUF_ZV (inbuffer
) - 1)
130 c
= *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer
, mpos
);
131 if (mpos
!= BUF_GPT (inbuffer
))
132 XMARKER (readcharfun
)->bufpos
++;
134 Fset_marker (readcharfun
, make_number (mpos
+ 1),
135 Fmarker_buffer (readcharfun
));
138 if (EQ (readcharfun
, Qget_file_char
))
139 return getc (instream
);
141 if (XTYPE (readcharfun
) == Lisp_String
)
144 /* This used to be return of a conditional expression,
145 but that truncated -1 to a char on VMS. */
146 if (read_from_string_index
< read_from_string_limit
)
147 c
= XSTRING (readcharfun
)->data
[read_from_string_index
++];
153 tem
= call0 (readcharfun
);
160 /* Unread the character C in the way appropriate for the stream READCHARFUN.
161 If the stream is a user function, call it with the char as argument. */
164 unreadchar (readcharfun
, c
)
165 Lisp_Object readcharfun
;
168 if (XTYPE (readcharfun
) == Lisp_Buffer
)
170 if (XBUFFER (readcharfun
) == current_buffer
)
173 SET_BUF_PT (XBUFFER (readcharfun
), BUF_PT (XBUFFER (readcharfun
)) - 1);
175 else if (XTYPE (readcharfun
) == Lisp_Marker
)
176 XMARKER (readcharfun
)->bufpos
--;
177 else if (XTYPE (readcharfun
) == Lisp_String
)
178 read_from_string_index
--;
179 else if (EQ (readcharfun
, Qget_file_char
))
180 ungetc (c
, instream
);
182 call1 (readcharfun
, make_number (c
));
185 static Lisp_Object
read0 (), read1 (), read_list (), read_vector ();
187 /* get a character from the tty */
189 extern Lisp_Object
read_char ();
191 /* Read input events until we get one that's acceptable for our purposes.
193 If NO_SWITCH_FRAME is non-zero, switch-frame events are stashed
194 until we get a character we like, and then stuffed into
197 If ASCII_REQUIRED is non-zero, we check function key events to see
198 if the unmodified version of the symbol has a Qascii_character
199 property, and use that character, if present.
201 If ERROR_NONASCII is non-zero, we signal an error if the input we
202 get isn't an ASCII character with modifiers. If it's zero but
203 ASCII_REQUIRED is non-zero, we just re-read until we get an ASCII
206 read_filtered_event (no_switch_frame
, ascii_required
, error_nonascii
)
207 int no_switch_frame
, ascii_required
, error_nonascii
;
210 return make_number (getchar ());
212 register Lisp_Object val
;
213 register Lisp_Object delayed_switch_frame
= Qnil
;
215 /* Read until we get an acceptable event. */
217 val
= read_char (0, 0, 0, Qnil
, 0);
219 if (XTYPE (val
) == Lisp_Buffer
)
222 /* switch-frame events are put off until after the next ASCII
223 character. This is better than signalling an error just because
224 the last characters were typed to a separate minibuffer frame,
225 for example. Eventually, some code which can deal with
226 switch-frame events will read it and process it. */
228 && EVENT_HAS_PARAMETERS (val
)
229 && EQ (EVENT_HEAD (val
), Qswitch_frame
))
231 delayed_switch_frame
= val
;
237 /* Convert certain symbols to their ASCII equivalents. */
238 if (XTYPE (val
) == Lisp_Symbol
)
240 Lisp_Object tem
, tem1
, tem2
;
241 tem
= Fget (val
, Qevent_symbol_element_mask
);
244 tem1
= Fget (Fcar (tem
), Qascii_character
);
245 /* Merge this symbol's modifier bits
246 with the ASCII equivalent of its basic code. */
248 XFASTINT (val
) = XINT (tem1
) | XINT (Fcar (Fcdr (tem
)));
252 /* If we don't have a character now, deal with it appropriately. */
253 if (XTYPE (val
) != Lisp_Int
)
257 unread_command_events
= Fcons (val
, Qnil
);
258 error ("Non-character input-event");
265 if (! NILP (delayed_switch_frame
))
266 unread_switch_frame
= delayed_switch_frame
;
272 DEFUN ("read-char", Fread_char
, Sread_char
, 0, 0, 0,
273 "Read a character from the command input (keyboard or macro).\n\
274 It is returned as a number.\n\
275 If the user generates an event which is not a character (i.e. a mouse\n\
276 click or function key event), `read-char' signals an error. As an\n\
277 exception, switch-frame events are put off until non-ASCII events can\n\
279 If you want to read non-character events, or ignore them, call\n\
280 `read-event' or `read-char-exclusive' instead.")
283 return read_filtered_event (1, 1, 1);
286 DEFUN ("read-event", Fread_event
, Sread_event
, 0, 0, 0,
287 "Read an event object from the input stream.")
290 return read_filtered_event (0, 0, 0);
293 DEFUN ("read-char-exclusive", Fread_char_exclusive
, Sread_char_exclusive
, 0, 0, 0,
294 "Read a character from the command input (keyboard or macro).\n\
295 It is returned as a number. Non character events are ignored.")
298 return read_filtered_event (1, 1, 0);
301 DEFUN ("get-file-char", Fget_file_char
, Sget_file_char
, 0, 0, 0,
302 "Don't use this yourself.")
305 register Lisp_Object val
;
306 XSET (val
, Lisp_Int
, getc (instream
));
310 static void readevalloop ();
311 static Lisp_Object
load_unwind ();
312 static Lisp_Object
load_descriptor_unwind ();
314 DEFUN ("load", Fload
, Sload
, 1, 4, 0,
315 "Execute a file of Lisp code named FILE.\n\
316 First try FILE with `.elc' appended, then try with `.el',\n\
317 then try FILE unmodified.\n\
318 This function searches the directories in `load-path'.\n\
319 If optional second arg NOERROR is non-nil,\n\
320 report no error if FILE doesn't exist.\n\
321 Print messages at start and end of loading unless\n\
322 optional third arg NOMESSAGE is non-nil.\n\
323 If optional fourth arg NOSUFFIX is non-nil, don't try adding\n\
324 suffixes `.elc' or `.el' to the specified name FILE.\n\
325 Return t if file exists.")
326 (str
, noerror
, nomessage
, nosuffix
)
327 Lisp_Object str
, noerror
, nomessage
, nosuffix
;
329 register FILE *stream
;
330 register int fd
= -1;
331 register Lisp_Object lispstream
;
333 int count
= specpdl_ptr
- specpdl
;
337 /* 1 means inhibit the message at the beginning. */
341 char *dosmode
= "rt";
344 CHECK_STRING (str
, 0);
345 str
= Fsubstitute_in_file_name (str
);
347 /* If file name is magic, call the handler. */
348 handler
= Ffind_file_name_handler (str
);
350 return call5 (handler
, Qload
, str
, noerror
, nomessage
, nosuffix
);
352 /* Avoid weird lossage with null string as arg,
353 since it would try to load a directory as a Lisp file */
354 if (XSTRING (str
)->size
> 0)
356 fd
= openp (Vload_path
, str
, !NILP (nosuffix
) ? "" : ".elc:.el:",
364 Fsignal (Qfile_error
, Fcons (build_string ("Cannot open load file"),
370 if (!bcmp (&(XSTRING (found
)->data
[XSTRING (found
)->size
- 4]),
379 stat (XSTRING (found
)->data
, &s1
);
380 XSTRING (found
)->data
[XSTRING (found
)->size
- 1] = 0;
381 result
= stat (XSTRING (found
)->data
, &s2
);
382 if (result
>= 0 && (unsigned) s1
.st_mtime
< (unsigned) s2
.st_mtime
)
384 message ("Source file `%s' newer than byte-compiled file",
385 XSTRING (found
)->data
);
386 /* Don't immediately overwrite this message. */
390 XSTRING (found
)->data
[XSTRING (found
)->size
- 1] = 'c';
395 stream
= fopen ((char *) XSTRING (found
)->data
, dosmode
);
397 stream
= fdopen (fd
, "r");
402 error ("Failure to create stdio stream for %s", XSTRING (str
)->data
);
405 if (NILP (nomessage
) && !nomessage1
)
406 message ("Loading %s...", XSTRING (str
)->data
);
409 /* We may not be able to store STREAM itself as a Lisp_Object pointer
410 since that is guaranteed to work only for data that has been malloc'd.
411 So malloc a full-size pointer, and record the address of that pointer. */
412 ptr
= (FILE **) xmalloc (sizeof (FILE *));
414 XSET (lispstream
, Lisp_Internal_Stream
, (int) ptr
);
415 record_unwind_protect (load_unwind
, lispstream
);
416 record_unwind_protect (load_descriptor_unwind
, load_descriptor_list
);
418 = Fcons (make_number (fileno (stream
)), load_descriptor_list
);
420 readevalloop (Qget_file_char
, stream
, str
, Feval
, 0);
421 unbind_to (count
, Qnil
);
423 /* Run any load-hooks for this file. */
424 temp
= Fassoc (str
, Vafter_load_alist
);
426 Fprogn (Fcdr (temp
));
429 if (!noninteractive
&& NILP (nomessage
))
430 message ("Loading %s...done", XSTRING (str
)->data
);
435 load_unwind (stream
) /* used as unwind-protect function in load */
438 fclose (*(FILE **) XSTRING (stream
));
439 xfree (XPNTR (stream
));
440 if (--load_in_progress
< 0) load_in_progress
= 0;
445 load_descriptor_unwind (oldlist
)
448 load_descriptor_list
= oldlist
;
451 /* Close all descriptors in use for Floads.
452 This is used when starting a subprocess. */
458 for (tail
= load_descriptor_list
; !NILP (tail
); tail
= XCONS (tail
)->cdr
)
459 close (XFASTINT (XCONS (tail
)->car
));
463 complete_filename_p (pathname
)
464 Lisp_Object pathname
;
466 register unsigned char *s
= XSTRING (pathname
)->data
;
474 #ifdef MSDOS /* MW, May 1993 */
475 || (s
[0] != '\0' && s
[1] == ':' && s
[2] == '/')
480 /* Search for a file whose name is STR, looking in directories
481 in the Lisp list PATH, and trying suffixes from SUFFIX.
482 SUFFIX is a string containing possible suffixes separated by colons.
483 On success, returns a file descriptor. On failure, returns -1.
485 EXEC_ONLY nonzero means don't open the files,
486 just look for one that is executable. In this case,
487 returns 1 on success.
489 If STOREPTR is nonzero, it points to a slot where the name of
490 the file actually found should be stored as a Lisp string.
491 Nil is stored there on failure. */
494 openp (path
, str
, suffix
, storeptr
, exec_only
)
495 Lisp_Object path
, str
;
497 Lisp_Object
*storeptr
;
503 register char *fn
= buf
;
506 register Lisp_Object filename
;
512 if (complete_filename_p (str
))
515 for (; !NILP (path
); path
= Fcdr (path
))
519 filename
= Fexpand_file_name (str
, Fcar (path
));
520 if (!complete_filename_p (filename
))
521 /* If there are non-absolute elts in PATH (eg ".") */
522 /* Of course, this could conceivably lose if luser sets
523 default-directory to be something non-absolute... */
525 filename
= Fexpand_file_name (filename
, current_buffer
->directory
);
526 if (!complete_filename_p (filename
))
527 /* Give up on this path element! */
531 /* Calculate maximum size of any filename made from
532 this path element/specified file name and any possible suffix. */
533 want_size
= strlen (suffix
) + XSTRING (filename
)->size
+ 1;
534 if (fn_size
< want_size
)
535 fn
= (char *) alloca (fn_size
= 100 + want_size
);
539 /* Loop over suffixes. */
542 char *esuffix
= (char *) index (nsuffix
, ':');
543 int lsuffix
= esuffix
? esuffix
- nsuffix
: strlen (nsuffix
);
545 /* Concatenate path element/specified name with the suffix. */
546 strncpy (fn
, XSTRING (filename
)->data
, XSTRING (filename
)->size
);
547 fn
[XSTRING (filename
)->size
] = 0;
548 if (lsuffix
!= 0) /* Bug happens on CCI if lsuffix is 0. */
549 strncat (fn
, nsuffix
, lsuffix
);
551 /* Ignore file if it's a directory. */
552 if (stat (fn
, &st
) >= 0
553 && (st
.st_mode
& S_IFMT
) != S_IFDIR
)
555 /* Check that we can access or open it. */
557 fd
= (access (fn
, X_OK
) == 0) ? 1 : -1;
559 fd
= open (fn
, 0, 0);
563 /* We succeeded; return this descriptor and filename. */
565 *storeptr
= build_string (fn
);
570 /* Advance to next suffix. */
573 nsuffix
+= lsuffix
+ 1;
575 if (absolute
) return -1;
582 /* Merge the list we've accumulated of globals from the current input source
583 into the load_history variable. The details depend on whether
584 the source has an associated file name or not. */
587 build_load_history (stream
, source
)
591 register Lisp_Object tail
, prev
, newelt
;
592 register Lisp_Object tem
, tem2
;
593 register int foundit
, loading
;
595 /* Don't bother recording anything for preloaded files. */
596 if (!NILP (Vpurify_flag
))
599 loading
= stream
|| !NARROWED
;
601 tail
= Vload_history
;
608 /* Find the feature's previous assoc list... */
609 if (!NILP (Fequal (source
, Fcar (tem
))))
613 /* If we're loading, remove it. */
617 Vload_history
= Fcdr (tail
);
619 Fsetcdr (prev
, Fcdr (tail
));
622 /* Otherwise, cons on new symbols that are not already members. */
625 tem2
= Vcurrent_load_list
;
629 newelt
= Fcar (tem2
);
631 if (NILP (Fmemq (newelt
, tem
)))
632 Fsetcar (tail
, Fcons (Fcar (tem
),
633 Fcons (newelt
, Fcdr (tem
))));
646 /* If we're loading, cons the new assoc onto the front of load-history,
647 the most-recently-loaded position. Also do this if we didn't find
648 an existing member for the current source. */
649 if (loading
|| !foundit
)
650 Vload_history
= Fcons (Fnreverse (Vcurrent_load_list
),
655 unreadpure () /* Used as unwind-protect function in readevalloop */
662 readevalloop (readcharfun
, stream
, sourcename
, evalfun
, printflag
)
663 Lisp_Object readcharfun
;
665 Lisp_Object sourcename
;
666 Lisp_Object (*evalfun
) ();
670 register Lisp_Object val
;
671 int count
= specpdl_ptr
- specpdl
;
673 struct buffer
*b
= 0;
675 if (BUFFERP (readcharfun
))
676 b
= XBUFFER (readcharfun
);
677 else if (MARKERP (readcharfun
))
678 b
= XMARKER (readcharfun
)->buffer
;
680 specbind (Qstandard_input
, readcharfun
);
681 specbind (Qcurrent_load_list
, Qnil
);
685 LOADHIST_ATTACH (sourcename
);
689 if (b
!= 0 && NILP (b
->name
))
690 error ("Reading from killed buffer");
696 while ((c
= READCHAR
) != '\n' && c
!= -1);
700 if (c
== ' ' || c
== '\t' || c
== '\n' || c
== '\f') continue;
702 if (!NILP (Vpurify_flag
) && c
== '(')
704 record_unwind_protect (unreadpure
, Qnil
);
705 val
= read_list (-1, readcharfun
);
706 unbind_to (count
+ 1, Qnil
);
711 val
= read0 (readcharfun
);
714 val
= (*evalfun
) (val
);
717 Vvalues
= Fcons (val
, Vvalues
);
718 if (EQ (Vstandard_output
, Qt
))
725 build_load_history (stream
, sourcename
);
728 unbind_to (count
, Qnil
);
733 DEFUN ("eval-buffer", Feval_buffer
, Seval_buffer
, 0, 2, "",
734 "Execute the current buffer as Lisp code.\n\
735 Programs can pass two arguments, BUFFER and PRINTFLAG.\n\
736 BUFFER is the buffer to evaluate (nil means use current buffer).\n\
737 PRINTFLAG controls printing of output:\n\
738 nil means discard it; anything else is stream for print.\n\
740 If there is no error, point does not move. If there is an error,\n\
741 point remains at the end of the last character read from the buffer.")
743 Lisp_Object bufname
, printflag
;
745 int count
= specpdl_ptr
- specpdl
;
746 Lisp_Object tem
, buf
;
749 buf
= Fcurrent_buffer ();
751 buf
= Fget_buffer (bufname
);
753 error ("No such buffer.");
755 if (NILP (printflag
))
759 specbind (Qstandard_output
, tem
);
760 record_unwind_protect (save_excursion_restore
, save_excursion_save ());
761 BUF_SET_PT (XBUFFER (buf
), BUF_BEGV (XBUFFER (buf
)));
762 readevalloop (buf
, 0, XBUFFER (buf
)->filename
, Feval
, !NILP (printflag
));
763 unbind_to (count
, Qnil
);
769 DEFUN ("eval-current-buffer", Feval_current_buffer
, Seval_current_buffer
, 0, 1, "",
770 "Execute the current buffer as Lisp code.\n\
771 Programs can pass argument PRINTFLAG which controls printing of output:\n\
772 nil means discard it; anything else is stream for print.\n\
774 If there is no error, point does not move. If there is an error,\n\
775 point remains at the end of the last character read from the buffer.")
777 Lisp_Object printflag
;
779 int count
= specpdl_ptr
- specpdl
;
780 Lisp_Object tem
, cbuf
;
782 cbuf
= Fcurrent_buffer ()
784 if (NILP (printflag
))
788 specbind (Qstandard_output
, tem
);
789 record_unwind_protect (save_excursion_restore
, save_excursion_save ());
791 readevalloop (cbuf
, 0, XBUFFER (cbuf
)->filename
, Feval
, !NILP (printflag
));
792 return unbind_to (count
, Qnil
);
796 DEFUN ("eval-region", Feval_region
, Seval_region
, 2, 3, "r",
797 "Execute the region as Lisp code.\n\
798 When called from programs, expects two arguments,\n\
799 giving starting and ending indices in the current buffer\n\
800 of the text to be executed.\n\
801 Programs can pass third argument PRINTFLAG which controls output:\n\
802 nil means discard it; anything else is stream for printing it.\n\
804 If there is no error, point does not move. If there is an error,\n\
805 point remains at the end of the last character read from the buffer.")
807 Lisp_Object b
, e
, printflag
;
809 int count
= specpdl_ptr
- specpdl
;
810 Lisp_Object tem
, cbuf
;
812 cbuf
= Fcurrent_buffer ();
814 if (NILP (printflag
))
818 specbind (Qstandard_output
, tem
);
820 if (NILP (printflag
))
821 record_unwind_protect (save_excursion_restore
, save_excursion_save ());
822 record_unwind_protect (save_restriction_restore
, save_restriction_save ());
824 /* This both uses b and checks its type. */
826 Fnarrow_to_region (make_number (BEGV
), e
);
827 readevalloop (cbuf
, 0, XBUFFER (cbuf
)->filename
, Feval
, !NILP (printflag
));
829 return unbind_to (count
, Qnil
);
832 #endif /* standalone */
834 DEFUN ("read", Fread
, Sread
, 0, 1, 0,
835 "Read one Lisp expression as text from STREAM, return as Lisp object.\n\
836 If STREAM is nil, use the value of `standard-input' (which see).\n\
837 STREAM or the value of `standard-input' may be:\n\
838 a buffer (read from point and advance it)\n\
839 a marker (read from where it points and advance it)\n\
840 a function (call it with no arguments for each character,\n\
841 call it with a char as argument to push a char back)\n\
842 a string (takes text from string, starting at the beginning)\n\
843 t (read text line using minibuffer and use it).")
845 Lisp_Object readcharfun
;
847 extern Lisp_Object
Fread_minibuffer ();
849 if (NILP (readcharfun
))
850 readcharfun
= Vstandard_input
;
851 if (EQ (readcharfun
, Qt
))
852 readcharfun
= Qread_char
;
855 if (EQ (readcharfun
, Qread_char
))
856 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil
);
859 if (XTYPE (readcharfun
) == Lisp_String
)
860 return Fcar (Fread_from_string (readcharfun
, Qnil
, Qnil
));
862 return read0 (readcharfun
);
865 DEFUN ("read-from-string", Fread_from_string
, Sread_from_string
, 1, 3, 0,
866 "Read one Lisp expression which is represented as text by STRING.\n\
867 Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).\n\
868 START and END optionally delimit a substring of STRING from which to read;\n\
869 they default to 0 and (length STRING) respectively.")
871 Lisp_Object string
, start
, end
;
873 int startval
, endval
;
876 CHECK_STRING (string
,0);
879 endval
= XSTRING (string
)->size
;
881 { CHECK_NUMBER (end
,2);
883 if (endval
< 0 || endval
> XSTRING (string
)->size
)
884 args_out_of_range (string
, end
);
890 { CHECK_NUMBER (start
,1);
891 startval
= XINT (start
);
892 if (startval
< 0 || startval
> endval
)
893 args_out_of_range (string
, start
);
896 read_from_string_index
= startval
;
897 read_from_string_limit
= endval
;
899 tem
= read0 (string
);
900 return Fcons (tem
, make_number (read_from_string_index
));
903 /* Use this for recursive reads, in contexts where internal tokens are not allowed. */
907 Lisp_Object readcharfun
;
909 register Lisp_Object val
;
912 val
= read1 (readcharfun
);
913 if (XTYPE (val
) == Lisp_Internal
)
916 return Fsignal (Qinvalid_read_syntax
, Fcons (make_string (&c
, 1), Qnil
));
922 static int read_buffer_size
;
923 static char *read_buffer
;
926 read_escape (readcharfun
)
927 Lisp_Object readcharfun
;
929 register int c
= READCHAR
;
956 error ("Invalid escape character syntax");
959 c
= read_escape (readcharfun
);
960 return c
| meta_modifier
;
965 error ("Invalid escape character syntax");
968 c
= read_escape (readcharfun
);
969 return c
| shift_modifier
;
974 error ("Invalid escape character syntax");
977 c
= read_escape (readcharfun
);
978 return c
| hyper_modifier
;
983 error ("Invalid escape character syntax");
986 c
= read_escape (readcharfun
);
987 return c
| alt_modifier
;
992 error ("Invalid escape character syntax");
995 c
= read_escape (readcharfun
);
996 return c
| super_modifier
;
1001 error ("Invalid escape character syntax");
1005 c
= read_escape (readcharfun
);
1006 if ((c
& 0177) == '?')
1008 /* ASCII control chars are made from letters (both cases),
1009 as well as the non-letters within 0100...0137. */
1010 else if ((c
& 0137) >= 0101 && (c
& 0137) <= 0132)
1011 return (c
& (037 | ~0177));
1012 else if ((c
& 0177) >= 0100 && (c
& 0177) <= 0137)
1013 return (c
& (037 | ~0177));
1015 return c
| ctrl_modifier
;
1025 /* An octal escape, as in ANSI C. */
1027 register int i
= c
- '0';
1028 register int count
= 0;
1031 if ((c
= READCHAR
) >= '0' && c
<= '7')
1046 /* A hex escape, as in ANSI C. */
1052 if (c
>= '0' && c
<= '9')
1057 else if ((c
>= 'a' && c
<= 'f')
1058 || (c
>= 'A' && c
<= 'F'))
1061 if (c
>= 'a' && c
<= 'f')
1082 register Lisp_Object readcharfun
;
1089 if (c
< 0) return Fsignal (Qend_of_file
, Qnil
);
1094 return read_list (0, readcharfun
);
1097 return read_vector (readcharfun
);
1102 register Lisp_Object val
;
1103 XSET (val
, Lisp_Internal
, c
);
1111 /* Accept compiled functions at read-time so that we don't have to
1112 build them using function calls. */
1114 tmp
= read_vector (readcharfun
);
1115 return Fmake_byte_code (XVECTOR (tmp
)->size
,
1116 XVECTOR (tmp
)->contents
);
1118 #ifdef USE_TEXT_PROPERTIES
1122 struct gcpro gcpro1
;
1124 /* Read the string itself. */
1125 tmp
= read1 (readcharfun
);
1126 if (XTYPE (tmp
) != Lisp_String
)
1127 Fsignal (Qinvalid_read_syntax
, Fcons (make_string ("#", 1), Qnil
));
1129 /* Read the intervals and their properties. */
1132 Lisp_Object beg
, end
, plist
;
1134 beg
= read1 (readcharfun
);
1135 if (XTYPE (beg
) == Lisp_Internal
)
1137 if (XINT (beg
) == ')')
1139 Fsignal (Qinvalid_read_syntax
, Fcons (make_string ("invalid string property list", 28), Qnil
));
1141 end
= read1 (readcharfun
);
1142 if (XTYPE (end
) == Lisp_Internal
)
1143 Fsignal (Qinvalid_read_syntax
,
1144 Fcons (make_string ("invalid string property list", 28), Qnil
));
1146 plist
= read1 (readcharfun
);
1147 if (XTYPE (plist
) == Lisp_Internal
)
1148 Fsignal (Qinvalid_read_syntax
,
1149 Fcons (make_string ("invalid string property list", 28), Qnil
));
1150 Fset_text_properties (beg
, end
, plist
, tmp
);
1157 Fsignal (Qinvalid_read_syntax
, Fcons (make_string ("#", 1), Qnil
));
1160 while ((c
= READCHAR
) >= 0 && c
!= '\n');
1165 return Fcons (Qquote
, Fcons (read0 (readcharfun
), Qnil
));
1170 register Lisp_Object val
;
1173 if (c
< 0) return Fsignal (Qend_of_file
, Qnil
);
1176 XSET (val
, Lisp_Int
, read_escape (readcharfun
));
1178 XSET (val
, Lisp_Int
, c
);
1185 register char *p
= read_buffer
;
1186 register char *end
= read_buffer
+ read_buffer_size
;
1190 while ((c
= READCHAR
) >= 0
1195 char *new = (char *) xrealloc (read_buffer
, read_buffer_size
*= 2);
1196 p
+= new - read_buffer
;
1197 read_buffer
+= new - read_buffer
;
1198 end
= read_buffer
+ read_buffer_size
;
1201 c
= read_escape (readcharfun
);
1202 /* c is -1 if \ newline has just been seen */
1205 if (p
== read_buffer
)
1208 else if (c
& CHAR_META
)
1209 /* Move the meta bit to the right place for a string. */
1210 *p
++ = (c
& ~CHAR_META
) | 0x80;
1214 if (c
< 0) return Fsignal (Qend_of_file
, Qnil
);
1216 /* If purifying, and string starts with \ newline,
1217 return zero instead. This is for doc strings
1218 that we are really going to find in etc/DOC.nn.nn */
1219 if (!NILP (Vpurify_flag
) && NILP (Vdoc_file_name
) && cancel
)
1220 return make_number (0);
1223 return make_pure_string (read_buffer
, p
- read_buffer
);
1225 return make_string (read_buffer
, p
- read_buffer
);
1230 #ifdef LISP_FLOAT_TYPE
1231 /* If a period is followed by a number, then we should read it
1232 as a floating point number. Otherwise, it denotes a dotted
1234 int next_char
= READCHAR
;
1237 if (! isdigit (next_char
))
1240 register Lisp_Object val
;
1241 XSET (val
, Lisp_Internal
, c
);
1245 /* Otherwise, we fall through! Note that the atom-reading loop
1246 below will now loop at least once, assuring that we will not
1247 try to UNREAD two characters in a row. */
1250 if (c
<= 040) goto retry
;
1252 register char *p
= read_buffer
;
1256 register char *end
= read_buffer
+ read_buffer_size
;
1259 !(c
== '\"' || c
== '\'' || c
== ';' || c
== '?'
1260 || c
== '(' || c
== ')'
1261 #ifndef LISP_FLOAT_TYPE
1262 /* If we have floating-point support, then we need
1263 to allow <digits><dot><digits>. */
1265 #endif /* not LISP_FLOAT_TYPE */
1266 || c
== '[' || c
== ']' || c
== '#'
1271 register char *new = (char *) xrealloc (read_buffer
, read_buffer_size
*= 2);
1272 p
+= new - read_buffer
;
1273 read_buffer
+= new - read_buffer
;
1274 end
= read_buffer
+ read_buffer_size
;
1287 char *new = (char *) xrealloc (read_buffer
, read_buffer_size
*= 2);
1288 p
+= new - read_buffer
;
1289 read_buffer
+= new - read_buffer
;
1290 /* end = read_buffer + read_buffer_size; */
1300 register Lisp_Object val
;
1302 if (*p1
== '+' || *p1
== '-') p1
++;
1303 /* Is it an integer? */
1306 while (p1
!= p
&& (c
= *p1
) >= '0' && c
<= '9') p1
++;
1307 #ifdef LISP_FLOAT_TYPE
1308 /* Integers can have trailing decimal points. */
1309 if (p1
> read_buffer
&& p1
< p
&& *p1
== '.') p1
++;
1312 /* It is an integer. */
1314 #ifdef LISP_FLOAT_TYPE
1318 XSET (val
, Lisp_Int
, atoi (read_buffer
));
1322 #ifdef LISP_FLOAT_TYPE
1323 if (isfloat_string (read_buffer
))
1324 return make_float (atof (read_buffer
));
1328 return intern (read_buffer
);
1333 #ifdef LISP_FLOAT_TYPE
1348 if (*cp
== '+' || *cp
== '-')
1354 while (isdigit (*cp
))
1365 while (isdigit (*cp
))
1373 if ((*cp
== '+') || (*cp
== '-'))
1379 while (isdigit (*cp
))
1383 && (state
== (LEAD_INT
|DOT_CHAR
|TRAIL_INT
)
1384 || state
== (DOT_CHAR
|TRAIL_INT
)
1385 || state
== (LEAD_INT
|E_CHAR
|EXP_INT
)
1386 || state
== (LEAD_INT
|DOT_CHAR
|TRAIL_INT
|E_CHAR
|EXP_INT
)
1387 || state
== (DOT_CHAR
|TRAIL_INT
|E_CHAR
|EXP_INT
)));
1389 #endif /* LISP_FLOAT_TYPE */
1392 read_vector (readcharfun
)
1393 Lisp_Object readcharfun
;
1397 register Lisp_Object
*ptr
;
1398 register Lisp_Object tem
, vector
;
1399 register struct Lisp_Cons
*otem
;
1402 tem
= read_list (1, readcharfun
);
1403 len
= Flength (tem
);
1404 vector
= (read_pure
? make_pure_vector (XINT (len
)) : Fmake_vector (len
, Qnil
));
1407 size
= XVECTOR (vector
)->size
;
1408 ptr
= XVECTOR (vector
)->contents
;
1409 for (i
= 0; i
< size
; i
++)
1411 ptr
[i
] = read_pure
? Fpurecopy (Fcar (tem
)) : Fcar (tem
);
1419 /* flag = 1 means check for ] to terminate rather than ) and .
1420 flag = -1 means check for starting with defun
1421 and make structure pure. */
1424 read_list (flag
, readcharfun
)
1426 register Lisp_Object readcharfun
;
1428 /* -1 means check next element for defun,
1429 0 means don't check,
1430 1 means already checked and found defun. */
1431 int defunflag
= flag
< 0 ? -1 : 0;
1432 Lisp_Object val
, tail
;
1433 register Lisp_Object elt
, tem
;
1434 struct gcpro gcpro1
, gcpro2
;
1442 elt
= read1 (readcharfun
);
1444 if (XTYPE (elt
) == Lisp_Internal
)
1448 if (XINT (elt
) == ']')
1450 return Fsignal (Qinvalid_read_syntax
, Fcons (make_string (") or . in a vector", 18), Qnil
));
1452 if (XINT (elt
) == ')')
1454 if (XINT (elt
) == '.')
1458 XCONS (tail
)->cdr
= read0 (readcharfun
);
1460 val
= read0 (readcharfun
);
1461 elt
= read1 (readcharfun
);
1463 if (XTYPE (elt
) == Lisp_Internal
&& XINT (elt
) == ')')
1465 return Fsignal (Qinvalid_read_syntax
, Fcons (make_string (". in wrong context", 18), Qnil
));
1467 return Fsignal (Qinvalid_read_syntax
, Fcons (make_string ("] in a list", 11), Qnil
));
1469 tem
= (read_pure
&& flag
<= 0
1470 ? pure_cons (elt
, Qnil
)
1471 : Fcons (elt
, Qnil
));
1473 XCONS (tail
)->cdr
= tem
;
1478 defunflag
= EQ (elt
, Qdefun
);
1479 else if (defunflag
> 0)
1484 Lisp_Object Vobarray
;
1485 Lisp_Object initial_obarray
;
1488 check_obarray (obarray
)
1489 Lisp_Object obarray
;
1491 while (XTYPE (obarray
) != Lisp_Vector
|| XVECTOR (obarray
)->size
== 0)
1493 /* If Vobarray is now invalid, force it to be valid. */
1494 if (EQ (Vobarray
, obarray
)) Vobarray
= initial_obarray
;
1496 obarray
= wrong_type_argument (Qvectorp
, obarray
);
1501 static int hash_string ();
1502 Lisp_Object
oblookup ();
1509 int len
= strlen (str
);
1510 Lisp_Object obarray
= Vobarray
;
1512 if (XTYPE (obarray
) != Lisp_Vector
|| XVECTOR (obarray
)->size
== 0)
1513 obarray
= check_obarray (obarray
);
1514 tem
= oblookup (obarray
, str
, len
);
1515 if (XTYPE (tem
) == Lisp_Symbol
)
1517 return Fintern ((!NILP (Vpurify_flag
)
1518 ? make_pure_string (str
, len
)
1519 : make_string (str
, len
)),
1523 DEFUN ("intern", Fintern
, Sintern
, 1, 2, 0,
1524 "Return the canonical symbol whose name is STRING.\n\
1525 If there is none, one is created by this function and returned.\n\
1526 A second optional argument specifies the obarray to use;\n\
1527 it defaults to the value of `obarray'.")
1529 Lisp_Object str
, obarray
;
1531 register Lisp_Object tem
, sym
, *ptr
;
1533 if (NILP (obarray
)) obarray
= Vobarray
;
1534 obarray
= check_obarray (obarray
);
1536 CHECK_STRING (str
, 0);
1538 tem
= oblookup (obarray
, XSTRING (str
)->data
, XSTRING (str
)->size
);
1539 if (XTYPE (tem
) != Lisp_Int
)
1542 if (!NILP (Vpurify_flag
))
1543 str
= Fpurecopy (str
);
1544 sym
= Fmake_symbol (str
);
1546 ptr
= &XVECTOR (obarray
)->contents
[XINT (tem
)];
1547 if (XTYPE (*ptr
) == Lisp_Symbol
)
1548 XSYMBOL (sym
)->next
= XSYMBOL (*ptr
);
1550 XSYMBOL (sym
)->next
= 0;
1555 DEFUN ("intern-soft", Fintern_soft
, Sintern_soft
, 1, 2, 0,
1556 "Return the canonical symbol whose name is STRING, or nil if none exists.\n\
1557 A second optional argument specifies the obarray to use;\n\
1558 it defaults to the value of `obarray'.")
1560 Lisp_Object str
, obarray
;
1562 register Lisp_Object tem
;
1564 if (NILP (obarray
)) obarray
= Vobarray
;
1565 obarray
= check_obarray (obarray
);
1567 CHECK_STRING (str
, 0);
1569 tem
= oblookup (obarray
, XSTRING (str
)->data
, XSTRING (str
)->size
);
1570 if (XTYPE (tem
) != Lisp_Int
)
1576 oblookup (obarray
, ptr
, size
)
1577 Lisp_Object obarray
;
1582 register Lisp_Object tail
;
1583 Lisp_Object bucket
, tem
;
1585 if (XTYPE (obarray
) != Lisp_Vector
1586 || (obsize
= XVECTOR (obarray
)->size
) == 0)
1588 obarray
= check_obarray (obarray
);
1589 obsize
= XVECTOR (obarray
)->size
;
1591 /* Combining next two lines breaks VMS C 2.3. */
1592 hash
= hash_string (ptr
, size
);
1594 bucket
= XVECTOR (obarray
)->contents
[hash
];
1595 if (XFASTINT (bucket
) == 0)
1597 else if (XTYPE (bucket
) != Lisp_Symbol
)
1598 error ("Bad data in guts of obarray"); /* Like CADR error message */
1599 else for (tail
= bucket
; ; XSET (tail
, Lisp_Symbol
, XSYMBOL (tail
)->next
))
1601 if (XSYMBOL (tail
)->name
->size
== size
&&
1602 !bcmp (XSYMBOL (tail
)->name
->data
, ptr
, size
))
1604 else if (XSYMBOL (tail
)->next
== 0)
1607 XSET (tem
, Lisp_Int
, hash
);
1612 hash_string (ptr
, len
)
1616 register unsigned char *p
= ptr
;
1617 register unsigned char *end
= p
+ len
;
1618 register unsigned char c
;
1619 register int hash
= 0;
1624 if (c
>= 0140) c
-= 40;
1625 hash
= ((hash
<<3) + (hash
>>28) + c
);
1627 return hash
& 07777777777;
1631 map_obarray (obarray
, fn
, arg
)
1632 Lisp_Object obarray
;
1637 register Lisp_Object tail
;
1638 CHECK_VECTOR (obarray
, 1);
1639 for (i
= XVECTOR (obarray
)->size
- 1; i
>= 0; i
--)
1641 tail
= XVECTOR (obarray
)->contents
[i
];
1642 if (XFASTINT (tail
) != 0)
1646 if (XSYMBOL (tail
)->next
== 0)
1648 XSET (tail
, Lisp_Symbol
, XSYMBOL (tail
)->next
);
1653 mapatoms_1 (sym
, function
)
1654 Lisp_Object sym
, function
;
1656 call1 (function
, sym
);
1659 DEFUN ("mapatoms", Fmapatoms
, Smapatoms
, 1, 2, 0,
1660 "Call FUNCTION on every symbol in OBARRAY.\n\
1661 OBARRAY defaults to the value of `obarray'.")
1663 Lisp_Object function
, obarray
;
1667 if (NILP (obarray
)) obarray
= Vobarray
;
1668 obarray
= check_obarray (obarray
);
1670 map_obarray (obarray
, mapatoms_1
, function
);
1674 #define OBARRAY_SIZE 1511
1679 Lisp_Object oblength
;
1683 XFASTINT (oblength
) = OBARRAY_SIZE
;
1685 Qnil
= Fmake_symbol (make_pure_string ("nil", 3));
1686 Vobarray
= Fmake_vector (oblength
, make_number (0));
1687 initial_obarray
= Vobarray
;
1688 staticpro (&initial_obarray
);
1689 /* Intern nil in the obarray */
1690 /* These locals are to kludge around a pyramid compiler bug. */
1691 hash
= hash_string ("nil", 3);
1692 /* Separate statement here to avoid VAXC bug. */
1693 hash
%= OBARRAY_SIZE
;
1694 tem
= &XVECTOR (Vobarray
)->contents
[hash
];
1697 Qunbound
= Fmake_symbol (make_pure_string ("unbound", 7));
1698 XSYMBOL (Qnil
)->function
= Qunbound
;
1699 XSYMBOL (Qunbound
)->value
= Qunbound
;
1700 XSYMBOL (Qunbound
)->function
= Qunbound
;
1703 XSYMBOL (Qnil
)->value
= Qnil
;
1704 XSYMBOL (Qnil
)->plist
= Qnil
;
1705 XSYMBOL (Qt
)->value
= Qt
;
1707 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */
1710 Qvariable_documentation
= intern ("variable-documentation");
1712 read_buffer_size
= 100;
1713 read_buffer
= (char *) malloc (read_buffer_size
);
1718 struct Lisp_Subr
*sname
;
1721 sym
= intern (sname
->symbol_name
);
1722 XSET (XSYMBOL (sym
)->function
, Lisp_Subr
, sname
);
1725 #ifdef NOTDEF /* use fset in subr.el now */
1727 defalias (sname
, string
)
1728 struct Lisp_Subr
*sname
;
1732 sym
= intern (string
);
1733 XSET (XSYMBOL (sym
)->function
, Lisp_Subr
, sname
);
1737 /* New replacement for DefIntVar; it ignores the doc string argument
1738 on the assumption that make-docfile will handle that. */
1739 /* Define an "integer variable"; a symbol whose value is forwarded
1740 to a C variable of type int. Sample call: */
1741 /* DEFVARINT ("indent-tabs-mode", &indent_tabs_mode, "Documentation"); */
1744 defvar_int (namestring
, address
, doc
)
1750 sym
= intern (namestring
);
1751 XSET (XSYMBOL (sym
)->value
, Lisp_Intfwd
, address
);
1754 /* Similar but define a variable whose value is T if address contains 1,
1755 NIL if address contains 0 */
1758 defvar_bool (namestring
, address
, doc
)
1764 sym
= intern (namestring
);
1765 XSET (XSYMBOL (sym
)->value
, Lisp_Boolfwd
, address
);
1768 /* Similar but define a variable whose value is the Lisp Object stored at address. */
1771 defvar_lisp (namestring
, address
, doc
)
1773 Lisp_Object
*address
;
1777 sym
= intern (namestring
);
1778 XSET (XSYMBOL (sym
)->value
, Lisp_Objfwd
, address
);
1779 staticpro (address
);
1782 /* Similar but don't request gc-marking of the C variable.
1783 Used when that variable will be gc-marked for some other reason,
1784 since marking the same slot twice can cause trouble with strings. */
1787 defvar_lisp_nopro (namestring
, address
, doc
)
1789 Lisp_Object
*address
;
1793 sym
= intern (namestring
);
1794 XSET (XSYMBOL (sym
)->value
, Lisp_Objfwd
, address
);
1799 /* Similar but define a variable whose value is the Lisp Object stored in
1800 the current buffer. address is the address of the slot in the buffer that is current now. */
1803 defvar_per_buffer (namestring
, address
, type
, doc
)
1805 Lisp_Object
*address
;
1811 extern struct buffer buffer_local_symbols
;
1813 sym
= intern (namestring
);
1814 offset
= (char *)address
- (char *)current_buffer
;
1816 XSET (XSYMBOL (sym
)->value
, Lisp_Buffer_Objfwd
,
1817 (Lisp_Object
*) offset
);
1818 *(Lisp_Object
*)(offset
+ (char *)&buffer_local_symbols
) = sym
;
1819 *(Lisp_Object
*)(offset
+ (char *)&buffer_local_types
) = type
;
1820 if (*(int *)(offset
+ (char *)&buffer_local_flags
) == 0)
1821 /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
1822 slot of buffer_local_flags */
1826 #endif /* standalone */
1832 /* Compute the default load-path. */
1834 normal
= PATH_LOADSEARCH
;
1835 Vload_path
= decode_env_path (0, normal
);
1837 if (NILP (Vpurify_flag
))
1838 normal
= PATH_LOADSEARCH
;
1840 normal
= PATH_DUMPLOADSEARCH
;
1842 /* In a dumped Emacs, we normally have to reset the value of
1843 Vload_path from PATH_LOADSEARCH, since the value that was dumped
1844 uses ../lisp, instead of the path of the installed elisp
1845 libraries. However, if it appears that Vload_path was changed
1846 from the default before dumping, don't override that value. */
1849 Lisp_Object dump_path
;
1851 dump_path
= decode_env_path (0, PATH_DUMPLOADSEARCH
);
1852 if (! NILP (Fequal (dump_path
, Vload_path
)))
1854 Vload_path
= decode_env_path (0, normal
);
1855 if (!NILP (Vinstallation_directory
))
1857 /* Add to the path the lisp subdir of the
1858 installation dir. */
1860 tem
= Fexpand_file_name (build_string ("lisp"),
1861 Vinstallation_directory
);
1862 if (NILP (Fmember (tem
, Vload_path
)))
1863 Vload_path
= nconc2 (Vload_path
, Fcons (tem
, Qnil
));
1868 Vload_path
= decode_env_path (0, normal
);
1871 /* Warn if dirs in the *standard* path don't exist. */
1873 Lisp_Object path_tail
;
1875 for (path_tail
= Vload_path
;
1877 path_tail
= XCONS (path_tail
)->cdr
)
1879 Lisp_Object dirfile
;
1880 dirfile
= Fcar (path_tail
);
1881 if (XTYPE (dirfile
) == Lisp_String
)
1883 dirfile
= Fdirectory_file_name (dirfile
);
1884 if (access (XSTRING (dirfile
)->data
, 0) < 0)
1885 fprintf (stderr
, "Warning: lisp library (%s) does not exist.\n",
1886 XSTRING (Fcar (path_tail
))->data
);
1891 /* If the EMACSLOADPATH environment variable is set, use its value.
1892 This doesn't apply if we're dumping. */
1893 if (NILP (Vpurify_flag
)
1894 && egetenv ("EMACSLOADPATH"))
1895 Vload_path
= decode_env_path ("EMACSLOADPATH", normal
);
1899 load_in_progress
= 0;
1901 load_descriptor_list
= Qnil
;
1908 defsubr (&Sread_from_string
);
1910 defsubr (&Sintern_soft
);
1912 defsubr (&Seval_buffer
);
1913 defsubr (&Seval_region
);
1914 defsubr (&Sread_char
);
1915 defsubr (&Sread_char_exclusive
);
1916 defsubr (&Sread_event
);
1917 defsubr (&Sget_file_char
);
1918 defsubr (&Smapatoms
);
1920 DEFVAR_LISP ("obarray", &Vobarray
,
1921 "Symbol table for use by `intern' and `read'.\n\
1922 It is a vector whose length ought to be prime for best results.\n\
1923 The vector's contents don't make sense if examined from Lisp programs;\n\
1924 to find all the symbols in an obarray, use `mapatoms'.");
1926 DEFVAR_LISP ("values", &Vvalues
,
1927 "List of values of all expressions which were read, evaluated and printed.\n\
1928 Order is reverse chronological.");
1930 DEFVAR_LISP ("standard-input", &Vstandard_input
,
1931 "Stream for read to get input from.\n\
1932 See documentation of `read' for possible values.");
1933 Vstandard_input
= Qt
;
1935 DEFVAR_LISP ("load-path", &Vload_path
,
1936 "*List of directories to search for files to load.\n\
1937 Each element is a string (directory name) or nil (try default directory).\n\
1938 Initialized based on EMACSLOADPATH environment variable, if any,\n\
1939 otherwise to default specified by file `paths.h' when Emacs was built.");
1941 DEFVAR_BOOL ("load-in-progress", &load_in_progress
,
1942 "Non-nil iff inside of `load'.");
1944 DEFVAR_LISP ("after-load-alist", &Vafter_load_alist
,
1945 "An alist of expressions to be evalled when particular files are loaded.\n\
1946 Each element looks like (FILENAME FORMS...).\n\
1947 When `load' is run and the file-name argument is FILENAME,\n\
1948 the FORMS in the corresponding element are executed at the end of loading.\n\n\
1949 FILENAME must match exactly! Normally FILENAME is the name of a library,\n\
1950 with no directory specified, since that is how `load' is normally called.\n\
1951 An error in FORMS does not undo the load,\n\
1952 but does prevent execution of the rest of the FORMS.");
1953 Vafter_load_alist
= Qnil
;
1955 DEFVAR_LISP ("load-history", &Vload_history
,
1956 "Alist mapping source file names to symbols and features.\n\
1957 Each alist element is a list that starts with a file name,\n\
1958 except for one element (optional) that starts with nil and describes\n\
1959 definitions evaluated from buffers not visiting files.\n\
1960 The remaining elements of each list are symbols defined as functions\n\
1961 or variables, and cons cells `(provide . FEATURE)' and `(require . FEATURE)'.");
1962 Vload_history
= Qnil
;
1964 DEFVAR_LISP ("current-load-list", &Vcurrent_load_list
,
1965 "Used for internal purposes by `load'.");
1966 Vcurrent_load_list
= Qnil
;
1968 load_descriptor_list
= Qnil
;
1969 staticpro (&load_descriptor_list
);
1971 Qcurrent_load_list
= intern ("current-load-list");
1972 staticpro (&Qcurrent_load_list
);
1974 Qstandard_input
= intern ("standard-input");
1975 staticpro (&Qstandard_input
);
1977 Qread_char
= intern ("read-char");
1978 staticpro (&Qread_char
);
1980 Qget_file_char
= intern ("get-file-char");
1981 staticpro (&Qget_file_char
);
1983 Qascii_character
= intern ("ascii-character");
1984 staticpro (&Qascii_character
);
1986 Qload
= intern ("load");