예제 #1
0
        private static string NameFromTypeClass(CTypeClass typeClass)
        {
            switch (typeClass)
            {
            case CTypeClass.CVoid:
                return("void");

            case CTypeClass.CChar:
                return("char");

            case CTypeClass.CSChar:
                return("signed char");

            case CTypeClass.CUChar:
                return("unsigned char");

            case CTypeClass.CShortInt:
                return("short");

            case CTypeClass.CUShortInt:
                return("unsigned short");

            case CTypeClass.CInt:
                return("int");

            case CTypeClass.CUInt:
                return("unsigned int");

            case CTypeClass.CLongInt:
                return("long int");

            case CTypeClass.CULongInt:
                return("unsigned long int");

            case CTypeClass.CLongLongInt:
                return("long long int");

            case CTypeClass.CULongLongInt:
                return("unsigned long long int");

            case CTypeClass.CFloat:
                return("float");

            case CTypeClass.CDouble:
                return("double");

            case CTypeClass.CLongDouble:
                return("long double");

            case CTypeClass.CEnum:
            case CTypeClass.CArray:
            case CTypeClass.CStruct:
            case CTypeClass.CFunction:
            case CTypeClass.CPointer:
            default:
                throw new InvalidOperationException("cannopt get name from this type");
            }
        }
예제 #2
0
        /*private readonly CTypeClass m_typeClass;
         * private readonly bool m_isConst;
         * private readonly string m_typeName;
         * private readonly int m_arraySize;
         * private readonly CType m_containedType;
         * private readonly IReadOnlyList<CIdentifier> m_enumConstants;
         * private IReadOnlyList<CIdentifier> m_structMembers;
         * private bool m_structComplete = false;
         * private readonly CType m_functionReturnType;
         * private readonly IReadOnlyList<CType> m_functionArgumentTypes;*/

        //from type class
        private CType(CTypeClass typeClass)
        {
            m_typeClass             = typeClass;
            m_isConst               = false;
            m_typeName              = NameFromTypeClass(typeClass);
            m_arraySize             = 0;
            m_containedType         = null;
            m_enumConstants         = null;
            m_structMembers         = null;
            m_functionReturnType    = null;
            m_functionArgumentTypes = null;
        }
예제 #3
0
        public static CTypeGroups GetTypeGroup(CTypeClass classification)
        {
            switch (classification)
            {
            case CTypeClass.CVoid:
                return(CTypeGroups.CObject);

            case CTypeClass.CChar:
            case CTypeClass.CSChar:
            case CTypeClass.CUChar:
                return(CTypeGroups.CObject | CTypeGroups.CCharacter | CTypeGroups.CInt | CTypeGroups.CArithmetic | CTypeGroups.CScalar);

            case CTypeClass.CShortInt:
            case CTypeClass.CUShortInt:
            case CTypeClass.CInt:
            case CTypeClass.CUInt:
            case CTypeClass.CLongInt:
            case CTypeClass.CULongInt:
            case CTypeClass.CLongLongInt:
            case CTypeClass.CULongLongInt:
            case CTypeClass.CEnum:
                return(CTypeGroups.CObject | CTypeGroups.CInt | CTypeGroups.CArithmetic | CTypeGroups.CScalar);

            case CTypeClass.CFloat:
            case CTypeClass.CDouble:
            case CTypeClass.CLongDouble:
                return(CTypeGroups.CObject | CTypeGroups.CArithmetic | CTypeGroups.CScalar);

            case CTypeClass.CArray:
                return(CTypeGroups.CObject | CTypeGroups.CAggregate | CTypeGroups.CDerivedType);

            case CTypeClass.CStruct:
                return(CTypeGroups.CObject | CTypeGroups.CAggregate);

            case CTypeClass.CFunction:
                return(CTypeGroups.CDerivedType);

            case CTypeClass.CPointer:
                return(CTypeGroups.CObject | CTypeGroups.CScalar | CTypeGroups.CDerivedType);

            default:
                throw new InvalidOperationException("unrecognized type clasification");
            }
        }
예제 #4
0
        public static int TypeClassSizeInBytes(CTypeClass typeClass)
        {
            switch (typeClass)
            {
            //1 (8 bits)
            case CTypeClass.CChar:
            case CTypeClass.CSChar:
            case CTypeClass.CUChar:
                return(1);

            //2 (16 bits)
            case CTypeClass.CShortInt:
            case CTypeClass.CUShortInt:
                return(2);

            //4 (32 bits)
            case CTypeClass.CInt:
            case CTypeClass.CUInt:
            case CTypeClass.CLongInt:
            case CTypeClass.CULongInt:
            case CTypeClass.CEnum:
            case CTypeClass.CFloat:
            case CTypeClass.CPointer:
                return(4);

            //8 (64 bits)
            case CTypeClass.CLongLongInt:
            case CTypeClass.CULongLongInt:
            case CTypeClass.CDouble:
            case CTypeClass.CLongDouble:
                return(8);

            //incomplete types
            case CTypeClass.CVoid:
            case CTypeClass.CArray:
            case CTypeClass.CStruct:
            case CTypeClass.CFunction:
                return(-1);

            default:
                throw new InvalidOperationException("unrecognized type clasification");
            }
        }
예제 #5
0
 public static CType FromTypeClass(CTypeClass typeClass)
 {
     return(CTypeFromName(NameFromTypeClass(typeClass)));
 }
예제 #6
0
 private static void InitBasicType(CTypeClass typeClass)
 {
     types[NameFromTypeClass(typeClass)] = new CType(typeClass);
 }