FL_PRIVATE = 1,
FL_STUB = 2,
FL_NONAME = 4,
+ FL_ORDINAL = 8,
+ FL_DATA_ALIAS = 16
};
enum
}
else
{
+ /* Does the string already have stdcall decoration? */
+ pcAt = ScanToken(pcName, '@');
+ if (pcAt && (pcAt < (pcName + nNameLength)) && pcName[0] == '_')
+ {
+ /* Skip leading underscore and remove trailing decoration */
+ pcName++;
+ nNameLength = pcAt - pcName;
+ }
+
/* Print the undecorated function name */
fprintf(fileDest, "%.*s", nNameLength, pcName);
}
else
OutputLine_def_GCC(fileDest, pexp);
- if (pexp->nOrdinal != -1)
+ if (pexp->uFlags & FL_ORDINAL)
{
fprintf(fileDest, " @%d", pexp->nOrdinal);
}
fprintf(fileDest, " PRIVATE");
}
- if (pexp->nCallingConvention == CC_EXTERN)
+ /* Make this a data export, unless this is MSVC and -withalias was given */
+ if ((pexp->nCallingConvention == CC_EXTERN) &&
+ !(gbMSComp && (pexp->uFlags & FL_DATA_ALIAS)))
{
fprintf(fileDest, " DATA");
}
// nLine, TokenLength(pc), pc);
/* Now we should get either an ordinal or @ */
- if (*pc == '@') exp.nOrdinal = -1;
- else exp.nOrdinal = atol(pc);
+ if (*pc == '@')
+ exp.nOrdinal = -1;
+ else
+ {
+ exp.nOrdinal = atol(pc);
+ exp.uFlags |= FL_ORDINAL;
+ }
/* Go to next token (type) */
if (!(pc = NextToken(pc)))
{
exp.uFlags |= FL_PRIVATE;
}
- else if (CompareToken(pc, "-noname") ||
- CompareToken(pc, "-ordinal"))
+ else if (CompareToken(pc, "-noname"))
{
- exp.uFlags |= FL_NONAME;
+ exp.uFlags |= FL_ORDINAL | FL_NONAME;
+ }
+ else if (CompareToken(pc, "-ordinal"))
+ {
+ exp.uFlags |= FL_ORDINAL;
}
else if (CompareToken(pc, "-stub"))
{
exp.uFlags |= FL_STUB;
}
+ else if (CompareToken(pc, "-withalias"))
+ {
+ /* This flag is to create a nin _imp_ prefixed alias for a
+ data export, so that the hacked DDK declarations work */
+ if (exp.nCallingConvention != CC_EXTERN)
+ fprintf(stderr, "error: line %d -withalias on non-data export\n", nLine);
+ else
+ exp.uFlags |= FL_DATA_ALIAS;
+ }
else if (CompareToken(pc, "-norelay") ||
CompareToken(pc, "-register") ||
CompareToken(pc, "-ret64"))
sprintf(namebuffer, "ordinal%d", exp.nOrdinal);
exp.strName.len = strlen(namebuffer);
exp.strName.buf = namebuffer;
- exp.uFlags |= FL_NONAME;
+ exp.uFlags |= FL_ORDINAL | FL_NONAME;
}
/* Handle parameters */
}
/* Check for no-name without ordinal */
- if ((exp.uFlags & FL_NONAME) && (exp.nOrdinal == -1))
+ if ((exp.uFlags & FL_ORDINAL) && (exp.nOrdinal == -1))
{
- fprintf(stderr, "error: line %d, noname export without ordinal!\n", nLine);
+ fprintf(stderr, "error: line %d, ordinal export without ordinal!\n", nLine);
+ return -1;
}
OutputLine(fileDest, &exp);