1 /*
2 This file is part of dia2code. It generates code from an UML Dia Diagram.
3 Copyright (C) 2000-2014 Javier O'Hara
4 
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include "config.h"
20 
21 #include "umlClassNode.hpp"
22 #include "parse_diagram.hpp"
23 
24 umlClassNode *
find(std::list<umlClassNode * > & list,const char * id)25 umlClassNode::find (std::list <umlClassNode *> & list, const char *id) {
26     if (id != NULL) {
27         for (umlClassNode * it : list) {
28             if (it->getId ().compare (id) == 0) {
29                 return it;
30             }
31         }
32     }
33     return NULL;
34 }
35 
36 
umlClassNode()37 umlClassNode::umlClassNode () :
38     umlClass (),
39     parents (),
40     associations (),
41     classDep (),
42     packageDep ()
43 {
44 }
45 
umlClassNode(const umlClassNode & classnode)46 umlClassNode::umlClassNode (const umlClassNode & classnode) :
47     umlClass (classnode),
48     parents (classnode.parents),
49     associations (classnode.associations),
50     classDep (classnode.classDep),
51     packageDep (classnode.packageDep)
52 {
53 }
54 
umlClassNode(umlClass * _key,std::list<std::pair<umlClass *,Visibility>> & parents_,std::list<umlassoc> & associations_,std::list<std::pair<umlClassNode *,uint8_t>> & classDep_,std::list<umlPackage * > & packageDep_)55 umlClassNode::umlClassNode (umlClass * _key,
56                             std::list <std::pair <umlClass *,
57                                                   Visibility> > & parents_,
58                             std::list <umlassoc> & associations_,
59                             std::list <std::pair <umlClassNode *,
60                                                   uint8_t> > & classDep_,
61                             std::list <umlPackage *> & packageDep_) :
62     umlClass (*_key),
63     parents (parents_),
64     associations (associations_),
65     classDep (classDep_),
66     packageDep (packageDep_)
67 {
68 }
69 
umlClassNode(umlClass & _key)70 umlClassNode::umlClassNode (umlClass & _key) :
71     umlClass (_key),
72     parents (),
73     associations (),
74     classDep (),
75     packageDep ()
76 {
77 }
78 
79 const std::list <std::pair <umlClass *, Visibility> > &
getParents() const80 umlClassNode::getParents () const {
81     return parents;
82 }
83 
84 const std::list <umlassoc> &
getAssociations() const85 umlClassNode::getAssociations () const {
86     return associations;
87 }
88 
89 const std::list <std::pair <umlClassNode *, uint8_t> > &
getDependencies() const90 umlClassNode::getDependencies () const {
91     return classDep;
92 }
93 
94 std::list <umlPackage *> &
getDependenciesPack()95 umlClassNode::getDependenciesPack () {
96     return packageDep;
97 }
98 
99 module *
findModule(std::list<declaration> & dptr,std::list<umlPackage * >::iterator begin,std::list<umlPackage * >::iterator end)100 findModule (std::list <declaration> &dptr,
101              std::list <umlPackage *>::iterator begin,
102              std::list <umlPackage *>::iterator end) {
103     std::list <declaration>::iterator it = dptr.begin ();
104     while (it != dptr.end ()) {
105         if ((*it).decl_kind == dk_module) {
106             module *m = (*it).u.this_module;
107             if (m->pkg->getName ().compare ((*begin)->getName ()) == 0) {
108                 if (std::next (begin) != end) {
109                     std::list<declaration> liste;
110 
111                     if (m->contents.empty ()) {
112                         return nullptr;
113                     }
114                     else {
115                         liste.push_back (*m->contents.begin ());
116                         return findModule (liste, std::next (begin), end);
117                     }
118                 }
119                 else {
120                     return m;
121                 }
122             }
123         }
124         ++it;
125     }
126     return nullptr;
127 }
128 
129 declaration *
findClass(std::list<declaration> & decl) const130 umlClassNode::findClass (std::list <declaration> &decl) const {
131     std::list <declaration> *d;
132 
133     if (getPackage ()) {
134         std::list <umlPackage *> pkglist;
135 
136         umlPackage::makePackageList (getPackage (), pkglist);
137         module *m = findModule (decl, pkglist.begin (), pkglist.end ());
138         if (m == NULL || m->contents.empty ()) {
139             return nullptr;
140         }
141         d = &m->contents;
142     } else {
143         d = &decl;
144     }
145 
146     for (declaration & it : *d) {
147         if (it.decl_kind == dk_class) {
148             umlClassNode *cl = it.u.this_class;
149             if (cl->getName ().compare (getName ()) == 0) {
150                 return &it;
151             }
152         }
153     }
154     return nullptr;
155 }
156 
157 void
addParent(umlClass * key,Visibility inh)158 umlClassNode::addParent (umlClass * key, Visibility inh) {
159     parents.push_front (std::make_pair (key, inh));
160 }
161 
162 void
addDependency(umlClassNode * dependent,uint8_t flag)163 umlClassNode::addDependency (umlClassNode * dependent, uint8_t flag) {
164     classDep.push_front (std::make_pair (dependent, flag));
165 }
166 
167 void
addDependency(umlPackage * dependent)168 umlClassNode::addDependency (umlPackage * dependent) {
169     packageDep.push_front (dependent);
170 }
171 
172 void
addAggregate(const char * name_,char composite,umlClassNode * base,const char * multiplicity,Visibility visibility)173 umlClassNode::addAggregate (const char *name_,
174         char composite,
175         umlClassNode * base,
176         const char *multiplicity,
177         Visibility visibility) {
178     umlassoc tmp;
179     if (name_ != NULL && strlen (name_) > 2) {
180         parseDiaString(name_, tmp.name);
181     }
182     if (multiplicity != NULL) {
183 #if defined(_WIN32) || defined(_WIN64)
184         strncpy_s (tmp.multiplicity,
185                    10,
186                    multiplicity + 1,
187                    strlen (multiplicity) - 2);
188 #else
189         strncpy (tmp.multiplicity,
190                  multiplicity + 1,
191                  strlen (multiplicity) - 2);
192 #endif
193     }
194     else {
195         tmp.multiplicity[0] = '1';
196         tmp.multiplicity[1] = 0;
197     }
198     tmp.key = base;
199     tmp.composite = composite;
200     tmp.visibility = visibility;
201     associations.push_front (tmp);
202 }
203 
~umlClassNode()204 umlClassNode::~umlClassNode ()
205 {
206 }
207 
208 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
209