typedef struct
{
char *pcName;
- size_t nNameLength;
+ int nNameLength;
char *pcRedirection;
int nRedirectionLength;
int nCallingConvention;
CC_STDCALL,
CC_CDECL,
CC_FASTCALL,
+ CC_THISCALL,
CC_EXTERN,
CC_STUB,
};
ARG_STR,
ARG_WSTR,
ARG_DBL,
- ARG_INT64
+ ARG_INT64,
+ ARG_INT128,
+ ARG_FLOAT
};
char* astrCallingConventions[] =
"STDCALL",
"CDECL",
"FASTCALL",
+ "THISCALL",
"EXTERN"
};
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);
}
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\"");
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");
{
fprintf(file,
"; File generated automatically, do not edit!\n\n"
- "LIBRARY %s\n\n"
+ "NAME %s\n\n"
"EXPORTS\n",
libname);
}
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] == '@')
}
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 ||
{
exp.nCallingConvention = CC_FASTCALL;
}
+ else if (CompareToken(pc, "thiscall"))
+ {
+ exp.nCallingConvention = CC_THISCALL;
+ }
else if (CompareToken(pc, "extern"))
{
exp.nCallingConvention = CC_EXTERN;
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);
{
/* 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);
}
/* Get optional redirection */
- if ((pc = NextToken(pc)))
+ pc = NextToken(pc);
+ if (pc)
{
exp.pcRedirection = pc;
exp.nRedirectionLength = TokenLength(pc);
char *pszSource, *pszDefFileName = 0, *pszStubFileName = 0, *pszLibStubName = 0;
char achDllName[40];
FILE *file;
- int result, i;
+ int result = 0, i;
if (argc < 2)
{
/* 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);