/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1994, by Sun Microsytems, Inc. */ #pragma ident "%Z%%M% %I% %E% SMI" #include "libtnf.h" /* * Defines */ #define DATUM_KIND(d) (DATUM_INFO(d)->kind) /* * Declarations */ static int has_prop(tnf_datum_t, tag_props_t); /* * Datum operations: for more debuggability */ #ifndef _DATUM_MACROS tnf_datum_t _tnf_datum(struct taginfo *info, caddr_t val) { return (_DATUM(info, val)); } struct taginfo * _tnf_datum_info(tnf_datum_t datum) { return ((struct taginfo *)_DATUM_HI(datum)); } caddr_t _tnf_datum_val(tnf_datum_t datum) { return ((caddr_t)_DATUM_LO(datum)); } #endif /* * Check for valid datum */ void _tnf_check_datum(tnf_datum_t datum) { caddr_t val; TNF *tnf; if (datum == TNF_DATUM_NULL) _tnf_error(NULL, TNF_ERR_BADTNF); val = DATUM_VAL(datum); tnf = DATUM_TNF(datum); if ((val <= tnf->file_start) || (val >= tnf->file_end)) _tnf_error(tnf, TNF_ERR_BADDATUM); } /* * Retrieve datum kind from cached information */ tnf_kind_t tnf_get_kind(tnf_datum_t datum) { CHECK_DATUM(datum); /* The kind field is always completely initialized */ return (DATUM_KIND(datum)); } /* * Classification predicates: check the cached tag props */ static int has_prop(tnf_datum_t datum, tag_props_t prop) { CHECK_DATUM(datum); /* Note: No need to get base info because props inherited */ return (INFO_PROP(DATUM_INFO(datum), prop)); } int tnf_is_inline(tnf_datum_t datum) { return (has_prop(datum, TAG_PROP_INLINE)); } int tnf_is_scalar(tnf_datum_t datum) { return (has_prop(datum, TAG_PROP_SCALAR)); } int tnf_is_record(tnf_datum_t datum) /* XXX was: tnf_is_tagged */ { return (has_prop(datum, TAG_PROP_TAGGED)); } int tnf_is_array(tnf_datum_t datum) { return (has_prop(datum, TAG_PROP_ARRAY)); } int tnf_is_string(tnf_datum_t datum) { return (has_prop(datum, TAG_PROP_STRING)); } int tnf_is_struct(tnf_datum_t datum) { return (has_prop(datum, TAG_PROP_STRUCT)); } int tnf_is_type(tnf_datum_t datum) { return (has_prop(datum, TAG_PROP_TYPE)); } /* * Get the type datum for any datum */ tnf_datum_t tnf_get_type(tnf_datum_t datum) { struct taginfo *info; CHECK_DATUM(datum); info = DATUM_INFO(datum); return (DATUM(info->meta, (caddr_t)info->tag)); } /* * Get the type name for any datum * XXX Beware: this is a pointer into the file */ char * tnf_get_type_name(tnf_datum_t datum) { CHECK_DATUM(datum); return (DATUM_INFO(datum)->name); /* cached */ } /* * Get the size of any datum */ size_t tnf_get_size(tnf_datum_t datum) { struct taginfo *info; size_t size; CHECK_DATUM(datum); info = DATUM_INFO(datum); size = info->size; if (size == (size_t)-1) /* self sized */ /* XXX tnf_get_slot_named(datum, TNF_N_SELF_SIZE) */ /* LINTED pointer cast may result in improper alignment */ return (_tnf_get_self_size(info->tnf, DATUM_RECORD(datum))); else return (size); } /* * Get raw pointer to any datum */ caddr_t tnf_get_raw(tnf_datum_t datum) { CHECK_DATUM(datum); return (DATUM_VAL(datum)); }