X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/95a2cb24b0697558e6629460d8bc693b394f0138..eb0f65b4fbbea60100b53cb40a1d7138d47ad0d2:/src/lread.c diff --git a/src/lread.c b/src/lread.c index 69ec05964b..11c8d0031c 100644 --- a/src/lread.c +++ b/src/lread.c @@ -28,6 +28,7 @@ along with GNU Emacs. If not, see . */ #include #include #include /* For CHAR_BIT. */ +#include #include #include "lisp.h" #include "intervals.h" @@ -1032,13 +1033,9 @@ Return t if the file exists and loads successfully. */) bool compiled = 0; Lisp_Object handler; bool safe_p = 1; - const char *fmode = "r"; + const char *fmode = "r" FOPEN_TEXT; int version; -#ifdef DOS_NT - fmode = "rt"; -#endif /* DOS_NT */ - CHECK_STRING (file); /* If file name is magic, call the handler. */ @@ -1222,10 +1219,7 @@ Return t if the file exists and loads successfully. */) compiled = 1; efound = ENCODE_FILE (found); - -#ifdef DOS_NT - fmode = "rb"; -#endif /* DOS_NT */ + fmode = "r" FOPEN_BINARY; /* openp already checked for newness, no point doing it again. FIXME would be nice to get a message when openp @@ -3030,7 +3024,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list) ch = read_escape (readcharfun, 1); - /* CH is -1 if \ newline has just been seen. */ + /* CH is -1 if \ newline or \ space has just been seen. */ if (ch == -1) { if (p == read_buffer) @@ -3286,7 +3280,7 @@ substitute_object_recurse (Lisp_Object object, Lisp_Object placeholder, Lisp_Obj { case Lisp_Vectorlike: { - ptrdiff_t i, length = 0; + ptrdiff_t i = 0, length = 0; if (BOOL_VECTOR_P (subtree)) return subtree; /* No sub-objects anyway. */ else if (CHAR_TABLE_P (subtree) || SUB_CHAR_TABLE_P (subtree) @@ -3301,7 +3295,9 @@ substitute_object_recurse (Lisp_Object object, Lisp_Object placeholder, Lisp_Obj behavior. */ wrong_type_argument (Qsequencep, subtree); - for (i = 0; i < length; i++) + if (SUB_CHAR_TABLE_P (subtree)) + i = 2; + for ( ; i < length; i++) SUBSTITUTE (AREF (subtree, i), ASET (subtree, i, true_value)); return subtree; @@ -3369,10 +3365,6 @@ string_to_number (char const *string, int base, bool ignore_trailing) bool float_syntax = 0; double value = 0; - /* Compute NaN and infinities using a variable, to cope with compilers that - think they are smarter than we are. */ - double zero = 0; - /* Negate the value ourselves. This treats 0, NaNs, and infinity properly on IEEE floating point hosts, and works around a formerly-common bug where atof ("-0.0") drops the sign. */ @@ -3424,30 +3416,15 @@ string_to_number (char const *string, int base, bool ignore_trailing) { state |= E_EXP; cp += 3; - value = 1.0 / zero; + value = INFINITY; } else if (cp[-1] == '+' && cp[0] == 'N' && cp[1] == 'a' && cp[2] == 'N') { state |= E_EXP; cp += 3; - value = zero / zero; - - /* If that made a "negative" NaN, negate it. */ - { - int i; - union { double d; char c[sizeof (double)]; } - u_data, u_minus_zero; - u_data.d = value; - u_minus_zero.d = -0.0; - for (i = 0; i < sizeof (double); i++) - if (u_data.c[i] & u_minus_zero.c[i]) - { - value = -value; - break; - } - } - /* Now VALUE is a positive NaN. */ + /* NAN is a "positive" NaN on all known Emacs hosts. */ + value = NAN; } else cp = ecp; @@ -3801,8 +3778,11 @@ intern_1 (const char *str, ptrdiff_t len) Lisp_Object obarray = check_obarray (Vobarray); Lisp_Object tem = oblookup (obarray, str, len, len); - return SYMBOLP (tem) ? tem : intern_driver (make_string (str, len), - obarray, tem); + return (SYMBOLP (tem) ? tem + /* The above `oblookup' was done on the basis of nchars==nbytes, so + the string has to be unibyte. */ + : intern_driver (make_unibyte_string (str, len), + obarray, tem)); } Lisp_Object @@ -4438,9 +4418,10 @@ init_lread (void) void dir_warning (char const *use, Lisp_Object dirname) { - static char const format[] = "Warning: %s `%s': %s\n"; + static char const format[] = "Warning: %s '%s': %s\n"; int access_errno = errno; - fprintf (stderr, format, use, SSDATA (dirname), strerror (access_errno)); + fprintf (stderr, format, use, SSDATA (ENCODE_SYSTEM (dirname)), + strerror (access_errno)); /* Don't log the warning before we've initialized!! */ if (initialized) @@ -4612,8 +4593,10 @@ of the file, regardless of whether or not it has the `.elc' extension. */); DEFVAR_LISP ("load-read-function", Vload_read_function, doc: /* Function used by `load' and `eval-region' for reading expressions. -The default is nil, which means use the function `read'. */); - Vload_read_function = Qnil; +Called with a single argument (the stream from which to read). +The default is to use the function `read'. */); + DEFSYM (Qread, "read"); + Vload_read_function = Qread; DEFVAR_LISP ("load-source-file-function", Vload_source_file_function, doc: /* Function called in `load' to load an Emacs Lisp source file.