unify more cases
This commit is contained in:
		
							parent
							
								
									210fecab3f
								
							
						
					
					
						commit
						333813d0ba
					
				
							
								
								
									
										106
									
								
								extlib/benz/vm.c
								
								
								
								
							
							
						
						
									
										106
									
								
								extlib/benz/vm.c
								
								
								
								
							|  | @ -102,82 +102,36 @@ pic_get_args(pic_state *pic, const char *format, ...) | |||
|       *p = GET_OPERAND(pic,i); | ||||
|       break; | ||||
|     } | ||||
|     case 'f': case 'F': { | ||||
|       double *f; | ||||
|       bool *e, dummy; | ||||
|       pic_value v; | ||||
| 
 | ||||
|       f = va_arg(ap, double *); | ||||
|       e = (c == 'F' ? va_arg(ap, bool *) : &dummy); | ||||
| 
 | ||||
|       v = GET_OPERAND(pic, i); | ||||
|       switch (pic_type(v)) { | ||||
|       case PIC_TT_FLOAT: | ||||
|         *f = pic_float(v); | ||||
|         *e = false; | ||||
|         break; | ||||
|       case PIC_TT_INT: | ||||
|         *f = pic_int(v); | ||||
|         *e = true; | ||||
|         break; | ||||
|       default: | ||||
|         pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); | ||||
| #define NUM_CASE(c1, c2, ctype)                                         \ | ||||
|       case c1: case c2: {                                               \ | ||||
|         ctype *n;                                                       \ | ||||
|         bool *e, dummy;                                                 \ | ||||
|         pic_value v;                                                    \ | ||||
|                                                                         \ | ||||
|         n = va_arg(ap, ctype *);                                        \ | ||||
|         e = (c == c2 ? va_arg(ap, bool *) : &dummy);                    \ | ||||
|                                                                         \ | ||||
|         v = GET_OPERAND(pic, i);                                        \ | ||||
|         switch (pic_type(v)) {                                          \ | ||||
|         case PIC_TT_FLOAT:                                              \ | ||||
|           *n = pic_float(v);                                            \ | ||||
|           *e = false;                                                   \ | ||||
|           break;                                                        \ | ||||
|         case PIC_TT_INT:                                                \ | ||||
|           *n = pic_int(v);                                              \ | ||||
|           *e = true;                                                    \ | ||||
|           break;                                                        \ | ||||
|         default:                                                        \ | ||||
|           pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); \ | ||||
|         }                                                               \ | ||||
|         break;                                                          \ | ||||
|       } | ||||
|       break; | ||||
|     } | ||||
|     case 'i': case 'I': { | ||||
|       int *k; | ||||
|       bool *e, dummy; | ||||
|       pic_value v; | ||||
| 
 | ||||
|       k = va_arg(ap, int *); | ||||
|       e = (c == 'I' ? va_arg(ap, bool *) : &dummy); | ||||
|     NUM_CASE('i', 'I', int) | ||||
|     NUM_CASE('f', 'F', double) | ||||
| 
 | ||||
|       v = GET_OPERAND(pic, i); | ||||
|       switch (pic_type(v)) { | ||||
|       case PIC_TT_FLOAT: | ||||
|         *k = pic_float(v); | ||||
|         *e = false; | ||||
|         break; | ||||
|       case PIC_TT_INT: | ||||
|         *k = pic_int(v); | ||||
|         *e = true; | ||||
|         break; | ||||
|       default: | ||||
|         pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); | ||||
|       } | ||||
|       break; | ||||
|     } | ||||
|     case 'c': { | ||||
|       char *k; | ||||
|       pic_value v; | ||||
| 
 | ||||
|       k = va_arg(ap, char *); | ||||
|       v = GET_OPERAND(pic,i); | ||||
|       if (pic_char_p(v)) { | ||||
|         *k = pic_char(v); | ||||
|       } | ||||
|       else { | ||||
|         pic_errorf(pic, "pic_get_args: expected char, but got ~s", v); | ||||
|       } | ||||
|       break; | ||||
|     } | ||||
|     case 'z': { | ||||
|       const char **cstr; | ||||
|       pic_value v; | ||||
| 
 | ||||
|       cstr = va_arg(ap, const char **); | ||||
|       v = GET_OPERAND(pic,i); | ||||
|       if (pic_str_p(v)) { | ||||
|         *cstr = pic_str_cstr(pic, pic_str_ptr(v)); | ||||
|       } | ||||
|       else { | ||||
|         pic_errorf(pic, "pic_get_args: expected string, but got ~s", v); | ||||
|       } | ||||
|       break; | ||||
|     } | ||||
| 
 | ||||
| #define PTR_CASE(c, type, ctype)                                        \ | ||||
| #define VAL_CASE(c, type, ctype, conv)                                  \ | ||||
|       case c: {                                                         \ | ||||
|         ctype *ptr;                                                     \ | ||||
|         pic_value v;                                                    \ | ||||
|  | @ -185,7 +139,7 @@ pic_get_args(pic_state *pic, const char *format, ...) | |||
|         ptr = va_arg(ap, ctype *);                                      \ | ||||
|         v = GET_OPERAND(pic, i);                                        \ | ||||
|         if (pic_## type ##_p(v)) {                                      \ | ||||
|           *ptr = pic_## type ##_ptr(v);                                 \ | ||||
|           *ptr = conv;                                                  \ | ||||
|         }                                                               \ | ||||
|         else {                                                          \ | ||||
|           pic_errorf(pic, "pic_get_args: expected " #type ", but got ~s", v); \ | ||||
|  | @ -193,6 +147,12 @@ pic_get_args(pic_state *pic, const char *format, ...) | |||
|         break;                                                          \ | ||||
|       } | ||||
| 
 | ||||
|     VAL_CASE('c', char, char, pic_char(v)) | ||||
|     VAL_CASE('z', str, const char *, pic_str_cstr(pic, pic_str_ptr(v))) | ||||
| 
 | ||||
| #define PTR_CASE(c, type, ctype)                        \ | ||||
|       VAL_CASE(c, type, ctype, pic_## type ##_ptr(v)) | ||||
| 
 | ||||
|     PTR_CASE('s', str, pic_str *) | ||||
|     PTR_CASE('m', sym, pic_sym *) | ||||
|     PTR_CASE('v', vec, pic_vec *) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki