Exemplo n.º 1
0
        protected virtual PrintfSize CollectSize()
        {
            PrintfSize size = PrintfSize.Default;

            if (i < format.Length - 1)
            {
                switch (format[i])
                {
                case 'h':
                    ++i;
                    size = PrintfSize.Half;
                    if (i < format.Length - 1 && format[i] == 'h')
                    {
                        ++i;
                        size = PrintfSize.HalfHalf;
                    }
                    break;

                case 'l':
                    ++i;
                    size = PrintfSize.Long;
                    if (i < format.Length - 1 && format[i] == 'l')
                    {
                        ++i;
                        size = PrintfSize.LongLong;
                    }
                    break;

                default:
                    return(PrintfSize.Default);
                }
            }
            return(size);
        }
Exemplo n.º 2
0
 protected override DataType MakeDataType(PrintfSize size, char cDomain)
 {
     if (cDomain == 'S')
     {
         return program.TypeFactory.CreatePointer(PrimitiveType.WChar, base.pointerSize);
     }
     return base.MakeDataType(size, cDomain);
 }
Exemplo n.º 3
0
 protected override DataType MakeDataType(PrintfSize size, char cDomain)
 {
     if (cDomain == 'S')
     {
         return(program.TypeFactory.CreatePointer(PrimitiveType.WChar, base.pointerSize));
     }
     return(base.MakeDataType(size, cDomain));
 }
Exemplo n.º 4
0
 protected override DataType MakeDataType(PrintfSize size, char cDomain)
 {
     switch (cDomain)
     {
     case 'c': return PrimitiveType.WChar;
     case 'C': return PrimitiveType.Char;
     case 's': return program.TypeFactory.CreatePointer(PrimitiveType.WChar, base.pointerSize);
     case 'S': return program.TypeFactory.CreatePointer(PrimitiveType.Char, base.pointerSize);
     }
     return base.MakeDataType(size, cDomain);
 }
Exemplo n.º 5
0
        protected override DataType MakeDataType(PrintfSize size, char cDomain)
        {
            switch (cDomain)
            {
            case 'c': return(PrimitiveType.WChar);

            case 'C': return(PrimitiveType.Char);

            case 's': return(program.TypeFactory.CreatePointer(PrimitiveType.WChar, base.pointerSize));

            case 'S': return(program.TypeFactory.CreatePointer(PrimitiveType.Char, base.pointerSize));
            }
            return(base.MakeDataType(size, cDomain));
        }
Exemplo n.º 6
0
        private PrintfSize CollectSize()
        {
            PrintfSize size = PrintfSize.Default;

            if (i < format.Length - 1)
            {
                switch (format[i])
                {
                case 'h':
                    ++i;
                    size = PrintfSize.Half;
                    if (i < format.Length - 1 && format[i] == 'h')
                    {
                        ++i;
                        size = PrintfSize.HalfHalf;
                    }
                    break;

                case 'l':
                    ++i;
                    size = PrintfSize.Long;
                    if (i < format.Length - 1 && format[i] == 'l')
                    {
                        ++i;
                        size = PrintfSize.LongLong;
                    }
                    break;

                case 'I':
                    if (i < format.Length - 3)
                    {
                        if (format[i + 1] == '3' && format[i + 2] == '2')
                        {
                            i += 3;
                            return(PrintfSize.I32);
                        }
                        if (format[i + 1] == '6' && format[i + 2] == '4')
                        {
                            i += 3;
                            return(PrintfSize.I64);
                        }
                    }
                    break;

                default:
                    return(PrintfSize.Default);
                }
            }
            return(size);
        }
