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);
		}
	}
	
}

Add string:to_integer/1 and string:to_float/1 BIFs
Add string:to_integer/1 and string:to_float/1 BIFs