JunkBox_Lib++ (for Windows) 1.10.1
Loading...
Searching...
No Matches
txml.cpp
Go to the documentation of this file.
1
20#ifdef CPLUSPLUS
21 #undef CPLUSPLUS
22#endif
23
24
25#include "txml.h"
26#include "jbxl_state.h"
27
28
29
31// Parser
32//
33
48tXML* xml_parse(char* pp)
49{
50 tXML* xml;
51 tXML* node;
52
53 xml = new_xml_node(); // アンカー
54 xml->ldat.id = XML_ANCHOR_NODE;
55 xml->state = JBXL_STATE_ANCHOR;
56 xml->depth = -1;
57
58 // パース
59 node = xml_main_parse(xml, pp, TRUE);
60 if (node->state<0) return xml;
61
62 // 元に戻ったか?
63 if (xml==node) {
64 xml->state = JBXL_XML_PARSED;
65 }
66 else {
67 xml->state = JBXL_XML_NOT_CLOSED;
68 }
69
70 // XML rootの数
71 if (xml->next!=NULL) {
72 int n = 0;
73 node = xml->next;
74 while(node!=NULL) {
75 if (node->ldat.id==XML_NAME_NODE) n++;
76 node = node->ysis;
77 }
78 if (n!=1) xml->state = JBXL_XML_MULTI_ROOT;
79 }
80 else xml->state = JBXL_XML_DEFAULT_STATE;
81
82 return xml;
83}
84
85
94tXML* xml_parse_file(const char* fn)
95{
96 tXML* xml = NULL;
97 Buffer buf;
98
99 buf = read_Buffer_file(fn);
100 if (buf.buf!=NULL) {
101 xml = xml_parse((char*)(buf.buf));
102 free_Buffer(&buf);
103 }
104
105 return xml;
106}
107
108
135tXML* xml_parse_seq(tXML* xml, char* pp)
136{
137 int skip = FALSE;
138 tXML* node;
139
140 if (xml==NULL) {
141 xml = new_tTree_anchor_node();
142 //xml->ldat.id = XML_ANCHOR_NODE;
143 //xml->depth = -1;
144 skip = TRUE;
145 }
146 else {
147 tXML* top = find_xml_top(xml);
148 if (top==xml) top->state = JBXL_XML_DEFAULT_STATE;
149 }
150
151 node = xml_main_parse(xml, pp, skip);
152 xml = find_xml_top(xml);
153 xml->altp = node;
154
155 if (xml!=node) return xml;
156
157 if (node->state==JBXL_NORMAL) xml->state = JBXL_XML_PARSED;
158 else xml->state = node->state;
159
160 if (xml->next!=NULL) {
161 int n = 0;
162 node = xml->next;
163 while(node!=NULL) {
164 if (node->ldat.id==XML_NAME_NODE) n++;
165 node = node->ysis;
166 }
167 if (n!=1) xml->state = JBXL_XML_MULTI_ROOT;
168 }
169 else xml->state = JBXL_XML_DEFAULT_STATE;
170
171 return xml;
172}
173
174
189tXML* xml_main_parse(tXML* xml, char* pp, int skip)
190{
191 int n, node_end;
192 char* node_name = NULL;
193 char* node_attr = NULL;
194 char* value = NULL;
195
196 if (pp ==NULL) return xml;
197 if (xml==NULL) return NULL;
198
199 if (skip) while (*pp!='\0' && *pp!='<') pp++;
200
201 while (*pp!='\0') {
202 n = 1;
203
204 if (*pp=='<') {
205 // End TAG </ >
206 if (*(pp+1)=='/') {
207 if (xml->state==JBXL_XML_NODE_OPENED) {
208 n = xml_parse_end_node(pp, &node_name);
209 if (n>0) {
210 if (node_name!=NULL && xml->ldat.key.buf!=NULL) {
211 if (!strcmp((const char*)node_name, (const char*)(xml->ldat.key.buf))) {
212 if (xml->next!=NULL) {
213 xml->state = JBXL_XML_NODE_CLOSED;
214 }
215 else {
216 xml->state = JBXL_XML_NODE_EMPTY;
217 }
218 //
219 if (xml->prev!=NULL) xml = xml->prev;
220 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
221 }
222 else n = xml->state = JBXL_XML_PARSE_ERROR;
223 }
224 else n = xml->state = JBXL_XML_PARSE_ERROR;
225 }
226 else xml->state = n; // エラー
227 }
228 else n = xml->state = JBXL_XML_PARSE_ERROR;
229 }
230
231 // Comment TAG <!-- -->
232 else if (!strncmp(pp+1, "!--", 3)) {
233 n = xml_parse_comment_node(pp, &value);
234 if (n>0) {
235 xml = add_tTree_node_bystr(xml, XML_COMMENT_NODE, 0, (char*)XML_COMMENT_NODE_KEY, value, NULL, 0);
236 xml->state = JBXL_XML_NODE_EMPTY;
237 if (xml->prev!=NULL) xml = xml->prev;
238 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
239 }
240 }
241
242 // Data TAG <! >
243 else if (*(pp+1)=='!') {
244 n = xml_parse_data_node(pp, &value);
245 if (n>0) {
246 xml = add_tTree_node_bystr(xml, XML_DATA_NODE, 0, (char*)XML_DATA_NODE_KEY, value, NULL, 0);
247 xml->state = JBXL_XML_NODE_EMPTY;
248 if (xml->prev!=NULL) xml = xml->prev;
249 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
250 }
251 }
252
253 // Processing TAG <? ?>
254 else if (*(pp+1)=='?') {
255 n = xml_parse_processing_node(pp, &node_name, &node_attr);
256 if (n>0) {
257 if (!strncasecmp("xml", node_name, 3)) {
258 tList* lp = xml_parse_attr(node_attr);
259 xml = add_tTree_node_bystr(xml, XML_DOC_NODE, 0, node_name, NULL, NULL, 0);
260 xml->ldat.lst = lp;
261 }
262 else {
263 xml = add_tTree_node_bystr(xml, XML_PROCESS_NODE, 0, node_name, node_attr, NULL, 0);
264 }
265 xml->state = JBXL_XML_NODE_EMPTY;
266 if (xml->prev!=NULL) xml = xml->prev;
267 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
268 }
269 }
270
271 // Start TAG < >
272 else {
273 n = xml_parse_start_node(pp, &node_name, &node_attr, &node_end);
274
275 if (n>0) {
276 tList* lp = xml_parse_attr(node_attr);
277 xml = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, node_name, NULL, NULL, 0);
278 xml->ldat.lst = lp;
279
280 if (node_end) {
281 xml->state = JBXL_XML_NODE_EMPTY;
282 if (xml->prev!=NULL) xml = xml->prev;
283 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
284 }
285 else {
286 int m;
287 xml->state = JBXL_XML_NODE_OPENED;
288 // ノード値
289 m = xml_parse_content(pp+n, &value); // 0 が返る可能性がある
290 if (m>=0) {
291 n += m;
292 if (value!=NULL) {
293 xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0);
294 xml->state = JBXL_XML_NODE_CLOSED;
295 if (xml->prev!=NULL) {
296 xml = xml->prev;
297 xml->ldat.lv++;
298 }
299 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
300 }
301 }
302 else n = xml->state = m; // エラー
303 }
304 }
305 }
306
307 freeNull(node_name);
308 freeNull(node_attr);
309 freeNull(value);
310 }
311
312 // Content (断片的に入力したXMLが content の途中で終わっている場合など)
313 else {
314 if (xml->state==JBXL_XML_NODE_OPENED) {
315 n = xml_parse_content(pp, &value);
316 if (n>0) {
317 if (value!=NULL) {
318 xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0);
319 xml->state = JBXL_XML_NODE_CLOSED;
320 if (xml->prev!=NULL) {
321 xml = xml->prev;
322 xml->ldat.lv++;
323 }
324 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
325 }
326 }
327 else n = xml->state = JBXL_XML_PARSE_ERROR;
328 freeNull(value);
329 }
330 else n = xml->state = JBXL_XML_PARSE_ERROR;
331 }
332
333 // エラー
334 if (n<=0) return xml;
335
336 pp += n;
337 while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) pp++;
338 }
339
340 return xml;
341}
342
343
344
346// Paese of TAG
347//
348
371int xml_parse_start_node(char* pp, char** node_name, char** node_attr, int* node_end)
372{
373 int nn, mm;
374 char* pt;
375
376 if (node_name==NULL || node_attr==NULL || node_end==NULL) return JBXL_ARGS_ERROR;
377 *node_end = FALSE;
378 *node_name = NULL;
379 *node_attr = NULL;
380
381 if (*pp!='<') return JBXL_XML_PARSE_ERROR;
382 pt = pp = pp + 1;
383 pt = skip_chars(pt, " />");
384 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
385
386 nn = mm = (int)(pt - pp);
387 if (mm==0) return JBXL_XML_PARSE_ERROR;
388
389 nn = nn + 1;
390 *node_name = (char*)malloc((size_t)(mm + 1));
391 if (*node_name==NULL) return JBXL_MALLOC_ERROR;
392 memcpy(*node_name, pp, mm);
393 (*node_name)[mm] = '\0';
394 //PRINT_MESG("START --> %s %d\n", *node_name, (int)strlen(*node_name));
395
396 if (isnot_xml_name((unsigned char*)*node_name)) {
397 freeNull(*node_name);
399 }
400
401 // Empty TAG
402 if (*pt=='/') {
403 if (*(pt+1)!='>') {
404 freeNull(*node_name);
406 }
407 nn += 1;
408 *node_end = TRUE;
409 //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name));
410 }
411
412 // Attribute
413 else if (*pt==' ') {
414 pp = pt = pt + 1;
415 while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++;
416 nn += (int)(pt - pp) + 1;
417
418 pp = pt;
419 pt = skip_chars(pt, "/>");
420 if (pt==NULL) {
421 freeNull(*node_name);
423 }
424
425 mm = (int)(pt - pp);
426 if (mm>0) {
427 *node_attr = (char*)malloc((size_t)(mm + 1));
428 if (*node_attr==NULL) {
429 freeNull(*node_name);
430 return JBXL_MALLOC_ERROR;
431 }
432 memcpy(*node_attr, pp, mm);
433 (*node_attr)[mm] = '\0';
434 nn += mm;
435 //PRINT_MESG("ATTR --> %s %d\n", *node_attr, (int)strlen(*node_attr));
436 }
437
438 if (*pt=='/') {
439 if (*(pt+1)!='>') {
440 freeNull(*node_name);
441 freeNull(*node_attr);
443 }
444 nn += 1;
445 *node_end = TRUE;
446 //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name));
447 }
448 }
449
450 //else {} *pt=='>'
451
452 return nn + 1;
453}
454
455
468int xml_parse_end_node(char* pp, char** node_name)
469{
470 int nn, mm;
471 char* pt;
472 char* work;
473
474 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
475 *node_name = NULL;
476
477 if (strncmp(pp ,"</", 2)) return JBXL_XML_PARSE_ERROR;
478
479 pt = pp = pp + 2;
480 pt = skip_chars(pt, ">");
481 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
482
483 nn = mm = (int)(pt - pp);
484 if (mm==0) return JBXL_XML_PARSE_ERROR;
485
486 nn += 2;
487 work = (char*)malloc((size_t)(mm+1));
488 if (work==NULL) return JBXL_MALLOC_ERROR;
489 memcpy(work, pp, mm);
490 work[mm] = '\0';
491 *node_name = pack_head_tail_char(work, ' ');
492 free(work);
493 //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name));
494
495 return nn + 1;
496}
497
498
513int xml_parse_content(char* pp, char** content)
514{
515 int nn=0, mm;
516 char* pt;
517 char* work;
518
519 if (pp==NULL || content==NULL) return JBXL_XML_PARSE_ERROR;
520 *content = NULL;
521
522 while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) {
523 pp++;
524 nn++;
525 }
526 if (*pp=='<') return nn; // <node><
527
528 pt = pp;
529 while (*pt!='<' && *pt!='\0') pt++;
530
531 mm = (int)(pt - pp);
532 if (mm==0) return nn;
533 nn += mm;
534
535 work = (char*)malloc((size_t)(mm+1));
536 if (work==NULL) return JBXL_MALLOC_ERROR;
537 memcpy(work, pp, mm);
538 work[mm] = '\0';
539
540 *content = pack_head_tail_char(work, ' ');
541 free(work);
542 //PRINT_MESG("VALUE --> %s %d\n", *content, (int)strlen(*content));
543
544 return nn;
545}
546
547
560{
561 int sz;
562 char* nm;
563 char* vl;
564 char* pt;
565 char qt;
566 tList* lp = NULL;
567 tList* lt = NULL;
568
569 // 作業メモリの確保
570 if (pp==NULL) return NULL;
571 sz = (int)strlen((const char*)pp) + 1;
572 nm = (char*)malloc(sz);
573 if (nm==NULL) return NULL;
574 memset(nm, 0, sz);
575
576 vl = (char*)malloc(sz);
577 if (vl==NULL) {
578 free(nm);
579 return NULL;
580 }
581 memset(vl, 0, sz);
582
583 // Parse for AAA="BBB" CCC="DDDD"
584 while (*pp==' ' && *pp!='\0') pp++;
585 while (*pp!='\0') {
586 pt = pp;
587 while (*pt!='=' && *pt!='\0') pt++;
588 if (*pt=='\0') {
589 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
590 break;
591 }
592
593 sz = (int)(pt - pp);
594 memcpy(nm, pp, (size_t)sz);
595 nm[sz] = '\0';
596
597 pt++;
598 if (*pt!='"' && *pt!='\'') {
599 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
600 break;
601 }
602 else qt = *pt;
603
604 pt++;
605 pp = pt;
606 while(*pt!=qt && *pt!='\0') pt++;
607 if (*pt=='\0') {
608 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
609 break;
610 }
611
612 sz = (int)(pt - pp);
613 memcpy(vl+1, pp, (size_t)sz);
614 vl[0] = qt;
615 vl[sz+1] = qt;
616 vl[sz+2] = '\0';
617
618 lp = add_tList_node_str(lp, nm, vl);
619 if (lt==NULL) lt = lp;
620 pp = pt + 1;
621
622 if (*pp!=' ' && *pp!='\0') {
623 lt->state = JBXL_XML_PARSE_ERROR;
624 break;
625 }
626 while (*pp==' ' && *pp!='\0') pp++;
627 }
628
629 //
630 free(nm);
631 free(vl);
632
633 if (lt!=NULL) {
634 if (lt->state!=JBXL_XML_PARSE_ERROR) lt->state = JBXL_XML_NODE_CLOSED;
635 }
636 return lt;
637}
638
639
654int xml_parse_processing_node(char* pp, char** node_name, char** node_attr)
655{
656 int nn, mm;
657 char* pt;
658
659 *node_name = NULL;
660 *node_attr = NULL;
661
662 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
663 if (strncmp(pp, "<?", 2)) return JBXL_XML_PARSE_ERROR;
664
665 pt = pp = pp + 2;
666 pt = skip_chars(pt, " ?");
667 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
668
669 nn = mm = (int)(pt - pp);
670 if (mm==0) return JBXL_XML_PARSE_ERROR;
671
672 nn += 2;
673 *node_name = (char*)malloc((size_t)(mm + 1));
674 if (*node_name==NULL) return JBXL_MALLOC_ERROR;
675 memcpy(*node_name, pp, mm);
676 (*node_name)[mm] = '\0';
677
678 if (isnot_xml_name((unsigned char*)*node_name)) return JBXL_XML_PARSE_ERROR;
679
680 // for attribute
681 if (*pt==' ') {
682 pp = pt = pt + 1;
683 while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++;
684 nn += (int)(pt - pp) + 1;
685
686 pp = pt;
687 pt = skip_chars(pt, "?");
688 if (pt==NULL) {
689 freeNull(*node_name);
691 }
692
693 mm = (int)(pt - pp);
694 if (mm>0) {
695 *node_attr = (char*)malloc((size_t)(mm + 1));
696 if (*node_attr==NULL) {
697 freeNull(*node_name);
698 return JBXL_MALLOC_ERROR;
699 }
700 memcpy(*node_attr, pp, mm);
701 (*node_attr)[mm] = '\0';
702 nn += mm;
703 //PRINT_MESG("ATTR --> %s %d\n", *node_attr, (int)strlen(*node_attr));
704 }
705 }
706
707 if (strncmp(pt, "?>", 2)) {
708 freeNull(*node_name);
709 freeNull(*node_attr);
711 }
712
713 return nn + 2;
714}
715
716
730int xml_parse_comment_node(char* pp, char** comment)
731{
732 int nn, mm;
733 char* pt;
734
735 *comment = NULL;
736 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
737 if (strncmp(pp, "<!--", 4)) return JBXL_XML_PARSE_ERROR;
738
739 pt = pp = pp + 4;
740 pt = skip_chars(pt, ">");
741 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
742
743 pt -= 2;
744 if (strncmp(pt, "-->", 3)) return JBXL_XML_PARSE_ERROR;
745
746 nn = mm = (int)(pt - pp);
747 if (mm==0) return JBXL_XML_PARSE_ERROR;
748
749 nn += 4;
750 *comment = (char*)malloc((size_t)(mm+1));
751 if (*comment==NULL) return JBXL_MALLOC_ERROR;
752 memcpy(*comment, pp, mm);
753 (*comment)[mm] = '\0';
754 //PRINT_MESG("COMMENT-> %s %d\n", *comment, (int)strlen(*comment));
755
756 return nn + 3;
757}
758
759
773int xml_parse_data_node(char* pp, char** data)
774{
775 int nn, mm;
776 char* pt;
777
778 *data = NULL;
779 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
780 if (strncmp(pp, "<!", 2)) return JBXL_XML_PARSE_ERROR;
781
782 pt = pp = pp + 2;
783 pt = skip_chars(pt, ">");
784 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
785
786 nn = mm = (int)(pt - pp);
787 if (mm==0) return JBXL_XML_PARSE_ERROR;
788
789 nn += 2;
790 *data = (char*)malloc((size_t)(mm+1));
791 if (*data==NULL) return JBXL_MALLOC_ERROR;
792 memcpy(*data, pp, mm);
793 (*data)[mm] = '\0';
794 //PRINT_MESG("DATA ---> %s %d\n", *data, (int)strlen(*data));
795
796 return nn + 1;
797}
798
799
810int isnot_xml_name(unsigned char* pp)
811{
812 if (pp==NULL) return TRUE;
813 if (*pp=='\0') return TRUE;
814
815 while (*pp!='\0') {
816 if (*pp<=0x2c) return TRUE; // !"#$%&'()*+,
817 if (*pp==0x2f) return TRUE; // /
818 if (*pp>=0x3b && *pp<=0x40) return TRUE; // ;<=>?@
819 if (*pp>=0x5b && *pp<=0x5e) return TRUE; // [\]^
820 if (*pp==0x60) return TRUE; // `
821 if (*pp>=0x7b && *pp<=0x7f) return TRUE; // {|}~DEL
822 pp++;
823 }
824
825 return FALSE;
826}
827
828
837{
838 if (pp!=NULL) {
839
840 // アンカー
841 if (pp->ldat.id==XML_ANCHOR_NODE) {
842 pp->state = JBXL_XML_PARSED;
843 pp->depth = -1;
844 if (pp->next!=NULL) {
845 pp->next->depth = 0;
846 adjust_tTree_depth(pp->next);
847 close_xml(pp->next);
848 }
849 return;
850 }
851
852 while(pp->esis!=NULL) pp = pp->esis;
853 do {
854 if (pp->next==NULL) pp->state = JBXL_XML_NODE_EMPTY;
855 //
856 if (pp->state!=JBXL_XML_NODE_EMPTY) pp->state = JBXL_XML_NODE_CLOSED;
857 //if (pp->ldat.lst!=NULL) {
858 // if ((pp->ldat.lst)->state!=JBXL_XML_NODE_EMPTY) (pp->ldat.lst)->state = JBXL_XML_NODE_CLOSED;
859 //}
860 //
861 if (pp->next!=NULL) close_xml(pp->next);
862
863 pp = pp->ysis;
864 } while(pp!=NULL);
865 }
866 return;
867}
868
869
870
872// Inverse Parse
873//
874
892{
893 int cnt;
894 Buffer buf;
895
896 buf = init_Buffer();
897 if (pp==NULL) return buf;
898 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
899 if (pp==NULL) return buf;
900
901 cnt = count_tTree(pp);
902 buf = make_Buffer(cnt*LMDATA);
903 if (buf.buf==NULL) return buf;
904
905 while (pp->esis!=NULL) pp = pp->esis;
906 _xml_to_Buffer(pp, &buf, mode, pp->depth);
907
908 return buf;
909}
910
911
928void _xml_to_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
929{
930 do {
931 xml_open_node_Buffer(pp, buf, mode, indent);
932 if (pp->next!=NULL) {
933 _xml_to_Buffer(pp->next, buf, mode, indent);
934 xml_close_node_Buffer(pp, buf, mode, indent);
935 }
936
937 pp = pp->ysis;
938 } while(pp!=NULL);
939 return;
940}
941
942
958void xml_open_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
959{
960 int i;
961
962 // Name TAG
963 if (pp->ldat.id==XML_NAME_NODE) {
964 if (mode!=XML_ONELINE_FORMAT) {
965 if (buf->vldsz>0 && buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
966 }
967 //
968 if (mode==XML_TAB_FORMAT) {
969 add_indent_Buffer(buf, '\t', pp->depth - indent);
970 }
971 else if (mode==XML_SPACE_FORMAT) {
972 add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
973 }
974 else if (mode==XML_SPACE4_FORMAT) {
975 add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
976 }
977
978 cat_s2Buffer("<", buf);
979 cat_Buffer(&(pp->ldat.key), buf);
980 if (pp->ldat.lst!=NULL) {
981 xml_attr_to_Buffer(pp->ldat.lst, buf);
982 }
983 if (pp->next==NULL) {
984 if (pp->state==JBXL_XML_NODE_EMPTY) {
985 cat_s2Buffer(" />", buf);
986 }
987 else {
988 cat_s2Buffer("></", buf);
989 cat_Buffer(&(pp->ldat.key), buf);
990 cat_s2Buffer(">", buf);
991 }
992 if (mode!=XML_ONELINE_FORMAT) {
993 cat_s2Buffer(CRLF, buf);
994 }
995 }
996 else {
997 cat_s2Buffer(">", buf);
998 }
999 }
1000
1001 // Content
1002 else if (pp->ldat.id==XML_CONTENT_NODE) {
1003 if (buf->buf[buf->vldsz-1]=='\n') {
1004 buf->buf[buf->vldsz-2] = '\0';
1005 buf->vldsz -= 2;
1006 }
1007 //
1008 if (pp->esis!=NULL || pp->ysis!=NULL) {
1009 cat_s2Buffer(CRLF, buf);
1010 char* tabs = (char*)malloc(pp->depth-indent+1);
1011 if (tabs!=NULL) {
1012 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
1013 tabs[pp->depth-indent] = '\0';
1014 cat_s2Buffer(tabs, buf);
1015 free(tabs);
1016 }
1017 }
1018 //
1019 cat_Buffer(&(pp->ldat.key), buf);
1020 //
1021 if (pp->esis!=NULL) cat_s2Buffer(CRLF, buf);
1022 }
1023
1024 // xml TAG
1025 else if (pp->ldat.id==XML_DOC_NODE) {
1026 if (mode==XML_TAB_FORMAT) {
1027 add_indent_Buffer(buf, '\t', pp->depth - indent);
1028 }
1029 else if (mode==XML_SPACE_FORMAT) {
1030 add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1031 }
1032 else if (mode==XML_SPACE4_FORMAT) {
1033 add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1034 }
1035
1036 cat_s2Buffer("<?", buf);
1037 if (pp->ldat.key.buf!=NULL) {
1038 cat_Buffer(&(pp->ldat.key), buf);
1039 }
1040 if (pp->ldat.lst!=NULL) {
1041 xml_attr_to_Buffer(pp->ldat.lst, buf);
1042 }
1043 cat_s2Buffer("?>", buf);
1044
1045 if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1046 }
1047
1048 // Comment TAG
1049 else if (pp->ldat.id==XML_COMMENT_NODE) {
1050 if (mode!=XML_ONELINE_FORMAT) {
1051 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
1052 }
1053
1054 if (mode==XML_TAB_FORMAT) {
1055 add_indent_Buffer(buf, '\t', pp->depth - indent);
1056 }
1057 else if (mode==XML_SPACE_FORMAT) {
1058 add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1059 }
1060 else if (mode==XML_SPACE4_FORMAT) {
1061 add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1062 }
1063
1064 cat_s2Buffer("<!--", buf);
1065 if (pp->ldat.val.buf!=NULL) {
1066 cat_Buffer(&(pp->ldat.val), buf);
1067 }
1068 cat_s2Buffer("-->", buf);
1069
1070 if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1071 }
1072
1073 // Data TAG
1074 else if (pp->ldat.id==XML_DATA_NODE) {
1075 if (mode!=XML_ONELINE_FORMAT) {
1076 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
1077 }
1078 //
1079 if (mode==XML_TAB_FORMAT) {
1080 add_indent_Buffer(buf, '\t', pp->depth - indent);
1081 }
1082 else if (mode==XML_SPACE_FORMAT) {
1083 add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1084 }
1085 else if (mode==XML_SPACE4_FORMAT) {
1086 add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1087 }
1088
1089 cat_s2Buffer("<!", buf);
1090 if (pp->ldat.val.buf!=NULL) {
1091 cat_Buffer(&(pp->ldat.val), buf);
1092 }
1093 cat_s2Buffer(">", buf);
1094
1095 if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1096 }
1097
1098 // Processing TAG
1099 else if (pp->ldat.id==XML_PROCESS_NODE) {
1100 if (mode!=XML_ONELINE_FORMAT) {
1101 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
1102 }
1103 //
1104 if (mode==XML_TAB_FORMAT) {
1105 add_indent_Buffer(buf, '\t', pp->depth - indent);
1106 }
1107 else if (mode==XML_SPACE_FORMAT) {
1108 add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1109 }
1110 else if (mode==XML_SPACE4_FORMAT) {
1111 add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1112 }
1113
1114 cat_s2Buffer("<?", buf);
1115 if (pp->ldat.key.buf!=NULL) {
1116 cat_Buffer(&(pp->ldat.key), buf);
1117 }
1118 if (pp->ldat.lst!=NULL) {
1119 xml_attr_to_Buffer(pp->ldat.lst, buf);
1120 }
1121 cat_s2Buffer(" ?>", buf);
1122
1123 if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1124 }
1125 return;
1126}
1127
1128
1144void xml_close_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
1145{
1146 if (pp->ldat.id==XML_NAME_NODE) {
1147 if (pp->next!=NULL) {
1148 if (pp->next->ldat.id!=XML_CONTENT_NODE || pp->next->ysis!=NULL) {
1149 if (mode==XML_TAB_FORMAT) {
1150 add_indent_Buffer(buf, '\t', pp->depth - indent);
1151 }
1152 else if (mode==XML_SPACE_FORMAT) {
1153 add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1154 }
1155 else if (mode==XML_SPACE4_FORMAT) {
1156 add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1157 }
1158 }
1159 cat_s2Buffer("</", buf);
1160 cat_Buffer(&(pp->ldat.key), buf);
1161 cat_s2Buffer(">", buf);
1162
1163 if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1164 }
1165 }
1166 return;
1167}
1168
1169
1179{
1180 while (pp!=NULL) {
1181 cat_s2Buffer(" ", buf);
1182 cat_Buffer(&(pp->ldat.key), buf);
1183
1184 if (pp->ldat.val.buf!=NULL) {
1185 cat_s2Buffer("=", buf);
1186 cat_Buffer(&(pp->ldat.val), buf);
1187 }
1188 pp = pp->next;
1189 }
1190}
1191
1192
1193
1195// Operation
1196//
1197
1204{
1205 tXML* xml = xml_parse((char*)"<?xml version=\"1.0\" encoding=\"utf-8\"?>");
1206 return xml;
1207}
1208
1209
1219tXML* add_xml_node(tXML* xml, const char* name)
1220{
1221 tXML* pp;
1222
1223 if (name==NULL) return NULL;
1224
1225 pp = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0);
1226 pp->state = JBXL_XML_NODE_EMPTY;
1227 if (pp->prev!=NULL) pp->prev->ldat.lv++;
1228
1229 return pp;
1230}
1231
1232
1242tXML* insert_xml_node(tXML* xml, const char* name)
1243{
1244 tList* pp;
1245
1246 if (xml==NULL || name==NULL) return NULL;
1247
1248 pp = insert_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0);
1249 pp->state = JBXL_XML_NODE_EMPTY;
1250 if (pp->prev!=NULL) pp->prev->ldat.lv++;
1251
1252 return pp;
1253}
1254
1255
1287tXML* add_xml_content_node(tXML* xml, const char* content)
1288{
1289 tList* pp;
1290
1291 if (xml==NULL || content==NULL) return NULL;
1292 if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1293
1294 pp = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, content, NULL, NULL, 0);
1295 pp->state = JBXL_XML_NODE_CLOSED;
1296 if (pp->prev!=NULL) pp->prev->ldat.lv++;
1297
1298 return pp;
1299}
1300
1301
1313tXML* append_xml_content_node(tXML* xml, const char* content)
1314{
1315 tList* pp;
1316
1317 if (xml==NULL || content==NULL) return NULL;
1318 if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1319
1320 pp = xml->next;
1321 while (pp!=NULL && pp->ldat.id!=XML_CONTENT_NODE) pp = pp->ysis;
1322
1323 if (pp==NULL) {
1324 pp = add_xml_content_node(xml, content);
1325 }
1326 else {
1327 if (pp->ldat.key.vldsz!=0) cat_s2Buffer(" ", &(pp->ldat.key));
1328 cat_s2Buffer(content, &(pp->ldat.key));
1329 }
1330
1331 return pp;
1332}
1333
1334
1346tXML* set_xml_content_node(tXML* xml, const char* content)
1347{
1348 tList* pp;
1349
1350 if (xml==NULL || content==NULL) return NULL;
1351 if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1352
1353 pp = xml->next;
1354 while (pp!=NULL && pp->ldat.id!=XML_CONTENT_NODE) pp = pp->ysis;
1355
1356 if (pp==NULL) {
1357 pp = add_xml_content_node(xml, content);
1358 }
1359 else {
1360 copy_s2Buffer(content, &(pp->ldat.key));
1361 }
1362
1363 return pp;
1364}
1365
1366
1376int add_xml_content_area(tXML* xml, int len)
1377{
1378 if (xml==NULL || len<=0) return FALSE;
1379
1380 char* area = (char*)malloc(len);
1381 if (area==NULL) return FALSE;
1382 memset(area, (int)' ', len-1);
1383 area[len-1] = '\0';
1384
1385 tXML* pp = add_xml_content_node(xml, area);
1386 if (pp!=NULL) {
1387 pp->ldat.key.buf[0] = '\0';
1388 pp->ldat.key.vldsz = 0;
1389 }
1390 free(area);
1391
1392 return TRUE;
1393}
1394
1395
1401tXML* add_xml_attr(tXML* xml, const char* attr)
1402{
1403 if (xml==NULL || attr==NULL) return NULL;
1404 if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1405
1406 tList* lp = xml_parse_attr((char*)attr);
1407
1408 if (xml->ldat.lst==NULL) xml->ldat.lst = lp;
1409 else add_tList_end(xml->ldat.lst, lp);
1410
1411 return xml;
1412}
1413
1414
1420tXML* add_xml_attr_str(tXML* xml, const char* name, const char* value)
1421{
1422 if (xml==NULL || name==NULL) return NULL;
1423
1424 Buffer attr = make_xml_attr_str(name, value);
1425 add_xml_attr(xml, (char*)attr.buf);
1426 free_Buffer(&attr);
1427
1428 return xml;
1429}
1430
1431
1437tXML* add_xml_attr_int(tXML* xml, const char* name, int value)
1438{
1439 if (xml==NULL || name==NULL) return NULL;
1440 //
1441 Buffer attr = make_xml_attr_int(name, value);
1442 add_xml_attr(xml, (char*)attr.buf);
1443 free_Buffer(&attr);
1444
1445 return xml;
1446}
1447
1448
1454tXML* add_xml_attr_float(tXML* xml, const char* name, float value)
1455{
1456 if (xml==NULL || name==NULL) return NULL;
1457 //
1458 Buffer attr = make_xml_attr_float(name, value);
1459 add_xml_attr(xml, (char*)attr.buf);
1460 free_Buffer(&attr);
1461
1462 return xml;
1463}
1464
1465
1471tXML* add_xml_attr_double(tXML* xml, const char* name, double value)
1472{
1473 if (xml==NULL || name==NULL) return NULL;
1474 //
1475 Buffer attr = make_xml_attr_double(name, value);
1476 add_xml_attr(xml, (char*)attr.buf);
1477 free_Buffer(&attr);
1478
1479 return xml;
1480}
1481
1482
1492{
1493 char* nodename = NULL;
1494
1495 if (xml==NULL) return NULL;
1496 tList* lp = xml;
1497 if (lp->ldat.id==XML_ANCHOR_NODE) lp = lp->next;
1498
1499 while (lp!=NULL) {
1500 if (lp->ldat.id==XML_NAME_NODE) {
1501 if (lp->ldat.key.buf!=NULL) {
1502 nodename = (char*)lp->ldat.key.buf;
1503 break;
1504 }
1505 }
1506 lp = lp->ysis;
1507 }
1508 return nodename;
1509}
1510
1511
1517Buffer make_xml_attr_bystr(const char* name, const char* value)
1518{
1519 Buffer buf = make_Buffer_bystr(name);
1520 cat_s2Buffer("=\"", &buf);
1521 cat_s2Buffer(value, &buf);
1522 cat_s2Buffer("\"", &buf);
1523
1524 return buf;
1525}
1526
1527
1533Buffer make_xml_attr_byint(const char* name, int value)
1534{
1535 char* str = itostr_ts(value);
1536
1537 Buffer buf = make_Buffer_bystr(name);
1538 cat_s2Buffer("=\"", &buf);
1539 cat_s2Buffer(str, &buf);
1540 cat_s2Buffer("\"", &buf);
1541
1542 freeNull(str);
1543 return buf;
1544}
1545
1546
1552Buffer make_xml_attr_byfloat(const char* name, float value)
1553{
1554 char* str = ftostr_ts(value);
1555
1556 Buffer buf = make_Buffer_bystr(name);
1557 cat_s2Buffer("=\"", &buf);
1558 cat_s2Buffer(str, &buf);
1559 cat_s2Buffer("\"", &buf);
1560
1561 freeNull(str);
1562 return buf;
1563}
1564
1565
1571Buffer make_xml_attr_bydouble(const char* name, double value)
1572{
1573 char* str = dtostr_ts(value);
1574
1575 Buffer buf = make_Buffer_bystr(name);
1576 cat_s2Buffer("=\"", &buf);
1577 cat_s2Buffer(str, &buf);
1578 cat_s2Buffer("\"", &buf);
1579
1580 freeNull(str);
1581 return buf;
1582}
1583
1584
1591{
1592 if (node==NULL || node->next==NULL) return NULL;
1593
1594 if (node->ldat.id==XML_NAME_NODE) {
1595 if (node->next->ldat.id==XML_CONTENT_NODE) return (char*)(node->next->ldat.key.buf);
1596 }
1597 return NULL;
1598}
1599
1600
1606char* xml_get_node_attr(tXML* node, const char* attr)
1607{
1608 if (node==NULL) return NULL;
1609
1610 if (node->ldat.id==XML_NAME_NODE) {
1611 tList* lt = node->ldat.lst;
1612 while (lt!=NULL) {
1613 if (!strcmp((const char*)lt->ldat.key.buf, attr)) return (char*)(lt->ldat.val.buf);
1614 lt = lt->next;
1615 }
1616 }
1617 return NULL;
1618}
1619
1620
1633{
1634 if (tp==NULL) return pp;
1635
1636 if (tp->ldat.id==XML_ANCHOR_NODE) {
1637 if (tp->next!=NULL) tp = tp->next;
1638 else return pp;
1639 }
1640
1641 pp = dup_merge_tTree(pp, tp);
1642
1643/*
1644 tXML* pt;
1645 if (pp->ldat.id!=XML_ANCHOR_NODE) {
1646 pt = new_tTree_node();
1647 pt->ldat.id = XML_ANCHOR_NODE;
1648 pt->depth = -1;
1649 add_tTree(pt, pp);
1650 close_xml(pt);
1651 return pt;
1652 }
1653*/
1654 return pp;
1655}
1656
1657
1691void print_xml(FILE* fp, tXML* pp, int mode)
1692{
1693 if (fp==NULL) fp = stderr;
1694
1695 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
1696
1697 if (pp!=NULL) {
1698 Buffer buf = xml_inverse_parse(pp, mode);
1699 if (buf.buf!=NULL) {
1700 fprintf(fp, "%s", buf.buf);
1701 free_Buffer(&buf);
1702 }
1703 else fprintf(fp, "(XML is NULL)\n");
1704 }
1705 else {
1706 fprintf(fp, "(XML is NULL)\n");
1707 }
1708 fflush(fp);
1709
1710 return;
1711}
1712
1713
1719void print_xml_node(FILE* fp, tXML* pp)
1720{
1721 if (fp==NULL) fp = stderr;
1722
1723 //fprintf(fp, "深さ: ノード種別 [状態] ノード名 (属性数)\n");
1724
1725 if (pp!=NULL) {
1726 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
1727 if (pp!=NULL) {
1728 int num = count_tList((tList*)pp->ldat.lst);
1729 fprintf(fp, "%d: %d [%d] %s (%d)\n", pp->depth, pp->ldat.id, pp->state, pp->ldat.key.buf, num);
1730 if (pp->altp!=NULL) {
1731 fprintf(fp, " altp -> %s, %s\n", pp->altp->ldat.key.buf, pp->altp->ldat.val.buf);
1732 }
1733 }
1734 else {
1735 fprintf(fp, "(XML is ANCHOR only)\n");
1736 }
1737 }
1738 else {
1739 fprintf(fp, "(XML is NULL)\n");
1740 }
1741 fflush(fp);
1742
1743 return;
1744}
1745
1746
1759void print_xml_tree(FILE* fp, tXML* pp, const char* space)
1760{
1761 int i;
1762 if (fp==NULL) fp = stderr;
1763
1764 //fprintf(fp, "深さ: ノード種別 [状態] ノード名 (属性数)\n");
1765
1766 if (pp!=NULL) {
1767 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
1768 if (pp!=NULL) {
1769 for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space);
1770 for(i=0; i<pp->depth-1; i++) fprintf(fp, "%s", " "); // for "-> "
1771 print_sister_xml_tree(fp, pp, space);
1772 fprintf(fp, "\n");
1773 }
1774 else {
1775 fprintf(fp, "(XML is ANCHOR only)\n");
1776 }
1777 }
1778 else {
1779 fprintf(fp, "(XML is NULL)\n");
1780 }
1781 fflush(fp);
1782
1783 return;
1784}
1785
1786
1798void print_sister_xml_tree(FILE* fp, tXML* pp, const char* space)
1799{
1800 if (fp==NULL) fp = stderr;
1801
1802 if (pp!=NULL) {
1803 if (pp->ldat.id==XML_ANCHOR_NODE) {
1804 if (pp->next!=NULL) pp = pp->next;
1805 }
1806
1807 while(pp->esis!=NULL) pp = pp->esis;
1808 //
1809 while(pp!=NULL) {
1810 int i;
1811 tList_data ld = pp->ldat;
1812
1813 if (pp->depth>=0) {
1814 if (pp->esis!=NULL || pp->depth>=0) fprintf(fp, "\n");
1815 if (pp->depth>0) {
1816 for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space);
1817 //for(i=0; i<pp->depth-1; i++) fprintf(fp, "%s", " ");
1818 fprintf(fp, "-> ");
1819 }
1820 }
1821 int num = count_tList((tList*)ld.lst);
1822 fprintf(fp, "%d: %d [%d] %s (%d)", pp->depth, ld.id, pp->state, ld.key.buf, num);
1823 if (ld.lst!=NULL) {
1824 tList* lst = ld.lst;
1825 fprintf(fp, " attr -->");
1826 while (lst!=NULL) {
1827 fprintf(fp, " %s=%s", lst->ldat.key.buf, lst->ldat.val.buf);
1828 lst = lst->next;
1829 }
1830 }
1831
1832 if (pp->next!=NULL) print_sister_xml_tree(fp, pp->next, space);
1833
1834 pp = pp->ysis;
1835 };
1836 }
1837 else {
1838 fprintf(fp, "(XML is NULL)\n");
1839 }
1840 fflush(fp);
1841
1842 return;
1843}
1844
1845
1846
1848// Search and Get/Set
1849//
1850
1875{
1876 int fnd;
1877 tXML* tt;
1878 tXML* pm;
1879
1880 if (pp==NULL || pt==NULL) return NULL;
1881
1882 pm = pp;
1883 if (pp->ldat.id==XML_ANCHOR_NODE) {
1884 if (pp->next!=NULL) pp = pp->next;
1885 else return NULL;
1886 }
1887 if (pt->ldat.id==XML_ANCHOR_NODE) {
1888 if (pt->next!=NULL) pt = pt->next;
1889 else return NULL;
1890 }
1891
1892 tt = find_xml_end(pt);
1893 if (tt==NULL) return FALSE;
1894
1895 while(pp->esis!=NULL) pp = pp->esis;
1896 fnd = find_match_xml(pp, pt);
1897 if (fnd) tt = tt->altp;
1898 else tt = NULL;
1899
1901
1902 return tt;
1903}
1904
1905
1921int set_xml_node(tXML* pp, tXML* pt, const char* name)
1922{
1923 tXML* tt;
1924
1925 if (pp==NULL || pt==NULL || name==NULL) return FALSE;
1926
1927 tt = get_xml_node(pp, pt);
1928 if (tt==NULL) return FALSE;
1929
1930 copy_s2Buffer(name, &(tt->ldat.key));
1931
1932 return TRUE;
1933}
1934
1935
1957{
1958 int ret;
1959 tXML* tt;
1960 tXML* pm;
1961
1962
1963 if (pp==NULL || pt==NULL) return FALSE;
1964
1965 pm = pp;
1966 if (pp->ldat.id==XML_ANCHOR_NODE) {
1967 if (pp->next!=NULL) pp = pp->next;
1968 else return FALSE;
1969 }
1970 if (pt->ldat.id==XML_ANCHOR_NODE) {
1971 if (pt->next!=NULL) pt = pt->next;
1972 else return FALSE;
1973 }
1974
1975 tt = find_xml_end(pt);
1976 if (tt==NULL) return FALSE;
1977 tt->ctrl = TREE_NOCMP_COPY_NODE; // 比べない.最後にコピー.
1978
1979 while(pp->esis!=NULL) pp = pp->esis;
1980 ret = find_match_xml(pp, pt);
1981 if (ret) {
1984 }
1985
1987
1988 return ret;
1989}
1990
1991
2007tXML* get_xml_attr_node(tXML* pp, const char* key, const char* val)
2008{
2009 if (pp==NULL || (key==NULL && val==NULL) ) return NULL;
2010
2011 if (pp->ldat.id==XML_ANCHOR_NODE) {
2012 if (pp->next!=NULL) pp = pp->next;
2013 else return NULL;
2014 }
2015 while(pp->esis!=NULL) pp = pp->esis;
2016
2017 while(pp!=NULL) {
2018 if (pp->ldat.lst!=NULL) {
2019 tList* lst = pp->ldat.lst;
2020 while (lst!=NULL) {
2021 if (ex_strncasecmp(key, (const char*)lst->ldat.key.buf, 0)) {
2022 if (ex_strncasecmp(val, (const char*)lst->ldat.val.buf, 0)) return pp;
2023 }
2024 lst = lst->next;
2025 }
2026 }
2027 //
2028 if (pp->next!=NULL) {
2029 tXML* pm = get_xml_attr_node(pp->next, key, val);
2030 if (pm!=NULL) return pm;
2031 }
2032 pp = pp->ysis;
2033 }
2034 return NULL;
2035}
2036
2037
2065{
2066 int fnd;
2067 tXML* tt = NULL;
2068 tXML* pm;
2069 tXML* dm;
2070
2071 if (pp==NULL || pt==NULL) return NULL;
2072
2073 pm = pp;
2074 if (pp->ldat.id==XML_ANCHOR_NODE) {
2075 if (pp->next!=NULL) pp = pp->next;
2076 else return NULL;
2077 }
2078 if (pt->ldat.id==XML_ANCHOR_NODE) {
2079 if (pt->next!=NULL) pt = pt->next;
2080 else return NULL;
2081 }
2082
2083 tt = find_xml_end(pt);
2084 if (tt==NULL) return NULL;
2085 dm = add_xml_content_node(tt, (char*)"DUMMY");
2086 if (dm==NULL) return NULL;
2087 dm->ctrl = TREE_NOCMP_NODE;
2088
2089 while(pp->esis!=NULL) pp = pp->esis;
2090
2091 fnd = find_match_xml(pp, pt);
2092 if (fnd) tt = dm->altp;
2093 else tt = NULL;
2094
2095 del_xml(&dm);
2097
2098 return tt;
2099}
2100
2101
2119int set_xml_content(tXML* pp, tXML* pt, const char* content)
2120{
2121 tXML* tt;
2122
2123 if (pp==NULL || pt==NULL || content==NULL) return FALSE;
2124
2125 tt = get_xml_content(pp, pt);
2126 if (tt==NULL) return FALSE;
2127
2128 copy_s2Buffer(content, &(tt->ldat.key));
2129 return TRUE;
2130}
2131
2132
2139{
2140 int ret = 0;
2141
2142 tXML* node = get_xml_content(pp, pt);
2143 if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf));
2144 return ret;
2145}
2146
2147
2154{
2155 float ret = 0.0;
2156
2157 tXML* node = get_xml_content(pp, pt);
2158 if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf));
2159 return ret;
2160}
2161
2162
2169{
2170 double ret = 0.0;
2171
2172 tXML* node = get_xml_content(pp, pt);
2173 if (node!=NULL) ret = atof((char*)(node->ldat.key.buf));
2174 return ret;
2175}
2176
2177
2184{
2185 char* ret = NULL;
2186
2187 tXML* node = get_xml_content(pp, pt);
2188 if (node!=NULL) ret = (char*)(node->ldat.key.buf);
2189 return ret;
2190}
2191
2192
2208{
2209 tList* lp = NULL;
2210 tXML* tt;
2211
2212 if (pp==NULL || pt==NULL) return NULL;
2213
2214 tt = get_xml_node(pp, pt);
2215 if (tt!=NULL) lp = tt->ldat.lst;
2216 return lp;
2217}
2218
2219
2225char* get_xml_char_attr(tXML* pp, tXML* pt, const char* attr)
2226{
2227 char* ret = NULL;
2228 if (pp==NULL || pt==NULL || attr==NULL) return ret;
2229
2230 tXML* node = get_xml_node(pp, pt);
2231 if (node!=NULL) ret = xml_get_node_attr(node, attr);
2232 return ret;
2233}
2234
2235
2242int get_xml_int_attr(tXML* pp, tXML* pt, const char* attr)
2243{
2244 int ret = 0;
2245 if (pp==NULL || pt==NULL || attr==NULL) return ret;
2246
2247 tXML* node = get_xml_node(pp, pt);
2248 if (node!=NULL) {
2249 char* val = xml_get_node_attr(node, attr);
2250 if (val!=NULL) {
2251 Buffer buf = make_Buffer_bystr(val);
2252 char* ptr = (char*)buf.buf;
2253 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2254 if (ptr[0]=='"') ptr++;
2255 ret = atoi(ptr);
2256 free_Buffer(&buf);
2257 }
2258 }
2259 return ret;
2260}
2261
2262
2269double get_xml_double_attr(tXML* pp, tXML* pt, const char* attr)
2270{
2271 double ret = 0.0;
2272 if (pp==NULL || pt==NULL || attr==NULL) return ret;
2273
2274 tXML* node = get_xml_node(pp, pt);
2275 if (node!=NULL) {
2276 char* val = xml_get_node_attr(node, attr);
2277 if (val!=NULL) {
2278 Buffer buf = make_Buffer_bystr(val);
2279 char* ptr = (char*)buf.buf;
2280 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2281 if (ptr[0]=='"') ptr++;
2282 ret = atof(ptr);
2283 free_Buffer(&buf);
2284 }
2285 }
2286 return ret;
2287}
2288
2289
2307int set_xml_attr(tXML* pp, tXML* pt, tList* at)
2308{
2309 tXML* tt;
2310
2311 if (pp==NULL || pt==NULL || at==NULL) return FALSE;
2312
2313 tt = get_xml_node(pp, pt);
2314 if (tt!=NULL) {
2315 del_all_tList(&(tt->ldat.lst));
2316 tt->ldat.lst = dup_tList(at);
2317 }
2318 else return FALSE;
2319 return TRUE;
2320}
2321
2322
2328int replace_xml_content(tXML* pp, tXML* pt, const char* src, const char* dst)
2329{
2330 tXML* tt;
2331 Buffer tg;
2332
2333 if (pp==NULL || pt==NULL || src==NULL || dst==NULL) return FALSE;
2334
2335 tt = get_xml_content(pp, pt);
2336 if (tt==NULL) return FALSE;
2337
2338 tg = replace_sBuffer_bystr(tt->ldat.key, src, dst);
2339 if (tg.buf==NULL) return FALSE;
2340
2341 free_Buffer(&(tt->ldat.key));
2342 tt->ldat.key = tg;
2343
2344 return TRUE;
2345}
2346
2347
2353tXML* get_xml_node_bystr(tXML* pp, const char* str)
2354{
2355 tXML* tx;
2356 tXML* tt;
2357
2358 if (pp==NULL || str==NULL) return FALSE;
2359
2360 tx = xml_parse((char*)str);
2361 tt = get_xml_node(pp, tx);
2362 del_all_xml(&tx);
2363 return tt;
2364}
2365
2366
2372int set_xml_node_bystr(tXML* pp, const char* str, const char* val)
2373{
2374 tXML* tx;
2375 int rt;
2376
2377 if (pp==NULL || str==NULL || val==NULL) return FALSE;
2378
2379 tx = xml_parse((char*)str);
2380 rt = set_xml_node(pp, tx, val);
2381 del_all_xml(&tx);
2382 return rt;
2383}
2384
2385
2391int set_xml_end_node_bystr(tXML* pp, const char* str)
2392{
2393 tXML* tx;
2394 int rt;
2395
2396 if (pp==NULL || str==NULL) return FALSE;
2397
2398 tx = xml_parse((char*)str);
2399 rt = set_xml_end_node(pp, tx);
2400 del_all_xml(&tx);
2401 return rt;
2402}
2403
2404
2410tXML* get_xml_content_bystr(tXML* pp, const char* str)
2411{
2412 tXML* tx;
2413 tXML* tt;
2414
2415 if (pp==NULL || str==NULL) return FALSE;
2416
2417 tx = xml_parse((char*)str);
2418 tt = get_xml_content(pp, tx);
2419 del_all_xml(&tx);
2420 return tt;
2421}
2422
2423
2430int get_xml_int_content_bystr(tXML* pp, const char* str)
2431{
2432 int ret = 0;
2433
2434 tXML* node = get_xml_content_bystr(pp, str);
2435 if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf));
2436 return ret;
2437}
2438
2439
2446float get_xml_float_content_bystr(tXML* pp, const char* str)
2447{
2448 float ret = 0.0;
2449
2450 tXML* node = get_xml_content_bystr(pp, str);
2451 if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf));
2452 return ret;
2453}
2454
2455
2462double get_xml_double_content_bystr(tXML* pp, const char* str)
2463{
2464 double ret = 0.0;
2465
2466 tXML* node = get_xml_content_bystr(pp, str);
2467 if (node!=NULL) ret = atof((char*)(node->ldat.key.buf));
2468 return ret;
2469}
2470
2471
2479char* get_xml_char_content_bystr(tXML* pp, const char* str)
2480{
2481 char* ret = NULL;
2482
2483 tXML* node = get_xml_content_bystr(pp, str);
2484 if (node!=NULL) ret = (char*)(node->ldat.key.buf);
2485 return ret;
2486}
2487
2488
2494int set_xml_content_bystr(tXML* pp, const char* str, const char* val)
2495{
2496 tXML* tx;
2497 int rt;
2498
2499 if (pp==NULL || str==NULL || val==NULL) return FALSE;
2500
2501 tx = xml_parse((char*)str);
2502 rt = set_xml_content(pp, tx, val);
2503 del_all_xml(&tx);
2504 return rt;
2505}
2506
2507
2513tList* get_xml_attr_bystr(tXML* pp, const char* str)
2514{
2515 tXML* tx;
2516 tList* tt;
2517
2518 if (pp==NULL || str==NULL) return NULL;
2519
2520 tx = xml_parse((char*)str);
2521 tt = get_xml_attr(pp, tx);
2522 del_all_xml(&tx);
2523 return tt;
2524}
2525
2526
2533char* get_xml_char_attr_bystr(tXML* pp, const char* str, const char* attr)
2534{
2535 char* ret = NULL;
2536 if (pp==NULL || str==NULL || attr==NULL) return ret;
2537
2538 tXML* node = get_xml_node_bystr(pp, str);
2539 if (node!=NULL) ret = xml_get_node_attr(node, attr);
2540 return ret;
2541}
2542
2543
2551int get_xml_int_attr_bystr(tXML* pp, const char* str, const char* attr)
2552{
2553 int ret = 0;
2554 if (pp==NULL || str==NULL || attr==NULL) return ret;
2555
2556 tXML* node = get_xml_node_bystr(pp, str);
2557 if (node!=NULL) {
2558 char* val = xml_get_node_attr(node, attr);
2559 if (val!=NULL) {
2560 Buffer buf = make_Buffer_bystr(val);
2561 char* ptr = (char*)buf.buf;
2562 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2563 if (ptr[0]=='"') ptr++;
2564 ret = atoi(ptr);
2565 free_Buffer(&buf);
2566 }
2567 }
2568 return ret;
2569}
2570
2571
2579double get_xml_double_attr_bystr(tXML* pp, const char* str, const char* attr)
2580{
2581 double ret = 0.0;
2582 if (pp==NULL || str==NULL || attr==NULL) return ret;
2583
2584 tXML* node = get_xml_node_bystr(pp, str);
2585 if (node!=NULL) {
2586 char* val = xml_get_node_attr(node, attr);
2587 if (val!=NULL) {
2588 Buffer buf = make_Buffer_bystr(val);
2589 char* ptr = (char*)buf.buf;
2590 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2591 if (ptr[0]=='"') ptr++;
2592 ret = atof(ptr);
2593 free_Buffer(&buf);
2594 }
2595 }
2596 return ret;
2597}
2598
2599
2605int set_xml_attr_bystr(tXML* pp, const char* str, tList* at)
2606{
2607 tXML* tx;
2608 int rt;
2609
2610 if (pp==NULL || str==NULL || at==NULL) return FALSE;
2611
2612 tx = xml_parse((char*)str);
2613 rt = set_xml_attr(pp, tx, at);
2614 del_all_xml(&tx);
2615 return rt;
2616}
2617
2618
2624int replace_xml_content_bystr(tXML*pp, const char* str, const char* src, const char* dst)
2625{
2626 tXML* tx;
2627 int rt;
2628
2629 if (pp==NULL || src==NULL || src==NULL || dst==NULL) return FALSE;
2630
2631 tx = xml_parse((char*)str);
2632 rt = replace_xml_content(pp, tx, src, dst);
2633 del_all_xml(&tx);
2634 return rt;
2635}
2636
2637
2638
2640// Operation for Multi Tags
2641//
2642
2657{
2658 tList* lp;
2659
2660 if (pp==NULL || pt==NULL) return NULL;
2661
2662 if (pp->ldat.id==XML_ANCHOR_NODE) {
2663 if (pp->next!=NULL) pp = pp->next;
2664 else return NULL;
2665 }
2666 if (pt->ldat.id==XML_ANCHOR_NODE) {
2667 if (pt->next!=NULL) pt = pt->next;
2668 else return NULL;
2669 }
2670
2671 lp = find_match_xml_endlist(pp, pt);
2672
2673 return lp;
2674}
2675
2676
2692{
2693 tList* lp;
2694 tList* dm;
2695
2696 if (pp==NULL || pt==NULL) return NULL;
2697
2698 if (pp->ldat.id==XML_ANCHOR_NODE) {
2699 if (pp->next!=NULL) pp = pp->next;
2700 else return NULL;
2701 }
2702 if (pt->ldat.id==XML_ANCHOR_NODE) {
2703 if (pt->next!=NULL) pt = pt->next;
2704 else return NULL;
2705 }
2706
2707 dm = find_xml_end(pt);
2708 if (dm==NULL) return NULL;
2709 dm = add_xml_content_node(dm, (char*)"DUMMY");
2710 if (dm==NULL) return NULL;
2711 dm->ctrl = TREE_NOCMP_NODE;
2712
2713 lp = find_match_xml_endlist(pp, pt);
2714 del_xml(&dm);
2715
2716 return lp;
2717}
2718
2719
2731int set_xml_content_list(tXML* pp, tXML* pt, const char* content)
2732{
2733 int num = 0;
2734 tList* lt;
2735 tList* lp;
2736
2737 if (pp==NULL || pt==NULL || content==NULL) return 0;
2738
2739 lp = lt = get_xml_content_list(pp, pt);
2740 if (lt==NULL) return 0;
2741
2742 while (lt!=NULL) {
2743 if (lt->altp!=NULL) {
2744 copy_s2Buffer(content, &(lt->altp->ldat.key));
2745 num++;
2746 }
2747 lt = lt->next;
2748 }
2749 del_tList(&lp);
2750
2751 return num;
2752}
2753
2754
2760tList* get_xml_node_list_bystr(tXML* pp, const char* str)
2761{
2762 tXML* tx;
2763 tList* tt;
2764
2765 if (pp==NULL || str==NULL) return NULL;
2766
2767 tx = xml_parse((char*)str);
2768 tt = get_xml_node_list(pp, tx);
2769 del_all_xml(&tx);
2770
2771 return tt;
2772}
2773
2774
2781{
2782 tXML* tx;
2783 tList* tt;
2784
2785 if (pp==NULL || str==NULL) return NULL;
2786
2787 tx = xml_parse((char*)str);
2788 tt = get_xml_content_list(pp, tx);
2789 del_all_xml(&tx);
2790
2791 return tt;
2792}
2793
2794
2800int set_xml_content_list_bystr(tXML* pp, const char* str, const char* content)
2801{
2802 tXML* tx;
2803 int rt;
2804
2805 if (pp==NULL || str==NULL || content==NULL) return 0;
2806
2807 tx = xml_parse((char*)str);
2808 rt = set_xml_content_list(pp, tx, content);
2809 del_all_xml(&tx);
2810
2811 return rt;
2812}
2813
2814
2815
2817// Search Function for XML
2818// tTree 用の関数とほぼ同じ
2819//
2820
2849{
2850 int ret;
2851 tXML* pm;
2852
2853 pm = pp;
2854 while(pp!=NULL) {
2855 ret = check_match_xml(pp, pt);
2856 if (ret) return TRUE;
2857
2858 if (pp->next!=NULL) {
2859 ret = find_match_xml(pp->next, pt);
2860 if (ret) {
2862 return TRUE;
2863 }
2864 }
2865 pp = pp->ysis;
2866 }
2867
2868 return FALSE;
2869}
2870
2871
2887{
2888 tXML* te;
2889 tList* lp;
2890
2891 te = find_xml_end(pt);
2892 while(pp->esis!=NULL) pp = pp->esis;
2893
2894 lp = _find_match_xml_endlist_rcsv(pp, pt, te);
2895 if (lp!=NULL) _clear_tTree_ctrl(pp);
2896
2897 return lp;
2898}
2899
2900
2908{
2909 tList* lt = NULL;
2910 tList* lp = NULL;
2911
2912 while(pp!=NULL) {
2913 int ret = check_match_xml(pp, pt);
2914 if (ret && te->altp!=NULL) {
2915 tList* lm = new_tList_node();
2916 lm->altp = te->altp;
2917 lt = insert_tList(lt, lm);
2918 if (lp==NULL) lp = lt;
2919 te->altp = NULL;
2920 }
2921
2922 if (pp->next!=NULL) {
2923 tList* lm = _find_match_xml_endlist_rcsv(pp->next, pt, te);
2924 if (lm!=NULL) {
2925 lt = insert_tList(lt, lm);
2926 if (lp==NULL) lp = lt;
2927 _clear_tTree_ctrl(pp->next);
2928 }
2929 }
2930
2931 if (!ret) pp = pp->ysis; // 見つかった場合はもう一度.見つからなかった場合へ次へ.
2932 }
2933
2934 return lp;
2935}
2936
2937
2949{
2950 int ret;
2951 tXML* tt = NULL;
2952 tXML* pm;
2953
2954 if (pp==NULL || pt==NULL) return NULL;
2955
2956 pm = pp;
2957 ret = find_match_tTree(pp, pt);
2958 if (ret) {
2959 tt = find_xml_end(pt);
2960 if (tt!=NULL) {
2961 tt = tt->altp;
2962 }
2963 }
2964
2966
2967 return tt;
2968}
2969
2970
2992{
2993 int ret;
2994 tXML* te;
2995 tXML* ts;
2996
2997 tXML* tt;
2998 tXML* ta;
2999 tXML* tb;
3000
3001 if (tp==NULL || tr==NULL) return FALSE;
3002
3003 te = find_tList_end(tr);
3004
3005 ts = tp;
3006 while (ts!=NULL) {
3007 tt = cmp_sisters_xml(ts, tr); // その階層で trと全て一致している部分があるかを確認
3008 if (tt==NULL) return FALSE; // 一致していなければ,FALSE
3009
3010 ta = tt; // 比べられるツリー
3011 tb = tr; // 比べるパターン
3012 ret = TRUE;
3013 while (tb!=NULL && ret) {
3014 if (tb->next==NULL) ret = TRUE;
3015 // ->ta, ->tb->tx: FALSE
3016 else if (tb->next!=NULL && ta->next==NULL) ret = FALSE;
3017 // ->ta->xa, ->tb->xb: xaとxbをチェック
3018 else ret = check_match_xml(ta->next, tb->next);
3019
3020 ta = ta->ysis;
3021 tb = tb->ysis;
3022 }
3023
3024 if (ret) {
3025 if (tr==te) tt->ctrl = TREE_ALREADY_FOUND_NODE;
3026 return TRUE;
3027 }
3028
3029 ts = tt->ysis;
3030 }
3031
3032 return FALSE;
3033}
3034
3035
3069{
3070 tXML* ta;
3071 tXML* tb = NULL;
3072 tXML* ts;
3073
3074 ts = tp;
3075 while (ts!=NULL){
3076 ta = ts;
3077 tb = tr;
3078 while (ta!=NULL && tb!=NULL) {
3079 // 一致しない場合 break
3080 if (ta->ctrl==TREE_ALREADY_FOUND_NODE) break;
3081 if (tb->ctrl!=TREE_NOCMP_NODE && tb->ctrl!=TREE_NOCMP_COPY_NODE) {
3082 if ((ta->ldat).key.buf!=NULL && (tb->ldat).key.buf!=NULL) {
3083 if (ta->ldat.id!=tb->ldat.id || strcmp((char*)((ta->ldat).key.buf), (char*)((tb->ldat).key.buf))) break;
3084 }
3085 else break;
3086 }
3087
3088 // ta と tb は一致
3089 tb->altp = ta;
3090 ta = ta->ysis;
3091 tb = tb->ysis;
3092 }
3093
3094 // ts と tr は完全に一致
3095 if (tb==NULL) return ts;
3096
3097 ts = ts->ysis;
3098 }
3099
3100 return NULL;
3101}
3102
3103
3104
3106// Simple Node Functions (単純な構造のノードの操作)
3107//
3108
3119Buffer get_node_content(tXML* tp, const char* name, int no)
3120{
3121 Buffer content;
3122 tXML* tt;
3123
3124 content = init_Buffer();
3125 if (tp==NULL || name==NULL) return content;
3126
3127 if (no<=0) no = 1;
3128 tt = strncmp_tTree(tp, name, 0, no);
3129 if (tt!=NULL) {
3130 if (tt->next!=NULL) {
3131 tt = tt->next;
3132 while (tt!=NULL && tt->ldat.id!=XML_CONTENT_NODE) tt = tt->ysis;
3133 if (tt==NULL) return content;
3134 content = dup_Buffer(tt->ldat.key);
3135 }
3136 }
3137
3138 return content;
3139}
3140
3141
3147int get_node_integer(tXML* tp, const char* name, int no)
3148{
3149 int ret;
3150 Buffer content;
3151
3152 content = get_node_content(tp, name, no);
3153
3154 if (content.buf==NULL) ret = 0;
3155 else ret = atoi((const char*)content.buf);
3156 free_Buffer(&content);
3157
3158 return ret;
3159}
3160
3161
3168int return_exist_node(tXML* tp, const char* name, int no, Buffer* content)
3169{
3170 Buffer buf;
3171
3172 buf = get_node_content(tp, name, no);
3173 if (buf.buf==NULL) return FALSE;
3174
3175 if (content!=NULL) *content = buf;
3176 return TRUE;
3177}
3178
3179
3192int replace_all_node_integer(tXML* tp, const char* name, int src, int dst)
3193{
3194 int n;
3195 char nums[20], numd[20];
3196
3197 snprintf(nums, 10, "%d", src);
3198 snprintf(numd, 10, "%d", dst);
3199
3200 n = replace_all_node_contents(tp, name, nums, numd);
3201
3202 return n;
3203}
3204
3205
3219int replace_all_node_contents(tXML* pp, const char* name, const char* src, const char* dst)
3220{
3221 int n;
3222
3223 if (pp==NULL || dst==NULL) return 0;
3224
3225 if (pp->ldat.id==XML_ANCHOR_NODE) {
3226 if (pp->next!=NULL) pp = pp->next;
3227 else return 0;
3228 }
3229 while(pp->esis!=NULL) pp = pp->esis;
3230
3231 n = _replace_all_node_contents_rcsv(pp, name, src, dst);
3232
3233 return n;
3234}
3235
3236
3242int _replace_all_node_contents_rcsv(tXML* pp, const char* name, const char* src, const char* dst)
3243{
3244 int n = 0;
3245
3246 while(pp!=NULL) {
3247 if (pp->ldat.key.buf!=NULL && pp->ldat.id==XML_NAME_NODE && pp->ldat.lv>0) {
3248 if (name==NULL || !strcmp(name, (const char*)(pp->ldat.key.buf))) {
3249 tXML* tt = pp->next;
3250
3251 // 複数のコンテント
3252 while (tt!=NULL) {
3253 if (tt->ldat.id==XML_CONTENT_NODE) {
3254 if (src==NULL) {
3255 copy_s2Buffer(dst, &(tt->ldat.key));
3256 n++;
3257 }
3258 else if (tt->ldat.key.buf!=NULL && strstr((const char*)tt->ldat.key.buf, src)!=NULL) {
3259 Buffer buf = replace_sBuffer_bystr(tt->ldat.key, src, dst);
3260 free_Buffer(&(tt->ldat.key));
3261 tt->ldat.key = buf;
3262 n++;
3263 }
3264 }
3265 tt = tt->ysis;
3266 }
3267 }
3268 }
3269
3270 if (pp->next!=NULL) n += _replace_all_node_contents_rcsv(pp->next, name, src, dst);
3271
3272 pp = pp->ysis;
3273 }
3274
3275 return n;
3276}
3277
3278
3291int replace_all_node_byid(tXML* pp, const char* src, const char* dst, int id)
3292{
3293 int n;
3294
3295 if (pp==NULL || dst==NULL) return 0;
3296
3297 if (pp->ldat.id==XML_ANCHOR_NODE) {
3298 if (pp->next!=NULL) pp = pp->next;
3299 else return 0;
3300 }
3301 while(pp->esis!=NULL) pp = pp->esis;
3302
3303 n = _replace_all_node_byid_rcsv(pp, src, dst, id);
3304
3305 return n;
3306}
3307
3308
3314int _replace_all_node_byid_rcsv(tXML* pp, const char* src, const char* dst, int id)
3315{
3316 int n = 0;
3317
3318 while(pp!=NULL) {
3319 if (id<0 || pp->ldat.id==id) {
3320 if (src==NULL) {
3321 copy_s2Buffer(dst, &(pp->ldat.key));
3322 n++;
3323 }
3324 else if (pp->ldat.key.buf!=NULL && strstr((const char*)pp->ldat.key.buf, src)!=NULL) {
3325 Buffer buf = replace_sBuffer_bystr(pp->ldat.key, src, dst);
3326 free_Buffer(&(pp->ldat.key));
3327 pp->ldat.key = buf;
3328 n++;
3329 }
3330 }
3331
3332 if (pp->next!=NULL) n += _replace_all_node_byid_rcsv(pp->next, src, dst, id);
3333
3334 pp = pp->ysis;
3335 }
3336
3337 return n;
3338}
3339
3340
3341
3343// XML-RPC
3344
3376Buffer xml_rpc_request_pack(const char* name, tXML* xml)
3377{
3378 tXML* ptr = init_xml_doc();
3379 tXML* top = add_xml_node(ptr, "methodCall");
3380 tXML* mnm = add_xml_node(top, "methodName");
3381 tXML* prs = add_xml_node(top, "params");
3382 tXML* prm = add_xml_node(prs, "param");
3383 add_xml_content_node(mnm, name);
3384
3385 join_xml(prm, xml);
3387
3388 return buf;
3389}
3390
3391
3408tXML* xml_rpc_add_member(tXML* xml, char* name, char* value, char* kind)
3409{
3410 if (name==NULL) return xml;
3411
3412 if (xml==NULL) xml = add_xml_node(NULL, "struct");
3413
3414 tXML* mem = add_xml_node(xml, "member");
3415 tXML* mnm = add_xml_node(mem, "name");
3416 tXML* val = add_xml_node(mem, "value");
3417 tXML* knd;
3418 if (kind==NULL) knd = add_xml_node(val, "string");
3419 else if (kind[0]=='\0') knd = add_xml_node(val, "string");
3420 else knd = add_xml_node(val, kind);
3421
3422 add_xml_content_node(mnm, name);
3423 add_xml_content_node(knd, value);
3424
3425 return xml;
3426}
3427
3428
3452{
3453 tXML* ptr = add_xml_node(NULL, "value");
3454 join_xml(ptr, xml);
3455
3456 return ptr;
3457}
3458
3459
3470{
3471 if (xml==NULL) xml = add_xml_node(NULL, "data");
3472 join_xml(xml, array);
3473
3474 return xml;
3475}
3476
3477
3491{
3492 tXML* ptr = add_xml_node(NULL, "value");
3493 tXML* val = add_xml_node(ptr, "array");
3494 join_xml(val, xml);
3495
3496 return ptr;
3497}
3498
Buffer make_Buffer(int sz)
Buffer型変数のバッファ部をつくり出す.
Definition buffer.cpp:71
Buffer replace_sBuffer_bystr(Buffer buf, const char *frm, const char *tos)
buf.buf中の文字列 frmを tosで置き換えた 新しい Bufferを返す
Definition buffer.cpp:1603
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Definition buffer.cpp:128
Buffer read_Buffer_file(const char *fn)
ファイル fn の内容を Buffer型変数に読み込む.
Definition buffer.cpp:1467
Buffer init_Buffer()
初期化したBuffer型変数を返す.
Definition buffer.cpp:47
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
Definition buffer.cpp:211
int cat_Buffer(Buffer *src, Buffer *dst)
Buffer変数 srcから dstへバッファを catする.
Definition buffer.cpp:384
void add_indent_Buffer(Buffer *buf, char cc, int len)
インデント(cc x num) を付加する.
Definition buffer.cpp:1327
#define copy_s2Buffer(src, dst)
copy_b2Buffer()
Definition buffer.h:108
#define cat_s2Buffer(src, dst)
cat_b2Buffer()
Definition buffer.h:122
#define make_Buffer_bystr(str)
set_Buffer()
Definition buffer.h:57
#define CRLF
Definition common.h:239
#define snprintf
Definition common.h:56
#define TRUE
Definition common.h:226
#define FALSE
Definition common.h:223
#define strncasecmp
Definition common.h:59
#define LMDATA
Definition common.h:154
JunkBox_Lib 状態ヘッダ
#define JBXL_XML_NODE_CLOSED
XMLノードは閉じている
Definition jbxl_state.h:95
#define JBXL_ARGS_ERROR
不正な引数(NULLなど)
Definition jbxl_state.h:42
#define JBXL_STATE_ANCHOR
アンカーノード
Definition jbxl_state.h:30
#define JBXL_XML_DEFAULT_STATE
XMLデータの初期状態
Definition jbxl_state.h:98
#define JBXL_XML_NODE_EMPTY
XMLの空のノード
Definition jbxl_state.h:96
#define JBXL_XML_NOT_CLOSED
XMLデータが閉じていない
Definition jbxl_state.h:97
#define JBXL_XML_NODE_OPENED
XMLノードは開いている
Definition jbxl_state.h:94
#define JBXL_NORMAL
正常
Definition jbxl_state.h:32
#define JBXL_XML_PARSE_ERROR
XML の解釈エラー
Definition jbxl_state.h:88
#define JBXL_XML_SEQUENCE_ERROR
XMLノードのリンクエラー
Definition jbxl_state.h:89
#define JBXL_MALLOC_ERROR
メモリ確保エラー
Definition jbxl_state.h:41
#define JBXL_XML_MULTI_ROOT
XMLは複数のルート(TOP)を持っている.(パース済み)
Definition jbxl_state.h:93
#define JBXL_XML_PARSED
XMLパース済み
Definition jbxl_state.h:92
int vldsz
データの長さ.バイナリデータの場合も使用可能.文字列の場合は 0x00 を含まない.
Definition buffer.h:37
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.
Definition buffer.h:39
tList * dup_tList(tList *pp)
リストを複製する.
Definition tlist.cpp:843
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
Definition tlist.cpp:769
tList * insert_tList(tList *pp, tList *pt)
ノードppの直ぐ後ろに ptを挿入する.
Definition tlist.cpp:903
int count_tList(tList *pp)
リストの ppノード以降のノードの数を数える.
Definition tlist.cpp:979
tList * del_tList(tList **pp)
指定したリストノード以降のリストを削除.
Definition tlist.cpp:735
tList * find_tList_end(tList *pl)
リストの最後のノードを探す.
Definition tlist.cpp:1023
tList * add_tList_end(tList *pp, tList *pt)
リストppの最後に リストptを追加する.
Definition tlist.cpp:877
tList * new_tList_node(void)
リスト用の空ノードを動的に生成する.
Definition tlist.cpp:198
#define add_tList_node_str(p, k, v)
add_tList_node_bystr()
Definition tlist.h:142
char * itostr_ts(int n)
int を文字に変換する.要 free()
Definition tools.cpp:1532
int ex_strncasecmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE
Definition tools.cpp:820
char * ftostr_ts(float n)
float を文字に変換する.要 free()
Definition tools.cpp:1632
char * skip_chars(char *pp, const char *check)
check[]中の何れかの文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition tools.cpp:948
char * pack_head_tail_char(char *mesg, char cc)
文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free()
Definition tools.cpp:1092
char * dtostr_ts(double n)
double を文字に変換する.要 free()
Definition tools.cpp:1652
#define CHAR_TAB
タブ
Definition tools.h:80
#define CHAR_CR
改行
Definition tools.h:78
#define CHAR_LF
ラインフィード
Definition tools.h:79
tTree * new_tTree_anchor_node(void)
ツリー用の ANCHORノードを動的に生成.
Definition ttree.cpp:37
void adjust_tTree_depth(tTree *pp)
指定したノード ppを基準にして,木の深さを測り直す
Definition ttree.cpp:1016
tTree * strncmp_tTree(tTree *pp, const char *key, int len, int no)
ツリーノードのキー値のサーチ
Definition ttree.cpp:1190
int count_tTree(tTree *pp)
ツリーの ppノード以降のノードの数を数える.
Definition ttree.cpp:1151
tTree * dup_merge_tTree(tTree *pp, tTree *tp)
ツリー ppの直下にツリー tpを複製する.
Definition ttree.cpp:858
tTree * insert_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを長子としてリストに追加.
Definition ttree.cpp:325
void _clear_tTree_ctrl(tTree *pp)
ppツリーの ctrlをクリアする.
Definition ttree.cpp:1420
tTree * add_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを末っ子としてリストに追加.
Definition ttree.cpp:202
void _copy_tTree_byctrl(tTree *pt)
同じパターンの枝を検索し,ptのノードの属性をコピーする.
Definition ttree.cpp:1541
int find_match_tTree(tTree *pp, tTree *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.
Definition ttree.cpp:1390
#define TREE_NOCMP_NODE
比較対照から外すノード.通常は無条件で一致させる.
Definition ttree.h:53
#define TREE_NOCMP_COPY_NODE
比較対照から外し,最後にコピー処理を行うノード.通常は無条件で一致させる.
Definition ttree.h:54
#define TREE_ALREADY_FOUND_NODE
検索などにおいて既に見つけたノード.見つけたことを確定したノード.
Definition ttree.h:59
int _replace_all_node_byid_rcsv(tXML *pp, const char *src, const char *dst, int id)
replace_all_node_byid() の補助関数
Definition txml.cpp:3314
double get_xml_double_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を double型で返す.
Definition txml.cpp:2168
int _replace_all_node_contents_rcsv(tXML *pp, const char *name, const char *src, const char *dst)
replace_all_node_content() の補助関数
Definition txml.cpp:3242
char * get_xml_char_attr_bystr(tXML *pp, const char *str, const char *attr)
get_xml_char_attr() の _bystr バージョン.free() してはいけない.
Definition txml.cpp:2533
tXML * xml_main_parse(tXML *xml, char *pp, int skip)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.パーサの内部的なメイン関数.
Definition txml.cpp:189
void _xml_to_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
xml_inverse_parse()用の補助関数.
Definition txml.cpp:928
float get_xml_float_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を float型で返す.
Definition txml.cpp:2153
void print_sister_xml_tree(FILE *fp, tXML *pp, const char *space)
XMLツリーの表示.ppの姉妹ノードも出力する.
Definition txml.cpp:1798
tXML * xml_rpc_end_array(tXML *xml)
配列データを閉じて,送信用データを生成する.
Definition txml.cpp:3490
int get_node_integer(tXML *tp, const char *name, int no)
tp中のXMLデータから no番目のノード '<node_name>node_content(整数)</node_name>' の node_content(整数)を得る.
Definition txml.cpp:3147
void print_xml_node(FILE *fp, tXML *pp)
MLのノード情報を表示する.デバッグ用.
Definition txml.cpp:1719
tXML * get_xml_node(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
Definition txml.cpp:1874
tXML * xml_rpc_add_member(tXML *xml, char *name, char *value, char *kind)
XML-RPC の <member> データを作って,繋げていく.
Definition txml.cpp:3408
int set_xml_end_node_bystr(tXML *pp, const char *str)
set_xml_end_node(tXML* pp, tXML* pt) の _bystr バージョン
Definition txml.cpp:2391
tXML * add_xml_attr_double(tXML *xml, const char *name, double value)
xml に属性名 name, double型実数の属性値 value を持つノードを追加する.
Definition txml.cpp:1471
int xml_parse_comment_node(char *pp, char **comment)
XMLのコメントノードを処理する.
Definition txml.cpp:730
int set_xml_node_bystr(tXML *pp, const char *str, const char *val)
set_xml_node(tXML* pp, tXML* pt, const char* val) の _bystr バージョン
Definition txml.cpp:2372
tXML * add_xml_attr_str(tXML *xml, const char *name, const char *value)
xml に属性名 name, 文字列の属性値 value を持つノードを追加する.
Definition txml.cpp:1420
int replace_xml_content(tXML *pp, tXML *pt, const char *src, const char *dst)
get_xml_content() を使用し,XMLキーの src部分を dstで書き換える.
Definition txml.cpp:2328
float get_xml_float_content_bystr(tXML *pp, const char *str)
get_xml_float_content(tXML* pp, tXML* pt) の _bystr バージョン.
Definition txml.cpp:2446
int find_match_xml(tXML *pp, tXML *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.姉妹ツリーも検索するので注意.
Definition txml.cpp:2848
void print_xml_tree(FILE *fp, tXML *pp, const char *space)
XMLツリーをそのままツリー表示する.デバッグ用.
Definition txml.cpp:1759
int set_xml_content(tXML *pp, tXML *pt, const char *content)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後ノードに対応したのノードのコンテントを contentで置き換える.
Definition txml.cpp:2119
tXML * dup_merge_xml(tXML *pp, tXML *tp)
XMLツリー ppの直下にXMLツリー tpを複製する.
Definition txml.cpp:1632
char * xml_get_node_attr(tXML *node, const char *attr)
属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない.
Definition txml.cpp:1606
tXML * xml_parse_file(const char *fn)
ファイルから読み込んでパースする.
Definition txml.cpp:94
double get_xml_double_attr_bystr(tXML *pp, const char *str, const char *attr)
get_xml_double_attr() の _bystr バージョン.
Definition txml.cpp:2579
void print_xml(FILE *fp, tXML *pp, int mode)
XMLの表示(出力).
Definition txml.cpp:1691
tList * _find_match_xml_endlist_rcsv(tXML *pp, tXML *pt, tXML *te)
find_match_xml_endlist() の補助関数
Definition txml.cpp:2907
char * get_xml_char_content_bystr(tXML *pp, const char *str)
get_xml_char_content(tXML* pp, tXML* pt) の _bystr バージョン.free() してはいけない.
Definition txml.cpp:2479
tXML * xml_rpc_end_member(tXML *xml)
<struct><member> データを閉じて,<value> データを作り出す.
Definition txml.cpp:3451
int replace_all_node_integer(tXML *tp, const char *name, int src, int dst)
XMLツリー pp内で ノード名が nameである全てのノードのコンテント(整数)を,srcから dstに書き換える.
Definition txml.cpp:3192
tXML * set_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下のコンテントノードの値を置き換える.
Definition txml.cpp:1346
int get_xml_int_attr_bystr(tXML *pp, const char *str, const char *attr)
get_xml_int_attr() の _bystr バージョン.
Definition txml.cpp:2551
tXML * xml_parse_seq(tXML *xml, char *pp)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.断片的にXMLデータを入力する場合に使用する.
Definition txml.cpp:135
tXML * xml_rpc_add_array(tXML *xml, tXML *array)
<value><struct> データから 配列データ <data>...</data> を作って繋げていく.
Definition txml.cpp:3469
int get_xml_int_content_bystr(tXML *pp, const char *str)
get_xml_int_content(tXML* pp, tXML* pt) の _bystr バージョン
Definition txml.cpp:2430
Buffer xml_rpc_request_pack(const char *name, tXML *xml)
XML-RPC用のデータを生成する.
Definition txml.cpp:3376
int set_xml_attr(tXML *pp, tXML *pt, tList *at)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノードの属性としてatの値をコピーする.
Definition txml.cpp:2307
tXML * get_xml_node_bystr(tXML *pp, const char *str)
get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン
Definition txml.cpp:2353
tList * get_xml_content_list_bystr(tXML *pp, const char *str)
get_xml_conetnt_list_bystr() の _bystr バージョン.
Definition txml.cpp:2780
char * get_first_xml_nodename(tXML *xml)
XMLツリーの最初のノードの名前を返す.
Definition txml.cpp:1491
int set_xml_content_list(tXML *pp, tXML *pt, const char *content)
get_xml_content_list() で検出したコンテントを, content で置き換える.
Definition txml.cpp:2731
int xml_parse_start_node(char *pp, char **node_name, char **node_attr, int *node_end)
XMLの開始ノードを処理する.
Definition txml.cpp:371
int set_xml_end_node(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
Definition txml.cpp:1956
int check_match_xml(tXML *tp, tXML *tr)
XMLツリー tpが XMLツリー trと同じかどうかを検査する.
Definition txml.cpp:2991
int replace_all_node_byid(tXML *pp, const char *src, const char *dst, int id)
XMLツリー pp内で ノードの種別が idである全てのノードの内容を srcから dstに書き換える.
Definition txml.cpp:3291
Buffer make_xml_attr_byfloat(const char *name, float value)
属性名 name, float型実数の属性値 value を持つ Buffer型変数を作成する.
Definition txml.cpp:1552
Buffer make_xml_attr_bystr(const char *name, const char *value)
属性名 name, 文字列の属性値 value を持つ Buffer型変数を作成する.
Definition txml.cpp:1517
tXML * init_xml_doc()
XML のドキュメントヘッダを作成する.
Definition txml.cpp:1203
int set_xml_content_list_bystr(tXML *pp, const char *str, const char *content)
set_xml_content_list_bystr() の _bystr バージョン.
Definition txml.cpp:2800
int set_xml_node(tXML *pp, tXML *pt, const char *name)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノード対応したノードにノード名をコピーする.
Definition txml.cpp:1921
int xml_parse_processing_node(char *pp, char **node_name, char **node_attr)
XMLのプロセッシングノードを処理する
Definition txml.cpp:654
void close_xml(tXML *pp)
パースエラーを起こしたツリーを強制的に正常化する.
Definition txml.cpp:836
int replace_all_node_contents(tXML *pp, const char *name, const char *src, const char *dst)
XMLツリー pp内で ノード名が nameである全てのノードのコンテントを,srcから dstに書き換える.
Definition txml.cpp:3219
void xml_attr_to_Buffer(tList *pp, Buffer *buf)
リストに保存されたノードの属性をテキストへ戻す.
Definition txml.cpp:1178
tXML * add_xml_attr(tXML *xml, const char *attr)
xml に属性(attr)を追加する.
Definition txml.cpp:1401
int set_xml_content_bystr(tXML *pp, const char *str, const char *val)
set_xml_content(tXML* pp, tXML* pt, char* val) の _bystr バージョン
Definition txml.cpp:2494
tList * get_xml_attr(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノード属性値へのリストを altp に入れて返す.
Definition txml.cpp:2207
double get_xml_double_content_bystr(tXML *pp, const char *str)
get_xml_double_content(tXML* pp, tXML* pt) の _bystr バージョン.
Definition txml.cpp:2462
tXML * add_xml_attr_float(tXML *xml, const char *name, float value)
xml に属性名 name, float型実数の属性値 value を持つノードを追加する.
Definition txml.cpp:1454
int replace_xml_content_bystr(tXML *pp, const char *str, const char *src, const char *dst)
replace_xml_content(tXML*pp, tXML* pt, char* src, char* dst) の _bystr バージョン.
Definition txml.cpp:2624
int xml_parse_data_node(char *pp, char **data)
XMLのデータノード(その他エレメントノードなど)を処理する.
Definition txml.cpp:773
tXML * insert_xml_node(tXML *xml, const char *name)
XMLツリーのxml の直下(姉妹の一番上:長子)にノード(属性は指定しない)を挿入する.
Definition txml.cpp:1242
int get_xml_int_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を int型で返す.
Definition txml.cpp:2138
tXML * add_xml_node(tXML *xml, const char *name)
XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する.
Definition txml.cpp:1219
int return_exist_node(tXML *tp, const char *name, int no, Buffer *content)
bufの中に ノード '<name>content</name>' が存在するかどうかチェックする.
Definition txml.cpp:3168
tXML * xml_parse(char *pp)
文字列のXMLデータを解釈して,tXMLのツリーを生成する.
Definition txml.cpp:48
tList * xml_parse_attr(char *pp)
XMLのノード属性を解釈して,リスト(tList)にする.
Definition txml.cpp:559
char * get_xml_char_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を char*型で返す.free() してはいけない.
Definition txml.cpp:2183
tXML * find_match_xml_end_node(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptの最後のノードに対応する pp内のノードへのポインタを返す.
Definition txml.cpp:2948
tList * get_xml_content_list(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードのコンテントへのポインタをリストに格納して返す.
Definition txml.cpp:2691
int add_xml_content_area(tXML *xml, int len)
xml に空のコンテントノードを追加する.
Definition txml.cpp:1376
void xml_close_node_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
ツリー中のXMLのクローズノードのデータを元の書式に戻して Bufferに格納する.
Definition txml.cpp:1144
int isnot_xml_name(unsigned char *pp)
XML名として不適切かどうかを大まかに判断する.
Definition txml.cpp:810
Buffer get_node_content(tXML *tp, const char *name, int no)
tp中のXMLデータから no番目のノード '<name>node_content</name>' のnode_contentのコピーを得る.
Definition txml.cpp:3119
int get_xml_int_attr(tXML *pp, tXML *pt, const char *attr)
get_xml_node() で検索したノードから,属性値 attrの値を int型で取り出す.
Definition txml.cpp:2242
char * get_xml_char_attr(tXML *pp, tXML *pt, const char *attr)
get_xml_node() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない.
Definition txml.cpp:2225
int set_xml_attr_bystr(tXML *pp, const char *str, tList *at)
set_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン.
Definition txml.cpp:2605
int xml_parse_end_node(char *pp, char **node_name)
XMLの終了ノードを処理する.
Definition txml.cpp:468
Buffer make_xml_attr_bydouble(const char *name, double value)
属性名 name, double型実数の属性値 value を持つ Buffer型変数を作成する.
Definition txml.cpp:1571
void xml_open_node_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
ツリー中のXMLのオープンノードのデータを元の書式に戻して Bufferに格納する.
Definition txml.cpp:958
tXML * find_match_xml_endlist(tXML *pp, tXML *pt)
ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝のptの最後のノードに対応するノードの情報をリストにして返す.
Definition txml.cpp:2886
Buffer make_xml_attr_byint(const char *name, int value)
属性名 name, 整数の属性値 value を持つ Buffer型変数を作成する.
Definition txml.cpp:1533
char * xml_get_node_content(tXML *node)
コンテントへのポインタを返す.free() してはいけない.
Definition txml.cpp:1590
tXML * append_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下のコンテントノードにコンテンツを追加する.
Definition txml.cpp:1313
tXML * add_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下にコンテントを挿入する.
Definition txml.cpp:1287
double get_xml_double_attr(tXML *pp, tXML *pt, const char *attr)
get_xml_node() で検索したノードから,属性値 attrの値を double型で取り出す.
Definition txml.cpp:2269
tXML * get_xml_content(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのコンテントへのポインタを altp に入れて返す.
Definition txml.cpp:2064
tXML * get_xml_attr_node(tXML *pp, const char *key, const char *val)
属性 key=val のノードを探し,最初に見つけたノードを返す.
Definition txml.cpp:2007
tXML * get_xml_content_bystr(tXML *pp, const char *str)
get_xml_content(tXML* pp, tXML* pt) の _bystr バージョン
Definition txml.cpp:2410
tList * get_xml_attr_bystr(tXML *pp, const char *str)
get_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン.
Definition txml.cpp:2513
tXML * cmp_sisters_xml(tXML *tp, tXML *tr)
XMLノード tpの姉妹ノードが trの姉妹ノードと同じ XMLノードまたはコンテントであるかを比較する.
Definition txml.cpp:3068
Buffer xml_inverse_parse(tXML *pp, int mode)
ppに格納された XMLデータを元の書式に戻して Bufferに格納する.xml_parse() の逆.
Definition txml.cpp:891
int xml_parse_content(char *pp, char **content)
XMLのコンテントを処理する.
Definition txml.cpp:513
tList * get_xml_node_list(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへのポインタをリストに格納して返す.
Definition txml.cpp:2656
tList * get_xml_node_list_bystr(tXML *pp, const char *str)
get_xml_node_list() の _bystr バージョン.
Definition txml.cpp:2760
tXML * add_xml_attr_int(tXML *xml, const char *name, int value)
xml に属性名 name, 整数の属性値 value を持つノードを追加する.
Definition txml.cpp:1437
Tiny XML ライブラリヘッダ
#define XML_COMMENT_NODE
コメントノード
Definition txml.h:111
#define XML_PROCESS_NODE
XML_DOC_NODE 以外の <? ... ?>ノード
Definition txml.h:113
#define XML_DATA_NODE
<! ... > ノード
Definition txml.h:112
#define XML_DOC_NODE
<? xml... ?> ノード
Definition txml.h:110
#define XML_SPACE4_FORMAT
先頭に空白4つ " " をつけ,ノードごとに改行する.
Definition txml.h:121
#define make_xml_attr_float(n, v)
make_xml_attr_byfloat()
Definition txml.h:193
#define make_xml_attr_int(n, v)
make_xml_attr_byint()
Definition txml.h:192
#define XML_TAB_FORMAT
先頭にインデント(TAB)をつけ,ノードごとに改行する.
Definition txml.h:118
#define join_xml(a, b)
ツリー aへノード bを末っ子として追加.
Definition txml.h:184
#define XML_CONTENT_NODE
内容(コンテント)ノード
Definition txml.h:109
#define XML_DATA_NODE_KEY
Definition txml.h:125
#define XML_NAME_NODE
ネームノード
Definition txml.h:108
#define find_xml_top(p)
find_tList_top()
Definition txml.h:157
#define make_xml_attr_str(n, v)
make_xml_attr_bystr()
Definition txml.h:191
#define del_xml(p)
指定したノード以下のXMLツリー(ppの姉妹は含まない)を削除する.
Definition txml.h:202
#define make_xml_attr_double(n, v)
make_xml_attr_bydouble()
Definition txml.h:194
#define del_all_xml(p)
XMLツリーの全ノードの削除.ポインタ ppのノードを含むXMLツリー全体を削除する.
Definition txml.h:204
#define new_xml_node()
new_tTree_node()
Definition txml.h:132
#define XML_COMMENT_NODE_KEY
Definition txml.h:124
#define XML_ANCHOR_NODE
アンカーノード
Definition txml.h:107
#define XML_ONELINE_FORMAT
改行なしの一行にする.
Definition txml.h:116
#define find_xml_end(p)
find_tTree_end()
Definition txml.h:158
#define XML_SPACE_FORMAT
先頭に空白2つ " " をつけ,ノードごとに改行する.
Definition txml.h:119