]> git.sur5r.net Git - cc65/blobdiff - src/cc65/datatype.h
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / src / cc65 / datatype.h
index 4a6a95cb0be3d7a7468e244c64a2311fa93f0d05..b49694da3cc0657410d9d1402fe4bdfa8bb4ebf0 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                               datatype.h                                 */
+/*                                datatype.h                                 */
 /*                                                                           */
-/*              Type string handling for the cc65 C compiler                */
+/*               Type string handling for the cc65 C compiler                */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2008 Ullrich von Bassewitz                                       */
-/*               Roemerstrasse 52                                            */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2012, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -51,7 +51,7 @@
 
 
 /*****************************************************************************/
-/*                                          Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
 
 /* Basic data types */
 enum {
-    T_END                  = 0x000000,
+    T_END           = 0x000000,
 
     /* Basic types */
-    T_TYPE_NONE            = 0x000000,
-    T_TYPE_CHAR            = 0x000001,
+    T_TYPE_NONE     = 0x000000,
+    T_TYPE_CHAR     = 0x000001,
     T_TYPE_SHORT    = 0x000002,
-    T_TYPE_INT             = 0x000003,
-    T_TYPE_LONG            = 0x000004,
+    T_TYPE_INT      = 0x000003,
+    T_TYPE_LONG     = 0x000004,
     T_TYPE_LONGLONG = 0x000005,
-    T_TYPE_ENUM            = 0x000006,
+    T_TYPE_ENUM     = 0x000006,
     T_TYPE_FLOAT    = 0x000007,
     T_TYPE_DOUBLE   = 0x000008,
     T_TYPE_VOID     = 0x000009,
@@ -77,29 +77,29 @@ enum {
     T_TYPE_ARRAY    = 0x00000C,
     T_TYPE_PTR      = 0x00000D,
     T_TYPE_FUNC     = 0x00000E,
-    T_MASK_TYPE            = 0x00000F,
+    T_MASK_TYPE     = 0x00000F,
 
     /* Type classes */
     T_CLASS_NONE    = 0x000000,
-    T_CLASS_INT            = 0x000010,
+    T_CLASS_INT     = 0x000010,
     T_CLASS_FLOAT   = 0x000020,
-    T_CLASS_PTR            = 0x000030,
+    T_CLASS_PTR     = 0x000030,
     T_CLASS_STRUCT  = 0x000040,
     T_CLASS_FUNC    = 0x000050,
     T_MASK_CLASS    = 0x000070,
 
     /* Type signedness */
-    T_SIGN_NONE            = 0x000000,
+    T_SIGN_NONE     = 0x000000,
     T_SIGN_UNSIGNED = 0x000080,
     T_SIGN_SIGNED   = 0x000100,
     T_MASK_SIGN     = 0x000180,
 
     /* Type size modifiers */
-    T_SIZE_NONE            = 0x000000,
+    T_SIZE_NONE     = 0x000000,
     T_SIZE_SHORT    = 0x000200,
     T_SIZE_LONG     = 0x000400,
     T_SIZE_LONGLONG = 0x000600,
-    T_MASK_SIZE            = 0x000600,
+    T_MASK_SIZE     = 0x000600,
 
     /* Type qualifiers */
     T_QUAL_NONE     = 0x000000,
@@ -110,29 +110,31 @@ enum {
     T_QUAL_FAR      = 0x008000,
     T_QUAL_ADDRSIZE = T_QUAL_NEAR | T_QUAL_FAR,
     T_QUAL_FASTCALL = 0x010000,
-    T_MASK_QUAL            = 0x01F800,
+    T_QUAL_CDECL    = 0x020000,
+    T_QUAL_CCONV    = T_QUAL_FASTCALL | T_QUAL_CDECL,
+    T_MASK_QUAL     = 0x03F800,
 
     /* Types */
-    T_CHAR             = T_TYPE_CHAR     | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_NONE,
-    T_SCHAR            = T_TYPE_CHAR     | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_NONE,
-    T_UCHAR            = T_TYPE_CHAR     | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_NONE,
-    T_SHORT            = T_TYPE_SHORT    | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_SHORT,
+    T_CHAR      = T_TYPE_CHAR     | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_NONE,
+    T_SCHAR     = T_TYPE_CHAR     | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_NONE,
+    T_UCHAR     = T_TYPE_CHAR     | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_NONE,
+    T_SHORT     = T_TYPE_SHORT    | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_SHORT,
     T_USHORT    = T_TYPE_SHORT    | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_SHORT,
-    T_INT              = T_TYPE_INT      | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_NONE,
-    T_UINT             = T_TYPE_INT      | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_NONE,
-    T_LONG             = T_TYPE_LONG     | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_LONG,
-    T_ULONG            = T_TYPE_LONG     | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_LONG,
-    T_LONGLONG         = T_TYPE_LONGLONG | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_LONGLONG,
-    T_ULONGLONG        = T_TYPE_LONGLONG | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_LONGLONG,
-    T_ENUM             = T_TYPE_ENUM     | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_NONE,
-    T_FLOAT            = T_TYPE_FLOAT    | T_CLASS_FLOAT  | T_SIGN_NONE     | T_SIZE_NONE,
-    T_DOUBLE           = T_TYPE_DOUBLE   | T_CLASS_FLOAT  | T_SIGN_NONE     | T_SIZE_NONE,
-    T_VOID             = T_TYPE_VOID     | T_CLASS_NONE   | T_SIGN_NONE     | T_SIZE_NONE,
+    T_INT       = T_TYPE_INT      | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_NONE,
+    T_UINT      = T_TYPE_INT      | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_NONE,
+    T_LONG      = T_TYPE_LONG     | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_LONG,
+    T_ULONG     = T_TYPE_LONG     | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_LONG,
+    T_LONGLONG  = T_TYPE_LONGLONG | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_LONGLONG,
+    T_ULONGLONG = T_TYPE_LONGLONG | T_CLASS_INT    | T_SIGN_UNSIGNED | T_SIZE_LONGLONG,
+    T_ENUM      = T_TYPE_ENUM     | T_CLASS_INT    | T_SIGN_SIGNED   | T_SIZE_NONE,
+    T_FLOAT     = T_TYPE_FLOAT    | T_CLASS_FLOAT  | T_SIGN_NONE     | T_SIZE_NONE,
+    T_DOUBLE    = T_TYPE_DOUBLE   | T_CLASS_FLOAT  | T_SIGN_NONE     | T_SIZE_NONE,
+    T_VOID      = T_TYPE_VOID     | T_CLASS_NONE   | T_SIGN_NONE     | T_SIZE_NONE,
     T_STRUCT    = T_TYPE_STRUCT   | T_CLASS_STRUCT | T_SIGN_NONE     | T_SIZE_NONE,
     T_UNION     = T_TYPE_UNION    | T_CLASS_STRUCT | T_SIGN_NONE     | T_SIZE_NONE,
-    T_ARRAY            = T_TYPE_ARRAY    | T_CLASS_PTR    | T_SIGN_NONE     | T_SIZE_NONE,
-    T_PTR              = T_TYPE_PTR      | T_CLASS_PTR    | T_SIGN_NONE     | T_SIZE_NONE,
-    T_FUNC             = T_TYPE_FUNC     | T_CLASS_FUNC   | T_SIGN_NONE     | T_SIZE_NONE,
+    T_ARRAY     = T_TYPE_ARRAY    | T_CLASS_PTR    | T_SIGN_NONE     | T_SIZE_NONE,
+    T_PTR       = T_TYPE_PTR      | T_CLASS_PTR    | T_SIGN_NONE     | T_SIZE_NONE,
+    T_FUNC      = T_TYPE_FUNC     | T_CLASS_FUNC   | T_SIGN_NONE     | T_SIZE_NONE,
 
     /* Aliases */
     T_SIZE_T    = T_UINT,
@@ -158,21 +160,31 @@ struct Type {
 #define TYPE(T)         { (T), { 0 } }
 
 /* Maximum length of a type string */
-#define MAXTYPELEN     30
+#define MAXTYPELEN      30
 
 /* Special encodings for element counts of an array */
 #define UNSPECIFIED     -1L     /* Element count was not specified */
 #define FLEXIBLE        0L      /* Flexible array struct member */
 
 /* Sizes. Floating point sizes come from fp.h */
-#define SIZEOF_CHAR     1
-#define SIZEOF_SHORT    2
-#define SIZEOF_INT      2
-#define SIZEOF_LONG     4
-#define SIZEOF_LONGLONG 8
+#define SIZEOF_CHAR     1U
+#define SIZEOF_SHORT    2U
+#define SIZEOF_INT      2U
+#define SIZEOF_LONG     4U
+#define SIZEOF_LONGLONG 8U
 #define SIZEOF_FLOAT    (FP_F_Size())
 #define SIZEOF_DOUBLE   (FP_D_Size())
-#define SIZEOF_PTR      2
+#define SIZEOF_PTR      SIZEOF_INT
+
+/* Bit sizes */
+#define CHAR_BITS       (8 * SIZEOF_CHAR)
+#define SHORT_BITS      (8 * SIZEOF_SHORT)
+#define INT_BITS        (8 * SIZEOF_INT)
+#define LONG_BITS       (8 * SIZEOF_LONG)
+#define LONGLONG_BITS   (8 * SIZEOF_LONGLONG)
+#define FLOAT_BITS      (8 * SIZEOF_FLOAT)
+#define DOUBLE_BITS     (8 * SIZEOF_DOUBLE)
+#define PTR_BITS        (8 * SIZEOF_PTR)
 
 /* Predefined type strings */
 extern Type type_schar[];
@@ -192,7 +204,7 @@ struct SymEntry;
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
@@ -288,7 +300,7 @@ Type* Indirect (Type* T);
  * given type points to.
  */
 
-Type* ArrayToPtr (const Type* T);
+Type* ArrayToPtr (Type* T);
 /* Convert an array to a pointer to it's first element */
 
 #if defined(HAVE_INLINE)
@@ -467,7 +479,7 @@ INLINE int IsClassStruct (const Type* T)
 {
     return (GetClass (T) == T_CLASS_STRUCT);
 }
-#else                                
+#else
 #  define IsClassStruct(T)      (GetClass (T) == T_CLASS_STRUCT)
 #endif
 
@@ -581,6 +593,16 @@ INLINE int IsQualFastcall (const Type* T)
 #  define IsQualFastcall(T)     (((T)->C & T_QUAL_FASTCALL) != 0)
 #endif
 
+#if defined(HAVE_INLINE)
+INLINE int IsQualCDecl (const Type* T)
+/* Return true if the given type has a cdecl qualifier */
+{
+    return (T->C & T_QUAL_CDECL) != 0;
+}
+#else
+#  define IsQualCDecl(T)        (((T)->C & T_QUAL_CDECL) != 0)
+#endif
+
 int IsVariadicFunc (const Type* T) attribute ((const));
 /* Return true if this is a function type or pointer to function type with
  * variable parameter list
@@ -618,6 +640,12 @@ void SetElementCount (Type* T, long Count);
 Type* GetElementType (Type* T);
 /* Return the element type of the given array type. */
 
+Type* GetBaseElementType (Type* T);
+/* Return the base element type of a given type. If T is not an array, this
+ * will return. Otherwise it will return the base element type, which means
+ * the element type that is not an array.
+ */
+
 struct SymEntry* GetSymEntry (const Type* T) attribute ((const));
 /* Return a SymEntry pointer from a type */