X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=error.c;h=664aecbbaadb5ae2e0371a2504c86b6bd392d470;hp=4f65cc42c50abc9601a051d688b508d51a99553e;hb=c38505ee4b2a0de59926107e52fb8bb84041a0e4;hpb=75969398d9b8a9f82ea76fc4e4cbfb97b11160a4 diff --git a/error.c b/error.c index 4f65cc4..664aecb 100644 --- a/error.c +++ b/error.c @@ -1,34 +1,39 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Reboot's Macro Assembler for all Atari computers // ERROR.C - Error Handling -// Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 -// Source Utilised with the Kind Permission of Landon Dyer +// Source utilised with the kind permission of Landon Dyer // #include "error.h" -#include "token.h" +#include #include "listing.h" +#include "token.h" +// Exported variables int errcnt; // Error count char * err_fname; // Name of error message file -static const char nl[] = "\n"; +// Internal variables static long unused; // For supressing 'write' warnings // // Report error if not at EOL // -int at_eol(void) +// N.B.: Since this should *never* happen, we can feel free to add whatever +// diagnostics that will help in tracking down a problem to this function. +// +int ErrorIfNotAtEOL(void) { - char msg[256]; - if (*tok != EOL) { -// error("syntax error"); - sprintf(msg, "syntax error. expected EOL, found $%X ('%c')", *tok, *tok); - error(msg); + error("syntax error. expected EOL, found $%X ('%c')", *tok, *tok); + printf("Token = "); + DumpToken(*tok); + printf("\n"); + DumpTokenBuffer(); } return 0; @@ -36,28 +41,24 @@ int at_eol(void) // -// Cannot Create a File +// Cannot create a file // -void cantcreat(const char * fn) +void CantCreateFile(const char * fn) { - printf("cannot create: '%s'\n", fn); + printf("Cannot create file: '%s'\n", fn); exit(1); } // -// Setup for Error Message -// o Create error listing file (if necessary) -// o Set current filename +// Setup for error message +// o Create error listing file (if necessary) +// o Set current filename // void err_setup(void) { char fnbuf[FNSIZ]; -// This seems like it's unnecessary, as token.c seems to take care of this all by itself. -// Can restore if it's really needed. If not, into the bit bucket it goes. :-) -// setfnum(cfileno); - if (err_fname != NULL) { strcpy(fnbuf, err_fname); @@ -68,7 +69,7 @@ void err_setup(void) err_fname = NULL; if ((err_fd = open(fnbuf, _OPEN_FLAGS, _PERM_MODE)) < 0) - cantcreat(fnbuf); + CantCreateFile(fnbuf); err_flag = 1; } @@ -76,45 +77,41 @@ void err_setup(void) // -// Display Error Message +// Display error message (uses printf() style variable arguments) // -int error(const char * s) -{ - char buf[EBUFSIZ]; - unsigned int length; - - err_setup(); - - if (listing > 0) - ship_ln(s); - - sprintf(buf, "%s %d: Error: %s%s", curfname, curlineno, s, nl); - length = strlen(buf); - - if (err_flag) - unused = write(err_fd, buf, length); - else - printf("%s", buf); - - taglist('E'); - errcnt++; - - return ERROR; -} - - -int errors(const char * s, char * s1) +int error(const char * text, ...) { char buf[EBUFSIZ]; char buf1[EBUFSIZ]; err_setup(); - sprintf(buf, s, s1); + + va_list arg; + va_start(arg, text); + vsprintf(buf, text, arg); + va_end(arg); if (listing > 0) ship_ln(buf); - sprintf(buf1, "%s %d: Error: %s%s", curfname, curlineno, buf, nl); + if (cur_inobj) + { + switch (cur_inobj->in_type) + { + case SRC_IFILE: + sprintf(buf1, "%s %d: Error: %s\n", curfname, curlineno, buf); + break; + case SRC_IMACRO: + sprintf(buf1, "%s %d: Error: %s\n", curfname, cur_inobj->inobj.imacro->im_macro->lineList->lineno, buf); + break; + case SRC_IREPT: + sprintf(buf1, "%s %d: Error: %s\n", curfname, cur_inobj->inobj.irept->lineno, buf); + break; + } + } + else + // No current file so cur_inobj is NULL + sprintf(buf1, "%s %d: Error: %s\n", curfname, curlineno, buf); if (err_flag) unused = write(err_fd, buf1, (LONG)strlen(buf1)); @@ -122,70 +119,30 @@ int errors(const char * s, char * s1) printf("%s", buf1); taglist('E'); - ++errcnt; + errcnt++; return ERROR; } -int warn(const char * s) -{ - char buf[EBUFSIZ]; - - err_setup(); - - if (listing > 0) - ship_ln(s); - - sprintf(buf, "%s %d: Warning: %s%s", curfname, curlineno, s, nl); - - if (err_flag) - unused = write(err_fd, buf, (LONG)strlen(buf)); - else - printf("%s", buf); - - taglist('W'); - - return OK; -} - - -int warns(const char * s, char * s1) -{ - char buf[EBUFSIZ]; - char buf1[EBUFSIZ]; - - err_setup(); - sprintf(buf, s, s1); - - if (listing > 0) - ship_ln(s); - - sprintf(buf1, "%s %d: Warning: %s%s", curfname, curlineno, buf, nl); - - if (err_flag) - unused = write(err_fd, buf1, (LONG)strlen(buf1)); - else - printf("%s", buf1); - - taglist('W'); - - return OK; -} - - -int warni(const char * s, unsigned i) +// +// Display warning message (uses printf() style variable arguments) +// +int warn(const char * text, ...) { char buf[EBUFSIZ]; char buf1[EBUFSIZ]; err_setup(); - sprintf(buf, s, i); + va_list arg; + va_start(arg, text); + vsprintf(buf, text, arg); + va_end(arg); if (listing > 0) ship_ln(buf); - sprintf(buf1, "%s %d: Warning: %s%s", curfname, curlineno, buf, nl); + sprintf(buf1, "%s %d: Warning: %s\n", curfname, curlineno, buf); if (err_flag) unused = write(err_fd, buf1, (LONG)strlen(buf1)); @@ -207,7 +164,7 @@ int fatal(const char * s) if (listing > 0) ship_ln(s); - sprintf(buf, "%s %d: Fatal: %s%s", curfname, curlineno, s, nl); + sprintf(buf, "%s %d: Fatal: %s\n", curfname, curlineno, s); if (err_flag) unused = write(err_fd, buf, (LONG)strlen(buf)); @@ -223,7 +180,7 @@ int interror(int n) char buf[EBUFSIZ]; err_setup(); - sprintf(buf, "%s %d: Internal Error Number %d%s", curfname, curlineno, n, nl); + sprintf(buf, "%s %d: Internal error #%d\n", curfname, curlineno, n); if (listing > 0) ship_ln(buf);