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

1.2       misho       1: /*************************************************************************
                      2:  * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
                      3:  *  by Michael Pounov <misho@aitbg.com>
                      4:  *
                      5:  * $Author: misho $
1.2.2.3 ! misho       6:  * $Id: xmler.c,v 1.2.2.2 2011/06/13 20:23:35 misho Exp $
1.2       misho       7:  *
1.2.2.2   misho       8:  *************************************************************************
                      9: The ELWIX and AITNET software is distributed under the following
                     10: terms:
                     11: 
                     12: All of the documentation and software included in the ELWIX and AITNET
                     13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
                     14: 
                     15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
                     16:        by Michael Pounov <misho@elwix.org>.  All rights reserved.
                     17: 
                     18: Redistribution and use in source and binary forms, with or without
                     19: modification, are permitted provided that the following conditions
                     20: are met:
                     21: 1. Redistributions of source code must retain the above copyright
                     22:    notice, this list of conditions and the following disclaimer.
                     23: 2. Redistributions in binary form must reproduce the above copyright
                     24:    notice, this list of conditions and the following disclaimer in the
                     25:    documentation and/or other materials provided with the distribution.
                     26: 3. All advertising materials mentioning features or use of this software
                     27:    must display the following acknowledgement:
                     28: This product includes software developed by Michael Pounov <misho@elwix.org>
                     29: ELWIX - Embedded LightWeight unIX and its contributors.
                     30: 4. Neither the name of AITNET nor the names of its contributors
                     31:    may be used to endorse or promote products derived from this software
                     32:    without specific prior written permission.
                     33: 
                     34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
                     35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     44: SUCH DAMAGE.
                     45: */
