Beispiel #1
0
        static OptionsInstructionInfo ReadTestCase(string line, int lineNo)
        {
            var parts = line.Split(seps);

            if (parts.Length != 4)
            {
                throw new InvalidOperationException($"Invalid number of commas ({parts.Length - 1} commas)");
            }

            int bitness  = NumberConverter.ToInt32(parts[0].Trim());
            var hexBytes = parts[1].Trim();

            HexUtils.ToByteArray(hexBytes);
            var code       = ToCode(parts[2].Trim());
            var properties = new List <(OptionsProps property, object value)>();

            foreach (var part in parts[3].Split(optsseps, StringSplitOptions.RemoveEmptyEntries))
            {
                var kv = part.Split(kvseps, 2);
                if (kv.Length != 2)
                {
                    throw new InvalidOperationException($"Expected key=value: '{part}'");
                }
                var    valueStr = kv[1].Trim();
                var    prop     = ToEnumConverter.GetOptionsProps(kv[0].Trim());
                object value;
                switch (prop)
                {
                case OptionsProps.AddLeadingZeroToHexNumbers:
                case OptionsProps.AlwaysShowScale:
                case OptionsProps.AlwaysShowSegmentRegister:
                case OptionsProps.BranchLeadingZeroes:
                case OptionsProps.DisplacementLeadingZeroes:
                case OptionsProps.GasNakedRegisters:
                case OptionsProps.GasShowMnemonicSizeSuffix:
                case OptionsProps.GasSpaceAfterMemoryOperandComma:
                case OptionsProps.LeadingZeroes:
                case OptionsProps.MasmAddDsPrefix32:
                case OptionsProps.NasmShowSignExtendedImmediateSize:
                case OptionsProps.PreferST0:
                case OptionsProps.RipRelativeAddresses:
                case OptionsProps.ScaleBeforeIndex:
                case OptionsProps.ShowBranchSize:
                case OptionsProps.ShowZeroDisplacements:
                case OptionsProps.SignedImmediateOperands:
                case OptionsProps.SignedMemoryDisplacements:
                case OptionsProps.SmallHexNumbersInDecimal:
                case OptionsProps.SpaceAfterMemoryBracket:
                case OptionsProps.SpaceAfterOperandSeparator:
                case OptionsProps.SpaceBetweenMemoryAddOperators:
                case OptionsProps.SpaceBetweenMemoryMulOperators:
                case OptionsProps.UppercaseAll:
                case OptionsProps.UppercaseDecorators:
                case OptionsProps.UppercaseHex:
                case OptionsProps.UppercaseKeywords:
                case OptionsProps.UppercaseMnemonics:
                case OptionsProps.UppercasePrefixes:
                case OptionsProps.UppercaseRegisters:
                case OptionsProps.UsePseudoOps:
                    value = NumberConverter.ToBoolean(valueStr);
                    break;

                case OptionsProps.BinaryDigitGroupSize:
                case OptionsProps.DecimalDigitGroupSize:
                case OptionsProps.FirstOperandCharIndex:
                case OptionsProps.HexDigitGroupSize:
                case OptionsProps.OctalDigitGroupSize:
                case OptionsProps.TabSize:
                    value = NumberConverter.ToInt32(valueStr);
                    break;

                case OptionsProps.IP:
                    value = NumberConverter.ToUInt64(valueStr);
                    break;

                case OptionsProps.BinaryPrefix:
                case OptionsProps.BinarySuffix:
                case OptionsProps.DecimalPrefix:
                case OptionsProps.DecimalSuffix:
                case OptionsProps.DigitSeparator:
                case OptionsProps.HexPrefix:
                case OptionsProps.HexSuffix:
                case OptionsProps.OctalPrefix:
                case OptionsProps.OctalSuffix:
                    value = valueStr == "<null>" ? null : valueStr;
                    break;

                case OptionsProps.MemorySizeOptions:
                    value = ToEnumConverter.GetMemorySizeOptions(valueStr);
                    break;

                case OptionsProps.NumberBase:
                    value = ToEnumConverter.GetNumberBase(valueStr);
                    break;

                default:
                    throw new InvalidOperationException();
                }
                properties.Add((prop, value));
            }

            return(new OptionsInstructionInfo(bitness, hexBytes, code, properties));
        }
