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