xref: /OpenGrok/opengrok-indexer/src/test/resources/analysis/c/sample.cc (revision eeb7e5b33d1bcc524fcc9d1d560447b044e286a4)
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