[ros-diffs] [tkreuzer] 49544: [SPEC2PDEF] - Fix generation of asm stub file - add support for stripping the redirections - Use different error return values for debugging purpose - Misc fixes

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Wed Nov 10 12:28:31 UTC 2010


Author: tkreuzer
Date: Wed Nov 10 12:28:30 2010
New Revision: 49544

URL: http://svn.reactos.org/svn/reactos?rev=49544&view=rev
Log:
[SPEC2PDEF]
- Fix generation of asm stub file
- add support for stripping the redirections
- Use different error return values for debugging purpose
- Misc fixes

Modified:
    branches/cmake-bringup/tools/spec2pdef/spec2pdef.c

Modified: branches/cmake-bringup/tools/spec2pdef/spec2pdef.c
URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/tools/spec2pdef/spec2pdef.c?rev=49544&r1=49543&r2=49544&view=diff
==============================================================================
--- branches/cmake-bringup/tools/spec2pdef/spec2pdef.c [iso-8859-1] (original)
+++ branches/cmake-bringup/tools/spec2pdef/spec2pdef.c [iso-8859-1] Wed Nov 10 12:28:30 2010
@@ -17,6 +17,7 @@
 int (*OutputLine)(FILE *, EXPORT *);
 void (*OutputHeader)(FILE *, char *);
 int no_decoration = 0;
+int no_redirections = 0;
 
 enum
 {
@@ -98,7 +99,7 @@
 OutputHeader_stub(FILE *file, char *libname)
 {
     fprintf(file, "; File generated automatically, do not edit! \n\n"
-            ".code\n");
+            ".586\n.model flat\n.code\n");
 }
 
 int
