add error function
This commit is contained in:
		
							parent
							
								
									7972c5636a
								
							
						
					
					
						commit
						d4188e0969
					
				|  | @ -7,6 +7,7 @@ pic_value pic_cdr(pic_state *, pic_value); | |||
| 
 | ||||
| bool pic_list_p(pic_state *, pic_value); | ||||
| pic_value pic_list(pic_state *, size_t, ...); | ||||
| pic_value pic_list_from_array(pic_state *, size_t, pic_value *); | ||||
| 
 | ||||
| int pic_length(pic_state *, pic_value); | ||||
| pic_value pic_reverse(pic_state *, pic_value); | ||||
|  |  | |||
							
								
								
									
										26
									
								
								src/error.c
								
								
								
								
							
							
						
						
									
										26
									
								
								src/error.c
								
								
								
								
							|  | @ -1,7 +1,9 @@ | |||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| #include "picrin.h" | ||||
| #include "picrin/pair.h" | ||||
| #include "picrin/proc.h" | ||||
| #include "picrin/error.h" | ||||
| 
 | ||||
|  | @ -25,7 +27,8 @@ pic_errorf(pic_state *pic, const char *msg, size_t n, ...) | |||
| void | ||||
| pic_abort(pic_state *pic, const char *msg) | ||||
| { | ||||
|   puts(msg); | ||||
|   fprintf(stderr, "abort: %s\n", msg); | ||||
|   fflush(stderr); | ||||
|   abort(); | ||||
| } | ||||
| 
 | ||||
|  | @ -114,6 +117,26 @@ pic_error_raise_continuable(pic_state *pic) | |||
|   return a; | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
| pic_error_error(pic_state *pic) | ||||
| { | ||||
|   char *str; | ||||
|   int len, 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 = strdup(str); | ||||
|   e->irrs = pic_list_from_array(pic, argc, argv); | ||||
| 
 | ||||
|   pic_raise(pic, pic_obj_value(e)); | ||||
| 
 | ||||
|   /* never returns */ | ||||
|   return pic_undef_value(); | ||||
| } | ||||
| static pic_value | ||||
| pic_error_error_object_p(pic_state *pic) | ||||
| { | ||||
|  | @ -182,6 +205,7 @@ pic_init_error(pic_state *pic) | |||
|   pic_defun(pic, "with-exception-handler", pic_error_with_exception_handler); | ||||
|   pic_defun(pic, "raise", pic_error_raise); | ||||
|   pic_defun(pic, "raise-continuable", pic_error_raise_continuable); | ||||
|   pic_defun(pic, "error", pic_error_error); | ||||
|   pic_defun(pic, "error-object?", pic_error_error_object_p); | ||||
|   pic_defun(pic, "error-object-message", pic_error_error_object_message); | ||||
|   pic_defun(pic, "error-object-irritants", pic_error_error_object_irritants); | ||||
|  |  | |||
							
								
								
									
										13
									
								
								src/pair.c
								
								
								
								
							
							
						
						
									
										13
									
								
								src/pair.c
								
								
								
								
							|  | @ -67,6 +67,19 @@ pic_list(pic_state *pic, size_t c, ...) | |||
|   return pic_reverse(pic, v); | ||||
| } | ||||
| 
 | ||||
| pic_value | ||||
| pic_list_from_array(pic_state *pic, size_t c, pic_value *vs) | ||||
| { | ||||
|   pic_value v; | ||||
|   int i; | ||||
| 
 | ||||
|   v = pic_nil_value(); | ||||
|   for (i = 0; i < c; ++i) { | ||||
|     v = pic_cons(pic, vs[i], v); | ||||
|   } | ||||
|   return pic_reverse(pic, v); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| pic_length(pic_state *pic, pic_value obj) | ||||
| { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki