aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/tads/tads2/error_handling.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2019-05-17 15:52:13 -1000
committerPaul Gilbert2019-05-24 18:21:06 -0700
commitfcb2592ec24f983c49f1e2e1b4f41cc9659a9229 (patch)
tree6f90f0a47a637d4fcb52ff437e47c94855ab2f91 /engines/glk/tads/tads2/error_handling.cpp
parentf607792fa4e1f024dd8265034ac84425bde4aee7 (diff)
downloadscummvm-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.cpp179
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