Add a generic binary protocol configuration file analyser that outputs the relevant parts of a generic binary protocol configuration
This commit is contained in:
parent
40d2925126
commit
b03ac3497b
2 changed files with 131 additions and 4 deletions
|
@ -4,18 +4,26 @@ noinst_LIBRARIES = libxmlconf.a
|
|||
|
||||
libxmlconf_a_SOURCES = xml_cache.c xml.c
|
||||
|
||||
noinst_PROGRAMS = testxml printxml xmlgrep
|
||||
noinst_PROGRAMS = \
|
||||
testxml \
|
||||
printxml \
|
||||
xmlgrep \
|
||||
printtree \
|
||||
generic_config_analyse
|
||||
|
||||
testxml_SOURCES = testxml.c
|
||||
testxml_LDADD = libxmlconf.a
|
||||
|
||||
printxml_SOURCES = $(xml_SOURCE) printxml.c
|
||||
printxml_SOURCES = printxml.c
|
||||
printxml_LDADD = libxmlconf.a
|
||||
|
||||
printtree_SOURCES = $(xml_SOURCE) printtree.c
|
||||
printtree_SOURCES = printtree.c
|
||||
printtree_LDADD = libxmlconf.a
|
||||
|
||||
xmlgrep_SOURCES = $(xml_SOURCE) xmlgrep.c xml.c xml.h
|
||||
xmlgrep_SOURCES = xmlgrep.c
|
||||
xmlgrep_LDADD = libxmlconf.a
|
||||
|
||||
generic_config_analyse_SOURCES = generic-config-analyse.c
|
||||
generic_config_analyse_LDADD = libxmlconf.a
|
||||
|
||||
INCLUDES = -DSRC_DIR=\"$(top_srcdir)/utils/xmlgrep\" -DXML_USE_NODECACHE
|
||||
|
|
119
utils/xmlgrep/generic-config-analyse.c
Normal file
119
utils/xmlgrep/generic-config-analyse.c
Normal file
|
@ -0,0 +1,119 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <strings.h>
|
||||
#include <malloc.h>
|
||||
#include <assert.h>
|
||||
#include "xml.h"
|
||||
|
||||
#define ROOTNODE "/PropertyList/generic"
|
||||
#define BUFLEN 4096
|
||||
|
||||
#define PRINT_ERROR_AND_EXIT(id) \
|
||||
if (xmlErrorGetNo(id, 0) != XML_NO_ERROR) { \
|
||||
const char *errstr = xmlErrorGetString(id, 0); \
|
||||
size_t column = xmlErrorGetColumnNo(id, 0); \
|
||||
size_t lineno = xmlErrorGetLineNo(id, 1); \
|
||||
printf("Error at line %i, column %i: %s\n", lineno, column, errstr); \
|
||||
exit(-1); \
|
||||
}
|
||||
|
||||
void print_binary_protocol(void *, char *, char *);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
void *root_id, *protocol_id = 0;
|
||||
char *filename;
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
printf("Usage: %s <filename>\n", argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
filename = argv[1];
|
||||
root_id = xmlOpen(filename);
|
||||
if (root_id) protocol_id = xmlNodeGet(root_id, ROOTNODE);
|
||||
|
||||
if (protocol_id)
|
||||
{
|
||||
void *dir_id;
|
||||
|
||||
dir_id = xmlNodeGet(protocol_id, "input");
|
||||
if (dir_id)
|
||||
{
|
||||
if (!xmlNodeCompareString(dir_id, "binary_mode", "true")) {
|
||||
print_binary_protocol(dir_id, filename, "input");
|
||||
} else {
|
||||
printf("Only binary mode support is implemented at the moment.\n");
|
||||
}
|
||||
free(dir_id);
|
||||
}
|
||||
|
||||
dir_id = xmlNodeGet(protocol_id, "output");
|
||||
if (dir_id)
|
||||
{
|
||||
if (!xmlNodeCompareString(dir_id, "binary_mode", "true")) {
|
||||
print_binary_protocol(dir_id, filename, "output");
|
||||
} else {
|
||||
printf("Only binary mode support is implemented at the moment.\n");
|
||||
}
|
||||
free(dir_id);
|
||||
}
|
||||
|
||||
free(protocol_id);
|
||||
}
|
||||
|
||||
if (root_id)
|
||||
{
|
||||
xmlClose(root_id);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void print_binary_protocol(void *id, char *filename, char *dir)
|
||||
{
|
||||
unsigned int i, num, pos = 0;
|
||||
void *xid;
|
||||
|
||||
printf("\n%s\n", filename);
|
||||
printf("Generic binary %s protocol packet descriptopn:\n\n", dir);
|
||||
printf(" pos | size | type | factor | description\n");
|
||||
printf("-----|------|--------|------------|------------------------\n");
|
||||
xid = xmlMarkId(id);
|
||||
num = xmlNodeGetNum(xid, "chunk");
|
||||
for (i=0; i<num; i++)
|
||||
{
|
||||
if (xmlNodeGetPos(id, xid, "chunk", i) != 0)
|
||||
{
|
||||
char factor[11];
|
||||
char *name, *type;
|
||||
int size;
|
||||
|
||||
type = xmlNodeGetString(xid, "type");
|
||||
if (!strcasecmp(type, "bool")) {
|
||||
size = 1;
|
||||
} else if (!strcasecmp(type, "float")) {
|
||||
size = 4;
|
||||
} else if (!strcasecmp(type, "double")) {
|
||||
size = 8;
|
||||
} else { /* defaults to integer */
|
||||
size = 4;
|
||||
}
|
||||
|
||||
xmlNodeCopyString(xid, "factor", (char *)factor, 10);
|
||||
name = xmlNodeGetString(xid, "name");
|
||||
|
||||
printf("%4i | %4i | %6s | %10s | %s\n", pos, size, type, factor?factor:"", name);
|
||||
pos += size;
|
||||
|
||||
free(type);
|
||||
free(name);
|
||||
}
|
||||
}
|
||||
|
||||
printf("\ntotal package size: %i bytes\n\n", pos);
|
||||
free(xid);
|
||||
}
|
Loading…
Add table
Reference in a new issue