Beispiel #2
0
        public static (OptionsProps property, object value) ParseOption(string keyValue)
        {
            var kv = keyValue.Split(kvseps, 2);

            if (kv.Length != 2)
            {
                throw new InvalidOperationException($"Expected key=value: '{keyValue}'");
            }
            var    valueStr = kv[1].Trim();
            var    prop     = ToEnumConverter.GetOptionsProps(kv[0].Trim());
            object value;

            switch (prop)
            {
            case OptionsProps.AddLeadingZeroToHexNumbers:
            case OptionsProps.AlwaysShowScale:
            case OptionsProps.AlwaysShowSegmentRegister:
            case OptionsProps.BranchLeadingZeroes:
            case OptionsProps.DisplacementLeadingZeroes:
            case OptionsProps.GasNakedRegisters:
            case OptionsProps.GasShowMnemonicSizeSuffix:
            case OptionsProps.GasSpaceAfterMemoryOperandComma:
            case OptionsProps.LeadingZeroes:
            case OptionsProps.MasmAddDsPrefix32:
            case OptionsProps.NasmShowSignExtendedImmediateSize:
            case OptionsProps.PreferST0:
            case OptionsProps.RipRelativeAddresses:
            case OptionsProps.ScaleBeforeIndex:
            case OptionsProps.ShowBranchSize:
            case OptionsProps.ShowSymbolAddress:
            case OptionsProps.ShowZeroDisplacements:
            case OptionsProps.SignedImmediateOperands:
            case OptionsProps.SignedMemoryDisplacements:
            case OptionsProps.SmallHexNumbersInDecimal:
            case OptionsProps.SpaceAfterMemoryBracket:
            case OptionsProps.SpaceAfterOperandSeparator:
            case OptionsProps.SpaceBetweenMemoryAddOperators:
            case OptionsProps.SpaceBetweenMemoryMulOperators:
            case OptionsProps.UppercaseAll:
            case OptionsProps.UppercaseDecorators:
            case OptionsProps.UppercaseHex:
            case OptionsProps.UppercaseKeywords:
            case OptionsProps.UppercaseMnemonics:
            case OptionsProps.UppercasePrefixes:
            case OptionsProps.UppercaseRegisters:
            case OptionsProps.UsePseudoOps:
            case OptionsProps.ShowUselessPrefixes:
                value = NumberConverter.ToBoolean(valueStr);
                break;

            case OptionsProps.BinaryDigitGroupSize:
            case OptionsProps.DecimalDigitGroupSize:
            case OptionsProps.FirstOperandCharIndex:
            case OptionsProps.HexDigitGroupSize:
            case OptionsProps.OctalDigitGroupSize:
            case OptionsProps.TabSize:
                value = NumberConverter.ToInt32(valueStr);
                break;

            case OptionsProps.IP:
                value = NumberConverter.ToUInt64(valueStr);
                break;

            case OptionsProps.BinaryPrefix:
            case OptionsProps.BinarySuffix:
            case OptionsProps.DecimalPrefix:
            case OptionsProps.DecimalSuffix:
            case OptionsProps.DigitSeparator:
            case OptionsProps.HexPrefix:
            case OptionsProps.HexSuffix:
            case OptionsProps.OctalPrefix:
            case OptionsProps.OctalSuffix:
                value = valueStr == "<null>" ? null : valueStr;
                break;

            case OptionsProps.MemorySizeOptions:
                value = ToEnumConverter.GetMemorySizeOptions(valueStr);
                break;

            case OptionsProps.NumberBase:
                value = ToEnumConverter.GetNumberBase(valueStr);
                break;

            case OptionsProps.CC_b:
                value = ToEnumConverter.GetCC_b(valueStr);
                break;

            case OptionsProps.CC_ae:
                value = ToEnumConverter.GetCC_ae(valueStr);
                break;

            case OptionsProps.CC_e:
                value = ToEnumConverter.GetCC_e(valueStr);
                break;

            case OptionsProps.CC_ne:
                value = ToEnumConverter.GetCC_ne(valueStr);
                break;

            case OptionsProps.CC_be:
                value = ToEnumConverter.GetCC_be(valueStr);
                break;

            case OptionsProps.CC_a:
                value = ToEnumConverter.GetCC_a(valueStr);
                break;

            case OptionsProps.CC_p:
                value = ToEnumConverter.GetCC_p(valueStr);
                break;

            case OptionsProps.CC_np:
                value = ToEnumConverter.GetCC_np(valueStr);
                break;

            case OptionsProps.CC_l:
                value = ToEnumConverter.GetCC_l(valueStr);
                break;

            case OptionsProps.CC_ge:
                value = ToEnumConverter.GetCC_ge(valueStr);
                break;

            case OptionsProps.CC_le:
                value = ToEnumConverter.GetCC_le(valueStr);
                break;

            case OptionsProps.CC_g:
                value = ToEnumConverter.GetCC_g(valueStr);
                break;

            case OptionsProps.DecoderOptions:
                value = ToEnumConverter.GetDecoderOptions(valueStr);
                break;

            default:
                throw new InvalidOperationException();
            }
            return(prop, value);
        }