diff options
author | Paul Gilbert | 2019-05-17 15:52:13 -1000 |
---|---|---|
committer | Paul Gilbert | 2019-05-24 18:21:06 -0700 |
commit | fcb2592ec24f983c49f1e2e1b4f41cc9659a9229 (patch) | |
tree | 6f90f0a47a637d4fcb52ff437e47c94855ab2f91 /engines/glk/tads/tads2/error_handling.cpp | |
parent | f607792fa4e1f024dd8265034ac84425bde4aee7 (diff) | |
download | scummvm-rg350-fcb2592ec24f983c49f1e2e1b4f41cc9659a9229.tar.gz scummvm-rg350-fcb2592ec24f983c49f1e2e1b4f41cc9659a9229.tar.bz2 scummvm-rg350-fcb2592ec24f983c49f1e2e1b4f41cc9659a9229.zip |
GLK: TADS2: Added built in functions
Diffstat (limited to 'engines/glk/tads/tads2/error_handling.cpp')
-rw-r--r-- | engines/glk/tads/tads2/error_handling.cpp | 179 |
1 files changed, 178 insertions, 1 deletions
diff --git a/engines/glk/tads/tads2/error_handling.cpp b/engines/glk/tads/tads2/error_handling.cpp index a2300ee834..b71fc8ce11 100644 --- a/engines/glk/tads/tads2/error_handling.cpp +++ b/engines/glk/tads/tads2/error_handling.cpp @@ -20,13 +20,190 @@ * */ -#include "error_handling.h" +#include "glk/tads/tads2/error_handling.h" namespace Glk { namespace TADS { namespace TADS2 { +/* format an error message, sprintf-style, using an erradef array */ +int errfmt(char *outbuf, int outbufl, char *fmt, int argc, erradef *argv) +{ + int outlen = 0; + int argi = 0; + int len; + char buf[20]; + char *p = nullptr; + char fmtchar; + + while (*fmt != '\0' && outbufl > 1) + { + switch(*fmt) + { + case '\\': + ++fmt; + len = 1; + switch(*fmt) + { + case '\0': + --fmt; + break; + case '\n': + p = "\n"; + break; + case '\t': + p = "\t"; + break; + default: + p = fmt; + break; + } + break; + + case '%': + ++fmt; + fmtchar = *fmt; + if (argi >= argc) fmtchar = 1; /* too many - ignore it */ + switch(fmtchar) + { + case '\0': + --fmt; + len = 0; + break; + + case '%': + p = "%"; + len = 1; + break; + + case 'd': + sprintf(buf, "%d", argv[argi].erraint); + len = strlen(buf); + p = buf; + break; + + case 'u': + sprintf(buf, "%u", argv[argi].erraint); + len = strlen(buf); + p = buf; + break; + + case 's': + p = argv[argi].errastr; + len = strlen(p); + break; + + default: + p = ""; + len = 0; + --argi; + break; + } + ++argi; + break; + + default: + p = fmt; + len = 1; + break; + } + + /* copy output that was set up above */ + if (len != 0) + { + if (outbufl >= len) + { + memcpy(outbuf, p, (size_t)len); + outbufl -= len; + outbuf += len; + } + else if (outbufl > 1) + { + memcpy(outbuf, p, (size_t)outbufl - 1); + outbufl = 1; + } + outlen += len; + } + ++fmt; + } + + /* add a null terminator */ + if (outbufl != 0) + *outbuf++ = '\0'; + + /* return the length */ + return outlen; +} + +#if defined(DEBUG) && !defined(ERR_NO_MACRO) +void errjmp(jmp_buf buf, int e) +{ + longjmp(buf, e); +} +#endif /* DEBUG */ + + + +#ifdef ERR_NO_MACRO + +/* base error signal function */ +void errsign(errcxdef *ctx, int e, char *facility) +{ + strncpy(ctx->errcxptr->errfac, facility, ERRFACMAX); + ctx->errcxptr->errfac[ERRFACMAX] = '\0'; + ctx->errcxofs = 0; +#if 0 + longjmp(ctx->errcxptr->errbuf, e); +#else + error("Error - %s", facility); +#endif +} + +/* signal an error with no arguments */ +void errsigf(errcxdef *ctx, char *facility, int e) +{ + errargc(ctx, 0); + errsign(ctx, e, facility); +} + +/* enter a string argument */ +char *errstr(errcxdef *ctx, const char *str, int len) +{ + char *ret = &ctx->errcxbuf[ctx->errcxofs]; + + memcpy(ret, str, (size_t)len); + ret[len] = '\0'; + ctx->errcxofs += len + 1; + return(ret); +} + +/* resignal current error */ +void errrse1(errcxdef *ctx, errdef *fr) +{ + errargc(ctx, fr->erraac); + memcpy(ctx->errcxptr->erraav, fr->erraav, + (size_t)(fr->erraac * sizeof(erradef))); + errsign(ctx, fr->errcode, fr->errfac); +} + +/* log an error: base function */ +void errlogn(errcxdef *ctx, int err, char *facility) +{ + ctx->errcxofs = 0; + (*ctx->errcxlog)(ctx->errcxlgc, facility, err, ctx->errcxptr->erraac, + ctx->errcxptr->erraav); +} + +/* log an error with no arguments */ +void errlogf(errcxdef *ctx, char *facility, int err) +{ + errargc(ctx, 0); + errlogn(ctx, err, facility); +} + +#endif /* ERR_NO_MACRO */ + } // End of namespace TADS2 } // End of namespace TADS } // End of namespace Glk |