(Fcoordinates_in_window_p): Take account of FRAME_INTERNAL_BORDER_WIDTH.
[bpt/emacs.git] / src / lread.c
index e32f669..db83623 100644 (file)
@@ -1,5 +1,5 @@
 /* Lisp parsing and input streams.
-   Copyright (C) 1985, 86, 87, 88, 89, 93, 94, 95, 97, 98, 99, 2000, 2001
+   Copyright (C) 1985,86,87,88,89,93,94,95,97,98,99,2000,01,03,2004
       Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -61,6 +61,9 @@ Boston, MA 02111-1307, USA.  */
 #include <locale.h>
 #endif /* HAVE_SETLOCALE */
 
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
 #ifndef O_RDONLY
 #define O_RDONLY 0
 #endif
@@ -844,7 +847,7 @@ Return t if file exists.  */)
                  Lisp_Object file;
                  file = Fsubstring (found, make_number (0), make_number (-1));
                  message_with_string ("Source file `%s' newer than byte-compiled file",
-                                      file, STRING_MULTIBYTE (file));
+                                      file, 1);
                }
            }
        }
@@ -941,6 +944,11 @@ Return t if file exists.  */)
        message_with_string ("Loading %s...done", file, 1);
     }
 
+  if (!NILP (Fequal (build_string ("obsolete"),
+                    Ffile_name_nondirectory
+                    (Fdirectory_file_name (Ffile_name_directory (found))))))
+    message_with_string ("Package %s is obsolete", file, 1);
+
   return Qt;
 }
 
@@ -1049,6 +1057,8 @@ openp (path, str, suffixes, storeptr, predicate)
   Lisp_Object string, tail, encoded_fn;
   int max_suffix_len = 0;
 
+  CHECK_STRING (str);
+
   for (tail = suffixes; CONSP (tail); tail = XCDR (tail))
     {
       CHECK_STRING_CAR (tail);
@@ -1121,8 +1131,8 @@ openp (path, str, suffixes, storeptr, predicate)
                  handler = Ffind_file_name_handler (filename, Qfile_exists_p);
             It's not clear why that was the case and it breaks things like
             (load "/bar.el") where the file is actually "/bar.el.gz".  */
-         handler = Ffind_file_name_handler (filename, Qfile_exists_p);
          string = build_string (fn);
+         handler = Ffind_file_name_handler (string, Qfile_exists_p);
          if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate))
             {
              if (NILP (predicate))
@@ -1697,9 +1707,13 @@ read_escape (readcharfun, stringp, byterep)
       return c | alt_modifier;
 
     case 's':
+      if (stringp)
+       return ' ';
       c = READCHAR;
-      if (c != '-')
-       error ("Invalid escape character syntax");
+      if (c != '-') {
+       UNREAD (c);
+       return ' ';
+      }
       c = READCHAR;
       if (c == '\\')
        c = read_escape (readcharfun, 0, byterep);
@@ -1979,8 +1993,9 @@ read1 (readcharfun, pch, first_in_list)
          if (c == '"')
            {
              Lisp_Object tmp, val;
-             int size_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1)
-                                  / BITS_PER_CHAR);
+             int size_in_chars
+               = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
+                  / BOOL_VECTOR_BITS_PER_CHAR);
 
              UNREAD (c);
              tmp = read1 (readcharfun, pch, first_in_list);
@@ -1989,7 +2004,7 @@ read1 (readcharfun, pch, first_in_list)
                     when the number of bits was a multiple of 8.
                     Accept such input in case it came from an old version.  */
                  && ! (XFASTINT (length)
-                       == (SCHARS (tmp) - 1) * BITS_PER_CHAR))
+                       == (SCHARS (tmp) - 1) * BOOL_VECTOR_BITS_PER_CHAR))
                Fsignal (Qinvalid_read_syntax,
                         Fcons (make_string ("#&...", 5), Qnil));
 
@@ -1997,9 +2012,9 @@ read1 (readcharfun, pch, first_in_list)
              bcopy (SDATA (tmp), XBOOL_VECTOR (val)->data,
                     size_in_chars);
              /* Clear the extraneous bits in the last byte.  */
