/** * Convert a Ruby Hash to a maps * * @param t the Ruby Hash to convert * @return a new maps */ maps* mapsFromRubyHash(VALUE t){ maps* res=NULL; maps* cursor=res; VALUE list; list = rb_ary_new(); typedef int (*HOOK)(...); rb_hash_foreach(t, reinterpret_cast<HOOK>(keys_i), list); int nb=rb_hash_size(t); int i; for(i=0;i<FIX2INT(nb);i++){ VALUE key=rb_ary_pop(list); VALUE value=rb_hash_aref(t,key); #ifdef DEBUG fprintf(stderr,">> DEBUG VALUES : %s => %s\n", StringValueCStr(key),StringValueCStr(value)); #endif cursor=createMaps(StringValueCStr(key)); cursor->content=mapFromRubyHash(value); if(res==NULL) res=dupMaps(&cursor); else addMapsToMaps(&res,cursor); freeMaps(&cursor); free(cursor); } return res; }
/* rb_hash_size is a static symbol in MRI */ VALUE hash_spec_rb_hash_size(VALUE self, VALUE hash) { return rb_hash_size(hash); }