1*eeb7e5b3SAdam Hornáček /*
2*eeb7e5b3SAdam Hornáček * CDDL HEADER START
3*eeb7e5b3SAdam Hornáček *
4*eeb7e5b3SAdam Hornáček * The contents of this file are subject to the terms of the
5*eeb7e5b3SAdam Hornáček * Common Development and Distribution License, Version 1.0 only
6*eeb7e5b3SAdam Hornáček * (the "License"). You may not use this file except in compliance
7*eeb7e5b3SAdam Hornáček * with the License.
8*eeb7e5b3SAdam Hornáček *
9*eeb7e5b3SAdam Hornáček * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*eeb7e5b3SAdam Hornáček * or http://www.opensolaris.org/os/licensing.
11*eeb7e5b3SAdam Hornáček * See the License for the specific language governing permissions
12*eeb7e5b3SAdam Hornáček * and limitations under the License.
13*eeb7e5b3SAdam Hornáček *
14*eeb7e5b3SAdam Hornáček * When distributing Covered Code, include this CDDL HEADER in each
15*eeb7e5b3SAdam Hornáček * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*eeb7e5b3SAdam Hornáček * If applicable, add the following below this CDDL HEADER, with the
17*eeb7e5b3SAdam Hornáček * fields enclosed by brackets "[]" replaced with your own identifying
18*eeb7e5b3SAdam Hornáček * information: Portions Copyright [yyyy] [name of copyright owner]
19*eeb7e5b3SAdam Hornáček *
20*eeb7e5b3SAdam Hornáček * CDDL HEADER END
21*eeb7e5b3SAdam Hornáček */
22*eeb7e5b3SAdam Hornáček /*
23*eeb7e5b3SAdam Hornáček * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
24*eeb7e5b3SAdam Hornáček * All rights reserved.
25*eeb7e5b3SAdam Hornáček */
26*eeb7e5b3SAdam Hornáček
27*eeb7e5b3SAdam Hornáček #pragma ident "%Z%%M% %I% %E% SMI"
28*eeb7e5b3SAdam Hornáček
29*eeb7e5b3SAdam Hornáček #include <stdlib.h>
30*eeb7e5b3SAdam Hornáček #include <string.h>
31*eeb7e5b3SAdam Hornáček
32*eeb7e5b3SAdam Hornáček #include "Ancestor.ext1"
33*eeb7e5b3SAdam Hornáček
34*eeb7e5b3SAdam Hornáček /* ========================================================================= */
35*eeb7e5b3SAdam Hornáček /* Ancestor object definitions. */
36*eeb7e5b3SAdam Hornáček
Ancestor(Str field,fru_tag_t t,const fru_regdef_t * d)37*eeb7e5b3SAdam Hornáček Ancestor::Ancestor(Str field, fru_tag_t t, const fru_regdef_t *d)
38*eeb7e5b3SAdam Hornáček : field_name(field),
39*eeb7e5b3SAdam Hornáček tag(t),
40*eeb7e5b3SAdam Hornáček def(d),
41*eeb7e5b3SAdam Hornáček numInstances(0),
42*eeb7e5b3SAdam Hornáček numBufs(1),
43*eeb7e5b3SAdam Hornáček next(NULL)
44*eeb7e5b3SAdam Hornáček {
45*eeb7e5b3SAdam Hornáček offsets = (uint32_t *)malloc(sizeof (uint32_t)
46*eeb7e5b3SAdam Hornáček * ANCESTOR_INST_BUF_SIZE);
47*eeb7e5b3SAdam Hornáček paths = (char **)malloc(sizeof (char *)
48*eeb7e5b3SAdam Hornáček * ANCESTOR_INST_BUF_SIZE);
49*eeb7e5b3SAdam Hornáček }
50*eeb7e5b3SAdam Hornáček
~Ancestor()51*eeb7e5b3SAdam Hornáček Ancestor::~Ancestor()
52*eeb7e5b3SAdam Hornáček {
53*eeb7e5b3SAdam Hornáček free(offsets);
54*eeb7e5b3SAdam Hornáček if (paths != NULL) {
55*eeb7e5b3SAdam Hornáček for (int i = 0; i < numInstances && i < 0xFFFFFF; i++) {
56*eeb7e5b3SAdam Hornáček free(paths[i]);
57*eeb7e5b3SAdam Hornáček }
58*eeb7e5b3SAdam Hornáček }
59*eeb7e5b3SAdam Hornáček free(paths);
60*eeb7e5b3SAdam Hornáček delete next;
61*eeb7e5b3SAdam Hornáček }
62*eeb7e5b3SAdam Hornáček
63*eeb7e5b3SAdam Hornáček /*
64*eeb7e5b3SAdam Hornáček void
65*eeb7e5b3SAdam Hornáček Ancestor::print(void)
66*eeb7e5b3SAdam Hornáček {
67*eeb7e5b3SAdam Hornáček fprintf(stderr, "Ancestor Information\n");
68*eeb7e5b3SAdam Hornáček fprintf(stderr, "Tag Name: %s\n", def->name);
69*eeb7e5b3SAdam Hornáček fprintf(stderr, "Tag Type: %s\n",
70*eeb7e5b3SAdam Hornáček get_tagtype_str(get_tag_type(&tag)));
71*eeb7e5b3SAdam Hornáček fprintf(stderr, "Num instances: %d\n", numInstances);
72*eeb7e5b3SAdam Hornáček fprintf(stderr, " offsets:\n");
73*eeb7e5b3SAdam Hornáček for (int i = 0; i < numInstances; i++) {
74*eeb7e5b3SAdam Hornáček fprintf(stderr, " %d\n", offsets[i]);
75*eeb7e5b3SAdam Hornáček }
76*eeb7e5b3SAdam Hornáček
77*eeb7e5b3SAdam Hornáček if (next != NULL) {
78*eeb7e5b3SAdam Hornáček next->print();
79*eeb7e5b3SAdam Hornáček }
80*eeb7e5b3SAdam Hornáček }
81*eeb7e5b3SAdam Hornáček */
82*eeb7e5b3SAdam Hornáček
83*eeb7e5b3SAdam Hornáček void
addInstance(const char * path,uint32_t offset)84*eeb7e5b3SAdam Hornáček Ancestor::addInstance(const char *path, uint32_t offset)
85*eeb7e5b3SAdam Hornáček {
86*eeb7e5b3SAdam Hornáček if (numInstances >= ANCESTOR_INST_BUF_SIZE) {
87*eeb7e5b3SAdam Hornáček numBufs++;
88*eeb7e5b3SAdam Hornáček offsets = (uint32_t *)realloc(offsets,
89*eeb7e5b3SAdam Hornáček (sizeof (uint32_t) *
90*eeb7e5b3SAdam Hornáček (ANCESTOR_INST_BUF_SIZE * numBufs)));
91*eeb7e5b3SAdam Hornáček paths = (char **)realloc(offsets,
92*eeb7e5b3SAdam Hornáček (sizeof (char *) *
93*eeb7e5b3SAdam Hornáček (ANCESTOR_INST_BUF_SIZE * numBufs)));
94*eeb7e5b3SAdam Hornáček }
95*eeb7e5b3SAdam Hornáček offsets[numInstances] = offset;
96*eeb7e5b3SAdam Hornáček paths[numInstances++] = strdup(path);
97*eeb7e5b3SAdam Hornáček }
98*eeb7e5b3SAdam Hornáček
99*eeb7e5b3SAdam Hornáček Str
getFieldName(void)100*eeb7e5b3SAdam Hornáček Ancestor::getFieldName(void)
101*eeb7e5b3SAdam Hornáček {
102*eeb7e5b3SAdam Hornáček return (field_name);
103*eeb7e5b3SAdam Hornáček }
104*eeb7e5b3SAdam Hornáček
105*eeb7e5b3SAdam Hornáček fru_tag_t
getTag(void)106*eeb7e5b3SAdam Hornáček Ancestor::getTag(void)
107*eeb7e5b3SAdam Hornáček {
108*eeb7e5b3SAdam Hornáček return (tag);
109*eeb7e5b3SAdam Hornáček }
110*eeb7e5b3SAdam Hornáček
111*eeb7e5b3SAdam Hornáček const fru_regdef_t *
getDef(void)112*eeb7e5b3SAdam Hornáček Ancestor::getDef(void)
113*eeb7e5b3SAdam Hornáček {
114*eeb7e5b3SAdam Hornáček return (def);
115*eeb7e5b3SAdam Hornáček }
116*eeb7e5b3SAdam Hornáček
117*eeb7e5b3SAdam Hornáček int
getNumInstances(void)118*eeb7e5b3SAdam Hornáček Ancestor::getNumInstances(void)
119*eeb7e5b3SAdam Hornáček {
120*eeb7e5b3SAdam Hornáček return (numInstances);
121*eeb7e5b3SAdam Hornáček }
122*eeb7e5b3SAdam Hornáček
123*eeb7e5b3SAdam Hornáček uint32_t
getInstOffset(int num)124*eeb7e5b3SAdam Hornáček Ancestor::getInstOffset(int num)
125*eeb7e5b3SAdam Hornáček {
126*eeb7e5b3SAdam Hornáček if (num < numInstances)
127*eeb7e5b3SAdam Hornáček return (offsets[num]);
128*eeb7e5b3SAdam Hornáček else
129*eeb7e5b3SAdam Hornáček return (offsets[numInstances]);
130*eeb7e5b3SAdam Hornáček }
131*eeb7e5b3SAdam Hornáček
132*eeb7e5b3SAdam Hornáček const char *
getPath(int num)133*eeb7e5b3SAdam Hornáček Ancestor::getPath(int num)
134*eeb7e5b3SAdam Hornáček {
135*eeb7e5b3SAdam Hornáček if (num < numInstances)
136*eeb7e5b3SAdam Hornáček return (paths[num]);
137*eeb7e5b3SAdam Hornáček else
138*eeb7e5b3SAdam Hornáček return (paths[numInstances]);
139*eeb7e5b3SAdam Hornáček }
140*eeb7e5b3SAdam Hornáček
141*eeb7e5b3SAdam Hornáček
142*eeb7e5b3SAdam Hornáček Ancestor *
listTaggedAncestors(char * element)143*eeb7e5b3SAdam Hornáček Ancestor::listTaggedAncestors(char *element)
144*eeb7e5b3SAdam Hornáček {
145*eeb7e5b3SAdam Hornáček Ancestor *rc = NULL;
146*eeb7e5b3SAdam Hornáček fru_regdef_t *def = NULL;
147*eeb7e5b3SAdam Hornáček int i = 0;
148*eeb7e5b3SAdam Hornáček
149*eeb7e5b3SAdam Hornáček unsigned int number = 0;
150*eeb7e5b3SAdam Hornáček char **data_elems = fru_reg_list_entries(&number);
151*eeb7e5b3SAdam Hornáček
152*eeb7e5b3SAdam Hornáček if (data_elems == NULL) {
153*eeb7e5b3SAdam Hornáček return (NULL);
154*eeb7e5b3SAdam Hornáček }
155*eeb7e5b3SAdam Hornáček
156*eeb7e5b3SAdam Hornáček // look through all the elements.
157*eeb7e5b3SAdam Hornáček for (i = 0; i < number; i++) {
158*eeb7e5b3SAdam Hornáček def = (fru_regdef_t *)
159*eeb7e5b3SAdam Hornáček fru_reg_lookup_def_by_name(data_elems[i]);
160*eeb7e5b3SAdam Hornáček Ancestor *ant = createTaggedAncestor(def, element);
161*eeb7e5b3SAdam Hornáček if (ant != NULL) {
162*eeb7e5b3SAdam Hornáček if (rc == NULL) {
163*eeb7e5b3SAdam Hornáček rc = ant;
164*eeb7e5b3SAdam Hornáček } else {
165*eeb7e5b3SAdam Hornáček Ancestor *tmp = rc;
166*eeb7e5b3SAdam Hornáček while (tmp->next != NULL) {
167*eeb7e5b3SAdam Hornáček tmp = tmp->next;
168*eeb7e5b3SAdam Hornáček }
169*eeb7e5b3SAdam Hornáček tmp->next = ant;
170*eeb7e5b3SAdam Hornáček }
171*eeb7e5b3SAdam Hornáček }
172*eeb7e5b3SAdam Hornáček }
173*eeb7e5b3SAdam Hornáček
174*eeb7e5b3SAdam Hornáček for (i = 0; i < number; i++) {
175*eeb7e5b3SAdam Hornáček free(data_elems[i]);
176*eeb7e5b3SAdam Hornáček }
177*eeb7e5b3SAdam Hornáček free(data_elems);
178*eeb7e5b3SAdam Hornáček
179*eeb7e5b3SAdam Hornáček return (rc);
180*eeb7e5b3SAdam Hornáček }
181*eeb7e5b3SAdam Hornáček
182*eeb7e5b3SAdam Hornáček Ancestor *
createTaggedAncestor(const fru_regdef_t * def,Str element)183*eeb7e5b3SAdam Hornáček Ancestor::createTaggedAncestor(const fru_regdef_t *def, Str element)
184*eeb7e5b3SAdam Hornáček {
185*eeb7e5b3SAdam Hornáček // ancestors have to be tagged.
186*eeb7e5b3SAdam Hornáček if (def->tagType == FRU_X)
187*eeb7e5b3SAdam Hornáček return (NULL);
188*eeb7e5b3SAdam Hornáček
189*eeb7e5b3SAdam Hornáček fru_tag_t tag;
190*eeb7e5b3SAdam Hornáček mk_tag(def->tagType, def->tagDense, def->payloadLen, &tag);
191*eeb7e5b3SAdam Hornáček Ancestor *rc = new Ancestor(element, tag, def);
192*eeb7e5b3SAdam Hornáček
193*eeb7e5b3SAdam Hornáček if (element.compare(def->name) == 0) {
194*eeb7e5b3SAdam Hornáček rc->addInstance("", 0);
195*eeb7e5b3SAdam Hornáček return (rc);
196*eeb7e5b3SAdam Hornáček }
197*eeb7e5b3SAdam Hornáček
198*eeb7e5b3SAdam Hornáček int found = 0;
199*eeb7e5b3SAdam Hornáček if (def->dataType == FDTYPE_Record) {
200*eeb7e5b3SAdam Hornáček uint32_t offset = 0;
201*eeb7e5b3SAdam Hornáček for (int i = 0; i < def->enumCount; i++) {
202*eeb7e5b3SAdam Hornáček const fru_regdef_t *tmp
203*eeb7e5b3SAdam Hornáček = fru_reg_lookup_def_by_name
204*eeb7e5b3SAdam Hornáček ((char *)def->enumTable[i].text);
205*eeb7e5b3SAdam Hornáček Str path = "/";
206*eeb7e5b3SAdam Hornáček path << def->name;
207*eeb7e5b3SAdam Hornáček int f = definitionContains(tmp, def, element,
208*eeb7e5b3SAdam Hornáček offset, rc, path);
209*eeb7e5b3SAdam Hornáček if (f == 1) found = 1; // found needs to latch at one.
210*eeb7e5b3SAdam Hornáček offset += tmp->payloadLen;
211*eeb7e5b3SAdam Hornáček }
212*eeb7e5b3SAdam Hornáček }
213*eeb7e5b3SAdam Hornáček
214*eeb7e5b3SAdam Hornáček if (!found) {
215*eeb7e5b3SAdam Hornáček delete rc;
216*eeb7e5b3SAdam Hornáček return (NULL);
217*eeb7e5b3SAdam Hornáček }
218*eeb7e5b3SAdam Hornáček
219*eeb7e5b3SAdam Hornáček return (rc);
220*eeb7e5b3SAdam Hornáček }
221*eeb7e5b3SAdam Hornáček
222*eeb7e5b3SAdam Hornáček int
definitionContains(const fru_regdef_t * def,const fru_regdef_t * parent_def,Str element,uint32_t offset,Ancestor * ant,Str path)223*eeb7e5b3SAdam Hornáček Ancestor::definitionContains(const fru_regdef_t *def,
224*eeb7e5b3SAdam Hornáček const fru_regdef_t *parent_def,
225*eeb7e5b3SAdam Hornáček Str element,
226*eeb7e5b3SAdam Hornáček uint32_t offset,
227*eeb7e5b3SAdam Hornáček Ancestor *ant,
228*eeb7e5b3SAdam Hornáček Str path)
229*eeb7e5b3SAdam Hornáček {
230*eeb7e5b3SAdam Hornáček if (element.compare(def->name) == 0) {
231*eeb7e5b3SAdam Hornáček if (parent_def->iterationType != FRU_NOT_ITERATED) {
232*eeb7e5b3SAdam Hornáček offset += 4;
233*eeb7e5b3SAdam Hornáček for (int i = 0; i < parent_def->iterationCount; i++) {
234*eeb7e5b3SAdam Hornáček Str tmp = path;
235*eeb7e5b3SAdam Hornáček tmp << "[" << i << "]/";
236*eeb7e5b3SAdam Hornáček ant->addInstance(tmp.peak(), offset);
237*eeb7e5b3SAdam Hornáček offset += (parent_def->payloadLen - 4) /
238*eeb7e5b3SAdam Hornáček parent_def->iterationCount;
239*eeb7e5b3SAdam Hornáček }
240*eeb7e5b3SAdam Hornáček } else {
241*eeb7e5b3SAdam Hornáček path << "/";
242*eeb7e5b3SAdam Hornáček ant->addInstance(path.peak(), offset);
243*eeb7e5b3SAdam Hornáček }
244*eeb7e5b3SAdam Hornáček return (1);
245*eeb7e5b3SAdam Hornáček }
246*eeb7e5b3SAdam Hornáček
247*eeb7e5b3SAdam Hornáček int found = 0;
248*eeb7e5b3SAdam Hornáček if (def->dataType == FDTYPE_Record) {
249*eeb7e5b3SAdam Hornáček for (int i = 0; i < def->enumCount; i++) {
250*eeb7e5b3SAdam Hornáček const fru_regdef_t *tmp
251*eeb7e5b3SAdam Hornáček = fru_reg_lookup_def_by_name
252*eeb7e5b3SAdam Hornáček ((char *)def->enumTable[i].text);
253*eeb7e5b3SAdam Hornáček Str newPath = path;
254*eeb7e5b3SAdam Hornáček newPath << "/" << def->name;
255*eeb7e5b3SAdam Hornáček int f = definitionContains(tmp, def, element,
256*eeb7e5b3SAdam Hornáček offset, ant, newPath);
257*eeb7e5b3SAdam Hornáček if (f == 1) found = 1; // found needs to latch at one.
258*eeb7e5b3SAdam Hornáček offset += tmp->payloadLen;
259*eeb7e5b3SAdam Hornáček }
260*eeb7e5b3SAdam Hornáček }
261*eeb7e5b3SAdam Hornáček
262*eeb7e5b3SAdam Hornáček int d = 42;
263*eeb7e5b3SAdam Hornáček int o = 052;
264*eeb7e5b3SAdam Hornáček int x = 0x2a;
265*eeb7e5b3SAdam Hornáček int X = 0X2A;
266*eeb7e5b3SAdam Hornáček int b = 0b101010; // C++14
267*eeb7e5b3SAdam Hornáček unsigned long long l1 = 18446744073709550592ull; // C++11
268*eeb7e5b3SAdam Hornáček unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
269*eeb7e5b3SAdam Hornáček unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14
270*eeb7e5b3SAdam Hornáček unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14
271*eeb7e5b3SAdam Hornáček double d = 0x1.2p3; // hex frac 1.2 (dec 1.125) scaled by 2^3, i.e. 9.0
272*eeb7e5b3SAdam Hornáček d = 123.456e-67;
273*eeb7e5b3SAdam Hornáček d = .1E4f;
274*eeb7e5b3SAdam Hornáček d = 58.;
275*eeb7e5b3SAdam Hornáček d = -4e2;
276*eeb7e5b3SAdam Hornáček
277*eeb7e5b3SAdam Hornáček return (found);
278*eeb7e5b3SAdam Hornáček }
279*eeb7e5b3SAdam Hornáček
280*eeb7e5b3SAdam Hornáček /*http://example.com*/
281