Annotation of embedtools/src/xmler.c, revision 1.1.2.9

1.1.2.7   misho       1: /*************************************************************************
                      2:  * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
                      3:  *  by Michael Pounov <misho@aitbg.com>
                      4:  *
                      5:  * $Author: misho $
1.1.2.9 ! misho       6:  * $Id: xmler.c,v 1.1.2.8 2010/09/29 15:32:33 misho Exp $
1.1.2.7   misho       7:  *
                      8:  *************************************************************************/
1.1.2.1   misho       9: #include "global.h"
1.1.2.2   misho      10: #include <axl.h>
                     11: #include <axl_ns.h>
                     12: #include <axl_decl.h>
                     13: #include "xmler.h"
1.1.2.1   misho      14: 
                     15: 
1.1.2.2   misho      16: int Verbose;
                     17: extern char compiled[], compiledby[], compilehost[];
                     18: 
                     19: 
1.1.2.5   misho      20: static void
                     21: Usage()
1.1.2.2   misho      22: {
                     23: 
                     24:        printf( "XMLer is tool for managment R/W operation with XMLs\n"
                     25:                "=== %s === %s@%s ===\n\n"
                     26:                "  Syntax: xmler [options] <file.xml> [data]\n\n"
                     27:                "\t-v\t\tVerbose ...\n"
1.1.2.8   misho      28:                "\t-l <av_pair>\tList node\n"
1.1.2.5   misho      29:                "\t-d <av_pair>\tDelete node\n"
                     30:                "\t-s <av_pair>\tSet node command\n"
                     31:                "\t-g <av_pair>\tGet node command\n"
1.1.2.2   misho      32:                "*\"av_pair\" format: [ns:]node[[|attribute[=value]]?data]\n"
                     33:                "\n", compiled, compiledby, compilehost);
                     34: }
                     35: 
1.1.2.5   misho      36: static int
                     37: ShowXML(axlDoc *doc, const char *csNode)
                     38: {
                     39:        axlNode *node = NULL;
                     40:        int ctxlen;
                     41:        char *ctx = NULL;
                     42: 
                     43:        if (csNode) {
                     44:                if (!(node = axl_doc_find_called(doc, csNode))) {
                     45:                        printf("GET:: node %s - not found!\n", csNode);
                     46:                        return 1;
                     47:                }
                     48: 
                     49:                axl_node_dump_pretty(node, &ctx, &ctxlen, 4);
                     50:                VERB(1) printf("Verbose:: Node length=%d\n", ctxlen);
                     51:        } else {
                     52:                axl_doc_dump_pretty(doc, &ctx, &ctxlen, 4);
                     53:                VERB(1) printf("Verbose:: Document length=%d\n", ctxlen);
                     54:        }
                     55: 
                     56:        VERB(1) printf("\n");
                     57:        if (ctx) {
                     58:                printf("%s", ctx);
                     59:                free(ctx);
                     60:        }
                     61:        VERB(1) printf("\n");
                     62:        return 0;
                     63: }
                     64: 
1.1.2.8   misho      65: static int
                     66: ShowItem(axlNode *node, int lvl)
                     67: {
                     68:        register int i;
                     69:        int ctxlen;
                     70:        axlNode *child;
                     71: 
                     72:        for (i = 0; i < axl_node_get_child_num(node); i++) {
                     73:                child = axl_node_get_child_nth(node, i);
1.1.2.9 ! misho      74: 
1.1.2.8   misho      75:                if (!lvl)
1.1.2.9 ! misho      76:                        printf("%s %s \"%s\"", axl_node_get_name(node), axl_node_get_name(child), 
1.1.2.8   misho      77:                                        axl_node_get_content(child, &ctxlen));
                     78:                else
1.1.2.9 ! misho      79:                        printf(" %s \"%s\"", axl_node_get_name(child), axl_node_get_content(child, &ctxlen));
1.1.2.8   misho      80: 
                     81:                ShowItem(child, 1);
                     82: 
                     83:                if (!lvl)
                     84:                        printf("\n");
                     85:        }
                     86: 
                     87:        return 0;
                     88: }
                     89: 
