-Type* TypeCpy (Type* Dest, const Type* Src)
+Type* TypeCopy (Type* Dest, const Type* Src)
/* Copy a type string */
{
Type* Orig = Dest;
F->TagTab = &EmptySymTab;
/* Fill the type string */
- T[0].C = T_FUNC;
+ T[0].C = T_FUNC | CodeAddrSizeQualifier ();
T[0].A.P = F;
T[1].C = T_INT;
T[2].C = T_END;
C = PrintTypeComp (F, C, T_QUAL_NEAR, "__near__");
C = PrintTypeComp (F, C, T_QUAL_FAR, "__far__");
C = PrintTypeComp (F, C, T_QUAL_FASTCALL, "__fastcall__");
+ C = PrintTypeComp (F, C, T_QUAL_CDECL, "__cdecl__");
/* Signedness. Omit the signedness specifier for long and int */
if ((C & T_MASK_TYPE) != T_TYPE_INT && (C & T_MASK_TYPE) != T_TYPE_LONG) {
if (IsQualFastcall (T)) {
fprintf (F, " __fastcall__");
}
+ if (IsQualCDecl (T)) {
+ fprintf (F, " __cdecl__");
+ }
fprintf (F, " %s (", Name);
/* Parameters */
-Type* ArrayToPtr (const Type* T)
+Type* ArrayToPtr (Type* T)
/* Convert an array to a pointer to it's first element */
{
- /* Function must only be called for an array */
- CHECK (IsTypeArray (T));
-
/* Return pointer to first element */
- return PointerTo (T + 1);
+ return PointerTo (GetElementType (T));
}
* return T.
*/
{
- if (IsTypeFunc (T) || IsTypeArray (T)) {
+ if (IsTypeFunc (T)) {
return PointerTo (T);
+ } else if (IsTypeArray (T)) {
+ return ArrayToPtr (T);
} else {
return T;
}
-TypeCode CodeAddrSizeQualifier (void)
-/* Return T_QUAL_NEAR or T_QUAL_FAR depending on the code address size */
+TypeCode AddrSizeQualifier (unsigned AddrSize)
+/* Return T_QUAL_NEAR or T_QUAL_FAR depending on the address size */
{
- if (CodeAddrSize == ADDR_SIZE_FAR) {
- return T_QUAL_FAR;
- } else {
- return T_QUAL_NEAR;
- }
-}
+ switch (AddrSize) {
+ case ADDR_SIZE_ABS:
+ return T_QUAL_NEAR;
+ case ADDR_SIZE_FAR:
+ return T_QUAL_FAR;
+
+ default:
+ Error ("Invalid address size");
+ return T_QUAL_NEAR;
-TypeCode DataAddrSizeQualifier (void)
-/* Return T_QUAL_NEAR or T_QUAL_FAR depending on the data address size */
-{
- if (DataAddrSize == ADDR_SIZE_FAR) {
- return T_QUAL_FAR;
- } else {
- return T_QUAL_NEAR;
}
}