/* Lisp parsing and input streams.
- Copyright (C) 1985, 86, 87, 88, 89, 93, 94, 95, 97, 1998
+ Copyright (C) 1985, 86, 87, 88, 89, 93, 94, 95, 97, 98, 1999
Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <config.h>
+/* The following feature selections should be in config.h, but that
+ causes at best a host of warnings on some systems. */
+#undef _XOPEN_SOURCE /* Avoid warnings about redefinition
+ in some cases. */
+#define _XOPEN_SOURCE 500 /* for Unix 98 ftello on GNU */
+#undef __EXTENSIONS__
+#define __EXTENSIONS__ /* Keep Solaris 2.6 happy with the
+ above, else things we need are hidden. */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <errno.h>
#include "lisp.h"
-
-#ifndef standalone
+#include "intervals.h"
#include "buffer.h"
#include "charset.h"
#include <epaths.h>
#include "commands.h"
#include "keyboard.h"
#include "termhooks.h"
-#endif
#ifdef lint
#include <sys/inode.h>
#define X_OK 01
#endif
-#ifdef LISP_FLOAT_TYPE
-#ifdef STDC_HEADERS
-#include <stdlib.h>
-#endif
-
#include <math.h>
-#endif /* LISP_FLOAT_TYPE */
#ifdef HAVE_SETLOCALE
#include <locale.h>
#define O_RDONLY 0
#endif
+#ifdef HAVE_FTELLO
+#define file_offset off_t
+#define file_tell ftello
+#else
+#define file_offset long
+#define file_tell ftell
+#endif
+
extern int errno;
Lisp_Object Qread_char, Qget_file_char, Qstandard_input, Qcurrent_load_list;
compiled) instead of readevalloop. */
Lisp_Object Vload_source_file_function;
+/* List of all DEFVAR_BOOL variables. Used by the byte optimizer. */
+Lisp_Object Vbyte_boolean_vars;
+
/* List of descriptors now open for Fload. */
static Lisp_Object load_descriptor_list;
/* Length of actual data in saved_doc_string. */
static int saved_doc_string_length;
/* This is the file position that string came from. */
-static int saved_doc_string_position;
+static file_offset saved_doc_string_position;
/* This contains the previous string skipped with #@.
We copy it from saved_doc_string when a new string
/* Length of actual data in prev_saved_doc_string. */
static int prev_saved_doc_string_length;
/* This is the file position that string came from. */
-static int prev_saved_doc_string_position;
+static file_offset prev_saved_doc_string_position;
/* Nonzero means inside a new-style backquote
with no surrounding parentheses.
Lisp_Object readcharfun;
{
Lisp_Object tem;
- register int c, mpos;
+ register int c;
if (BUFFERP (readcharfun))
{
if (! NILP (inbuffer->enable_multibyte_characters))
{
- unsigned char workbuf[4];
- unsigned char *str = workbuf;
- int length;
-
/* Fetch the character code from the buffer. */
unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, pt_byte);
BUF_INC_POS (inbuffer, pt_byte);
c = STRING_CHAR (p, pt_byte - orig_pt_byte);
-
- /* Find the byte-sequence representation of that character. */
- if (SINGLE_BYTE_CHAR_P (c))
- length = 1, workbuf[0] = c;
- else
- length = non_ascii_char_to_string (c, workbuf, &str);
-
- /* If the bytes for this character in the buffer
- are not identical with what the character code implies,
- read the bytes one by one from the buffer. */
- if (length != pt_byte - orig_pt_byte
- || (length == 1 ? *str != *p : bcmp (str, p, length)))
- {
- readchar_backlog = pt_byte - orig_pt_byte;
- c = BUF_FETCH_BYTE (inbuffer, orig_pt_byte);
- readchar_backlog--;
- }
}
else
{
if (! NILP (inbuffer->enable_multibyte_characters))
{
- unsigned char workbuf[4];
- unsigned char *str = workbuf;
- int length;
-
/* Fetch the character code from the buffer. */
unsigned char *p = BUF_BYTE_ADDRESS (inbuffer, bytepos);
BUF_INC_POS (inbuffer, bytepos);
c = STRING_CHAR (p, bytepos - orig_bytepos);
-
- /* Find the byte-sequence representation of that character. */
- if (SINGLE_BYTE_CHAR_P (c))
- length = 1, workbuf[0] = c;
- else
- length = non_ascii_char_to_string (c, workbuf, &str);
-
- /* If the bytes for this character in the buffer
- are not identical with what the character code implies,
- read the bytes one by one from the buffer. */
- if (length != bytepos - orig_bytepos
- || (length == 1 ? *str != *p : bcmp (str, p, length)))
- {
- readchar_backlog = bytepos - orig_bytepos;
- c = BUF_FETCH_BYTE (inbuffer, orig_bytepos);
- readchar_backlog--;
- }
}
else
{
input_method)
int no_switch_frame, ascii_required, error_nonascii, input_method;
{
-#ifdef standalone
- return make_number (getchar ());
-#else
register Lisp_Object val, delayed_switch_frame;
+#ifdef HAVE_WINDOW_SYSTEM
+ if (display_busy_cursor_p)
+ cancel_busy_cursor ();
+#endif
+
delayed_switch_frame = Qnil;
/* Read until we get an acceptable event. */
/* Convert certain symbols to their ASCII equivalents. */
if (SYMBOLP (val))
{
- Lisp_Object tem, tem1, tem2;
+ Lisp_Object tem, tem1;
tem = Fget (val, Qevent_symbol_element_mask);
if (!NILP (tem))
{
if (! NILP (delayed_switch_frame))
unread_switch_frame = delayed_switch_frame;
- return val;
+#ifdef HAVE_WINDOW_SYSTEM
+ if (display_busy_cursor_p)
+ start_busy_cursor ();
#endif
+ return val;
}
DEFUN ("read-char", Fread_char, Sread_char, 0, 2, 0,
static Lisp_Object load_unwind ();
static Lisp_Object load_descriptor_unwind ();
+/* Non-zero means load dangerous compiled Lisp files. */
+
+int load_dangerous_libraries;
+
+/* A regular expression used to detect files compiled with Emacs. */
+
+static Lisp_Object Vbytecomp_version_regexp;
+
+
+/* Value is non-zero if the file asswociated with file descriptor FD
+ is a compiled Lisp file that's safe to load. Only files compiled
+ with Emacs are safe to load. Files compiled with XEmacs can lead
+ to a crash in Fbyte_code because of an incompatible change in the
+ byte compiler. */
+
+static int
+safe_to_load_p (fd)
+ int fd;
+{
+ char buf[512];
+ int nbytes, i;
+ int safe_p = 1;
+
+ /* Read the first few bytes from the file, and look for a line
+ specifying the byte compiler version used. */
+ nbytes = emacs_read (fd, buf, sizeof buf - 1);
+ if (nbytes > 0)
+ {
+ buf[nbytes] = '\0';
+
+ /* Skip to the next newline, skipping over the initial `ELC'
+ with NUL bytes following it. */
+ for (i = 0; i < nbytes && buf[i] != '\n'; ++i)
+ ;
+
+ if (i < nbytes
+ && fast_c_string_match_ignore_case (Vbytecomp_version_regexp,
+ buf + i) < 0)
+ safe_p = 0;
+ }
+
+ lseek (fd, 0, SEEK_SET);
+ return safe_p;
+}
+
+
DEFUN ("load", Fload, Sload, 1, 5, 0,
"Execute a file of Lisp code named FILE.\n\
First try FILE with `.elc' appended, then try with `.el',\n\
/* 1 means we are loading a compiled file. */
int compiled = 0;
Lisp_Object handler;
+ int safe_p = 1;
char *fmode = "r";
#ifdef DOS_NT
fmode = "rt";
since it would try to load a directory as a Lisp file */
if (XSTRING (file)->size > 0)
{
- int size = XSTRING (file)->size;
+ int size = STRING_BYTES (XSTRING (file));
GCPRO1 (file);
fd = openp (Vload_path, file,
(!NILP (nosuffix) ? ""
- : ! NILP (must_suffix) ? ".elc:.el"
- : ".elc:.el:"),
+ : ! NILP (must_suffix) ? ".elc.gz:.elc:.el.gz:.el"
+ : ".elc:.elc.gz:.el.gz:.el:"),
&found, 0);
UNGCPRO;
}
/* Load .elc files directly, but not when they are
remote and have no handler! */
- if (!bcmp (&(XSTRING (found)->data[XSTRING (found)->size - 4]),
+ if (!bcmp (&(XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 4]),
".elc", 4)
&& fd != 0)
{
struct stat s1, s2;
int result;
+ if (!safe_to_load_p (fd))
+ {
+ safe_p = 0;
+ if (!load_dangerous_libraries)
+ error ("File `%s' was not compiled in Emacs",
+ XSTRING (found)->data);
+ else if (!NILP (nomessage))
+ message_with_string ("File `%s' not compiled in Emacs", found, 1);
+ }
+
compiled = 1;
#ifdef DOS_NT
fmode = "rb";
#endif /* DOS_NT */
stat ((char *)XSTRING (found)->data, &s1);
- XSTRING (found)->data[XSTRING (found)->size - 1] = 0;
+ XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 0;
result = stat ((char *)XSTRING (found)->data, &s2);
if (result >= 0 && (unsigned) s1.st_mtime < (unsigned) s2.st_mtime)
{
message_with_string ("Source file `%s' newer than byte-compiled file",
found, 1);
}
- XSTRING (found)->data[XSTRING (found)->size - 1] = 'c';
+ XSTRING (found)->data[STRING_BYTES (XSTRING (found)) - 1] = 'c';
}
else
{
+ load_source:
+
/* We are loading a source file (*.el). */
if (!NILP (Vload_source_file_function))
{
if (fd != 0)
- close (fd);
+ emacs_close (fd);
return call4 (Vload_source_file_function, found, file,
NILP (noerror) ? Qnil : Qt,
NILP (nomessage) ? Qnil : Qt);
}
#ifdef WINDOWSNT
- close (fd);
+ emacs_close (fd);
stream = fopen ((char *) XSTRING (found)->data, fmode);
#else /* not WINDOWSNT */
stream = fdopen (fd, fmode);
#endif /* not WINDOWSNT */
if (stream == 0)
{
- close (fd);
+ emacs_close (fd);
error ("Failure to create stdio stream for %s", XSTRING (file)->data);
}
if (NILP (nomessage))
{
- if (!compiled)
+ if (!safe_p)
+ message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...",
+ file, 1);
+ else if (!compiled)
message_with_string ("Loading %s (source)...", file, 1);
else if (newer)
message_with_string ("Loading %s (compiled; note, source file is newer)...",
GCPRO1 (file);
lispstream = Fcons (Qnil, Qnil);
- XSETFASTINT (XCONS (lispstream)->car, (EMACS_UINT)stream >> 16);
- XSETFASTINT (XCONS (lispstream)->cdr, (EMACS_UINT)stream & 0xffff);
+ XSETFASTINT (XCAR (lispstream), (EMACS_UINT)stream >> 16);
+ XSETFASTINT (XCDR (lispstream), (EMACS_UINT)stream & 0xffff);
record_unwind_protect (load_unwind, lispstream);
record_unwind_protect (load_descriptor_unwind, load_descriptor_list);
specbind (Qload_file_name, found);
saved_doc_string_size = 0;
if (prev_saved_doc_string)
- free (prev_saved_doc_string);
+ xfree (prev_saved_doc_string);
prev_saved_doc_string = 0;
prev_saved_doc_string_size = 0;
if (!noninteractive && NILP (nomessage))
{
- if (!compiled)
+ if (!safe_p)
+ message_with_string ("Loading %s (compiled; note unsafe, not compiled in Emacs)...done",
+ file, 1);
+ else if (!compiled)
message_with_string ("Loading %s (source)...done", file, 1);
else if (newer)
message_with_string ("Loading %s (compiled; note, source file is newer)...done",
load_unwind (stream) /* used as unwind-protect function in load */
Lisp_Object stream;
{
- fclose ((FILE *) (XFASTINT (XCONS (stream)->car) << 16
- | XFASTINT (XCONS (stream)->cdr)));
+ fclose ((FILE *) (XFASTINT (XCAR (stream)) << 16
+ | XFASTINT (XCDR (stream))));
if (--load_in_progress < 0) load_in_progress = 0;
return Qnil;
}
{
#ifndef WINDOWSNT
Lisp_Object tail;
- for (tail = load_descriptor_list; !NILP (tail); tail = XCONS (tail)->cdr)
- close (XFASTINT (XCONS (tail)->car));
+ for (tail = load_descriptor_list; !NILP (tail); tail = XCDR (tail))
+ emacs_close (XFASTINT (XCAR (tail)));
#endif
}
\f
/* Calculate maximum size of any filename made from
this path element/specified file name and any possible suffix. */
- want_size = strlen (suffix) + XSTRING (filename)->size + 1;
+ want_size = strlen (suffix) + STRING_BYTES (XSTRING (filename)) + 1;
if (fn_size < want_size)
fn = (char *) alloca (fn_size = 100 + want_size);
&& XSTRING (filename)->data[1] == ':')
{
strncpy (fn, XSTRING (filename)->data + 2,
- XSTRING (filename)->size - 2);
- fn[XSTRING (filename)->size - 2] = 0;
+ STRING_BYTES (XSTRING (filename)) - 2);
+ fn[STRING_BYTES (XSTRING (filename)) - 2] = 0;
}
else
{
- strncpy (fn, XSTRING (filename)->data, XSTRING (filename)->size);
- fn[XSTRING (filename)->size] = 0;
+ strncpy (fn, XSTRING (filename)->data,
+ STRING_BYTES (XSTRING (filename)));
+ fn[STRING_BYTES (XSTRING (filename))] = 0;
}
if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
if (exec_only)
fd = (access (fn, X_OK) == 0) ? 1 : -1;
else
- fd = open (fn, O_RDONLY, 0);
+ fd = emacs_open (fn, O_RDONLY, 0);
if (fd >= 0)
{
unbind_to (count, Qnil);
}
-#ifndef standalone
-
DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 5, "",
"Execute the current buffer as Lisp code.\n\
Programs can pass two arguments, BUFFER and PRINTFLAG.\n\
return unbind_to (count, Qnil);
}
-#endif /* standalone */
\f
DEFUN ("read", Fread, Sread, 0, 1, 0,
"Read one Lisp expression as text from STREAM, return as Lisp object.\n\
new_backquote_flag = 0;
read_objects = Qnil;
-#ifndef standalone
if (EQ (stream, Qread_char))
return Fread_minibuffer (build_string ("Lisp expression: "), Qnil);
-#endif
if (STRINGP (stream))
return Fcar (Fread_from_string (stream, Qnil, Qnil));
{
/* We need the actual character code of this multibyte
characters. */
- unsigned char str[MAX_LENGTH_OF_MULTI_BYTE_FORM];
+ unsigned char str[MAX_MULTIBYTE_LENGTH];
int len = 0;
str[len++] = c;
while ((c = READCHAR) >= 0xA0
- && len < MAX_LENGTH_OF_MULTI_BYTE_FORM)
+ && len < MAX_MULTIBYTE_LENGTH)
str[len++] = c;
UNREAD (c);
return STRING_CHAR (str, len);
c = READCHAR;
if (c == '\\')
c = read_escape (readcharfun, 0);
- if ((c & 0177) == '?')
- return 0177 | c;
+ if ((c & ~CHAR_MODIFIER_MASK) == '?')
+ return 0177 | (c & CHAR_MODIFIER_MASK);
+ else if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
+ return c | ctrl_modifier;
/* ASCII control chars are made from letters (both cases),
as well as the non-letters within 0100...0137. */
else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
}
}
+
+/* Read an integer in radix RADIX using READCHARFUN to read
+ characters. RADIX must be in the interval [2..36]; if it isn't, a
+ read error is signaled . Value is the integer read. Signals an
+ error if encountering invalid read syntax or if RADIX is out of
+ range. */
+
+static Lisp_Object
+read_integer (readcharfun, radix)
+ Lisp_Object readcharfun;
+ int radix;
+{
+ int number, ndigits, invalid_p, c, sign;
+
+ if (radix < 2 || radix > 36)
+ invalid_p = 1;
+ else
+ {
+ number = ndigits = invalid_p = 0;
+ sign = 1;
+
+ c = READCHAR;
+ if (c == '-')
+ {
+ c = READCHAR;
+ sign = -1;
+ }
+ else if (c == '+')
+ c = READCHAR;
+
+ while (c >= 0)
+ {
+ int digit;
+
+ if (c >= '0' && c <= '9')
+ digit = c - '0';
+ else if (c >= 'a' && c <= 'z')
+ digit = c - 'a' + 10;
+ else if (c >= 'A' && c <= 'Z')
+ digit = c - 'A' + 10;
+ else
+ {
+ UNREAD (c);
+ break;
+ }
+
+ if (digit < 0 || digit >= radix)
+ invalid_p = 1;
+
+ number = radix * number + digit;
+ ++ndigits;
+ c = READCHAR;
+ }
+ }
+
+ if (ndigits == 0 || invalid_p)
+ {
+ char buf[50];
+ sprintf (buf, "integer, radix %d", radix);
+ Fsignal (Qinvalid_read_syntax, Fcons (build_string (buf), Qnil));
+ }
+
+ return make_number (sign * number);
+}
+
+
/* If the next token is ')' or ']' or '.', we store that character
in *PCH and the return value is not interesting. Else, we store
zero in *PCH and we read and return one lisp object.
return Fmake_byte_code (XVECTOR (tmp)->size,
XVECTOR (tmp)->contents);
}
-#ifdef USE_TEXT_PROPERTIES
if (c == '(')
{
Lisp_Object tmp;
UNGCPRO;
return tmp;
}
-#endif
+
/* #@NUMBER is used to skip NUMBER following characters.
That's used in .elc files to skip over doc strings
and function definitions. */
{
char *temp = saved_doc_string;
int temp_size = saved_doc_string_size;
- int temp_pos = saved_doc_string_position;
+ file_offset temp_pos = saved_doc_string_position;
int temp_len = saved_doc_string_length;
saved_doc_string = prev_saved_doc_string;
saved_doc_string_size);
}
- saved_doc_string_position = ftell (instream);
+ saved_doc_string_position = file_tell (instream);
/* Copy that many characters into saved_doc_string. */
for (i = 0; i < nskip && c >= 0; i++)
return XCDR (tem);
/* Fall through to error message. */
}
+ else if (c == 'r' || c == 'R')
+ return read_integer (readcharfun, n);
+
/* Fall through to error message. */
}
+ else if (c == 'x' || c == 'X')
+ return read_integer (readcharfun, 16);
+ else if (c == 'o' || c == 'O')
+ return read_integer (readcharfun, 8);
+ else if (c == 'b' || c == 'B')
+ return read_integer (readcharfun, 2);
UNREAD (c);
Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
case '?':
{
- register Lisp_Object val;
-
c = READCHAR;
if (c < 0) return Fsignal (Qend_of_file, Qnil);
while ((c = READCHAR) >= 0
&& c != '\"')
{
- if (end - p < MAX_LENGTH_OF_MULTI_BYTE_FORM)
+ if (end - p < MAX_MULTIBYTE_LENGTH)
{
char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
p += new - read_buffer;
/* If an escape specifies a non-ASCII single-byte character,
this must be a unibyte string. */
- if (SINGLE_BYTE_CHAR_P ((c & ~CHAR_META))
- && ! ASCII_BYTE_P (c))
+ if (SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK))
+ && ! ASCII_BYTE_P ((c & ~CHAR_MODIFIER_MASK)))
force_singlebyte = 1;
}
- if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_META)))
+ if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
{
- unsigned char workbuf[4];
- unsigned char *str = workbuf;
- int length;
-
- length = non_ascii_char_to_string (c, workbuf, &str);
- if (length > 1)
- force_multibyte = 1;
-
- bcopy (str, p, length);
- p += length;
+ /* Any modifiers for a multibyte character are invalid. */
+ if (c & CHAR_MODIFIER_MASK)
+ error ("Invalid modifier in string");
+ p += CHAR_STRING (c, p);
+ force_multibyte = 1;
}
else
{
else if (c == (CHAR_CTL | '?'))
c = 127;
+ if (c & CHAR_SHIFT)
+ {
+ /* Shift modifier is valid only with [A-Za-z]. */
+ if ((c & 0377) >= 'A' && (c & 0377) <= 'Z')
+ c &= ~CHAR_SHIFT;
+ else if ((c & 0377) >= 'a' && (c & 0377) <= 'z')
+ c = (c & ~CHAR_SHIFT) - ('a' - 'A');
+ }
+
if (c & CHAR_META)
/* Move the meta bit to the right place for a string. */
c = (c & ~CHAR_META) | 0x80;
case '.':
{
-#ifdef LISP_FLOAT_TYPE
- /* If a period is followed by a number, then we should read it
- as a floating point number. Otherwise, it denotes a dotted
- pair. */
int next_char = READCHAR;
UNREAD (next_char);
- if (! (next_char >= '0' && next_char <= '9'))
-#endif
+ if (next_char <= 040)
{
*pch = c;
return Qnil;
while (c > 040
&& !(c == '\"' || c == '\'' || c == ';' || c == '?'
|| c == '(' || c == ')'
-#ifndef LISP_FLOAT_TYPE
- /* If we have floating-point support, then we need
- to allow <digits><dot><digits>. */
- || c =='.'
-#endif /* not LISP_FLOAT_TYPE */
|| c == '[' || c == ']' || c == '#'
))
{
- if (end - p < MAX_LENGTH_OF_MULTI_BYTE_FORM)
+ if (end - p < MAX_MULTIBYTE_LENGTH)
{
register char *new = (char *) xrealloc (read_buffer, read_buffer_size *= 2);
p += new - read_buffer;
}
if (! SINGLE_BYTE_CHAR_P (c))
- {
- unsigned char workbuf[4];
- unsigned char *str = workbuf;
- int length;
-
- length = non_ascii_char_to_string (c, workbuf, &str);
-
- bcopy (str, p, length);
- p += length;
- }
+ p += CHAR_STRING (c, p);
else
*p++ = c;
if (p1 != p)
{
while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
-#ifdef LISP_FLOAT_TYPE
/* Integers can have trailing decimal points. */
if (p1 > read_buffer && p1 < p && *p1 == '.') p1++;
-#endif
if (p1 == p)
/* It is an integer. */
{
-#ifdef LISP_FLOAT_TYPE
if (p1[-1] == '.')
p1[-1] = '\0';
-#endif
if (sizeof (int) == sizeof (EMACS_INT))
XSETINT (val, atoi (read_buffer));
else if (sizeof (long) == sizeof (EMACS_INT))
return val;
}
}
-#ifdef LISP_FLOAT_TYPE
if (isfloat_string (read_buffer))
{
/* Compute NaN and infinities using 0.0 in a variable,
return make_float (negative ? - value : value);
}
-#endif
}
if (uninterned_symbol)
case Lisp_Vectorlike:
{
int i;
- int length = Flength(subtree);
+ int length = XINT (Flength(subtree));
for (i = 0; i < length; i++)
{
Lisp_Object idx = make_number (i);
return subtree;
}
-#ifdef USE_TEXT_PROPERTIES
case Lisp_String:
{
/* Check for text properties in each interval.
return subtree;
}
-#endif /* defined USE_TEXT_PROPERTIES */
/* Other types don't recurse any further. */
default:
}
\f
-#ifdef LISP_FLOAT_TYPE
-
#define LEAD_INT 1
#define DOT_CHAR 2
#define TRAIL_INT 4
|| state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)
|| state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
}
-#endif /* LISP_FLOAT_TYPE */
+
\f
static Lisp_Object
read_vector (readcharfun, bytecodeflag)
error ("invalid byte code");
otem = XCONS (item);
- bytestr = XCONS (item)->car;
- item = XCONS (item)->cdr;
+ bytestr = XCAR (item);
+ item = XCDR (item);
free_cons (otem);
}
{
GCPRO2 (val, tail);
if (!NILP (tail))
- XCONS (tail)->cdr = read0 (readcharfun);
+ XCDR (tail) = read0 (readcharfun);
else
val = read0 (readcharfun);
read1 (readcharfun, &ch, 0);
{
/* Get a doc string from the file we are loading.
If it's in saved_doc_string, get it from there. */
- int pos = XINT (XCONS (val)->cdr);
+ int pos = XINT (XCDR (val));
/* Position is negative for user variables. */
if (pos < 0) pos = -pos;
if (pos >= saved_doc_string_position
? pure_cons (elt, Qnil)
: Fcons (elt, Qnil));
if (!NILP (tail))
- XCONS (tail)->cdr = tem;
+ XCDR (tail) = tem;
else
val = tem;
tail = tem;
}
DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,
- "Return the canonical symbol whose name is STRING, or nil if none exists.\n\
+ "Return the canonical symbol named NAME, or nil if none exists.\n\
+NAME may be a string or a symbol. If it is a symbol, that exact\n\
+symbol is searched for.\n\
A second optional argument specifies the obarray to use;\n\
it defaults to the value of `obarray'.")
- (string, obarray)
- Lisp_Object string, obarray;
+ (name, obarray)
+ Lisp_Object name, obarray;
{
register Lisp_Object tem;
+ struct Lisp_String *string;
if (NILP (obarray)) obarray = Vobarray;
obarray = check_obarray (obarray);
- CHECK_STRING (string, 0);
+ if (!SYMBOLP (name))
+ {
+ CHECK_STRING (name, 0);
+ string = XSTRING (name);
+ }
+ else
+ string = XSYMBOL (name)->name;
- tem = oblookup (obarray, XSTRING (string)->data,
- XSTRING (string)->size,
- STRING_BYTES (XSTRING (string)));
- if (!INTEGERP (tem))
+ tem = oblookup (obarray, string->data, string->size, STRING_BYTES (string));
+ if (INTEGERP (tem) || (SYMBOLP (name) && !EQ (name, tem)))
+ return Qnil;
+ else
return tem;
- return Qnil;
}
\f
DEFUN ("unintern", Funintern, Sunintern, 1, 2, 0,
(function, obarray)
Lisp_Object function, obarray;
{
- Lisp_Object tem;
-
if (NILP (obarray)) obarray = Vobarray;
obarray = check_obarray (obarray);
Qvariable_documentation = intern ("variable-documentation");
staticpro (&Qvariable_documentation);
- read_buffer_size = 100 + MAX_LENGTH_OF_MULTI_BYTE_FORM;
- read_buffer = (char *) malloc (read_buffer_size);
+ read_buffer_size = 100 + MAX_MULTIBYTE_LENGTH;
+ read_buffer = (char *) xmalloc (read_buffer_size);
}
\f
void
XMISCTYPE (val) = Lisp_Misc_Boolfwd;
XBOOLFWD (val)->boolvar = address;
XSYMBOL (sym)->value = val;
+ Vbyte_boolean_vars = Fcons (sym, Vbyte_boolean_vars);
}
/* Similar but define a variable whose value is the Lisp Object stored
staticpro (address);
}
-#ifndef standalone
-
/* Similar but define a variable whose value is the Lisp Object stored in
the current buffer. address is the address of the slot in the buffer
that is current now. */
XMISCTYPE (val) = Lisp_Misc_Buffer_Objfwd;
XBUFFER_OBJFWD (val)->offset = offset;
XSYMBOL (sym)->value = val;
- *(Lisp_Object *)(offset + (char *)&buffer_local_symbols) = sym;
- *(Lisp_Object *)(offset + (char *)&buffer_local_types) = type;
- if (XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags)) == 0)
+ PER_BUFFER_SYMBOL (offset) = sym;
+ PER_BUFFER_TYPE (offset) = type;
+
+ if (PER_BUFFER_IDX (offset) == 0)
/* Did a DEFVAR_PER_BUFFER without initializing the corresponding
slot of buffer_local_flags */
abort ();
}
-#endif /* standalone */
/* Similar but define a variable whose value is the Lisp Object stored
at a particular offset in the current kboard object. */
char *normal;
int turn_off_warning = 0;
-#ifdef HAVE_SETLOCALE
- /* Make sure numbers are parsed as we expect. */
- setlocale (LC_NUMERIC, "C");
-#endif /* HAVE_SETLOCALE */
-
/* Compute the default load-path. */
#ifdef CANNOT_DUMP
normal = PATH_LOADSEARCH;
for (path_tail = Vload_path;
!NILP (path_tail);
- path_tail = XCONS (path_tail)->cdr)
+ path_tail = XCDR (path_tail))
{
Lisp_Object dirfile;
dirfile = Fcar (path_tail);
dirfile = Fdirectory_file_name (dirfile);
if (access (XSTRING (dirfile)->data, 0) < 0)
dir_warning ("Warning: Lisp directory `%s' does not exist.\n",
- XCONS (path_tail)->car);
+ XCAR (path_tail));
}
}
}
except for one element (optional) that starts with nil and describes\n\
definitions evaluated from buffers not visiting files.\n\
The remaining elements of each list are symbols defined as functions\n\
-or variables, and cons cells `(provide . FEATURE)' and `(require . FEATURE)'.");
+or variables, and cons cells `(provide . FEATURE)', `(require . FEATURE)',\n\
+and `(autoload . SYMBOL)'.");
Vload_history = Qnil;
DEFVAR_LISP ("load-file-name", &Vload_file_name,
Vload_file_name = Qnil;
DEFVAR_LISP ("user-init-file", &Vuser_init_file,
- "File name, including directory, of user's initialization file.");
+ "File name, including directory, of user's initialization file.\n\
+If the file loaded had extension `.elc' and there was a corresponding `.el'\n\
+file, this variable contains the name of the .el file, suitable for use\n\
+by functions like `custom-save-all' which edit the init file.");
Vuser_init_file = Qnil;
DEFVAR_LISP ("current-load-list", &Vcurrent_load_list,
load_force_doc_strings = 0;
DEFVAR_BOOL ("load-convert-to-unibyte", &load_convert_to_unibyte,
- "Non-nil means `load' converts strings to unibyte whenever possible.\n\
-This is normally used in `load-with-code-conversion'\n\
-for loading non-compiled files.");
+ "Non-nil means `read' converts strings to unibyte whenever possible.\n\
+This is normally bound by `load' and `eval-buffer' to control `read',\n\
+and is not meant for users to change.");
load_convert_to_unibyte = 0;
DEFVAR_LISP ("source-directory", &Vsource_directory,
"List of files that were preloaded (when dumping Emacs).");
Vpreloaded_file_list = Qnil;
+ DEFVAR_LISP ("byte-boolean-vars", &Vbyte_boolean_vars,
+ "List of all DEFVAR_BOOL variables, used by the byte code optimizer.");
+ Vbyte_boolean_vars = Qnil;
+
+ DEFVAR_BOOL ("load-dangerous-libraries", &load_dangerous_libraries,
+ "Non-nil means load dangerous compiled Lisp files.\n\
+Some versions of XEmacs use different byte codes than Emacs. These\n\
+incompatible byte codes can make Emacs crash when it tries to execute\n\
+them.");
+ load_dangerous_libraries = 0;
+
+ Vbytecomp_version_regexp = build_string ("^;;;.in Emacs version");
+ staticpro (&Vbytecomp_version_regexp);
+
/* Vsource_directory was initialized in init_lread. */
load_descriptor_list = Qnil;