gwenhywfar  4.99.15beta
xmlctx.c
Go to the documentation of this file.
1 /***************************************************************************
2  $RCSfile$
3  -------------------
4  cvs : $Id: xsd.c 656 2004-12-22 17:02:05Z aquamaniac $
5  begin : Sat Jun 28 2003
6  copyright : (C) 2003 by Martin Preuss
7  email : martin@libchipcard.de
8 
9  ***************************************************************************
10  * *
11  * This library is free software; you can redistribute it and/or *
12  * modify it under the terms of the GNU Lesser General Public *
13  * License as published by the Free Software Foundation; either *
14  * version 2.1 of the License, or (at your option) any later version. *
15  * *
16  * This library is distributed in the hope that it will be useful, *
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
19  * Lesser General Public License for more details. *
20  * *
21  * You should have received a copy of the GNU Lesser General Public *
22  * License along with this library; if not, write to the Free Software *
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
24  * MA 02111-1307 USA *
25  * *
26  ***************************************************************************/
27 
28 #ifdef HAVE_CONFIG_H
29 # include <config.h>
30 #endif
31 
32 
33 #include "xmlctx_p.h"
34 #include "gwenhywfar/debug.h"
35 #include "gwenhywfar/misc.h"
36 #include "gwenhywfar/text.h"
37 #include "gwenhywfar/path.h"
38 #include "i18n_l.h"
39 
40 #include <stdlib.h>
41 #include <assert.h>
42 #include <string.h>
43 #include <ctype.h>
44 
45 
46 
48 
49 
50 
51 
53 {
54  GWEN_XML_CONTEXT *ctx;
55 
57  ctx->_refCount=1;
59 
60  ctx->flags=flags;
61 
62  return ctx;
63 }
64 
65 
66 
68 {
69  if (ctx) {
70  assert(ctx->_refCount);
71  if (ctx->_refCount==1) {
73  ctx->_refCount=0;
74  GWEN_FREE_OBJECT(ctx);
75  }
76  else
77  ctx->_refCount--;
78  }
79 }
80 
81 
82 
84 {
85  assert(ctx);
86  assert(ctx->_refCount);
87  ctx->_refCount++;
88 }
89 
90 
91 
93 {
94  assert(ctx);
95  return ctx->flags;
96 }
97 
98 
99 
101 {
102  assert(ctx);
103  ctx->flags=f;
104 }
105 
106 
107 
109 {
110  assert(ctx);
111  return ctx->depth;
112 }
113 
114 
115 
117 {
118  assert(ctx);
119  ctx->depth=i;
120 }
121 
122 
123 
125 {
126  assert(ctx);
127  ctx->depth++;
128 }
129 
130 
131 
133 {
134  assert(ctx);
135  if (ctx->depth<1)
136  return -1;
137  ctx->depth--;
138  return 0;
139 }
140 
141 
142 
144 {
145  assert(ctx);
146  return ctx->finishedElements;
147 }
148 
149 
150 
152 {
153  assert(ctx);
154  ctx->finishedElements++;
155 }
156 
157 
158 
160 {
161  assert(ctx);
162  ctx->finishedElements=0;
163 }
164 
165 
166 
168 {
169  assert(ctx);
170  ctx->currentNode=n;
171 }
172 
173 
174 
176 {
177  assert(ctx);
178  return ctx->currentNode;
179 }
180 
181 
182 
184 {
185  assert(ctx);
186  ctx->currentHeader=n;
187 }
188 
189 
190 
192 {
193  assert(ctx);
194  return ctx->currentHeader;
195 }
196 
197 
198 
201 {
203 
204  assert(ctx);
205  of=ctx->startTagFn;
206  ctx->startTagFn=f;
207  return of;
208 }
209 
210 
211 
214 {
216 
217  assert(ctx);
218  of=ctx->endTagFn;
219  ctx->endTagFn=f;
220  return of;
221 }
222 
223 
224 
227 {
229 
230  assert(ctx);
231  of=ctx->addDataFn;
232  ctx->addDataFn=f;
233  return of;
234 }
235 
236 
237 
240 {
242 
243  assert(ctx);
244  of=ctx->addAttrFn;
245  ctx->addAttrFn=f;
246  return of;
247 }
248 
249 
250 
253 {
255 
256  assert(ctx);
257  of=ctx->addCommentFn;
258  ctx->addCommentFn=f;
259  return of;
260 }
261 
262 
263 
264 
265 int GWEN_XmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
266 {
267  assert(ctx);
268 
269  if (ctx->startTagFn)
270  return ctx->startTagFn(ctx, tagName);
271  else {
272  DBG_INFO(GWEN_LOGDOMAIN, "Starting tag: [%s]", tagName);
273  return 0;
274  }
275 }
276 
277 
278 
279 int GWEN_XmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing)
280 {
281  assert(ctx);
282 
283  if (ctx->endTagFn)
284  return ctx->endTagFn(ctx, closing);
285  else {
286  DBG_INFO(GWEN_LOGDOMAIN, "Ending tag (%s)", closing?"closing":"not closing");
287  return 0;
288  }
289 }
290 
291 
292 
293 int GWEN_XmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data)
294 {
295  assert(ctx);
296 
297  if (ctx->addDataFn)
298  return ctx->addDataFn(ctx, data);
299  else {
300  DBG_INFO(GWEN_LOGDOMAIN, "Adding data: [%s]", data);
301  return 0;
302  }
303 }
304 
305 
306 
307 int GWEN_XmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data)
308 {
309  assert(ctx);
310 
311  if (ctx->addCommentFn)
312  return ctx->addCommentFn(ctx, data);
313  else {
314  DBG_INFO(GWEN_LOGDOMAIN, "Adding comment: [%s]", data);
315  return 0;
316  }
317 }
318 
319 
320 
322  const char *attrName,
323  const char *attrData)
324 {
325  assert(ctx);
326 
327  if (ctx->addAttrFn)
328  return ctx->addAttrFn(ctx, attrName, attrData);
329  else {
330  DBG_INFO(GWEN_LOGDOMAIN, "Adding attribute: [%s]=[%s]",
331  attrName, attrData);
332  return 0;
333  }
334 }
335 
336 
337 
338 
339 
340 
341 
342 
344 {
345  GWEN_XML_CONTEXT *ctx;
346 
347  ctx=GWEN_XmlCtx_new(flags);
348  assert(ctx);
349 
351 
357 
358  return ctx;
359 }
360 
361 
362 
363 int GWEN_XmlCtxStore_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
364 {
365  GWEN_XMLNODE *currNode;
366  GWEN_XMLNODE *newNode;
367 
368  currNode=GWEN_XmlCtx_GetCurrentNode(ctx);
369  if (currNode==NULL)
370  return GWEN_ERROR_INVALID;
371 
372  if (*tagName=='?' && (GWEN_XmlCtx_GetFlags(ctx) & GWEN_XML_FLAGS_HANDLE_HEADERS)) {
373  newNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, tagName);
374  assert(newNode);
375  DBG_VERBOUS(GWEN_LOGDOMAIN, "Adding header [%s] to [%s]",
376  GWEN_XMLNode_GetData(newNode),
377  GWEN_XMLNode_GetData(currNode));
378  GWEN_XMLNode_AddHeader(currNode, newNode);
379  GWEN_XmlCtx_SetCurrentHeader(ctx, newNode);
380  }
381  else if (strcasecmp(tagName, "!DOCTYPE")==0) {
382  newNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, tagName);
383  assert(newNode);
384  DBG_VERBOUS(GWEN_LOGDOMAIN, "Adding header [%s] to [%s]",
385  GWEN_XMLNode_GetData(newNode),
386  GWEN_XMLNode_GetData(currNode));
387  GWEN_XMLNode_AddHeader(currNode, newNode);
388  GWEN_XmlCtx_SetCurrentHeader(ctx, newNode);
389  }
390  else if (*tagName=='/') {
391  const char *s;
392 
393  tagName++;
394  DBG_VERBOUS(GWEN_LOGDOMAIN, "Finishing tag [%s]", tagName);
395  s=GWEN_XMLNode_GetData(currNode);
396  if (s==NULL) {
397  DBG_INFO(GWEN_LOGDOMAIN, "Current node tag has no name");
398  return GWEN_ERROR_BAD_DATA;
399  }
400 
401  if (strcasecmp(s, tagName)!=0) {
404  "Endtag does not match curent tag (%s != %s)", s, tagName);
405  return GWEN_ERROR_BAD_DATA;
406  }
407  else {
408  newNode=currNode;
409 
410  while ((newNode=GWEN_XMLNode_GetParent(newNode))) {
412  s=GWEN_XMLNode_GetData(newNode);
413  if (strcasecmp(s, tagName)==0)
414  break;
415  }
416  if (newNode)
417  newNode=GWEN_XMLNode_GetParent(newNode);
418  if (newNode) {
419  GWEN_XmlCtx_SetCurrentNode(ctx, newNode);
421  }
422  else {
423  DBG_INFO(GWEN_LOGDOMAIN, "No matching parent node for [%s]",
424  tagName);
425  return GWEN_ERROR_BAD_DATA;
426  }
427  }
428  }
429  else {
430  newNode=GWEN_XMLNode_GetParent(currNode);
431  if (newNode==NULL) {
432  DBG_INFO(GWEN_LOGDOMAIN, "No parent node at [%s]", tagName);
433  return GWEN_ERROR_BAD_DATA;
434  }
435  GWEN_XmlCtx_SetCurrentNode(ctx, newNode);
437  }
438  /* one more element finished */
440  }
441  else {
442  newNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, tagName);
443  assert(newNode);
444  GWEN_XMLNode_AddChild(currNode, newNode);
445  GWEN_XmlCtx_SetCurrentNode(ctx, newNode);
447  DBG_VERBOUS(GWEN_LOGDOMAIN, "Starting tag [%s]", tagName);
448  }
449 
450  return 0;
451 }
452 
453 
454 
456 {
457  GWEN_XMLNODE *currNode;
458 
459  currNode=GWEN_XmlCtx_GetCurrentHeader(ctx);
460  if (currNode) {
461  DBG_VERBOUS(GWEN_LOGDOMAIN, "Ending header [%s]", GWEN_XMLNode_GetData(currNode));
463  }
464  else {
465  currNode=GWEN_XmlCtx_GetCurrentNode(ctx);
466  if (currNode==NULL)
467  return GWEN_ERROR_INVALID;
468  DBG_VERBOUS(GWEN_LOGDOMAIN, "Ending tag [%s] (%s)",
469  GWEN_XMLNode_GetData(currNode),
470  closing?"closing":"not closing");
471 
472  if (closing) {
473  GWEN_XMLNODE *newNode;
474 
475  newNode=GWEN_XMLNode_GetParent(currNode);
476  if (newNode==NULL) {
477  DBG_INFO(GWEN_LOGDOMAIN, "No parent node at [%s]", GWEN_XMLNode_GetData(currNode));
478  return GWEN_ERROR_BAD_DATA;
479  }
480  GWEN_XmlCtx_SetCurrentNode(ctx, newNode);
481  /* one more element finished */
484  }
485  }
486 
487  return 0;
488 }
489 
490 
491 
492 int GWEN_XmlCtxStore_AddData(GWEN_XML_CONTEXT *ctx, const char *data)
493 {
494  GWEN_XMLNODE *currNode;
495  GWEN_BUFFER *buf;
496  uint32_t flags;
497 
498  flags=GWEN_XmlCtx_GetFlags(ctx);
499  currNode=GWEN_XmlCtx_GetCurrentNode(ctx);
500  if (currNode==NULL)
501  return GWEN_ERROR_INVALID;
502 
503  buf=GWEN_Buffer_new(0, 64, 0, 1);
504  if (GWEN_Text_UnescapeXmlToBuffer(data, buf)) {
505  GWEN_Buffer_free(buf);
506  DBG_INFO(GWEN_LOGDOMAIN, "here");
507  return GWEN_ERROR_BAD_DATA;
508  }
509 
510  if (!(flags & GWEN_XML_FLAGS_NO_CONDENSE) ||
511  (flags & GWEN_XML_FLAGS_KEEP_CNTRL) ||
512  (flags & GWEN_XML_FLAGS_KEEP_BLANKS)) {
513  const uint8_t *p;
514  uint8_t *dst;
515  uint8_t *src;
516  unsigned int size;
517  unsigned int i;
518  int lastWasBlank;
519  uint8_t *lastBlankPos;
520  uint32_t bStart=0;
521 
522  dst=(uint8_t *)GWEN_Buffer_GetStart(buf);
523  src=dst;
524  if (!(flags & GWEN_XML_FLAGS_KEEP_BLANKS)) {
525  if (flags & GWEN_XML_FLAGS_KEEP_CNTRL) {
526  while (*src && (*src==32 || *src==9))
527  src++;
528  }
529  else {
530  while (*src && *src<33)
531  src++;
532  }
533  }
534 
535  p=src;
536  bStart=src-((uint8_t *)GWEN_Buffer_GetStart(buf));
537  size=GWEN_Buffer_GetUsedBytes(buf)-bStart;
538  lastWasBlank=0;
539  lastBlankPos=0;
540 
541  for (i=0; i<size; i++) {
542  uint8_t c;
543 
544  c=*p;
545  if (!(flags & GWEN_XML_FLAGS_KEEP_CNTRL) && c<32)
546  c=32;
547 
548  /* remember next loop whether this char was a blank */
549  if (!(flags & GWEN_XML_FLAGS_NO_CONDENSE) && c==32) {
550  if (!lastWasBlank) {
551  /* store only one blank */
552  lastWasBlank=1;
553  lastBlankPos=dst;
554  *(dst++)=c;
555  }
556  }
557  else {
558  lastWasBlank=0;
559  lastBlankPos=0;
560  *(dst++)=c;
561  }
562  p++;
563  }
564 
565  /* remove trailing blanks */
566  if (lastBlankPos!=0)
567  dst=lastBlankPos;
568 
569  size=dst-(uint8_t *)GWEN_Buffer_GetStart(buf);
570  GWEN_Buffer_Crop(buf, 0, size);
571  }
572 
573  if (GWEN_Buffer_GetUsedBytes(buf)) {
574  GWEN_XMLNODE *newNode;
575 
577  assert(newNode);
578  GWEN_XMLNode_AddChild(currNode, newNode);
579  DBG_VERBOUS(GWEN_LOGDOMAIN, "Setting this data: [%s]", GWEN_Buffer_GetStart(buf));
580  }
581  GWEN_Buffer_free(buf);
582 
583  return 0;
584 }
585 
586 
587 
589 {
590  return 0;
591 }
592 
593 
594 
596  const char *attrName,
597  const char *attrData)
598 {
599  GWEN_XMLNODE *currNode;
600 
601  currNode=GWEN_XmlCtx_GetCurrentHeader(ctx);
602  if (currNode) {
603  DBG_VERBOUS(GWEN_LOGDOMAIN, "Setting attribute of header [%s]: [%s]=[%s]",
604  GWEN_XMLNode_GetData(currNode), attrName, attrData);
605  GWEN_XMLNode_SetProperty(currNode, attrName, attrData);
606  }
607  else {
608  int isNormalProperty=1;
609 
610  currNode=GWEN_XmlCtx_GetCurrentNode(ctx);
611  if (currNode==NULL)
612  return GWEN_ERROR_INVALID;
613  if (attrData==NULL)
614  attrData="";
615 
616  if (ctx->flags & GWEN_XML_FLAGS_HANDLE_NAMESPACES) {
617  if (strcasecmp(attrName, "xmlns")==0) {
619 
620  DBG_VERBOUS(GWEN_LOGDOMAIN, "Adding namespace [%s] to node [%s]",
621  attrData, GWEN_XMLNode_GetData(currNode));
622  ns=GWEN_XMLNode_NameSpace_new("", attrData);
623  GWEN_XMLNode_AddNameSpace(currNode, ns);
625  isNormalProperty=0;
626  }
627  else if (strncasecmp(attrName, "xmlns:", 6)==0) {
628  const char *name;
629 
630  name=strchr(attrName, ':');
631  if (name) {
632  name++;
633  if (*name) {
635 
636  DBG_VERBOUS(GWEN_LOGDOMAIN, "Adding namespace [%s]=[%s]",
637  name, attrData);
638  ns=GWEN_XMLNode_NameSpace_new(name, attrData);
639  GWEN_XMLNode_AddNameSpace(currNode, ns);
641  isNormalProperty=0;
642  }
643  }
644  }
645  }
646 
647  if (isNormalProperty) {
648  GWEN_BUFFER *buf;
649 
650  DBG_VERBOUS(GWEN_LOGDOMAIN, "Setting attribute of tag [%s]: [%s]=[%s]",
651  GWEN_XMLNode_GetData(currNode), attrName, attrData);
652  buf=GWEN_Buffer_new(0, 64, 0, 1);
653  if (GWEN_Text_UnescapeXmlToBuffer(attrData, buf)) {
654  GWEN_Buffer_free(buf);
655  DBG_INFO(GWEN_LOGDOMAIN, "here");
656  return GWEN_ERROR_BAD_DATA;
657  }
658  GWEN_XMLNode_SetProperty(currNode, attrName, GWEN_Buffer_GetStart(buf));
659  GWEN_Buffer_free(buf);
660  }
661  }
662 
663  return 0;
664 }
665 
666 
667 
668 
669 
670 
int(* GWEN_XMLCTX_ADDATTR_FN)(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
Definition: xmlctx.h:54
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
Definition: xml.h:149
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1291
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
#define GWEN_ERROR_INVALID
Definition: error.h:67
GWEN_XMLCTX_ADDATTR_FN GWEN_XmlCtx_SetAddAttrFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ADDATTR_FN f)
Definition: xmlctx.c:238
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:282
GWEN_XMLCTX_STARTTAG_FN GWEN_XmlCtx_SetStartTagFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_STARTTAG_FN f)
Definition: xmlctx.c:199
#define GWEN_XML_FLAGS_KEEP_BLANKS
Definition: xml.h:87
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:297
void GWEN_XmlCtx_ResetFinishedElement(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:159
#define DBG_VERBOUS(dbg_logger, format, args...)
Definition: debug.h:216
int GWEN_XmlCtx_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
Definition: xmlctx.c:321
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:322
int GWEN_XmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
Definition: xmlctx.c:265
GWEN_XML_CONTEXT * GWEN_XmlCtx_new(uint32_t flags)
Definition: xmlctx.c:52
int(* GWEN_XMLCTX_ADDCOMMENT_FN)(GWEN_XML_CONTEXT *ctx, const char *data)
Definition: xmlctx.h:52
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_XMLCTX_ENDTAG_FN GWEN_XmlCtx_SetEndTagFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ENDTAG_FN f)
Definition: xmlctx.c:212
void GWEN_XMLNode_AddNameSpace(GWEN_XMLNODE *n, const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1367
int GWEN_XmlCtx_GetDepth(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:108
void GWEN_XmlCtx_Attach(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:83
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
void GWEN_XMLNode_NameSpace_free(GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1969
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
int(* GWEN_XMLCTX_ENDTAG_FN)(GWEN_XML_CONTEXT *ctx, int closing)
Definition: xmlctx.h:49
uint32_t GWEN_XmlCtx_GetFinishedElement(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:143
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_new(const char *name, const char *url)
Definition: xml.c:1951
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:67
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
void GWEN_XmlCtx_SetCurrentHeader(GWEN_XML_CONTEXT *ctx, GWEN_XMLNODE *n)
Definition: xmlctx.c:183
int GWEN_XmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing)
Definition: xmlctx.c:279
int GWEN_XmlCtxStore_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
Definition: xmlctx.c:363
#define GWEN_XML_FLAGS_NO_CONDENSE
Definition: xml.h:79
void GWEN_XmlCtx_SetDepth(GWEN_XML_CONTEXT *ctx, int i)
Definition: xmlctx.c:116
int GWEN_XmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data)
Definition: xmlctx.c:293
GWEN_XMLCTX_ADDCOMMENT_FN GWEN_XmlCtx_SetAddCommentFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ADDCOMMENT_FN f)
Definition: xmlctx.c:251
void GWEN_XmlCtx_IncDepth(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:124
#define GWEN_XML_FLAGS_TOLERANT_ENDTAGS
Definition: xml.h:103
void GWEN_XmlCtx_IncFinishedElement(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:151
GWEN_XMLNODE * GWEN_XmlCtx_GetCurrentHeader(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:191
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition: xmlctx.c:343
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
int GWEN_Text_UnescapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1829
int GWEN_XmlCtxStore_AddComment(GWEN_UNUSED GWEN_XML_CONTEXT *ctx, GWEN_UNUSED const char *data)
Definition: xmlctx.c:588
void GWEN_XmlCtx_SetFlags(GWEN_XML_CONTEXT *ctx, uint32_t f)
Definition: xmlctx.c:100
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:85
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
int(* GWEN_XMLCTX_STARTTAG_FN)(GWEN_XML_CONTEXT *ctx, const char *tagName)
Definition: xmlctx.h:47
#define GWEN_XML_FLAGS_KEEP_CNTRL
Definition: xml.h:85
GWEN_XMLNODE * GWEN_XMLNode_GetParent(const GWEN_XMLNODE *n)
Definition: xml.c:416
int GWEN_XmlCtxStore_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
Definition: xmlctx.c:595
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
Definition: buffer.c:1020
int(* GWEN_XMLCTX_ADDDATA_FN)(GWEN_XML_CONTEXT *ctx, const char *data)
Definition: xmlctx.h:50
int GWEN_XmlCtx_DecDepth(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:132
uint32_t GWEN_XmlCtx_GetFlags(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:92
void GWEN_XmlCtx_SetCurrentNode(GWEN_XML_CONTEXT *ctx, GWEN_XMLNODE *n)
Definition: xmlctx.c:167
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:177
int GWEN_XmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data)
Definition: xmlctx.c:307
GWEN_XMLCTX_ADDDATA_FN GWEN_XmlCtx_SetAddDataFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ADDDATA_FN f)
Definition: xmlctx.c:225
int GWEN_XmlCtxStore_EndTag(GWEN_XML_CONTEXT *ctx, int closing)
Definition: xmlctx.c:455
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition: xml.h:94
#define GWEN_XML_FLAGS_HANDLE_NAMESPACES
Definition: xml.h:105
GWEN_XMLNODE * GWEN_XmlCtx_GetCurrentNode(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:175
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:148
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition: xmlctx.h:39
#define GWEN_UNUSED
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423
int GWEN_XmlCtxStore_AddData(GWEN_XML_CONTEXT *ctx, const char *data)
Definition: xmlctx.c:492