blob: c7ad85ce53cc167182baf00228b1b238d810bdce [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dasm;
/**
* Different string manipulations utility methods
*/
public class Utils {
/**
* Replace '.' characters with '/' in a string
*/
public static String convertDotsToSlashes(String name) {
if (name == null) return null;
return name.replace('.', '/');
}
/**
* Splits string like "v1, v2, v3" or "v1..v3" into list of registers
*/
public static String[] splitRegList(String list) {
String[] result = null;
if (list.length() > 0)
result = list.split("[\\s]*,[\\s]*|[\\s]*\\.\\.[\\s]*");
return result;
}
/**
* Converts string to a smallest possible number (int, long, float or
* double)
*/
public static Number stringToNumber(String str)
throws NumberFormatException {
if (str.startsWith("+")) {
return new Integer(str.substring(1));
}
if (str.startsWith("0x")) {
return (Utils.stringToSmallestInteger(str.substring(2), 16));
} else if (str.indexOf('.') != -1) {
double x = Double.parseDouble(str);
if (x <= (double) Float.MAX_VALUE && x >= (float) Float.MIN_VALUE) {
return new Float((float) x);
}
return new Double(x);
} else {
return (Utils.stringToSmallestInteger(str, 10));
}
}
/**
* Converts string to a smallest possible integer (int or long)
*/
private static Number stringToSmallestInteger(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);
}
/**
* Splits string "package/class/method(param)return_type" into
* "package/class", "method", "(param)return_type"
*/
public static String[] getClassMethodSignatureFromString(String name) {
String signature = convertDotsToSlashes(name);
String result[] = new String[3];
int mpos = 0, sigpos = 0;
int i;
// find first '('
sigpos = signature.indexOf('(');
if (sigpos == -1) {
sigpos = 0;
i = signature.length() - 1;
} else {
i = sigpos - 1;
}
// find last '/' before '('
for (; i >= 0; i--) {
if (signature.charAt(i) == '/') {
mpos = i;
break;
}
}
try {
result[0] = signature.substring(0, mpos);
result[1] = signature.substring(mpos + 1, sigpos);
result[2] = signature.substring(sigpos);
} catch (StringIndexOutOfBoundsException e) {
throw new IllegalArgumentException("malformed method signature : "
+ name);
}
return result;
}
/**
* Splits string "package/class/field" into "package/class" and "field"
*/
public static String[] getClassFieldFromString(String name) {
name = convertDotsToSlashes(name);
String result[] = new String[2];
int pos = name.lastIndexOf('/');
if (pos == -1) {
result[0] = null;
result[1] = name;
} else {
result[0] = name.substring(0, pos);
result[1] = name.substring(pos + 1);
}
return result;
}
/**
* Splits string "method(param)return_type" into "method" and
* "(param)return_type"
*/
public static String[] getMethodSignatureFromString(String name) {
int sigpos = name.indexOf('(');
if (sigpos == -1) sigpos = 0;
String result[] = new String[2];
result[0] = name.substring(0, sigpos);
result[1] = convertDotsToSlashes(name.substring(sigpos));
return result;
}
}