/* * call-seq: * fis[name] -> field_info * fis[number] -> field_info * * Get the FieldInfo object. FieldInfo objects can be referenced by either * their field-number of the field-name (which must be a symbol). For * example; * * fi = fis[:name] * fi = fis[2] */ static VALUE frt_fis_get(VALUE self, VALUE ridx) { FieldInfos *fis = (FieldInfos *)DATA_PTR(self); VALUE rfi = Qnil; switch (TYPE(ridx)) { case T_FIXNUM: { int index = FIX2INT(ridx); if (index < 0) index += fis->size; if (index < 0 || index >= fis->size) { rb_raise(rb_eArgError, "index of %d is out of range (0..%d)\n", index, fis->size); } rfi = frt_get_field_info(fis->fields[index]); break; } case T_SYMBOL: rfi = frt_get_field_info(fis_get_field(fis, frt_field(ridx))); break; case T_STRING: rfi = frt_get_field_info(fis_get_field(fis, StringValuePtr(ridx))); break; default: rb_raise(rb_eArgError, "Can't index FieldInfos with %s", RSTRING(rb_obj_as_string(ridx))->ptr); break; } return rfi; }