tnf_int32_t tnf_get_int32(tnf_datum_t datum) { CHECK_SCALAR(datum); /* LINTED pointer cast may result in improper alignment */ return (_GET_INT32(DATUM_TNF(datum), DATUM_VAL(datum))); }
static void check_scalar(tnf_datum_t datum) { CHECK_DATUM(datum); if (!INFO_SCALAR(DATUM_INFO(datum))) _tnf_error(DATUM_TNF(datum), TNF_ERR_TYPEMISMATCH); /* XXX Need to check for exact scalar type match as well */ }
void _tnf_check_record(tnf_datum_t datum) { CHECK_DATUM(datum); /* All records must be tagged */ if (!INFO_TAGGED(DATUM_INFO(datum))) _tnf_error(DATUM_TNF(datum), TNF_ERR_TYPEMISMATCH); }
void _tnf_check_slots(tnf_datum_t datum) { struct taginfo *info; CHECK_DATUM(datum); info = DATUM_INFO(datum); /* Must be an aggregate */ if (!(INFO_STRUCT(info) || INFO_ARRAY(info))) _tnf_error(DATUM_TNF(datum), TNF_ERR_TYPEMISMATCH); }
tnf_float64_t tnf_get_float64(tnf_datum_t datum) { union { tnf_uint64_t i64; tnf_float64_t f64; } u; CHECK_SCALAR(datum); u.i64 = get_uint64(DATUM_TNF(datum), DATUM_VAL(datum)); /* XXX */ return (u.f64); }
static struct slotinfo * get_slotinfo(tnf_datum_t datum) { struct taginfo *info, *base_info; info = DATUM_INFO(datum); base_info = INFO_DERIVED(info)? info->base: info; /* XXX base must not be a scalar tag */ if (INFO_SCALAR(base_info)) _tnf_error(DATUM_TNF(datum), TNF_ERR_BADTNF); return (base_info->slotinfo); }
static tnf_datum_t get_slot(tnf_datum_t datum, struct slot *slot) { if (slot == NULL) { _tnf_error(DATUM_TNF(datum), TNF_ERR_BADSLOT); /* XXX */ return (TNF_DATUM_NULL); } else if (INFO_TAGGED(slot->slot_type)) { TNF *tnf; tnf_ref32_t *rec; tnf = DATUM_TNF(datum); /* LINTED pointer cast may result in improper alignment */ rec = _GET_REF32(tnf, (tnf_ref32_t *) (DATUM_VAL(datum) + slot->slot_offset)); /* NULL slots are allowed */ return ((rec == TNF_NULL)? TNF_DATUM_NULL : RECORD_DATUM(tnf, rec)); } else /* inline */ return DATUM(slot->slot_type, DATUM_VAL(datum) + slot->slot_offset); }
tnf_float32_t tnf_get_float32(tnf_datum_t datum) { union { tnf_uint32_t i32; tnf_float32_t f32; } u; CHECK_SCALAR(datum); /* LINTED pointer cast may result in improper alignment */ u.i32 = _GET_UINT32(DATUM_TNF(datum), DATUM_VAL(datum)); /* XXX */ return (u.f32); }
char * tnf_get_slot_name(tnf_datum_t datum, unsigned index) { struct slotinfo *slotinfo; struct slot *slot; CHECK_SLOTS(datum); slotinfo = get_slotinfo(datum); slot = get_slot_indexed(slotinfo, index); if (slot == NULL) { _tnf_error(DATUM_TNF(datum), TNF_ERR_BADSLOT); /* XXX */ return ((char *)NULL); } else return (slot->slot_name); }
unsigned tnf_get_slot_index(tnf_datum_t datum, char *name) { struct slotinfo *slotinfo; struct slot *slot; CHECK_SLOTS(datum); slotinfo = get_slotinfo(datum); slot = get_slot_named(slotinfo, name); if (slot == NULL) { _tnf_error(DATUM_TNF(datum), TNF_ERR_BADSLOT); /* XXX */ return (((unsigned)-1)); } else return (((char *)slot - (char *)&slotinfo->slots[0]) / sizeof (struct slot)); }
tnf_datum_t tnf_get_tag_arg(tnf_datum_t datum) { TNF *tnf; tnf_ref32_t *arg; CHECK_RECORD(datum); tnf = DATUM_TNF(datum); /* Should not give an error if not found */ /* LINTED pointer cast may result in improper alignment */ arg = _tnf_get_tag_arg(tnf, DATUM_RECORD(datum)); if (arg == TNF_NULL) return (TNF_DATUM_NULL); else /* repackage the tag arg with its taginfo */ return (RECORD_DATUM(tnf, arg)); }
tnf_int64_t tnf_get_int64(tnf_datum_t datum) { CHECK_SCALAR(datum); return (get_uint64(DATUM_TNF(datum), DATUM_VAL(datum))); }