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
106static int GWEN_XMLNode__WritePropertiesToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, const char *encoding)
107{
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 }
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
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 */
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 }
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
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
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
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;
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,
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,
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
627int 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
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 (;;) {
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
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 (;;) {
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 (;;) {
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 '>' */
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 */
790 if (chr<0) {
791 return chr;
792 }
793 uc=(unsigned char) chr;
794 if (uc=='-') {
795 fb->bufferReadPos++;
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 (;;) {
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=='?')) {
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
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=='!') {
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 (;;) {
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
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 (;;) {
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
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,
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
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
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
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
1298int 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
1333GWEN_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);
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);
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
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition buffer.c:653
void GWEN_Buffer_SubMode(GWEN_BUFFER *bf, uint32_t mode)
Definition buffer.c:210
void GWEN_Buffer_Dump(GWEN_BUFFER *bf, unsigned int insert)
Definition buffer.c:585
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
void GWEN_Buffer_AddMode(GWEN_BUFFER *bf, uint32_t mode)
Definition buffer.c:203
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition buffer.c:393
#define GWEN_BUFFER_MODE_DYNAMIC
Definition buffer.h:66
#define GWEN_BUFFER_MODE_READONLY
Definition buffer.h:68
#define DBG_VERBOUS(dbg_logger, format,...)
Definition debug.h:224
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define DBG_DEBUG(dbg_logger, format,...)
Definition debug.h:214
#define GWEN_ERROR_INTERNAL
Definition error.h:125
#define GWEN_ERROR_BAD_DATA
Definition error.h:121
#define GWEN_ERROR_EOF
Definition error.h:96
uint32_t GWEN_FastBuffer_GetBytesRead(const GWEN_FAST_BUFFER *fb)
Definition fastbuffer.c:202
void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb)
Definition fastbuffer.c:46
GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
Definition fastbuffer.c:27
#define GWEN_FASTBUFFER_WRITEBYTE(fb, var, chr)
Definition fastbuffer.h:134
#define GWEN_FASTBUFFER_READBYTE(fb, var)
Definition fastbuffer.h:103
#define GWEN_FASTBUFFER_FLUSH(fb, var)
Definition fastbuffer.h:162
#define GWEN_FASTBUFFER_WRITELINE(fb, var, p)
Definition fastbuffer.h:407
#define GWEN_FASTBUFFER_WRITEFORCED(fb, var, p, len)
Definition fastbuffer.h:377
#define GWEN_FASTBUFFER_PEEKBYTE(fb, var)
Definition fastbuffer.h:74
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_UNUSED
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_First(const GWEN_XMLNODE_NAMESPACE_LIST *l)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_Next(const GWEN_XMLNODE_NAMESPACE *element)
#define GWEN_LOGDOMAIN
Definition logger.h:32
uint32_t bufferReadPos
Definition fastbuffer.h:32
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition syncio.c:97
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition syncio.c:179
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition syncio.c:78
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition syncio.c:109
struct GWEN_SYNCIO GWEN_SYNCIO
Definition syncio.h:40
@ GWEN_SyncIo_File_CreationMode_CreateAlways
Definition syncio_file.h:40
@ GWEN_SyncIo_File_CreationMode_OpenExisting
Definition syncio_file.h:38
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition syncio_file.h:59
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition syncio_file.h:53
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition syncio_file.h:58
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition syncio_file.h:54
GWEN_SYNCIO * GWEN_SyncIo_Memory_new(GWEN_BUFFER *buffer, int take)
GWEN_SYNCIO * GWEN_SyncIo_Memory_fromBuffer(const uint8_t *buffer, int size)
int GWEN_Text_ConvertCharset(const char *fromCharset, const char *toCharset, const char *text, int len, GWEN_BUFFER *tbuf)
Definition text.c:2015
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition xml.c:705
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition xml.c:144
const char * GWEN_XMLNode_NameSpace_GetName(const GWEN_XMLNODE_NAMESPACE *ns)
Definition xml.c:2032
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition xml.c:465
GWEN_XMLNODE * GWEN_XMLNode_GetHeader(const GWEN_XMLNODE *n)
Definition xml.c:1323
const char * GWEN_XMLNode_NameSpace_GetUrl(const GWEN_XMLNODE_NAMESPACE *ns)
Definition xml.c:2040
#define GWEN_XML_BUFFERSIZE
Definition xml.c:60
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition xml.c:160
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition xml.c:370
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition xml.c:409
#define GWEN_XML_FLAGS_HANDLE_NAMESPACES
Definition xml.h:105
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
Definition xml.h:157
#define GWEN_XML_FLAGS_HANDLE_COMMENTS
Definition xml.h:60
#define GWEN_XML_FLAGS_INDENT
Definition xml.h:66
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition xml.h:94
struct GWEN__XMLNODE GWEN_XMLNODE
Definition xml.h:156
@ GWEN_XMLNodeTypeData
Definition xml.h:147
@ GWEN_XMLNodeTypeComment
Definition xml.h:149
@ GWEN_XMLNodeTypeTag
Definition xml.h:145
#define GWEN_XML_FLAGS_SIMPLE
Definition xml.h:89
struct GWEN__XMLPROPERTY GWEN_XMLPROPERTY
Definition xml_l.h:37
void GWEN_XmlCtx_ResetFinishedElement(GWEN_XML_CONTEXT *ctx)
Definition xmlctx.c:201
const char * GWEN_XmlCtx_GetEncoding(const GWEN_XML_CONTEXT *ctx)
Definition xmlctx.c:124
void GWEN_XmlCtx_SetEncoding(GWEN_XML_CONTEXT *ctx, const char *encoding)
Definition xmlctx.c:132
int GWEN_XmlCtx_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
Definition xmlctx.c:363
int GWEN_XmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing)
Definition xmlctx.c:321
int GWEN_XmlCtx_GetDepth(const GWEN_XML_CONTEXT *ctx)
Definition xmlctx.c:150
int GWEN_XmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data)
Definition xmlctx.c:335
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition xmlctx.c:81
int GWEN_XmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data)
Definition xmlctx.c:349
uint32_t GWEN_XmlCtx_GetFinishedElement(const GWEN_XML_CONTEXT *ctx)
Definition xmlctx.c:185
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition xmlctx.c:385
int GWEN_XmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
Definition xmlctx.c:307
uint32_t GWEN_XmlCtx_GetFlags(const GWEN_XML_CONTEXT *ctx)
Definition xmlctx.c:108
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition xmlctx.h:39
int GWEN_XMLContext_ReadFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition xmlrw.c:1204
int GWEN_XMLContext_ReadFromFile(GWEN_XML_CONTEXT *ctx, const char *fname)
Definition xmlrw.c:1236
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
int GWEN_XMLNode_WriteFile(const GWEN_XMLNODE *n, const char *fname, uint32_t flags)
Definition xmlrw.c:584
int GWEN_XML__ReadTag(GWEN_XML_CONTEXT *ctx, GWEN_FAST_BUFFER *fb, GWEN_UNUSED uint32_t flags, GWEN_BUFFER *dbuf)
Definition xmlrw.c:721
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
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
int GWEN_XML_ReadFromFastBuffer(GWEN_XML_CONTEXT *ctx, GWEN_FAST_BUFFER *fb)
Definition xmlrw.c:1099
int GWEN_XMLNode_WriteToStream(const GWEN_XMLNODE *n, GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition xmlrw.c:481
int GWEN_XMLNode_toBuffer(const GWEN_XMLNODE *n, GWEN_BUFFER *buf, uint32_t flags)
Definition xmlrw.c:627
int GWEN_XML__ReadData(GWEN_XML_CONTEXT *ctx, GWEN_FAST_BUFFER *fb, GWEN_UNUSED uint32_t flags)
Definition xmlrw.c:661
int GWEN_XML__ReadAllFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition xmlrw.c:1175
int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition xmlrw.c:1298
static int GWEN_XMLNode__WriteNamespacesToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb)
Definition xmlrw.c:46
GWEN_XMLNODE * GWEN_XMLNode_fromString(const char *s, int len, uint32_t flags)
Definition xmlrw.c:1333
static int GWEN_XMLNode__WritePropertiesToStream(const GWEN_XMLNODE *n, GWEN_FAST_BUFFER *fb, const char *encoding)
Definition xmlrw.c:106
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
int GWEN_XMLContext_ReadFromString(GWEN_XML_CONTEXT *ctx, const char *text)
Definition xmlrw.c:1266
static int GWEN_XMLNode__WriteIndents(GWEN_FAST_BUFFER *fb, int ind)
Definition xmlrw.c:29