summaryrefslogtreecommitdiff
path: root/java/src/IceUtilInternal/StringUtil.java
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2009-12-10 13:41:49 -0800
committerMark Spruiell <mes@zeroc.com>2009-12-10 13:41:49 -0800
commit47bc7e93cb03a077c0eef8a2cc871cead1212c00 (patch)
tree477aa3c5c77a5b458abc19b92c3ca12360c996a5 /java/src/IceUtilInternal/StringUtil.java
parentSquashed commit of the following: (diff)
downloadice-47bc7e93cb03a077c0eef8a2cc871cead1212c00.tar.bz2
ice-47bc7e93cb03a077c0eef8a2cc871cead1212c00.tar.xz
ice-47bc7e93cb03a077c0eef8a2cc871cead1212c00.zip
bug 4355 - improve parse exception messages
Diffstat (limited to 'java/src/IceUtilInternal/StringUtil.java')
-rw-r--r--java/src/IceUtilInternal/StringUtil.java77
1 files changed, 40 insertions, 37 deletions
diff --git a/java/src/IceUtilInternal/StringUtil.java b/java/src/IceUtilInternal/StringUtil.java
index befc624f425..137bb234e06 100644
--- a/java/src/IceUtilInternal/StringUtil.java
+++ b/java/src/IceUtilInternal/StringUtil.java
@@ -199,11 +199,22 @@ public final class StringUtil
}
private static char
- checkChar(char c)
+ checkChar(String s, int pos)
{
+ char c = s.charAt(pos);
if(!(c >= 32 && c <= 126))
{
- throw new IllegalArgumentException("illegal input character");
+ String msg;
+ if(pos > 0)
+ {
+ msg = "character after `" + s.substring(0, pos) + "'";
+ }
+ else
+ {
+ msg = "first character";
+ }
+ msg += " is not a printable ASCII character (ordinal " + (int)c + ")";
+ throw new IllegalArgumentException(msg);
}
return c;
}
@@ -223,13 +234,13 @@ public final class StringUtil
if(s.charAt(start) != '\\')
{
- c = checkChar(s.charAt(start++));
+ c = checkChar(s, start++);
}
else
{
if(start + 1 == end)
{
- throw new IllegalArgumentException("trailing backslash in argument");
+ throw new IllegalArgumentException("trailing backslash");
}
switch(s.charAt(++start))
{
@@ -279,7 +290,7 @@ public final class StringUtil
case '6':
case '7':
{
- int oct = 0;
+ int val = 0;
for(int j = 0; j < 3 && start < end; ++j)
{
int charVal = s.charAt(start++) - '0';
@@ -288,18 +299,19 @@ public final class StringUtil
--start;
break;
}
- oct = oct * 8 + charVal;
+ val = val * 8 + charVal;
}
- if(oct > 255)
+ if(val > 255)
{
- throw new IllegalArgumentException("octal value out of range");
+ String msg = "octal value \\" + Integer.toOctalString(val) + " (" + val + ") is out of range";
+ throw new IllegalArgumentException(msg);
}
- c = (char)oct;
+ c = (char)val;
break;
}
default:
{
- c = checkChar(s.charAt(start++));
+ c = checkChar(s, start++);
break;
}
}
@@ -324,42 +336,33 @@ public final class StringUtil
}
//
- // Remove escape sequences added by escapeString.
+ // Remove escape sequences added by escapeString. Throws IllegalArgumentException
+ // for an invalid input string.
//
- public static boolean
- unescapeString(String s, int start, int end, Ice.StringHolder result)
+ public static String
+ unescapeString(String s, int start, int end)
{
- if(start < 0)
- {
- throw new IllegalArgumentException("start offset must be >= 0");
- }
- if(end > s.length())
- {
- throw new IllegalArgumentException("end offset must <= s.length()");
- }
- if(start > end)
+ assert(start >= 0 && start <= end && end <= s.length());
+
+ StringBuilder sb = new StringBuilder(end - start);
+ decodeString(s, start, end, sb);
+ String decodedString = sb.toString();
+
+ byte[] arr = new byte[decodedString.length()];
+ for(int i = 0; i < arr.length; ++i)
{
- throw new IllegalArgumentException("start offset must <= end offset");
+ arr[i] = (byte)decodedString.charAt(i);
}
try
{
- StringBuilder sb = new StringBuilder(end - start);
- decodeString(s, start, end, sb);
- String decodedString = sb.toString();
-
- byte[] arr = new byte[decodedString.length()];
- for(int i = 0; i < arr.length; ++i)
- {
- arr[i] = (byte)decodedString.charAt(i);
- }
-
- result.value = new String(arr, 0, arr.length, "UTF8");
- return true;
+ return new String(arr, 0, arr.length, "UTF8");
}
- catch(java.lang.Exception ex)
+ catch(java.io.UnsupportedEncodingException ex)
{
- return false;
+ IllegalArgumentException e = new IllegalArgumentException("unsupported encoding");
+ e.initCause(ex);
+ throw e;
}
}