@@ -106,19 +107,19 @@
 {
     if (pexp->nCallingConvention == CC_STDCALL)
     {
-        fprintf(fileDest, "PUBLIC _%.*s@%d\n_%.*s@%d:\n",
+        fprintf(fileDest, "PUBLIC _%.*s@%d\n_%.*s@%d: nop\n",
                 pexp->nNameLength, pexp->pcName, pexp->nStackBytes,
                 pexp->nNameLength, pexp->pcName, pexp->nStackBytes);
     }
     else if (pexp->nCallingConvention == CC_FASTCALL)
     {
-        fprintf(fileDest, "PUBLIC @%.*s@%d\n@%.*s@%d:\n",
+        fprintf(fileDest, "PUBLIC @%.*s@%d\n@%.*s@%d: nop\n",
                 pexp->nNameLength, pexp->pcName, pexp->nStackBytes,
                 pexp->nNameLength, pexp->pcName, pexp->nStackBytes);
     }
     else if (pexp->nCallingConvention == CC_CDECL)
     {
-        fprintf(fileDest, "PUBLIC _%.*s\n_%.*s:\n",
+        fprintf(fileDest, "PUBLIC _%.*s\n_%.*s: nop\n",
                 pexp->nNameLength, pexp->pcName,
                 pexp->nNameLength, pexp->pcName);
     }
@@ -159,7 +160,7 @@
         fprintf(fileDest, "@%d", exp->nStackBytes);
     }
 
-    if (exp->pcRedirection)
+    if (exp->pcRedirection && !no_redirections)
     {
         if (exp->nCallingConvention == CC_FASTCALL && !no_decoration)
         {
@@ -273,16 +274,16 @@
         if (*pc == '@') exp.nOrdinal = -1;
         else exp.nOrdinal = atol(pc);
 
-        /* Go to next token */
+        /* Go to next token (type) */
         if (!(pc = NextToken(pc)))
         {
             fprintf(stderr, "error: line %d, unexpected end of line\n", nLine);
-            return -1;
+            return -10;
         }
 
         //fprintf(stderr, "info: Token:'%.10s'\n", pc);
 
-        /* Now we should get the calling convention */
+        /* Now we should get the type */
         if (CompareToken(pc, "stdcall"))
         {
             exp.nCallingConvention = CC_STDCALL;
@@ -297,24 +298,25 @@
         {
             exp.nCallingConvention = CC_FASTCALL;
         }
-        else if (CompareToken(pc, "extern"))
+        else if (CompareToken(pc, "extern") ||
+                 CompareToken(pc, "stub"))
         {
             exp.nCallingConvention = CC_EXTERN;
         }
         else
         {
-            fprintf(stderr, "error: line %d, expected cc, got '%.*s' %d\n", 
+            fprintf(stderr, "error: line %d, expected type, got '%.*s' %d\n", 
                     nLine, TokenLength(pc), pc, *pc);
-            return -1;
+            return -11;
         }
 
         //fprintf(stderr, "info: nCallingConvention: %d\n", exp.nCallingConvention);
 
-        /* Go to next token */
+        /* Go to next token (options or name) */
         if (!(pc = NextToken(pc)))
         {
             fprintf(stderr, "fail2\n");
-            return -1;
+            return -12;
         }
 
         /* Handle options */
@@ -333,24 +335,23 @@
         exp.pcName = pc;
         exp.nNameLength = TokenLength(pc);
 
-        /* Go to next token */
-        if (!(pc = NextToken(pc)))
-        {
-            fprintf(stderr, "fail4\n");
-            return -1;
-        }
-
         /* Handle parameters */
         exp.nStackBytes = 0;
         if (exp.nCallingConvention != CC_EXTERN)
         {
             //fprintf(stderr, "info: options:'%.10s'\n", pc);
+            /* Go to next token */
+            if (!(pc = NextToken(pc)))
+            {
+                fprintf(stderr, "fail4\n");
+                return -13;
+            }
 
             /* Verify syntax */
             if (*pc++ != '(')
             {
                 fprintf(stderr, "error: line %d, expected '('\n", nLine);
-                return -1;
+                return -14;
             }
             
             exp.nStackBytes = 0;
@@ -371,7 +372,7 @@
                 if (!(pc = NextToken(pc)))
                 {
                     fprintf(stderr, "fail5\n");
-                    return -1;
+                    return -15;
                 }
             }
 
@@ -379,7 +380,7 @@
             if (*pc++ != ')')
             {
                 fprintf(stderr, "error: line %d, expected ')'\n", nLine);
-                return -1;
+                return -16;
             }
         }
 
@@ -393,7 +394,7 @@
             if (NextToken(pc))
             {
                  fprintf(stderr, "error: line %d, additional tokens after ')'\n", nLine);
-                 return -1;
+                 return -17;
             }
         }
         else
@@ -415,6 +416,7 @@
 {
     printf("syntax: spec2pdef [<options> ...] <source file> <dest file>\n"
            "Possible options:\n"
+           "  -d=<file> --dll=<file>   names the dll\n"
            "  -h --help   prints this screen\n"
            "  -s --stubs  generates an asm lib stub\n"
            "  -n --no-decoration  removes @xx decorations from def file\n");
@@ -453,19 +455,22 @@
             OutputLine = OutputLine_stub;
             OutputHeader = OutputHeader_stub;
         }
-        else if (_stricmp(argv[i], "--dll=") == 0)
-        {
-            pszDllName = argv[i] + 6;
-        }
-        else if (_stricmp(argv[i], "-d=") == 0)
-        {
-            pszDllName = argv[i] + 3;
+        else if ((_stricmp(argv[i], "--dll") == 0) ||
+                 (_stricmp(argv[i], "-d") == 0))
+        {
+            pszDllName = argv[i + 1];
+            i++;
         }
         else if ((_stricmp(argv[i], "--no-decoration") == 0) ||
                  (_stricmp(argv[i], "-n") == 0))
         {
             no_decoration = 1;
         }
+        else if ((_stricmp(argv[i], "--no-redirection") == 0) ||
+                 (_stricmp(argv[i], "-r") == 0))
+        {
+            no_redirections = 1;
+        }
         else
         {
             fprintf(stderr, "Unrecognized option: %s\n", argv[i]);
@@ -480,12 +485,17 @@
         int len;
 
         p1 = strrchr(argv[i], '\\');
-        p2 = p1 = p1 ? p1 + 1 : argv[i + 1];
+        if (!p1) p1 = strrchr(argv[i], '/');
+        p2 = p1 = p1 ? p1 + 1 : argv[i];
 
         /* walk up to '.' */
         while (*p2 != '.' && *p2 != 0) p2++;
         len = p2 - p1;
-        if (len >= sizeof(achDllName) - 5) return -1;
+        if (len >= sizeof(achDllName) - 5)
+        {
+            fprintf(stderr, "name too long: %s\n", p1);
+            return -2;
+        }
 
         strncpy(achDllName, p1, len);
         strncpy(achDllName + len, ".dll", sizeof(achDllName) - len);
@@ -497,7 +507,7 @@
     if (!file)
     {
         fprintf(stderr, "error: could not open file %s ", argv[i]);
-        return -1;
+        return -3;
     }
 
     /* Get file size */
@@ -507,7 +517,7 @@
 
     /* Allocate memory buffer */
     pszSource = malloc(nFileSize + 1);
-    if (!pszSource) return -1;
+    if (!pszSource) return -4;
 
     /* Load input file into memory */
     nFileSize = fread(pszSource, 1, nFileSize, file);
@@ -521,13 +531,15 @@
     if (!file)
     {
         fprintf(stderr, "error: could not open output file %s ", argv[i + 1]);
-        return -1;
+        return -5;
     }
 
     OutputHeader(file, pszDllName);
 
     result = ParseFile(pszSource, file);
 
+    if (OutputHeader == OutputHeader_stub) fprintf(file, "\nEND\n");
+
     fclose(file);
 
     return result;




More information about the Ros-diffs mailing list