diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-11-14 12:44:33 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-11-14 12:44:33 +0000 |
commit | c362926ed1e9cfb0f7b97491bef8a5624e41c226 (patch) | |
tree | 004d59163ce9f71437b411ba3ebe97bfeee40bdf /src | |
parent | 2fb7a11de0332080286ae74ae6eccf8bf2749621 (diff) |
fix for unicode escapes, patch from Toralf Wittner
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index c5a5c99c..29d68885 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -422,10 +422,9 @@ static class StringReader extends AFn{ case 'u':
{
ch = r.read();
- if(Character.isDigit(ch))
- ch = readUnicodeChar((PushbackReader) r, ch, 16, 4, true);
- else
- throw new Exception("Invalid unicode escape: \\" + (char) ch);
+ if (Character.digit(ch, 16) == -1)
+ throw new Exception("Invalid unicode escape: \\u" + (char) ch);
+ ch = readUnicodeChar((PushbackReader) r, ch, 16, 4, true);
break;
}
default:
@@ -809,7 +808,12 @@ static class CharacterReader extends AFn{ else if(token.equals("return"))
return '\r';
else if(token.startsWith("u"))
- return (char) readUnicodeChar(token, 1, 4, 16);
+ {
+ char c = (char) readUnicodeChar(token, 1, 4, 16);
+ if(c >= '\uD800' && c <= '\uDFFF') // surrogate code unit?
+ throw new Exception("Invalid character constant: \\u" + Integer.toString(c, 16));
+ return c;
+ }
else if(token.startsWith("o"))
{
int len = token.length() - 1;
|