diff --git a/contrib/20.r7rs/src/load.c b/contrib/20.r7rs/src/load.c index 3503eda9..f6f68b63 100644 --- a/contrib/20.r7rs/src/load.c +++ b/contrib/20.r7rs/src/load.c @@ -18,7 +18,7 @@ pic_load_load(pic_state *pic) fp = fopen(fn, "r"); if (fp == NULL) { - pic_errorf(pic, "load: could not open file %s", fn); + pic_error(pic, "load: could not open file", 1, pic_cstr_value(pic, fn)); } port = pic_open_port(pic, xfopen_file(pic, fp, "r")); diff --git a/contrib/30.readline/src/readline.c b/contrib/30.readline/src/readline.c index 6153cdbb..2a58b2c6 100644 --- a/contrib/30.readline/src/readline.c +++ b/contrib/30.readline/src/readline.c @@ -194,7 +194,7 @@ pic_rl_read_history(pic_state *pic) pic_get_args(pic, "z", &filename); if(read_history(filename)) - pic_errorf(pic, "cannot read history file : %s", filename); + pic_error(pic, "cannot read history file", 1, pic_cstr_value(pic, filename)); return pic_undef_value(pic); } @@ -207,7 +207,7 @@ pic_rl_write_history(pic_state *pic) pic_get_args(pic, "z", &filename); if(write_history(filename)) - pic_errorf(pic, "cannot write history file: %s", filename); + pic_error(pic, "cannot write history file", 1, pic_cstr_value(pic, filename)); return pic_undef_value(pic); } @@ -235,7 +235,7 @@ pic_rl_history_expand(pic_state *pic) status = history_expand(input, &result); if(status == -1 || status == 2) - pic_errorf(pic, "%s\n", result); + pic_error(pic, result, 0); return pic_cstr_value(pic, result); } diff --git a/contrib/30.regexp/src/regexp.c b/contrib/30.regexp/src/regexp.c index 8f7f0c89..c428ad1c 100644 --- a/contrib/30.regexp/src/regexp.c +++ b/contrib/30.regexp/src/regexp.c @@ -57,7 +57,7 @@ pic_regexp_regexp(pic_state *pic) regerror(err, ®->reg, errbuf, sizeof errbuf); regexp_dtor(pic, ®->reg); - pic_errorf(pic, "regexp compilation error: %s", errbuf); + pic_error(pic, "regexp compilation error", 1, pic_cstr_value(pic, errbuf)); } return pic_data_value(pic, reg, ®exp_type); diff --git a/contrib/40.srfi/src/106.c b/contrib/40.srfi/src/106.c index e2cdf13a..2ffec60a 100644 --- a/contrib/40.srfi/src/106.c +++ b/contrib/40.srfi/src/106.c @@ -31,7 +31,7 @@ PIC_INLINE void ensure_socket_is_open(pic_state *pic, struct pic_socket_t *sock) { if (sock != NULL && sock->fd == -1) { - pic_errorf(pic, "the socket is already closed"); + pic_error(pic, "the socket is already closed", 0); } } @@ -87,9 +87,9 @@ pic_socket_make_socket(pic_state *pic) } while (result == EAI_AGAIN); if (result) { if (result == EAI_SYSTEM) { - pic_errorf(pic, "%s", strerror(errno)); + pic_error(pic, strerror(errno), 0); } - pic_errorf(pic, "%s", gai_strerror(result)); + pic_error(pic, gai_strerror(result), 0); } for (it = ai; it != NULL; it = it->ai_next) { @@ -129,7 +129,7 @@ pic_socket_make_socket(pic_state *pic) freeaddrinfo(ai); if (sock->fd == -1) { - pic_errorf(pic, "%s", strerror(errno)); + pic_error(pic, strerror(errno), 0); } return pic_data_value(pic, sock, &socket_type); @@ -158,7 +158,7 @@ pic_socket_socket_accept(pic_state *pic) } else if (errno == EAGAIN || errno == EWOULDBLOCK) { continue; } else { - pic_errorf(pic, "%s", strerror(errno)); + pic_error(pic, strerror(errno), 0); } } else { break; @@ -191,7 +191,7 @@ pic_socket_socket_send(pic_state *pic) } else if (errno == EAGAIN || errno == EWOULDBLOCK) { break; } else { - pic_errorf(pic, "%s", strerror(errno)); + pic_error(pic, strerror(errno), 0); } } cursor += len; @@ -214,7 +214,7 @@ pic_socket_socket_recv(pic_state *pic) pic_get_args(pic, "ui|i", &sock, &socket_type, &size, &flags); if (size < 0) { - pic_errorf(pic, "size must not be negative"); + pic_error(pic, "size must not be negative", 0); } ensure_socket_is_open(pic, sock); @@ -227,7 +227,7 @@ pic_socket_socket_recv(pic_state *pic) } while (len < 0 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); if (len < 0) { - pic_errorf(pic, "%s", strerror(errno)); + pic_error(pic, strerror(errno), 0); } return pic_blob_value(pic, buf, len); diff --git a/extlib/benz/blob.c b/extlib/benz/blob.c index 3747d66e..bff9d67b 100644 --- a/extlib/benz/blob.c +++ b/extlib/benz/blob.c @@ -56,7 +56,7 @@ pic_blob_bytevector(pic_state *pic) pic_assert_type(pic, argv[i], int); if (pic_int(pic, argv[i]) < 0 || pic_int(pic, argv[i]) > 255) { - pic_errorf(pic, "byte out of range"); + pic_error(pic, "byte out of range", 0); } *data++ = (unsigned char)pic_int(pic, argv[i]); @@ -74,10 +74,10 @@ pic_blob_make_bytevector(pic_state *pic) pic_get_args(pic, "i|i", &k, &b); if (b < 0 || b > 255) - pic_errorf(pic, "byte out of range"); + pic_error(pic, "byte out of range", 0); if (k < 0) { - pic_errorf(pic, "make-bytevector: negative length given %d", k); + pic_error(pic, "make-bytevector: negative length given", 1, pic_int_value(pic, k)); } blob = pic_blob_value(pic, 0, k); @@ -119,7 +119,7 @@ pic_blob_bytevector_u8_set(pic_state *pic) pic_get_args(pic, "bii", &buf, &len, &k, &v); if (v < 0 || v > 255) - pic_errorf(pic, "byte out of range"); + pic_error(pic, "byte out of range", 0); VALID_INDEX(pic, len, k); @@ -216,7 +216,7 @@ pic_blob_list_to_bytevector(pic_state *pic) pic_assert_type(pic, e, int); if (pic_int(pic, e) < 0 || pic_int(pic, e) > 255) - pic_errorf(pic, "byte out of range"); + pic_error(pic, "byte out of range", 0); *data++ = (unsigned char)pic_int(pic, e); } diff --git a/extlib/benz/bool.c b/extlib/benz/bool.c index 9de94abc..ee9c52a3 100644 --- a/extlib/benz/bool.c +++ b/extlib/benz/bool.c @@ -72,7 +72,7 @@ internal_equal_p(pic_state *pic, pic_value x, pic_value y, int depth, khash_t(m) if (depth > 10) { if (depth > 200) { - pic_errorf(pic, "Stack overflow in equal\n"); + pic_error(pic, "stack overflow in equal", 0); } if (pic_pair_p(pic, x) || pic_vec_p(pic, x)) { int ret; diff --git a/extlib/benz/char.c b/extlib/benz/char.c index d4d4b499..7f9d7666 100644 --- a/extlib/benz/char.c +++ b/extlib/benz/char.c @@ -3,6 +3,7 @@ */ #include "picrin.h" +#include "picrin/extra.h" static pic_value pic_char_char_p(pic_state *pic) @@ -32,7 +33,7 @@ pic_char_integer_to_char(pic_state *pic) pic_get_args(pic, "i", &i); if (i < 0 || i > 255) { - pic_errorf(pic, "integer->char: integer out of char range: %d", i); + pic_error(pic, "integer->char: integer out of char range", 1, pic_int_value(pic, i)); } return pic_char_value(pic, (char)i); @@ -49,15 +50,13 @@ pic_char_integer_to_char(pic_state *pic) pic_get_args(pic, "cc*", &c, &d, &argc, &argv); \ \ if (! (c op d)) \ - return pic_false_value(pic); \ - \ - for (i = 0; i < argc; ++i) { \ + return pic_false_value(pic); \ + \ + for (i = 0; i < argc; ++i) { \ c = d; \ - if (pic_char_p(pic, argv[i])) \ - d = pic_char(pic, argv[i]); \ - else \ - pic_errorf(pic, #op ": char required"); \ - \ + pic_assert_type(pic, argv[i], char); \ + d = pic_char(pic, argv[i]); \ + \ if (! (c op d)) \ return pic_false_value(pic); \ } \ diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 0149e00f..64f269a2 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -131,7 +131,7 @@ cont_call(pic_state *pic) } } if (cc == NULL) { - pic_errorf(pic, "calling dead escape continuation"); + pic_error(pic, "calling dead escape continuation", 0); } cont->retc = argc; diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index 47a92fd6..34f40de7 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -26,7 +26,7 @@ pic_dict_ref(pic_state *pic, pic_value dict, pic_value key) it = kh_get(dict, h, pic_sym_ptr(pic, key)); if (it == kh_end(h)) { - pic_errorf(pic, "element not found for a key: ~s", key); + pic_error(pic, "element not found for given key", 1, key); } return kh_val(h, it); } @@ -64,7 +64,7 @@ pic_dict_del(pic_state *pic, pic_value dict, pic_value key) it = kh_get(dict, h, pic_sym_ptr(pic, key)); if (it == kh_end(h)) { - pic_errorf(pic, "no slot named ~s found in dictionary", key); + pic_error(pic, "element not found for given key", 1, key); } kh_del(dict, h, it); } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 1111567f..3012fc58 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -37,19 +37,16 @@ pic_warnf(pic_state *pic, const char *fmt, ...) } void -pic_errorf(pic_state *pic, const char *fmt, ...) +pic_error(pic_state *pic, const char *msg, int n, ...) { va_list ap; - const char *msg; - pic_value err; + pic_value irrs; - va_start(ap, fmt); - err = pic_vstrf_value(pic, fmt, ap); + va_start(ap, n); + irrs = pic_vlist(pic, n, ap); va_end(ap); - msg = pic_str(pic, err); - - pic_raise(pic, pic_make_error(pic, "", msg, pic_nil_value(pic))); + pic_raise(pic, pic_make_error(pic, "", msg, irrs)); } void @@ -151,7 +148,7 @@ pic_raise(pic_state *pic, pic_value err) pic_pop_handler(pic); - pic_errorf(pic, "error handler returned with ~s on error ~s", val, err); + pic_error(pic, "error handler returned", 2, val, err); } static pic_value diff --git a/extlib/benz/eval.c b/extlib/benz/eval.c index 41e60d4b..2564f60c 100644 --- a/extlib/benz/eval.c +++ b/extlib/benz/eval.c @@ -159,7 +159,7 @@ expand_defmacro(pic_state *pic, pic_value expr, pic_value env) val = pic_call(pic, pic_compile(pic, pic_expand(pic, pic_list_ref(pic, expr, 2), env)), 0); if (! pic_proc_p(pic, val)) { - pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", pic_list_ref(pic, expr, 1)); + pic_error(pic, "macro definition evaluates to non-procedure object", 1, pic_list_ref(pic, expr, 1)); } define_macro(pic, uid, val); @@ -179,7 +179,7 @@ expand_node(pic_state *pic, pic_value expr, pic_value env, pic_value deferred) pic_value mac; if (! pic_list_p(pic, expr)) { - pic_errorf(pic, "cannot expand improper list: ~s", expr); + pic_error(pic, "cannot expand improper list", 1, expr); } if (pic_id_p(pic, pic_car(pic, expr))) { @@ -516,7 +516,7 @@ analyze_node(pic_state *pic, analyze_scope *scope, pic_value obj) pic_value proc; if (! pic_list_p(pic, obj)) { - pic_errorf(pic, "invalid expression given: ~s", obj); + pic_error(pic, "invalid expression given", 1, obj); } proc = pic_list_ref(pic, obj, 0); @@ -1023,7 +1023,7 @@ codegen(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) codegen_call(pic, cxt, obj, tailpos); } else { - pic_errorf(pic, "codegen: unknown AST type ~s", obj); + pic_error(pic, "codegen: unknown AST type", 1, obj); } } diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index f255d2e3..b5e63b05 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -100,7 +100,7 @@ typedef void (*pic_panicf)(pic_state *, const char *msg); pic_panicf pic_atpanic(pic_state *, pic_panicf f); PIC_NORETURN void pic_panic(pic_state *, const char *msg); -PIC_NORETURN void pic_errorf(pic_state *, const char *fmt, ...); +PIC_NORETURN void pic_error(pic_state *, const char *msg, int n, ...); PIC_NORETURN void pic_raise(pic_state *, pic_value v); pic_value pic_make_error(pic_state *, const char *type, const char *msg, pic_value irrs); diff --git a/extlib/benz/include/picrin/extra.h b/extlib/benz/include/picrin/extra.h index ed8ea6cb..a7cd6f88 100644 --- a/extlib/benz/include/picrin/extra.h +++ b/extlib/benz/include/picrin/extra.h @@ -59,9 +59,9 @@ pic_value pic_fdisplay(pic_state *, pic_value, xFILE *); #define pic_push(pic, item, place) (place = pic_cons(pic, item, place)) #define pic_pop(pic, place) (place = pic_cdr(pic, place)) -#define pic_assert_type(pic, v, type) do { \ - if (! pic_##type##_p(pic, v)) \ - pic_errorf(pic, "expected " #type ", but got ~s", v); \ +#define pic_assert_type(pic, v, type) do { \ + if (! pic_##type##_p(pic, v)) \ + pic_error(pic, #type " required", 1, v); \ } while (0) #define pic_void(exec) pic_void_(PIC_GENSYM(ai), exec) diff --git a/extlib/benz/include/picrin/private/object.h b/extlib/benz/include/picrin/private/object.h index ec0ec402..2dedfcec 100644 --- a/extlib/benz/include/picrin/private/object.h +++ b/extlib/benz/include/picrin/private/object.h @@ -159,16 +159,16 @@ pic_value pic_obj_value(void *ptr); struct object *pic_obj_alloc(pic_state *, size_t, int type); #define VALID_INDEX(pic, len, i) do { \ - if (i < 0 || len <= i) pic_errorf(pic, "index out of range: %d", i); \ + if (i < 0 || len <= i) pic_error(pic, "index out of range", 1, pic_int_value(pic, i)); \ } while (0) #define VALID_RANGE(pic, len, s, e) do { \ - if (s < 0 || len < s) pic_errorf(pic, "invalid start index: %d", s); \ - if (e < s || len < e) pic_errorf(pic, "invalid end index: %d", e); \ + if (s < 0 || len < s) pic_error(pic, "invalid start index", 1, pic_int_value(pic, s)); \ + if (e < s || len < e) pic_error(pic, "invalid end index", 1, pic_int_value(pic, e)); \ } while (0) -#define VALID_ATRANGE(pic, tolen, at, fromlen, s, e) do { \ - VALID_INDEX(pic, tolen, at); \ - VALID_RANGE(pic, fromlen, s, e); \ - if (tolen - at < e - s) pic_errorf(pic, "invalid range"); \ +#define VALID_ATRANGE(pic, tolen, at, fromlen, s, e) do { \ + VALID_INDEX(pic, tolen, at); \ + VALID_RANGE(pic, fromlen, s, e); \ + if (tolen - at < e - s) pic_error(pic, "invalid range", 0); \ } while (0) pic_value pic_make_identifier(pic_state *, pic_value id, pic_value env); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index c1266d77..b200b4cb 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -127,7 +127,7 @@ get_library(pic_state *pic, const char *lib) struct lib *libp; if ((libp = get_library_opt(pic, lib)) == NULL) { - pic_errorf(pic, "library not found: %s", lib); + pic_error(pic, "library not found", 1, pic_cstr_value(pic, lib)); } return libp; } @@ -175,7 +175,7 @@ pic_make_library(pic_state *pic, const char *lib) it = kh_put(ltable, h, pic_str(pic, name), &ret); if (ret == 0) { /* if exists */ - pic_errorf(pic, "library name already in use: %s", lib); + pic_error(pic, "library name already in use", pic_cstr_value(pic, lib)); } kh_val(h, it).name = pic_str_ptr(pic, name); @@ -223,7 +223,7 @@ pic_import(pic_state *pic, const char *lib) while (pic_dict_next(pic, pic_obj_value(libp->exports), &it, &name, &realname)) { uid = pic_find_identifier(pic, realname, pic_obj_value(libp->env)); if (! pic_weak_has(pic, pic->globals, uid) && ! pic_weak_has(pic, pic->macros, uid)) { - pic_errorf(pic, "attempted to export undefined variable '~s'", realname); + pic_error(pic, "attempted to export undefined variable", 1, realname); } pic_put_identifier(pic, name, uid, pic_obj_value(pic->lib->env)); } @@ -292,14 +292,14 @@ pic_lib_library_import(pic_state *pic) libp = get_library(pic, lib); if (! pic_dict_has(pic, pic_obj_value(libp->exports), name)) { - pic_errorf(pic, "library-import: variable is not exported '~s'", name); + pic_error(pic, "library-import: variable is not exported", 1, name); } else { realname = pic_dict_ref(pic, pic_obj_value(libp->exports), name); } uid = pic_find_identifier(pic, realname, pic_obj_value(libp->env)); if (! pic_weak_has(pic, pic->globals, uid) && ! pic_weak_has(pic, pic->macros, uid)) { - pic_errorf(pic, "attempted to export undefined variable '~s'", realname); + pic_error(pic, "attempted to export undefined variable", 1, realname); } pic_put_identifier(pic, alias, uid, pic_obj_value(pic->lib->env)); diff --git a/extlib/benz/number.c b/extlib/benz/number.c index 2c6d8d37..2ecbe2d9 100644 --- a/extlib/benz/number.c +++ b/extlib/benz/number.c @@ -59,7 +59,6 @@ pic_number_exact(pic_state *pic) pic_value \ name(pic_state *pic, pic_value a, pic_value b) \ { \ - PIC_NORETURN void pic_errorf(pic_state *, const char *, ...); \ double f; \ if (pic_int_p(pic, a) && pic_int_p(pic, b)) { \ f = (double)pic_int(pic, a) op (double)pic_int(pic, b); \ @@ -73,7 +72,7 @@ pic_number_exact(pic_state *pic) } else if (pic_float_p(pic, a) && pic_int_p(pic, b)) { \ return pic_float_value(pic, pic_float(pic, a) op pic_int(pic, b)); \ } else { \ - pic_errorf(pic, #name ": non-number operand given"); \ + pic_error(pic, #name ": non-number operand given", 0); \ } \ PIC_UNREACHABLE(); \ } @@ -87,7 +86,6 @@ pic_define_aop(pic_div, /, f == (int)f) bool \ name(pic_state *pic, pic_value a, pic_value b) \ { \ - PIC_NORETURN void pic_errorf(pic_state *, const char *, ...); \ if (pic_int_p(pic, a) && pic_int_p(pic, b)) { \ return pic_int(pic, a) op pic_int(pic, b); \ } else if (pic_float_p(pic, a) && pic_float_p(pic, b)) { \ @@ -97,7 +95,7 @@ pic_define_aop(pic_div, /, f == (int)f) } else if (pic_float_p(pic, a) && pic_int_p(pic, b)) { \ return pic_float(pic, a) op pic_int(pic, b); \ } else { \ - pic_errorf(pic, #name ": non-number operand given"); \ + pic_error(pic, #name ": non-number operand given", 0); \ } \ PIC_UNREACHABLE(); \ } @@ -165,10 +163,10 @@ DEFINE_AOP(mul, argv[0], do { return pic_int_value(pic, 1); } while (0)) DEFINE_AOP(sub, pic_sub(pic, pic_int_value(pic, 0), argv[0]), do { - pic_errorf(pic, "-: at least one argument required"); + pic_error(pic, "-: at least one argument required", 0); } while (0)) DEFINE_AOP(div, pic_div(pic, pic_int_value(pic, 1), argv[0]), do { - pic_errorf(pic, "/: at least one argument required"); + pic_error(pic, "/: at least one argument required", 0); } while (0)) static int @@ -224,7 +222,7 @@ pic_number_number_to_string(pic_state *pic) pic_get_args(pic, "F|i", &f, &e, &radix); if (radix < 2 || radix > 36) { - pic_errorf(pic, "number->string: invalid radix %d (between 2 and 36, inclusive)", radix); + pic_error(pic, "number->string: invalid radix (between 2 and 36, inclusive)", 1, pic_int_value(pic, radix)); } if (e) { diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index 4d6f474a..4e7c27b3 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -22,7 +22,7 @@ pic_value pic_car(pic_state *pic, pic_value obj) { if (! pic_pair_p(pic, obj)) { - pic_errorf(pic, "car: pair required, but got ~s", obj); + pic_error(pic, "car: pair required", 1, obj); } return pic_pair_ptr(pic, obj)->car; } @@ -31,7 +31,7 @@ pic_value pic_cdr(pic_state *pic, pic_value obj) { if (! pic_pair_p(pic, obj)) { - pic_errorf(pic, "cdr: pair required, but got ~s", obj); + pic_error(pic, "cdr: pair required", 1, obj); } return pic_pair_ptr(pic, obj)->cdr; } @@ -40,7 +40,7 @@ void pic_set_car(pic_state *pic, pic_value obj, pic_value val) { if (! pic_pair_p(pic, obj)) { - pic_errorf(pic, "pair required"); + pic_error(pic, "pair required", 0); } pic_pair_ptr(pic, obj)->car = val; } @@ -49,7 +49,7 @@ void pic_set_cdr(pic_state *pic, pic_value obj, pic_value val) { if (! pic_pair_p(pic, obj)) { - pic_errorf(pic, "pair required"); + pic_error(pic, "pair required", 0); } pic_pair_ptr(pic, obj)->cdr = val; } @@ -171,15 +171,10 @@ pic_length(pic_state *pic, pic_value obj) { int c = 0; - if (! pic_list_p(pic, obj)) { - pic_errorf(pic, "length: expected list, but got ~s", obj); - } - while (! pic_nil_p(pic, obj)) { obj = pic_cdr(pic, obj); ++c; } - return c; } @@ -477,7 +472,7 @@ pic_pair_map(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &args); if (argc == 0) - pic_errorf(pic, "map: wrong number of arguments (1 for at least 2)"); + pic_error(pic, "map: wrong number of arguments (1 for at least 2)", 0); arg_list = pic_alloca(pic, sizeof(pic_value) * argc); diff --git a/extlib/benz/port.c b/extlib/benz/port.c index a0c70e6a..f4d80092 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -36,7 +36,7 @@ pic_close_port(pic_state *pic, pic_value port) return; } if (xfclose(pic, file) == EOF) { - pic_errorf(pic, "close-port: failure"); + pic_error(pic, "close-port: failure", 0); } } @@ -123,13 +123,13 @@ pic_port_close_port(pic_state *pic) if ((pic_fileno(pic, port)->flag & (flags)) != (flags)) { \ switch (flags) { \ case X_WRITE: \ - pic_errorf(pic, caller ": expected output port"); \ + pic_error(pic, caller ": output port required", 0); \ case X_READ: \ - pic_errorf(pic, caller ": expected input port"); \ + pic_error(pic, caller ": input port required", 0); \ } \ } \ if (pic_fileno(pic, port)->flag == 0) { \ - pic_errorf(pic, caller ": expected open port"); \ + pic_error(pic, caller ": open port required", 0); \ } \ } while (0) @@ -164,7 +164,7 @@ pic_port_get_output_bytevector(pic_state *pic) assert_port_profile(port, X_WRITE, "get-output-bytevector"); if (xfget_buf(pic, pic_fileno(pic, port), &buf, &len) < 0) { - pic_errorf(pic, "port was not created by open-output-bytevector"); + pic_error(pic, "port was not created by open-output-bytevector", 0); } return pic_blob_value(pic, (unsigned char *)buf, len); } diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index 570f1730..66061ade 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -10,6 +10,16 @@ #define MIN(x,y) ((x) < (y) ? (x) : (y)) +PIC_NORETURN static void +arg_error(pic_state *pic, int actual, bool varg, int expected) +{ + const char *msg; + + msg = pic_str(pic, pic_strf_value(pic, "wrong number of arguments (%d for %s%d)", actual, (varg ? "at least " : ""), expected)); + + pic_error(pic, msg, 0); +} + #define GET_OPERAND(pic,n) ((pic)->ci->fp[(n)]) /** @@ -80,7 +90,7 @@ pic_get_args(pic_state *pic, const char *format, ...) } if (argc < paramc || (paramc + optc < argc && ! rest)) { - pic_errorf(pic, "pic_get_args: wrong number of arguments (%d for %s%d)", argc, rest? "at least " : "", paramc); + arg_error(pic, argc, rest, paramc); } va_start(ap, format); @@ -121,7 +131,9 @@ pic_get_args(pic_state *pic, const char *format, ...) *data = pic_data(pic, v); } else { - pic_errorf(pic, "pic_get_args: expected data type \"%s\", but got ~s", type->type_name, v); + const char *msg; + msg = pic_str(pic, pic_strf_value(pic, "pic_get_args: data type \"%s\" required", type->type_name)); + pic_error(pic, msg, 1, v); } break; } @@ -139,7 +151,7 @@ pic_get_args(pic_state *pic, const char *format, ...) if (buf) *buf = tmp; } else { - pic_errorf(pic, "pic_get_args: expected bytevector, but got ~s", v); + pic_error(pic, "pic_get_args: bytevector required", 1, v); } break; } @@ -155,16 +167,16 @@ pic_get_args(pic_state *pic, const char *format, ...) \ v = GET_OPERAND(pic, i); \ switch (pic_type(pic, v)) { \ - case PIC_TYPE_FLOAT: \ + case PIC_TYPE_FLOAT: \ *n = pic_float(pic, v); \ *e = false; \ break; \ - case PIC_TYPE_INT: \ + case PIC_TYPE_INT: \ *n = pic_int(pic, v); \ *e = true; \ break; \ default: \ - pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); \ + pic_error(pic, "pic_get_args: float or int required", 1, v); \ } \ break; \ } @@ -183,7 +195,7 @@ pic_get_args(pic_state *pic, const char *format, ...) *ptr = conv; \ } \ else { \ - pic_errorf(pic, "pic_get_args: expected " #type ", but got ~s", v); \ + pic_error(pic, "pic_get_args: " #type " required", 1, v); \ } \ break; \ } @@ -202,7 +214,7 @@ pic_get_args(pic_state *pic, const char *format, ...) OBJ_CASE('r', rec) default: - pic_errorf(pic, "pic_get_args: invalid argument specifier '%c' given", c); + pic_error(pic, "pic_get_args: invalid argument specifier given", 1, pic_char_value(pic, c)); } if (format[1] == '+') { @@ -232,11 +244,11 @@ vm_gref(pic_state *pic, pic_value uid) pic_value val; if (! pic_weak_has(pic, pic->globals, uid)) { - pic_errorf(pic, "undefined variable ~s", uid); + pic_error(pic, "undefined variable", 1, uid); } val = pic_weak_ref(pic, pic->globals, uid);; if (pic_invalid_p(pic, val)) { - pic_errorf(pic, "uninitialized global variable: ~s", uid); + pic_error(pic, "uninitialized global variable", 1, uid); } return val; } @@ -245,7 +257,7 @@ static void vm_gset(pic_state *pic, pic_value uid, pic_value value) { if (! pic_weak_has(pic, pic->globals, uid)) { - pic_errorf(pic, "undefined variable ~s", uid); + pic_error(pic, "undefined variable", 1, uid); } pic_weak_set(pic, pic->globals, uid, value); } @@ -488,7 +500,7 @@ pic_apply(pic_state *pic, pic_value proc, int argc, pic_value *argv) L_CALL: x = pic->sp[-c.a]; if (! pic_proc_p(pic, x)) { - pic_errorf(pic, "invalid application: ~s", x); + pic_error(pic, "invalid application", 1, x); } proc = pic_proc_ptr(pic, x); @@ -521,7 +533,7 @@ pic_apply(pic_state *pic, pic_value proc, int argc, pic_value *argv) ci->irep = irep; if (ci->argc != irep->argc) { if (! (irep->varg && ci->argc >= irep->argc)) { - pic_errorf(pic, "wrong number of arguments (%d for %s%d)", ci->argc - 1, (irep->varg ? "at least " : ""), irep->argc - 1); + arg_error(pic, ci->argc - 1, irep->varg, irep->argc - 1); } } /* prepare rest args */ @@ -909,7 +921,7 @@ pic_closure_ref(pic_state *pic, int n) assert(pic_func_p(self)); if (n < 0 || pic_proc_ptr(pic, self)->u.f.localc <= n) { - pic_errorf(pic, "pic_closure_ref: index out of range (%d)", n); + pic_error(pic, "pic_closure_ref: index out of range", 1, pic_int_value(pic, n)); } return pic_proc_ptr(pic, self)->locals[n]; } @@ -922,7 +934,7 @@ pic_closure_set(pic_state *pic, int n, pic_value v) assert(pic_func_p(self)); if (n < 0 || pic_proc_ptr(pic, self)->u.f.localc <= n) { - pic_errorf(pic, "pic_closure_ref: index out of range (%d)", n); + pic_error(pic, "pic_closure_ref: index out of range", 1, pic_int_value(pic, n)); } pic_proc_ptr(pic, self)->locals[n] = v; } @@ -1019,7 +1031,7 @@ pic_proc_apply(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &args); if (argc == 0) { - pic_errorf(pic, "apply: wrong number of arguments"); + pic_error(pic, "apply: wrong number of arguments", 0); } n = argc - 1 + pic_length(pic, args[argc - 1]); diff --git a/extlib/benz/string.c b/extlib/benz/string.c index 75a703db..d08f6178 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -276,7 +276,7 @@ pic_str_ref(pic_state *pic, pic_value str, int i) c = rope_at(pic_str_ptr(pic, str)->rope, i); if (c == -1) { - pic_errorf(pic, "index out of range %d", i); + pic_error(pic, "index out of range", 1, pic_int_value(pic, i)); } return (char)c; } @@ -453,7 +453,7 @@ pic_str_make_string(pic_state *pic) pic_get_args(pic, "i|c", &len, &c); if (len < 0) { - pic_errorf(pic, "make-string: negative length given %d", len); + pic_error(pic, "make-string: negative length given", 1, pic_int_value(pic, len)); } buf = pic_alloca(pic, len); @@ -647,7 +647,7 @@ pic_str_string_map(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &argv); if (argc == 0) { - pic_errorf(pic, "string-map: one or more strings expected, but got zero"); + pic_error(pic, "string-map: one or more strings expected, but got zero", 0); } len = INT_MAX; @@ -684,7 +684,7 @@ pic_str_string_for_each(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &argv); if (argc == 0) { - pic_errorf(pic, "string-map: one or more strings expected, but got zero"); + pic_error(pic, "string-map: one or more strings expected, but got zero", 0); } len = INT_MAX; diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index cff34df8..f67f7593 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -146,7 +146,7 @@ pic_symbol_identifier_base(pic_state *pic) pic_assert_type(pic, id, id); if (pic_sym_p(pic, id)) { - pic_errorf(pic, "expected non-symbol identifier, but got symbol ~s", id); + pic_error(pic, "non-symbol identifier required", 1, id); } return pic_obj_value(pic_id_ptr(pic, id)->u.id); @@ -162,7 +162,7 @@ pic_symbol_identifier_environment(pic_state *pic) pic_assert_type(pic, id, id); if (pic_sym_p(pic, id)) { - pic_errorf(pic, "expected non-symbol identifier, but got symbol ~s", id); + pic_error(pic, "non-symbol identifier required", 1, id); } return pic_obj_value(pic_id_ptr(pic, id)->env); diff --git a/extlib/benz/value.c b/extlib/benz/value.c index a41d7d52..32b17d65 100644 --- a/extlib/benz/value.c +++ b/extlib/benz/value.c @@ -256,6 +256,6 @@ pic_typename(pic_state *pic, int type) case PIC_TYPE_CP: return "checkpoint"; default: - pic_errorf(pic, "pic_typename: invalid type given %d", type); + pic_error(pic, "pic_typename: invalid type given", 1, pic_int_value(pic, type)); } } diff --git a/extlib/benz/vector.c b/extlib/benz/vector.c index 978cfeb1..781d138a 100644 --- a/extlib/benz/vector.c +++ b/extlib/benz/vector.c @@ -73,7 +73,7 @@ pic_vec_make_vector(pic_state *pic) n = pic_get_args(pic, "i|o", &k, &init); if (k < 0) { - pic_errorf(pic, "make-vector: negative length given %d", k); + pic_error(pic, "make-vector: negative length given", 1, pic_int_value(pic, k)); } vec = pic_make_vec(pic, k, NULL); @@ -231,7 +231,7 @@ pic_vec_vector_map(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &argv); if (argc == 0) { - pic_errorf(pic, "vector-map: wrong number of arguments (1 for at least 2)"); + pic_error(pic, "vector-map: wrong number of arguments (1 for at least 2)", 0); } len = INT_MAX; @@ -265,7 +265,7 @@ pic_vec_vector_for_each(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &argv); if (argc == 0) { - pic_errorf(pic, "vector-for-each: wrong number of arguments (1 for at least 2)"); + pic_error(pic, "vector-for-each: wrong number of arguments (1 for at least 2)", 0); } len = INT_MAX; diff --git a/extlib/benz/weak.c b/extlib/benz/weak.c index 3064873c..722d153b 100644 --- a/extlib/benz/weak.c +++ b/extlib/benz/weak.c @@ -27,7 +27,7 @@ pic_weak_ref(pic_state *pic, pic_value weak, pic_value key) it = kh_get(weak, h, pic_obj_ptr(key)); if (it == kh_end(h)) { - pic_errorf(pic, "element not found for a key: ~s", key); + pic_error(pic, "element not found for given key", 1, key); } return kh_val(h, it); } @@ -59,7 +59,7 @@ pic_weak_del(pic_state *pic, pic_value weak, pic_value key) it = kh_get(weak, h, pic_obj_ptr(key)); if (it == kh_end(h)) { - pic_errorf(pic, "no slot named ~s found in ephemeron", key); + pic_error(pic, "element not found for given key", 1, key); } kh_del(weak, h, it); } @@ -74,7 +74,7 @@ weak_call(pic_state *pic) n = pic_get_args(pic, "o|o", &key, &val); if (! pic_obj_p(pic, key)) { - pic_errorf(pic, "attempted to set a non-object key '~s' in an ephemeron", key); + pic_error(pic, "attempted to set a non-object key", 1, key); } weak = pic_closure_ref(pic, 0);