1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright (c) 1994, by Sun Microsytems, Inc.
24 */
25
26 #pragma ident "%Z%%M% %I% %E% SMI"
27
28 #include "libtnf.h"
29
30 /*
31 * Defines
32 */
33
34 #define DATUM_KIND(d) (DATUM_INFO(d)->kind)
35
36 /*
37 * Declarations
38 */
39
40 static int has_prop(tnf_datum_t, tag_props_t);
41
42 /*
43 * Datum operations: for more debuggability
44 */
45
46 #ifndef _DATUM_MACROS
47
48 tnf_datum_t
_tnf_datum(struct taginfo * info,caddr_t val)49 _tnf_datum(struct taginfo *info, caddr_t val)
50 {
51 return (_DATUM(info, val));
52 }
53
54 struct taginfo *
_tnf_datum_info(tnf_datum_t datum)55 _tnf_datum_info(tnf_datum_t datum)
56 {
57 return ((struct taginfo *)_DATUM_HI(datum));
58 }
59
60 caddr_t
_tnf_datum_val(tnf_datum_t datum)61 _tnf_datum_val(tnf_datum_t datum)
62 {
63 return ((caddr_t)_DATUM_LO(datum));
64 }
65
66 #endif
67
68 /*
69 * Check for valid datum
70 */
71
72 void
_tnf_check_datum(tnf_datum_t datum)73 _tnf_check_datum(tnf_datum_t datum)
74 {
75 caddr_t val;
76 TNF *tnf;
77
78 if (datum == TNF_DATUM_NULL)
79 _tnf_error(NULL, TNF_ERR_BADTNF);
80
81 val = DATUM_VAL(datum);
82 tnf = DATUM_TNF(datum);
83
84 if ((val <= tnf->file_start) || (val >= tnf->file_end))
85 _tnf_error(tnf, TNF_ERR_BADDATUM);
86 }
87
88 /*
89 * Retrieve datum kind from cached information
90 */
91
92 tnf_kind_t
tnf_get_kind(tnf_datum_t datum)93 tnf_get_kind(tnf_datum_t datum)
94 {
95 CHECK_DATUM(datum);
96 /* The kind field is always completely initialized */
97 return (DATUM_KIND(datum));
98 }
99
100 /*
101 * Classification predicates: check the cached tag props
102 */
103
104 static int
has_prop(tnf_datum_t datum,tag_props_t prop)105 has_prop(tnf_datum_t datum, tag_props_t prop)
106 {
107 CHECK_DATUM(datum);
108
109 /* Note: No need to get base info because props inherited */
110 return (INFO_PROP(DATUM_INFO(datum), prop));
111 }
112
113 int
tnf_is_inline(tnf_datum_t datum)114 tnf_is_inline(tnf_datum_t datum)
115 {
116 return (has_prop(datum, TAG_PROP_INLINE));
117 }
118
119 int
tnf_is_scalar(tnf_datum_t datum)120 tnf_is_scalar(tnf_datum_t datum)
121 {
122 return (has_prop(datum, TAG_PROP_SCALAR));
123 }
124
125 int
tnf_is_record(tnf_datum_t datum)126 tnf_is_record(tnf_datum_t datum) /* XXX was: tnf_is_tagged */
127 {
128 return (has_prop(datum, TAG_PROP_TAGGED));
129 }
130
131 int
tnf_is_array(tnf_datum_t datum)132 tnf_is_array(tnf_datum_t datum)
133 {
134 return (has_prop(datum, TAG_PROP_ARRAY));
135 }
136
137 int
tnf_is_string(tnf_datum_t datum)138 tnf_is_string(tnf_datum_t datum)
139 {
140 return (has_prop(datum, TAG_PROP_STRING));
141 }
142
143 int
tnf_is_struct(tnf_datum_t datum)144 tnf_is_struct(tnf_datum_t datum)
145 {
146 return (has_prop(datum, TAG_PROP_STRUCT));
147 }
148
149 int
tnf_is_type(tnf_datum_t datum)150 tnf_is_type(tnf_datum_t datum)
151 {
152 return (has_prop(datum, TAG_PROP_TYPE));
153 }
154
155 /*
156 * Get the type datum for any datum
157 */
158
159 tnf_datum_t
tnf_get_type(tnf_datum_t datum)160 tnf_get_type(tnf_datum_t datum)
161 {
162 struct taginfo *info;
163
164 CHECK_DATUM(datum);
165
166 info = DATUM_INFO(datum);
167 return (DATUM(info->meta, (caddr_t)info->tag));
168 }
169
170 /*
171 * Get the type name for any datum
172 * XXX Beware: this is a pointer into the file
173 */
174
175 char *
tnf_get_type_name(tnf_datum_t datum)176 tnf_get_type_name(tnf_datum_t datum)
177 {
178 CHECK_DATUM(datum);
179 return (DATUM_INFO(datum)->name); /* cached */
180 }
181
182 /*
183 * Get the size of any datum
184 */
185
186 size_t
tnf_get_size(tnf_datum_t datum)187 tnf_get_size(tnf_datum_t datum)
188 {
189 struct taginfo *info;
190 size_t size;
191
192 CHECK_DATUM(datum);
193
194 info = DATUM_INFO(datum);
195 size = info->size;
196
197 if (size == (size_t)-1) /* self sized */
198 /* XXX tnf_get_slot_named(datum, TNF_N_SELF_SIZE) */
199 /* LINTED pointer cast may result in improper alignment */
200 return (_tnf_get_self_size(info->tnf, DATUM_RECORD(datum)));
201 else
202 return (size);
203 }
204
205 /*
206 * Get raw pointer to any datum
207 */
208
209 caddr_t
tnf_get_raw(tnf_datum_t datum)210 tnf_get_raw(tnf_datum_t datum)
211 {
212 CHECK_DATUM(datum);
213 return (DATUM_VAL(datum));
214 }
215