00001
00021 #ifdef CPLUSPLUS
00022 #undef CPLUSPLUS
00023 #endif
00024
00025
00026 #include "txml.h"
00027 #include "jbxl_state.h"
00028
00029
00030
00032
00033
00034
00049 tXML* xml_parse(char* pp)
00050 {
00051 tXML* xml;
00052 tXML* node;
00053
00054 xml = new_xml_node();
00055 xml->ldat.id = XML_ANCHOR_NODE;
00056 xml->state = JBXL_STATE_ANCHOR;
00057 xml->depth = -1;
00058
00059
00060 node = xml_main_parse(xml, pp, TRUE);
00061 if (node->state<0) return xml;
00062
00063
00064 if (xml==node) {
00065 xml->state = JBXL_XML_PARSED;
00066 }
00067 else {
00068 xml->state = JBXL_XML_NOT_CLOSED;
00069 }
00070
00071
00072 if (xml->next!=NULL) {
00073 int n = 0;
00074 node = xml->next;
00075 while(node!=NULL) {
00076 if (node->ldat.id==XML_NAME_NODE) n++;
00077 node = node->ysis;
00078 }
00079 if (n!=1) xml->state = JBXL_XML_MULTI_ROOT;
00080 }
00081 else xml->state = JBXL_XML_DEFAULT_STATE;
00082
00083 return xml;
00084 }
00085
00086
00087
00096 tXML* xml_parse_file(const char* fn)
00097 {
00098 tXML* xml = NULL;
00099 Buffer buf;
00100
00101 buf = read_Buffer_file(fn);
00102 if (buf.buf!=NULL) {
00103 xml = xml_parse((char*)(buf.buf));
00104 free_Buffer(&buf);
00105 }
00106
00107 return xml;
00108 }
00109
00110
00111
00138 tXML* xml_parse_seq(tXML* xml, char* pp)
00139 {
00140 int skip = FALSE;
00141 tXML* node;
00142
00143 if (xml==NULL) {
00144 xml = new_tTree_anchor_node();
00145
00146
00147 skip = TRUE;
00148 }
00149 else {
00150 tXML* top = find_xml_top(xml);
00151 if (top==xml) top->state = JBXL_XML_DEFAULT_STATE;
00152 }
00153
00154 node = xml_main_parse(xml, pp, skip);
00155 xml = find_xml_top(xml);
00156 xml->altp = node;
00157
00158 if (xml!=node) return xml;
00159
00160 if (node->state==JBXL_NORMAL) xml->state = JBXL_XML_PARSED;
00161 else xml->state = node->state;
00162
00163 if (xml->next!=NULL) {
00164 int n = 0;
00165 node = xml->next;
00166 while(node!=NULL) {
00167 if (node->ldat.id==XML_NAME_NODE) n++;
00168 node = node->ysis;
00169 }
00170 if (n!=1) xml->state = JBXL_XML_MULTI_ROOT;
00171 }
00172 else xml->state = JBXL_XML_DEFAULT_STATE;
00173
00174 return xml;
00175 }
00176
00177
00178
00193 tXML* xml_main_parse(tXML* xml, char* pp, int skip)
00194 {
00195 int n, node_end;
00196 char* node_name = NULL;
00197 char* node_attr = NULL;
00198 char* value = NULL;
00199
00200 if (pp ==NULL) return xml;
00201 if (xml==NULL) return NULL;
00202
00203 if (skip) while (*pp!='\0' && *pp!='<') pp++;
00204
00205 while (*pp!='\0') {
00206 n = 1;
00207
00208 if (*pp=='<') {
00209
00210 if (*(pp+1)=='/') {
00211 if (xml->state==JBXL_XML_NODE_OPENED) {
00212 n = xml_parse_end_node(pp, &node_name);
00213 if (n>0) {
00214 if (node_name!=NULL && xml->ldat.key.buf!=NULL) {
00215 if (!strcmp((const char*)node_name, (const char*)(xml->ldat.key.buf))) {
00216 if (xml->next!=NULL) {
00217 xml->state = JBXL_XML_NODE_CLOSED;
00218 }
00219 else {
00220 xml->state = JBXL_XML_NODE_EMPTY;
00221 }
00222
00223 if (xml->prev!=NULL) xml = xml->prev;
00224 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
00225 }
00226 else n = xml->state = JBXL_XML_PARSE_ERROR;
00227 }
00228 else n = xml->state = JBXL_XML_PARSE_ERROR;
00229 }
00230 else xml->state = n;
00231 }
00232 else n = xml->state = JBXL_XML_PARSE_ERROR;
00233 }
00234
00235
00236 else if (!strncmp(pp+1, "!--", 3)) {
00237 n = xml_parse_comment_node(pp, &value);
00238 if (n>0) {
00239 xml = add_tTree_node_bystr(xml, XML_COMMENT_NODE, 0, (char*)XML_COMMENT_NODE_KEY, value, NULL, 0);
00240 xml->state = JBXL_XML_NODE_EMPTY;
00241 if (xml->prev!=NULL) xml = xml->prev;
00242 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
00243 }
00244 }
00245
00246
00247 else if (*(pp+1)=='!') {
00248 n = xml_parse_data_node(pp, &value);
00249 if (n>0) {
00250 xml = add_tTree_node_bystr(xml, XML_DATA_NODE, 0, (char*)XML_DATA_NODE_KEY, value, NULL, 0);
00251 xml->state = JBXL_XML_NODE_EMPTY;
00252 if (xml->prev!=NULL) xml = xml->prev;
00253 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
00254 }
00255 }
00256
00257
00258 else if (*(pp+1)=='?') {
00259 n = xml_parse_processing_node(pp, &node_name, &node_attr);
00260 if (n>0) {
00261 if (!strncasecmp("xml", node_name, 3)) {
00262 tList* lp = xml_parse_attr(node_attr);
00263 xml = add_tTree_node_bystr(xml, XML_DOC_NODE, 0, node_name, NULL, NULL, 0);
00264 xml->ldat.lst = lp;
00265 }
00266 else {
00267 xml = add_tTree_node_bystr(xml, XML_PROCESS_NODE, 0, node_name, node_attr, NULL, 0);
00268 }
00269 xml->state = JBXL_XML_NODE_EMPTY;
00270 if (xml->prev!=NULL) xml = xml->prev;
00271 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
00272 }
00273 }
00274
00275
00276 else {
00277 n = xml_parse_start_node(pp, &node_name, &node_attr, &node_end);
00278
00279 if (n>0) {
00280 tList* lp = xml_parse_attr(node_attr);
00281 xml = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, node_name, NULL, NULL, 0);
00282 xml->ldat.lst = lp;
00283
00284 if (node_end) {
00285 xml->state = JBXL_XML_NODE_EMPTY;
00286 if (xml->prev!=NULL) xml = xml->prev;
00287 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
00288 }
00289 else {
00290 int m;
00291 xml->state = JBXL_XML_NODE_OPENED;
00292
00293 m = xml_parse_content(pp+n, &value);
00294 if (m>=0) {
00295 n += m;
00296 if (value!=NULL) {
00297 xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0);
00298 xml->state = JBXL_XML_NODE_CLOSED;
00299 if (xml->prev!=NULL) {
00300 xml = xml->prev;
00301 xml->ldat.lv++;
00302 }
00303 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
00304 }
00305 }
00306 else n = xml->state = m;
00307 }
00308 }
00309 }
00310
00311 freeNull(node_name);
00312 freeNull(node_attr);
00313 freeNull(value);
00314 }
00315
00316
00317 else {
00318 if (xml->state==JBXL_XML_NODE_OPENED) {
00319 n = xml_parse_content(pp, &value);
00320 if (n>0) {
00321 if (value!=NULL) {
00322 xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0);
00323 xml->state = JBXL_XML_NODE_CLOSED;
00324 if (xml->prev!=NULL) {
00325 xml = xml->prev;
00326 xml->ldat.lv++;
00327 }
00328 else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
00329 }
00330 }
00331 else n = xml->state = JBXL_XML_PARSE_ERROR;
00332 freeNull(value);
00333 }
00334 else n = xml->state = JBXL_XML_PARSE_ERROR;
00335 }
00336
00337
00338 if (n<=0) return xml;
00339
00340 pp += n;
00341 while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) pp++;
00342 }
00343
00344 return xml;
00345 }
00346
00347
00348
00350
00351
00352
00375 int xml_parse_start_node(char* pp, char** node_name, char** node_attr, int* node_end)
00376 {
00377 int nn, mm;
00378 char* pt;
00379
00380 if (node_name==NULL || node_attr==NULL || node_end==NULL) return JBXL_ARGS_ERROR;
00381 *node_end = FALSE;
00382 *node_name = NULL;
00383 *node_attr = NULL;
00384
00385 if (*pp!='<') return JBXL_XML_PARSE_ERROR;
00386 pt = pp = pp + 1;
00387 pt = skip_chars(pt, " />");
00388 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
00389
00390 nn = mm = (int)(pt - pp);
00391 if (mm==0) return JBXL_XML_PARSE_ERROR;
00392
00393 nn = nn + 1;
00394 *node_name = (char*)malloc((size_t)(mm + 1));
00395 if (*node_name==NULL) return JBXL_MALLOC_ERROR;
00396 memcpy(*node_name, pp, mm);
00397 (*node_name)[mm] = '\0';
00398
00399
00400 if (isnot_xml_name((unsigned char*)*node_name)) {
00401 freeNull(*node_name);
00402 return JBXL_XML_PARSE_ERROR;
00403 }
00404
00405
00406 if (*pt=='/') {
00407 if (*(pt+1)!='>') {
00408 freeNull(*node_name);
00409 return JBXL_XML_PARSE_ERROR;
00410 }
00411 nn += 1;
00412 *node_end = TRUE;
00413
00414 }
00415
00416
00417 else if (*pt==' ') {
00418 pp = pt = pt + 1;
00419 while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++;
00420 nn += (int)(pt - pp) + 1;
00421
00422 pp = pt;
00423 pt = skip_chars(pt, "/>");
00424 if (pt==NULL) {
00425 freeNull(*node_name);
00426 return JBXL_XML_PARSE_ERROR;
00427 }
00428
00429 mm = (int)(pt - pp);
00430 if (mm>0) {
00431 *node_attr = (char*)malloc((size_t)(mm + 1));
00432 if (*node_attr==NULL) {
00433 freeNull(*node_name);
00434 return JBXL_MALLOC_ERROR;
00435 }
00436 memcpy(*node_attr, pp, mm);
00437 (*node_attr)[mm] = '\0';
00438 nn += mm;
00439
00440 }
00441
00442 if (*pt=='/') {
00443 if (*(pt+1)!='>') {
00444 freeNull(*node_name);
00445 freeNull(*node_attr);
00446 return JBXL_XML_PARSE_ERROR;
00447 }
00448 nn += 1;
00449 *node_end = TRUE;
00450
00451 }
00452 }
00453
00454
00455
00456 return nn + 1;
00457 }
00458
00459
00460
00473 int xml_parse_end_node(char* pp, char** node_name)
00474 {
00475 int nn, mm;
00476 char* pt;
00477 char* work;
00478
00479 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
00480 *node_name = NULL;
00481
00482 if (strncmp(pp ,"</", 2)) return JBXL_XML_PARSE_ERROR;
00483
00484 pt = pp = pp + 2;
00485 pt = skip_chars(pt, ">");
00486 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
00487
00488 nn = mm = (int)(pt - pp);
00489 if (mm==0) return JBXL_XML_PARSE_ERROR;
00490
00491 nn += 2;
00492 work = (char*)malloc((size_t)(mm+1));
00493 if (work==NULL) return JBXL_MALLOC_ERROR;
00494 memcpy(work, pp, mm);
00495 work[mm] = '\0';
00496 *node_name = pack_head_tail_char(work, ' ');
00497 free(work);
00498
00499
00500 return nn + 1;
00501 }
00502
00503
00504
00519 int xml_parse_content(char* pp, char** content)
00520 {
00521 int nn=0, mm;
00522 char* pt;
00523 char* work;
00524
00525 if (pp==NULL || content==NULL) return JBXL_XML_PARSE_ERROR;
00526 *content = NULL;
00527
00528 while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) {
00529 pp++;
00530 nn++;
00531 }
00532 if (*pp=='<') return nn;
00533
00534 pt = pp;
00535 while (*pt!='<' && *pt!='\0') pt++;
00536
00537 mm = (int)(pt - pp);
00538 if (mm==0) return nn;
00539 nn += mm;
00540
00541 work = (char*)malloc((size_t)(mm+1));
00542 if (work==NULL) return JBXL_MALLOC_ERROR;
00543 memcpy(work, pp, mm);
00544 work[mm] = '\0';
00545
00546 *content = pack_head_tail_char(work, ' ');
00547 free(work);
00548
00549
00550 return nn;
00551 }
00552
00553
00554
00566 tList* xml_parse_attr(char* pp)
00567 {
00568 int sz;
00569 char* nm;
00570 char* vl;
00571 char* pt;
00572 char qt;
00573 tList* lp = NULL;
00574 tList* lt = NULL;
00575
00576
00577 if (pp==NULL) return NULL;
00578 sz = (int)strlen((const char*)pp) + 1;
00579 nm = (char*)malloc(sz);
00580 if (nm==NULL) return NULL;
00581 vl = (char*)malloc(sz);
00582 if (vl==NULL) {
00583 free(nm);
00584 return NULL;
00585 }
00586
00587
00588 while (*pp==' ' && *pp!='\0') pp++;
00589 while (*pp!='\0') {
00590 pt = pp;
00591 while (*pt!='=' && *pt!='\0') pt++;
00592 if (*pt=='\0') {
00593 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
00594 break;
00595 }
00596
00597 sz = (int)(pt - pp);
00598 memcpy(nm, pp, (size_t)sz);
00599 nm[sz] = '\0';
00600
00601 pt++;
00602 if (*pt!='"' && *pt!='\'') {
00603 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
00604 break;
00605 }
00606 else qt = *pt;
00607
00608 pt++;
00609 pp = pt;
00610 while(*pt!=qt && *pt!='\0') pt++;
00611 if (*pt=='\0') {
00612 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
00613 break;
00614 }
00615
00616 sz = (int)(pt - pp);
00617 memcpy(vl+1, pp, (size_t)sz);
00618 vl[0] = qt;
00619 vl[sz+1] = qt;
00620 vl[sz+2] = '\0';
00621
00622 lp = add_tList_node_str(lp, nm, vl);
00623 if (lt==NULL) lt = lp;
00624 pp = pt + 1;
00625
00626 if (*pp!=' ' && *pp!='\0') {
00627 lt->state = JBXL_XML_PARSE_ERROR;
00628 break;
00629 }
00630 while (*pp==' ' && *pp!='\0') pp++;
00631 }
00632
00633
00634 free(nm);
00635 free(vl);
00636
00637 if (lt!=NULL) {
00638 if (lt->state!=JBXL_XML_PARSE_ERROR) lt->state = JBXL_XML_NODE_CLOSED;
00639 }
00640 return lt;
00641 }
00642
00643
00644
00659 int xml_parse_processing_node(char* pp, char** node_name, char** node_attr)
00660 {
00661 int nn, mm;
00662 char* pt;
00663
00664 *node_name = NULL;
00665 *node_attr = NULL;
00666
00667 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
00668 if (strncmp(pp, "<?", 2)) return JBXL_XML_PARSE_ERROR;
00669
00670 pt = pp = pp + 2;
00671 pt = skip_chars(pt, " ?");
00672 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
00673
00674 nn = mm = (int)(pt - pp);
00675 if (mm==0) return JBXL_XML_PARSE_ERROR;
00676
00677 nn += 2;
00678 *node_name = (char*)malloc((size_t)(mm + 1));
00679 if (*node_name==NULL) return JBXL_MALLOC_ERROR;
00680 memcpy(*node_name, pp, mm);
00681 (*node_name)[mm] = '\0';
00682
00683 if (isnot_xml_name((unsigned char*)*node_name)) return JBXL_XML_PARSE_ERROR;
00684
00685
00686 if (*pt==' ') {
00687 pp = pt = pt + 1;
00688 while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++;
00689 nn += (int)(pt - pp) + 1;
00690
00691 pp = pt;
00692 pt = skip_chars(pt, "?");
00693 if (pt==NULL) {
00694 freeNull(*node_name);
00695 return JBXL_XML_PARSE_ERROR;
00696 }
00697
00698 mm = (int)(pt - pp);
00699 if (mm>0) {
00700 *node_attr = (char*)malloc((size_t)(mm + 1));
00701 if (*node_attr==NULL) {
00702 freeNull(*node_name);
00703 return JBXL_MALLOC_ERROR;
00704 }
00705 memcpy(*node_attr, pp, mm);
00706 (*node_attr)[mm] = '\0';
00707 nn += mm;
00708
00709 }
00710 }
00711
00712 if (strncmp(pt, "?>", 2)) {
00713 freeNull(*node_name);
00714 freeNull(*node_attr);
00715 return JBXL_XML_PARSE_ERROR;
00716 }
00717
00718 return nn + 2;
00719 }
00720
00721
00722
00736 int xml_parse_comment_node(char* pp, char** comment)
00737 {
00738 int nn, mm;
00739 char* pt;
00740
00741 *comment = NULL;
00742 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
00743 if (strncmp(pp, "<!--", 4)) return JBXL_XML_PARSE_ERROR;
00744
00745 pt = pp = pp + 4;
00746 pt = skip_chars(pt, ">");
00747 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
00748
00749 pt -= 2;
00750 if (strncmp(pt, "-->", 3)) return JBXL_XML_PARSE_ERROR;
00751
00752 nn = mm = (int)(pt - pp);
00753 if (mm==0) return JBXL_XML_PARSE_ERROR;
00754
00755 nn += 4;
00756 *comment = (char*)malloc((size_t)(mm+1));
00757 if (*comment==NULL) return JBXL_MALLOC_ERROR;
00758 memcpy(*comment, pp, mm);
00759 (*comment)[mm] = '\0';
00760
00761
00762 return nn + 3;
00763 }
00764
00765
00766
00780 int xml_parse_data_node(char* pp, char** data)
00781 {
00782 int nn, mm;
00783 char* pt;
00784
00785 *data = NULL;
00786 if (pp==NULL) return JBXL_XML_PARSE_ERROR;
00787 if (strncmp(pp, "<!", 2)) return JBXL_XML_PARSE_ERROR;
00788
00789 pt = pp = pp + 2;
00790 pt = skip_chars(pt, ">");
00791 if (pt==NULL) return JBXL_XML_PARSE_ERROR;
00792
00793 nn = mm = (int)(pt - pp);
00794 if (mm==0) return JBXL_XML_PARSE_ERROR;
00795
00796 nn += 2;
00797 *data = (char*)malloc((size_t)(mm+1));
00798 if (*data==NULL) return JBXL_MALLOC_ERROR;
00799 memcpy(*data, pp, mm);
00800 (*data)[mm] = '\0';
00801
00802
00803 return nn + 1;
00804 }
00805
00806
00807
00818 int isnot_xml_name(unsigned char* pp)
00819 {
00820 if (pp==NULL) return TRUE;
00821 if (*pp=='\0') return TRUE;
00822
00823 while (*pp!='\0') {
00824 if (*pp<=0x2c) return TRUE;
00825 if (*pp==0x2f) return TRUE;
00826 if (*pp>=0x3b && *pp<=0x40) return TRUE;
00827 if (*pp>=0x5b && *pp<=0x5e) return TRUE;
00828 if (*pp==0x60) return TRUE;
00829 if (*pp>=0x7b && *pp<=0x7f) return TRUE;
00830 pp++;
00831 }
00832
00833 return FALSE;
00834 }
00835
00836
00837
00845 void close_xml(tXML* pp)
00846 {
00847 if (pp!=NULL) {
00848
00849
00850 if (pp->ldat.id==XML_ANCHOR_NODE) {
00851 pp->state = JBXL_XML_PARSED;
00852 pp->depth = -1;
00853 if (pp->next!=NULL) {
00854 pp->next->depth = 0;
00855 adjust_tTree_depth(pp->next);
00856 close_xml(pp->next);
00857 }
00858 return;
00859 }
00860
00861 while(pp->esis!=NULL) pp = pp->esis;
00862 do {
00863 if (pp->next==NULL) pp->state = JBXL_XML_NODE_EMPTY;
00864
00865 if (pp->state!=JBXL_XML_NODE_EMPTY) pp->state = JBXL_XML_NODE_CLOSED;
00866
00867
00868
00869
00870 if (pp->next!=NULL) close_xml(pp->next);
00871
00872 pp = pp->ysis;
00873 } while(pp!=NULL);
00874 }
00875
00876 return;
00877 }
00878
00879
00880
00881
00883
00884
00885
00900 Buffer xml_inverse_parse(tXML* pp, int mode)
00901 {
00902 int cnt;
00903 Buffer buf;
00904
00905 buf = init_Buffer();
00906 if (pp==NULL) return buf;
00907 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
00908 if (pp==NULL) return buf;
00909
00910 cnt = count_tTree(pp);
00911 buf = make_Buffer(cnt*LMDATA);
00912 if (buf.buf==NULL) return buf;
00913
00914 while (pp->esis!=NULL) pp = pp->esis;
00915 xml_to_Buffer(pp, &buf, mode, pp->depth);
00916
00917 return buf;
00918 }
00919
00920
00921
00936 void xml_to_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
00937 {
00938 do {
00939 xml_open_node_Buffer(pp, buf, mode, indent);
00940 if (pp->next!=NULL) {
00941 xml_to_Buffer(pp->next, buf, mode, indent);
00942 xml_close_node_Buffer(pp, buf, mode, indent);
00943 }
00944
00945 pp = pp->ysis;
00946 } while(pp!=NULL);
00947
00948 return;
00949 }
00950
00951
00952
00966 void xml_open_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
00967 {
00968 int i;
00969
00970
00971 if (pp->ldat.id==XML_NAME_NODE) {
00972 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) {
00973 if (buf->vldsz>0 && buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf);
00974 }
00975
00976 if (mode==XML_INDENT_FORMAT) {
00977 char* tabs = (char*)malloc(pp->depth-indent+1);
00978 if (tabs!=NULL) {
00979 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
00980 tabs[pp->depth-indent] = '\0';
00981 cat_s2Buffer(tabs, buf);
00982 free(tabs);
00983 }
00984 }
00985
00986 cat_s2Buffer("<", buf);
00987 cat_Buffer(&(pp->ldat.key), buf);
00988 if (pp->ldat.lst!=NULL) {
00989 xml_attr_to_Buffer(pp->ldat.lst, buf);
00990 }
00991 if (pp->next==NULL) {
00992 if (pp->state==JBXL_XML_NODE_EMPTY) {
00993 cat_s2Buffer(" />", buf);
00994 }
00995 else {
00996 cat_s2Buffer("></", buf);
00997 cat_Buffer(&(pp->ldat.key), buf);
00998 cat_s2Buffer(">", buf);
00999 }
01000 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) {
01001 cat_s2Buffer("\r\n", buf);
01002 }
01003 }
01004 else {
01005 cat_s2Buffer(">", buf);
01006 }
01007 }
01008
01009
01010 else if (pp->ldat.id==XML_CONTENT_NODE) {
01011 if (buf->buf[buf->vldsz-1]=='\n') {
01012 buf->buf[buf->vldsz-2] = '\0';
01013 buf->vldsz -= 2;
01014 }
01015
01016 if (pp->esis!=NULL || pp->ysis!=NULL) {
01017 cat_s2Buffer("\r\n", buf);
01018 char* tabs = (char*)malloc(pp->depth-indent+1);
01019 if (tabs!=NULL) {
01020 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
01021 tabs[pp->depth-indent] = '\0';
01022 cat_s2Buffer(tabs, buf);
01023 free(tabs);
01024 }
01025 }
01026
01027 cat_Buffer(&(pp->ldat.key), buf);
01028
01029 if (pp->esis!=NULL) cat_s2Buffer("\r\n", buf);
01030 }
01031
01032
01033 else if (pp->ldat.id==XML_DOC_NODE) {
01034 if (mode==XML_INDENT_FORMAT) {
01035 char* tabs = (char*)malloc(pp->depth-indent+1);
01036 if (tabs!=NULL) {
01037 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
01038 tabs[pp->depth-indent] = '\0';
01039 cat_s2Buffer(tabs, buf);
01040 free(tabs);
01041 }
01042 }
01043
01044 cat_s2Buffer("<?", buf);
01045 if (pp->ldat.key.buf!=NULL) {
01046 cat_Buffer(&(pp->ldat.key), buf);
01047 }
01048 if (pp->ldat.lst!=NULL) {
01049 xml_attr_to_Buffer(pp->ldat.lst, buf);
01050 }
01051 cat_s2Buffer("?>", buf);
01052
01053 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf);
01054 }
01055
01056
01057 else if (pp->ldat.id==XML_COMMENT_NODE) {
01058 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) {
01059 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf);
01060 }
01061
01062 if (mode==XML_INDENT_FORMAT) {
01063 char* tabs = (char*)malloc(pp->depth-indent+1);
01064 if (tabs!=NULL) {
01065 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
01066 tabs[pp->depth-indent] = '\0';
01067 cat_s2Buffer(tabs, buf);
01068 free(tabs);
01069 }
01070 }
01071
01072 cat_s2Buffer("<!--", buf);
01073 if (pp->ldat.val.buf!=NULL) {
01074 cat_Buffer(&(pp->ldat.val), buf);
01075 }
01076 cat_s2Buffer("-->", buf);
01077
01078 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf);
01079 }
01080
01081
01082 else if (pp->ldat.id==XML_DATA_NODE) {
01083 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) {
01084 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf);
01085 }
01086
01087 if (mode==XML_INDENT_FORMAT) {
01088 char* tabs = (char*)malloc(pp->depth-indent+1);
01089 if (tabs!=NULL) {
01090 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
01091 tabs[pp->depth-indent] = '\0';
01092 cat_s2Buffer(tabs, buf);
01093 free(tabs);
01094 }
01095 }
01096
01097 cat_s2Buffer("<!", buf);
01098 if (pp->ldat.val.buf!=NULL) {
01099 cat_Buffer(&(pp->ldat.val), buf);
01100 }
01101 cat_s2Buffer(">", buf);
01102
01103 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf);
01104 }
01105
01106
01107 else if (pp->ldat.id==XML_PROCESS_NODE) {
01108 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) {
01109 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf);
01110 }
01111
01112 if (mode==XML_INDENT_FORMAT) {
01113 char* tabs = (char*)malloc(pp->depth-indent+1);
01114 if (tabs!=NULL) {
01115 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
01116 tabs[pp->depth-indent] = '\0';
01117 cat_s2Buffer(tabs, buf);
01118 free(tabs);
01119 }
01120 }
01121
01122 cat_s2Buffer("<?", buf);
01123 if (pp->ldat.key.buf!=NULL) {
01124 cat_Buffer(&(pp->ldat.key), buf);
01125 }
01126 if (pp->ldat.lst!=NULL) {
01127 xml_attr_to_Buffer(pp->ldat.lst, buf);
01128 }
01129 cat_s2Buffer(" ?>", buf);
01130
01131 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf);
01132 }
01133
01134 return;
01135 }
01136
01137
01138
01152 void xml_close_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
01153 {
01154 int i;
01155
01156 if (pp->ldat.id==XML_NAME_NODE) {
01157 if (pp->next!=NULL) {
01158 if (mode==XML_INDENT_FORMAT) {
01159 if (pp->next->ldat.id!=XML_CONTENT_NODE || pp->next->ysis!=NULL) {
01160 char* tabs = (char*)malloc(pp->depth-indent+1);
01161 if (tabs!=NULL) {
01162 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
01163 tabs[pp->depth-indent] = '\0';
01164 cat_s2Buffer(tabs, buf);
01165 free(tabs);
01166 }
01167 }
01168 }
01169
01170 cat_s2Buffer("</", buf);
01171 cat_Buffer(&(pp->ldat.key), buf);
01172 cat_s2Buffer(">", buf);
01173
01174 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf);
01175 }
01176 }
01177
01178 return;
01179 }
01180
01181
01182
01191 void xml_attr_to_Buffer(tList* pp, Buffer* buf)
01192 {
01193 while (pp!=NULL) {
01194 cat_s2Buffer(" ", buf);
01195 cat_Buffer(&(pp->ldat.key), buf);
01196
01197 if (pp->ldat.val.buf!=NULL) {
01198 cat_s2Buffer("=", buf);
01199 cat_Buffer(&(pp->ldat.val), buf);
01200 }
01201 pp = pp->next;
01202 }
01203 }
01204
01205
01206
01207
01209
01210
01211
01217 tXML* init_xml_doc()
01218 {
01219 tXML* xml = xml_parse((char*)"<?xml version=\"1.0\" encoding=\"utf-8\"?>");
01220 return xml;
01221 }
01222
01223
01224
01234 tXML* add_xml_node(tXML* xml, const char* name)
01235 {
01236 tXML* pp;
01237
01238 if (name==NULL) return NULL;
01239
01240 pp = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0);
01241 pp->state = JBXL_XML_NODE_EMPTY;
01242 if (pp->prev!=NULL) pp->prev->ldat.lv++;
01243
01244 return pp;
01245 }
01246
01247
01248
01258 tXML* insert_xml_node(tXML* xml, const char* name)
01259 {
01260 tList* pp;
01261
01262 if (xml==NULL || name==NULL) return NULL;
01263
01264 pp = insert_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0);
01265 pp->state = JBXL_XML_NODE_EMPTY;
01266 if (pp->prev!=NULL) pp->prev->ldat.lv++;
01267
01268 return pp;
01269 }
01270
01271
01272
01280 tXML* add_xml_content(tXML* xml, const char* content)
01281 {
01282 tList* pp;
01283
01284 if (xml==NULL || content==NULL) return NULL;
01285 if (xml->ldat.id!=XML_NAME_NODE) return NULL;
01286
01287 pp = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, content, NULL, NULL, 0);
01288 pp->state = JBXL_XML_NODE_CLOSED;
01289 if (pp->prev!=NULL) pp->prev->ldat.lv++;
01290
01291 return pp;
01292 }
01293
01294
01295
01302 tXML* append_xml_content(tXML* xml, const char* content)
01303 {
01304 tList* pp;
01305
01306 if (xml==NULL || content==NULL) return NULL;
01307 if (xml->ldat.id!=XML_NAME_NODE) return NULL;
01308
01309 pp = xml->next;
01310 while (pp!=NULL && pp->ldat.id!=XML_CONTENT_NODE) pp = pp->ysis;
01311
01312 if (pp==NULL) {
01313 pp = add_xml_content(xml, content);
01314 }
01315 else {
01316 if (pp->ldat.key.vldsz!=0) cat_s2Buffer(" ", &(pp->ldat.key));
01317 cat_s2Buffer(content, &(pp->ldat.key));
01318 }
01319
01320 return pp;
01321 }
01322
01323
01333 int add_xml_content_area(tXML* xml, int len)
01334 {
01335 if (xml==NULL || len<=0) return FALSE;
01336
01337 char* area = (char*)malloc(len);
01338 if (area==NULL) return FALSE;
01339 memset(area, (int)' ', len-1);
01340 area[len-1] = '\0';
01341
01342 tXML* pp = add_xml_content(xml, area);
01343 if (pp!=NULL) {
01344 pp->ldat.key.buf[0] = '\0';
01345 pp->ldat.key.vldsz = 0;
01346 }
01347 free(area);
01348
01349 return TRUE;
01350 }
01351
01352
01358 tXML* add_xml_attr(tXML* xml, const char* attr)
01359 {
01360 if (xml==NULL || attr==NULL) return NULL;
01361 if (xml->ldat.id!=XML_NAME_NODE) return NULL;
01362
01363 tList* lp = xml_parse_attr((char*)attr);
01364
01365 if (xml->ldat.lst==NULL) xml->ldat.lst = lp;
01366 else add_tList_end(xml->ldat.lst, lp);
01367
01368 return xml;
01369 }
01370
01371
01377 tXML* add_xml_attr_str(tXML* xml, const char* name, const char* value)
01378 {
01379 if (xml==NULL || name==NULL) return NULL;
01380
01381 Buffer attr = make_xml_attr_str(name, value);
01382 add_xml_attr(xml, (char*)attr.buf);
01383 free_Buffer(&attr);
01384
01385 return xml;
01386 }
01387
01388
01394 tXML* add_xml_attr_int(tXML* xml, const char* name, int value)
01395 {
01396 if (xml==NULL || name==NULL) return NULL;
01397
01398 Buffer attr = make_xml_attr_int(name, value);
01399 add_xml_attr(xml, (char*)attr.buf);
01400 free_Buffer(&attr);
01401
01402 return xml;
01403 }
01404
01405
01411 tXML* add_xml_attr_float(tXML* xml, const char* name, float value)
01412 {
01413 if (xml==NULL || name==NULL) return NULL;
01414
01415 Buffer attr = make_xml_attr_float(name, value);
01416 add_xml_attr(xml, (char*)attr.buf);
01417 free_Buffer(&attr);
01418
01419 return xml;
01420 }
01421
01422
01428 tXML* add_xml_attr_double(tXML* xml, const char* name, double value)
01429 {
01430 if (xml==NULL || name==NULL) return NULL;
01431
01432 Buffer attr = make_xml_attr_double(name, value);
01433 add_xml_attr(xml, (char*)attr.buf);
01434 free_Buffer(&attr);
01435
01436 return xml;
01437 }
01438
01439
01440
01449 char* get_first_xml_nodename(tXML* xml)
01450 {
01451 char* nodename = NULL;
01452
01453 if (xml==NULL) return NULL;
01454 tList* lp = xml;
01455 if (lp->ldat.id==XML_ANCHOR_NODE) lp = lp->next;
01456
01457 while (lp!=NULL) {
01458 if (lp->ldat.id==XML_NAME_NODE) {
01459 if (lp->ldat.key.buf!=NULL) {
01460 nodename = (char*)lp->ldat.key.buf;
01461 break;
01462 }
01463 }
01464 lp = lp->ysis;
01465 }
01466 return nodename;
01467 }
01468
01469
01475 Buffer make_xml_attr_bystr(const char* name, const char* value)
01476 {
01477 Buffer buf = make_Buffer_bystr(name);
01478 cat_s2Buffer("=\"", &buf);
01479 cat_s2Buffer(value, &buf);
01480 cat_s2Buffer("\"", &buf);
01481
01482 return buf;
01483 }
01484
01485
01491 Buffer make_xml_attr_byint(const char* name, int value)
01492 {
01493 char* str = itostr_ts(value);
01494
01495 Buffer buf = make_Buffer_bystr(name);
01496 cat_s2Buffer("=\"", &buf);
01497 cat_s2Buffer(str, &buf);
01498 cat_s2Buffer("\"", &buf);
01499
01500 freeNull(str);
01501 return buf;
01502 }
01503
01504
01510 Buffer make_xml_attr_byfloat(const char* name, float value)
01511 {
01512 char* str = ftostr_ts(value);
01513
01514 Buffer buf = make_Buffer_bystr(name);
01515 cat_s2Buffer("=\"", &buf);
01516 cat_s2Buffer(str, &buf);
01517 cat_s2Buffer("\"", &buf);
01518
01519 freeNull(str);
01520 return buf;
01521 }
01522
01523
01529 Buffer make_xml_attr_bydouble(const char* name, double value)
01530 {
01531 char* str = dtostr_ts(value);
01532
01533 Buffer buf = make_Buffer_bystr(name);
01534 cat_s2Buffer("=\"", &buf);
01535 cat_s2Buffer(str, &buf);
01536 cat_s2Buffer("\"", &buf);
01537
01538 freeNull(str);
01539 return buf;
01540 }
01541
01542
01543
01549 char* xml_get_node_content(tXML* node)
01550 {
01551 if (node==NULL || node->next==NULL) return NULL;
01552
01553 if (node->ldat.id==XML_NAME_NODE) {
01554 if (node->next->ldat.id==XML_CONTENT_NODE) return (char*)(node->next->ldat.key.buf);
01555 }
01556 return NULL;
01557 }
01558
01559
01560
01566 char* xml_get_node_attr(tXML* node, const char* attr)
01567 {
01568 if (node==NULL) return NULL;
01569
01570 if (node->ldat.id==XML_NAME_NODE) {
01571 tList* lt = node->ldat.lst;
01572 while (lt!=NULL) {
01573 if (!strcmp((const char*)lt->ldat.key.buf, attr)) return (char*)(lt->ldat.val.buf);
01574 lt = lt->next;
01575 }
01576 }
01577 return NULL;
01578 }
01579
01580
01581
01593 tXML* dup_merge_xml(tXML* pp, tXML* tp)
01594 {
01595 if (tp==NULL) return pp;
01596
01597 if (tp->ldat.id==XML_ANCHOR_NODE) {
01598 if (tp->next!=NULL) tp = tp->next;
01599 else return pp;
01600 }
01601
01602 pp = dup_merge_tTree(pp, tp);
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612
01613
01614
01615
01616 return pp;
01617 }
01618
01619
01620
01658 void print_xml(FILE* fp, tXML* pp, int mode)
01659 {
01660 if (fp==NULL) fp = stderr;
01661
01662 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
01663
01664 if (pp!=NULL) {
01665 Buffer buf = xml_inverse_parse(pp, mode);
01666 if (buf.buf!=NULL) {
01667 fprintf(fp, "%s", buf.buf);
01668 free_Buffer(&buf);
01669 }
01670 else fprintf(fp, "(XML is NULL)\n");
01671 }
01672 else {
01673 fprintf(fp, "(XML is NULL)\n");
01674 }
01675 fflush(fp);
01676
01677 return;
01678 }
01679
01680
01681
01687 void print_xml_node(FILE* fp, tXML* pp)
01688 {
01689 if (fp==NULL) fp = stderr;
01690
01691
01692
01693 if (pp!=NULL) {
01694 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
01695 if (pp!=NULL) {
01696 int num = count_tList((tList*)pp->ldat.lst);
01697 fprintf(fp, "%d: %d [%d] %s (%d)", pp->depth, pp->ldat.id, pp->state, pp->ldat.key.buf, num);
01698 fprintf(fp, "\n");
01699 }
01700 else {
01701 fprintf(fp, "(XML is ANCHOR only)\n");
01702 }
01703 }
01704 else {
01705 fprintf(fp, "(XML is NULL)\n");
01706 }
01707 fflush(fp);
01708
01709 return;
01710 }
01711
01712
01713
01726 void print_xml_tree(FILE* fp, tXML* pp, const char* space)
01727 {
01728 int i;
01729 if (fp==NULL) fp = stderr;
01730
01731
01732
01733 if (pp!=NULL) {
01734 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
01735 if (pp!=NULL) {
01736 for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space);
01737 for(i=0; i<pp->depth-1; i++) fprintf(fp, "%s", " ");
01738 print_sister_xml_tree(fp, pp, space);
01739 fprintf(fp, "\n");
01740 }
01741 else {
01742 fprintf(fp, "(XML is ANCHOR only)\n");
01743 }
01744 }
01745 else {
01746 fprintf(fp, "(XML is NULL)\n");
01747 }
01748 fflush(fp);
01749
01750 return;
01751 }
01752
01753
01754
01766 void print_sister_xml_tree(FILE* fp, tXML* pp, const char* space)
01767 {
01768 if (fp==NULL) fp = stderr;
01769
01770 if (pp!=NULL) {
01771 if (pp->ldat.id==XML_ANCHOR_NODE) {
01772 if (pp->next!=NULL) pp = pp->next;
01773 }
01774
01775 while(pp->esis!=NULL) pp = pp->esis;
01776
01777 while(pp!=NULL) {
01778 int i;
01779 tList_data ld = pp->ldat;
01780
01781 if (pp->depth>=0) {
01782 if (pp->esis!=NULL || pp->depth>=0) fprintf(fp, "\n");
01783 if (pp->depth>0) {
01784 for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space);
01785
01786 fprintf(fp, "-> ");
01787 }
01788 }
01789 int num = count_tList((tList*)ld.lst);
01790 fprintf(fp, "%d: %d [%d] %s (%d)", pp->depth, ld.id, pp->state, ld.key.buf, num);
01791
01792 if (pp->next!=NULL) print_sister_xml_tree(fp, pp->next, space);
01793
01794 pp = pp->ysis;
01795 };
01796 }
01797 else {
01798 fprintf(fp, "(XML is NULL)\n");
01799 }
01800 fflush(fp);
01801
01802 return;
01803 }
01804
01805
01806
01807
01809
01810
01811
01835 tXML* get_xml_node(tXML* pp, tXML* pt)
01836 {
01837 int fnd;
01838 tXML* tt;
01839 tXML* pm;
01840
01841 if (pp==NULL || pt==NULL) return NULL;
01842
01843 pm = pp;
01844 if (pp->ldat.id==XML_ANCHOR_NODE) {
01845 if (pp->next!=NULL) pp = pp->next;
01846 else return NULL;
01847 }
01848 if (pt->ldat.id==XML_ANCHOR_NODE) {
01849 if (pt->next!=NULL) pt = pt->next;
01850 else return NULL;
01851 }
01852
01853 tt = find_xml_end(pt);
01854 if (tt==NULL) return FALSE;
01855
01856 while(pp->esis!=NULL) pp = pp->esis;
01857 fnd = find_match_xml(pp, pt);
01858 if (fnd) tt = tt->altp;
01859 else tt = NULL;
01860
01861 clear_tTree_ctrl(pm);
01862
01863 return tt;
01864 }
01865
01866
01867
01883 int set_xml_node(tXML* pp, tXML* pt, const char* name)
01884 {
01885 tXML* tt;
01886
01887 if (pp==NULL || pt==NULL || name==NULL) return FALSE;
01888
01889 tt = get_xml_node(pp, pt);
01890 if (tt==NULL) return FALSE;
01891
01892 copy_s2Buffer(name, &(tt->ldat.key));
01893
01894 return TRUE;
01895 }
01896
01897
01898
01919 int set_xml_end_node(tXML* pp, tXML* pt)
01920 {
01921 int ret;
01922 tXML* tt;
01923 tXML* pm;
01924
01925
01926 if (pp==NULL || pt==NULL) return FALSE;
01927
01928 pm = pp;
01929 if (pp->ldat.id==XML_ANCHOR_NODE) {
01930 if (pp->next!=NULL) pp = pp->next;
01931 else return FALSE;
01932 }
01933 if (pt->ldat.id==XML_ANCHOR_NODE) {
01934 if (pt->next!=NULL) pt = pt->next;
01935 else return FALSE;
01936 }
01937
01938 tt = find_xml_end(pt);
01939 if (tt==NULL) return FALSE;
01940 tt->ctrl = TREE_NOCMP_COPY_NODE;
01941
01942 while(pp->esis!=NULL) pp = pp->esis;
01943 ret = find_match_xml(pp, pt);
01944 if (ret) {
01945 copy_tTree_byctrl(pt);
01946 adjust_tTree_depth(pp);
01947 }
01948
01949 clear_tTree_ctrl(pm);
01950
01951 return ret;
01952 }
01953
01954
01955
01982 tXML* get_xml_content(tXML* pp, tXML* pt)
01983 {
01984 int fnd;
01985 tXML* tt = NULL;
01986 tXML* pm;
01987 tXML* dm;
01988
01989 if (pp==NULL || pt==NULL) return NULL;
01990
01991 pm = pp;
01992 if (pp->ldat.id==XML_ANCHOR_NODE) {
01993 if (pp->next!=NULL) pp = pp->next;
01994 else return NULL;
01995 }
01996 if (pt->ldat.id==XML_ANCHOR_NODE) {
01997 if (pt->next!=NULL) pt = pt->next;
01998 else return NULL;
01999 }
02000
02001 tt = find_xml_end(pt);
02002 if (tt==NULL) return NULL;
02003 dm = add_xml_content(tt, (char*)"DUMMY");
02004 if (dm==NULL) return NULL;
02005 dm->ctrl = TREE_NOCMP_NODE;
02006
02007 while(pp->esis!=NULL) pp = pp->esis;
02008
02009 fnd = find_match_xml(pp, pt);
02010 if (fnd) tt = dm->altp;
02011 else tt = NULL;
02012
02013 del_xml(&dm);
02014 clear_tTree_ctrl(pm);
02015
02016 return tt;
02017 }
02018
02019
02020
02038 int set_xml_content(tXML* pp, tXML* pt, const char* content)
02039 {
02040 tXML* tt;
02041
02042 if (pp==NULL || pt==NULL || content==NULL) return FALSE;
02043
02044 tt = get_xml_content(pp, pt);
02045 if (tt==NULL) return FALSE;
02046
02047 copy_s2Buffer(content, &(tt->ldat.key));
02048 return TRUE;
02049 }
02050
02051
02052
02058 int get_xml_int_content(tXML* pp, tXML* pt)
02059 {
02060 int ret = 0;
02061
02062 tXML* node = get_xml_content(pp, pt);
02063 if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf));
02064 return ret;
02065 }
02066
02067
02068
02074 float get_xml_float_content(tXML* pp, tXML* pt)
02075 {
02076 float ret = 0.0;
02077
02078 tXML* node = get_xml_content(pp, pt);
02079 if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf));
02080 return ret;
02081 }
02082
02083
02084
02090 double get_xml_double_content(tXML* pp, tXML* pt)
02091 {
02092 double ret = 0.0;
02093
02094 tXML* node = get_xml_content(pp, pt);
02095 if (node!=NULL) ret = atof((char*)(node->ldat.key.buf));
02096 return ret;
02097 }
02098
02099
02100
02106 char* get_xml_char_content(tXML* pp, tXML* pt)
02107 {
02108 char* ret = NULL;
02109
02110 tXML* node = get_xml_content(pp, pt);
02111 if (node!=NULL) ret = (char*)(node->ldat.key.buf);
02112 return ret;
02113 }
02114
02115
02116
02131 tList* get_xml_attr(tXML* pp, tXML* pt)
02132 {
02133 tList* lp = NULL;
02134 tXML* tt;
02135
02136 if (pp==NULL || pt==NULL) return NULL;
02137
02138 tt = get_xml_node(pp, pt);
02139 if (tt!=NULL) lp = tt->ldat.lst;
02140 return lp;
02141 }
02142
02143
02144
02150 char* get_xml_char_attr(tXML* pp, tXML* pt, const char* attr)
02151 {
02152 char* ret = NULL;
02153 if (pp==NULL || pt==NULL || attr==NULL) return ret;
02154
02155 tXML* node = get_xml_node(pp, pt);
02156 if (node!=NULL) ret = xml_get_node_attr(node, attr);
02157 return ret;
02158 }
02159
02160
02161
02168 int get_xml_int_attr(tXML* pp, tXML* pt, const char* attr)
02169 {
02170 int ret = 0;
02171 if (pp==NULL || pt==NULL || attr==NULL) return ret;
02172
02173 tXML* node = get_xml_node(pp, pt);
02174 if (node!=NULL) {
02175 char* val = xml_get_node_attr(node, attr);
02176 if (val!=NULL) {
02177 Buffer buf = make_Buffer_bystr(val);
02178 char* ptr = (char*)buf.buf;
02179 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
02180 if (ptr[0]=='"') ptr++;
02181 ret = atoi(ptr);
02182 free_Buffer(&buf);
02183 }
02184 }
02185 return ret;
02186 }
02187
02188
02189
02196 double get_xml_double_attr(tXML* pp, tXML* pt, const char* attr)
02197 {
02198 double ret = 0.0;
02199 if (pp==NULL || pt==NULL || attr==NULL) return ret;
02200
02201 tXML* node = get_xml_node(pp, pt);
02202 if (node!=NULL) {
02203 char* val = xml_get_node_attr(node, attr);
02204 if (val!=NULL) {
02205 Buffer buf = make_Buffer_bystr(val);
02206 char* ptr = (char*)buf.buf;
02207 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
02208 if (ptr[0]=='"') ptr++;
02209 ret = atof(ptr);
02210 free_Buffer(&buf);
02211 }
02212 }
02213 return ret;
02214 }
02215
02216
02217
02235 int set_xml_attr(tXML* pp, tXML* pt, tList* at)
02236 {
02237 tXML* tt;
02238
02239 if (pp==NULL || pt==NULL || at==NULL) return FALSE;
02240
02241 tt = get_xml_node(pp, pt);
02242 if (tt!=NULL) {
02243 del_all_tList(&(tt->ldat.lst));
02244 tt->ldat.lst = dup_tList(at);
02245 }
02246 else return FALSE;
02247 return TRUE;
02248 }
02249
02250
02251
02257 int replace_xml_content(tXML* pp, tXML* pt, const char* src, const char* dst)
02258 {
02259 tXML* tt;
02260 Buffer tg;
02261
02262 if (pp==NULL || pt==NULL || src==NULL || dst==NULL) return FALSE;
02263
02264 tt = get_xml_content(pp, pt);
02265 if (tt==NULL) return FALSE;
02266
02267 tg = replace_sBuffer_bystr(tt->ldat.key, src, dst);
02268 if (tg.buf==NULL) return FALSE;
02269
02270 free_Buffer(&(tt->ldat.key));
02271 tt->ldat.key = tg;
02272
02273 return TRUE;
02274 }
02275
02276
02277
02283 tXML* get_xml_node_bystr(tXML* pp, const char* str)
02284 {
02285 tXML* tx;
02286 tXML* tt;
02287
02288 if (pp==NULL || str==NULL) return FALSE;
02289
02290 tx = xml_parse((char*)str);
02291 tt = get_xml_node(pp, tx);
02292 del_xml(&tx);
02293 return tt;
02294 }
02295
02296
02297
02303 int set_xml_node_bystr(tXML* pp, const char* str, const char* val)
02304 {
02305 tXML* tx;
02306 int rt;
02307
02308 if (pp==NULL || str==NULL || val==NULL) return FALSE;
02309
02310 tx = xml_parse((char*)str);
02311 rt = set_xml_node(pp, tx, val);
02312 del_xml(&tx);
02313 return rt;
02314 }
02315
02316
02317
02323 int set_xml_end_node_bystr(tXML* pp, const char* str)
02324 {
02325 tXML* tx;
02326 int rt;
02327
02328 if (pp==NULL || str==NULL) return FALSE;
02329
02330 tx = xml_parse((char*)str);
02331 rt = set_xml_end_node(pp, tx);
02332 del_xml(&tx);
02333 return rt;
02334 }
02335
02336
02337
02343 tXML* get_xml_content_bystr(tXML* pp, const char* str)
02344 {
02345 tXML* tx;
02346 tXML* tt;
02347
02348 if (pp==NULL || str==NULL) return FALSE;
02349
02350 tx = xml_parse((char*)str);
02351 tt = get_xml_content(pp, tx);
02352 del_xml(&tx);
02353 return tt;
02354 }
02355
02356
02357
02364 int get_xml_int_content_bystr(tXML* pp, const char* str)
02365 {
02366 int ret = 0;
02367
02368 tXML* node = get_xml_content_bystr(pp, str);
02369 if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf));
02370 return ret;
02371 }
02372
02373
02374
02381 float get_xml_float_content_bystr(tXML* pp, const char* str)
02382 {
02383 float ret = 0.0;
02384
02385 tXML* node = get_xml_content_bystr(pp, str);
02386 if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf));
02387 return ret;
02388 }
02389
02390
02391
02398 double get_xml_double_content_bystr(tXML* pp, const char* str)
02399 {
02400 double ret = 0.0;
02401
02402 tXML* node = get_xml_content_bystr(pp, str);
02403 if (node!=NULL) ret = atof((char*)(node->ldat.key.buf));
02404 return ret;
02405 }
02406
02407
02408
02416 char* get_xml_char_content_bystr(tXML* pp, const char* str)
02417 {
02418 char* ret = NULL;
02419
02420 tXML* node = get_xml_content_bystr(pp, str);
02421 if (node!=NULL) ret = (char*)(node->ldat.key.buf);
02422 return ret;
02423 }
02424
02425
02426
02432 int set_xml_content_bystr(tXML* pp, const char* str, const char* val)
02433 {
02434 tXML* tx;
02435 int rt;
02436
02437 if (pp==NULL || str==NULL || val==NULL) return FALSE;
02438
02439 tx = xml_parse((char*)str);
02440 rt = set_xml_content(pp, tx, val);
02441 del_xml(&tx);
02442 return rt;
02443 }
02444
02445
02446
02452 tList* get_xml_attr_bystr(tXML* pp, const char* str)
02453 {
02454 tXML* tx;
02455 tList* tt;
02456
02457 if (pp==NULL || str==NULL) return NULL;
02458
02459 tx = xml_parse((char*)str);
02460 tt = get_xml_attr(pp, tx);
02461 del_xml(&tx);
02462 return tt;
02463 }
02464
02465
02466
02473 char* get_xml_char_attr_bystr(tXML* pp, const char* str, const char* attr)
02474 {
02475 char* ret = NULL;
02476 if (pp==NULL || str==NULL || attr==NULL) return ret;
02477
02478 tXML* node = get_xml_node_bystr(pp, str);
02479 if (node!=NULL) ret = xml_get_node_attr(node, attr);
02480 return ret;
02481 }
02482
02483
02484
02492 int get_xml_int_attr_bystr(tXML* pp, const char* str, const char* attr)
02493 {
02494 int ret = 0;
02495 if (pp==NULL || str==NULL || attr==NULL) return ret;
02496
02497 tXML* node = get_xml_node_bystr(pp, str);
02498 if (node!=NULL) {
02499 char* val = xml_get_node_attr(node, attr);
02500 if (val!=NULL) {
02501 Buffer buf = make_Buffer_bystr(val);
02502 char* ptr = (char*)buf.buf;
02503 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
02504 if (ptr[0]=='"') ptr++;
02505 ret = atoi(ptr);
02506 free_Buffer(&buf);
02507 }
02508 }
02509 return ret;
02510 }
02511
02512
02513
02521 double get_xml_double_attr_bystr(tXML* pp, const char* str, const char* attr)
02522 {
02523 double ret = 0.0;
02524 if (pp==NULL || str==NULL || attr==NULL) return ret;
02525
02526 tXML* node = get_xml_node_bystr(pp, str);
02527 if (node!=NULL) {
02528 char* val = xml_get_node_attr(node, attr);
02529 if (val!=NULL) {
02530 Buffer buf = make_Buffer_bystr(val);
02531 char* ptr = (char*)buf.buf;
02532 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
02533 if (ptr[0]=='"') ptr++;
02534 ret = atof(ptr);
02535 free_Buffer(&buf);
02536 }
02537 }
02538 return ret;
02539 }
02540
02541
02542
02548 int set_xml_attr_bystr(tXML* pp, const char* str, tList* at)
02549 {
02550 tXML* tx;
02551 int rt;
02552
02553 if (pp==NULL || str==NULL || at==NULL) return FALSE;
02554
02555 tx = xml_parse((char*)str);
02556 rt = set_xml_attr(pp, tx, at);
02557 del_xml(&tx);
02558 return rt;
02559 }
02560
02561
02562
02568 int replace_xml_content_bystr(tXML*pp, const char* str, const char* src, const char* dst)
02569 {
02570 tXML* tx;
02571 int rt;
02572
02573 if (pp==NULL || src==NULL || src==NULL || dst==NULL) return FALSE;
02574
02575 tx = xml_parse((char*)str);
02576 rt = replace_xml_content(pp, tx, src, dst);
02577 del_xml(&tx);
02578 return rt;
02579 }
02580
02581
02582
02583
02585
02586
02587
02601 tList* get_xml_node_list(tXML* pp, tXML* pt)
02602 {
02603 tList* lp;
02604
02605 if (pp==NULL || pt==NULL) return NULL;
02606
02607 if (pp->ldat.id==XML_ANCHOR_NODE) {
02608 if (pp->next!=NULL) pp = pp->next;
02609 else return NULL;
02610 }
02611 if (pt->ldat.id==XML_ANCHOR_NODE) {
02612 if (pt->next!=NULL) pt = pt->next;
02613 else return NULL;
02614 }
02615
02616 lp = find_match_xml_endlist(pp, pt);
02617
02618 return lp;
02619 }
02620
02621
02622
02637 tList* get_xml_content_list(tXML* pp, tXML* pt)
02638 {
02639 tList* lp;
02640 tList* dm;
02641
02642 if (pp==NULL || pt==NULL) return NULL;
02643
02644 if (pp->ldat.id==XML_ANCHOR_NODE) {
02645 if (pp->next!=NULL) pp = pp->next;
02646 else return NULL;
02647 }
02648 if (pt->ldat.id==XML_ANCHOR_NODE) {
02649 if (pt->next!=NULL) pt = pt->next;
02650 else return NULL;
02651 }
02652
02653 dm = find_xml_end(pt);
02654 if (dm==NULL) return NULL;
02655 dm = add_xml_content(dm, (char*)"DUMMY");
02656 if (dm==NULL) return NULL;
02657 dm->ctrl = TREE_NOCMP_NODE;
02658
02659 lp = find_match_xml_endlist(pp, pt);
02660 del_xml(&dm);
02661
02662 return lp;
02663 }
02664
02665
02666
02678 int set_xml_content_list(tXML* pp, tXML* pt, const char* content)
02679 {
02680 int num = 0;
02681 tList* lt;
02682 tList* lp;
02683
02684 if (pp==NULL || pt==NULL || content==NULL) return 0;
02685
02686 lp = lt = get_xml_content_list(pp, pt);
02687 if (lt==NULL) return 0;
02688
02689 while (lt!=NULL) {
02690 if (lt->altp!=NULL) {
02691 copy_s2Buffer(content, &(lt->altp->ldat.key));
02692 num++;
02693 }
02694 lt = lt->next;
02695 }
02696 del_tList(&lp);
02697
02698 return num;
02699 }
02700
02701
02702
02708 tList* get_xml_node_list_bystr(tXML* pp, const char* str)
02709 {
02710 tXML* tx;
02711 tList* tt;
02712
02713 if (pp==NULL || str==NULL) return NULL;
02714
02715 tx = xml_parse((char*)str);
02716 tt = get_xml_node_list(pp, tx);
02717 del_xml(&tx);
02718
02719 return tt;
02720 }
02721
02722
02723
02729 tList* get_xml_content_list_bystr(tXML* pp, const char* str)
02730 {
02731 tXML* tx;
02732 tList* tt;
02733
02734 if (pp==NULL || str==NULL) return NULL;
02735
02736 tx = xml_parse((char*)str);
02737 tt = get_xml_content_list(pp, tx);
02738 del_xml(&tx);
02739
02740 return tt;
02741 }
02742
02743
02744
02750 int set_xml_content_list_bystr(tXML* pp, const char* str, const char* content)
02751 {
02752 tXML* tx;
02753 int rt;
02754
02755 if (pp==NULL || str==NULL || content==NULL) return 0;
02756
02757 tx = xml_parse((char*)str);
02758 rt = set_xml_content_list(pp, tx, content);
02759 del_xml(&tx);
02760
02761 return rt;
02762 }
02763
02764
02765
02766
02768
02769
02770
02771
02794 int find_match_xml(tXML* pp, tXML* pt)
02795 {
02796 int ret;
02797 tXML* pm;
02798
02799 pm = pp;
02800 while(pp!=NULL) {
02801 ret = check_match_xml(pp, pt);
02802 if (ret) return TRUE;
02803
02804 if (pp->next!=NULL) {
02805 ret = find_match_xml(pp->next, pt);
02806 if (ret) {
02807 clear_tTree_ctrl(pm);
02808 return TRUE;
02809 }
02810 }
02811 pp = pp->ysis;
02812 }
02813
02814 return FALSE;
02815 }
02816
02817
02818
02833 tXML* find_match_xml_endlist(tXML* pp, tXML* pt)
02834 {
02835 tXML* te;
02836 tList* lp;
02837
02838 te = find_xml_end(pt);
02839 while(pp->esis!=NULL) pp = pp->esis;
02840
02841 lp = find_match_xml_endlist_rcsv(pp, pt, te);
02842 if (lp!=NULL) clear_tTree_ctrl(pp);
02843
02844 return lp;
02845 }
02846
02847
02848
02855 tList* find_match_xml_endlist_rcsv(tXML* pp, tXML* pt, tXML* te)
02856 {
02857 tList* lt = NULL;
02858 tList* lp = NULL;
02859
02860 while(pp!=NULL) {
02861 int ret = check_match_xml(pp, pt);
02862 if (ret && te->altp!=NULL) {
02863 tList* lm = new_tList_node();
02864 lm->altp = te->altp;
02865 lt = insert_tList(lt, lm);
02866 if (lp==NULL) lp = lt;
02867 te->altp = NULL;
02868 }
02869
02870 if (pp->next!=NULL) {
02871 tList* lm = find_match_xml_endlist_rcsv(pp->next, pt, te);
02872 if (lm!=NULL) {
02873 lt = insert_tList(lt, lm);
02874 if (lp==NULL) lp = lt;
02875 clear_tTree_ctrl(pp->next);
02876 }
02877 }
02878
02879 if (!ret) pp = pp->ysis;
02880 }
02881
02882 return lp;
02883 }
02884
02885
02886
02897 tXML* find_match_xml_end_node(tXML* pp, tXML* pt)
02898 {
02899 int ret;
02900 tXML* tt = NULL;
02901 tXML* pm;
02902
02903 if (pp==NULL || pt==NULL) return NULL;
02904
02905 pm = pp;
02906 ret = find_match_tTree(pp, pt);
02907 if (ret) {
02908 tt = find_xml_end(pt);
02909 if (tt!=NULL) {
02910 tt = tt->altp;
02911 }
02912 }
02913
02914 clear_tTree_ctrl(pm);
02915
02916 return tt;
02917 }
02918
02919
02920
02941 int check_match_xml(tXML* tp, tXML* tr)
02942 {
02943 int ret;
02944 tXML* te;
02945 tXML* ts;
02946
02947 tXML* tt;
02948 tXML* ta;
02949 tXML* tb;
02950
02951 if (tp==NULL || tr==NULL) return FALSE;
02952
02953 te = find_tList_end(tr);
02954
02955 ts = tp;
02956 while (ts!=NULL) {
02957 tt = cmp_sisters_xml(ts, tr);
02958 if (tt==NULL) return FALSE;
02959
02960 ta = tt;
02961 tb = tr;
02962 ret = TRUE;
02963 while (tb!=NULL && ret) {
02964 if (tb->next==NULL) ret = TRUE;
02965
02966 else if (tb->next!=NULL && ta->next==NULL) ret = FALSE;
02967
02968 else ret = check_match_xml(ta->next, tb->next);
02969
02970 ta = ta->ysis;
02971 tb = tb->ysis;
02972 }
02973
02974 if (ret) {
02975 if (tr==te) tt->ctrl = TREE_ALREADY_FOUND_NODE;
02976 return TRUE;
02977 }
02978
02979 ts = tt->ysis;
02980 }
02981
02982 return FALSE;
02983 }
02984
02985
02986
03019 tXML* cmp_sisters_xml(tXML* tp, tXML* tr)
03020 {
03021 tXML* ta;
03022 tXML* tb = NULL;
03023 tXML* ts;
03024
03025 ts = tp;
03026 while (ts!=NULL){
03027 ta = ts;
03028 tb = tr;
03029 while (ta!=NULL && tb!=NULL) {
03030
03031 if (ta->ctrl==TREE_ALREADY_FOUND_NODE) break;
03032 if (tb->ctrl!=TREE_NOCMP_NODE && tb->ctrl!=TREE_NOCMP_COPY_NODE) {
03033 if ((ta->ldat).key.buf!=NULL && (tb->ldat).key.buf!=NULL) {
03034 if (ta->ldat.id!=tb->ldat.id || strcmp((char*)((ta->ldat).key.buf), (char*)((tb->ldat).key.buf))) break;
03035 }
03036 else break;
03037 }
03038
03039
03040 tb->altp = ta;
03041 ta = ta->ysis;
03042 tb = tb->ysis;
03043 }
03044
03045
03046 if (tb==NULL) return ts;
03047
03048 ts = ts->ysis;
03049 }
03050
03051 return NULL;
03052 }
03053
03054
03055
03056
03058
03059
03060
03071 Buffer get_node_content(tXML* tp, const char* name, int no)
03072 {
03073 Buffer content;
03074 tXML* tt;
03075
03076 content = init_Buffer();
03077 if (tp==NULL || name==NULL) return content;
03078
03079 if (no<=0) no = 1;
03080 tt = strncmp_tTree(tp, name, 0, no);
03081 if (tt!=NULL) {
03082 if (tt->next!=NULL) {
03083 tt = tt->next;
03084 while (tt!=NULL && tt->ldat.id!=XML_CONTENT_NODE) tt = tt->ysis;
03085 if (tt==NULL) return content;
03086 content = dup_Buffer(tt->ldat.key);
03087 }
03088 }
03089
03090 return content;
03091 }
03092
03093
03094
03100 int get_node_integer(tXML* tp, const char* name, int no)
03101 {
03102 int ret;
03103 Buffer content;
03104
03105 content = get_node_content(tp, name, no);
03106
03107 if (content.buf==NULL) ret = 0;
03108 else ret = atoi((const char*)content.buf);
03109 free_Buffer(&content);
03110
03111 return ret;
03112 }
03113
03114
03115
03122 int return_exist_node(tXML* tp, const char* name, int no, Buffer* content)
03123 {
03124 Buffer buf;
03125
03126 buf = get_node_content(tp, name, no);
03127 if (buf.buf==NULL) return FALSE;
03128
03129 if (content!=NULL) *content = buf;
03130 return TRUE;
03131 }
03132
03133
03134
03147 int replace_all_node_integer(tXML* tp, const char* name, int src, int dst)
03148 {
03149 int n;
03150 char nums[20], numd[20];
03151
03152 snprintf(nums, 10, "%d", src);
03153 snprintf(numd, 10, "%d", dst);
03154
03155 n = replace_all_node_contents(tp, name, nums, numd);
03156
03157 return n;
03158 }
03159
03160
03161
03175 int replace_all_node_contents(tXML* pp, const char* name, const char* src, const char* dst)
03176 {
03177 int n;
03178
03179 if (pp==NULL || dst==NULL) return 0;
03180
03181 if (pp->ldat.id==XML_ANCHOR_NODE) {
03182 if (pp->next!=NULL) pp = pp->next;
03183 else return 0;
03184 }
03185 while(pp->esis!=NULL) pp = pp->esis;
03186
03187 n = replace_all_node_contents_rcsv(pp, name, src, dst);
03188
03189 return n;
03190 }
03191
03192
03193
03199 int replace_all_node_contents_rcsv(tXML* pp, const char* name, const char* src, const char* dst)
03200 {
03201 int n = 0;
03202
03203 while(pp!=NULL) {
03204 if (pp->ldat.key.buf!=NULL && pp->ldat.id==XML_NAME_NODE && pp->ldat.lv>0) {
03205 if (name==NULL || !strcmp(name, (const char*)(pp->ldat.key.buf))) {
03206 tXML* tt = pp->next;
03207
03208
03209 while (tt!=NULL) {
03210 if (tt->ldat.id==XML_CONTENT_NODE) {
03211 if (src==NULL) {
03212 copy_s2Buffer(dst, &(tt->ldat.key));
03213 n++;
03214 }
03215 else if (tt->ldat.key.buf!=NULL && strstr((const char*)tt->ldat.key.buf, src)!=NULL) {
03216 Buffer buf = replace_sBuffer_bystr(tt->ldat.key, src, dst);
03217 free_Buffer(&(tt->ldat.key));
03218 tt->ldat.key = buf;
03219 n++;
03220 }
03221 }
03222 tt = tt->ysis;
03223 }
03224 }
03225 }
03226
03227 if (pp->next!=NULL) n += replace_all_node_contents_rcsv(pp->next, name, src, dst);
03228
03229 pp = pp->ysis;
03230 }
03231
03232 return n;
03233 }
03234
03235
03236
03249 int replace_all_node_byid(tXML* pp, const char* src, const char* dst, int id)
03250 {
03251 int n;
03252
03253 if (pp==NULL || dst==NULL) return 0;
03254
03255 if (pp->ldat.id==XML_ANCHOR_NODE) {
03256 if (pp->next!=NULL) pp = pp->next;
03257 else return 0;
03258 }
03259 while(pp->esis!=NULL) pp = pp->esis;
03260
03261 n = replace_all_node_byid_rcsv(pp, src, dst, id);
03262
03263 return n;
03264 }
03265
03266
03267
03273 int replace_all_node_byid_rcsv(tXML* pp, const char* src, const char* dst, int id)
03274 {
03275 int n = 0;
03276
03277 while(pp!=NULL) {
03278 if (id<0 || pp->ldat.id==id) {
03279 if (src==NULL) {
03280 copy_s2Buffer(dst, &(pp->ldat.key));
03281 n++;
03282 }
03283 else if (pp->ldat.key.buf!=NULL && strstr((const char*)pp->ldat.key.buf, src)!=NULL) {
03284 Buffer buf = replace_sBuffer_bystr(pp->ldat.key, src, dst);
03285 free_Buffer(&(pp->ldat.key));
03286 pp->ldat.key = buf;
03287 n++;
03288 }
03289 }
03290
03291 if (pp->next!=NULL) n += replace_all_node_byid_rcsv(pp->next, src, dst, id);
03292
03293 pp = pp->ysis;
03294 }
03295
03296 return n;
03297 }
03298
03299
03300
03301
03303
03304
03336 Buffer xml_rpc_request_pack(const char* name, tXML* xml)
03337 {
03338 tXML* ptr = init_xml_doc();
03339 tXML* top = add_xml_node(ptr, "methodCall");
03340 tXML* mnm = add_xml_node(top, "methodName");
03341 tXML* prs = add_xml_node(top, "params");
03342 tXML* prm = add_xml_node(prs, "param");
03343 add_xml_content(mnm, name);
03344
03345 join_xml(prm, xml);
03346 Buffer buf = xml_inverse_parse(ptr, XML_ONELINE_FORMAT);
03347
03348 return buf;
03349 }
03350
03351
03368 tXML* xml_rpc_add_member(tXML* xml, char* name, char* value, char* kind)
03369 {
03370 if (name==NULL) return xml;
03371
03372 if (xml==NULL) xml = add_xml_node(NULL, "struct");
03373
03374 tXML* mem = add_xml_node(xml, "member");
03375 tXML* mnm = add_xml_node(mem, "name");
03376 tXML* val = add_xml_node(mem, "value");
03377 tXML* knd;
03378 if (kind==NULL) knd = add_xml_node(val, "string");
03379 else if (kind[0]=='\0') knd = add_xml_node(val, "string");
03380 else knd = add_xml_node(val, kind);
03381
03382 add_xml_content(mnm, name);
03383 add_xml_content(knd, value);
03384
03385 return xml;
03386 }
03387
03388
03411 tXML* xml_rpc_end_member(tXML* xml)
03412 {
03413 tXML* ptr = add_xml_node(NULL, "value");
03414 join_xml(ptr, xml);
03415
03416 return ptr;
03417 }
03418
03419
03429 tXML* xml_rpc_add_array(tXML* xml, tXML* array)
03430 {
03431 if (xml==NULL) xml = add_xml_node(NULL, "data");
03432 join_xml(xml, array);
03433
03434 return xml;
03435 }
03436
03437
03438
03451 tXML* xml_rpc_end_array(tXML* xml)
03452 {
03453 tXML* ptr = add_xml_node(NULL, "value");
03454 tXML* val = add_xml_node(ptr, "array");
03455 join_xml(val, xml);
03456
03457 return ptr;
03458 }
03459
03460