void pic_error(pic_state *pic, const char *msg, pic_value irrs) { struct pic_error *e; e = pic_make_error(pic, pic_intern(pic, ""), msg, irrs); pic_raise(pic, pic_obj_value(e)); }
static pic_value pic_error_raise(pic_state *pic) { pic_value v; pic_get_args(pic, "o", &v); pic_raise(pic, v); }
void pic_throw(pic_state *pic, pic_sym *type, const char *msg, pic_value irrs) { struct pic_error *e; e = pic_make_error(pic, type, msg, irrs); pic_raise(pic, pic_obj_value(e)); }
PIC_NORETURN static void file_error(pic_state *pic, const char *msg) { struct pic_error *e; e = pic_make_error(pic, pic_intern(pic, "file"), msg, pic_nil_value()); pic_raise(pic, pic_obj_value(e)); }
static pic_value pic_error_error(pic_state *pic) { const char *str; int argc; pic_value *argv; pic_get_args(pic, "z*", &str, &argc, &argv); pic_raise(pic, pic_make_error(pic, "", str, pic_make_list(pic, argc, argv))); }
void pic_error(pic_state *pic, const char *msg, int n, ...) { va_list ap; pic_value irrs; va_start(ap, n); irrs = pic_vlist(pic, n, ap); va_end(ap); pic_raise(pic, pic_make_error(pic, "", msg, irrs)); }
void pic_load_cstr(pic_state *pic, const char *src) { struct pic_port *port = pic_open_input_string(pic, src); pic_try { pic_load(pic, port); } pic_catch { pic_close_port(pic, port); pic_raise(pic, pic->err); } pic_close_port(pic, port); }
static pic_value pic_str_string_map(pic_state *pic) { struct pic_proc *proc; pic_value *argv, vals, val; int argc, i, len, j; pic_str *str; char *buf; pic_get_args(pic, "l*", &proc, &argc, &argv); if (argc == 0) { pic_errorf(pic, "string-map: one or more strings expected, but got zero"); } else { pic_assert_type(pic, argv[0], str); len = pic_str_len(pic_str_ptr(argv[0])); } for (i = 1; i < argc; ++i) { pic_assert_type(pic, argv[i], str); len = len < pic_str_len(pic_str_ptr(argv[i])) ? len : pic_str_len(pic_str_ptr(argv[i])); } buf = pic_malloc(pic, len); pic_try { for (i = 0; i < len; ++i) { vals = pic_nil_value(); for (j = 0; j < argc; ++j) { pic_push(pic, pic_char_value(pic_str_ref(pic, pic_str_ptr(argv[j]), i)), vals); } val = pic_apply_list(pic, proc, vals); pic_assert_type(pic, val, char); buf[i] = pic_char(val); } str = pic_make_str(pic, buf, len); } pic_catch { pic_free(pic, buf); pic_raise(pic, pic->err); } pic_free(pic, buf); return pic_obj_value(str); }
NORETURN static pic_value pic_error_error(pic_state *pic) { char *str; int len; size_t argc; pic_value *argv; struct pic_error *e; pic_get_args(pic, "s*", &str, &len, &argc, &argv); e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR); e->type = PIC_ERROR_OTHER; e->msg = pic_strdup(pic, str); e->irrs = pic_list_from_array(pic, argc, argv); pic_raise(pic, pic_obj_value(e)); }