157 lines
3.1 KiB
C
157 lines
3.1 KiB
C
/* asmerr.c -- microsoft 80x86 assembler
|
|
**
|
|
** microsoft (r) macro assembler
|
|
** copyright (c) microsoft corp 1986. all rights reserved
|
|
**
|
|
** randy nevin
|
|
**
|
|
** 10/90 - Quick conversion to 32 bit by Jeff Spencer
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "asm86.h"
|
|
#include "asmfcn.h"
|
|
#include "asmmsg.h"
|
|
|
|
#define MSGLEN 50
|
|
static char errstring[MSGLEN + 1];
|
|
|
|
extern char FAR * FAR messages[];
|
|
|
|
extern short FAR msgnum[];
|
|
|
|
static USHORT badoff;
|
|
|
|
/*** errordisplay - display error
|
|
*
|
|
* errordisplay();
|
|
*
|
|
* Entry debug = debug output flag
|
|
* pass2 = TRUE if pass 2
|
|
* listquiet = FALSE if error output to console
|
|
* Exit
|
|
* Returns
|
|
* Calls
|
|
*/
|
|
|
|
|
|
VOID PASCAL
|
|
errordisplay ()
|
|
{
|
|
if (pass2 || fPass1Err || debug) {
|
|
if (lsting) {
|
|
error_line (lst.fil, pFCBCur->fname, errorlineno);
|
|
fputs(NLINE, lst.fil);
|
|
}
|
|
}
|
|
if (!listquiet){
|
|
error_line (ERRFILE, pFCBCur->fname, errorlineno);
|
|
fputs("\n", ERRFILE);
|
|
}
|
|
if (pass2)
|
|
if (warnCode > 0){ /* if its not a serve error */
|
|
/* and were interested in this level*/
|
|
if (warnCode <= warnlevel)
|
|
warnnum++;
|
|
}
|
|
else
|
|
errornum++;
|
|
else if (fPass1Err)
|
|
errornum++;
|
|
}
|
|
|
|
|
|
VOID PASCAL CODESIZE
|
|
error (
|
|
USHORT code,
|
|
UCHAR *str
|
|
){
|
|
if (errorcode && code != E_LTL)
|
|
return;
|
|
|
|
fPass1Err = code & E_PASS1;
|
|
warnCode = ((code >> 12) & 0x3);
|
|
code &= E_ERRMASK;
|
|
|
|
if (warnCode > warnlevel)
|
|
/* don't bother with this warning; just return */
|
|
return;
|
|
|
|
errorcode = code;
|
|
if (str)
|
|
strncpy (strcpy(errstring, ": ")+2, str, MSGLEN-2);
|
|
else
|
|
*errstring = 0;
|
|
}
|
|
|
|
|
|
VOID PASCAL CODESIZE
|
|
errorn (
|
|
USHORT code
|
|
){
|
|
error (code,naim.pszName);
|
|
}
|
|
|
|
|
|
|
|
VOID PASCAL CODESIZE
|
|
errorc (
|
|
USHORT code
|
|
){
|
|
error (code,(char *)0);
|
|
}
|
|
|
|
VOID PASCAL
|
|
ferrorc (
|
|
USHORT code
|
|
){
|
|
error (code,(char *)0);
|
|
}
|
|
|
|
|
|
|
|
VOID PASCAL CODESIZE
|
|
errorcSYN ()
|
|
{
|
|
error (E_SYN,(char *)0);
|
|
}
|
|
|
|
|
|
|
|
/*** error_line - print error message
|
|
*
|
|
* error_line (code, l, file, line)
|
|
*
|
|
* Entry l = listing file
|
|
* line = line number in source or include file
|
|
*/
|
|
|
|
|
|
VOID PASCAL
|
|
error_line (
|
|
FILE *l,
|
|
UCHAR *file,
|
|
short line
|
|
){
|
|
static char mpWarnCode[3] = {'2', '4', '5'};
|
|
char msgstring[MSGLEN+1], messT[MSGLEN+1];
|
|
|
|
if (!messages[errorcode])
|
|
messages[errorcode] = __FMSG_TEXT(msgnum[errorcode]);
|
|
|
|
STRNFCPY(msgstring, (errorcode < E_MAX)? messages[errorcode]:
|
|
(char FAR *) __NMSG_TEXT(ER_UNK));
|
|
|
|
if (errorcode == E_JOR) {
|
|
|
|
strcpy(messT, msgstring);
|
|
sprintf(msgstring, messT, (long) CondJmpDist);
|
|
}
|
|
|
|
fprintf(l, __NMSG_TEXT(ER_STR), file, line,
|
|
warnCode > 0 ? "warning" : "error",
|
|
mpWarnCode[warnCode], (SHORT)(errorcode - 1),
|
|
msgstring, errstring);
|
|
}
|