1.1.2.1   misho      90: int
                     91: main(int argc, char **argv)
                     92: {
1.1.2.7   misho      93:        char ch, str[STRSIZ], szName[MAXPATHLEN], *ctx = NULL, m = 0;
1.1.2.3   misho      94:        int ctxlen, n, ret = 0;
1.1.2.2   misho      95:        axlDoc *doc = NULL;
                     96:        axlError *err = NULL;
1.1.2.5   misho      97:        axlNode *nnode = NULL, *node = NULL;
1.1.2.2   misho      98:        struct tagReqXML xr;
                     99: 
                    100:        memset(str, 0, STRSIZ);
                    101:        memset(&xr, 0, sizeof xr);
1.1.2.8   misho     102:        while ((ch = getopt(argc, argv, "hvl:s:g:d:")) != -1)
1.1.2.2   misho     103:                switch (ch) {
                    104:                        case 'v':
                    105:                                Verbose++;
                    106:                                break;
1.1.2.8   misho     107:                        case 'l':
                    108:                                if (m) {
                    109:                                        Usage();
                    110:                                        return 1;
                    111:                                } else
                    112:                                        m = 'l';
                    113:                                strlcpy(str, optarg, STRSIZ);
                    114:                                if ((ret = ioXMLGet(str, &xr)) < 1) {
                    115:                                        printf("Error:: in XML request %s\n", str);
                    116:                                        return 1;
                    117:                                }
                    118:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    119:                                break;
1.1.2.5   misho     120:                        case 'd':
                    121:                                if (m) {
                    122:                                        Usage();
                    123:                                        return 1;
                    124:                                } else
                    125:                                        m = 'd';
                    126:                                strlcpy(str, optarg, STRSIZ);
                    127:                                if ((ret = ioXMLGet(str, &xr)) < 1) {
                    128:                                        printf("Error:: in XML request %s\n", str);
                    129:                                        return 1;
                    130:                                }
                    131:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    132:                                break;
1.1.2.2   misho     133:                        case 's':
                    134:                                if (m) {
                    135:                                        Usage();
                    136:                                        return 1;
                    137:                                } else
                    138:                                        m = 's';
                    139:                                strlcpy(str, optarg, STRSIZ);
                    140:                                if ((ret = ioXMLGet(str, &xr)) < 1) {
                    141:                                        printf("Error:: in XML request %s\n", str);
                    142:                                        return 1;
                    143:                                }
                    144:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    145:                                break;
                    146:                        case 'g':
                    147:                                if (m) {
                    148:                                        Usage();
                    149:                                        return 1;
                    150:                                } else
                    151:                                        m = 'g';
                    152:                                strlcpy(str, optarg, STRSIZ);
                    153:                                if ((ret = ioXMLGet(str, &xr)) < 1) {
                    154:                                        printf("Error:: in XML request %s\n", str);
                    155:                                        return 1;
                    156:                                }
                    157:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    158:                                break;
                    159:                        case 'h':
                    160:                        default:
                    161:                                Usage();
                    162:                                return 1;
                    163:                }
                    164:        argc -= optind;
                    165:        argv += optind;
                    166:        if (!argc) {
                    167:                Usage();
                    168:                return 1;
                    169:        } else
                    170:                strlcpy(szName, *argv, MAXPATHLEN);
                    171:        if (argc > 1 && argv[1]) {
                    172:                xr.xml_data.value = argv[1];
                    173:                xr.xml_data.vallen = strlen(argv[1]);
                    174:        }
                    175: 
                    176:        axl_init();
                    177:        if (!(doc = axl_doc_parse_from_file(szName, &err))) {
                    178:                printf("Error:: xml file %s #%d - %s\n", szName, 
                    179:                                axl_error_get_code(err), axl_error_get(err));
                    180:                axl_error_free(err);
                    181:                axl_end();
                    182:                return 2;
                    183:        }
                    184:        if (!axl_ns_doc_validate(doc, &err)) {
                    185:                printf("Error:: xml file %s namespace validation #%d - %s\n", szName, 
                    186:                                axl_error_get_code(err), axl_error_get(err));
                    187:                axl_error_free(err);
                    188:                axl_end();
                    189:                return 2;
                    190:        }
                    191: 
                    192:        switch (m) {
                    193:                case 'g':
                    194:                        if (!xr.xml_namespace.vallen) {
1.1.2.3   misho     195:                                if (ret == 32) {
                    196:                                        if (!(ctx = (char*) axl_doc_get_content_at(doc, xr.xml_node.path.value, &ctxlen))) {
                    197:                                                printf("GET:: path %s - not found!\n", xr.xml_node.path.value);
                    198:                                                ret = 1;
                    199:                                                goto end;
                    200:                                        }
                    201:                                } else {
                    202:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    203:                                                printf("GET:: node %s - not found!\n", xr.xml_node.container.value);
                    204:                                                ret = 1;
                    205:                                                goto end;
                    206:                                        }
1.1.2.2   misho     207:                                }
                    208:                        } else {
                    209:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    210:                                strlcat(str, ":", sizeof str);
1.1.2.3   misho     211:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    212:                                if (ret == 32) {
                    213:                                        if (!(ctx = (char*) axl_doc_get_content_at(doc, str, &ctxlen))) {
                    214:                                                printf("GET:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    215:                                                                xr.xml_node.path.value);
                    216:                                                ret = 1;
                    217:                                                goto end;
                    218:                                        }
                    219:                                } else {
                    220:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    221:                                                printf("GET:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    222:                                                                xr.xml_node.container.value);
                    223:                                                ret = 1;
                    224:                                                goto end;
                    225:                                        }
1.1.2.2   misho     226:                                }
                    227:                        }
                    228: 
1.1.2.3   misho     229:                        if (!(ret & 32) && xr.xml_data.vallen) {
1.1.2.2   misho     230:                                if (!(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
                    231:                                        printf("GET:: data %s for node %s - not found!\n", 
1.1.2.3   misho     232:                                                        xr.xml_data.value, xr.xml_node.container.value);
1.1.2.2   misho     233:                                        ret = 1;
                    234:                                        goto end;
                    235:                                } else
                    236:                                        VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
                    237: 
                    238:                                VERB(1) printf("\n");
1.1.2.3   misho     239:                                if (!strcmp(ctx, xr.xml_data.value))
1.1.2.2   misho     240:                                        printf("DATA::1\n");
                    241:                                else
                    242:                                        printf("DATA::0\n");
                    243:                        }
                    244: 
1.1.2.3   misho     245:                        if (!(ret & 32) && xr.xml_attribute.vallen) {
                    246:                                if ((n = axl_node_num_attributes(node)) < 1) {
1.1.2.2   misho     247:                                        printf("GET:: attribute %s for node %s - not found!\n", 
1.1.2.3   misho     248:                                                        xr.xml_attribute.value, xr.xml_node.container.value);
1.1.2.2   misho     249:                                        ret = 1;
                    250:                                        goto end;
                    251:                                } else {
1.1.2.3   misho     252:                                        VERB(1) printf("Verbose:: node have %d attributes\n", n);
1.1.2.2   misho     253: 
                    254:                                        if (!(ctx = (char*) axl_node_get_attribute_value(node, xr.xml_attribute.value))) {
                    255:                                                printf("GET:: attribute %s for node %s - not found!\n", 
1.1.2.3   misho     256:                                                                xr.xml_attribute.value, xr.xml_node.container.value);
1.1.2.2   misho     257:                                                ret = 1;
                    258:                                                goto end;
                    259:                                        }
                    260: 
                    261:                                        if (xr.xml_value.vallen) {
1.1.2.3   misho     262:                                                if (!strcmp(ctx, xr.xml_value.value))
1.1.2.2   misho     263:                                                        ctx = "VALUE::1";
                    264:                                                else
                    265:                                                        ctx = "VALUE::0";
                    266:                                        }
                    267:                                }
                    268:                        } else {
1.1.2.3   misho     269:                                if (!(ret & 32) && !(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
                    270:                                        printf("GET:: data for node %s - not found!\n", xr.xml_node.container.value);
                    271:                                        ret = 1;
                    272:                                        goto end;
                    273:                                } else
                    274:                                        VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
1.1.2.2   misho     275:                        }
                    276: 
                    277:                        VERB(1) printf("\n");
                    278:                        printf("%s\n", ctx);
                    279:                        ret = 0;
                    280:                        break;
1.1.2.5   misho     281:                case 'd':
                    282:                        if (!xr.xml_namespace.vallen) {
                    283:                                if (ret == 32) {
                    284:                                        if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                    285:                                                printf("DEL:: path %s - not found!\n", xr.xml_node.path.value);
                    286:                                                ret = 1;
                    287:                                                goto end;
                    288:                                        }
                    289:                                } else {
                    290:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    291:                                                printf("DEL:: node %s - not found!\n", xr.xml_node.container.value);
                    292:                                                ret = 1;
                    293:                                                goto end;
                    294:                                        }
                    295:                                }
                    296:                        } else {
                    297:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    298:                                strlcat(str, ":", sizeof str);
                    299:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    300:                                if (ret == 32) {
                    301:                                        if (!(node = axl_doc_get(doc, str))) {
                    302:                                                printf("DEL:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    303:                                                                xr.xml_node.path.value);
                    304:                                                ret = 1;
                    305:                                                goto end;
                    306:                                        }
                    307:                                } else {
                    308:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    309:                                                printf("DEL:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    310:                                                                xr.xml_node.container.value);
                    311:                                                ret = 1;
                    312:                                                goto end;
                    313:                                        }
                    314:                                }
                    315:                        }
                    316: 
                    317:                        axl_node_remove(node, 1);
                    318:                        ret = ShowXML(doc, NULL);
                    319:                        break;
1.1.2.4   misho     320:                case 's':
1.1.2.5   misho     321:                        if (ret == 32) {
1.1.2.6   misho     322:                                if (!xr.xml_data.vallen || !(nnode = axl_node_create(xr.xml_data.value))) {
1.1.2.5   misho     323:                                        printf("SET:: container %s at path %s - Error!\n", 
                    324:                                                        xr.xml_data.value, xr.xml_node.path.value);
                    325:                                        ret = 1;
                    326:                                        goto end;
                    327:                                }
                    328:                        }
1.1.2.4   misho     329:                        if (!xr.xml_namespace.vallen) {
                    330:                                if (ret == 32) {
                    331:                                        // insert new
1.1.2.5   misho     332:                                        if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                    333:                                                printf("SET:: path %s - not found!\n", xr.xml_node.path.value);
                    334:                                                axl_node_free(nnode);
                    335:                                                ret = 1;
                    336:                                                goto end;
                    337:                                        }
1.1.2.4   misho     338:                                } else {
                    339:                                        // update old
                    340:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    341:                                                printf("SET:: node %s - not found!\n", xr.xml_node.container.value);
                    342:                                                ret = 1;
                    343:                                                goto end;
                    344:                                        }
                    345:                                }
                    346:                        } else {
                    347:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    348:                                strlcat(str, ":", sizeof str);
                    349:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    350:                                if (ret == 32) {
                    351:                                        // insert new
1.1.2.5   misho     352:                                        if (!(node = axl_doc_get(doc, str))) {
                    353:                                                printf("SET:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    354:                                                                xr.xml_node.path.value);
                    355:                                                axl_node_free(nnode);
                    356:                                                ret = 1;
                    357:                                                goto end;
                    358:                                        }
1.1.2.4   misho     359:                                } else {
                    360:                                        // update old
                    361:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    362:                                                printf("SET:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    363:                                                                xr.xml_node.container.value);
                    364:                                                ret = 1;
                    365:                                                goto end;
                    366:                                        }
                    367:                                }
                    368:                        }
                    369: 
                    370:                        if (!(ret & 32) && xr.xml_data.vallen) {
                    371:                                axl_node_set_is_empty(node, 1);
                    372:                                axl_node_set_content(node, xr.xml_data.value, xr.xml_data.vallen);
                    373:                        }
                    374:                        if (!(ret & 32) && xr.xml_attribute.vallen) {
                    375:                                axl_node_remove_attribute(node, xr.xml_attribute.value);
                    376:                                axl_node_set_attribute(node, xr.xml_attribute.value, xr.xml_value.value);
                    377:                        }
                    378: 
1.1.2.5   misho     379:                        if (ret & 32)
                    380:                                axl_node_set_child(node, nnode);
                    381:                        ret = ShowXML(doc, NULL);
                    382:                        break;
1.1.2.8   misho     383:                case 'l':
                    384:                        if (!xr.xml_namespace.vallen) {
                    385:                                if (ret == 32) {
                    386:                                        if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                    387:                                                printf("DEL:: path %s - not found!\n", xr.xml_node.path.value);
                    388:                                                ret = 1;
                    389:                                                goto end;
                    390:                                        }
                    391:                                } else {
                    392:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    393:                                                printf("DEL:: node %s - not found!\n", xr.xml_node.container.value);
                    394:                                                ret = 1;
                    395:                                                goto end;
                    396:                                        }
                    397:                                }
                    398:                        } else {
                    399:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    400:                                strlcat(str, ":", sizeof str);
                    401:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    402:                                if (ret == 32) {
                    403:                                        if (!(node = axl_doc_get(doc, str))) {
                    404:                                                printf("DEL:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    405:                                                                xr.xml_node.path.value);
                    406:                                                ret = 1;
                    407:                                                goto end;
                    408:                                        }
                    409:                                } else {
                    410:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    411:                                                printf("DEL:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    412:                                                                xr.xml_node.container.value);
                    413:                                                ret = 1;
                    414:                                                goto end;
                    415:                                        }
                    416:                                }
                    417:                        }
                    418: 
                    419:                        ret = ShowItem(node, 0);
                    420:                        break;
1.1.2.2   misho     421:                default:
1.1.2.5   misho     422:                        ret = ShowXML(doc, xr.xml_data.vallen ? xr.xml_data.value : NULL);
1.1.2.2   misho     423:        }
                    424: end:
                    425:        axl_doc_free(doc);
                    426:        axl_end();
                    427:        return ret;
1.1.2.1   misho     428: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>