// NumberHelper.cs
// Author: Sergey Chaban (serge@wildwestsoftware.com)
using System;
using System.Globalization;
namespace Mono.ILASM {
///
///
internal class NumberHelper : StringHelperBase {
private ILToken result;
///
///
///
public NumberHelper (ILTokenizer host) : base (host)
{
Reset ();
}
private void Reset ()
{
result = ILToken.Invalid.Clone() as ILToken;
}
///
///
///
public override bool Start (char ch)
{
bool res = (Char.IsDigit (ch) || ch == '-' || (ch == '.' && Char.IsDigit ((char) host.Reader.Peek ())));
Reset ();
return res;
}
///
///
///
public override string Build ()
{
ILReader reader = host.Reader;
reader.MarkLocation ();
string num = reader.ReadToWhitespace ();
NumberStyles nstyles = NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint;
try {
if (num.IndexOf ('.') != -1) {
double d = Double.Parse (num, nstyles, NumberFormatInfo.InvariantInfo);
result.token = Token.FLOAT64;
result.val = d;
} else {
long i = Int64.Parse (num, nstyles);
if (i < Int32.MinValue || i > Int32.MaxValue) {
result.token = Token.INT64;
result.val = i;
} else {
result.token = Token.INT32;
result.val = (int) i;
}
}
} catch {
reader.Unread (num.ToCharArray ());
reader.RestoreLocation ();
num = String.Empty;
Reset ();
throw new ILSyntaxError ("Bad number format!");
}
return num;
}
///
///
public ILToken ResultToken {
get {
return result;
}
}
}
}