Move parseFloat and parseDouble to LiteralTools

This commit is contained in:
Ben Gruver 2012-09-24 18:17:39 -07:00
parent de3a5f95ae
commit a3dce1f48c
2 changed files with 41 additions and 38 deletions

View File

@ -96,42 +96,6 @@ import org.jf.dexlib.Code.Format.*;
return val; return val;
} }
private static Pattern specialFloatRegex = Pattern.compile("((-)?infinityf)|(nanf)", Pattern.CASE_INSENSITIVE);
private float parseFloat(String floatString) {
Matcher m = specialFloatRegex.matcher(floatString);
if (m.matches()) {
//got an infinity
if (m.start(1) != -1) {
if (m.start(2) != -1) {
return Float.NEGATIVE_INFINITY;
} else {
return Float.POSITIVE_INFINITY;
}
} else {
return Float.NaN;
}
}
return Float.parseFloat(floatString);
}
private static Pattern specialDoubleRegex = Pattern.compile("((-)?infinityd?)|(nand?)", Pattern.CASE_INSENSITIVE);
private double parseDouble(String doubleString) {
Matcher m = specialDoubleRegex.matcher(doubleString);
if (m.matches()) {
//got an infinity
if (m.start(1) != -1) {
if (m.start(2) != -1) {
return Double.NEGATIVE_INFINITY;
} else {
return Double.POSITIVE_INFINITY;
}
} else {
return Double.NaN;
}
}
return Double.parseDouble(doubleString);
}
public String getErrorMessage(RecognitionException e, String[] tokenNames) { public String getErrorMessage(RecognitionException e, String[] tokenNames) {
if ( e instanceof SemanticException ) { if ( e instanceof SemanticException ) {
return e.getMessage(); return e.getMessage();
@ -1503,10 +1467,10 @@ byte_literal returns[byte value]
: BYTE_LITERAL { $value = LiteralTools.parseByte($BYTE_LITERAL.text); }; : BYTE_LITERAL { $value = LiteralTools.parseByte($BYTE_LITERAL.text); };
float_literal returns[float value] float_literal returns[float value]
: FLOAT_LITERAL { $value = parseFloat($FLOAT_LITERAL.text); }; : FLOAT_LITERAL { $value = LiteralTools.parseFloat($FLOAT_LITERAL.text); };
double_literal returns[double value] double_literal returns[double value]
: DOUBLE_LITERAL { $value = parseDouble($DOUBLE_LITERAL.text); }; : DOUBLE_LITERAL { $value = LiteralTools.parseDouble($DOUBLE_LITERAL.text); };
char_literal returns[char value] char_literal returns[char value]
: CHAR_LITERAL { $value = $CHAR_LITERAL.text.charAt(1); }; : CHAR_LITERAL { $value = $CHAR_LITERAL.text.charAt(1); };

View File

@ -28,6 +28,9 @@
package org.jf.smali; package org.jf.smali;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LiteralTools public class LiteralTools
{ {
public static byte parseByte(String byteLiteral) public static byte parseByte(String byteLiteral)
@ -304,6 +307,42 @@ public class LiteralTools
} }
} }
private static Pattern specialFloatRegex = Pattern.compile("((-)?infinityf)|(nanf)", Pattern.CASE_INSENSITIVE);
public static float parseFloat(String floatString) {
Matcher m = specialFloatRegex.matcher(floatString);
if (m.matches()) {
//got an infinity
if (m.start(1) != -1) {
if (m.start(2) != -1) {
return Float.NEGATIVE_INFINITY;
} else {
return Float.POSITIVE_INFINITY;
}
} else {
return Float.NaN;
}
}
return Float.parseFloat(floatString);
}
private static Pattern specialDoubleRegex = Pattern.compile("((-)?infinityd?)|(nand?)", Pattern.CASE_INSENSITIVE);
public static double parseDouble(String doubleString) {
Matcher m = specialDoubleRegex.matcher(doubleString);
if (m.matches()) {
//got an infinity
if (m.start(1) != -1) {
if (m.start(2) != -1) {
return Double.NEGATIVE_INFINITY;
} else {
return Double.POSITIVE_INFINITY;
}
} else {
return Double.NaN;
}
}
return Double.parseDouble(doubleString);
}
public static byte[] longToBytes(long value) { public static byte[] longToBytes(long value) {
byte[] bytes = new byte[8]; byte[] bytes = new byte[8];