1 /* Lisp parsing and input streams.
2 Copyright (C) 1985-1989, 1992-1995 Free Software Foundation, Inc.
3 Copyright (C) 1995 Tinker Systems.
4 Copyright (C) 1996 Ben Wing.
6 This file is part of XEmacs.
8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with XEmacs; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
23 /* Synched up with: Mule 2.0, FSF 19.30. */
25 /* This file has been Mule-ized. */
36 #include "file-coding.h"
41 #ifdef LISP_FLOAT_TYPE
42 #define THIS_FILENAME lread
44 #endif /* LISP_FLOAT_TYPE */
46 Lisp_Object Qread_char, Qstandard_input;
47 Lisp_Object Qvariable_documentation;
48 #define LISP_BACKQUOTES
49 #ifdef LISP_BACKQUOTES
51 Nonzero means inside a new-style backquote
52 with no surrounding parentheses.
53 Fread initializes this to zero, so we need not specbind it
54 or worry about what happens to it when there is an error.
57 Nested backquotes are perfectly legal and fail utterly with
59 static int new_backquote_flag, old_backquote_flag;
60 Lisp_Object Qbackquote, Qbacktick, Qcomma, Qcomma_at, Qcomma_dot;
62 Lisp_Object Qvariable_domain; /* I18N3 */
63 Lisp_Object Vvalues, Vstandard_input, Vafter_load_alist;
64 Lisp_Object Qcurrent_load_list;
65 Lisp_Object Qload, Qload_file_name;
68 /* Hash-table that maps directory names to hashes of their contents. */
69 static Lisp_Object Vlocate_file_hash_table;
71 Lisp_Object Qexists, Qreadable, Qwritable, Qexecutable;
73 /* See read_escape() for an explanation of this. */
75 int fail_on_bucky_bit_character_escapes;
78 /* This symbol is also used in fns.c */
79 #define FEATUREP_SYNTAX
81 #ifdef FEATUREP_SYNTAX
82 Lisp_Object Qfeaturep;
85 /* non-zero if inside `load' */
88 /* Whether Fload_internal() should check whether the .el is newer
90 int load_warn_when_source_newer;
91 /* Whether Fload_internal() should check whether the .elc doesn't exist */
92 int load_warn_when_source_only;
93 /* Whether Fload_internal() should ignore .elc files when no suffix is given */
94 int load_ignore_elc_files;
96 /* Search path for files to be loaded. */
97 Lisp_Object Vload_path;
99 /* Search path for files when dumping. */
100 /* Lisp_Object Vdump_load_path; */
102 /* This is the user-visible association list that maps features to
103 lists of defs in their load files. */
104 Lisp_Object Vload_history;
106 /* This is used to build the load history. */
107 Lisp_Object Vcurrent_load_list;
109 /* Name of file actually being read by `load'. */
110 Lisp_Object Vload_file_name;
112 /* Same as Vload_file_name but not Lisp-accessible. This ensures that
113 our #$ checks are reliable. */
114 Lisp_Object Vload_file_name_internal;
116 Lisp_Object Vload_file_name_internal_the_purecopy;
118 /* Function to use for reading, in `load' and friends. */
119 Lisp_Object Vload_read_function;
121 /* The association list of objects read with the #n=object form.
122 Each member of the list has the form (n . object), and is used to
123 look up the object for the corresponding #n# construct.
124 It must be set to nil before all top-level calls to read0. */
125 Lisp_Object Vread_objects;
127 /* Nonzero means load should forcibly load all dynamic doc strings. */
128 /* Note that this always happens (with some special behavior) when
129 purify_flag is set. */
130 static int load_force_doc_strings;
132 /* List of descriptors now open for Fload_internal. */
133 static Lisp_Object Vload_descriptor_list;
135 /* In order to implement "load_force_doc_strings", we keep
136 a list of all the compiled-function objects and such
137 that we have created in the process of loading this file.
140 We specbind this just like Vload_file_name, so there's no
141 problems with recursive loading. */
142 static Lisp_Object Vload_force_doc_string_list;
144 /* A resizing-buffer stream used to temporarily hold data while reading */
145 static Lisp_Object Vread_buffer_stream;
147 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
148 Lisp_Object Vcurrent_compiled_function_annotation;
151 static int load_byte_code_version;
153 /* An array describing all known built-in structure types */
154 static structure_type_dynarr *the_structure_type_dynarr;
156 #if 0 /* FSF defun hack */
157 /* When nonzero, read conses in pure space */
158 static int read_pure;
161 #if 0 /* FSF stuff */
162 /* For use within read-from-string (this reader is non-reentrant!!) */
163 static int read_from_string_index;
164 static int read_from_string_limit;
167 #if 0 /* More FSF implementation kludges. */
168 /* In order to implement load-force-doc-string, FSF saves the
169 #@-quoted string when it's seen, and goes back and retrieves
172 This approach is not only kludgy, but it in general won't work
173 correctly because there's no stack of remembered #@-quoted-strings
174 and those strings don't generally appear in the file in the same
175 order as their #$ references. (Yes, that is amazingly stupid too.
177 It would be trivially easy to always encode the #@ string
178 [which is a comment, anyway] in the middle of the (#$ . INT) cons
179 reference. That way, it would be really easy to implement
180 load-force-doc-string in a non-kludgy way by just retrieving the
181 string immediately, because it's delivered on a silver platter.)
183 And finally, this stupid approach doesn't work under Mule, or
184 under MS-DOS or Windows NT, or under VMS, or any other place
185 where you either can't do an ftell() or don't get back a byte
188 Oh, and one more lossage in this approach: If you attempt to
189 dump any ELC files that were compiled with `byte-compile-dynamic'
190 (as opposed to just `byte-compile-dynamic-docstring'), you
191 get hosed. FMH! (as the illustrious JWZ was prone to utter)
193 The approach we use is clean, solves all of these problems, and is
194 probably easier to implement anyway. We just save a list of all
195 the containing objects that have (#$ . INT) conses in them (this
196 will only be compiled-function objects and lists), and when the
197 file is finished loading, we go through and fill in all the
198 doc strings at once. */
200 /* This contains the last string skipped with #@. */
201 static char *saved_doc_string;
202 /* Length of buffer allocated in saved_doc_string. */
203 static int saved_doc_string_size;
204 /* Length of actual data in saved_doc_string. */
205 static int saved_doc_string_length;
206 /* This is the file position that string came from. */
207 static int saved_doc_string_position;
210 EXFUN (Fread_from_string, 3);
212 /* When errors are signaled, the actual readcharfun should not be used
213 as an argument if it is an lstream, so that lstreams don't escape
214 to the Lisp level. */
215 #define READCHARFUN_MAYBE(x) (LSTREAMP (x) \
216 ? (build_string ("internal input stream")) \
221 syntax_error (CONST char *string)
223 signal_error (Qinvalid_read_syntax,
224 list1 (build_translated_string (string)));
228 continuable_syntax_error (CONST char *string)
230 return Fsignal (Qinvalid_read_syntax,
231 list1 (build_translated_string (string)));
235 /* Handle unreading and rereading of characters. */
237 readchar (Lisp_Object readcharfun)
239 /* This function can GC */
241 if (BUFFERP (readcharfun))
244 struct buffer *b = XBUFFER (readcharfun);
246 if (!BUFFER_LIVE_P (b))
247 error ("Reading from killed buffer");
249 if (BUF_PT (b) >= BUF_ZV (b))
251 c = BUF_FETCH_CHAR (b, BUF_PT (b));
252 BUF_SET_PT (b, BUF_PT (b) + 1);
256 else if (LSTREAMP (readcharfun))
258 Emchar c = Lstream_get_emchar (XLSTREAM (readcharfun));
259 #ifdef DEBUG_XEMACS /* testing Mule */
260 static int testing_mule = 0; /* Change via debugger */
262 if (c >= 0x20 && c <= 0x7E) fprintf (stderr, "%c", c);
263 else if (c == '\n') fprintf (stderr, "\\n\n");
264 else fprintf (stderr, "\\%o ", c);
269 else if (MARKERP (readcharfun))
272 Bufpos mpos = marker_position (readcharfun);
273 struct buffer *inbuffer = XMARKER (readcharfun)->buffer;
275 if (mpos >= BUF_ZV (inbuffer))
277 c = BUF_FETCH_CHAR (inbuffer, mpos);
278 set_marker_position (readcharfun, mpos + 1);
283 Lisp_Object tem = call0 (readcharfun);
285 if (!CHAR_OR_CHAR_INTP (tem))
287 return XCHAR_OR_CHAR_INT (tem);
291 /* Unread the character C in the way appropriate for the stream READCHARFUN.
292 If the stream is a user function, call it with the char as argument. */
295 unreadchar (Lisp_Object readcharfun, Emchar c)
298 /* Don't back up the pointer if we're unreading the end-of-input mark,
299 since readchar didn't advance it when we read it. */
301 else if (BUFFERP (readcharfun))
302 BUF_SET_PT (XBUFFER (readcharfun), BUF_PT (XBUFFER (readcharfun)) - 1);
303 else if (LSTREAMP (readcharfun))
305 Lstream_unget_emchar (XLSTREAM (readcharfun), c);
306 #ifdef DEBUG_XEMACS /* testing Mule */
308 static int testing_mule = 0; /* Set this using debugger */
311 (c >= 0x20 && c <= 0x7E) ? "UU%c" :
312 ((c == '\n') ? "UU\\n\n" : "UU\\%o"), c);
316 else if (MARKERP (readcharfun))
317 set_marker_position (readcharfun, marker_position (readcharfun) - 1);
319 call1 (readcharfun, make_char (c));
322 static Lisp_Object read0 (Lisp_Object readcharfun);
323 static Lisp_Object read1 (Lisp_Object readcharfun);
324 /* allow_dotted_lists means that something like (foo bar . baz)
325 is acceptable. If -1, means check for starting with defun
326 and make structure pure. (not implemented, probably for very
330 If check_for_doc_references, look for (#$ . INT) doc references
331 in the list and record if load_force_doc_strings is non-zero.
332 (Such doc references will be destroyed during the loadup phase
333 by replacing with Qzero, because Snarf-documentation will fill
336 WARNING: If you set this, you sure as hell better not call
337 free_list() on the returned list here. */
339 static Lisp_Object read_list (Lisp_Object readcharfun,
341 int allow_dotted_lists,
342 int check_for_doc_references);
344 static void readevalloop (Lisp_Object readcharfun,
345 Lisp_Object sourcefile,
346 Lisp_Object (*evalfun) (Lisp_Object),
350 load_unwind (Lisp_Object stream) /* used as unwind-protect function in load */
352 Lstream_close (XLSTREAM (stream));
353 if (--load_in_progress < 0)
354 load_in_progress = 0;
359 load_descriptor_unwind (Lisp_Object oldlist)
361 Vload_descriptor_list = oldlist;
366 load_file_name_internal_unwind (Lisp_Object oldval)
368 Vload_file_name_internal = oldval;
373 load_file_name_internal_the_purecopy_unwind (Lisp_Object oldval)
375 Vload_file_name_internal_the_purecopy = oldval;
380 load_byte_code_version_unwind (Lisp_Object oldval)
382 load_byte_code_version = XINT (oldval);
386 /* The plague is coming.
388 Ring around the rosy, pocket full of posy,
389 Ashes ashes, they all fall down.
392 ebolify_bytecode_constants (Lisp_Object vector)
394 int len = XVECTOR_LENGTH (vector);
397 for (i = 0; i < len; i++)
399 Lisp_Object el = XVECTOR_DATA (vector)[i];
401 /* We don't check for `eq', `equal', and the others that have
402 bytecode opcodes. This might lose if someone passes #'eq or
403 something to `funcall', but who would really do that? As
404 they say in law, we've made a "good-faith effort" to
405 unfuckify ourselves. And doing it this way avoids screwing
406 up args to `make-hash-table' and such. As it is, we have to
407 add an extra Ebola check in decode_weak_list_type(). --ben */
408 if (EQ (el, Qassoc)) el = Qold_assoc;
409 else if (EQ (el, Qdelq)) el = Qold_delq;
411 /* I think this is a bad idea because it will probably mess
413 else if (EQ (el, Qdelete)) el = Qold_delete;
415 else if (EQ (el, Qrassq)) el = Qold_rassq;
416 else if (EQ (el, Qrassoc)) el = Qold_rassoc;
418 XVECTOR_DATA (vector)[i] = el;
423 pas_de_lache_ici (int fd, Lisp_Object victim)
428 if (!INTP (XCDR (victim)))
429 signal_simple_error ("Bogus doc string reference", victim);
430 pos = XINT (XCDR (victim));
432 pos = -pos; /* kludge to mark a user variable */
433 tem = unparesseuxify_doc_string (fd, pos, 0, Vload_file_name_internal);
435 signal_error (Qerror, tem);
440 load_force_doc_string_unwind (Lisp_Object oldlist)
443 Lisp_Object list = Vload_force_doc_string_list;
445 int fd = XINT (XCAR (Vload_descriptor_list));
448 /* restore the old value first just in case an error occurs. */
449 Vload_force_doc_string_list = oldlist;
451 LIST_LOOP (tail, list)
453 Lisp_Object john = Fcar (tail);
456 assert (CONSP (XCAR (john)));
457 assert (!purify_flag); /* should have been handled in read_list() */
458 XCAR (john) = pas_de_lache_ici (fd, XCAR (john));
464 assert (COMPILED_FUNCTIONP (john));
465 if (CONSP (XCOMPILED_FUNCTION (john)->instructions))
467 struct gcpro ngcpro1;
468 Lisp_Object juan = (pas_de_lache_ici
469 (fd, XCOMPILED_FUNCTION (john)->instructions));
475 signal_simple_error ("invalid lazy-loaded byte code", ivan);
476 XCOMPILED_FUNCTION (john)->instructions = XCAR (ivan);
477 /* v18 or v19 bytecode file. Need to Ebolify. */
478 if (XCOMPILED_FUNCTION (john)->flags.ebolified
479 && VECTORP (XCDR (ivan)))
480 ebolify_bytecode_constants (XCDR (ivan));
481 XCOMPILED_FUNCTION (john)->constants = XCDR (ivan);
484 doc = compiled_function_documentation (XCOMPILED_FUNCTION (john));
487 assert (!purify_flag); /* should have been handled in
488 read_compiled_function() */
489 doc = pas_de_lache_ici (fd, doc);
490 set_compiled_function_documentation (XCOMPILED_FUNCTION (john),
503 /* Close all descriptors in use for Fload_internal.
504 This is used when starting a subprocess. */
507 close_load_descs (void)
510 LIST_LOOP (tail, Vload_descriptor_list)
511 close (XINT (XCAR (tail)));
515 Lisp_Object Vfile_domain;
518 restore_file_domain (Lisp_Object val)
525 DEFUN ("load-internal", Fload_internal, 1, 6, 0, /*
526 Execute a file of Lisp code named FILE; no coding-system frobbing.
527 This function is identical to `load' except for the handling of the
528 CODESYS and USED-CODESYS arguments under XEmacs/Mule. (When Mule
529 support is not present, both functions are identical and ignore the
530 CODESYS and USED-CODESYS arguments.)
532 If support for Mule exists in this Emacs, the file is decoded
533 according to CODESYS; if omitted, no conversion happens. If
534 USED-CODESYS is non-nil, it should be a symbol, and the actual coding
535 system that was used for the decoding is stored into it. It will in
536 general be different from CODESYS if CODESYS specifies automatic
537 encoding detection or end-of-line detection.
539 (file, no_error, nomessage, nosuffix, codesys, used_codesys))
541 /* This function can GC */
543 int speccount = specpdl_depth ();
545 Lisp_Object newer = Qnil;
546 Lisp_Object handler = Qnil;
547 Lisp_Object found = Qnil;
548 struct gcpro gcpro1, gcpro2, gcpro3;
550 int message_p = NILP (nomessage);
551 /*#ifdef DEBUG_XEMACS*/
552 static Lisp_Object last_file_loaded;
555 GCPRO3 (file, newer, found);
559 /*#ifdef DEBUG_XEMACS*/
560 if (purify_flag && noninteractive)
563 last_file_loaded = file;
565 /*#endif / * DEBUG_XEMACS */
567 /* If file name is magic, call the handler. */
568 handler = Ffind_file_name_handler (file, Qload);
570 RETURN_UNGCPRO (call5 (handler, Qload, file, no_error,
571 nomessage, nosuffix));
573 /* Do this after the handler to avoid
574 the need to gcpro noerror, nomessage and nosuffix.
575 (Below here, we care only whether they are nil or not.) */
576 file = Fsubstitute_in_file_name (file);
578 if (!NILP (used_codesys))
579 CHECK_SYMBOL (used_codesys);
582 /* Avoid weird lossage with null string as arg,
583 since it would try to load a directory as a Lisp file.
585 if (XSTRING_LENGTH (file) > 0)
590 fd = locate_file (Vload_path, file,
591 ((!NILP (nosuffix)) ? Qnil :
592 build_string (load_ignore_elc_files ? ".el:" :
600 signal_file_error ("Cannot open load file", file);
608 foundstr = (char *) alloca (XSTRING_LENGTH (found) + 1);
609 strcpy (foundstr, (char *) XSTRING_DATA (found));
610 foundlen = strlen (foundstr);
612 /* The omniscient JWZ thinks this is worthless, but I beg to
614 if (load_ignore_elc_files)
616 newer = Ffile_name_nondirectory (found);
618 else if (load_warn_when_source_newer &&
619 !memcmp (".elc", foundstr + foundlen - 4, 4))
621 if (! fstat (fd, &s1)) /* can't fail, right? */
624 /* temporarily hack the 'c' off the end of the filename */
625 foundstr[foundlen - 1] = '\0';
626 result = stat (foundstr, &s2);
628 (unsigned) s1.st_mtime < (unsigned) s2.st_mtime)
630 Lisp_Object newer_name = make_string ((Bufbyte *) foundstr,
632 struct gcpro nngcpro1;
633 NNGCPRO1 (newer_name);
634 newer = Ffile_name_nondirectory (newer_name);
637 /* put the 'c' back on (kludge-o-rama) */
638 foundstr[foundlen - 1] = 'c';
641 else if (load_warn_when_source_only &&
642 /* `found' ends in ".el" */
643 !memcmp (".el", foundstr + foundlen - 3, 3) &&
644 /* `file' does not end in ".el" */
646 XSTRING_DATA (file) + XSTRING_LENGTH (file) - 3,
652 if (!memcmp (".elc", foundstr + foundlen - 4, 4))
656 #define PRINT_LOADING_MESSAGE(done) do { \
657 if (load_ignore_elc_files) \
660 message ("Loading %s..." done, XSTRING_DATA (newer)); \
662 else if (!NILP (newer)) \
663 message ("Loading %s..." done " (file %s is newer)", \
664 XSTRING_DATA (file), \
665 XSTRING_DATA (newer)); \
666 else if (source_only) \
667 message ("Loading %s..." done " (file %s.elc does not exist)", \
668 XSTRING_DATA (file), \
669 XSTRING_DATA (Ffile_name_nondirectory (file))); \
670 else if (message_p) \
671 message ("Loading %s..." done, XSTRING_DATA (file)); \
674 PRINT_LOADING_MESSAGE ("");
677 /* Lisp_Object's must be malloc'ed, not stack-allocated */
678 Lisp_Object lispstream = Qnil;
679 CONST int block_size = 8192;
680 struct gcpro ngcpro1;
682 NGCPRO1 (lispstream);
683 lispstream = make_filedesc_input_stream (fd, 0, -1, LSTR_CLOSING);
684 /* 64K is used for normal files; 8K should be OK here because Lisp
685 files aren't really all that big. */
686 Lstream_set_buffering (XLSTREAM (lispstream), LSTREAM_BLOCKN_BUFFERED,
689 lispstream = make_decoding_input_stream
690 (XLSTREAM (lispstream), Fget_coding_system (codesys));
691 Lstream_set_buffering (XLSTREAM (lispstream), LSTREAM_BLOCKN_BUFFERED,
694 /* NOTE: Order of these is very important. Don't rearrange them. */
695 record_unwind_protect (load_unwind, lispstream);
696 record_unwind_protect (load_descriptor_unwind, Vload_descriptor_list);
697 record_unwind_protect (load_file_name_internal_unwind,
698 Vload_file_name_internal);
699 record_unwind_protect (load_file_name_internal_the_purecopy_unwind,
700 Vload_file_name_internal_the_purecopy);
701 record_unwind_protect (load_force_doc_string_unwind,
702 Vload_force_doc_string_list);
703 Vload_file_name_internal = found;
704 Vload_file_name_internal_the_purecopy = Qnil;
705 specbind (Qload_file_name, found);
706 Vload_descriptor_list = Fcons (make_int (fd), Vload_descriptor_list);
707 Vload_force_doc_string_list = Qnil;
709 record_unwind_protect (restore_file_domain, Vfile_domain);
710 Vfile_domain = Qnil; /* set it to nil; a call to #'domain will set it. */
714 /* Now determine what sort of ELC file we're reading in. */
715 record_unwind_protect (load_byte_code_version_unwind,
716 make_int (load_byte_code_version));
722 num_read = Lstream_read (XLSTREAM (lispstream), elc_header, 8);
724 || strncmp (elc_header, ";ELC", 4))
726 /* Huh? Probably not a valid ELC file. */
727 load_byte_code_version = 100; /* no Ebolification needed */
728 Lstream_unread (XLSTREAM (lispstream), elc_header, num_read);
731 load_byte_code_version = elc_header[4];
734 load_byte_code_version = 100; /* no Ebolification needed */
736 readevalloop (lispstream, file, Feval, 0);
738 if (!NILP (used_codesys))
741 (decoding_stream_coding_system (XLSTREAM (lispstream))));
743 unbind_to (speccount, Qnil);
750 /* #### Disgusting kludge */
751 /* Run any load-hooks for this file. */
752 /* #### An even more disgusting kludge. There is horrible code */
753 /* that is relying on the fact that dumped lisp files are found */
754 /* via `load-path' search. */
755 Lisp_Object name = file;
757 if (!NILP(Ffile_name_absolute_p(file)))
759 name = Ffile_name_nondirectory(file);
763 struct gcpro ngcpro1;
766 tem = Fassoc (name, Vafter_load_alist);
771 struct gcpro ngcpro1;
774 /* Use eval so that errors give a semi-meaningful backtrace. --Stig */
775 tem = Fcons (Qprogn, Fcdr (tem));
781 /*#ifdef DEBUG_XEMACS*/
782 if (purify_flag && noninteractive)
784 if (!EQ (last_file_loaded, file))
785 message ("Loading %s ...done", XSTRING_DATA (file));
787 /*#endif / * DEBUG_XEMACS */
790 PRINT_LOADING_MESSAGE ("done");
797 /* ------------------------------- */
799 /* ------------------------------- */
802 decode_mode_1 (Lisp_Object mode)
804 if (EQ (mode, Qexists))
806 else if (EQ (mode, Qexecutable))
808 else if (EQ (mode, Qwritable))
810 else if (EQ (mode, Qreadable))
812 else if (INTP (mode))
814 check_int_range (XINT (mode), 0, 7);
818 signal_simple_error ("Invalid value", mode);
819 return 0; /* unreached */
823 decode_mode (Lisp_Object mode)
827 else if (CONSP (mode))
831 EXTERNAL_LIST_LOOP (tail, mode)
832 mask |= decode_mode_1 (XCAR (tail));
836 return decode_mode_1 (mode);
839 DEFUN ("locate-file", Flocate_file, 2, 4, 0, /*
840 Search for FILENAME through PATH-LIST.
842 If SUFFIXES is non-nil, it should be a list of suffixes to append to
843 file name when searching.
845 If MODE is non-nil, it should be a symbol or a list of symbol representing
846 requirements. Allowed symbols are `exists', `executable', `writable', and
847 `readable'. If MODE is nil, it defaults to `readable'.
849 `locate-file' keeps hash tables of the directories it searches through,
850 in order to speed things up. It tries valiantly to not get confused in
851 the face of a changing and unpredictable environment, but can occasionally
852 get tripped up. In this case, you will have to call
853 `locate-file-clear-hashing' to get it back on track. See that function
856 (filename, path_list, suffixes, mode))
858 /* This function can GC */
861 CHECK_STRING (filename);
863 if (LISTP (suffixes))
866 EXTERNAL_LIST_LOOP (tail, suffixes)
867 CHECK_STRING (XCAR (tail));
870 CHECK_STRING (suffixes);
872 locate_file (path_list, filename, suffixes, &tp, decode_mode (mode));
876 /* Recalculate the hash table for the given string. DIRECTORY should
877 better have been through Fexpand_file_name() by now. */
880 locate_file_refresh_hashing (Lisp_Object directory)
883 make_directory_hash_table ((char *) XSTRING_DATA (directory));
886 Fputhash (directory, hash, Vlocate_file_hash_table);
890 /* find the hash table for the given directory, recalculating if necessary */
893 locate_file_find_directory_hash_table (Lisp_Object directory)
895 Lisp_Object hash = Fgethash (directory, Vlocate_file_hash_table, Qnil);
897 return locate_file_refresh_hashing (directory);
902 /* The SUFFIXES argument in any of the locate_file* functions can be
903 nil, a list, or a string (for backward compatibility), with the
906 a) nil - no suffix, just search for file name intact (semantically
907 different from "empty suffix list")
908 b) list - list of suffixes to append to file name. Each of these
910 c) string - colon-separated suffixes to append to file name (backward
913 All of this got hairy, so I decided to use write a mapper. Calling
914 a function for each suffix shouldn't slow things down, since
915 locate_file is rarely call with enough suffixes for it to make a
918 /* Map FUN over SUFFIXES, as described above. FUN will be called with a
919 char * containing the current file name, and ARG. Mapping stops when
920 FUN returns non-zero. */
922 locate_file_map_suffixes (Lisp_Object filename, Lisp_Object suffixes,
923 int (*fun) (char *, void *),
926 /* This function can GC */
930 /* Calculate maximum size of any filename made from
931 this path element/specified file name and any possible suffix. */
932 if (CONSP (suffixes))
934 /* We must traverse the list, so why not do it right. */
937 LIST_LOOP (tail, suffixes)
939 if (XSTRING_LENGTH (XCAR (tail)) > max)
940 max = XSTRING_LENGTH (XCAR (tail));
943 else if (NILP (suffixes))
946 /* Just take the easy way out */
947 max = XSTRING_LENGTH (suffixes);
949 fn_len = XSTRING_LENGTH (filename);
950 fn = (char *) alloca (max + fn_len + 1);
951 memcpy (fn, (char *) XSTRING_DATA (filename), fn_len);
953 /* Loop over suffixes. */
954 if (!STRINGP (suffixes))
958 /* Case a) discussed in the comment above. */
960 if ((*fun) (fn, arg))
967 LIST_LOOP (tail, suffixes)
969 memcpy (fn + fn_len, XSTRING_DATA (XCAR (tail)),
970 XSTRING_LENGTH (XCAR (tail)));
971 fn[fn_len + XSTRING_LENGTH (XCAR (tail))] = 0;
972 if ((*fun) (fn, arg))
980 CONST char *nsuffix = (CONST char *) XSTRING_DATA (suffixes);
984 char *esuffix = (char *) strchr (nsuffix, ':');
985 int lsuffix = ((esuffix) ? (esuffix - nsuffix) : strlen (nsuffix));
987 /* Concatenate path element/specified name with the suffix. */
988 strncpy (fn + fn_len, nsuffix, lsuffix);
989 fn[fn_len + lsuffix] = 0;
991 if ((*fun) (fn, arg))
994 /* Advance to next suffix. */
997 nsuffix += lsuffix + 1;
1002 struct locate_file_in_directory_mapper_closure {
1004 Lisp_Object *storeptr;
1009 locate_file_in_directory_mapper (char *fn, void *arg)
1011 struct locate_file_in_directory_mapper_closure *closure =
1012 (struct locate_file_in_directory_mapper_closure *)arg;
1015 /* Ignore file if it's a directory. */
1016 if (stat (fn, &st) >= 0
1017 && (st.st_mode & S_IFMT) != S_IFDIR)
1019 /* Check that we can access or open it. */
1020 if (closure->mode >= 0)
1021 closure->fd = access (fn, closure->mode);
1023 closure->fd = open (fn, O_RDONLY | OPEN_BINARY, 0);
1025 if (closure->fd >= 0)
1027 /* We succeeded; return this descriptor and filename. */
1028 if (closure->storeptr)
1029 *closure->storeptr = build_string (fn);
1032 /* If we actually opened the file, set close-on-exec flag
1033 on the new descriptor so that subprocesses can't whack
1035 if (closure->mode < 0)
1036 (void) fcntl (closure->fd, F_SETFD, FD_CLOEXEC);
1047 /* look for STR in PATH, optionally adding SUFFIXES. DIRECTORY need
1048 not have been expanded. */
1051 locate_file_in_directory (Lisp_Object directory, Lisp_Object str,
1052 Lisp_Object suffixes, Lisp_Object *storeptr,
1055 /* This function can GC */
1056 struct locate_file_in_directory_mapper_closure closure;
1057 Lisp_Object filename = Qnil;
1058 struct gcpro gcpro1, gcpro2, gcpro3;
1060 GCPRO3 (directory, str, filename);
1062 filename = Fexpand_file_name (str, directory);
1063 if (NILP (filename) || NILP (Ffile_name_absolute_p (filename)))
1064 /* If there are non-absolute elts in PATH (eg ".") */
1065 /* Of course, this could conceivably lose if luser sets
1066 default-directory to be something non-absolute ... */
1068 if (NILP (filename))
1069 /* NIL means current directory */
1070 filename = current_buffer->directory;
1072 filename = Fexpand_file_name (filename,
1073 current_buffer->directory);
1074 if (NILP (Ffile_name_absolute_p (filename)))
1076 /* Give up on this directory! */
1083 closure.storeptr = storeptr;
1084 closure.mode = mode;
1086 locate_file_map_suffixes (filename, suffixes, locate_file_in_directory_mapper,
1093 /* do the same as locate_file() but don't use any hash tables. */
1096 locate_file_without_hash (Lisp_Object path, Lisp_Object str,
1097 Lisp_Object suffixes, Lisp_Object *storeptr,
1100 /* This function can GC */
1101 int absolute = !NILP (Ffile_name_absolute_p (str));
1103 EXTERNAL_LIST_LOOP (path, path)
1105 int val = locate_file_in_directory (XCAR (path), str, suffixes, storeptr,
1116 locate_file_construct_suffixed_files_mapper (char *fn, void *arg)
1118 Lisp_Object *tail = (Lisp_Object *)arg;
1119 *tail = Fcons (build_string (fn), *tail);
1123 /* Construct a list of all files to search for.
1124 It makes sense to have this despite locate_file_map_suffixes()
1125 because we need Lisp strings to access the hash-table, and it would
1126 be inefficient to create them on the fly, again and again for each
1127 path component. See locate_file(). */
1130 locate_file_construct_suffixed_files (Lisp_Object filename,
1131 Lisp_Object suffixes)
1133 Lisp_Object tail = Qnil;
1134 struct gcpro gcpro1;
1137 locate_file_map_suffixes (filename, suffixes,
1138 locate_file_construct_suffixed_files_mapper,
1142 return Fnreverse (tail);
1145 DEFUN ("locate-file-clear-hashing", Flocate_file_clear_hashing, 1, 1, 0, /*
1146 Clear the hash records for the specified list of directories.
1147 `locate-file' uses a hashing scheme to speed lookup, and will correctly
1148 track the following environmental changes:
1150 -- changes of any sort to the list of directories to be searched.
1151 -- addition and deletion of non-shadowing files (see below) from the
1152 directories in the list.
1153 -- byte-compilation of a .el file into a .elc file.
1155 `locate-file' will primarily get confused if you add a file that shadows
1156 \(i.e. has the same name as) another file further down in the directory list.
1157 In this case, you must call `locate-file-clear-hashing'.
1159 If PATH is t, it means to fully clear all the accumulated hashes. This
1160 can be used if the internal tables grow too large, or when dumping.
1165 Fclrhash (Vlocate_file_hash_table);
1168 Lisp_Object pathtail;
1169 EXTERNAL_LIST_LOOP (pathtail, path)
1171 Lisp_Object pathel = Fexpand_file_name (XCAR (pathtail), Qnil);
1172 Fremhash (pathel, Vlocate_file_hash_table);
1178 /* Search for a file whose name is STR, looking in directories
1179 in the Lisp list PATH, and trying suffixes from SUFFIXES.
1180 SUFFIXES is a list of possible suffixes, or (for backward
1181 compatibility) a string containing possible suffixes separated by
1183 On success, returns a file descriptor. On failure, returns -1.
1185 MODE nonnegative means don't open the files,
1186 just look for one for which access(file,MODE) succeeds. In this case,
1187 returns 1 on success.
1189 If STOREPTR is nonzero, it points to a slot where the name of
1190 the file actually found should be stored as a Lisp string.
1191 Nil is stored there on failure.
1193 Called openp() in FSFmacs. */
1196 locate_file (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes,
1197 Lisp_Object *storeptr, int mode)
1199 /* This function can GC */
1200 Lisp_Object suffixtab = Qnil;
1201 Lisp_Object pathtail, pathel_expanded;
1203 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1208 /* Is it really necessary to gcpro path and str? It shouldn't be
1209 unless some caller has fucked up. There are known instances that
1210 call us with build_string("foo:bar") as SUFFIXES, though. */
1211 GCPRO4 (path, str, suffixes, suffixtab);
1213 /* if this filename has directory components, it's too complicated
1214 to try and use the hash tables. */
1215 if (!NILP (Ffile_name_directory (str)))
1217 val = locate_file_without_hash (path, str, suffixes, storeptr, mode);
1222 suffixtab = locate_file_construct_suffixed_files (str, suffixes);
1224 EXTERNAL_LIST_LOOP (pathtail, path)
1226 Lisp_Object pathel = XCAR (pathtail);
1227 Lisp_Object hash_table;
1231 /* If this path element is relative, we have to look by hand. */
1232 if (NILP (Ffile_name_absolute_p (pathel)))
1234 val = locate_file_in_directory (pathel, str, suffixes, storeptr,
1244 pathel_expanded = Fexpand_file_name (pathel, Qnil);
1245 hash_table = locate_file_find_directory_hash_table (pathel_expanded);
1247 if (!NILP (hash_table))
1249 /* Loop over suffixes. */
1250 LIST_LOOP (tail, suffixtab)
1251 if (!NILP (Fgethash (XCAR (tail), hash_table, Qnil)))
1260 /* This is a likely candidate. Look by hand in this directory
1261 so we don't get thrown off if someone byte-compiles a file. */
1262 val = locate_file_in_directory (pathel, str, suffixes, storeptr,
1270 /* Hmm ... the file isn't actually there. (Or possibly it's
1271 a directory ...) So refresh our hashing. */
1272 locate_file_refresh_hashing (pathel_expanded);
1276 /* File is probably not there, but check the hard way just in case. */
1277 val = locate_file_without_hash (path, str, suffixes, storeptr, mode);
1280 /* Sneaky user added a file without telling us. */
1281 Flocate_file_clear_hashing (path);
1291 /* Merge the list we've accumulated of globals from the current input source
1292 into the load_history variable. The details depend on whether
1293 the source has an associated file name or not. */
1296 build_load_history (int loading, Lisp_Object source)
1298 REGISTER Lisp_Object tail, prev, newelt;
1299 REGISTER Lisp_Object tem, tem2;
1302 #if !defined(LOADHIST_DUMPED)
1303 /* Don't bother recording anything for preloaded files. */
1308 tail = Vload_history;
1311 while (!NILP (tail))
1315 /* Find the feature's previous assoc list... */
1316 if (internal_equal (source, Fcar (tem), 0))
1320 /* If we're loading, remove it. */
1324 Vload_history = Fcdr (tail);
1326 Fsetcdr (prev, Fcdr (tail));
1329 /* Otherwise, cons on new symbols that are not already members. */
1332 tem2 = Vcurrent_load_list;
1334 while (CONSP (tem2))
1336 newelt = XCAR (tem2);
1338 if (NILP (Fmemq (newelt, tem)))
1339 Fsetcar (tail, Fcons (Fcar (tem),
1340 Fcons (newelt, Fcdr (tem))));
1353 /* If we're loading, cons the new assoc onto the front of load-history,
1354 the most-recently-loaded position. Also do this if we didn't find
1355 an existing member for the current source. */
1356 if (loading || !foundit)
1357 Vload_history = Fcons (Fnreverse (Vcurrent_load_list),
1361 #else /* !LOADHIST */
1362 #define build_load_history(x,y)
1363 #endif /* !LOADHIST */
1366 #if 0 /* FSFmacs defun hack */
1368 unreadpure (void) /* Used as unwind-protect function in readevalloop */
1376 readevalloop (Lisp_Object readcharfun,
1377 Lisp_Object sourcename,
1378 Lisp_Object (*evalfun) (Lisp_Object),
1381 /* This function can GC */
1383 REGISTER Lisp_Object val = Qnil;
1384 int speccount = specpdl_depth ();
1385 struct gcpro gcpro1, gcpro2;
1386 struct buffer *b = 0;
1388 if (BUFFERP (readcharfun))
1389 b = XBUFFER (readcharfun);
1390 else if (MARKERP (readcharfun))
1391 b = XMARKER (readcharfun)->buffer;
1393 /* Don't do this. It is not necessary, and it needlessly exposes
1394 READCHARFUN (which can be a stream) to Lisp. --hniksic */
1395 /*specbind (Qstandard_input, readcharfun);*/
1397 specbind (Qcurrent_load_list, Qnil);
1399 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
1400 Vcurrent_compiled_function_annotation = Qnil;
1402 GCPRO2 (val, sourcename);
1404 LOADHIST_ATTACH (sourcename);
1410 if (b != 0 && !BUFFER_LIVE_P (b))
1411 error ("Reading from killed buffer");
1413 c = readchar (readcharfun);
1417 while ((c = readchar (readcharfun)) != '\n' && c != -1)
1424 /* Ignore whitespace here, so we can detect eof. */
1425 if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r')
1428 #if 0 /* FSFmacs defun hack */
1429 if (purify_flag && c == '(')
1431 int count1 = specpdl_depth ();
1432 record_unwind_protect (unreadpure, Qnil);
1433 val = read_list (readcharfun, ')', -1, 1);
1434 unbind_to (count1, Qnil);
1437 #else /* No "defun hack" -- Emacs 19 uses read-time syntax for bytecodes */
1439 unreadchar (readcharfun, c);
1440 Vread_objects = Qnil;
1441 if (NILP (Vload_read_function))
1442 val = read0 (readcharfun);
1444 val = call1 (Vload_read_function, readcharfun);
1447 val = (*evalfun) (val);
1450 Vvalues = Fcons (val, Vvalues);
1451 if (EQ (Vstandard_output, Qt))
1458 build_load_history (LSTREAMP (readcharfun) ||
1459 /* This looks weird, but it's what's in FSFmacs */
1460 (b ? BUF_NARROWED (b) : BUF_NARROWED (current_buffer)),
1464 unbind_to (speccount, Qnil);
1467 DEFUN ("eval-buffer", Feval_buffer, 0, 2, "bBuffer: ", /*
1468 Execute BUFFER as Lisp code.
1469 Programs can pass two arguments, BUFFER and PRINTFLAG.
1470 BUFFER is the buffer to evaluate (nil means use current buffer).
1471 PRINTFLAG controls printing of output:
1472 nil means discard it; anything else is stream for print.
1474 If there is no error, point does not move. If there is an error,
1475 point remains at the end of the last character read from the buffer.
1476 Execute BUFFER as Lisp code.
1478 (bufname, printflag))
1480 /* This function can GC */
1481 int speccount = specpdl_depth ();
1482 Lisp_Object tem, buf;
1485 buf = Fcurrent_buffer ();
1487 buf = Fget_buffer (bufname);
1489 error ("No such buffer.");
1491 if (NILP (printflag))
1492 tem = Qsymbolp; /* #### #@[]*&$#*[& SI:NULL-STREAM */
1495 specbind (Qstandard_output, tem);
1496 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1497 BUF_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
1498 readevalloop (buf, XBUFFER (buf)->filename, Feval,
1501 return unbind_to (speccount, Qnil);
1505 xxDEFUN ("eval-current-buffer", Feval_current_buffer, 0, 1, "", /*
1506 Execute the current buffer as Lisp code.
1507 Programs can pass argument PRINTFLAG which controls printing of output:
1508 nil means discard it; anything else is stream for print.
1510 If there is no error, point does not move. If there is an error,
1511 point remains at the end of the last character read from the buffer.
1519 DEFUN ("eval-region", Feval_region, 2, 3, "r", /*
1520 Execute the region as Lisp code.
1521 When called from programs, expects two arguments,
1522 giving starting and ending indices in the current buffer
1523 of the text to be executed.
1524 Programs can pass third argument PRINTFLAG which controls output:
1525 nil means discard it; anything else is stream for printing it.
1527 If there is no error, point does not move. If there is an error,
1528 point remains at the end of the last character read from the buffer.
1530 Note: Before evaling the region, this function narrows the buffer to it.
1531 If the code being eval'd should happen to trigger a redisplay you may
1532 see some text temporarily disappear because of this.
1536 /* This function can GC */
1537 int speccount = specpdl_depth ();
1539 Lisp_Object cbuf = Fcurrent_buffer ();
1541 if (NILP (printflag))
1542 tem = Qsymbolp; /* #### #@[]*&$#*[& SI:NULL-STREAM */
1545 specbind (Qstandard_output, tem);
1547 if (NILP (printflag))
1548 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1549 record_unwind_protect (save_restriction_restore, save_restriction_save ());
1551 /* This both uses b and checks its type. */
1552 Fgoto_char (b, cbuf);
1553 Fnarrow_to_region (make_int (BUF_BEGV (current_buffer)), e, cbuf);
1554 readevalloop (cbuf, XBUFFER (cbuf)->filename, Feval,
1557 return unbind_to (speccount, Qnil);
1560 DEFUN ("read", Fread, 0, 1, 0, /*
1561 Read one Lisp expression as text from STREAM, return as Lisp object.
1562 If STREAM is nil, use the value of `standard-input' (which see).
1563 STREAM or the value of `standard-input' may be:
1564 a buffer (read from point and advance it)
1565 a marker (read from where it points and advance it)
1566 a function (call it with no arguments for each character,
1567 call it with a char as argument to push a char back)
1568 a string (takes text from string, starting at the beginning)
1569 t (read text line using minibuffer and use it).
1574 stream = Vstandard_input;
1575 if (EQ (stream, Qt))
1576 stream = Qread_char;
1578 Vread_objects = Qnil;
1580 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
1581 Vcurrent_compiled_function_annotation = Qnil;
1583 if (EQ (stream, Qread_char))
1585 Lisp_Object val = call1 (Qread_from_minibuffer,
1586 build_translated_string ("Lisp expression: "));
1587 return Fcar (Fread_from_string (val, Qnil, Qnil));
1590 if (STRINGP (stream))
1591 return Fcar (Fread_from_string (stream, Qnil, Qnil));
1593 return read0 (stream);
1596 DEFUN ("read-from-string", Fread_from_string, 1, 3, 0, /*
1597 Read one Lisp expression which is represented as text by STRING.
1598 Returns a cons: (OBJECT-READ . FINAL-STRING-INDEX).
1599 START and END optionally delimit a substring of STRING from which to read;
1600 they default to 0 and (length STRING) respectively.
1602 (string, start, end))
1604 Bytecount startval, endval;
1606 Lisp_Object lispstream = Qnil;
1607 struct gcpro gcpro1;
1609 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
1610 Vcurrent_compiled_function_annotation = Qnil;
1612 GCPRO1 (lispstream);
1613 CHECK_STRING (string);
1614 get_string_range_byte (string, start, end, &startval, &endval,
1615 GB_HISTORICAL_STRING_BEHAVIOR);
1616 lispstream = make_lisp_string_input_stream (string, startval,
1619 Vread_objects = Qnil;
1621 tem = read0 (lispstream);
1622 /* Yeah, it's ugly. Gonna make something of it?
1623 At least our reader is reentrant ... */
1625 (Fcons (tem, make_int
1626 (bytecount_to_charcount
1627 (XSTRING_DATA (string),
1628 startval + Lstream_byte_count (XLSTREAM (lispstream))))));
1629 Lstream_delete (XLSTREAM (lispstream));
1635 #ifdef LISP_BACKQUOTES
1638 backquote_unwind (Lisp_Object ptr)
1639 { /* used as unwind-protect function in read0() */
1640 int *counter = (int *) get_opaque_ptr (ptr);
1643 free_opaque_ptr (ptr);
1649 /* Use this for recursive reads, in contexts where internal tokens
1650 are not allowed. See also read1(). */
1652 read0 (Lisp_Object readcharfun)
1654 Lisp_Object val = read1 (readcharfun);
1656 if (CONSP (val) && UNBOUNDP (XCAR (val)))
1658 Emchar c = XCHAR (XCDR (val));
1659 free_cons (XCONS (val));
1660 return Fsignal (Qinvalid_read_syntax,
1661 list1 (Fchar_to_string (make_char (c))));
1668 read_escape (Lisp_Object readcharfun)
1670 /* This function can GC */
1671 Emchar c = readchar (readcharfun);
1674 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
1678 case 'a': return '\007';
1679 case 'b': return '\b';
1680 case 'd': return 0177;
1681 case 'e': return 033;
1682 case 'f': return '\f';
1683 case 'n': return '\n';
1684 case 'r': return '\r';
1685 case 't': return '\t';
1686 case 'v': return '\v';
1687 case '\n': return -1;
1690 c = readchar (readcharfun);
1692 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
1694 error ("Invalid escape character syntax");
1695 c = readchar (readcharfun);
1697 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
1699 c = read_escape (readcharfun);
1702 /* Originally, FSF_KEYS provided a degree of FSF Emacs
1703 compatibility by defining character "modifiers" alt, super,
1704 hyper and shift to infest the characters (i.e. integers).
1706 However, this doesn't cut it for XEmacs 20, which
1707 distinguishes characters from integers. Without Mule, ?\H-a
1708 simply returns ?a because every character is clipped into
1709 0-255. Under Mule it is much worse -- ?\H-a with FSF_KEYS
1710 produces an illegal character, and moves us to crash-land.
1712 For these reasons, FSF_KEYS hack is useless and without hope
1713 of ever working under XEmacs 20. */
1717 #define alt_modifier (0x040000)
1718 #define super_modifier (0x080000)
1719 #define hyper_modifier (0x100000)
1720 #define shift_modifier (0x200000)
1721 /* fsf uses a different modifiers for meta and control. Possibly
1722 byte_compiled code will still work fsfmacs, though... --Stig
1724 #define ctl_modifier (0x400000)
1725 #define meta_modifier (0x800000)
1727 #define FSF_LOSSAGE(mask) \
1728 if (fail_on_bucky_bit_character_escapes || \
1729 ((c = readchar (readcharfun)) != '-')) \
1730 error ("Invalid escape character syntax"); \
1731 c = readchar (readcharfun); \
1733 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun))); \
1735 c = read_escape (readcharfun); \
1738 case 'S': FSF_LOSSAGE (shift_modifier);
1739 case 'H': FSF_LOSSAGE (hyper_modifier);
1740 case 'A': FSF_LOSSAGE (alt_modifier);
1741 case 's': FSF_LOSSAGE (super_modifier);
1743 #undef super_modifier
1744 #undef hyper_modifier
1745 #undef shift_modifier
1748 #endif /* FSF_KEYS */
1751 c = readchar (readcharfun);
1753 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
1755 error ("Invalid escape character syntax");
1757 c = readchar (readcharfun);
1759 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
1761 c = read_escape (readcharfun);
1762 /* FSFmacs junk for non-ASCII controls.
1767 return c & (0200 | 037);
1777 /* An octal escape, as in ANSI C. */
1779 REGISTER Emchar i = c - '0';
1780 REGISTER int count = 0;
1783 if ((c = readchar (readcharfun)) >= '0' && c <= '7')
1784 i = (i << 3) + (c - '0');
1787 unreadchar (readcharfun, c);
1795 /* A hex escape, as in ANSI C, except that we only allow latin-1
1796 characters to be read this way. What is "\x4e03" supposed to
1797 mean, anyways, if the internal representation is hidden?
1798 This is also consistent with the treatment of octal escapes. */
1800 REGISTER Emchar i = 0;
1801 REGISTER int count = 0;
1802 while (++count <= 2)
1804 c = readchar (readcharfun);
1805 /* Remember, can't use isdigit(), isalpha() etc. on Emchars */
1806 if (c >= '0' && c <= '9') i = (i << 4) + (c - '0');
1807 else if (c >= 'a' && c <= 'f') i = (i << 4) + (c - 'a') + 10;
1808 else if (c >= 'A' && c <= 'F') i = (i << 4) + (c - 'A') + 10;
1811 unreadchar (readcharfun, c);
1819 /* #### need some way of reading an extended character with
1820 an escape sequence. */
1830 /* read symbol-constituent stuff into `Vread_buffer_stream'. */
1832 read_atom_0 (Lisp_Object readcharfun, Emchar firstchar, int *saw_a_backslash)
1834 /* This function can GC */
1835 Emchar c = ((firstchar) >= 0 ? firstchar : readchar (readcharfun));
1836 Lstream_rewind (XLSTREAM (Vread_buffer_stream));
1838 *saw_a_backslash = 0;
1840 while (c > 040 /* #### - comma should be here as should backquote */
1841 && !(c == '\"' || c == '\'' || c == ';'
1842 || c == '(' || c == ')'
1843 #ifndef LISP_FLOAT_TYPE
1844 /* If we have floating-point support, then we need
1845 to allow <digits><dot><digits>. */
1847 #endif /* not LISP_FLOAT_TYPE */
1848 || c == '[' || c == ']' || c == '#'
1853 c = readchar (readcharfun);
1855 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
1856 *saw_a_backslash = 1;
1858 Lstream_put_emchar (XLSTREAM (Vread_buffer_stream), c);
1860 c = readchar (readcharfun);
1864 unreadchar (readcharfun, c);
1865 /* blasted terminating 0 */
1866 Lstream_put_emchar (XLSTREAM (Vread_buffer_stream), 0);
1867 Lstream_flush (XLSTREAM (Vread_buffer_stream));
1869 return Lstream_byte_count (XLSTREAM (Vread_buffer_stream)) - 1;
1872 static Lisp_Object parse_integer (CONST Bufbyte *buf, Bytecount len, int base);
1875 read_atom (Lisp_Object readcharfun,
1877 int uninterned_symbol)
1879 /* This function can GC */
1880 int saw_a_backslash;
1881 Bytecount len = read_atom_0 (readcharfun, firstchar, &saw_a_backslash);
1882 char *read_ptr = (char *)
1883 resizing_buffer_stream_ptr (XLSTREAM (Vread_buffer_stream));
1885 /* Is it an integer? */
1886 if (! (saw_a_backslash || uninterned_symbol))
1888 /* If a token had any backslashes in it, it is disqualified from
1889 being an integer or a float. This means that 123\456 is a
1890 symbol, as is \123 (which is the way (intern "123") prints).
1891 Also, if token was preceded by #:, it's always a symbol.
1893 char *p = read_ptr + len;
1894 char *p1 = read_ptr;
1896 if (*p1 == '+' || *p1 == '-') p1++;
1901 while (p1 != p && (c = *p1) >= '0' && c <= '9')
1903 #ifdef LISP_FLOAT_TYPE
1904 /* Integers can have trailing decimal points. */
1905 if (p1 > read_ptr && p1 < p && *p1 == '.')
1910 /* It is an integer. */
1911 #ifdef LISP_FLOAT_TYPE
1918 if (sizeof (int) == sizeof (EMACS_INT))
1919 number = atoi (read_buffer);
1920 else if (sizeof (long) == sizeof (EMACS_INT))
1921 number = atol (read_buffer);
1924 return make_int (number);
1927 return parse_integer ((Bufbyte *) read_ptr, len, 10);
1931 #ifdef LISP_FLOAT_TYPE
1932 if (isfloat_string (read_ptr))
1933 return make_float (atof (read_ptr));
1939 if (uninterned_symbol)
1940 sym = Fmake_symbol ( make_string ((Bufbyte *) read_ptr, len));
1943 Lisp_Object name = make_string ((Bufbyte *) read_ptr, len);
1944 sym = Fintern (name, Qnil);
1952 parse_integer (CONST Bufbyte *buf, Bytecount len, int base)
1954 CONST Bufbyte *lim = buf + len;
1955 CONST Bufbyte *p = buf;
1957 int negativland = 0;
1972 for (; (p < lim) && (*p != '\0'); p++)
1979 else if (isupper (c))
1981 else if (islower (c))
1986 if (c < 0 || c >= base)
1990 num = num * base + c;
1996 EMACS_INT int_result = negativland ? - (EMACS_INT) num : (EMACS_INT) num;
1997 Lisp_Object result = make_int (int_result);
1998 if (num && ((XINT (result) < 0) != negativland))
2000 if (XINT (result) != int_result)
2005 return Fsignal (Qinvalid_read_syntax,
2006 list3 (build_translated_string
2007 ("Integer constant overflow in reader"),
2008 make_string (buf, len),
2011 return Fsignal (Qinvalid_read_syntax,
2012 list3 (build_translated_string
2013 ("Invalid integer constant in reader"),
2014 make_string (buf, len),
2020 read_integer (Lisp_Object readcharfun, int base)
2022 /* This function can GC */
2023 int saw_a_backslash;
2024 Bytecount len = read_atom_0 (readcharfun, -1, &saw_a_backslash);
2025 return (parse_integer
2026 (resizing_buffer_stream_ptr (XLSTREAM (Vread_buffer_stream)),
2028 ? 0 /* make parse_integer signal error */
2034 read_bit_vector (Lisp_Object readcharfun)
2036 unsigned_char_dynarr *dyn = Dynarr_new (unsigned_char);
2041 c = readchar (readcharfun);
2042 if (c != '0' && c != '1')
2044 Dynarr_add (dyn, (unsigned char) (c - '0'));
2048 unreadchar (readcharfun, c);
2050 return make_bit_vector_from_byte_vector (Dynarr_atp (dyn, 0),
2051 Dynarr_length (dyn));
2058 struct structure_type *
2059 define_structure_type (Lisp_Object type,
2060 int (*validate) (Lisp_Object data,
2061 Error_behavior errb),
2062 Lisp_Object (*instantiate) (Lisp_Object data))
2064 struct structure_type st;
2067 st.keywords = Dynarr_new (structure_keyword_entry);
2068 st.validate = validate;
2069 st.instantiate = instantiate;
2070 Dynarr_add (the_structure_type_dynarr, st);
2072 return Dynarr_atp (the_structure_type_dynarr,
2073 Dynarr_length (the_structure_type_dynarr) - 1);
2077 define_structure_type_keyword (struct structure_type *st, Lisp_Object keyword,
2078 int (*validate) (Lisp_Object keyword,
2080 Error_behavior errb))
2082 struct structure_keyword_entry en;
2084 en.keyword = keyword;
2085 en.validate = validate;
2086 Dynarr_add (st->keywords, en);
2089 static struct structure_type *
2090 recognized_structure_type (Lisp_Object type)
2094 for (i = 0; i < Dynarr_length (the_structure_type_dynarr); i++)
2096 struct structure_type *st = Dynarr_atp (the_structure_type_dynarr, i);
2097 if (EQ (st->type, type))
2105 read_structure (Lisp_Object readcharfun)
2107 Emchar c = readchar (readcharfun);
2108 Lisp_Object list = Qnil;
2109 Lisp_Object orig_list = Qnil;
2110 Lisp_Object already_seen = Qnil;
2112 struct structure_type *st;
2113 struct gcpro gcpro1, gcpro2;
2115 GCPRO2 (orig_list, already_seen);
2117 RETURN_UNGCPRO (continuable_syntax_error ("#s not followed by paren"));
2118 list = read_list (readcharfun, ')', 0, 0);
2121 int len = XINT (Flength (list));
2123 RETURN_UNGCPRO (continuable_syntax_error
2124 ("structure type not specified"));
2127 (continuable_syntax_error
2128 ("structures must have alternating keyword/value pairs"));
2131 st = recognized_structure_type (XCAR (list));
2133 RETURN_UNGCPRO (Fsignal (Qinvalid_read_syntax,
2134 list2 (build_translated_string
2135 ("unrecognized structure type"),
2139 keyword_count = Dynarr_length (st->keywords);
2140 while (!NILP (list))
2142 Lisp_Object keyword, value;
2144 struct structure_keyword_entry *en = NULL;
2146 keyword = Fcar (list);
2148 value = Fcar (list);
2151 if (!NILP (memq_no_quit (keyword, already_seen)))
2152 RETURN_UNGCPRO (Fsignal (Qinvalid_read_syntax,
2153 list2 (build_translated_string
2154 ("structure keyword already seen"),
2157 for (i = 0; i < keyword_count; i++)
2159 en = Dynarr_atp (st->keywords, i);
2160 if (EQ (keyword, en->keyword))
2164 if (i == keyword_count)
2165 RETURN_UNGCPRO (Fsignal (Qinvalid_read_syntax,
2166 list2 (build_translated_string
2167 ("unrecognized structure keyword"),
2170 if (en->validate && ! (en->validate) (keyword, value, ERROR_ME))
2172 (Fsignal (Qinvalid_read_syntax,
2173 list3 (build_translated_string
2174 ("invalid value for structure keyword"),
2177 already_seen = Fcons (keyword, already_seen);
2180 if (st->validate && ! (st->validate) (orig_list, ERROR_ME))
2181 RETURN_UNGCPRO (Fsignal (Qinvalid_read_syntax,
2182 list2 (build_translated_string
2183 ("invalid structure initializer"),
2186 RETURN_UNGCPRO ((st->instantiate) (XCDR (orig_list)));
2190 static Lisp_Object read_compiled_function (Lisp_Object readcharfun,
2192 static Lisp_Object read_vector (Lisp_Object readcharfun, int terminator);
2194 /* Get the next character; filter out whitespace and comments */
2197 reader_nextchar (Lisp_Object readcharfun)
2199 /* This function can GC */
2204 c = readchar (readcharfun);
2206 signal_error (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
2212 /* Ignore whitespace and control characters */
2221 while ((c = readchar (readcharfun)) >= 0 && c != '\n')
2230 list2_pure (int pure, Lisp_Object a, Lisp_Object b)
2232 return pure ? pure_cons (a, pure_cons (b, Qnil)) : list2 (a, b);
2236 /* Read the next Lisp object from the stream READCHARFUN and return it.
2237 If the return value is a cons whose car is Qunbound, then read1()
2238 encountered a misplaced token (e.g. a right bracket, right paren,
2239 or dot followed by a non-number). To filter this stuff out,
2243 read1 (Lisp_Object readcharfun)
2248 c = reader_nextchar (readcharfun);
2254 #ifdef LISP_BACKQUOTES /* old backquote compatibility in lisp reader */
2255 /* if this is disabled, then other code in eval.c must be enabled */
2256 Emchar ch = reader_nextchar (readcharfun);
2262 int speccount = specpdl_depth ();
2263 ++old_backquote_flag;
2264 record_unwind_protect (backquote_unwind,
2265 make_opaque_ptr (&old_backquote_flag));
2266 tem = read0 (readcharfun);
2267 unbind_to (speccount, Qnil);
2268 ch = reader_nextchar (readcharfun);
2271 unreadchar (readcharfun, ch);
2272 return Fsignal (Qinvalid_read_syntax,
2274 ("Weird old-backquote syntax")));
2276 return list2 (Qbacktick, tem);
2280 if (old_backquote_flag)
2282 Lisp_Object tem, comma_type;
2283 ch = readchar (readcharfun);
2285 comma_type = Qcomma_at;
2289 unreadchar (readcharfun, ch);
2290 comma_type = Qcomma;
2292 tem = read0 (readcharfun);
2293 ch = reader_nextchar (readcharfun);
2296 unreadchar (readcharfun, ch);
2297 return Fsignal (Qinvalid_read_syntax,
2299 ("Weird old-backquote syntax")));
2301 return list2 (comma_type, tem);
2305 unreadchar (readcharfun, ch);
2307 return Fsignal (Qinvalid_read_syntax,
2308 list1 (build_string ("Comma outside of backquote")));
2310 /* #### - yuck....but this is reverse compatible. */
2311 /* mostly this is required by edebug, which does its own
2312 annotated reading. We need to have an annotated_read
2313 function that records (with markers) the buffer
2314 positions of the elements that make up lists, then that
2315 can be used in edebug and bytecomp and the check above
2316 can go back in. --Stig */
2322 unreadchar (readcharfun, ch);
2324 #endif /* old backquote crap... */
2325 return read_list (readcharfun, ')', 1, 1);
2328 return read_vector (readcharfun, ']');
2332 /* #### - huh? these don't do what they seem... */
2333 return noseeum_cons (Qunbound, make_char (c));
2336 #ifdef LISP_FLOAT_TYPE
2337 /* If a period is followed by a number, then we should read it
2338 as a floating point number. Otherwise, it denotes a dotted
2341 c = readchar (readcharfun);
2342 unreadchar (readcharfun, c);
2344 /* Can't use isdigit on Emchars */
2345 if (c < '0' || c > '9')
2346 return noseeum_cons (Qunbound, make_char ('.'));
2348 /* Note that read_atom will loop
2349 at least once, assuring that we will not try to UNREAD
2350 two characters in a row.
2351 (I think this doesn't matter anymore because there should
2352 be no more danger in unreading multiple characters) */
2353 return read_atom (readcharfun, '.', 0);
2355 #else /* ! LISP_FLOAT_TYPE */
2356 return noseeum_cons (Qunbound, make_char ('.'));
2357 #endif /* ! LISP_FLOAT_TYPE */
2362 c = readchar (readcharfun);
2365 #if 0 /* FSFmacs silly char-table syntax */
2368 #if 0 /* FSFmacs silly bool-vector syntax */
2371 /* "#["-- byte-code constant syntax */
2372 /* purecons #[...] syntax */
2373 case '[': return read_compiled_function (readcharfun, ']'
2374 /*, purify_flag */ );
2375 /* "#:"-- gensym syntax */
2376 case ':': return read_atom (readcharfun, -1, 1);
2377 /* #'x => (function x) */
2378 case '\'': return list2 (Qfunction, read0 (readcharfun));
2380 /* RMS uses this syntax for fat-strings.
2381 If we use it for vectors, then obscure bugs happen.
2383 /* "#(" -- Scheme/CL vector syntax */
2384 case '(': return read_vector (readcharfun, ')');
2390 struct gcpro gcpro1;
2392 /* Read the string itself. */
2393 tmp = read1 (readcharfun);
2396 if (CONSP (tmp) && UNBOUNDP (XCAR (tmp)))
2397 free_cons (XCONS (tmp));
2398 return Fsignal (Qinvalid_read_syntax,
2399 list1 (build_string ("#")));
2402 /* Read the intervals and their properties. */
2405 Lisp_Object beg, end, plist;
2409 beg = read1 (readcharfun);
2410 if (CONSP (beg) && UNBOUNDP (XCAR (beg)))
2412 ch = XCHAR (XCDR (beg));
2413 free_cons (XCONS (beg));
2421 end = read1 (readcharfun);
2422 if (CONSP (end) && UNBOUNDP (XCAR (end)))
2424 free_cons (XCONS (end));
2430 plist = read1 (readcharfun);
2431 if (CONSP (plist) && UNBOUNDP (XCAR (plist)))
2433 free_cons (XCONS (plist));
2439 (Fsignal (Qinvalid_read_syntax,
2441 (build_string ("invalid string property list"),
2443 Fset_text_properties (beg, end, plist, tmp);
2451 /* #@NUMBER is used to skip NUMBER following characters.
2452 That's used in .elc files to skip over doc strings
2453 and function definitions. */
2456 /* Read a decimal integer. */
2457 while ((c = readchar (readcharfun)) >= 0
2458 && c >= '0' && c <= '9')
2459 nskip = (10 * nskip) + (c - '0');
2461 unreadchar (readcharfun, c);
2463 /* FSF has code here that maybe caches the skipped
2464 string. See above for why this is totally
2465 losing. We handle this differently. */
2467 /* Skip that many characters. */
2468 for (i = 0; i < nskip && c >= 0; i++)
2469 c = readchar (readcharfun);
2473 case '$': return Vload_file_name_internal;
2475 case '*': return read_bit_vector (readcharfun);
2476 /* #o10 => 8 -- octal constant syntax */
2477 case 'o': return read_integer (readcharfun, 8);
2478 /* #xdead => 57005 -- hex constant syntax */
2479 case 'x': return read_integer (readcharfun, 16);
2480 /* #b010 => 2 -- binary constant syntax */
2481 case 'b': return read_integer (readcharfun, 2);
2482 /* #s(foobar key1 val1 key2 val2) -- structure syntax */
2483 case 's': return read_structure (readcharfun);
2486 unreadchar (readcharfun, c);
2487 return Fsignal (Qinvalid_read_syntax,
2488 list1 (build_string ("Cannot read unreadable object")));
2490 #ifdef FEATUREP_SYNTAX
2494 Lisp_Object fexp, obj, tem;
2495 struct gcpro gcpro1, gcpro2;
2497 fexp = read0(readcharfun);
2498 obj = read0(readcharfun);
2500 /* the call to `featurep' may GC. */
2502 tem = call1 (Qfeaturep, fexp);
2505 if (c == '+' && NILP(tem)) goto retry;
2506 if (c == '-' && !NILP(tem)) goto retry;
2510 case '0': case '1': case '2': case '3': case '4':
2511 case '5': case '6': case '7': case '8': case '9':
2512 /* Reader forms that can reuse previously read objects. */
2517 /* Using read_integer() here is impossible, because it
2518 chokes on `='. Using parse_integer() is too hard.
2519 So we simply read it in, and ignore overflows, which
2521 while (c >= '0' && c <= '9')
2525 c = readchar (readcharfun);
2527 found = assq_no_quit (make_int (n), Vread_objects);
2530 /* #n=object returns object, but associates it with
2534 return Fsignal (Qinvalid_read_syntax,
2535 list2 (build_translated_string
2536 ("Multiply defined symbol label"),
2538 obj = read0 (readcharfun);
2539 Vread_objects = Fcons (Fcons (make_int (n), obj),
2545 /* #n# returns a previously read object. */
2547 return XCDR (found);
2549 return Fsignal (Qinvalid_read_syntax,
2550 list2 (build_translated_string
2551 ("Undefined symbol label"),
2554 return Fsignal (Qinvalid_read_syntax,
2555 list1 (build_string ("#")));
2559 unreadchar (readcharfun, c);
2560 return Fsignal (Qinvalid_read_syntax,
2561 list1 (build_string ("#")));
2567 case '\'': return list2 (Qquote, read0 (readcharfun));
2569 #ifdef LISP_BACKQUOTES
2573 int speccount = specpdl_depth ();
2574 ++new_backquote_flag;
2575 record_unwind_protect (backquote_unwind,
2576 make_opaque_ptr (&new_backquote_flag));
2577 tem = read0 (readcharfun);
2578 unbind_to (speccount, Qnil);
2579 return list2 (Qbackquote, tem);
2584 if (new_backquote_flag)
2586 Lisp_Object comma_type = Qnil;
2587 int ch = readchar (readcharfun);
2590 comma_type = Qcomma_at;
2592 comma_type = Qcomma_dot;
2596 unreadchar (readcharfun, ch);
2597 comma_type = Qcomma;
2599 return list2 (comma_type, read0 (readcharfun));
2603 /* YUCK. 99.999% backwards compatibility. The Right
2604 Thing(tm) is to signal an error here, because it's
2605 really invalid read syntax. Instead, this permits
2606 commas to begin symbols (unless they're inside
2607 backquotes). If an error is signalled here in the
2608 future, then commas should be invalid read syntax
2609 outside of backquotes anywhere they're found (i.e.
2610 they must be quoted in symbols) -- Stig */
2611 return read_atom (readcharfun, c, 0);
2618 /* Evil GNU Emacs "character" (ie integer) syntax */
2619 c = readchar (readcharfun);
2621 return Fsignal (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
2624 c = read_escape (readcharfun);
2625 return make_char (c);
2632 /* #### If the input stream is translating, then the string
2633 should be marked as translatable by setting its
2634 `string-translatable' property to t. .el and .elc files
2635 normally are translating input streams. See Fgettext()
2636 and print_internal(). */
2640 Lstream_rewind (XLSTREAM (Vread_buffer_stream));
2641 while ((c = readchar (readcharfun)) >= 0
2645 c = read_escape (readcharfun);
2646 /* c is -1 if \ newline has just been seen */
2649 if (Lstream_byte_count (XLSTREAM (Vread_buffer_stream)) == 0)
2653 Lstream_put_emchar (XLSTREAM (Vread_buffer_stream), c);
2657 return Fsignal (Qend_of_file, list1 (READCHARFUN_MAYBE (readcharfun)));
2659 /* If purifying, and string starts with \ newline,
2660 return zero instead. This is for doc strings
2661 that we are really going to find in lib-src/DOC.nn.nn */
2662 if (purify_flag && NILP (Vinternal_doc_file_name) && cancel)
2665 Lstream_flush (XLSTREAM (Vread_buffer_stream));
2668 (resizing_buffer_stream_ptr (XLSTREAM (Vread_buffer_stream)),
2669 Lstream_byte_count (XLSTREAM (Vread_buffer_stream)));
2674 /* Ignore whitespace and control characters */
2677 return read_atom (readcharfun, c, 0);
2684 #ifdef LISP_FLOAT_TYPE
2693 isfloat_string (CONST char *cp)
2696 CONST Bufbyte *ucp = (CONST Bufbyte *) cp;
2698 if (*ucp == '+' || *ucp == '-')
2701 if (*ucp >= '0' && *ucp <= '9')
2704 while (*ucp >= '0' && *ucp <= '9')
2712 if (*ucp >= '0' && *ucp <= '9')
2715 while (*ucp >= '0' && *ucp <= '9')
2718 if (*ucp == 'e' || *ucp == 'E')
2722 if ((*ucp == '+') || (*ucp == '-'))
2726 if (*ucp >= '0' && *ucp <= '9')
2729 while (*ucp >= '0' && *ucp <= '9')
2732 return (((*ucp == 0) || (*ucp == ' ') || (*ucp == '\t') || (*ucp == '\n')
2733 || (*ucp == '\r') || (*ucp == '\f'))
2734 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
2735 || state == (DOT_CHAR|TRAIL_INT)
2736 || state == (LEAD_INT|E_CHAR|EXP_INT)
2737 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)
2738 || state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
2740 #endif /* LISP_FLOAT_TYPE */
2743 sequence_reader (Lisp_Object readcharfun,
2746 void * (*conser) (Lisp_Object readcharfun,
2747 void *state, Charcount len))
2751 for (len = 0; ; len++)
2756 ch = reader_nextchar (readcharfun);
2758 if (ch == terminator)
2761 unreadchar (readcharfun, ch);
2762 #ifdef FEATUREP_SYNTAX
2764 syntax_error ("\"]\" in a list");
2766 syntax_error ("\")\" in a vector");
2768 state = ((conser) (readcharfun, state, len));
2773 struct read_list_state
2778 int allow_dotted_lists;
2783 read_list_conser (Lisp_Object readcharfun, void *state, Charcount len)
2785 struct read_list_state *s = (struct read_list_state *) state;
2788 elt = read1 (readcharfun);
2790 if (CONSP (elt) && UNBOUNDP (XCAR (elt)))
2792 Lisp_Object tem = elt;
2796 free_cons (XCONS (tem));
2799 #ifdef FEATUREP_SYNTAX
2800 if (ch == s->terminator) /* deal with #+, #- reader macros */
2802 unreadchar (readcharfun, s->terminator);
2806 syntax_error ("']' in a list");
2808 syntax_error ("')' in a vector");
2812 signal_simple_error ("BUG! Internal reader error", elt);
2813 else if (!s->allow_dotted_lists)
2814 syntax_error ("\".\" in a vector");
2817 if (!NILP (s->tail))
2818 XCDR (s->tail) = read0 (readcharfun);
2820 s->head = read0 (readcharfun);
2821 elt = read1 (readcharfun);
2822 if (CONSP (elt) && UNBOUNDP (XCAR (elt)))
2824 ch = XCHAR (XCDR (elt));
2825 free_cons (XCONS (elt));
2826 if (ch == s->terminator)
2828 unreadchar (readcharfun, s->terminator);
2832 syntax_error (". in wrong context");
2836 #if 0 /* FSFmacs defun hack, or something ... */
2837 if (NILP (tail) && defun_hack && EQ (elt, Qdefun) && !read_pure)
2839 record_unwind_protect (unreadpure, Qzero);
2844 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
2845 if (s->length == 1 && s->allow_dotted_lists && EQ (XCAR (s->head), Qfset))
2847 if (CONSP (elt) && EQ (XCAR (elt), Qquote) && CONSP (XCDR (elt)))
2848 Vcurrent_compiled_function_annotation = XCAR (XCDR (elt));
2850 Vcurrent_compiled_function_annotation = elt;
2854 elt = Fcons (elt, Qnil);
2855 if (!NILP (s->tail))
2856 XCDR (s->tail) = elt;
2866 #if 0 /* FSFmacs defun hack */
2867 /* -1 for allow_dotted_lists means allow_dotted_lists and check
2868 for starting with defun and make structure pure. */
2872 read_list (Lisp_Object readcharfun,
2874 int allow_dotted_lists,
2875 int check_for_doc_references)
2877 struct read_list_state s;
2878 struct gcpro gcpro1, gcpro2;
2879 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
2880 Lisp_Object old_compiled_function_annotation =
2881 Vcurrent_compiled_function_annotation;
2887 s.allow_dotted_lists = allow_dotted_lists;
2888 s.terminator = terminator;
2889 GCPRO2 (s.head, s.tail);
2891 sequence_reader (readcharfun, terminator, &s, read_list_conser);
2892 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
2893 Vcurrent_compiled_function_annotation = old_compiled_function_annotation;
2896 if ((purify_flag || load_force_doc_strings) && check_for_doc_references)
2898 /* check now for any doc string references and record them
2902 /* We might be dealing with an imperfect list so don't
2904 for (tail = s.head; CONSP (tail); tail = XCDR (tail))
2906 Lisp_Object holding_cons = Qnil;
2909 Lisp_Object elem = XCAR (tail);
2910 /* elem might be (#$ . INT) ... */
2911 if (CONSP (elem) && EQ (XCAR (elem), Vload_file_name_internal))
2912 holding_cons = tail;
2913 /* or it might be (quote (#$ . INT)) i.e.
2914 (quote . ((#$ . INT) . nil)) in the case of
2915 `autoload' (autoload evaluates its arguments, while
2916 `defvar', `defun', etc. don't). */
2917 if (CONSP (elem) && EQ (XCAR (elem), Qquote)
2918 && CONSP (XCDR (elem)))
2920 elem = XCAR (XCDR (elem));
2921 if (CONSP (elem) && EQ (XCAR (elem), Vload_file_name_internal))
2922 holding_cons = XCDR (XCAR (tail));
2926 if (CONSP (holding_cons))
2930 if (NILP (Vinternal_doc_file_name))
2931 /* We have not yet called Snarf-documentation, so
2932 assume this file is described in the DOC file
2933 and Snarf-documentation will fill in the right
2934 value later. For now, replace the whole list
2936 XCAR (holding_cons) = Qzero;
2938 /* We have already called Snarf-documentation, so
2939 make a relative file name for this file, so it
2940 can be found properly in the installed Lisp
2941 directory. We don't use Fexpand_file_name
2942 because that would make the directory absolute
2944 XCAR (XCAR (holding_cons)) =
2945 concat2 (build_string ("../lisp/"),
2946 Ffile_name_nondirectory
2947 (Vload_file_name_internal));
2950 /* Not pure. Just add to Vload_force_doc_string_list,
2951 and the string will be filled in properly in
2952 load_force_doc_string_unwind(). */
2953 Vload_force_doc_string_list =
2954 /* We pass the cons that holds the (#$ . INT) so we
2955 can modify it in-place. */
2956 Fcons (holding_cons, Vload_force_doc_string_list);
2966 read_vector (Lisp_Object readcharfun,
2973 struct read_list_state s;
2974 struct gcpro gcpro1, gcpro2;
2979 s.allow_dotted_lists = 0;
2980 GCPRO2 (s.head, s.tail);
2982 sequence_reader (readcharfun, terminator, &s, read_list_conser);
2986 len = XINT (Flength (tem));
2988 #if 0 /* FSFmacs defun hack */
2990 s.head = make_pure_vector (len, Qnil);
2993 s.head = make_vector (len, Qnil);
2995 for (i = 0, p = &(XVECTOR_DATA (s.head)[0]);
2999 struct Lisp_Cons *otem = XCONS (tem);
3009 read_compiled_function (Lisp_Object readcharfun, Emchar terminator)
3011 /* Accept compiled functions at read-time so that we don't
3012 have to build them at load-time. */
3014 Lisp_Object make_byte_code_args[COMPILED_DOMAIN + 1];
3015 struct gcpro gcpro1;
3018 int saw_a_doc_ref = 0;
3020 /* Note: we tell read_list not to search for doc references
3021 because we need to handle the "doc reference" for the
3022 instructions and constants differently. */
3023 stuff = read_list (readcharfun, terminator, 0, 0);
3024 len = XINT (Flength (stuff));
3025 if (len < COMPILED_STACK_DEPTH + 1 || len > COMPILED_DOMAIN + 1)
3027 continuable_syntax_error ("#[...] used with wrong number of elements");
3029 for (iii = 0; CONSP (stuff); iii++)
3031 struct Lisp_Cons *victim = XCONS (stuff);
3032 make_byte_code_args[iii] = Fcar (stuff);
3033 if ((purify_flag || load_force_doc_strings)
3034 && CONSP (make_byte_code_args[iii])
3035 && EQ (XCAR (make_byte_code_args[iii]), Vload_file_name_internal))
3037 if (purify_flag && iii == COMPILED_DOC_STRING)
3039 /* same as in read_list(). */
3040 if (NILP (Vinternal_doc_file_name))
3041 make_byte_code_args[iii] = Qzero;
3043 XCAR (make_byte_code_args[iii]) =
3044 concat2 (build_string ("../lisp/"),
3045 Ffile_name_nondirectory
3046 (Vload_file_name_internal));
3051 stuff = Fcdr (stuff);
3054 GCPRO1 (make_byte_code_args[0]);
3057 /* v18 or v19 bytecode file. Need to Ebolify. */
3058 if (load_byte_code_version < 20 && VECTORP (make_byte_code_args[2]))
3059 ebolify_bytecode_constants (make_byte_code_args[2]);
3061 /* make-byte-code looks at purify_flag, which should have the same
3062 * value as our "read-pure" argument */
3063 stuff = Fmake_byte_code (len, make_byte_code_args);
3064 XCOMPILED_FUNCTION (stuff)->flags.ebolified = (load_byte_code_version < 20);
3066 Vload_force_doc_string_list = Fcons (stuff, Vload_force_doc_string_list);
3078 load_in_progress = 0;
3080 Vload_descriptor_list = Qnil;
3082 /* kludge: locate-file does not work for a null load-path, even if
3083 the file name is absolute. */
3085 Vload_path = Fcons (build_string (""), Qnil);
3087 /* This used to get initialized in init_lread because all streams
3088 got closed when dumping occurs. This is no longer true --
3089 Vread_buffer_stream is a resizing output stream, and there is no
3090 reason to close it at dump-time.
3092 Vread_buffer_stream is set to Qnil in vars_of_lread, and this
3093 will initialize it only once, at dump-time. */
3094 if (NILP (Vread_buffer_stream))
3095 Vread_buffer_stream = make_resizing_buffer_output_stream ();
3097 Vload_force_doc_string_list = Qnil;
3101 syms_of_lread (void)
3104 DEFSUBR (Fread_from_string);
3105 DEFSUBR (Fload_internal);
3106 DEFSUBR (Flocate_file);
3107 DEFSUBR (Flocate_file_clear_hashing);
3108 DEFSUBR (Feval_buffer);
3109 DEFSUBR (Feval_region);
3111 defsymbol (&Qstandard_input, "standard-input");
3112 defsymbol (&Qread_char, "read-char");
3113 defsymbol (&Qcurrent_load_list, "current-load-list");
3114 defsymbol (&Qload, "load");
3115 defsymbol (&Qload_file_name, "load-file-name");
3116 defsymbol (&Qfset, "fset");
3118 #ifdef LISP_BACKQUOTES
3119 defsymbol (&Qbackquote, "backquote");
3120 defsymbol (&Qbacktick, "`");
3121 defsymbol (&Qcomma, ",");
3122 defsymbol (&Qcomma_at, ",@");
3123 defsymbol (&Qcomma_dot, ",.");
3126 defsymbol (&Qexists, "exists");
3127 defsymbol (&Qreadable, "readable");
3128 defsymbol (&Qwritable, "writable");
3129 defsymbol (&Qexecutable, "executable");
3133 structure_type_create (void)
3135 the_structure_type_dynarr = Dynarr_new (structure_type);
3139 reinit_vars_of_lread (void)
3141 Vread_buffer_stream = Qnil;
3142 staticpro_nodump (&Vread_buffer_stream);
3146 vars_of_lread (void)
3148 reinit_vars_of_lread ();
3150 DEFVAR_LISP ("values", &Vvalues /*
3151 List of values of all expressions which were read, evaluated and printed.
3152 Order is reverse chronological.
3155 DEFVAR_LISP ("standard-input", &Vstandard_input /*
3156 Stream for read to get input from.
3157 See documentation of `read' for possible values.
3159 Vstandard_input = Qt;
3161 DEFVAR_LISP ("load-path", &Vload_path /*
3162 *List of directories to search for files to load.
3163 Each element is a string (directory name) or nil (try default directory).
3165 Note that the elements of this list *may not* begin with "~", so you must
3166 call `expand-file-name' on them before adding them to this list.
3168 Initialized based on EMACSLOADPATH environment variable, if any,
3169 otherwise to default specified in by file `paths.h' when XEmacs was built.
3170 If there were no paths specified in `paths.h', then XEmacs chooses a default
3171 value for this variable by looking around in the file-system near the
3172 directory in which the XEmacs executable resides.
3176 /* xxxDEFVAR_LISP ("dump-load-path", &Vdump_load_path,
3177 "*Location of lisp files to be used when dumping ONLY."); */
3179 DEFVAR_BOOL ("load-in-progress", &load_in_progress /*
3180 Non-nil iff inside of `load'.
3183 DEFVAR_LISP ("after-load-alist", &Vafter_load_alist /*
3184 An alist of expressions to be evalled when particular files are loaded.
3185 Each element looks like (FILENAME FORMS...).
3186 When `load' is run and the file-name argument is FILENAME,
3187 the FORMS in the corresponding element are executed at the end of loading.
3189 FILENAME must match exactly! Normally FILENAME is the name of a library,
3190 with no directory specified, since that is how `load' is normally called.
3191 An error in FORMS does not undo the load,
3192 but does prevent execution of the rest of the FORMS.
3194 Vafter_load_alist = Qnil;
3196 DEFVAR_BOOL ("load-warn-when-source-newer", &load_warn_when_source_newer /*
3197 *Whether `load' should check whether the source is newer than the binary.
3198 If this variable is true, then when a `.elc' file is being loaded and the
3199 corresponding `.el' is newer, a warning message will be printed.
3201 load_warn_when_source_newer = 0;
3203 DEFVAR_BOOL ("load-warn-when-source-only", &load_warn_when_source_only /*
3204 *Whether `load' should warn when loading a `.el' file instead of an `.elc'.
3205 If this variable is true, then when `load' is called with a filename without
3206 an extension, and the `.elc' version doesn't exist but the `.el' version does,
3207 then a message will be printed. If an explicit extension is passed to `load',
3208 no warning will be printed.
3210 load_warn_when_source_only = 0;
3212 DEFVAR_BOOL ("load-ignore-elc-files", &load_ignore_elc_files /*
3213 *Whether `load' should ignore `.elc' files when a suffix is not given.
3214 This is normally used only to bootstrap the `.elc' files when building XEmacs.
3216 load_ignore_elc_files = 0;
3219 DEFVAR_LISP ("load-history", &Vload_history /*
3220 Alist mapping source file names to symbols and features.
3221 Each alist element is a list that starts with a file name,
3222 except for one element (optional) that starts with nil and describes
3223 definitions evaluated from buffers not visiting files.
3224 The remaining elements of each list are symbols defined as functions
3225 or variables, and cons cells `(provide . FEATURE)' and `(require . FEATURE)'.
3227 Vload_history = Qnil;
3229 DEFVAR_LISP ("current-load-list", &Vcurrent_load_list /*
3230 Used for internal purposes by `load'.
3232 Vcurrent_load_list = Qnil;
3235 DEFVAR_LISP ("load-file-name", &Vload_file_name /*
3236 Full name of file being loaded by `load'.
3238 Vload_file_name = Qnil;
3240 DEFVAR_LISP ("load-read-function", &Vload_read_function /*
3241 Function used by `load' and `eval-region' for reading expressions.
3242 The default is nil, which means use the function `read'.
3244 Vload_read_function = Qnil;
3246 DEFVAR_BOOL ("load-force-doc-strings", &load_force_doc_strings /*
3247 Non-nil means `load' should force-load all dynamic doc strings.
3248 This is useful when the file being loaded is a temporary copy.
3250 load_force_doc_strings = 0;
3252 /* See read_escape(). */
3254 /* Used to be named `puke-on-fsf-keys' */
3255 DEFVAR_BOOL ("fail-on-bucky-bit-character-escapes",
3256 &fail_on_bucky_bit_character_escapes /*
3257 Whether `read' should signal an error when it encounters unsupported
3258 character escape syntaxes or just read them incorrectly.
3260 fail_on_bucky_bit_character_escapes = 0;
3263 /* This must be initialized in init_lread otherwise it may start out
3264 with values saved when the image is dumped. */
3265 staticpro (&Vload_descriptor_list);
3267 /* Initialized in init_lread. */
3268 staticpro (&Vload_force_doc_string_list);
3270 Vload_file_name_internal = Qnil;
3271 staticpro (&Vload_file_name_internal);
3273 Vload_file_name_internal_the_purecopy = Qnil;
3274 staticpro (&Vload_file_name_internal_the_purecopy);
3276 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
3277 Vcurrent_compiled_function_annotation = Qnil;
3278 staticpro (&Vcurrent_compiled_function_annotation);
3281 /* So that early-early stuff will work */
3282 Ffset (Qload, intern ("load-internal"));
3284 #ifdef FEATUREP_SYNTAX
3285 defsymbol (&Qfeaturep, "featurep");
3286 Fprovide(intern("xemacs"));
3288 Fprovide(intern("infodock"));
3289 #endif /* INFODOCK */
3290 #endif /* FEATUREP_SYNTAX */
3292 #ifdef LISP_BACKQUOTES
3293 old_backquote_flag = new_backquote_flag = 0;
3297 Vfile_domain = Qnil;
3300 Vread_objects = Qnil;
3301 staticpro (&Vread_objects);
3303 Vlocate_file_hash_table = make_lisp_hash_table (200,
3304 HASH_TABLE_NON_WEAK,
3306 staticpro (&Vlocate_file_hash_table);
3308 symbol_value (XSYMBOL (intern ("Vlocate-file-hash-table")))
3309 = Vlocate_file_hash_table;