Author: hbelusca Date: Wed Feb 4 23:56:23 2015 New Revision: 66165
URL: http://svn.reactos.org/svn/reactos?rev=66165&view=rev Log: [SPEC2DEF] - Warn about symbols that should be private. Patch by Thomas Faber. CORE-8445 #resolve #comment Committed in revision 66165. It's also nice/useful to get the warnings even if we are not generating an import lib (example when building rsaenh): MSVC warns also in this case. - Improve error messages. - some_ptr = 0; ---> use NULL instead. - remove useless extra parentheses.
Modified: trunk/reactos/tools/spec2def/spec2def.c
Modified: trunk/reactos/tools/spec2def/spec2def.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/spec2def/spec2def.c?r... ============================================================================== --- trunk/reactos/tools/spec2def/spec2def.c [iso-8859-1] (original) +++ trunk/reactos/tools/spec2def/spec2def.c [iso-8859-1] Wed Feb 4 23:56:23 2015 @@ -6,6 +6,8 @@ #ifdef _MSC_VER #define strcasecmp _stricmp #endif + +#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
typedef struct _STRING { @@ -38,11 +40,13 @@ typedef int (*PFNOUTLINE)(FILE *, EXPORT *); int gbMSComp = 0; int gbImportLib = 0; +int gbNotPrivateNoWarn = 0; int gbTracing = 0; int giArch = ARCH_X86; char *pszArchString = "i386"; char *pszArchString2; -char *pszDllName = 0; +char *pszSourceFileName = NULL; +char *pszDllName = NULL; char *gpszUnderscore = ""; int gbDebug; #define DbgPrint(...) (!gbDebug || fprintf(stderr, __VA_ARGS__)) @@ -80,13 +84,32 @@ ARG_FLOAT };
-char* astrCallingConventions[] = +const char* astrCallingConventions[] = { "STDCALL", "CDECL", "FASTCALL", "THISCALL", "EXTERN" +}; + +static const char* astrShouldBePrivate[] = +{ + "DllCanUnloadNow", + "DllGetClassObject", + "DllGetClassFactoryFromClassString", + "DllGetDocumentation", + "DllInitialize", + "DllInstall", + "DllRegisterServer", + "DllRegisterServerEx", + "DllRegisterServerExW", + "DllUnload", + "DllUnregisterServer", + "RasCustomDeleteEntryNotify", + "RasCustomDial", + "RasCustomDialDlg", + "RasCustomEntryDlg", };
static @@ -284,7 +307,7 @@ fprintf(file, "\tint retval;\n"); } fprintf(file, "\tif (TRACE_ON(relay))\n\t\tDPRINTF("%s: %.*s(", - pszDllName, pexp->strName.len, pexp->strName.buf); + pszDllName, pexp->strName.len, pexp->strName.buf); }
for (i = 0; i < pexp->nArgCount; i++) @@ -352,12 +375,12 @@ if (pexp->uFlags & FL_RET64) { fprintf(file, "\tif (TRACE_ON(relay))\n\t\tDPRINTF("%s: %.*s: retval = %%"PRIx64"\n", retval);\n", - pszDllName, pexp->strName.len, pexp->strName.buf); + pszDllName, pexp->strName.len, pexp->strName.buf); } else { fprintf(file, "\tif (TRACE_ON(relay))\n\t\tDPRINTF("%s: %.*s: retval = 0x%%lx\n", retval);\n", - pszDllName, pexp->strName.len, pexp->strName.buf); + pszDllName, pexp->strName.len, pexp->strName.buf); } fprintf(file, "\treturn retval;\n}\n\n"); } @@ -380,8 +403,7 @@ } else if (giArch == ARCH_ARM) { - fprintf(file, - " AREA |.text|,ALIGN=2,CODE,READONLY\n\n"); + fprintf(file, " AREA |.text|,ALIGN=2,CODE,READONLY\n\n"); } }
@@ -689,6 +711,7 @@ EXPORT exp; int included; char namebuffer[16]; + unsigned int i;
//fprintf(stderr, "info: line %d, pcStart:'%.30s'\n", nLine, pcStart);
@@ -703,7 +726,6 @@ exp.uFlags = 0; exp.nNumber++;
- //if (!strncmp(pcLine, "22 stdcall @(long) MPR_Alloc",28)) // gbDebug = 1;
@@ -734,7 +756,7 @@ /* Go to next token (type) */ if (!(pc = NextToken(pc))) { - fprintf(stderr, "error: line %d, unexpected end of line\n", nLine); + fprintf(stderr, "%s line %d : error: unexpected end of line\n", pszSourceFileName, nLine); return -10; }
@@ -768,8 +790,8 @@ } else { - fprintf(stderr, "error: line %d, expected callconv, got '%.*s' %d\n", - nLine, TokenLength(pc), pc, *pc); + fprintf(stderr, "%s line %d : error: expected callconv, got '%.*s' %d\n", + pszSourceFileName, nLine, TokenLength(pc), pc, *pc); return -11; }
@@ -879,14 +901,14 @@ /* Go to next token */ if (!(pc = NextToken(pc))) { - fprintf(stderr, "error: line %d, expected token\n", nLine); + fprintf(stderr, "%s line %d : error: expected token\n", pszSourceFileName, nLine); return -13; }
/* Verify syntax */ if (*pc++ != '(') { - fprintf(stderr, "error: line %d, expected '('\n", nLine); + fprintf(stderr, "%s line %d : error: expected '('\n", pszSourceFileName, nLine); return -14; }
@@ -937,7 +959,7 @@ exp.anArgs[exp.nArgCount] = ARG_FLOAT; } else - fprintf(stderr, "error: line %d, expected type, got: %.10s\n", nLine, pc); + fprintf(stderr, "%s line %d : error: expected type, got: %.10s\n", pszSourceFileName, nLine, pc);
exp.nArgCount++;
@@ -952,7 +974,7 @@ /* Check syntax */ if (*pc++ != ')') { - fprintf(stderr, "error: line %d, expected ')'\n", nLine); + fprintf(stderr, "%s line %d : error: expected ')'\n", pszSourceFileName, nLine); return -16; } } @@ -978,7 +1000,7 @@ exp.strName.len = (int)(p - pc); if (exp.strName.len < 1) { - fprintf(stderr, "error, @ in line %d\n", nLine); + fprintf(stderr, "%s line %d : error: unexpected @ found\n", pszSourceFileName, nLine); return -1; } exp.nStackBytes = atoi(p + 1); @@ -1001,7 +1023,7 @@ /* Check syntax (end of line) */ if (NextToken(pc)) { - fprintf(stderr, "error: line %d, additional tokens after ')'\n", nLine); + fprintf(stderr, "%s line %d : error: additional tokens after ')'\n", pszSourceFileName, nLine); return -17; }
@@ -1010,15 +1032,28 @@ } else { - exp.strTarget.buf = 0; + exp.strTarget.buf = NULL; exp.strTarget.len = 0; }
/* Check for no-name without ordinal */ if ((exp.uFlags & FL_ORDINAL) && (exp.nOrdinal == -1)) { - fprintf(stderr, "error: line %d, ordinal export without ordinal!\n", nLine); + fprintf(stderr, "%s line %d : error: ordinal export without ordinal!\n", pszSourceFileName, nLine); return -1; + } + + if (!gbNotPrivateNoWarn && !(exp.uFlags & FL_PRIVATE)) + { + for (i = 0; i < ARRAYSIZE(astrShouldBePrivate); i++) + { + if (strlen(astrShouldBePrivate[i]) == exp.strName.len && + strncmp(exp.strName.buf, astrShouldBePrivate[i], exp.strName.len) == 0) + { + fprintf(stderr, "%s line %d : warning: export of '%.*s' should be PRIVATE\n", + pszSourceFileName, nLine, exp.strName.len, exp.strName.buf); + } + } }
OutputLine(fileDest, &exp); @@ -1028,26 +1063,26 @@ return 0; }
- void usage(void) { printf("syntax: spec2def [<options> ...] <spec file>\n" "Possible options:\n" - " -h --help prints this screen\n" - " -l=<file> generates an asm lib stub\n" - " -d=<file> generates a def file\n" - " -s=<file> generates a stub file\n" - " --ms msvc compatibility\n" - " -n=<name> name of the dll\n" - " --implib generate a def file for an import library\n" - " -a=<arch> Set architecture to <arch>. (i386, x86_64, arm)\n" - " --with-tracing generates wine-like "+relay" trace trampolines. (necessitates -s)\n"); + " -h --help print this help screen\n" + " -l=<file> generate an asm lib stub\n" + " -d=<file> generate a def file\n" + " -s=<file> generate a stub file\n" + " --ms MSVC compatibility\n" + " -n=<name> name of the dll\n" + " --implib generate a def file for an import library\n" + " --no-private-warnings suppress warnings about symbols that should be -private\n" + " -a=<arch> set architecture to <arch> (i386, x86_64, arm)\n" + " --with-tracing generate wine-like "+relay" trace trampolines (needs -s)\n"); }
int main(int argc, char *argv[]) { size_t nFileSize; - char *pszSource, *pszDefFileName = 0, *pszStubFileName = 0, *pszLibStubName = 0; + char *pszSource, *pszDefFileName = NULL, *pszStubFileName = NULL, *pszLibStubName = NULL; char achDllName[40]; FILE *file; int result = 0, i; @@ -1083,15 +1118,19 @@ { pszDllName = argv[i] + 3; } - else if ((strcasecmp(argv[i], "--implib") == 0)) + else if (strcasecmp(argv[i], "--implib") == 0) { gbImportLib = 1; } - else if ((strcasecmp(argv[i], "--ms") == 0)) + else if (strcasecmp(argv[i], "--ms") == 0) { gbMSComp = 1; } - else if ((strcasecmp(argv[i], "--with-tracing") == 0)) + else if (strcasecmp(argv[i], "--no-private-warnings") == 0) + { + gbNotPrivateNoWarn = 1; + } + else if (strcasecmp(argv[i], "--with-tracing") == 0) { if (!pszStubFileName) { @@ -1152,11 +1191,12 @@ pszDllName = achDllName; }
- /* Open input file argv[1] */ - file = fopen(argv[i], "r"); + /* Open input file */ + pszSourceFileName = argv[i]; + file = fopen(pszSourceFileName, "r"); if (!file) { - fprintf(stderr, "error: could not open file %s ", argv[i]); + fprintf(stderr, "error: could not open file %s\n", pszSourceFileName); return -3; }
@@ -1186,7 +1226,7 @@ file = fopen(pszDefFileName, "w"); if (!file) { - fprintf(stderr, "error: could not open output file %s ", argv[i + 1]); + fprintf(stderr, "error: could not open output file %s\n", argv[i + 1]); return -5; }
@@ -1201,7 +1241,7 @@ file = fopen(pszStubFileName, "w"); if (!file) { - fprintf(stderr, "error: could not open output file %s ", argv[i + 1]); + fprintf(stderr, "error: could not open output file %s\n", argv[i + 1]); return -5; }
@@ -1216,7 +1256,7 @@ file = fopen(pszLibStubName, "w"); if (!file) { - fprintf(stderr, "error: could not open output file %s ", argv[i + 1]); + fprintf(stderr, "error: could not open output file %s\n", argv[i + 1]); return -5; }
@@ -1226,6 +1266,5 @@ fclose(file); }
- return result; }