DUK_INTERNAL void duk_err_handle_error(const char *filename, duk_int_t line, duk_hthread *thr, duk_errcode_t code, const char *fmt, ...) { va_list ap; char msg[DUK__ERRFMT_BUFSIZE]; va_start(ap, fmt); (void) DUK_VSNPRINTF(msg, sizeof(msg), fmt, ap); msg[sizeof(msg) - 1] = (char) 0; duk_err_create_and_throw(thr, code, msg, filename, line); va_end(ap); /* dead code, but ensures portability (see Linux man page notes) */ }
DUK_INTERNAL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...) { duk_size_t avail; va_list ap; va_start(ap, fmt); avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset)); if (avail > 0) { duk_int_t res = (duk_int_t) DUK_VSNPRINTF((char *) (fb->buffer + fb->offset), avail, fmt, ap); if (res < 0) { /* error */ } else if ((duk_size_t) res >= avail) { /* (maybe) truncated */ fb->offset += avail; if ((duk_size_t) res > avail) { /* actual chars dropped (not just NUL term) */ fb->truncated = 1; } } else { /* normal */ fb->offset += res; } } va_end(ap); }
DUK_LOCAL void duk__handle_error(const char *filename, duk_int_t line, duk_hthread *thr, duk_errcode_t code, const char *fmt, va_list ap) { char msg[DUK__ERRFMT_BUFSIZE]; (void) DUK_VSNPRINTF(msg, sizeof(msg), fmt, ap); msg[sizeof(msg) - 1] = (char) 0; duk_err_create_and_throw(thr, code, msg, filename, line); }