gwenhywfar  5.14.1
xmlrw.c
Go to the documentation of this file.
1 /***************************************************************************
2  copyright : (C) 2020 by Martin Preuss
3  email : martin@libchipcard.de
4 
5  ***************************************************************************
6  * *
7  * This library is free software; you can redistribute it and/or *
8  * modify it under the terms of the GNU Lesser General Public *
9  * License as published by the Free Software Foundation; either *
10  * version 2.1 of the License, or (at your option) any later version. *
11  * *
12  * This library is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
15  * Lesser General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU Lesser General Public *
18  * License along with this library; if not, write to the Free Software *
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20  * MA 02111-1307 USA *
21  * *
22  ***************************************************************************/
23 
24 
25 /* this file is included from xml.c */
26 
27 
28 
30 {
31  int i;
32  int rv=0;
33 
34  for (i=0; i<ind; i++) {
35  GWEN_FASTBUFFER_WRITEBYTE(fb, rv, ' ');
36  if (rv<0) {
37  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
38  return rv;
39  }
40  }
41  return 0;
42 }
43 
44 
45 
47 {
49 
50  ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
51  while (ns) {
52  const char *name;
53  const char *url;
54  int rv;
55 
58  GWEN_FASTBUFFER_WRITEBYTE(fb, rv, ' ');
59  if (rv<0) {
60  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
61  return rv;
62  }
63  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "xmlns", -1);
64  if (rv<0) {
65  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
66  return rv;
67  }
68  if (name && *name) {
69  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, ":", -1);
70  if (rv<0) {
71  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
72  return rv;
73  }
74  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, name, -1);
75  if (rv<0) {
76  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
77  return rv;
78  }
79  }
80  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "=\"", -1);
81  if (rv<0) {
82  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
83  return rv;
84  }
85  if (url) {
86  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, url, -1);
87  if (rv<0) {
88  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
89  return rv;
90  }
91  }
92  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "\"", -1);
93  if (rv<0) {
94  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
95  return rv;
96  }
97 
99  }
100 
101  return 0;
102 }
103 
104 
105 
106 static int GWEN_XMLNode__WritePropertiesToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, const char *encoding)
107 {
108  GWEN_XMLPROPERTY *p;
109 
110  p=n->properties;
111  if (p) {
112  GWEN_BUFFER *buf;
113  int rv=0;
114 
115  buf=GWEN_Buffer_new(0, 256, 0, 1);
116  while (p) {
117  GWEN_FASTBUFFER_WRITEBYTE(fb, rv, ' ');
118  if (rv<0) {
119  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
120  GWEN_Buffer_free(buf);
121  return rv;
122  }
123  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, p->name, -1);
124  if (rv<0) {
125  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
126  GWEN_Buffer_free(buf);
127  return rv;
128  }
129  if (p->value) {
130  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "=\"", -1);
131  if (rv<0) {
132  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
133  GWEN_Buffer_free(buf);
134  return rv;
135  }
136  rv=GWEN_Text_ConvertCharset("UTF-8", encoding, p->value, strlen(p->value), buf);
137  if (rv<0) {
138  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
139  GWEN_Buffer_free(buf);
140  return rv;
141  }
143  if (rv<0) {
144  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
145  GWEN_Buffer_free(buf);
146  return rv;
147  }
148  GWEN_Buffer_Reset(buf);
149  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "\"", -1);
150  if (rv<0) {
151  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
152  GWEN_Buffer_free(buf);
153  return rv;
154  }
155  }
156  p=p->next;
157  }
158  GWEN_Buffer_free(buf);
159  }
160 
161  return 0;
162 }
163 
164 
165 
167  GWEN_FAST_BUFFER *fb,
168  uint32_t flags,
169  const char *encoding,
170  unsigned int ind)
171 {
172  int rv;
173  int simpleTag=0;
174 
175  if (!(flags & GWEN_XML_FLAGS_SIMPLE)) {
176  if (flags & GWEN_XML_FLAGS_INDENT) {
177  rv=GWEN_XMLNode__WriteIndents(fb, ind);
178  if (rv<0) {
179  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
180  return rv;
181  }
182  }
183  }
184 
185  /* write element opening ("<NAME") */
186  if (n->data) {
187  GWEN_FASTBUFFER_WRITEBYTE(fb, rv, '<');
188  if (rv<0) {
189  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
190  return rv;
191  }
192  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, n->data, -1);
193  if (rv<0) {
194  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
195  return rv;
196  }
197  }
198  else {
199  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "<UNKNOWN", -1);
200  if (rv<0) {
201  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
202  return rv;
203  }
204  }
205 
206  /* write namespaces */
207  if (flags & GWEN_XML_FLAGS_HANDLE_NAMESPACES) {
209  if (rv<0) {
210  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
211  return rv;
212  }
213  }
214 
215  /* write properties */
216  rv=GWEN_XMLNode__WritePropertiesToStream(n, fb, encoding);
217  if (rv<0) {
218  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
219  return rv;
220  }
221 
222 
223  /* write element closing (">) */
224  if (n->data) {
225  if (n->data[0]=='?') {
226  simpleTag=1;
227  GWEN_FASTBUFFER_WRITEBYTE(fb, rv, '?');
228  if (rv<0) {
229  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
230  return rv;
231  }
232  }
233  else if (n->data[0]=='!') {
234  simpleTag=1;
235  }
236  }
237  if (flags & GWEN_XML_FLAGS_SIMPLE) {
238  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, ">", -1);
239  }
240  else {
241  GWEN_FASTBUFFER_WRITELINE(fb, rv, ">");
242  }
243  if (rv<0) {
244  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
245  return rv;
246  }
247 
248  /* probably write children */
249  if (!simpleTag) {
250  int hasSubTags;
251  GWEN_XMLNODE *c;
252 
253  hasSubTags=(GWEN_XMLNode_GetFirstTag(n)!=NULL);
254  if (hasSubTags) {
255  GWEN_FASTBUFFER_WRITELINE(fb, rv, "");
256  if (rv<0) {
257  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
258  return rv;
259  }
260  }
261 
263  while (c) {
264  rv=GWEN_XMLNode__WriteToStream(c, fb, flags, encoding, ind+2);
265  if (rv<0) {
266  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
267  return rv;
268  }
269  c=GWEN_XMLNode_Next(c);
270  }
271 
272  if (!(flags & GWEN_XML_FLAGS_SIMPLE)) {
273  if (flags & GWEN_XML_FLAGS_INDENT) {
274  rv=GWEN_XMLNode__WriteIndents(fb, ind);
275  if (rv<0) {
276  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
277  return rv;
278  }
279  }
280  }
281 
282  /* write closing tag ("</NAME>") */
283  if (n->data) {
284  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "</", -1);
285  if (rv<0) {
286  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
287  return rv;
288  }
289  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, n->data, -1);
290  if (rv<0) {
291  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
292  return rv;
293  }
294  if (flags & GWEN_XML_FLAGS_SIMPLE) {
295 #if 0
296  if (!hasSubTags) {
297  GWEN_FASTBUFFER_WRITELINE(fb, rv, ">");
298  }
299  else {
300  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, ">", -1);
301  }
302 #else
303  GWEN_FASTBUFFER_WRITELINE(fb, rv, ">");
304 #endif
305  }
306  else {
307  GWEN_FASTBUFFER_WRITELINE(fb, rv, ">");
308  }
309  if (rv<0) {
310  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
311  return rv;
312  }
313  }
314  else {
315  GWEN_FASTBUFFER_WRITELINE(fb, rv, "</UNKNOWN>");
316  if (rv<0) {
317  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
318  return rv;
319  }
320  }
321  }
322 
323  return 0;
324 }
325 
326 
327 
329  GWEN_FAST_BUFFER *fb,
330  uint32_t flags,
331  const char *encoding,
332  unsigned int ind)
333 {
334 
335  if (n->data) {
336  GWEN_BUFFER *buf;
337  int rv=0;
338 
339  if (!(flags & GWEN_XML_FLAGS_SIMPLE)) {
340  if (flags & GWEN_XML_FLAGS_INDENT) {
341  rv=GWEN_XMLNode__WriteIndents(fb, ind);
342  if (rv<0) {
343  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
344  return rv;
345  }
346  }
347  }
348 
349  buf=GWEN_Buffer_new(0, 256, 0, 1);
350  rv=GWEN_Text_ConvertCharset("UTF-8", encoding, n->data, strlen(n->data), buf);
351  if (rv<0) {
352  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
353  GWEN_Buffer_free(buf);
354  return rv;
355  }
357  if (rv<0) {
358  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
359  GWEN_Buffer_free(buf);
360  return rv;
361  }
362  GWEN_Buffer_free(buf);
363  if (!(flags & GWEN_XML_FLAGS_SIMPLE)) {
364  GWEN_FASTBUFFER_WRITELINE(fb, rv, "");
365  if (rv<0) {
366  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
367  return rv;
368  }
369  }
370  }
371 
372  return 0;
373 }
374 
375 
376 
378  GWEN_FAST_BUFFER *fb,
379  uint32_t flags,
380  const char *encoding,
381  unsigned int ind)
382 {
383 
384  if (n->data) {
385  GWEN_BUFFER *buf;
386  int rv=0;
387 
388  if (!(flags & GWEN_XML_FLAGS_SIMPLE)) {
389  if (flags & GWEN_XML_FLAGS_INDENT) {
390  rv=GWEN_XMLNode__WriteIndents(fb, ind);
391  if (rv<0) {
392  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
393  return rv;
394  }
395  }
396  }
397 
398  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "<!--", -1);
399  if (rv<0) {
400  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
401  return rv;
402  }
403 
404  buf=GWEN_Buffer_new(0, 256, 0, 1);
405  rv=GWEN_Text_ConvertCharset("UTF-8", encoding, n->data, strlen(n->data), buf);
406  if (rv<0) {
407  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
408  GWEN_Buffer_free(buf);
409  return rv;
410  }
412  if (rv<0) {
413  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
414  GWEN_Buffer_free(buf);
415  return rv;
416  }
417  GWEN_Buffer_free(buf);
418 
419  GWEN_FASTBUFFER_WRITEFORCED(fb, rv, "-->", -1);
420  if (rv<0) {
421  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
422  return rv;
423  }
424 
425  if (!(flags & GWEN_XML_FLAGS_SIMPLE)) {
426  GWEN_FASTBUFFER_WRITELINE(fb, rv, "");
427  if (rv<0) {
428  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
429  return rv;
430  }
431  }
432  }
433 
434  return 0;
435 }
436 
437 
438 
440  GWEN_FAST_BUFFER *fb,
441  uint32_t flags,
442  const char *encoding,
443  unsigned int ind)
444 {
445  int rv;
446 
447  assert(n);
448 
449  if (n->type==GWEN_XMLNodeTypeTag) {
450  rv=GWEN_XMLNode__WriteTagToStream(n, fb, flags, encoding, ind);
451  if (rv<0) {
452  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
453  return rv;
454  }
455  }
456  else if (n->type==GWEN_XMLNodeTypeData) {
457  rv=GWEN_XMLNode__WriteDataToStream(n, fb, flags, encoding, ind);
458  if (rv<0) {
459  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
460  return rv;
461  }
462  }
463  else if (n->type==GWEN_XMLNodeTypeComment) {
464  if (flags & GWEN_XML_FLAGS_HANDLE_COMMENTS) {
465  rv=GWEN_XMLNode__WriteCommentToStream(n, fb, flags, encoding, ind);
466  if (rv<0) {
467  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
468  return rv;
469  }
470  }
471  }
472  else {
473  DBG_ERROR(GWEN_LOGDOMAIN, "Unknown tag type (%d)", n->type);
474  }
475 
476  return 0;
477 }
478 
479 
480 
482  GWEN_XML_CONTEXT *ctx,
483  GWEN_SYNCIO *sio)
484 {
485  const GWEN_XMLNODE *nn;
486  const GWEN_XMLNODE *nchild;
487  const GWEN_XMLNODE *nheader;
488  uint32_t flags;
489  GWEN_FAST_BUFFER *fb;
490  int rv;
491 
492  flags=GWEN_XmlCtx_GetFlags(ctx);
493  nchild=GWEN_XMLNode_GetChild(n);
494  nheader=GWEN_XMLNode_GetHeader(n);
495 
496  fb=GWEN_FastBuffer_new(512, sio);
497 
498  if (nheader && (flags & GWEN_XML_FLAGS_HANDLE_HEADERS)) {
499 
500  nn=nheader;
501  while (nn) {
502  const GWEN_XMLNODE *next;
503 
504  rv=GWEN_XMLNode__WriteToStream(nn, fb, flags,
505  GWEN_XmlCtx_GetEncoding(ctx), 0);
506  if (rv<0) {
507  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
509  return rv;
510  }
511  next=GWEN_XMLNode_Next(nn);
512  if (next) {
513  int err;
514 
515  GWEN_FASTBUFFER_WRITELINE(fb, err, "");
516  if (err<0) {
517  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", err);
519  return err;
520  }
521  }
522  if (strcmp(GWEN_XMLNode_GetData(nn), "?xml")==0) {
523  const char *encoding;
524 
525  encoding=GWEN_XMLNode_GetProperty(nn, "encoding", NULL);
526  if (encoding) {
527  if (strcasecmp(encoding, "UTF-8")==0 ||
528  strcasecmp(encoding, "UTF8")==0)
529  encoding=NULL;
530  GWEN_XmlCtx_SetEncoding(ctx, encoding);
531  }
532  }
533 
534  nn=next;
535  }
536 
537  if (nchild) {
538  int err;
539 
540  GWEN_FASTBUFFER_WRITELINE(fb, err, "");
541  if (err<0) {
542  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", err);
544  return err;
545  }
546  }
547  }
548 
549  nn=nchild;
550  while (nn) {
551  const GWEN_XMLNODE *next;
552 
553  if (GWEN_XMLNode__WriteToStream(nn, fb, flags,
554  GWEN_XmlCtx_GetEncoding(ctx), 0))
555  return -1;
556  next=GWEN_XMLNode_Next(nn);
557  if (next) {
558  int err;
559 
560  GWEN_FASTBUFFER_WRITELINE(fb, err, "");
561  if (err<0) {
562  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", err);
564  return err;
565  }
566  }
567 
568  nn=next;
569  } /* while */
570 
571  GWEN_FASTBUFFER_FLUSH(fb, rv);
572  if (rv<0) {
573  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
575  return rv;
576  }
578 
579  return 0;
580 }
581 
582 
583 
585  const char *fname,
586  uint32_t flags)
587 {
588  GWEN_XML_CONTEXT *ctx;
589  GWEN_SYNCIO *sio;
590  int rv;
591 
596  rv=GWEN_SyncIo_Connect(sio);
597  if (rv<0) {
598  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
599  GWEN_SyncIo_free(sio);
600  return rv;
601  }
602 
603  /* create context and io layers */
604  ctx=GWEN_XmlCtxStore_new(NULL, flags);
605 
606  /* write data to stream */
607  rv=GWEN_XMLNode_WriteToStream(n, ctx, sio);
608  if (rv<0) {
609  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
611  GWEN_SyncIo_free(sio);
612  GWEN_XmlCtx_free(ctx);
613  return rv;
614  }
615 
616  /* close file */
618  GWEN_SyncIo_free(sio);
619 
620  GWEN_XmlCtx_free(ctx);
621 
622  return 0;
623 }
624 
625 
626 
627 int GWEN_XMLNode_toBuffer(const GWEN_XMLNODE *n, GWEN_BUFFER *buf, uint32_t flags)
628 {
629  GWEN_XML_CONTEXT *ctx;
630  GWEN_SYNCIO *sio;
631  int rv;
632 
633  sio=GWEN_SyncIo_Memory_new(buf, 0);
634 
635  /* create context and io layers */
636  ctx=GWEN_XmlCtxStore_new(NULL, flags);
637 
638  /* write data to stream */
639  rv=GWEN_XMLNode_WriteToStream(n, ctx, sio);
640  if (rv<0) {
641  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
642  GWEN_SyncIo_free(sio);
643  GWEN_XmlCtx_free(ctx);
644  return rv;
645  }
646 
647  GWEN_SyncIo_free(sio);
648 
649  GWEN_XmlCtx_free(ctx);
650 
651  return 0;
652 }
653 
654 
655 
656 
657 
658 
659 
660 
662  GWEN_FAST_BUFFER *fb,
663  GWEN_UNUSED uint32_t flags)
664 {
665  int chr;
666  unsigned char uc;
667  GWEN_BUFFER *dbuf;
668 
669  dbuf=GWEN_Buffer_new(0, 256, 0, 1);
670 
671  for (;;) {
672  GWEN_FASTBUFFER_PEEKBYTE(fb, chr);
673  if (chr<0) {
674  if (chr==GWEN_ERROR_EOF)
675  break;
676  else {
677  GWEN_Buffer_free(dbuf);
678  return chr;
679  }
680  }
681 
682  uc=(unsigned char) chr;
683  if (uc=='<')
684  break;
685  fb->bufferReadPos++;
686  GWEN_Buffer_AppendByte(dbuf, uc);
687  }
688 
689  if (GWEN_Buffer_GetUsedBytes(dbuf)) {
690  int rv;
691  uint32_t len;
692  char *s;
693 
694  len=GWEN_Buffer_GetUsedBytes(dbuf);
695  s=strdup(GWEN_Buffer_GetStart(dbuf));
696  assert(s);
697  GWEN_Buffer_Reset(dbuf);
699  s, len, dbuf);
700  free(s);
701  if (rv) {
702  GWEN_Buffer_free(dbuf);
703  return rv;
704  }
705  s=GWEN_Buffer_GetStart(dbuf);
706  if (*s) {
707  rv=GWEN_XmlCtx_AddData(ctx, s);
708  if (rv) {
709  GWEN_Buffer_free(dbuf);
710  return rv;
711  }
712  }
713  }
714  GWEN_Buffer_free(dbuf);
715 
716  return 0;
717 }
718 
719 
720 
722  GWEN_FAST_BUFFER *fb,
723  GWEN_UNUSED uint32_t flags,
724  GWEN_BUFFER *dbuf)
725 {
726  int chr;
727  unsigned char uc=0;
728  int rv;
729 
730  /* skip blanks */
731  for (;;) {
732  GWEN_FASTBUFFER_READBYTE(fb, chr);
733  if (chr<0) {
734  return chr;
735  }
736  uc=(unsigned char) chr;
737  if (uc>32)
738  break;
739  }
740 
741  if (uc=='/') {
742  /* read end tag */
743  GWEN_Buffer_AppendByte(dbuf, uc);
744  for (;;) {
745  GWEN_FASTBUFFER_READBYTE(fb, chr);
746  if (chr<0) {
747  return chr;
748  }
749  uc=(unsigned char) chr;
750  if (uc=='>' || uc<33)
751  break;
752 
753  GWEN_Buffer_AppendByte(dbuf, uc);
754  }
755 
757  if (rv) {
758  return rv;
759  }
760  if (uc!='>') {
761  for (;;) {
762  /* skip blanks, expect '>' */
763  GWEN_FASTBUFFER_READBYTE(fb, chr);
764  if (chr<0) {
765  return chr;
766  }
767  uc=(unsigned char) chr;
768  if (uc>32)
769  break;
770  }
771  }
772  if (uc!='>') {
773  DBG_ERROR(GWEN_LOGDOMAIN, "Unexpected character");
774  DBG_ERROR(GWEN_LOGDOMAIN, "Data so far:");
775  GWEN_Buffer_Dump(dbuf, 2);
776 
777  return GWEN_ERROR_BAD_DATA;
778  }
779 
780  /* tag finished */
781  rv=GWEN_XmlCtx_EndTag(ctx, 0);
782  if (rv) {
783  return rv;
784  }
785  return 0;
786  }
787  else if (uc=='!') {
788  /* check for comment */
789  GWEN_FASTBUFFER_PEEKBYTE(fb, chr);
790  if (chr<0) {
791  return chr;
792  }
793  uc=(unsigned char) chr;
794  if (uc=='-') {
795  fb->bufferReadPos++;
796  GWEN_FASTBUFFER_PEEKBYTE(fb, chr);
797  if (chr<0) {
798  return chr;
799  }
800  uc=(unsigned char) chr;
801  if (uc=='-') {
802  GWEN_BUFFER *cbuf;
803 
804  /* found comment */
805  fb->bufferReadPos++;
806  cbuf=GWEN_Buffer_new(0, 256, 0, 1);
807  for (;;) {
808  GWEN_FASTBUFFER_READBYTE(fb, chr);
809  if (chr<0) {
810  GWEN_Buffer_free(cbuf);
811  return chr;
812  }
813  uc=(unsigned char) chr;
814  GWEN_Buffer_AppendByte(cbuf, uc);
815  if (GWEN_Buffer_GetUsedBytes(cbuf)>2) {
816  char *p;
817 
818  p=GWEN_Buffer_GetStart(cbuf);
819  p+=GWEN_Buffer_GetUsedBytes(cbuf)-3;
820  if (strcmp(p, "-->")==0) {
821  uint32_t len;
822 
823  *p=0;
824  len=GWEN_Buffer_GetUsedBytes(cbuf)-3;
825  p=strdup(GWEN_Buffer_GetStart(cbuf));
826  assert(p);
827  GWEN_Buffer_Reset(cbuf);
829  p, len, cbuf);
830  free(p);
831  if (rv) {
832  GWEN_Buffer_free(cbuf);
833  return rv;
834  }
836  if (rv) {
837  GWEN_Buffer_free(cbuf);
838  return rv;
839  }
840  GWEN_Buffer_free(cbuf);
841  return 0;
842  }
843  }
844  }
845  }
846  else {
847  GWEN_Buffer_AppendString(dbuf, "!-");
848  }
849  }
850  else
851  uc='!';
852  }
853 
854  /* read name */
855  for (;;) {
856  if (uc==' ' || uc=='>' || uc=='/')
857  break;
858  else if (GWEN_Buffer_GetUsedBytes(dbuf)) {
859  unsigned char fc;
860 
861  fc=*GWEN_Buffer_GetStart(dbuf);
862  if ((fc=='!' && uc=='!') || (fc=='?' && uc=='?')) {
863  GWEN_FASTBUFFER_PEEKBYTE(fb, chr);
864  if (chr<0) {
865  return chr;
866  }
867  uc=(unsigned char) chr;
868  if (uc=='>') {
869  fb->bufferReadPos++;
870  break;
871  }
872  }
873  }
874 
875  GWEN_Buffer_AppendByte(dbuf, uc);
876 
877  GWEN_FASTBUFFER_READBYTE(fb, chr);
878  if (chr<0) {
879  if (chr==GWEN_ERROR_EOF) {
880  return chr;
881  }
882  else {
883  return chr;
884  }
885  }
886 
887  uc=(unsigned char) chr;
888  }
889 
890  /* tag started */
891  if (GWEN_Buffer_GetUsedBytes(dbuf)==0) {
892  DBG_ERROR(GWEN_LOGDOMAIN, "Element name missing");
893  return GWEN_ERROR_BAD_DATA;
894  }
895 
897  if (rv) {
898  return rv;
899  }
900 
901  if (uc=='/' || uc=='?' || uc=='!') {
902  GWEN_FASTBUFFER_PEEKBYTE(fb, chr);
903  if (chr<0) {
904  return chr;
905  }
906  uc=(unsigned char) chr;
907  if (uc=='>') {
908  fb->bufferReadPos++;
909  rv=GWEN_XmlCtx_EndTag(ctx, 1);
910  if (rv) {
911  return rv;
912  }
913  /* tag finished */
914  return 0;
915  }
916  }
917 
918  if (uc=='>') {
919  rv=GWEN_XmlCtx_EndTag(ctx, 0);
920  if (rv) {
921  return rv;
922  }
923  /* tag finished */
924  return 0;
925  }
926 
927  /* read attributes */
928  for (;;) {
929  GWEN_BUFFER *nbuf;
930  GWEN_BUFFER *vbuf=NULL;
931 
932  nbuf=GWEN_Buffer_new(0, 256, 0, 1);
933 
934  /* skip blanks */
935  for (;;) {
936  GWEN_FASTBUFFER_READBYTE(fb, chr);
937  if (chr<0) {
938  GWEN_Buffer_free(nbuf);
939  return chr;
940  }
941  uc=(unsigned char) chr;
942  if (uc>32)
943  break;
944  }
945 
946  /* read attribute name */
947  for (;;) {
948  if (uc=='/' || uc=='!' || uc=='?' || uc=='=' || uc=='>')
949  break;
950  GWEN_Buffer_AppendByte(nbuf, uc);
951 
952  GWEN_FASTBUFFER_READBYTE(fb, chr);
953  if (chr<0) {
954  GWEN_Buffer_free(nbuf);
955  return chr;
956  }
957  uc=(unsigned char) chr;
958  }
959 
960  if (GWEN_Buffer_GetUsedBytes(nbuf)) {
961  if (uc=='=') {
962  /* read attribute value if there is an equation mark */
963  int inQuote=0;
964  uint32_t len;
965 
966  vbuf=GWEN_Buffer_new(0, 256, 0, 1);
967  for (;;) {
968  GWEN_FASTBUFFER_READBYTE(fb, chr);
969  if (chr<0) {
970  GWEN_Buffer_free(nbuf);
971  return chr;
972  }
973  uc=(unsigned char) chr;
974  if (uc=='"') {
975  if (inQuote) {
976  inQuote=0;
977  break;
978  }
979  else
980  inQuote=1;
981  }
982  else {
983  if (!inQuote) {
984  if (uc=='>' || uc<33)
985  break;
986  else if (uc=='<') {
988  "Nested element definitions");
989  GWEN_Buffer_free(vbuf);
990  GWEN_Buffer_free(nbuf);
991  return GWEN_ERROR_BAD_DATA;
992  }
993  else if (GWEN_Buffer_GetUsedBytes(dbuf)) {
994  if (uc=='/' || uc=='!' || uc=='?') {
995  unsigned char tc;
996 
997  GWEN_FASTBUFFER_PEEKBYTE(fb, chr);
998  if (chr<0) {
999  GWEN_Buffer_free(vbuf);
1000  GWEN_Buffer_free(nbuf);
1001  return chr;
1002  }
1003  tc=(unsigned char) chr;
1004  if (tc=='>') {
1005  break;
1006  }
1007  }
1008  }
1009  }
1010  GWEN_Buffer_AppendByte(vbuf, uc);
1011  }
1012  }
1013  if (inQuote) {
1014  DBG_ERROR(GWEN_LOGDOMAIN, "No matching number of quote chars");
1015  GWEN_Buffer_free(vbuf);
1016  GWEN_Buffer_free(nbuf);
1017  return GWEN_ERROR_BAD_DATA;
1018  }
1019 
1020  len=GWEN_Buffer_GetUsedBytes(vbuf);
1021  if (len==0) {
1022  GWEN_Buffer_free(vbuf);
1023  vbuf=NULL;
1024  }
1025  else {
1026  char *s;
1027 
1028  s=strdup(GWEN_Buffer_GetStart(vbuf));
1029  GWEN_Buffer_Reset(vbuf);
1031  s, len, vbuf);
1032  free(s);
1033  if (rv) {
1034  GWEN_Buffer_free(vbuf);
1035  GWEN_Buffer_free(nbuf);
1036  return rv;
1037  }
1038  }
1039  }
1040  rv=GWEN_XmlCtx_AddAttr(ctx,
1041  GWEN_Buffer_GetStart(nbuf),
1042  vbuf?GWEN_Buffer_GetStart(vbuf):NULL);
1043  if (rv) {
1044  GWEN_Buffer_free(vbuf);
1045  GWEN_Buffer_free(nbuf);
1046  return rv;
1047  }
1048  }
1049 
1050  GWEN_Buffer_free(vbuf);
1051  GWEN_Buffer_free(nbuf);
1052 
1053  if (uc=='>' || uc=='?' || uc=='!' || uc=='/')
1054  break;
1055  }
1056 
1057  if (uc=='?' || uc=='!' || uc=='/') {
1058  unsigned char ucsave=uc;
1059 
1060  GWEN_FASTBUFFER_PEEKBYTE(fb, chr);
1061  if (chr<0) {
1062  return chr;
1063  }
1064  uc=(unsigned char) chr;
1065  if (uc=='>') {
1066  DBG_VERBOUS(GWEN_LOGDOMAIN, "Ending tag [%s]", GWEN_Buffer_GetStart(dbuf));
1067  fb->bufferReadPos++;
1068  rv=GWEN_XmlCtx_EndTag(ctx, 1);
1069  if (rv) {
1070  return rv;
1071  }
1072  /* tag finished */
1073  return 0;
1074  }
1075  else {
1077  "Got an unexpected character here (after %02x[%c]): %02x[%c], "
1078  "maybe the text contains unescaped XML characters?",
1079  ucsave, ucsave, uc, uc);
1080  }
1081  }
1082  else if (uc=='>') {
1083  rv=GWEN_XmlCtx_EndTag(ctx, 0);
1084  if (rv) {
1085  return rv;
1086  }
1087  /* tag finished */
1088  return 0;
1089  }
1090 
1092  "Internal error: Should never reach this point");
1093  return GWEN_ERROR_INTERNAL;
1094 }
1095 
1096 
1097 
1098 
1100 {
1101  int oks=0;
1102  int startingDepth;
1103  GWEN_BUFFER *workBuf;
1104 
1105  startingDepth=GWEN_XmlCtx_GetDepth(ctx);
1106 
1107  workBuf=GWEN_Buffer_new(0, 256, 0, 1);
1109  for (;;) {
1110  int rv;
1111 
1112  GWEN_FASTBUFFER_PEEKBYTE(fb, rv);
1113  if (rv<0) {
1114  if (rv!=GWEN_ERROR_EOF || !oks) {
1115  DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d), after reading %d bytes",
1116  rv, (int) GWEN_FastBuffer_GetBytesRead(fb));
1117  GWEN_Buffer_free(workBuf);
1118  return rv;
1119  }
1120  GWEN_Buffer_free(workBuf);
1121  return 0;
1122  }
1123 
1124  rv=GWEN_XML__ReadData(ctx, fb, GWEN_XmlCtx_GetFlags(ctx));
1125  if (rv) {
1126  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1127  GWEN_Buffer_free(workBuf);
1128  return rv;
1129  }
1130  oks=1;
1131 
1132  GWEN_FASTBUFFER_PEEKBYTE(fb, rv);
1133  if (rv<0) {
1134  if (rv!=GWEN_ERROR_EOF || !oks ||
1135  (GWEN_XmlCtx_GetDepth(ctx)!=startingDepth)) {
1136  DBG_INFO(GWEN_LOGDOMAIN, "here (rv=%d, oks=%d, depth=%d, startingDepth=%d)",
1137  rv, oks, GWEN_XmlCtx_GetDepth(ctx), startingDepth);
1138  GWEN_Buffer_free(workBuf);
1139  return rv;
1140  }
1141  GWEN_Buffer_free(workBuf);
1142  return 0;
1143  }
1144  else if (rv=='<') {
1145  fb->bufferReadPos++;
1146  rv=GWEN_XML__ReadTag(ctx, fb, GWEN_XmlCtx_GetFlags(ctx), workBuf);
1147  if (rv) {
1148  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1149  GWEN_Buffer_free(workBuf);
1150  return rv;
1151  }
1152  GWEN_Buffer_Reset(workBuf);
1153  oks=1;
1154  }
1155 
1156  if (GWEN_XmlCtx_GetFinishedElement(ctx) &&
1157  GWEN_XmlCtx_GetDepth(ctx)==startingDepth) {
1158  DBG_INFO(GWEN_LOGDOMAIN, "Finished element at depth %d", GWEN_XmlCtx_GetDepth(ctx));
1159  break;
1160  }
1161  }
1162 
1163  if (GWEN_XmlCtx_GetDepth(ctx)!=startingDepth) {
1165  "Not on same level where we started...(%d!=%d)",
1166  GWEN_XmlCtx_GetDepth(ctx), startingDepth);
1167  }
1168  GWEN_Buffer_free(workBuf);
1169 
1170  return 0;
1171 }
1172 
1173 
1174 
1176 {
1177  GWEN_FAST_BUFFER *fb;
1178  int oks=0;
1179 
1181  assert(fb);
1182  for (;;) {
1183  int rv;
1184 
1185  rv=GWEN_XML_ReadFromFastBuffer(ctx, fb);
1186  if (rv<0) {
1187  if (rv==GWEN_ERROR_EOF && oks)
1188  break;
1189  else {
1190  DBG_INFO(GWEN_LOGDOMAIN, "here (rv=%d, oks=%d)", rv, oks);
1192  return rv;
1193  }
1194  }
1195  oks=1;
1196  }
1197 
1199  return 0;
1200 }
1201 
1202 
1203 
1205 {
1206 #if 0
1207  GWEN_FAST_BUFFER *fb;
1208  int rv;
1209 
1211  assert(fb);
1212  rv=GWEN_XML_ReadFromFastBuffer(ctx, fb);
1213  if (rv) {
1214  DBG_INFO(GWEN_LOGDOMAIN, "here");
1216  return rv;
1217  }
1218 
1220  return 0;
1221 #else
1222  int rv;
1223 
1224  rv=GWEN_XML__ReadAllFromIo(ctx, sio);
1225  if (rv<0) {
1226  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1227  return rv;
1228  }
1229 
1230  return rv;
1231 #endif
1232 }
1233 
1234 
1235 
1237 {
1238  GWEN_SYNCIO *sio;
1239  int rv;
1240 
1243  rv=GWEN_SyncIo_Connect(sio);
1244  if (rv<0) {
1245  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1246  GWEN_SyncIo_free(sio);
1247  return rv;
1248  }
1249 
1250  rv=GWEN_XML__ReadAllFromIo(ctx, sio);
1251  if (rv<0) {
1252  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1254  GWEN_SyncIo_free(sio);
1255  return rv;
1256  }
1257 
1259  GWEN_SyncIo_free(sio);
1260 
1261  return 0;
1262 }
1263 
1264 
1265 
1267 {
1268  if (text && *text) {
1269  GWEN_SYNCIO *sio;
1270  int rv;
1271  GWEN_BUFFER *tbuf;
1272  int i;
1273 
1274  i=strlen(text)+1;
1275  tbuf=GWEN_Buffer_new((char *)text, i, i, 0);
1276  /* static buffer, don't resize */
1279  sio=GWEN_SyncIo_Memory_new(tbuf, 0);
1280 
1281  rv=GWEN_XML__ReadAllFromIo(ctx, sio);
1282  if (rv<0) {
1283  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1284  GWEN_SyncIo_free(sio);
1285  GWEN_Buffer_free(tbuf);
1286  return rv;
1287  }
1288 
1289  GWEN_SyncIo_free(sio);
1290  GWEN_Buffer_free(tbuf);
1291  }
1292  return 0;
1293 }
1294 
1295 
1296 
1297 
1298 int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
1299 {
1300  GWEN_XML_CONTEXT *ctx;
1301  GWEN_SYNCIO *sio;
1302  int rv;
1303 
1306  rv=GWEN_SyncIo_Connect(sio);
1307  if (rv<0) {
1308  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1309  GWEN_SyncIo_free(sio);
1310  return rv;
1311  }
1312 
1313  ctx=GWEN_XmlCtxStore_new(n, flags);
1314  rv=GWEN_XML__ReadAllFromIo(ctx, sio);
1315  if (rv<0) {
1316  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1318  GWEN_SyncIo_free(sio);
1319  GWEN_XmlCtx_free(ctx);
1320  return rv;
1321  }
1322 
1324  GWEN_SyncIo_free(sio);
1325 
1326  GWEN_XmlCtx_free(ctx);
1327 
1328  return 0;
1329 }
1330 
1331 
1332 
1333 GWEN_XMLNODE *GWEN_XMLNode_fromString(const char *s, int len, uint32_t flags)
1334 {
1335 #if 0
1336  GWEN_XML_CONTEXT *ctx;
1337  GWEN_SYNCIO *sio;
1338  GWEN_XMLNODE *n;
1339  int rv;
1340 
1341  if (len==0)
1342  len=strlen(s);
1343  sio=GWEN_SyncIo_Memory_fromBuffer((const uint8_t *)s, len);
1344 
1346  ctx=GWEN_XmlCtxStore_new(n, flags);
1347  rv=GWEN_XML__ReadAllFromIo(ctx, sio);
1348  if (rv<0) {
1349  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1350  GWEN_SyncIo_free(sio);
1351  GWEN_XmlCtx_free(ctx);
1352  GWEN_XMLNode_free(n);
1353  return NULL;
1354  }
1355 
1356  GWEN_SyncIo_free(sio);
1357 
1358  GWEN_XmlCtx_free(ctx);
1359 
1360  return n;
1361 #else
1362  GWEN_XML_CONTEXT *ctx;
1363  GWEN_SYNCIO *sio;
1364  GWEN_XMLNODE *n;
1365  int rv;
1366  GWEN_BUFFER *tbuf;
1367 
1368  tbuf=GWEN_Buffer_new((char *)s, len, len, 0);
1369  /* static buffer, don't resize */
1372  sio=GWEN_SyncIo_Memory_new(tbuf, 0);
1373 
1375  ctx=GWEN_XmlCtxStore_new(n, flags);
1376  rv=GWEN_XML__ReadAllFromIo(ctx, sio);
1377  if (rv<0) {
1378  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1379  GWEN_XmlCtx_free(ctx);
1380  GWEN_XMLNode_free(n);
1381  GWEN_SyncIo_free(sio);
1382  GWEN_Buffer_free(tbuf);
1383  return NULL;
1384  }
1385 
1386  GWEN_XmlCtx_free(ctx);
1387  GWEN_SyncIo_free(sio);
1388  GWEN_Buffer_free(tbuf);
1389 
1390  return n;
1391 #endif
1392 }
1393 
1394 
1395 
1396 
static int GWEN_XMLNode__WritePropertiesToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, const char *encoding)
Definition: xmlrw.c:106
GWEN_XMLNODE * GWEN_XMLNode_GetHeader(const GWEN_XMLNODE *n)
Definition: xml.c:1323
#define DBG_ERROR(dbg_logger, format,...)
Definition: debug.h:97
int GWEN_XML__ReadData(GWEN_XML_CONTEXT *ctx, GWEN_FAST_BUFFER *fb, GWEN_UNUSED uint32_t flags)
Definition: xmlrw.c:661
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
Definition: xml.h:157
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
int GWEN_XMLNode_toBuffer(const GWEN_XMLNODE *n, GWEN_BUFFER *buf, uint32_t flags)
Definition: xmlrw.c:627
#define DBG_DEBUG(dbg_logger, format,...)
Definition: debug.h:214
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
const char * GWEN_XMLNode_NameSpace_GetName(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2032
struct GWEN__XMLPROPERTY GWEN_XMLPROPERTY
Definition: xml_l.h:37
uint32_t GWEN_FastBuffer_GetBytesRead(const GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:202
const char * GWEN_XMLNode_NameSpace_GetUrl(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:2040
#define NULL
Definition: binreloc.c:300
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
void GWEN_XmlCtx_ResetFinishedElement(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:201
int GWEN_Text_ConvertCharset(const char *fromCharset, const char *toCharset, const char *text, int len, GWEN_BUFFER *tbuf)
Definition: text.c:2015
int GWEN_XmlCtx_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
Definition: xmlctx.c:363
int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1298
int GWEN_XmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
Definition: xmlctx.c:307
static int GWEN_XMLNode__WriteTagToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, uint32_t flags, const char *encoding, unsigned int ind)
Definition: xmlrw.c:166
#define GWEN_FASTBUFFER_PEEKBYTE(fb, var)
Definition: fastbuffer.h:74
void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:46
static int GWEN_XMLNode__WriteCommentToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, uint32_t flags, const char *encoding, unsigned int ind)
Definition: xmlrw.c:377
#define GWEN_LOGDOMAIN
Definition: logger.h:32
int GWEN_XMLNode_WriteToStream(const GWEN_XMLNODE *n, GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition: xmlrw.c:481
int GWEN_XmlCtx_GetDepth(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:150
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
#define DBG_VERBOUS(dbg_logger, format,...)
Definition: debug.h:224
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_Dump(GWEN_BUFFER *bf, unsigned int insert)
Definition: buffer.c:585
uint32_t GWEN_XmlCtx_GetFinishedElement(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:185
uint32_t bufferReadPos
Definition: fastbuffer.h:32
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:653
#define GWEN_FASTBUFFER_FLUSH(fb, var)
Definition: fastbuffer.h:162
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition: xml.c:409
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:81
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
int GWEN_XmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing)
Definition: xmlctx.c:321
static int GWEN_XMLNode__WriteNamespacesToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb)
Definition: xmlrw.c:46
void GWEN_Buffer_SubMode(GWEN_BUFFER *bf, uint32_t mode)
Definition: buffer.c:210
GWEN_SYNCIO * GWEN_SyncIo_Memory_new(GWEN_BUFFER *buffer, int take)
Definition: syncio_memory.c:50
int GWEN_XmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data)
Definition: xmlctx.c:335
void GWEN_XmlCtx_SetEncoding(GWEN_XML_CONTEXT *ctx, const char *encoding)
Definition: xmlctx.c:132
#define GWEN_XML_BUFFERSIZE
Definition: xml.c:60
int GWEN_XML_ReadFromFastBuffer(GWEN_XML_CONTEXT *ctx, GWEN_FAST_BUFFER *fb)
Definition: xmlrw.c:1099
int GWEN_XMLContext_ReadFromFile(GWEN_XML_CONTEXT *ctx, const char *fname)
Definition: xmlrw.c:1236
int GWEN_XML__ReadTag(GWEN_XML_CONTEXT *ctx, GWEN_FAST_BUFFER *fb, GWEN_UNUSED uint32_t flags, GWEN_BUFFER *dbuf)
Definition: xmlrw.c:721
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition: xml.c:465
#define GWEN_BUFFER_MODE_DYNAMIC
Definition: buffer.h:66
static int GWEN_XMLNode__WriteDataToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, uint32_t flags, const char *encoding, unsigned int ind)
Definition: xmlrw.c:328
void GWEN_Buffer_AddMode(GWEN_BUFFER *bf, uint32_t mode)
Definition: buffer.c:203
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition: xmlctx.c:385
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:393
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
GWEN_XMLNODE * GWEN_XMLNode_fromString(const char *s, int len, uint32_t flags)
Definition: xmlrw.c:1333
GWEN_SYNCIO * GWEN_SyncIo_Memory_fromBuffer(const uint8_t *buffer, int size)
Definition: syncio_memory.c:78
int GWEN_XMLNode_WriteFile(const GWEN_XMLNODE *n, const char *fname, uint32_t flags)
Definition: xmlrw.c:584
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
#define GWEN_XML_FLAGS_HANDLE_COMMENTS
Definition: xml.h:60
#define GWEN_FASTBUFFER_READBYTE(fb, var)
Definition: fastbuffer.h:103
static int GWEN_XMLNode__WriteToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, uint32_t flags, const char *encoding, unsigned int ind)
Definition: xmlrw.c:439
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:705
uint32_t GWEN_XmlCtx_GetFlags(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:108
#define GWEN_ERROR_EOF
Definition: error.h:96
int GWEN_XML__ReadAllFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition: xmlrw.c:1175
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
#define GWEN_FASTBUFFER_WRITEFORCED(fb, var, p, len)
Definition: fastbuffer.h:377
int GWEN_XMLContext_ReadFromString(GWEN_XML_CONTEXT *ctx, const char *text)
Definition: xmlrw.c:1266
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
int GWEN_XMLContext_ReadFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition: xmlrw.c:1204
#define GWEN_FASTBUFFER_WRITEBYTE(fb, var, chr)
Definition: fastbuffer.h:134
int GWEN_XmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data)
Definition: xmlctx.c:349
#define GWEN_XML_FLAGS_INDENT
Definition: xml.h:66
const char * GWEN_XmlCtx_GetEncoding(const GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:124
#define GWEN_BUFFER_MODE_READONLY
Definition: buffer.h:68
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition: xml.h:94
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_FASTBUFFER_WRITELINE(fb, var, p)
Definition: fastbuffer.h:407
#define GWEN_XML_FLAGS_HANDLE_NAMESPACES
Definition: xml.h:105
#define DBG_INFO(dbg_logger, format,...)
Definition: debug.h:181
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_Next(const GWEN_XMLNODE_NAMESPACE *element)
GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
Definition: fastbuffer.c:27
static int GWEN_XMLNode__WriteIndents(GWEN_FAST_BUFFER *fb, int ind)
Definition: xmlrw.c:29
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition: xmlctx.h:39
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:992
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_First(const GWEN_XMLNODE_NAMESPACE_LIST *l)