File:  [ELWIX - Embedded LightWeight unIX -] / embedtools / src / Attic / xmler.c
Revision 1.1.2.8: download - view: text, annotated - select for diffs - revision graph
Wed Sep 29 15:32:33 2010 UTC (13 years, 9 months ago) by misho
Branches: tools1_0
add list node like for execution or CLI ;)
GOOD ...

/*************************************************************************
 * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
 *  by Michael Pounov <misho@aitbg.com>
 *
 * $Author: misho $
 * $Id: xmler.c,v 1.1.2.8 2010/09/29 15:32:33 misho Exp $
 *
 *************************************************************************/
#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
main(int argc, char **argv)
{
	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("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;
					}
				}
			}

			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;
}

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