예제 #1
0
        /// <summary>
        /// Формирует запись класса с названием, например,
        /// "125 тысяч", "15 рублей".
        /// Для 0 записывает только единицу измерения в род.мн.
        /// </summary>
        private static void DigitClassToString(uint digitBefore999, IUnit unit, MyStringBuilder sb)
        {
            uint countOfUnity = digitBefore999 % 10;
            uint countOfDecades = (digitBefore999 / 10) % 10;
            uint countOfHundreds = (digitBefore999 / 100) % 10;

            sb.Append(Hundreds[countOfHundreds]);

            if ((digitBefore999 % 100) != 0)
            {
                Decades[countOfDecades].ToDigitString(sb, countOfUnity, unit.DigitKindAndQuantity);
            }

            // Добавить название класса в нужной форме.
            sb.Append(ConformCurrencyTypeWithDigit(unit, digitBefore999));
        }
        public void MyStringBuilder_Append(string data)
        {
            var sb = new MyStringBuilder();

            sb.Append(data);
        }
예제 #3
0
        /// <summary>
        /// Получить пропись числа с согласованной единицей измерения.
        /// </summary>
        /// <returns> <paramref name="result"/> </returns>
        public static StringBuilder ConvertToString(uint uintDigit, IUnit unit, StringBuilder result)
        {
            MyStringBuilder mySb = new MyStringBuilder(result);

            if (uintDigit == 0)
            {
                mySb.Append("ноль");
                mySb.Append(unit.GenitivePlural);
            }
            else
            {
                uint div1000 = uintDigit / 1000;
                HightDigitClassesToString(div1000, 0, mySb);
                DigitClassToString(uintDigit - div1000 * 1000, unit, mySb);
            }

            return result;
        }
예제 #4
0
        /// <summary>
        /// Получить пропись числа с согласованной единицей измерения.
        /// </summary>
        /// <returns> <paramref name="result"/> </returns>
        public static StringBuilder Propis(uint число, IЕдиницаИзмерения еи, StringBuilder result)
        {
            MyStringBuilder mySb = new MyStringBuilder(result);

            if (число == 0)
            {
                mySb.Append("ноль");
                mySb.Append(еи.РодМнож);
            }
            else
            {
                uint div1000 = число / 1000;
                ПрописьСтаршихКлассов(div1000, 0, mySb);
                ПрописьКласса(число - div1000 * 1000, еи, mySb);
            }

            return result;
        }
예제 #5
0
 public void dostuff(MyStringBuilder sb)
 {
     sb.Append("000A: 2@ += ").Append(offset - lastoffset).AppendLine();
     sb.Append("0A8C: write_memory 2@ size 4 value 1@ vp 0").AppendLine();
     lastoffset = offset;
 }
예제 #6
0
            public override void ToDigitString(MyStringBuilder sb, uint countOfUnits, DigitKindAndQuantity digitKind)
            {
                sb.Append(this.decadeName);

                if (countOfUnits == 0)
                {
                    // После "двадцать", "тридцать" и т.д. не пишут "ноль" (единиц)
                }
                else
                {
                    sb.Append(UnityToString(countOfUnits, digitKind));
                }
            }
예제 #7
0
            public override void Propis(MyStringBuilder sb, uint числоЕдиниц, РодЧисло род)
            {
                sb.Append(this.названиеДесятка);

                if (числоЕдиниц == 0)
                {
                    // После "двадцать", "тридцать" и т.д. не пишут "ноль" (единиц)
                }
                else
                {
                    sb.Append(ПрописьЦифры(числоЕдиниц, род));
                }
            }
예제 #8
0
				public override void SpellOut(MyStringBuilder sb, uint numberЕдиниц, NumberForm род)
				{
					sb.Append(this.названиеДесятка);


					if (numberЕдиниц == 0)
					{
						// После "двадцать", "тридцать" и т.д. не пишут "ноль" (единиц)
					}
					else
					{
						sb.Append(SpellOutЦифры(numberЕдиниц, род));
					}
				}
예제 #9
0
 public override void ToDigitString(MyStringBuilder sb, uint countOfUnits, DigitKindAndQuantity digitKind)
 {
     sb.Append(UnityToString(countOfUnits, digitKind));
 }
