package erjang.m.string;
import java.math.BigInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import erjang.BIF;
import erjang.EAtom;
import erjang.EDouble;
import erjang.EInteger;
import erjang.ENative;
import erjang.EObject;
import erjang.ERT;
import erjang.ESeq;
import erjang.EString;
import erjang.ETuple2;
public class Native extends ENative {
public static EAtom am_no_float = EAtom.intern("no_float");
public static EAtom am_no_integer = EAtom.intern("no_integer");
public static EAtom am_error = EAtom.intern("error");
static Pattern int_pattern = Pattern.compile("^((-|\\+)?(\\d+)).*");
static Pattern float_pattern = Pattern.compile("^((-|\\+)?\\d*\\.\\d+([eE](-|\\+)?\\d+)?).*");
@BIF
public static ETuple2 to_integer(EObject val)
{
EString v = val.testString();
if (v == null) throw ERT.badarg(val);
String s = v.stringValue();
Matcher m = int_pattern.matcher(s);
if (m.matches()) {
String ss = m.group(1);
EInteger intval = ERT.box_parse(ss);
ESeq rest;
if (ss.length() == s.length()) {
rest = ERT.NIL;
} else {
rest = new EString(s.substring(ss.length()));
}
return new ETuple2(intval, rest);
} else {
return new ETuple2(am_error, am_no_integer);
}
}
@BIF
public static ETuple2 to_float(EObject val)
{
EString v = val.testString();
if (v == null) throw ERT.badarg(val);
String s = v.stringValue();
Matcher m = float_pattern.matcher(s);
if (m.matches()) {
String ss = m.group(1);
EDouble floatval = ERT.box( Double.parseDouble(ss) );
ESeq rest;
if (ss.length() == s.length()) {
rest = ERT.NIL;
} else {
rest = new EString(s.substring(ss.length()));
}
return new ETuple2(floatval, rest);
} else {
return new ETuple2(am_error, am_no_float);
}
}
}