Exemplo n.º 7
0
        protected virtual DataType MakeDataType(PrintfSize size, char cDomain)
        {
            Domain domain   = Domain.None;
            int    byteSize = this.wordSize;

            switch (cDomain)
            {
            case 'c':
                switch (size)
                {
                case PrintfSize.Long:
                    return(PrimitiveType.WChar);

                default:
                    return(PrimitiveType.Char);
                }

            case 'o':
            case 'u':
            case 'x':
            case 'X':
                switch (size)
                {
                case PrintfSize.HalfHalf: byteSize = 1; break;

                case PrintfSize.Half: byteSize = 2; break;

                case PrintfSize.Long: byteSize = this.longSize; break;

                case PrintfSize.LongLong: byteSize = 8; break;

                case PrintfSize.I32: byteSize = 4; break;

                case PrintfSize.I64: byteSize = 8; break;
                }
                domain = Domain.UnsignedInt;
                break;

            case 'd':
            case 'i':
                switch (size)
                {
                case PrintfSize.HalfHalf: byteSize = 1; break;

                case PrintfSize.Half: byteSize = 2; break;

                case PrintfSize.Long: byteSize = this.longSize; break;

                case PrintfSize.LongLong: byteSize = 8; break;

                case PrintfSize.I32: byteSize = 4; break;

                case PrintfSize.I64: byteSize = 8; break;
                }
                domain = Domain.SignedInt;
                break;

            case 'a':
            case 'A':
            case 'e':
            case 'E':
            case 'f':
            case 'F':
            case 'g':
            case 'G':
                byteSize = this.doubleSize;
                domain   = Domain.Real;
                break;

            case 'p':
                byteSize = this.pointerSize;
                domain   = Domain.Pointer;
                break;

            case 's':
                return(program.TypeFactory.CreatePointer(
                           size == PrintfSize.Long ? PrimitiveType.WChar : PrimitiveType.Char,
                           this.pointerSize));

            default:
                var el = this.services.RequireService <DecompilerEventListener>();
                el.Warn(
                    el.CreateAddressNavigator(program, addr),
                    "The format specifier '%{0}' passed to *printf is not known.", cDomain);
                return(new UnknownType());
            }
            return(PrimitiveType.Create(domain, byteSize));
        }
Exemplo n.º 8
0
 private DataType MakeDataType(PrintfSize size, char cDomain)
 {
     Domain domain = Domain.None;
     int byteSize = this.wordSize;
     switch (cDomain)
     {
     case 'c':
         if (wideChars)
             return PrimitiveType.WChar;
         else
             return PrimitiveType.Char;
     case 'C':
         if (wideChars)
             return PrimitiveType.Char;
         else
             return PrimitiveType.WChar;
     case 'o':
     case 'u':
     case 'x':
     case 'X':
         switch (size)
         {
         case PrintfSize.HalfHalf: byteSize = 1; break;
         case PrintfSize.Half: byteSize = 2; break;
         case PrintfSize.Long: byteSize = this.longSize; break;
         case PrintfSize.LongLong: byteSize = 8; break;
         case PrintfSize.I32: byteSize = 4; break;
         case PrintfSize.I64: byteSize = 8; break;
         }
         domain = Domain.UnsignedInt;
         break;
     case 'd':
     case 'i':
         switch (size)
         {
         case PrintfSize.HalfHalf: byteSize = 1; break;
         case PrintfSize.Half: byteSize = 2; break;
         case PrintfSize.Long: byteSize = this.longSize; break;
         case PrintfSize.LongLong: byteSize = 8; break;
         case PrintfSize.I32: byteSize = 4; break;
         case PrintfSize.I64: byteSize = 8; break;
         }
         domain = Domain.SignedInt;
         break;
     case 'a':
     case 'A':
     case 'e':
     case 'E':
     case 'f':
     case 'F':
     case 'g':
     case 'G':
         domain = Domain.Real;
         break;
     case 'p':
         byteSize = this.pointerSize;
         domain = Domain.Pointer;
         break;
     }
     return PrimitiveType.Create(domain, byteSize);
 }
