8#define strcasecmp(_String1, _String2) _stricmp(_String1, _String2)
9#define strncasecmp(_String1, _String2, _MaxCount) _strnicmp(_String1, _String2, _MaxCount)
12#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
78#define DbgPrint(...) (!gbDebug || fprintf(stderr, __VA_ARGS__))
132 "DllGetClassFactoryFromClassString",
133 "DllGetDocumentation",
137 "DllRegisterServerEx",
138 "DllRegisterServerExW",
140 "DllUnregisterServer",
141 "RasCustomDeleteEntryNotify",
151 return ((chr <=
',' && chr !=
'$' && chr !=
'#') ||
152 (chr >=
':' && chr <
'?') );
160 if (*
token != *comparand)
return 0;
185 if (pc[0] ==
'\n' && pc[1] ==
'\r')
return pc + 2;
186 else if (pc[0] ==
'\n')
return pc + 1;
209 while (*pc ==
' ' || *pc ==
'\t') pc++;
212 if (*pc ==
'\n' || *pc ==
'\r' || *pc == 0)
return 0;
215 if (*pc ==
'#' || *pc ==
';')
return 0;
223 fprintf(
file,
"/* This file is autogenerated, do not edit. */\n\n"
224 "#include <stubs.h>\n");
230 fprintf(
file,
"WINE_DECLARE_DEBUG_CHANNEL(relay);\n");
241 int bInPrototype = 0;
250 fprintf(
file,
"#pragma comment(linker,\"/export:%s%.*s=%.*s,DATA\")\n\n",
304 if (!bRelay || bInPrototype)
332 }
while (bInPrototype--);
336 fprintf(
file,
")\n{\n\tDbgPrint(\"WARNING: calling stub %.*s(",
354 fprintf(
file,
"\tif (TRACE_ON(relay))\n\t\tDPRINTF(\"%s: %.*s(",
421 fprintf(
file,
"\tif (TRACE_ON(relay))\n\t\tDPRINTF(\"%s: %.*s: retval = 0x%%\"PRIx64\"\\n\", retval);\n",
426 fprintf(
file,
"\tif (TRACE_ON(relay))\n\t\tDPRINTF(\"%s: %.*s: retval = 0x%%lx\\n\", retval);\n",
438 fprintf(
file,
"; File generated automatically, do not edit!\n\n");
450 fprintf(
file,
" AREA |.text|,ALIGN=2,CODE,READONLY\n\n");
460 "\tEXPORT |%s| [FUNC]\n|%s|\n",
467 "PUBLIC %s\n%s: nop\n",
476 char szNameBuffer[128];
481 sprintf(szNameBuffer,
"%s_stub_ordinal%d",
492 sprintf(szNameBuffer,
"_stub_%.*s",
498 sprintf(szNameBuffer,
"_stub_%.*s",
504 sprintf(szNameBuffer,
"__stub_%.*s@%d",
509 sprintf(szNameBuffer,
"@_stub_%.*s@%d",
517 sprintf(szNameBuffer,
"__stub_%.*s",
535 "; File generated automatically, do not edit!\n\n"
544 const char *pcName = pstr->
buf;
545 int nNameLength = pstr->
len;
546 const char* pcDot, *pcAt;
549 if ((nNameLength == 1) && (pcName[0] ==
'@'))
553 nNameLength =
strlen(namebuffer);
561 if (pcAt && (pcAt < (pcName + nNameLength)) && (pcName[0] ==
'_'))
565 nNameLength = (
int)(pcAt - pcName);
569 fprintf(fileDest,
"%.*s", nNameLength, pcName);
576 int is_cpp = pcName[0] ==
'?';
583 nNameLength = (
int)(pcDot - pcName);
584 fprintf(fileDest,
"%.*s.", nNameLength, pcName);
593 if (pcAt && (pcAt < (pcName + nNameLength)))
603 fprintf(fileDest,
"%.*s", nNameLength, pcName);
620 fprintf(fileDest,
"_%.*s", nNameLength, pcName);
625 fprintf(fileDest,
"%.*s", nNameLength, pcName);
715 PrintName(fileDest, pexp, &strTarget, 1);
732 (pcDeco < pexp->strName.buf + pexp->
strName.
len))
772 DbgPrint(
"OutputLine_def: skipping forwarded extern export '%.*s' ->'%.*s'...\n",
837 fprintf(fileDest,
":PROC\n ALIAS <");
869 unsigned i, errorpos,
len;
870 const char* pcLineEnd;
873 pcLineEnd =
strpbrk(pcLine,
"\r\n");
878 pc = pcLine +
len - 1;
897 for (
i = 0;
i < errorpos + 2;
i++)
901 for (
i = 0;
i < errorlen;
i++)
930 const char *pc, *pcLine;
941 for (cLines = 1, pcLine = pcStart; *pcLine; pcLine =
NextLine(pcLine), cLines++)
948 if (pexports ==
NULL)
957 for (pcLine = pcStart; *pcLine; pcLine =
NextLine(pcLine), nLine++)
964 exp.strTarget.len = 0;
968 exp.nStartVersion = 0;
969 exp.nEndVersion = 0xFFFFFFFF;
970 exp.bVersionIncluded = 1;
973 while (*pc ==
' ' || *pc ==
'\t') pc++;
976 if ((*pc ==
'\r') || (*pc ==
'\n') ||
977 (*pc ==
';') || (*pc ==
'#'))
993 else if ((*pc >=
'0') && (*pc <=
'9'))
997 if ((*
end !=
' ') && (*
end !=
'\t'))
1076 int negated = 0,
match = 0;
1093 if (
match != negated)
1099 while (*pc >
',') pc++;
1100 }
while (*pc ==
',');
1108 const char *pcVersionStart = pc + 9;
1111 exp.bVersionIncluded = 0;
1121 if ((pc[0] ==
'0') && (pc[1] ==
'x')) pc += 2;
1132 else if (pc[0] ==
'-')
1136 if ((pc[0] ==
'0') && (pc[1] ==
'x')) pc += 2;
1137 endversion =
strtoul(pc, (
char**)&pc, 16);
1147 pc - pcVersionStart,
1148 "Invalid version range");
1152 exp.nEndVersion = endversion;
1158 exp.bVersionIncluded = 1;
1162 while (*pc >
',') pc++;
1164 }
while (*pc ==
',');
1212 "INFO: %s line %d: Ignored option: '%.*s'\n",
1226 if (!included)
continue;
1229 exp.strName.buf = pc;
1234 if ((
exp.strName.len == 1) && (
exp.strName.buf[0] ==
'@'))
1240 exp.nStackBytes = 0;
1257 while (*pc ==
' ' || *pc ==
'\t') pc++;
1259 exp.nStackBytes = 0;
1264 exp.nStackBytes += 4;
1269 exp.nStackBytes += 8;
1274 exp.nStackBytes += 4;
1279 exp.nStackBytes += 4;
1284 exp.nStackBytes += 4;
1289 exp.nStackBytes += 8;
1294 exp.nStackBytes += 16;
1299 exp.nStackBytes += 4;
1330 if (
exp.nArgCount != 0)
1337 if (
exp.strName.buf[0] ==
'?')
1346 if (
p && (
p -
exp.strName.buf <
exp.strName.len))
1351 exp.strName.len = (
int)(
p -
exp.strName.buf);
1352 if (
exp.strName.len < 1)
1357 exp.nArgCount =
exp.nStackBytes / 4;
1360 for (
i = 0;
i <
exp.nArgCount;
i++)
1369 exp.strTarget.buf = pc;
1384 exp.strTarget.len = 0;
1410 if (bIsNotPrivate || bHasOrdinal)
1420 fprintf(
stderr,
"WARNING: %s line %d: Exported symbol '%.*s' should be PRIVATE\n",
1425 fprintf(
stderr,
"WARNING: %s line %d: exported symbol '%.*s' should not be assigned an ordinal\n",
1434 pexports[*cExports] =
exp;
1445 unsigned short i,
j;
1447 unsigned short firstOrdinal = 0xFFFF, firstIndex = 0;
1453 fprintf(
stderr,
"Failed to allocate memory for ordinal use table\n");
1459 for (
i = 0;
i < cExports;
i++)
1463 if (
used[pexports[
i].nOrdinal] != 0)
1465 fprintf(
stderr,
"Found duplicate ordinal: %u\n", pexports[
i].nOrdinal);
1469 if (pexports[
i].nOrdinal < firstOrdinal)
1471 firstOrdinal = pexports[
i].nOrdinal;
1478 if ((firstOrdinal != 0xFFFF) && (firstOrdinal > firstIndex))
1481 firstOrdinal -= firstIndex;
1490 for (
i = 0,
j = firstOrdinal;
i < cExports;
i++)
1494 while (
used[
j] != 0)
1508 printf(
"syntax: spec2def [<options> ...] <spec file>\n"
1509 "Possible options:\n"
1510 " -h --help print this help screen\n"
1511 " -l=<file> generate an asm lib stub\n"
1512 " -d=<file> generate a def file\n"
1513 " -s=<file> generate a stub file\n"
1514 " -i=<file> generate an import alias file\n"
1515 " --ms MSVC compatibility\n"
1516 " --dbg Enable debug exports\n"
1517 " -n=<name> name of the dll\n"
1518 " --version=<version> Sets the version to create exports for\n"
1519 " --implib generate a def file for an import library\n"
1520 " --no-private-warnings suppress warnings about symbols that should be -private\n"
1521 " -a=<arch> set architecture to <arch> (i386, x86_64, arm, arm64)\n"
1522 " --with-tracing generate wine-like \"+relay\" trace trampolines (needs -s)\n");
1528 char *pszSource, *pszDefFileName =
NULL, *pszStubFileName =
NULL, *pszLibStubName =
NULL;
1529 char *pszImpLibAliasFileName =
NULL;
1530 const char* pszVersionOption =
"--version=0x";
1531 char achDllName[40];
1533 unsigned cExports = 0,
i;
1551 else if (
argv[
i][1] ==
'd' &&
argv[
i][2] ==
'=')
1553 pszDefFileName =
argv[
i] + 3;
1555 else if (
argv[
i][1] ==
'l' &&
argv[
i][2] ==
'=')
1557 pszLibStubName =
argv[
i] + 3;
1559 else if (
argv[
i][1] ==
's' &&
argv[
i][2] ==
'=')
1561 pszStubFileName =
argv[
i] + 3;
1563 else if (
argv[
i][1] ==
'i' &&
argv[
i][2] ==
'=')
1565 pszImpLibAliasFileName =
argv[
i] + 3;
1567 else if (
argv[
i][1] ==
'n' &&
argv[
i][2] ==
'=')
1593 if (!pszStubFileName)
1595 fprintf(
stderr,
"Error: cannot use --with-tracing without -s option.\n");
1600 else if (
argv[
i][1] ==
'a' &&
argv[
i][2] ==
'=')
1637 p2 = p1 = p1 ? p1 + 1 :
argv[
i];
1640 while (*p2 !=
'.' && *p2 != 0) p2++;
1642 if (
len >=
sizeof(achDllName) - 5)
1649 strncpy(achDllName +
len,
".dll",
sizeof(achDllName) -
len);
1668 pszSource =
malloc(nFileSize + 1);
1676 nFileSize =
fread(pszSource, 1, nFileSize,
file);
1680 pszSource[nFileSize] =
'\0';
1683 if (pexports ==
NULL)
1701 fprintf(
stderr,
"error: could not open output file %s\n", pszDefFileName);
1707 for (
i = 0;
i < cExports;
i++)
1709 if (pexports[
i].bVersionIncluded)
1716 if (pszStubFileName)
1722 fprintf(
stderr,
"error: could not open output file %s\n", pszStubFileName);
1728 for (
i = 0;
i < cExports;
i++)
1730 if (pexports[
i].bVersionIncluded)
1743 fprintf(
stderr,
"error: could not open output file %s\n", pszLibStubName);
1749 for (
i = 0;
i < cExports;
i++)
1751 if (pexports[
i].bVersionIncluded)
1759 if (pszImpLibAliasFileName)
1762 file =
fopen(pszImpLibAliasFileName,
"w");
1765 fprintf(
stderr,
"error: could not open output file %s\n", pszImpLibAliasFileName);
1771 for (
i = 0;
i < cExports;
i++)
1773 if (pexports[
i].bVersionIncluded)
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
ACPI_SIZE strlen(const char *String)
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
char * strpbrk(const char *String, const char *Delimiters)
static const WCHAR version[]
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLsizei GLsizei * length
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat token
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_CRTIMP void __cdecl rewind(_Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_opt_ _CRTIMP int __cdecl vfprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
_Check_return_opt_ _CRTIMP size_t __cdecl fread(_Out_writes_bytes_(_ElementSize *_Count) void *_DstBuf, _In_ size_t _ElementSize, _In_ size_t _Count, _Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fseek(_Inout_ FILE *_File, _In_ long _Offset, _In_ int _Origin)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP long __cdecl ftell(_Inout_ FILE *_File)
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
_Check_return_ long __cdecl strtol(_In_z_ const char *_Str, _Out_opt_ _Deref_post_z_ char **_EndPtr, _In_ int _Radix)
#define sprintf(buf, format,...)
static unsigned int number
static unsigned(__cdecl *hash_bstr)(bstr_t s)
_CRT_RESTORE_GCC_WARNINGS _CRT_DISABLE_GCC_WARNINGS _Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
const char * astrCallingConventions[]
const char * NextLine(const char *pc)
void OutputHeader_stub(FILE *file)
void OutputLine_def_MS(FILE *fileDest, EXPORT *pexp)
int OutputLine_stub(FILE *file, EXPORT *pexp)
const char * NextToken(const char *pc)
void OutputLine_def_GCC(FILE *fileDest, EXPORT *pexp)
void OutputHeader_def(FILE *file, char *libname)
void Fatal(const char *filename, unsigned nLine, const char *pcLine, const char *pc, size_t errorlen, const char *format,...)
int CompareToken(const char *token, const char *comparand)
const char * ScanToken(const char *token, char chr)
void OutputHeader_asmstub(FILE *file, char *libname)
int OutputLine_implib_asm(FILE *fileDest, EXPORT *pexp)
static const char * astrOlePrivateExports[]
void PrintNameOrImpName(FILE *fileDest, EXPORT *pexp, PSTRING pstr, int fDeco, int fImp)
int TokenLength(const char *pc)
int ApplyOrdinals(EXPORT *pexports, unsigned cExports)
int(* PFNOUTLINE)(FILE *, EXPORT *)
void Output_stublabel(FILE *fileDest, char *pszSymbolName)
void OutputAlias(FILE *fileDest, EXPORT *pexp, int fImp)
int OutputLine_asmstub(FILE *fileDest, EXPORT *pexp)
static int IsSeparator(char chr)
void Fatalv(const char *filename, unsigned nLine, const char *pcLine, const char *pc, size_t errorlen, const char *format, va_list argptr)
int OutputLine_def(FILE *fileDest, EXPORT *pexp)
EXPORT * ParseFile(char *pcStart, FILE *fileDest, unsigned *cExports)
void PrintName(FILE *fileDest, EXPORT *pexp, PSTRING pstr, int fDeco)