예제 #10
0
				public override void SpellOut(MyStringBuilder sb, uint numberЕдиниц, NumberForm род)
				{
					sb.Append(SpellOutЦифры(numberЕдиниц, род));
				}
예제 #11
0
				public override void SpellOut(MyStringBuilder sb, uint numberЕдиниц, NumberForm род)
				{
					sb.Append(SpellOutНаДцать[numberЕдиниц]);
				}
예제 #12
0
			private static void SpellOutUnit(uint numberLT999, IMeasureUnit unit, MyStringBuilder sb)
			{
				uint numberN = numberLT999%10;

				uint number10n = (numberLT999/10)%10;

				uint number100n = (numberLT999/100)%10;


				sb.Append(Сотни[number100n]);


				if ((numberLT999%100) != 0)
				{
					Tens[number10n].SpellOut(sb, numberN, unit.NumberForm);
				}


				// Добавить название класса в нужной форме.

				sb.Append(Normalize(unit, numberLT999));
			}
예제 #13
0
			/// <summary>
			/// Получить SpellOut числа с согласованной единицей измерения.
			/// </summary>
			/// <returns> <paramref name="result"/> </returns>
			public static StringBuilder SpellOut(uint number, IMeasureUnit mu, StringBuilder result)
			{
				MyStringBuilder mySb = new MyStringBuilder(result);


				if (number == 0)
				{
					mySb.Append("ноль");

					//mySb.Append(mu.РодМнож);
				}

				else
				{
					uint div1000 = number/1000;

					SpellOutСтаршихКлассов(div1000, 0, mySb);

					SpellOutUnit(number - div1000*1000, mu, mySb);
				}


				return result;
			}
예제 #14
0
 void A.dostuff(MyStringBuilder sb)
 {
     sb.Append("0A8D: 2@ = read_memory 1@ size 4 vp 0").AppendLine();
     sb.Append("0062: 2@ -= 0@  // (int)").AppendLine();
     sb.Append("0A8C: write_memory 1@ size 4 value 2@ vp 0").AppendLine();
 }
예제 #15
0
 public override void ToDigitString(MyStringBuilder sb, uint countOfUnits, DigitKindAndQuantity digitKind)
 {
     sb.Append(UnityToString(countOfUnits, digitKind));
 }
예제 #16
0
 public override void ToDigitString(MyStringBuilder sb, uint countOfUnits, DigitKindAndQuantity digitKind)
 {
     sb.Append(stringLikeDecade[countOfUnits]);
 }
예제 #17
0
 public override void ToDigitString(MyStringBuilder sb, uint countOfUnits, DigitKindAndQuantity digitKind)
 {
     sb.Append(stringLikeDecade[countOfUnits]);
 }
 public override void Пропись(MyStringBuilder sb, uint числоЕдиниц, одЧисло род)
 {
     sb.Append(ПрописьЦифры(числоЕдиниц, род));
 }
예제 #19
0
 public override void Propis(MyStringBuilder sb, uint числоЕдиниц, РодЧисло род)
 {
     sb.Append(ПрописьНаДцать[числоЕдиниц]);
 }
 public override void Пропись(MyStringBuilder sb, uint числоЕдиниц, одЧисло род)
 {
     sb.Append(ПрописьНаДцать[числоЕдиниц]);
 }
예제 #21
0
 public override void Propis(MyStringBuilder sb, uint числоЕдиниц, РодЧисло род)
 {
     sb.Append(ПрописьЦифры(числоЕдиниц, род));
 }
예제 #22
0
 public static MyStringBuilder operator +(MyStringBuilder msb, string s)
 {
     msb.Append(s);
     return(msb);
 }
예제 #23
0
        /// <summary>
        /// Формирует запись класса с названием, например,
        /// "125 тысяч", "15 рублей".
        /// Для 0 записывает только единицу измерения в род.мн.
        /// </summary>
        private static void ПрописьКласса(uint числоДо999, IЕдиницаИзмерения класс, MyStringBuilder sb)
        {
            uint числоЕдиниц = числоДо999 % 10;
            uint числоДесятков = (числоДо999 / 10) % 10;
            uint числоСотен = (числоДо999 / 100) % 10;

            sb.Append(Сотни[числоСотен]);

            if ((числоДо999 % 100) != 0)
            {
                Десятки[числоДесятков].Propis(sb, числоЕдиниц, класс.РодЧисло);
            }

            // Добавить название класса в нужной форме.
            sb.Append(Согласовать(класс, числоДо999));
        }
