opu.lljvm-python.0.2.0-EXPERIMENTAL.source-code.ScannerUtils Maven / Gradle / Ivy
The newest version!
/* --- Copyright Jonathan Meyer 1997. All rights reserved. -----------------
> File: jasmin/src/jasmin/ScannerUtils.java
> Purpose: Various static methods utilized to breakdown strings
> Author: Jonathan Meyer, 8 Feb 1997
*/
package jasmin;
abstract class ScannerUtils {
//
// Converts a string of a given radix to an int or a long
// (uses smallest format that will hold the number)
//
public static Number convertInt(String str, int radix)
throws NumberFormatException
{
long x = Long.parseLong(str, radix);
if (x <= (long)Integer.MAX_VALUE && x >= (long)Integer.MIN_VALUE) {
return new Integer((int)x);
}
return new Long(x);
}
//
// Converts a string to a number (int, float, long, or double).
// (uses smallest format that will hold the number)
//
public static Number convertNumber(String str)
throws NumberFormatException
{
if(str.startsWith("+")) {
return new Integer(str.substring(1,str.length()));
}
if (str.startsWith("0x")) {
// base 16 integer
return (convertInt(str.substring(2), 16));
} else if (str.indexOf('.') != -1) {
// make a double
Double dc = new Double(str);
// if number have suffix 'd' force double value
// thanks to JD Brennan
if(!str.endsWith("d")) {
double x = dc.doubleValue();
// see if it will fit into a float...
if (x <= (double)Float.MAX_VALUE && x >= (float)Float.MIN_VALUE) {
// bug fix here thanks to Peter Chubb (replaced int->float)
return new Float((float)x);
}
// if not, return a double
}
return dc;
} else {
// assume long or int in base 10
return (convertInt(str, 10));
}
}
//
// Maps '.' characters to '/' characters in a string
//
public static String convertDots(String orig_name)
{
return convertChars(orig_name, ".", '/');
}
//
// Maps chars to toChar in a given String
//
public static String convertChars(String orig_name,
String chars, char toChar)
{
StringBuffer tmp = new StringBuffer(orig_name);
int i;
for (i = 0; i < tmp.length(); i++) {
if (chars.indexOf(tmp.charAt(i)) != -1) {
tmp.setCharAt(i, toChar);
}
}
return new String(tmp);
}
//
// Splits a string like:
// "a/b/c/d(xyz)v"
// into three strings:
// "a/b/c", "d", "(xyz)v"
//
public static String[] splitClassMethodSignature(String name) {
String result[] = new String[3];
int i, pos = 0, sigpos = 0;
for (i = 0; i < name.length(); i++) {
char c = name.charAt(i);
if (c == '.' || c == '/') pos = i;
else if (c == '(') {sigpos = i; break; }
}
try {
result[0] = convertDots(name.substring(0, pos));
result[1] = name.substring(pos + 1, sigpos);
result[2] = convertDots(name.substring(sigpos));
} catch(StringIndexOutOfBoundsException e) {
throw new IllegalArgumentException("malformed signature : "+name);
}
return result;
}
//
// Splits a string like:
// "java/lang/System/out"
// into two strings:
// "java/lang/System" and "out"
//
public static String[] splitClassField(String name)
{
String result[] = new String[2];
int i, pos = -1, sigpos = 0;
for (i = 0; i < name.length(); i++) {
char c = name.charAt(i);
if (c == '.' || c == '/') pos = i;
}
if (pos == -1) { // no '/' in string
result[0] = null;
result[1] = name;
} else {
result[0] = convertDots(name.substring(0, pos));
result[1] = name.substring(pos + 1);
}
return result;
}
// Splits a string like:
// "main(Ljava/lang/String;)V
// into two strings:
// "main" and "(Ljava/lang/String;)V"
//
public static String[] splitMethodSignature(String name)
{
String result[] = new String[2];
int i, sigpos = 0;
for (i = 0; i < name.length(); i++) {
char c = name.charAt(i);
if (c == '(') {sigpos = i; break; }
}
result[0] = name.substring(0, sigpos);
result[1] = convertDots(name.substring(sigpos));
return result;
}
}
/* --- Revision History ---------------------------------------------------
--- Iouri Kharon, May 07 2010
'd' in real constant, force double mode.
*/