1 
2 /* Web Polygraph       http://www.web-polygraph.org/
3  * Copyright 2003-2011 The Measurement Factory
4  * Licensed under the Apache License, Version 2.0 */
5 
6 #include "pgl/pgl.h"
7 
8 #include "pgl/PglRec.h"
9 #include "pgl/PglRecSym.h"
10 
11 
PglRec()12 PglRec::PglRec() {
13 }
14 
~PglRec()15 PglRec::~PglRec() {
16 }
17 
valp(const String & key)18 SynSymTblItem **PglRec::valp(const String &key) {
19 	// we are responsible for the first component of a dot-name only
20 	String ancor = key;
21 	String tail;
22 	if (const char *p = key.chr('.')) {
23 		ancor = key(0, p-key.cstr());
24 		tail = key(p+1 - key.cstr(), key.len());
25 	}
26 
27 	// lookup ancor
28 	if (SynSymTblItem **ip = SynSymTbl::valp(ancor)) {
29 		SynSymTblItem *i = *ip;
30 		Assert(i);
31 
32 		// check if we need to go further
33 		if (tail) {
34 			if (i->sym() && i->sym()->isA(RecSym::TheType)) {
35 				RecSym &s = (RecSym &) i->sym()->cast(RecSym::TheType);
36 				return s.rec()->valp(tail);
37 			}
38 			// would be nice to complain here, but we lack key's location
39 			return 0;
40 		}
41 		return ip;
42 	}
43 	return 0;
44 }
45 
clone() const46 PglRec *PglRec::clone() const {
47 	PglRec *rec = new PglRec;
48 
49 	for (int i = 0; i < count(); ++i) {
50 		if (valAt(i)) {
51 			SynSymTblItem *clone = new SynSymTblItem(*valAt(i));
52 
53 			if (SynSym *s = valAt(i)->sym())
54 				clone->sym(s->clone(s->type()));
55 
56 			rec->add(keyAt(i), clone);
57 		}
58 	}
59 	return rec;
60 }
61 
62 // Note: parameter types are not checked
copyCommon(const PglRec & rec)63 void PglRec::copyCommon(const PglRec &rec) {
64 	for (int i = 0; i < count(); ++i) {
65 		SynSymTblItem *val = 0;
66 		if (!rec.find(keyAt(i), val) || !val)
67 			continue;
68 
69 		SynSymTblItem *const clone = new SynSymTblItem(*val);
70 		if (const SynSym *const s = val->sym())
71 			clone->sym(s->clone(s->type()));
72 
73 		delete valAt(i);
74 		valAt(i) = clone;
75 	}
76 }
77 
bAdd(const String & type,const String & name,SynSym * s)78 SynSymTblItem *PglRec::bAdd(const String &type, const String &name, SynSym *s) {
79 	SynSymTblItem *member = new SynSymTblItem(type, name);
80 	member->sym(s);
81 	add(member->name(), member);
82 	return member;
83 }
84