1 /***************************************************************************
2 begin : Wed Feb 27 2008
3 copyright : (C) 2008 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * *
8 * This library is free software; you can redistribute it and/or *
9 * modify it under the terms of the GNU Lesser General Public *
10 * License as published by the Free Software Foundation; either *
11 * version 2.1 of the License, or (at your option) any later version. *
12 * *
13 * This library is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16 * Lesser General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU Lesser General Public *
19 * License along with this library; if not, write to the Free Software *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21 * MA 02111-1307 USA *
22 * *
23 ***************************************************************************/
24
25 #ifdef HAVE_CONFIG_H
26 # include <config.h>
27 #endif
28
29
30 #include "xsdnode_p.h"
31
32 #include <gwenhywfar/debug.h>
33 #include <gwenhywfar/misc.h>
34
35 #include <stdlib.h>
36 #include <assert.h>
37 #include <string.h>
38 #include <ctype.h>
39
40
41 GWEN_INHERIT_FUNCTIONS(GWEN_XSD_NODE)
GWEN_LIST_FUNCTIONS(GWEN_XSD_NODE,GWEN_XsdNode)42 GWEN_LIST_FUNCTIONS(GWEN_XSD_NODE, GWEN_XsdNode)
43
44
45
46 GWEN_XSD_NODE *GWEN_XsdNode_new(GWEN_XSD_NODE *parent,
47 GWEN_XSD_NODETYPE t,
48 const char *name)
49 {
50 GWEN_XSD_NODE *xsdNode;
51
52 GWEN_NEW_OBJECT(GWEN_XSD_NODE, xsdNode);
53 GWEN_INHERIT_INIT(GWEN_XSD_NODE, xsdNode);
54 GWEN_LIST_INIT(GWEN_XSD_NODE, xsdNode);
55 xsdNode->nodeType=t;
56 xsdNode->parent=parent;
57 xsdNode->children=GWEN_XsdNode_List_new();
58 if (name)
59 xsdNode->name=strdup(name);
60
61 return xsdNode;
62 }
63
64
65
GWEN_XsdNode_free(GWEN_XSD_NODE * xsdNode)66 void GWEN_XsdNode_free(GWEN_XSD_NODE *xsdNode)
67 {
68 if (xsdNode) {
69 GWEN_LIST_FINI(GWEN_XSD_NODE, xsdNode);
70 GWEN_INHERIT_FINI(GWEN_XSD_NODE, xsdNode);
71 GWEN_XsdNode_List_free(xsdNode->children);
72 free(xsdNode->name);
73 GWEN_FREE_OBJECT(xsdNode);
74 }
75 }
76
77
78
GWEN_XsdNode_GetNodeType(const GWEN_XSD_NODE * xsdNode)79 GWEN_XSD_NODETYPE GWEN_XsdNode_GetNodeType(const GWEN_XSD_NODE *xsdNode)
80 {
81 assert(xsdNode);
82 return xsdNode->nodeType;
83 }
84
85
86
GWEN_XsdNode_GetName(const GWEN_XSD_NODE * xsdNode)87 const char *GWEN_XsdNode_GetName(const GWEN_XSD_NODE *xsdNode)
88 {
89 assert(xsdNode);
90 return xsdNode->name;
91 }
92
93
94
GWEN_XsdNode_GetFlags(const GWEN_XSD_NODE * xsdNode)95 uint32_t GWEN_XsdNode_GetFlags(const GWEN_XSD_NODE *xsdNode)
96 {
97 assert(xsdNode);
98 return xsdNode->flags;
99 }
100
101
102
GWEN_XsdNode_SetFlags(GWEN_XSD_NODE * xsdNode,uint32_t fl)103 void GWEN_XsdNode_SetFlags(GWEN_XSD_NODE *xsdNode, uint32_t fl)
104 {
105 assert(xsdNode);
106 xsdNode->flags=fl;
107 }
108
109
110
GWEN_XsdNode_AddFlags(GWEN_XSD_NODE * xsdNode,uint32_t fl)111 void GWEN_XsdNode_AddFlags(GWEN_XSD_NODE *xsdNode, uint32_t fl)
112 {
113 assert(xsdNode);
114 xsdNode->flags|=fl;
115 }
116
117
118
GWEN_XsdNode_SubFlags(GWEN_XSD_NODE * xsdNode,uint32_t fl)119 void GWEN_XsdNode_SubFlags(GWEN_XSD_NODE *xsdNode, uint32_t fl)
120 {
121 assert(xsdNode);
122 xsdNode->flags&=~fl;
123 }
124
125
126
GWEN_XsdNode_GetParent(const GWEN_XSD_NODE * xsdNode)127 GWEN_XSD_NODE *GWEN_XsdNode_GetParent(const GWEN_XSD_NODE *xsdNode)
128 {
129 assert(xsdNode);
130 return xsdNode->parent;
131 }
132
133
134
GWEN_XsdNode_GetChildren(const GWEN_XSD_NODE * xsdNode)135 GWEN_XSD_NODE_LIST *GWEN_XsdNode_GetChildren(const GWEN_XSD_NODE *xsdNode)
136 {
137 assert(xsdNode);
138 return xsdNode->children;
139 }
140
141
142
GWEN_XsdNode_AddChild(GWEN_XSD_NODE * xsdNode,GWEN_XSD_NODE * newChild)143 void GWEN_XsdNode_AddChild(GWEN_XSD_NODE *xsdNode, GWEN_XSD_NODE *newChild)
144 {
145 assert(xsdNode);
146 assert(newChild);
147 GWEN_XsdNode_List_Add(newChild, xsdNode->children);
148 newChild->parent=xsdNode;
149 }
150
151
152
GWEN_XsdNode_Unlink(GWEN_XSD_NODE * xsdNode)153 void GWEN_XsdNode_Unlink(GWEN_XSD_NODE *xsdNode)
154 {
155 GWEN_XsdNode_List_Del(xsdNode);
156 xsdNode->parent=NULL;
157 }
158
159
160
GWEN_XsdNode_SetReadFn(GWEN_XSD_NODE * xsdNode,GWEN_XSDNODE_READ_FN fn)161 GWEN_XSDNODE_READ_FN GWEN_XsdNode_SetReadFn(GWEN_XSD_NODE *xsdNode,
162 GWEN_XSDNODE_READ_FN fn)
163 {
164 GWEN_XSDNODE_READ_FN oldFn;
165
166 assert(xsdNode);
167 oldFn=xsdNode->readFn;
168 xsdNode->readFn=fn;
169 return oldFn;
170 }
171
172
173
GWEN_XsdNode_SetWriteFn(GWEN_XSD_NODE * xsdNode,GWEN_XSDNODE_WRITE_FN fn)174 GWEN_XSDNODE_WRITE_FN GWEN_XsdNode_SetWriteFn(GWEN_XSD_NODE *xsdNode,
175 GWEN_XSDNODE_WRITE_FN fn)
176 {
177 GWEN_XSDNODE_WRITE_FN oldFn;
178
179 assert(xsdNode);
180 oldFn=xsdNode->writeFn;
181 xsdNode->writeFn=fn;
182 return oldFn;
183 }
184
185
186
GWEN_XsdNode_Read(GWEN_XSD_NODE * xsdNode,GWEN_XMLNODE * xmlNode,GWEN_DB_NODE * db)187 int GWEN_XsdNode_Read(GWEN_XSD_NODE *xsdNode,
188 GWEN_XMLNODE *xmlNode,
189 GWEN_DB_NODE *db)
190 {
191 assert(xsdNode);
192 if (xsdNode->readFn)
193 return xsdNode->readFn(xsdNode, xmlNode, db);
194 else
195 return GWEN_ERROR_NOT_SUPPORTED;
196 }
197
198
199
GWEN_XsdNode_Write(GWEN_XSD_NODE * xsdNode,GWEN_XMLNODE * xmlNode,GWEN_DB_NODE * db)200 int GWEN_XsdNode_Write(GWEN_XSD_NODE *xsdNode,
201 GWEN_XMLNODE *xmlNode,
202 GWEN_DB_NODE *db)
203 {
204 assert(xsdNode);
205 if (xsdNode->writeFn)
206 return xsdNode->writeFn(xsdNode, xmlNode, db);
207 else
208 return GWEN_ERROR_NOT_SUPPORTED;
209 }
210
211
212
213
214