Commit 216a846b authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

mrb_get_args should honor optinal arguments

parent 324de1a0
...@@ -396,8 +396,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -396,8 +396,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
case '|': case '*': case '&': case '|': case '*': case '&':
break; break;
default: default:
if (argc <= i) { if (argc <= i && !opt) {
if (opt) continue;
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
} }
} }
...@@ -408,8 +407,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -408,8 +407,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_value *p; mrb_value *p;
p = va_arg(ap, mrb_value*); p = va_arg(ap, mrb_value*);
*p = *sp; if (i < argc) {
i++; sp++; *p = *sp++;
i++;
}
} }
break; break;
case 'S': case 'S':
...@@ -417,8 +418,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -417,8 +418,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_value *p; mrb_value *p;
p = va_arg(ap, mrb_value*); p = va_arg(ap, mrb_value*);
*p = to_str(mrb, *sp); if (i < argc) {
i++; sp++; *p = to_str(mrb, *sp++);
i++;
}
} }
break; break;
case 'A': case 'A':
...@@ -426,8 +429,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -426,8 +429,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_value *p; mrb_value *p;
p = va_arg(ap, mrb_value*); p = va_arg(ap, mrb_value*);
*p = to_ary(mrb, *sp); if (i < argc) {
i++; sp++; *p = to_ary(mrb, *sp++);
i++;
}
} }
break; break;
case 'H': case 'H':
...@@ -435,8 +440,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -435,8 +440,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_value *p; mrb_value *p;
p = va_arg(ap, mrb_value*); p = va_arg(ap, mrb_value*);
*p = to_hash(mrb, *sp); if (i < argc) {
i++; sp++; *p = to_hash(mrb, *sp++);
i++;
}
} }
break; break;
case 's': case 's':
...@@ -446,13 +453,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -446,13 +453,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
char **ps = 0; char **ps = 0;
int *pl = 0; int *pl = 0;
ss = to_str(mrb, *sp);
s = mrb_str_ptr(ss);
ps = va_arg(ap, char**); ps = va_arg(ap, char**);
*ps = s->ptr;
pl = va_arg(ap, int*); pl = va_arg(ap, int*);
*pl = s->len; if (i < argc) {
i++; sp++; ss = to_str(mrb, *sp++);
s = mrb_str_ptr(ss);
*ps = s->ptr;
*pl = s->len;
i++;
}
} }
break; break;
case 'z': case 'z':
...@@ -461,14 +470,16 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -461,14 +470,16 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
struct RString *s; struct RString *s;
char **ps; char **ps;
ss = to_str(mrb, *sp);
s = mrb_str_ptr(ss);
if (strlen(s->ptr) != s->len) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL");
}
ps = va_arg(ap, char**); ps = va_arg(ap, char**);
*ps = s->ptr; if (i < argc) {
i++; sp++; ss = to_str(mrb, *sp++);
s = mrb_str_ptr(ss);
if (strlen(s->ptr) != s->len) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL");
}
*ps = s->ptr;
i++;
}
} }
break; break;
case 'a': case 'a':
...@@ -478,13 +489,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -478,13 +489,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_value **pb; mrb_value **pb;
int *pl; int *pl;
aa = to_ary(mrb, *sp);
a = mrb_ary_ptr(aa);
pb = va_arg(ap, mrb_value**); pb = va_arg(ap, mrb_value**);
*pb = a->ptr;
pl = va_arg(ap, int*); pl = va_arg(ap, int*);
*pl = a->len; if (i < argc) {
i++; sp++; aa = to_ary(mrb, *sp++);
a = mrb_ary_ptr(aa);
*pb = a->ptr;
*pl = a->len;
i++;
}
} }
break; break;
case 'f': case 'f':
...@@ -492,26 +505,29 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -492,26 +505,29 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_float *p; mrb_float *p;
p = va_arg(ap, mrb_float*); p = va_arg(ap, mrb_float*);
switch (sp->tt) { if (i < argc) {
case MRB_TT_FLOAT: switch (sp->tt) {
*p = mrb_float(*sp); case MRB_TT_FLOAT:
break; *p = mrb_float(*sp);
case MRB_TT_FIXNUM: break;
*p = (mrb_float)mrb_fixnum(*sp); case MRB_TT_FIXNUM:
break; *p = (mrb_float)mrb_fixnum(*sp);
case MRB_TT_FALSE: break;
*p = 0.0; case MRB_TT_FALSE:
break; *p = 0.0;
default: break;
{ default:
mrb_value tmp; {
mrb_value tmp;
tmp = mrb_convert_type(mrb, *sp, MRB_TT_FLOAT, "Float", "to_f");
*p = mrb_float(tmp); tmp = mrb_convert_type(mrb, *sp, MRB_TT_FLOAT, "Float", "to_f");
*p = mrb_float(tmp);
}
break;
} }
break; sp++;
} i++;
i++; sp++; }
} }
break; break;
case 'i': case 'i':
...@@ -519,26 +535,29 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -519,26 +535,29 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_int *p; mrb_int *p;
p = va_arg(ap, mrb_int*); p = va_arg(ap, mrb_int*);
switch (sp->tt) { if (i < argc) {
case MRB_TT_FIXNUM: switch (sp->tt) {
*p = mrb_fixnum(*sp); case MRB_TT_FIXNUM:
break; *p = mrb_fixnum(*sp);
case MRB_TT_FLOAT: break;
*p = (mrb_int)mrb_float(*sp); case MRB_TT_FLOAT:
break; *p = (mrb_int)mrb_float(*sp);
case MRB_TT_FALSE: break;
*p = 0; case MRB_TT_FALSE:
break; *p = 0;
default: break;
{ default:
mrb_value tmp; {
mrb_value tmp;
tmp = mrb_convert_type(mrb, *sp, MRB_TT_FIXNUM, "Integer", "to_int");
*p = mrb_fixnum(tmp); tmp = mrb_convert_type(mrb, *sp, MRB_TT_FIXNUM, "Integer", "to_int");
*p = mrb_fixnum(tmp);
}
break;
} }
break; sp++;
} i++;
i++; sp++; }
} }
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment