summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-11-14 12:44:33 +0000
committerRich Hickey <richhickey@gmail.com>2008-11-14 12:44:33 +0000
commitc362926ed1e9cfb0f7b97491bef8a5624e41c226 (patch)
tree004d59163ce9f71437b411ba3ebe97bfeee40bdf /src
parent2fb7a11de0332080286ae74ae6eccf8bf2749621 (diff)
fix for unicode escapes, patch from Toralf Wittner
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/LispReader.java14
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;