]> git.eshelyaron.com Git - emacs.git/commitdiff
(read1): Fix and relax read syntax.
authorKim F. Storm <storm@cua.dk>
Mon, 17 Feb 2003 22:42:05 +0000 (22:42 +0000)
committerKim F. Storm <storm@cua.dk>
Mon, 17 Feb 2003 22:42:05 +0000 (22:42 +0000)
Recognize "[", ";", "#", and "?" after a dotted-pair dot.
Only recognize "," after dotted-pair dot if inside backquote.
Never include "`" or "," (inside backquote) in a symbol.
Allow dotted-pair dot after a character constant.
Allow "`" and "," (inside backquote) after a character constant.

src/lread.c

index 228a60075dc7a7fd851bb5a68a429254882282da..fc236ea84d9ad5bc80c6018b319ae98d24d73df6 100644 (file)
@@ -2251,7 +2251,8 @@ read1 (readcharfun, pch, first_in_list)
     case '?':
       {
        int discard;
-       int nextc;
+       int next_char;
+       int ok;
 
        c = READCHAR;
        if (c < 0)
@@ -2262,13 +2263,25 @@ read1 (readcharfun, pch, first_in_list)
        else if (BASE_LEADING_CODE_P (c))
          c = read_multibyte (c, readcharfun);
 
-       nextc = READCHAR;
-       UNREAD (nextc);
-       if (nextc > 040
-           && !(nextc == '?' 
-                || nextc == '\"' || nextc == '\'' || nextc == ';'
-                || nextc == '(' || nextc == ')'
-                || nextc == '[' || nextc == ']' || nextc == '#'))
+       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
+                 || index ("\"'`;([#?", next_next_char)
+                 || (new_backquote_flag && next_next_char == ','));
+         }
+       else
+         {
+           ok = (next_char <= 040
+                 || index ("\"'`;()[]#", 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);
@@ -2423,7 +2436,8 @@ read1 (readcharfun, pch, first_in_list)
        UNREAD (next_char);
 
        if (next_char <= 040
-           || index ("\"'`,(", next_char))
+           || index ("\"'`;([#?", next_char)
+           || (new_backquote_flag && next_char == ','))
          {
            *pch = c;
            return Qnil;
@@ -2444,9 +2458,8 @@ read1 (readcharfun, pch, first_in_list)
          char *end = read_buffer + read_buffer_size;
 
          while (c > 040
-                && !(c == '\"' || c == '\'' || c == ';'
-                     || c == '(' || c == ')'
-                     || c == '[' || c == ']' || c == '#'))
+                && !index ("\"'`;()[]#", c)
+                && !(new_backquote_flag && c == ','))
            {
              if (end - p < MAX_MULTIBYTE_LENGTH)
                {