Diff for /embedtools/src/Attic/xmler.c between versions 1.1.2.1 and 1.1.2.10

version 1.1.2.1, 2010/09/27 10:51:01 version 1.1.2.10, 2010/09/29 16:51:14
Line 1 Line 1
   /*************************************************************************
    * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
    *  by Michael Pounov <misho@aitbg.com>
    *
    * $Author$
    * $Id$
    *
    *************************************************************************/
 #include "global.h"  #include "global.h"
   #include <axl.h>
   #include <axl_ns.h>
   #include <axl_decl.h>
   #include "xmler.h"
   
   
   int Verbose;
   extern char compiled[], compiledby[], compilehost[];
   
   
   static void
   Usage()
   {
   
           printf( "XMLer is tool for managment R/W operation with XMLs\n"
                   "=== %s === %s@%s ===\n\n"
                   "  Syntax: xmler [options] <file.xml> [data]\n\n"
                   "\t-v\t\tVerbose ...\n"
                   "\t-l <av_pair>\tList node\n"
                   "\t-d <av_pair>\tDelete node\n"
                   "\t-s <av_pair>\tSet node command\n"
                   "\t-g <av_pair>\tGet node command\n"
                   "*\"av_pair\" format: [ns:]node[[|attribute[=value]]?data]\n"
                   "\n", compiled, compiledby, compilehost);
   }
   
   static int
   ShowXML(axlDoc *doc, const char *csNode)
   {
           axlNode *node = NULL;
           int ctxlen;
           char *ctx = NULL;
   
           if (csNode) {
                   if (!(node = axl_doc_find_called(doc, csNode))) {
                           printf("GET:: node %s - not found!\n", csNode);
                           return 1;
                   }
   
                   axl_node_dump_pretty(node, &ctx, &ctxlen, 4);
                   VERB(1) printf("Verbose:: Node length=%d\n", ctxlen);
           } else {
                   axl_doc_dump_pretty(doc, &ctx, &ctxlen, 4);
                   VERB(1) printf("Verbose:: Document length=%d\n", ctxlen);
           }
   
           VERB(1) printf("\n");
           if (ctx) {
                   printf("%s", ctx);
                   free(ctx);
           }
           VERB(1) printf("\n");
           return 0;
   }
   
   static int
   ShowItem(axlNode *node, int lvl)
   {
           register int i;
           int ctxlen;
           axlNode *child;
   
           for (i = 0; i < axl_node_get_child_num(node); i++) {
                   child = axl_node_get_child_nth(node, i);
   
                   if (!lvl)
                           printf("%s %s \"%s\"", axl_node_get_name(node), axl_node_get_name(child), 
                                           axl_node_get_content(child, &ctxlen));
                   else
                           printf(" %s \"%s\"", axl_node_get_name(child), axl_node_get_content(child, &ctxlen));
   
                   ShowItem(child, 1);
   
                   if (!lvl)
                           printf("\n");
           }
   
           return 0;
   }
   
 int  int
 main(int argc, char **argv)  main(int argc, char **argv)
 {  {
        return 0;        char ch, str[STRSIZ], szName[MAXPATHLEN], *ctx = NULL, m = 0;
         int ctxlen, n, ret = 0;
         axlDoc *doc = NULL;
         axlError *err = NULL;
         axlNode *nnode = NULL, *node = NULL;
         struct tagReqXML xr;
 
         memset(str, 0, STRSIZ);
         memset(&xr, 0, sizeof xr);
         while ((ch = getopt(argc, argv, "hvl:s:g:d:")) != -1)
                 switch (ch) {
                         case 'v':
                                 Verbose++;
                                 break;
                         case 'l':
                                 if (m) {
                                         Usage();
                                         return 1;
                                 } else
                                         m = 'l';
                                 strlcpy(str, optarg, STRSIZ);
                                 if ((ret = ioXMLGet(str, &xr)) < 1) {
                                         printf("Error:: in XML request %s\n", str);
                                         return 1;
                                 }
                                 VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                                 break;
                         case 'd':
                                 if (m) {
                                         Usage();
                                         return 1;
                                 } else
                                         m = 'd';
                                 strlcpy(str, optarg, STRSIZ);
                                 if ((ret = ioXMLGet(str, &xr)) < 1) {
                                         printf("Error:: in XML request %s\n", str);
                                         return 1;
                                 }
                                 VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                                 break;
                         case 's':
                                 if (m) {
                                         Usage();
                                         return 1;
                                 } else
                                         m = 's';
                                 strlcpy(str, optarg, STRSIZ);
                                 if ((ret = ioXMLGet(str, &xr)) < 1) {
                                         printf("Error:: in XML request %s\n", str);
                                         return 1;
                                 }
                                 VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                                 break;
                         case 'g':
                                 if (m) {
                                         Usage();
                                         return 1;
                                 } else
                                         m = 'g';
                                 strlcpy(str, optarg, STRSIZ);
                                 if ((ret = ioXMLGet(str, &xr)) < 1) {
                                         printf("Error:: in XML request %s\n", str);
                                         return 1;
                                 }
                                 VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
                                 break;
                         case 'h':
                         default:
                                 Usage();
                                 return 1;
                 }
         argc -= optind;
         argv += optind;
         if (!argc) {
                 Usage();
                 return 1;
         } else
                 strlcpy(szName, *argv, MAXPATHLEN);
         if (argc > 1 && argv[1]) {
                 xr.xml_data.value = argv[1];
                 xr.xml_data.vallen = strlen(argv[1]);
         }
 
         axl_init();
         if (!(doc = axl_doc_parse_from_file(szName, &err))) {
                 printf("Error:: xml file %s #%d - %s\n", szName, 
                                 axl_error_get_code(err), axl_error_get(err));
                 axl_error_free(err);
                 axl_end();
                 return 2;
         }
         if (!axl_ns_doc_validate(doc, &err)) {
                 printf("Error:: xml file %s namespace validation #%d - %s\n", szName, 
                                 axl_error_get_code(err), axl_error_get(err));
                 axl_error_free(err);
                 axl_end();
                 return 2;
         }
 
         switch (m) {
                 case 'g':
                         if (!xr.xml_namespace.vallen) {
                                 if (ret == 32) {
                                         if (!(ctx = (char*) axl_doc_get_content_at(doc, xr.xml_node.path.value, &ctxlen))) {
                                                 printf("GET:: path %s - not found!\n", xr.xml_node.path.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                                                 printf("GET:: node %s - not found!\n", xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         } else {
                                 strlcpy(str, xr.xml_namespace.value, sizeof str);
                                 strlcat(str, ":", sizeof str);
                                 strlcat(str, xr.xml_node.container.value, sizeof str);
                                 if (ret == 32) {
                                         if (!(ctx = (char*) axl_doc_get_content_at(doc, str, &ctxlen))) {
                                                 printf("GET:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.path.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         if (!(node = axl_doc_find_called(doc, str))) {
                                                 printf("GET:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         }
 
                         if (!(ret & 32) && xr.xml_data.vallen) {
                                 if (!(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
                                         printf("GET:: data %s for node %s - not found!\n", 
                                                         xr.xml_data.value, xr.xml_node.container.value);
                                         ret = 1;
                                         goto end;
                                 } else
                                         VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
 
                                 VERB(1) printf("\n");
                                 if (!strcmp(ctx, xr.xml_data.value))
                                         printf("DATA::1\n");
                                 else
                                         printf("DATA::0\n");
                         }
 
                         if (!(ret & 32) && xr.xml_attribute.vallen) {
                                 if ((n = axl_node_num_attributes(node)) < 1) {
                                         printf("GET:: attribute %s for node %s - not found!\n", 
                                                         xr.xml_attribute.value, xr.xml_node.container.value);
                                         ret = 1;
                                         goto end;
                                 } else {
                                         VERB(1) printf("Verbose:: node have %d attributes\n", n);
 
                                         if (!(ctx = (char*) axl_node_get_attribute_value(node, xr.xml_attribute.value))) {
                                                 printf("GET:: attribute %s for node %s - not found!\n", 
                                                                 xr.xml_attribute.value, xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
 
                                         if (xr.xml_value.vallen) {
                                                 if (!strcmp(ctx, xr.xml_value.value))
                                                         ctx = "VALUE::1";
                                                 else
                                                         ctx = "VALUE::0";
                                         }
                                 }
                         } else {
                                 if (!(ret & 32) && !(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
                                         printf("GET:: data for node %s - not found!\n", xr.xml_node.container.value);
                                         ret = 1;
                                         goto end;
                                 } else
                                         VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
                         }
 
                         VERB(1) printf("\n");
                         printf("%s\n", ctx);
                         ret = 0;
                         break;
                 case 'd':
                         if (!xr.xml_namespace.vallen) {
                                 if (ret == 32) {
                                         if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                                                 printf("DEL:: path %s - not found!\n", xr.xml_node.path.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                                                 printf("DEL:: node %s - not found!\n", xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         } else {
                                 strlcpy(str, xr.xml_namespace.value, sizeof str);
                                 strlcat(str, ":", sizeof str);
                                 strlcat(str, xr.xml_node.container.value, sizeof str);
                                 if (ret == 32) {
                                         if (!(node = axl_doc_get(doc, str))) {
                                                 printf("DEL:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.path.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         if (!(node = axl_doc_find_called(doc, str))) {
                                                 printf("DEL:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         }
 
                         axl_node_remove(node, 1);
                         ret = ShowXML(doc, NULL);
                         break;
                 case 's':
                         if (ret == 32) {
                                 if (!xr.xml_data.vallen || !(nnode = axl_node_create(xr.xml_data.value))) {
                                         printf("SET:: container %s at path %s - Error!\n", 
                                                         xr.xml_data.value, xr.xml_node.path.value);
                                         ret = 1;
                                         goto end;
                                 }
                         }
                         if (!xr.xml_namespace.vallen) {
                                 if (ret == 32) {
                                         // insert new
                                         if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                                                 printf("SET:: path %s - not found!\n", xr.xml_node.path.value);
                                                 axl_node_free(nnode);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         // update old
                                         if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                                                 printf("SET:: node %s - not found!\n", xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         } else {
                                 strlcpy(str, xr.xml_namespace.value, sizeof str);
                                 strlcat(str, ":", sizeof str);
                                 strlcat(str, xr.xml_node.container.value, sizeof str);
                                 if (ret == 32) {
                                         // insert new
                                         if (!(node = axl_doc_get(doc, str))) {
                                                 printf("SET:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.path.value);
                                                 axl_node_free(nnode);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         // update old
                                         if (!(node = axl_doc_find_called(doc, str))) {
                                                 printf("SET:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         }
 
                         if (!(ret & 32) && xr.xml_data.vallen) {
                                 axl_node_set_is_empty(node, 1);
                                 axl_node_set_content(node, xr.xml_data.value, xr.xml_data.vallen);
                         }
                         if (!(ret & 32) && xr.xml_attribute.vallen) {
                                 axl_node_remove_attribute(node, xr.xml_attribute.value);
                                 axl_node_set_attribute(node, xr.xml_attribute.value, xr.xml_value.value);
                         }
 
                         if (ret & 32)
                                 axl_node_set_child(node, nnode);
                         ret = ShowXML(doc, NULL);
                         break;
                 case 'l':
                         if (!xr.xml_namespace.vallen) {
                                 if (ret == 32) {
                                         if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
                                                 printf("LST:: path %s - not found!\n", xr.xml_node.path.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
                                                 printf("LST:: node %s - not found!\n", xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         } else {
                                 strlcpy(str, xr.xml_namespace.value, sizeof str);
                                 strlcat(str, ":", sizeof str);
                                 strlcat(str, xr.xml_node.container.value, sizeof str);
                                 if (ret == 32) {
                                         if (!(node = axl_doc_get(doc, str))) {
                                                 printf("LST:: path %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.path.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 } else {
                                         if (!(node = axl_doc_find_called(doc, str))) {
                                                 printf("LST:: node %s:%s - not found!\n", xr.xml_namespace.value, 
                                                                 xr.xml_node.container.value);
                                                 ret = 1;
                                                 goto end;
                                         }
                                 }
                         }
 
                         ret = ShowItem(node, 0);
                         break;
                 default:
                         ret = ShowXML(doc, xr.xml_data.vallen ? xr.xml_data.value : NULL);
         }
 end:
         axl_doc_free(doc);
         axl_end();
         return ret;
 }  }

Removed from v.1.1.2.1  
changed lines
  Added in v.1.1.2.10


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