Exemplo n.º 9
0
 protected virtual DataType MakeDataType(PrintfSize size, char cDomain)
 {
     Domain domain = Domain.None;
     int byteSize = this.wordSize;
     switch (cDomain)
     {
     case 'c':
         switch (size)
         {
         case PrintfSize.Long:
             return PrimitiveType.WChar;
         default:
             return PrimitiveType.Char;
         }
     case 'o':
     case 'u':
     case 'x':
     case 'X':
         switch (size)
         {
         case PrintfSize.HalfHalf: byteSize = 1; break;
         case PrintfSize.Half: byteSize = 2; break;
         case PrintfSize.Long: byteSize = this.longSize; break;
         case PrintfSize.LongLong: byteSize = 8; break;
         case PrintfSize.I32: byteSize = 4; break;
         case PrintfSize.I64: byteSize = 8; break;
         }
         domain = Domain.UnsignedInt;
         break;
     case 'd':
     case 'i':
         switch (size)
         {
         case PrintfSize.HalfHalf: byteSize = 1; break;
         case PrintfSize.Half: byteSize = 2; break;
         case PrintfSize.Long: byteSize = this.longSize; break;
         case PrintfSize.LongLong: byteSize = 8; break;
         case PrintfSize.I32: byteSize = 4; break;
         case PrintfSize.I64: byteSize = 8; break;
         }
         domain = Domain.SignedInt;
         break;
     case 'a':
     case 'A':
     case 'e':
     case 'E':
     case 'f':
     case 'F':
     case 'g':
     case 'G':
         byteSize = this.doubleSize;
         domain = Domain.Real;
         break;
     case 'p':
         byteSize = this.pointerSize;
         domain = Domain.Pointer;
         break;
     case 's':
         return program.TypeFactory.CreatePointer(
             size == PrintfSize.Long ? PrimitiveType.WChar : PrimitiveType.Char,
             this.pointerSize);
     default:
         var el = this.services.RequireService<DecompilerEventListener>();
         el.Warn(
             el.CreateAddressNavigator(program, addr),
             "The format specifier '%{0}' passed to *printf is not known.", cDomain);
         return new UnknownType();
     }
     return PrimitiveType.Create(domain, byteSize);
 }
Exemplo n.º 10
0
        private DataType MakeDataType(PrintfSize size, char cDomain)
        {
            Domain domain   = Domain.None;
            int    byteSize = this.wordSize;

            switch (cDomain)
            {
            case 'c':
                if (wideChars)
                {
                    return(PrimitiveType.WChar);
                }
                else
                {
                    return(PrimitiveType.Char);
                }

            case 'C':
                if (wideChars)
                {
                    return(PrimitiveType.Char);
                }
                else
                {
                    return(PrimitiveType.WChar);
                }

            case 'o':
            case 'u':
            case 'x':
            case 'X':
                switch (size)
                {
                case PrintfSize.HalfHalf: byteSize = 1; break;

                case PrintfSize.Half: byteSize = 2; break;

                case PrintfSize.Long: byteSize = this.longSize; break;

                case PrintfSize.LongLong: byteSize = 8; break;

                case PrintfSize.I32: byteSize = 4; break;

                case PrintfSize.I64: byteSize = 8; break;
                }
                domain = Domain.UnsignedInt;
                break;

            case 'd':
            case 'i':
                switch (size)
                {
                case PrintfSize.HalfHalf: byteSize = 1; break;

                case PrintfSize.Half: byteSize = 2; break;

                case PrintfSize.Long: byteSize = this.longSize; break;

                case PrintfSize.LongLong: byteSize = 8; break;

                case PrintfSize.I32: byteSize = 4; break;

                case PrintfSize.I64: byteSize = 8; break;
                }
                domain = Domain.SignedInt;
                break;

            case 'a':
            case 'A':
            case 'e':
            case 'E':
            case 'f':
            case 'F':
            case 'g':
            case 'G':
                domain = Domain.Real;
                break;

            case 'p':
                byteSize = this.pointerSize;
                domain   = Domain.Pointer;
                break;
            }
            return(PrimitiveType.Create(domain, byteSize));
        }