[SPEC2DEF]
[reactos.git] / reactos / tools / spec2def / spec2def.c
index c4ec003..138f39d 100644 (file)
@@ -10,7 +10,7 @@
 typedef struct
 {
     char *pcName;
-    size_t nNameLength;
+    int nNameLength;
     char *pcRedirection;
     int nRedirectionLength;
     int nCallingConvention;
@@ -54,6 +54,7 @@ enum
     CC_STDCALL,
     CC_CDECL,
     CC_FASTCALL,
+    CC_THISCALL,
     CC_EXTERN,
     CC_STUB,
 };
@@ -65,7 +66,9 @@ enum
     ARG_STR,
     ARG_WSTR,
     ARG_DBL,
-    ARG_INT64
+    ARG_INT64,
+    ARG_INT128,
+    ARG_FLOAT
 };
 
 char* astrCallingConventions[] =
@@ -73,6 +76,7 @@ char* astrCallingConventions[] =
     "STDCALL",
     "CDECL",
     "FASTCALL",
+    "THISCALL",
     "EXTERN"
 };
 
@@ -188,7 +192,10 @@ OutputLine_stub(FILE *file, EXPORT *pexp)
             case ARG_PTR:  fprintf(file, "void*"); break;
             case ARG_STR:  fprintf(file, "char*"); break;
             case ARG_WSTR: fprintf(file, "wchar_t*"); break;
-            case ARG_DBL: case ARG_INT64 :  fprintf(file, "__int64"); break;
+            case ARG_DBL:
+            case ARG_INT64 :  fprintf(file, "__int64"); break;
+            case ARG_INT128 :  fprintf(file, "__int128"); break;
+            case ARG_FLOAT: fprintf(file, "float"); break;
         }
         fprintf(file, " a%d", i);
     }
@@ -206,6 +213,8 @@ OutputLine_stub(FILE *file, EXPORT *pexp)
             case ARG_WSTR: fprintf(file, "'%%ws'"); break;
             case ARG_DBL:  fprintf(file, "%%f"); break;
             case ARG_INT64: fprintf(file, "%%\"PRix64\""); break;
+            case ARG_INT128: fprintf(file, "%%\"PRix128\""); break;
+            case ARG_FLOAT: fprintf(file, "%%f"); break;
         }
     }
     fprintf(file, ")\\n\"");
@@ -221,6 +230,8 @@ OutputLine_stub(FILE *file, EXPORT *pexp)
             case ARG_WSTR: fprintf(file, "(wchar_t*)a%d", i); break;
             case ARG_DBL:  fprintf(file, "(double)a%d", i); break;
             case ARG_INT64: fprintf(file, "(__int64)a%d", i); break;
+            case ARG_INT128: fprintf(file, "(__int128)a%d", i); break;
+            case ARG_FLOAT: fprintf(file, "(float)a%d", i); break;
         }
     }
     fprintf(file, ");\n");
@@ -295,7 +306,7 @@ OutputHeader_def(FILE *file, char *libname)
 {
     fprintf(file,
             "; File generated automatically, do not edit!\n\n"
-            "LIBRARY %s\n\n"
+            "NAME %s\n\n"
             "EXPORTS\n",
             libname);
 }
@@ -304,7 +315,7 @@ void
 PrintName(FILE *fileDest, EXPORT *pexp, char *pszPrefix, int fRedir, int fDeco)
 {
     char *pcName = fRedir ? pexp->pcRedirection : pexp->pcName;
-    size_t nNameLength = fRedir ? pexp->nRedirectionLength : pexp->nNameLength;
+    int nNameLength = fRedir ? pexp->nRedirectionLength : pexp->nNameLength;
 
     /* Handle autoname */
     if (nNameLength == 1 && pcName[0] == '@')
@@ -338,17 +349,25 @@ OutputLine_def(FILE *fileDest, EXPORT *pexp)
     }
     else if (pexp->pcRedirection)
     {
-        int fDeco = ((giArch == ARCH_X86) && !ScanToken(pexp->pcRedirection, '.'));
+        if (gbMSComp && (pexp->pcName[0] == '?'))
+        {
+            /* ignore c++ redirection, since link doesn't like that! */
+        }
+        else
+        {
+            int fDeco;
 
-        fprintf(fileDest, "=");
-        PrintName(fileDest, pexp, "", 1, fDeco && !gbMSComp);
+            fDeco = ((giArch == ARCH_X86) && !ScanToken(pexp->pcRedirection, '.'));
+            fprintf(fileDest, "=");
+            PrintName(fileDest, pexp, "", 1, fDeco && !gbMSComp);
+        }
     }
     else if (((pexp->uFlags & FL_STUB) || (pexp->nCallingConvention == CC_STUB)) &&
              (pexp->pcName[0] == '?'))
     {
         /* C++ stubs are forwarded to C stubs */
         fprintf(fileDest, "=");
-        fprintf(fileDest, "stub_function%d(", pexp->nNumber);
+        fprintf(fileDest, "stub_function%d", pexp->nNumber);
     }
     else if ((giArch == ARCH_X86) && gbKillAt && !gbMSComp &&
              (pexp->nCallingConvention == CC_STDCALL ||
@@ -444,6 +463,10 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine)
         {
             exp.nCallingConvention = CC_FASTCALL;
         }
+        else if (CompareToken(pc, "thiscall"))
+        {
+            exp.nCallingConvention = CC_THISCALL;
+        }
         else if (CompareToken(pc, "extern"))
         {
             exp.nCallingConvention = CC_EXTERN;
@@ -582,6 +605,16 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine)
                     exp.nStackBytes += 8;
                     exp.anArgs[exp.nArgCount] = ARG_INT64;
                 }
+                else if (CompareToken(pc, "int128"))
+                {
+                    exp.nStackBytes += 16;
+                    exp.anArgs[exp.nArgCount] = ARG_INT128;
+                }
+                else if (CompareToken(pc, "float"))
+                {
+                    exp.nStackBytes += 4;
+                    exp.anArgs[exp.nArgCount] = ARG_FLOAT;
+                }
                 else
                     fprintf(stderr, "error: line %d, expected type, got: %.10s\n", nLine, pc);
 
@@ -616,10 +649,10 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine)
             {
                 /* Check for stdcall name */
                 char *p = strchr(pc, '@');
-                if (p && ((size_t)(p - pc) < exp.nNameLength))
+                if (p && (p - pc < exp.nNameLength))
                 {
                     int i;
-                    exp.nNameLength = p - pc;
+                    exp.nNameLength = (int)(p - pc);
                     if (exp.nNameLength < 1)
                     {
                         fprintf(stderr, "error, @ in line %d\n", nLine);
@@ -636,7 +669,8 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine)
         }
 
         /* Get optional redirection */
-        if ((pc = NextToken(pc)))
+        pc = NextToken(pc);
+        if (pc)
         {
             exp.pcRedirection = pc;
             exp.nRedirectionLength = TokenLength(pc);
@@ -682,7 +716,7 @@ int main(int argc, char *argv[])
     char *pszSource, *pszDefFileName = 0, *pszStubFileName = 0, *pszLibStubName = 0;
     char achDllName[40];
     FILE *file;
-    int result, i;
+    int result = 0, i;
 
     if (argc < 2)
     {
@@ -799,7 +833,11 @@ int main(int argc, char *argv[])
 
     /* Allocate memory buffer */
     pszSource = malloc(nFileSize + 1);
-    if (!pszSource) return -4;
+    if (!pszSource)
+    {
+        fclose(file);
+        return -4;
+    }
 
     /* Load input file into memory */
     nFileSize = fread(pszSource, 1, nFileSize, file);