예제 #24
0
        private static string cleandisasm(string[] lines)
        {
            var sb = new MyStringBuilder();

            string[] instr = new string[14];
            int      instrc;
            int      instrs             = 0;
            int      real_data_accesses = 0;
            int      real_base_accesses = 0;

            DATA.lvars.Clear();
            DATA.cache.Clear();
            SortedDictionary <int, A> stuff           = new SortedDictionary <int, A>();
            List <BASEADDRPATCH>      baseaddrpatches = new List <BASEADDRPATCH>();

            sb.Append(":ENTRY").AppendLine();
            sb.Append("hex").AppendLine();
            int _ = 0;

            if (lines[_].Trim().Replace("\r", "").Length == 0)
            {
                do
                {
                    _++;
                } while (!lines[_ - 1].StartsWith("00000000 <_main>"));
            }
            for (; _ < lines.Length; _++)
            {
                string _line = lines[_];
                try {
                    string line = _line.Trim().Replace("\r", "");
                    if (line.Length == 0)
                    {
                        continue;
                    }
                    if (line.EndsWith(":"))
                    {
                        if (comments)
                        {
                            sb.Append("// ").Append(line.Trim()).AppendLine();
                        }
                        continue;
                    }
                    instrc = 0;
                    int c = 1;
                    while (line[c - 1] != ':')
                    {
                        c++;
                    }
                    while (line[c] == ' ' || line[c] == '\t')
                    {
                        c++;
                    }
                    do
                    {
                        instr[instrc++] = new string(new char[] { line[c], line[c + 1] } );
                        c += 3;
                    } while (line[c] != ' ' && line [c] != '\t');
                    while (line[c] == ' ' || line[c] == '\t')
                    {
                        c++;
                    }
                    string comment = line.Substring(c);

                    // >>>>>>> nextline
                    // try to include next line if necessary
                    // for example:
                    //   test   DWORD PTR [esp+0x11223344],0x44332211
                    // results in:
                    // 0:  f7 84 24 44 33 22 11    test   DWORD PTR [esp+0x11223344],0x44332211
                    // 7:  11 22 33 44

tryparsenextline:
                    if (_ + 1 >= lines.Length)
                    {
                        goto skipnextline;
                    }

                    string nextline = lines[_ + 1].Replace("\r", "").Trim();
                    nextline = new Regex("^[0-9a-fA-F]+:\\s+").Replace(nextline, "");
                    string[] opcodes = nextline.Split(' ');
                    foreach (string oc in opcodes)
                    {
                        if (oc.Length != 2)
                        {
                            goto skipnextline;
                        }
                        try {
                            int.Parse(oc, NumberStyles.HexNumber);
                        } catch (Exception) {
                            goto skipnextline;
                        }
                    }

                    foreach (string oc in opcodes)
                    {
                        instr[instrc++] = new string(new char[] { oc[0], oc[1] } );
                    }

                    _++;
                    goto tryparsenextline;

skipnextline:
                    // <<<<<<< nextline

                    int si = 0;
                    if (instrc == 5 &&
                        (comment.StartsWith("call") || comment.StartsWith("jmp") || comment.StartsWith("je ") || comment.StartsWith("jne ")) &&
                        instraddr(instr) > 0x40000)
                    {
                        si = 1;
                        sb.Append(instr[0]).AppendLine();
                        instrs++;
                        stuff.Add(instrs, new JMPCALL());
                        int idx = comment.IndexOf(' ') + 1;
                        comment = comment.Substring(0, idx) + "0x" + realaddr(instr);
                        if (correctoffsets)
                        {
                            patchinstr(instr, 2 * instrs + 4);
                        }
                        else
                        {
                            patchinstr(instr, instrs);
                        }
                    }
                    for (int i = 1; i <= instrc - 4; i++)
                    {
                        int       type      = 0;
                        const int TYPE_DATA = 1;
                        const int TYPE_BASE = 2;
                        if (instr[i] == "ee" && instr[i + 1] == "ff" && instr[i + 3] == "ee")
                        {
                            type = TYPE_DATA;
                        }
                        else if (instr[i] == "ff" && instr[i + 1] == "ee" && instr[i + 2] == "ef" && instr[i + 3] == "ee")
                        {
                            type = TYPE_BASE;
                        }
                        else
                        {
                            continue;
                        }
                        for (; si < i; si++)
                        {
                            sb.Append(instr[si]).Append(' ');
                            instrs++;
                        }
                        switch (type)
                        {
                        case TYPE_DATA:
                            //stuff.Add(instrs, new DATA(instr[i + 2], (int.Parse(instr[i + 1], NumberStyles.HexNumber) << 8) | int.Parse(instr[i], NumberStyles.HexNumber)));
                            stuff.Add(instrs, new DATA(instr[i + 2], 0));
                            sb.AppendLine();
                            sb.Append("00 00 00 00 // DATA").Append(instr[i + 2]);
                            real_data_accesses++;
                            break;

                        case TYPE_BASE:
                            baseaddrpatches.Add(new BASEADDRPATCH(instrs));
                            sb.AppendLine();
                            sb.Append("00 00 00 00 // __BASEADDR");
                            real_base_accesses++;
                            break;
                        }
                        instrs += 4;
                        i      += 3;
                        si     += 4;
                        if (si < instrc)
                        {
                            sb.AppendLine();
                        }
                    }
                    for (; si < instrc; si++)
                    {
                        sb.Append(instr[si]).Append(' ');
                        instrs++;
                    }
                    sb.AppendLine();
                    if (comments)
                    {
                        sb.Append("// ").Append(comment.Trim()).AppendLine();
                    }
                } catch (Exception er) {
                    string result = er.ToString() + "\r\n" + _line;
                    MessageBox.Show(result);
                    return(result);
                }
            }
            sb.Append("end").AppendLine();
            var sb2 = new MyStringBuilder();

            sb2.Append("// this file is generated by asmtool").AppendLine();
            sb2.Append("// https://github.com/yugecin/scmcleoscripts/tree/master/tools/asm").AppendLine();
            sb2.AppendLine();
            sb2.Append(":HOOKER").AppendLine();
            sb2.Append("0AC6: 0@ = label @ENTRY offset").AppendLine();
            sb2.AppendLine();
            sb2.Append("0085: 1@ = 0@ // (int)").AppendLine();
            string[] hookadrs = new string[] {
                "",
                hookaddr.Substring(6, 2),
                hookaddr.Substring(4, 2),
                hookaddr.Substring(2, 2),
                hookaddr.Substring(0, 2),
            };
            sb2.Append("000E: 1@ -= 0x").Append(realaddr(hookadrs)).AppendLine();
            sb2.Append("0A8C: write_memory 0x").Append(i2hs(int.Parse(hookaddr, NumberStyles.HexNumber) - 1)).Append(" size 1 value 0xE9 vp 0").AppendLine();
            sb2.Append("0A8C: write_memory 0x").Append(hookaddr).Append(" size 4 value 1@ vp 0").AppendLine();
            sb2.AppendLine();
            sb2.Append("0AC6: 1@ = label @ENTRY offset").AppendLine();
            sb2.AppendLine();
            if (baseaddrpatches.Count > 0)
            {
                sb2.Append("0085: 2@ = 1@").AppendLine();
                foreach (BASEADDRPATCH p in baseaddrpatches)
                {
                    p.dostuff(sb2);
                }
                sb2.AppendLine();
            }
            int offset = 0;

            foreach (KeyValuePair <int, A> s in stuff)
            {
                int diff = s.Key - offset;
                sb2.Append("000A: 1@ += ").Append(diff).AppendLine();
                offset += diff;
                s.Value.dostuff(sb2);
            }
            sb2.AppendLine();
            sb2.Append("0002: jump @NOMOREHOOKER").AppendLine().AppendLine();
            sb.Insert(0, sb2.ToString());

            check(check_data_accesses, real_data_accesses, "data accesses");
            check(check_base_accesses, real_base_accesses, "base addr accesses");

            return(sb.ToString());
        }