level--;
break;
case '#':
+ case '&':
case ',':
case ':':
case ' ':
case 'f':
case 'd':
- return newfloatobject((double)va_arg(*p_va, double));
+ return newfloatobject((double)va_arg(*p_va, va_double));
case 'c':
{
case 'S':
case 'O':
- {
+ if (**p_format == '&') {
+ typedef object *(*converter)(void *);
+ converter func = va_arg(*p_va, converter);
+ void *arg = va_arg(*p_va, void *);
+ ++*p_format;
+ return (*func)(arg);
+ }
+ else {
object *v;
v = va_arg(*p_va, object *);
if (v != NULL)