/**************************************************************** obj の ivname というインスタンス変数に *cval を代入する ivname が NULL の場合は、obj を配列とみなし、push する cval から ruby VALUE への変換ヒントは fmt で与える。 ****************************************************************/ int cp_set1(VALUE obj, char *fmt, char *ivname, void *cval) { char at_name[100]; int len, c; VALUE val; switch (*fmt){ case 'b': dprintf(("converting %d into BOOL\n", *(int*)cval)); val = (*(int*)cval ? TRUE : FALSE); len = sizeof(int); break; case 'c': dprintf(("converting %d into uchar\n", *(unsigned char*)cval)); val = INT2FIX(*(unsigned char *)cval); len = sizeof(unsigned char); break; case 'i': dprintf(("converting %d into FIXNUM\n", *(int*)cval)); val = INT2FIX(*(int*)cval); len = sizeof(int); break; case 't': dprintf(("converting %d into Time\n", ((struct tm*)cval)->tm_year)); val = TM2TIME((struct tm*)cval); len = sizeof(struct tm); break; case 's': dprintf(("converting into String\n")); if ((c = atoi(fmt + 1)) > 0){ val = str_new2((char*)cval != NULL ? (char*)cval : ""); len = sizeof(char) * c; } else { val = str_new2(*(char**)cval != NULL ? *(char**)cval : ""); len = sizeof(char*); } break; case 'v': dprintf(("converting %d into VALUE\n", (VALUE*)cval)); val = *(VALUE*)cval; len = sizeof(VALUE); break; default: TypeError(ivname != NULL ? ivname : "???"); } if (ivname == NULL) { Check_Type(obj, T_ARRAY); ary_push(obj, val); } else { iv_conv_name(ivname, at_name); rb_iv_set(obj, at_name, val); } return len; }
void toi_set_argv(int argc, char **argv) { int i; VALUE ary = ary_new(); for (i = 0; i < argc; i++) ary_push(ary, string_new(argv[i])); define_global_variable(intern("ARGV"), ary); }
VALUE ary_copy(VALUE dst, VALUE src) { int i; Check_Type(src, T_ARRAY); Check_Type(dst, T_ARRAY); for (i = 0; i < RARRAY(src)->len; i++){ ary_push(dst, RARRAY(src)->ptr[i]); } return dst; }