/// <summary>
/// Parses unsigned constant values. Parses hex, oct, bin and exponent values as well.
/// </summary>
/// <param name="val">The string value to convert from. It can be hex, oct, bin, or nnnExx</param>
/// <param name="maxBitSize"></param>
/// <param name="paramNo">The parameter place for logging errors. </param>
/// <param name="log"></param>
/// <returns></returns>
internal static uint parseUnSignedNumber(string val, int maxBitSize, int paramNo, Log log)
{
Match m = Regex.Match(val, RegexRecognizers.UnSignedNumber);
if (!m.Groups[2].Success)
{
log.Error("param {0}: unable to recognize constant '{1}'", paramNo, val);
return 0;
}
char opType = m.Groups[1].Value[0];
string opVal = m.Groups[2].Value;
if (opVal == "")
log.Error("param {0}: compiler error 4360 '{1}'", paramNo, val);
uint num;
if (opType > '0' && opType <= '9')
num = UInt32.Parse(opVal, NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent);
else // if (opType == 'x' || opType == 'o' || opType == 'b')
num = Convert.ToUInt32(opVal, (opType == 'x') ? 16 : (opType == 'o') ? 8 : 2);
if (num > ((1 << maxBitSize) - 1))
{
log.Error("param {0}: The value '{1}' will not fit in {2} bits", paramNo, val, maxBitSize);
num &= (uint)((1 << maxBitSize) - 1);
}
return num;
}