Also, room for invalid syntax diagnostic. */
char buf[max (1 + 1 + UINTMAX_WIDTH + 1,
sizeof "integer, radix " + INT_STRLEN_BOUND (EMACS_INT))];
-
+ char *p = buf;
int valid = -1; /* 1 if valid, 0 if not, -1 if incomplete. */
if (radix < 2 || radix > 36)
valid = 0;
else
{
- char *p = buf;
int c, digit;
c = READCHAR;
valid = 0;
if (valid < 0)
valid = 1;
-
- if (p < buf + sizeof buf - 1)
- *p++ = c;
- else
- valid = 0;
-
+ *p = c;
+ p += p < buf + sizeof buf;
c = READCHAR;
}
UNREAD (c);
- *p = '\0';
}
if (valid != 1)
invalid_syntax (buf);
}
+ if (p == buf + sizeof buf)
+ {
+ memset (p - 3, '.', 3);
+ xsignal1 (Qoverflow_error, make_unibyte_string (buf, sizeof buf));
+ }
+
+ *p = '\0';
return string_to_number (buf, radix, 0);
}
(lread--substitute-object-in-subtree x 1 t)
(should (eq x (cdr x)))))
+(ert-deftest lread-long-hex-integer ()
+ (should-error
+ (read "#xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
+ :type 'overflow-error))
+
;;; lread-tests.el ends here