-             if (XINT (length) != size_in_chars * BITS_PER_CHAR)
+             if (XINT (length) != size_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
                XBOOL_VECTOR (val)->data[size_in_chars - 1]
-                 &= (1 << (XINT (length) % BITS_PER_CHAR)) - 1;
+                 &= (1 << (XINT (length) % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
              return val;
            }
          Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#&...", 5),
@@ -2123,7 +2138,7 @@ read1 (readcharfun, pch, first_in_list)
        {
          /* #! appears at the beginning of an executable file.
             Skip the first line.  */
-         while (c != '\n')
+         while (c != '\n' && c >= 0)
            c = READCHAR;
          goto retry;
        }
@@ -2247,16 +2262,50 @@ read1 (readcharfun, pch, first_in_list)
     case '?':
       {
        int discard;
+       int next_char;
+       int ok;
 
        c = READCHAR;
        if (c < 0)
          end_of_file_error ();
 
+       /* Accept `single space' syntax like (list ? x) where the
+          whitespace character is SPC or TAB.
+          Other literal whitespace like NL, CR, and FF are not accepted,
+          as there are well-established escape sequences for these.  */
+       if (c == ' ' || c == '\t')
+         return make_number (c);
+
        if (c == '\\')
          c = read_escape (readcharfun, 0, &discard);
        else if (BASE_LEADING_CODE_P (c))
          c = read_multibyte (c, readcharfun);
 
+       next_char = READCHAR;
+       if (next_char == '.')
+         {
+           /* Only a dotted-pair dot is valid after a char constant.  */
+           int next_next_char = READCHAR;
+           UNREAD (next_next_char);
+
+           ok = (next_next_char <= 040
+                 || (next_next_char < 0200
+                     && (index ("\"';([#?", next_next_char)
+                         || (!first_in_list && next_next_char == '`')
+                         || (new_backquote_flag && next_next_char == ','))));
+         }
+       else
+         {
+           ok = (next_char <= 040
+                 || (next_char < 0200
+                     && (index ("\"';()[]#?", next_char)
+                         || (!first_in_list && next_char == '`')
+                         || (new_backquote_flag && next_char == ','))));
+         }
+       UNREAD (next_char);
+       if (!ok)
+         Fsignal (Qinvalid_read_syntax, Fcons (make_string ("?", 1), Qnil));
+
        return make_number (c);
       }
 
@@ -2325,7 +2374,7 @@ read1 (readcharfun, pch, first_in_list)
              c = 0;
            else if (c == (CHAR_CTL | '?'))
              c = 127;
-
+           
            if (c & CHAR_SHIFT)
              {
                /* Shift modifier is valid only with [A-Za-z].  */
@@ -2409,7 +2458,10 @@ read1 (readcharfun, pch, first_in_list)
        UNREAD (next_char);
 
        if (next_char <= 040
-           || index ("\"'`,(", next_char))
+           || (next_char < 0200
+               && index ("\"';([#?", next_char)
+               || (!first_in_list && next_char == '`')
+               || (new_backquote_flag && next_char == ',')))
          {
            *pch = c;
            return Qnil;
@@ -2430,9 +2482,10 @@ read1 (readcharfun, pch, first_in_list)
          char *end = read_buffer + read_buffer_size;
 
          while (c > 040
-                && !(c == '\"' || c == '\'' || c == ';'
-                     || c == '(' || c == ')'
-                     || c == '[' || c == ']' || c == '#'))
+                && (c >= 0200
+                    || (!index ("\"';()[]#", c)
+                        && !(!first_in_list && c == '`')
+                        && !(new_backquote_flag && c == ','))))
            {
              if (end - p < MAX_MULTIBYTE_LENGTH)
                {
@@ -3443,7 +3496,6 @@ defvar_per_buffer (namestring, address, type, doc)
 {
   Lisp_Object sym, val;
   int offset;
-  extern struct buffer buffer_local_symbols;
 
   sym = intern (namestring);
   val = allocate_misc ();
@@ -3625,11 +3677,15 @@ init_lread ()
     }
 #endif
 
-#ifndef WINDOWSNT
+#if (!(defined(WINDOWSNT) || (defined(HAVE_CARBON))))
   /* When Emacs is invoked over network shares on NT, PATH_LOADSEARCH is
      almost never correct, thereby causing a warning to be printed out that
      confuses users.  Since PATH_LOADSEARCH is always overridden by the
-     EMACSLOADPATH environment variable below, disable the warning on NT.  */
+     EMACSLOADPATH environment variable below, disable the warning on NT.  
+     Also, when using the "self-contained" option for Carbon Emacs for MacOSX,
+     the "standard" paths may not exist and would be overridden by
+     EMACSLOADPATH as on NT.  Since this depends on how the executable
+     was build and packaged, turn off the warnings in general */
 
   /* Warn if dirs in the *standard* path don't exist.  */
   if (!turn_off_warning)
@@ -3651,7 +3707,7 @@ init_lread ()
            }
        }
     }
-#endif /* WINDOWSNT */
+#endif /* !(WINDOWSNT || HAVE_CARBON) */
 
   /* If the EMACSLOADPATH environment variable is set, use its value.
      This doesn't apply if we're dumping.  */
@@ -3918,3 +3974,6 @@ to load.  See also `load-dangerous-libraries'.  */);
   Vloads_in_progress = Qnil;
   staticpro (&Vloads_in_progress);
 }
+
+/* arch-tag: a0d02733-0f96-4844-a659-9fd53c4f414d
+   (do not change this comment) */