1.2       misho      46: #include "global.h"
                     47: #include <axl.h>
                     48: #include <axl_ns.h>
                     49: #include <axl_decl.h>
                     50: 
                     51: 
                     52: int Verbose;
                     53: extern char compiled[], compiledby[], compilehost[];
                     54: 
                     55: 
                     56: static void
                     57: Usage()
                     58: {
                     59: 
                     60:        printf( "XMLer is tool for managment R/W operation with XMLs\n"
                     61:                "=== %s === %s@%s ===\n\n"
                     62:                "  Syntax: xmler [options] <file.xml> [data]\n\n"
                     63:                "\t-v\t\tVerbose ...\n"
                     64:                "\t-l <av_pair>\tList node\n"
                     65:                "\t-d <av_pair>\tDelete node\n"
                     66:                "\t-s <av_pair>\tSet node command\n"
                     67:                "\t-g <av_pair>\tGet node command\n"
                     68:                "*\"av_pair\" format: [ns:]node[[|attribute[=value]]?data]\n"
                     69:                "\n", compiled, compiledby, compilehost);
                     70: }
                     71: 
                     72: static int
                     73: ShowXML(axlDoc *doc, const char *csNode)
                     74: {
                     75:        axlNode *node = NULL;
                     76:        int ctxlen;
                     77:        char *ctx = NULL;
                     78: 
                     79:        if (csNode) {
                     80:                if (!(node = axl_doc_find_called(doc, csNode))) {
                     81:                        printf("GET:: node %s - not found!\n", csNode);
                     82:                        return 1;
                     83:                }
                     84: 
                     85:                axl_node_dump_pretty(node, &ctx, &ctxlen, 4);
                     86:                VERB(1) printf("Verbose:: Node length=%d\n", ctxlen);
                     87:        } else {
                     88:                axl_doc_dump_pretty(doc, &ctx, &ctxlen, 4);
                     89:                VERB(1) printf("Verbose:: Document length=%d\n", ctxlen);
                     90:        }
                     91: 
                     92:        VERB(1) printf("\n");
                     93:        if (ctx) {
                     94:                printf("%s", ctx);
                     95:                free(ctx);
                     96:        }
                     97:        VERB(1) printf("\n");
                     98:        return 0;
                     99: }
                    100: 
                    101: static int
                    102: ShowItem(axlNode *node, int lvl)
                    103: {
                    104:        register int i;
                    105:        int ctxlen;
                    106:        axlNode *child;
                    107: 
                    108:        for (i = 0; i < axl_node_get_child_num(node); i++) {
                    109:                child = axl_node_get_child_nth(node, i);
                    110: 
                    111:                if (!lvl)
                    112:                        printf("%s %s \"%s\"", axl_node_get_name(node), axl_node_get_name(child), 
                    113:                                        axl_node_get_content(child, &ctxlen));
                    114:                else
                    115:                        printf(" %s \"%s\"", axl_node_get_name(child), axl_node_get_content(child, &ctxlen));
                    116: 
                    117:                ShowItem(child, 1);
                    118: 
                    119:                if (!lvl)
                    120:                        printf("\n");
                    121:        }
                    122: 
                    123:        return 0;
                    124: }
                    125: 
                    126: int
                    127: main(int argc, char **argv)
                    128: {
                    129:        char ch, str[STRSIZ], szName[MAXPATHLEN], *ctx = NULL, m = 0;
                    130:        int ctxlen, n, ret = 0;
                    131:        axlDoc *doc = NULL;
                    132:        axlError *err = NULL;
                    133:        axlNode *nnode = NULL, *node = NULL;
                    134:        struct tagReqXML xr;
                    135: 
                    136:        memset(str, 0, STRSIZ);
                    137:        memset(&xr, 0, sizeof xr);
                    138:        while ((ch = getopt(argc, argv, "hvl:s:g:d:")) != -1)
                    139:                switch (ch) {
                    140:                        case 'v':
                    141:                                Verbose++;
                    142:                                break;
                    143:                        case 'l':
                    144:                                if (m) {
                    145:                                        Usage();
                    146:                                        return 1;
                    147:                                } else
                    148:                                        m = 'l';
                    149:                                strlcpy(str, optarg, STRSIZ);
1.2.2.3 ! misho     150:                                if ((ret = www_XMLGet(str, &xr)) < 1) {
1.2       misho     151:                                        printf("Error:: in XML request %s\n", str);
                    152:                                        return 1;
                    153:                                }
                    154:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    155:                                break;
                    156:                        case 'd':
                    157:                                if (m) {
                    158:                                        Usage();
                    159:                                        return 1;
                    160:                                } else
                    161:                                        m = 'd';
                    162:                                strlcpy(str, optarg, STRSIZ);
1.2.2.3 ! misho     163:                                if ((ret = www_XMLGet(str, &xr)) < 1) {
1.2       misho     164:                                        printf("Error:: in XML request %s\n", str);
                    165:                                        return 1;
                    166:                                }
                    167:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    168:                                break;
                    169:                        case 's':
                    170:                                if (m) {
                    171:                                        Usage();
                    172:                                        return 1;
                    173:                                } else
                    174:                                        m = 's';
                    175:                                strlcpy(str, optarg, STRSIZ);
1.2.2.3 ! misho     176:                                if ((ret = www_XMLGet(str, &xr)) < 1) {
1.2       misho     177:                                        printf("Error:: in XML request %s\n", str);
                    178:                                        return 1;
                    179:                                }
                    180:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    181:                                break;
                    182:                        case 'g':
                    183:                                if (m) {
                    184:                                        Usage();
                    185:                                        return 1;
                    186:                                } else
                    187:                                        m = 'g';
                    188:                                strlcpy(str, optarg, STRSIZ);
1.2.2.3 ! misho     189:                                if ((ret = www_XMLGet(str, &xr)) < 1) {
1.2       misho     190:                                        printf("Error:: in XML request %s\n", str);
                    191:                                        return 1;
                    192:                                }
                    193:                                VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                    194:                                break;
                    195:                        case 'h':
                    196:                        default:
                    197:                                Usage();
                    198:                                return 1;
                    199:                }
                    200:        argc -= optind;
                    201:        argv += optind;
                    202:        if (!argc) {
                    203:                Usage();
                    204:                return 1;
                    205:        } else
                    206:                strlcpy(szName, *argv, MAXPATHLEN);
                    207:        if (argc > 1 && argv[1]) {
                    208:                xr.xml_data.value = argv[1];
                    209:                xr.xml_data.vallen = strlen(argv[1]);
                    210:        }
                    211: 
                    212:        axl_init();
                    213:        if (!(doc = axl_doc_parse_from_file(szName, &err))) {
                    214:                printf("Error:: xml file %s #%d - %s\n", szName, 
                    215:                                axl_error_get_code(err), axl_error_get(err));
                    216:                axl_error_free(err);
                    217:                axl_end();
                    218:                return 2;
                    219:        }
                    220:        if (!axl_ns_doc_validate(doc, &err)) {
                    221:                printf("Error:: xml file %s namespace validation #%d - %s\n", szName, 
                    222:                                axl_error_get_code(err), axl_error_get(err));
                    223:                axl_error_free(err);
                    224:                axl_end();
                    225:                return 2;
                    226:        }
                    227: 
                    228:        switch (m) {
                    229:                case 'g':
                    230:                        if (!xr.xml_namespace.vallen) {
                    231:                                if (ret == 32) {
                    232:                                        if (!(ctx = (char*) axl_doc_get_content_at(doc, xr.xml_node.path.value, &ctxlen))) {
                    233:                                                printf("GET:: path %s - not found!\n", xr.xml_node.path.value);
                    234:                                                ret = 1;
                    235:                                                goto end;
                    236:                                        }
                    237:                                } else {
                    238:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    239:                                                printf("GET:: node %s - not found!\n", xr.xml_node.container.value);
                    240:                                                ret = 1;
                    241:                                                goto end;
                    242:                                        }
                    243:                                }
                    244:                        } else {
                    245:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    246:                                strlcat(str, ":", sizeof str);
                    247:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    248:                                if (ret == 32) {
                    249:                                        if (!(ctx = (char*) axl_doc_get_content_at(doc, str, &ctxlen))) {
                    250:                                                printf("GET:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    251:                                                                xr.xml_node.path.value);
                    252:                                                ret = 1;
                    253:                                                goto end;
                    254:                                        }
                    255:                                } else {
                    256:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    257:                                                printf("GET:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    258:                                                                xr.xml_node.container.value);
                    259:                                                ret = 1;
                    260:                                                goto end;
                    261:                                        }
                    262:                                }
                    263:                        }
                    264: 
                    265:                        if (!(ret & 32) && xr.xml_data.vallen) {
                    266:                                if (!(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
                    267:                                        printf("GET:: data %s for node %s - not found!\n", 
                    268:                                                        xr.xml_data.value, xr.xml_node.container.value);
                    269:                                        ret = 1;
                    270:                                        goto end;
                    271:                                } else
                    272:                                        VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
                    273: 
                    274:                                VERB(1) printf("\n");
                    275:                                if (!strcmp(ctx, xr.xml_data.value))
                    276:                                        printf("DATA::1\n");
                    277:                                else
                    278:                                        printf("DATA::0\n");
                    279:                        }
                    280: 
                    281:                        if (!(ret & 32) && xr.xml_attribute.vallen) {
                    282:                                if ((n = axl_node_num_attributes(node)) < 1) {
                    283:                                        printf("GET:: attribute %s for node %s - not found!\n", 
                    284:                                                        xr.xml_attribute.value, xr.xml_node.container.value);
                    285:                                        ret = 1;
                    286:                                        goto end;
                    287:                                } else {
                    288:                                        VERB(1) printf("Verbose:: node have %d attributes\n", n);
                    289: 
                    290:                                        if (!(ctx = (char*) axl_node_get_attribute_value(node, xr.xml_attribute.value))) {
                    291:                                                printf("GET:: attribute %s for node %s - not found!\n", 
                    292:                                                                xr.xml_attribute.value, xr.xml_node.container.value);
                    293:                                                ret = 1;
                    294:                                                goto end;
                    295:                                        }
                    296: 
                    297:                                        if (xr.xml_value.vallen) {
                    298:                                                if (!strcmp(ctx, xr.xml_value.value))
                    299:                                                        ctx = "VALUE::1";
                    300:                                                else
                    301:                                                        ctx = "VALUE::0";
                    302:                                        }
                    303:                                }
                    304:                        } else {
                    305:                                if (!(ret & 32) && !(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
                    306:                                        printf("GET:: data for node %s - not found!\n", xr.xml_node.container.value);
                    307:                                        ret = 1;
                    308:                                        goto end;
                    309:                                } else
                    310:                                        VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
                    311:                        }
                    312: 
                    313:                        VERB(1) printf("\n");
                    314:                        printf("%s\n", ctx);
                    315:                        ret = 0;
                    316:                        break;
                    317:                case 'd':
                    318:                        if (!xr.xml_namespace.vallen) {
                    319:                                if (ret == 32) {
                    320:                                        if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                    321:                                                printf("DEL:: path %s - not found!\n", xr.xml_node.path.value);
                    322:                                                ret = 1;
                    323:                                                goto end;
                    324:                                        }
                    325:                                } else {
                    326:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    327:                                                printf("DEL:: node %s - not found!\n", xr.xml_node.container.value);
                    328:                                                ret = 1;
                    329:                                                goto end;
                    330:                                        }
                    331:                                }
                    332:                        } else {
                    333:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    334:                                strlcat(str, ":", sizeof str);
                    335:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    336:                                if (ret == 32) {
                    337:                                        if (!(node = axl_doc_get(doc, str))) {
                    338:                                                printf("DEL:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    339:                                                                xr.xml_node.path.value);
                    340:                                                ret = 1;
                    341:                                                goto end;
                    342:                                        }
                    343:                                } else {
                    344:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    345:                                                printf("DEL:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    346:                                                                xr.xml_node.container.value);
                    347:                                                ret = 1;
                    348:                                                goto end;
                    349:                                        }
                    350:                                }
                    351:                        }
                    352: 
                    353:                        axl_node_remove(node, 1);
                    354:                        ret = ShowXML(doc, NULL);
                    355:                        break;
                    356:                case 's':
                    357:                        if (ret == 32) {
                    358:                                if (!xr.xml_data.vallen || !(nnode = axl_node_create(xr.xml_data.value))) {
                    359:                                        printf("SET:: container %s at path %s - Error!\n", 
                    360:                                                        xr.xml_data.value, xr.xml_node.path.value);
                    361:                                        ret = 1;
                    362:                                        goto end;
                    363:                                }
                    364:                        }
                    365:                        if (!xr.xml_namespace.vallen) {
                    366:                                if (ret == 32) {
                    367:                                        // insert new
                    368:                                        if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                    369:                                                printf("SET:: path %s - not found!\n", xr.xml_node.path.value);
                    370:                                                axl_node_free(nnode);
                    371:                                                ret = 1;
                    372:                                                goto end;
                    373:                                        }
                    374:                                } else {
                    375:                                        // update old
                    376:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    377:                                                printf("SET:: node %s - not found!\n", xr.xml_node.container.value);
                    378:                                                ret = 1;
                    379:                                                goto end;
                    380:                                        }
                    381:                                }
                    382:                        } else {
                    383:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    384:                                strlcat(str, ":", sizeof str);
                    385:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    386:                                if (ret == 32) {
                    387:                                        // insert new
                    388:                                        if (!(node = axl_doc_get(doc, str))) {
                    389:                                                printf("SET:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    390:                                                                xr.xml_node.path.value);
                    391:                                                axl_node_free(nnode);
                    392:                                                ret = 1;
                    393:                                                goto end;
                    394:                                        }
                    395:                                } else {
                    396:                                        // update old
                    397:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    398:                                                printf("SET:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    399:                                                                xr.xml_node.container.value);
                    400:                                                ret = 1;
                    401:                                                goto end;
                    402:                                        }
                    403:                                }
                    404:                        }
                    405: 
                    406:                        if (!(ret & 32) && xr.xml_data.vallen) {
                    407:                                axl_node_set_is_empty(node, 1);
                    408:                                axl_node_set_content(node, xr.xml_data.value, xr.xml_data.vallen);
                    409:                        }
                    410:                        if (!(ret & 32) && xr.xml_attribute.vallen) {
                    411:                                axl_node_remove_attribute(node, xr.xml_attribute.value);
                    412:                                axl_node_set_attribute(node, xr.xml_attribute.value, xr.xml_value.value);
                    413:                        }
                    414: 
                    415:                        if (ret & 32)
                    416:                                axl_node_set_child(node, nnode);
                    417:                        ret = ShowXML(doc, NULL);
                    418:                        break;
                    419:                case 'l':
                    420:                        if (!xr.xml_namespace.vallen) {
                    421:                                if (ret == 32) {
                    422:                                        if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                    423:                                                printf("LST:: path %s - not found!\n", xr.xml_node.path.value);
                    424:                                                ret = 1;
                    425:                                                goto end;
                    426:                                        }
                    427:                                } else {
                    428:                                        if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                    429:                                                printf("LST:: node %s - not found!\n", xr.xml_node.container.value);
                    430:                                                ret = 1;
                    431:                                                goto end;
                    432:                                        }
                    433:                                }
                    434:                        } else {
                    435:                                strlcpy(str, xr.xml_namespace.value, sizeof str);
                    436:                                strlcat(str, ":", sizeof str);
                    437:                                strlcat(str, xr.xml_node.container.value, sizeof str);
                    438:                                if (ret == 32) {
                    439:                                        if (!(node = axl_doc_get(doc, str))) {
                    440:                                                printf("LST:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                    441:                                                                xr.xml_node.path.value);
                    442:                                                ret = 1;
                    443:                                                goto end;
                    444:                                        }
                    445:                                } else {
                    446:                                        if (!(node = axl_doc_find_called(doc, str))) {
                    447:                                                printf("LST:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                    448:                                                                xr.xml_node.container.value);
                    449:                                                ret = 1;
                    450:                                                goto end;
                    451:                                        }
                    452:                                }
                    453:                        }
                    454: 
                    455:                        ret = ShowItem(node, 0);
                    456:                        break;
                    457:                default:
                    458:                        ret = ShowXML(doc, xr.xml_data.vallen ? xr.xml_data.value : NULL);
                    459:        }
                    460: end:
                    461:        axl_doc_free(doc);
                    462:        axl_end();
                    463:        return ret;
                    464: }

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