JunkBox_Lib  1.10.2
txml.c
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 
48 tXML* 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 
94 tXML* 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 
135 tXML* 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 
189 tXML* 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 
371 int 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);
398  return JBXL_XML_PARSE_ERROR;
399  }
400 
401  // Empty TAG
402  if (*pt=='/') {
403  if (*(pt+1)!='>') {
404  freeNull(*node_name);
405  return JBXL_XML_PARSE_ERROR;
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);
422  return JBXL_XML_PARSE_ERROR;
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);
442  return JBXL_XML_PARSE_ERROR;
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 
468 int 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 
513 int 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 
654 int 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);
690  return JBXL_XML_PARSE_ERROR;
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);
710  return JBXL_XML_PARSE_ERROR;
711  }
712 
713  return nn + 2;
714 }
715 
716 
730 int 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 
773 int 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 
810 int 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 
836 void close_xml(tXML* pp)
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 
928 void _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 
958 void 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) {
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 
1144 void 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 
1219 tXML* 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 
1242 tXML* 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 
1287 tXML* 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 
1313 tXML* 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 
1346 tXML* 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 
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 
1401 tXML* 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 
1420 tXML* 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 
1437 tXML* 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 
1454 tXML* 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 
1471 tXML* 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 
1517 Buffer 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 
1533 Buffer 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 
1552 Buffer 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 
1571 Buffer 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 
1606 char* 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 
1691 void 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 
1719 void 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 
1759 void 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 
1798 void 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 
1900  _clear_tTree_ctrl(pm);
1901 
1902  return tt;
1903 }
1904 
1905 
1921 int 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) {
1982  _copy_tTree_byctrl(pt);
1983  adjust_tTree_depth(pp);
1984  }
1985 
1986  _clear_tTree_ctrl(pm);
1987 
1988  return ret;
1989 }
1990 
1991 
2007 tXML* 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);
2096  _clear_tTree_ctrl(pm);
2097 
2098  return tt;
2099 }
2100 
2101 
2119 int 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 
2225 char* 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 
2242 int 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 
2269 double 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 
2307 int 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 
2328 int 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 
2353 tXML* 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 
2372 int 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 
2391 int 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 
2410 tXML* 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 
2430 int 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 
2446 float 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 
2462 double 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 
2479 char* 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 
2494 int 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 
2513 tList* 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 
2533 char* 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 
2551 int 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 
2579 double 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 
2605 int 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 
2624 int 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 
2731 int 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 
2760 tList* 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 
2780 tList* get_xml_content_list_bystr(tXML* pp, const char* str)
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 
2800 int 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 
2848 int find_match_xml(tXML* pp, tXML* pt)
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) {
2861  _clear_tTree_ctrl(pm);
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 
2965  _clear_tTree_ctrl(pm);
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 
3119 Buffer 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 
3147 int 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 
3168 int 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 
3192 int 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 
3219 int 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 
3242 int _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 
3291 int 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 
3314 int _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 
3376 Buffer 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 
3408 tXML* 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.c:71
Buffer replace_sBuffer_bystr(Buffer buf, const char *frm, const char *tos)
buf.buf中の文字列 frmを tosで置き換えた 新しい Bufferを返す
Definition: buffer.c:1603
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Definition: buffer.c:128
Buffer read_Buffer_file(const char *fn)
ファイル fn の内容を Buffer型変数に読み込む.
Definition: buffer.c:1467
Buffer init_Buffer()
初期化したBuffer型変数を返す.
Definition: buffer.c:47
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
Definition: buffer.c:211
int cat_Buffer(Buffer *src, Buffer *dst)
Buffer変数 srcから dstへバッファを catする.
Definition: buffer.c:384
void add_indent_Buffer(Buffer *buf, char cc, int len)
インデント(cc x num) を付加する.
Definition: buffer.c: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:241
#define TRUE
Definition: common.h:226
#define FALSE
Definition: common.h:223
#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
unsigned char ** buf
Definition: jpeg_tool.h:96
unsigned char unsigned long * len
Definition: jpeg_tool.h:96
Definition: buffer.h:35
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.
Definition: buffer.h:39
tList * find_tList_end(tList *pl)
リストの最後のノードを探す.
Definition: tlist.c:1023
tList * dup_tList(tList *pp)
リストを複製する.
Definition: tlist.c:843
tList * new_tList_node(void)
リスト用の空ノードを動的に生成する.
Definition: tlist.c:198
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
Definition: tlist.c:769
tList * add_tList_end(tList *pp, tList *pt)
リストppの最後に リストptを追加する.
Definition: tlist.c:877
int count_tList(tList *pp)
リストの ppノード以降のノードの数を数える.
Definition: tlist.c:979
tList * insert_tList(tList *pp, tList *pt)
ノードppの直ぐ後ろに ptを挿入する.
Definition: tlist.c:903
tList * del_tList(tList **pp)
指定したリストノード以降のリストを削除.
Definition: tlist.c:735
#define add_tList_node_str(p, k, v)
add_tList_node_bystr()
Definition: tlist.h:142
int ex_strncasecmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE
Definition: tools.c:820
char * ftostr_ts(float n)
float を文字に変換する.要 free()
Definition: tools.c:1632
char * pack_head_tail_char(char *mesg, char cc)
文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free()
Definition: tools.c:1092
char * skip_chars(char *pp, const char *check)
check[]中の何れかの文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition: tools.c:948
char * itostr_ts(int n)
int を文字に変換する.要 free()
Definition: tools.c:1532
char * dtostr_ts(double n)
double を文字に変換する.要 free()
Definition: tools.c:1652
#define freeNull(p)
Definition: tools.h:201
#define CHAR_TAB
タブ
Definition: tools.h:80
#define CHAR_CR
改行
Definition: tools.h:78
#define CHAR_LF
ラインフィード
Definition: tools.h:79
tTree * strncmp_tTree(tTree *pp, const char *key, int len, int no)
ツリーノードのキー値のサーチ
Definition: ttree.c:1190
void adjust_tTree_depth(tTree *pp)
指定したノード ppを基準にして,木の深さを測り直す
Definition: ttree.c:1016
int count_tTree(tTree *pp)
ツリーの ppノード以降のノードの数を数える.
Definition: ttree.c:1151
tTree * new_tTree_anchor_node(void)
ツリー用の ANCHORノードを動的に生成.
Definition: ttree.c:37
void _clear_tTree_ctrl(tTree *pp)
ppツリーの ctrlをクリアする.
Definition: ttree.c:1420
tTree * insert_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを長子としてリストに追加.
Definition: ttree.c:325
tTree * dup_merge_tTree(tTree *pp, tTree *tp)
ツリー ppの直下にツリー tpを複製する.
Definition: ttree.c:858
void _copy_tTree_byctrl(tTree *pt)
同じパターンの枝を検索し,ptのノードの属性をコピーする.
Definition: ttree.c:1541
int find_match_tTree(tTree *pp, tTree *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.
Definition: ttree.c:1390
tTree * add_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを末っ子としてリストに追加.
Definition: ttree.c:202
#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.c:3314
double get_xml_double_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を double型で返す.
Definition: txml.c:2168
int _replace_all_node_contents_rcsv(tXML *pp, const char *name, const char *src, const char *dst)
replace_all_node_content() の補助関数
Definition: txml.c:3242
tXML * set_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下のコンテントノードの値を置き換える.
Definition: txml.c:1346
tList * get_xml_attr(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノード属性値へのリストを altp に入れて返す.
Definition: txml.c:2207
char * get_xml_char_attr(tXML *pp, tXML *pt, const char *attr)
get_xml_node() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない.
Definition: txml.c:2225
tXML * xml_rpc_add_member(tXML *xml, char *name, char *value, char *kind)
XML-RPC の <member> データを作って,繋げていく.
Definition: txml.c:3408
char * get_xml_char_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を char*型で返す.free() してはいけない.
Definition: txml.c:2183
tXML * xml_rpc_end_array(tXML *xml)
配列データを閉じて,送信用データを生成する.
Definition: txml.c:3490
void _xml_to_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
xml_inverse_parse()用の補助関数.
Definition: txml.c:928
float get_xml_float_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を float型で返す.
Definition: txml.c:2153
void print_sister_xml_tree(FILE *fp, tXML *pp, const char *space)
XMLツリーの表示.ppの姉妹ノードも出力する.
Definition: txml.c:1798
int get_node_integer(tXML *tp, const char *name, int no)
tp中のXMLデータから no番目のノード '<node_name>node_content(整数)</node_name>' の node_content(整数)を得る.
Definition: txml.c:3147
void print_xml_node(FILE *fp, tXML *pp)
MLのノード情報を表示する.デバッグ用.
Definition: txml.c:1719
tList * get_xml_node_list(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへのポインタをリストに格納して返す.
Definition: txml.c:2656
tXML * add_xml_attr_float(tXML *xml, const char *name, float value)
xml に属性名 name, float型実数の属性値 value を持つノードを追加する.
Definition: txml.c:1454
int set_xml_end_node_bystr(tXML *pp, const char *str)
set_xml_end_node(tXML* pp, tXML* pt) の _bystr バージョン
Definition: txml.c:2391
tXML * find_match_xml_end_node(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptの最後のノードに対応する pp内のノードへのポインタを返す.
Definition: txml.c:2948
int xml_parse_comment_node(char *pp, char **comment)
XMLのコメントノードを処理する.
Definition: txml.c: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.c:2372
tXML * add_xml_attr(tXML *xml, const char *attr)
xml に属性(attr)を追加する.
Definition: txml.c:1401
int replace_xml_content(tXML *pp, tXML *pt, const char *src, const char *dst)
get_xml_content() を使用し,XMLキーの src部分を dstで書き換える.
Definition: txml.c:2328
float get_xml_float_content_bystr(tXML *pp, const char *str)
get_xml_float_content(tXML* pp, tXML* pt) の _bystr バージョン.
Definition: txml.c:2446
int find_match_xml(tXML *pp, tXML *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.姉妹ツリーも検索するので注意.
Definition: txml.c:2848
tXML * append_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下のコンテントノードにコンテンツを追加する.
Definition: txml.c:1313
void print_xml_tree(FILE *fp, tXML *pp, const char *space)
XMLツリーをそのままツリー表示する.デバッグ用.
Definition: txml.c:1759
int set_xml_content(tXML *pp, tXML *pt, const char *content)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後ノードに対応したのノードのコンテントを contentで置き換える.
Definition: txml.c:2119
tList * get_xml_node_list_bystr(tXML *pp, const char *str)
get_xml_node_list() の _bystr バージョン.
Definition: txml.c:2760
char * get_xml_char_attr_bystr(tXML *pp, const char *str, const char *attr)
get_xml_char_attr() の _bystr バージョン.free() してはいけない.
Definition: txml.c:2533
tXML * add_xml_attr_int(tXML *xml, const char *name, int value)
xml に属性名 name, 整数の属性値 value を持つノードを追加する.
Definition: txml.c:1437
char * xml_get_node_attr(tXML *node, const char *attr)
属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない.
Definition: txml.c:1606
double get_xml_double_attr_bystr(tXML *pp, const char *str, const char *attr)
get_xml_double_attr() の _bystr バージョン.
Definition: txml.c:2579
void print_xml(FILE *fp, tXML *pp, int mode)
XMLの表示(出力).
Definition: txml.c:1691
char * get_xml_char_content_bystr(tXML *pp, const char *str)
get_xml_char_content(tXML* pp, tXML* pt) の _bystr バージョン.free() してはいけない.
Definition: txml.c:2479
tXML * get_xml_attr_node(tXML *pp, const char *key, const char *val)
属性 key=val のノードを探し,最初に見つけたノードを返す.
Definition: txml.c:2007
tList * _find_match_xml_endlist_rcsv(tXML *pp, tXML *pt, tXML *te)
find_match_xml_endlist() の補助関数
Definition: txml.c:2907
int replace_all_node_integer(tXML *tp, const char *name, int src, int dst)
XMLツリー pp内で ノード名が nameである全てのノードのコンテント(整数)を,srcから dstに書き換える.
Definition: txml.c:3192
char * get_first_xml_nodename(tXML *xml)
XMLツリーの最初のノードの名前を返す.
Definition: txml.c:1491
int get_xml_int_attr_bystr(tXML *pp, const char *str, const char *attr)
get_xml_int_attr() の _bystr バージョン.
Definition: txml.c:2551
tXML * init_xml_doc()
XML のドキュメントヘッダを作成する.
Definition: txml.c:1203
tXML * add_xml_node(tXML *xml, const char *name)
XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する.
Definition: txml.c:1219
tXML * xml_parse(char *pp)
文字列のXMLデータを解釈して,tXMLのツリーを生成する.
Definition: txml.c:48
int get_xml_int_content_bystr(tXML *pp, const char *str)
get_xml_int_content(tXML* pp, tXML* pt) の _bystr バージョン
Definition: txml.c:2430
Buffer xml_rpc_request_pack(const char *name, tXML *xml)
XML-RPC用のデータを生成する.
Definition: txml.c:3376
int set_xml_attr(tXML *pp, tXML *pt, tList *at)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノードの属性としてatの値をコピーする.
Definition: txml.c:2307
tXML * xml_rpc_end_member(tXML *xml)
<struct><member> データを閉じて,<value> データを作り出す.
Definition: txml.c:3451
tXML * add_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下にコンテントを挿入する.
Definition: txml.c:1287
tList * get_xml_content_list_bystr(tXML *pp, const char *str)
get_xml_conetnt_list_bystr() の _bystr バージョン.
Definition: txml.c:2780
int set_xml_content_list(tXML *pp, tXML *pt, const char *content)
get_xml_content_list() で検出したコンテントを, content で置き換える.
Definition: txml.c:2731
int xml_parse_start_node(char *pp, char **node_name, char **node_attr, int *node_end)
XMLの開始ノードを処理する.
Definition: txml.c:371
int set_xml_end_node(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
Definition: txml.c:1956
int check_match_xml(tXML *tp, tXML *tr)
XMLツリー tpが XMLツリー trと同じかどうかを検査する.
Definition: txml.c:2991
int replace_all_node_byid(tXML *pp, const char *src, const char *dst, int id)
XMLツリー pp内で ノードの種別が idである全てのノードの内容を srcから dstに書き換える.
Definition: txml.c:3291
Buffer make_xml_attr_byfloat(const char *name, float value)
属性名 name, float型実数の属性値 value を持つ Buffer型変数を作成する.
Definition: txml.c:1552
Buffer make_xml_attr_bystr(const char *name, const char *value)
属性名 name, 文字列の属性値 value を持つ Buffer型変数を作成する.
Definition: txml.c:1517
tXML * xml_rpc_add_array(tXML *xml, tXML *array)
<value><struct> データから 配列データ <data>...</data> を作って繋げていく.
Definition: txml.c:3469
tXML * get_xml_node_bystr(tXML *pp, const char *str)
get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン
Definition: txml.c:2353
tXML * add_xml_attr_double(tXML *xml, const char *name, double value)
xml に属性名 name, double型実数の属性値 value を持つノードを追加する.
Definition: txml.c:1471
int set_xml_content_list_bystr(tXML *pp, const char *str, const char *content)
set_xml_content_list_bystr() の _bystr バージョン.
Definition: txml.c:2800
int set_xml_node(tXML *pp, tXML *pt, const char *name)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノード対応したノードにノード名をコピーする.
Definition: txml.c:1921
int xml_parse_processing_node(char *pp, char **node_name, char **node_attr)
XMLのプロセッシングノードを処理する
Definition: txml.c:654
void close_xml(tXML *pp)
パースエラーを起こしたツリーを強制的に正常化する.
Definition: txml.c:836
int replace_all_node_contents(tXML *pp, const char *name, const char *src, const char *dst)
XMLツリー pp内で ノード名が nameである全てのノードのコンテントを,srcから dstに書き換える.
Definition: txml.c:3219
void xml_attr_to_Buffer(tList *pp, Buffer *buf)
リストに保存されたノードの属性をテキストへ戻す.
Definition: txml.c:1178
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.c:2494
double get_xml_double_content_bystr(tXML *pp, const char *str)
get_xml_double_content(tXML* pp, tXML* pt) の _bystr バージョン.
Definition: txml.c:2462
tXML * get_xml_node(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
Definition: txml.c:1874
char * xml_get_node_content(tXML *node)
コンテントへのポインタを返す.free() してはいけない.
Definition: txml.c:1590
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.c:2624
int xml_parse_data_node(char *pp, char **data)
XMLのデータノード(その他エレメントノードなど)を処理する.
Definition: txml.c:773
int get_xml_int_content(tXML *pp, tXML *pt)
get_xml_content() を使用し,XML コンテンツの内容を int型で返す.
Definition: txml.c:2138
int return_exist_node(tXML *tp, const char *name, int no, Buffer *content)
bufの中に ノード '<name>content</name>' が存在するかどうかチェックする.
Definition: txml.c:3168
int add_xml_content_area(tXML *xml, int len)
xml に空のコンテントノードを追加する.
Definition: txml.c:1376
tXML * get_xml_content_bystr(tXML *pp, const char *str)
get_xml_content(tXML* pp, tXML* pt) の _bystr バージョン
Definition: txml.c:2410
tXML * add_xml_attr_str(tXML *xml, const char *name, const char *value)
xml に属性名 name, 文字列の属性値 value を持つノードを追加する.
Definition: txml.c:1420
void xml_close_node_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
ツリー中のXMLのクローズノードのデータを元の書式に戻して Bufferに格納する.
Definition: txml.c:1144
tList * get_xml_content_list(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードのコンテントへのポインタをリストに格納して返す.
Definition: txml.c:2691
tXML * cmp_sisters_xml(tXML *tp, tXML *tr)
XMLノード tpの姉妹ノードが trの姉妹ノードと同じ XMLノードまたはコンテントであるかを比較する.
Definition: txml.c:3068
int isnot_xml_name(unsigned char *pp)
XML名として不適切かどうかを大まかに判断する.
Definition: txml.c:810
Buffer get_node_content(tXML *tp, const char *name, int no)
tp中のXMLデータから no番目のノード '<name>node_content</name>' のnode_contentのコピーを得る.
Definition: txml.c:3119
tXML * find_match_xml_endlist(tXML *pp, tXML *pt)
ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝のptの最後のノードに対応するノードの情報をリストにして返す.
Definition: txml.c:2886
tXML * get_xml_content(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのコンテントへのポインタを altp に入れて返す.
Definition: txml.c:2064
tList * xml_parse_attr(char *pp)
XMLのノード属性を解釈して,リスト(tList)にする.
Definition: txml.c:559
int get_xml_int_attr(tXML *pp, tXML *pt, const char *attr)
get_xml_node() で検索したノードから,属性値 attrの値を int型で取り出す.
Definition: txml.c:2242
tList * get_xml_attr_bystr(tXML *pp, const char *str)
get_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン.
Definition: txml.c:2513
int set_xml_attr_bystr(tXML *pp, const char *str, tList *at)
set_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン.
Definition: txml.c:2605
int xml_parse_end_node(char *pp, char **node_name)
XMLの終了ノードを処理する.
Definition: txml.c:468
Buffer make_xml_attr_bydouble(const char *name, double value)
属性名 name, double型実数の属性値 value を持つ Buffer型変数を作成する.
Definition: txml.c:1571
void xml_open_node_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
ツリー中のXMLのオープンノードのデータを元の書式に戻して Bufferに格納する.
Definition: txml.c:958
tXML * xml_parse_file(const char *fn)
ファイルから読み込んでパースする.
Definition: txml.c:94
tXML * xml_main_parse(tXML *xml, char *pp, int skip)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.パーサの内部的なメイン関数.
Definition: txml.c:189
Buffer make_xml_attr_byint(const char *name, int value)
属性名 name, 整数の属性値 value を持つ Buffer型変数を作成する.
Definition: txml.c:1533
tXML * insert_xml_node(tXML *xml, const char *name)
XMLツリーのxml の直下(姉妹の一番上:長子)にノード(属性は指定しない)を挿入する.
Definition: txml.c:1242
tXML * dup_merge_xml(tXML *pp, tXML *tp)
XMLツリー ppの直下にXMLツリー tpを複製する.
Definition: txml.c:1632
double get_xml_double_attr(tXML *pp, tXML *pt, const char *attr)
get_xml_node() で検索したノードから,属性値 attrの値を double型で取り出す.
Definition: txml.c:2269
Buffer xml_inverse_parse(tXML *pp, int mode)
ppに格納された XMLデータを元の書式に戻して Bufferに格納する.xml_parse() の逆.
Definition: txml.c:891
int xml_parse_content(char *pp, char **content)
XMLのコンテントを処理する.
Definition: txml.c:513
tXML * xml_parse_seq(tXML *xml, char *pp)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.断片的にXMLデータを入力する場合に使用する.
Definition: txml.c:135
Tiny XML ライブラリヘッダ
#define XML_COMMENT_NODE
コメントノード
Definition: txml.h:112
#define XML_PROCESS_NODE
XML_DOC_NODE 以外の <? ... ?>ノード
Definition: txml.h:114
#define XML_DATA_NODE
<! ... > ノード
Definition: txml.h:113
#define XML_DOC_NODE
<? xml... ?> ノード
Definition: txml.h:111
#define XML_SPACE4_FORMAT
先頭に空白4つ " " をつけ,ノードごとに改行する.
Definition: txml.h:122
#define make_xml_attr_float(n, v)
make_xml_attr_byfloat()
Definition: txml.h:194
#define make_xml_attr_int(n, v)
make_xml_attr_byint()
Definition: txml.h:193
#define XML_TAB_FORMAT
先頭にインデント(TAB)をつけ,ノードごとに改行する.
Definition: txml.h:119
#define join_xml(a, b)
ツリー aへノード bを末っ子として追加.
Definition: txml.h:185
#define XML_CONTENT_NODE
内容(コンテント)ノード
Definition: txml.h:110
#define XML_DATA_NODE_KEY
Definition: txml.h:126
#define XML_NAME_NODE
ネームノード
Definition: txml.h:109
#define find_xml_top(p)
find_tList_top()
Definition: txml.h:158
#define make_xml_attr_str(n, v)
make_xml_attr_bystr()
Definition: txml.h:192
#define del_xml(p)
指定したノード以下のXMLツリー(ppの姉妹は含まない)を削除する.
Definition: txml.h:203
#define make_xml_attr_double(n, v)
make_xml_attr_bydouble()
Definition: txml.h:195
#define del_all_xml(p)
XMLツリーの全ノードの削除.ポインタ ppのノードを含むXMLツリー全体を削除する.
Definition: txml.h:205
#define new_xml_node()
new_tTree_node()
Definition: txml.h:133
#define XML_COMMENT_NODE_KEY
Definition: txml.h:125
#define XML_ANCHOR_NODE
アンカーノード
Definition: txml.h:108
#define XML_ONELINE_FORMAT
改行なしの一行にする.
Definition: txml.h:117
#define find_xml_end(p)
find_tTree_end()
Definition: txml.h:159
#define XML_SPACE_FORMAT
先頭に空白2つ " " をつけ,ノードごとに改行する.
Definition: txml.h:120