|
|
/*****************************************************************************
* * assert.c * *****************************************************************************/
#include "m4.h"
/*****************************************************************************
* * PrintPtszPtszVa * * Perform printf-style formatting, but much more restricted. * * %s - null-terminated string * %P - snapped TOKEN structure * %d - decimal number * *****************************************************************************/
UINT STDCALL PrintPtszPtszVa(PTSTR ptszBuf, PCTSTR ptszFormat, va_list ap) { PTSTR ptsz = ptszBuf; PTOK ptok;
for (;;) { if (*ptszFormat != '%') { *ptsz++ = *ptszFormat; if (*ptszFormat == TEXT('\0')) return (UINT)(ptsz - ptszBuf - 1); ptszFormat++; continue; }
/*
* Found a formatting character. */ ptszFormat++; switch (*ptszFormat) {
/*
* %s - null-terminated string */ case 's': ptsz += PrintPtchPtchV(ptsz, TEXT("%s"), va_arg(ap, PCTSTR)); break;
/*
* %d - decimal integer */ case 'd': ptsz += PrintPtchPtchV(ptsz, TEXT("%d"), va_arg(ap, int)); break;
/*
* %P - snapped token */ case 'P': ptok = va_arg(ap, PTOK); AssertSPtok(ptok); Assert(fClosedPtok(ptok)); CopyPtchPtchCtch(ptsz, ptok->u.ptch, ptok->ctch); ptsz += ptok->ctch; break;
case '%': *ptsz++ = TEXT('%'); break;
default: Assert(0); break; } ptszFormat++; } }
/*****************************************************************************
* * Die * * Squirt a message and die. * *****************************************************************************/
NORETURN void CDECL Die(PCTSTR ptszFormat, ...) { TCHAR tszBuf[1024]; va_list ap; CTCH ctch;
va_start(ap, ptszFormat); ctch = PrintPtszPtszVa(tszBuf, ptszFormat, ap); va_end(ap);
cbWriteHfPvCb(hfErr, tszBuf, cbCtch(ctch));
exit(1); }
#ifdef DEBUG
/*****************************************************************************
* * AssertPszPszLn * * An assertion just failed. pszExpr is the expression, pszFile is the * filename, and iLine is the line number. * *****************************************************************************/
NORETURN int STDCALL AssertPszPszLn(PCSTR pszExpr, PCSTR pszFile, int iLine) { Die(TEXT("Assertion failed: `%s' at %s(%d)") EOL, pszExpr, pszFile, iLine); return 0; }
#endif
|