#include <stdio.h>
#define _GNU_SOURCE
+#include <stdlib.h>
#include <string.h>
#ifndef _MSC_VER
# include <strings.h>
+# include <unistd.h> /* read */
#else
# define strncasecmp strnicmp
# include <stdlib.h>
+# include <io.h>
#endif
#include <assert.h>
+#include <sys/stat.h> /* fstat */
+#include <fcntl.h> /* open */
#include "xml.h"
static void free_and_exit(int i);
+#define USE_BUFFER 0
+#define NODE_NAME_LEN 256
+#define STRING_LEN 2048
+
#define SHOW_NOVAL(opt) \
{ \
printf("option '%s' requires a value\n\n", (opt)); \
{
if (arg == 0) SHOW_NOVAL(opt);
alen = strlen(arg)+1;
+ if (_root) free(_root);
_root = malloc(alen);
memcpy(_root, arg, alen);
return 2;
{
if (arg == 0) SHOW_NOVAL(opt);
alen = strlen(arg)+1;
+ if (_element) free(_element);
_element = malloc(alen);
memcpy(_element, arg, alen);
return 2;
{
if (arg == 0) SHOW_NOVAL(opt);
alen = strlen(arg)+1;
+ if (_value) free(_value);
_value = malloc(alen);
memcpy(_value, arg, alen);
return 2;
{
if (arg == 0) SHOW_NOVAL(opt);
alen = strlen(arg)+1;
+ if (_print) free(_print);
_print = malloc(alen);
memcpy(_print, arg, alen);
return 2;
{
if (arg == 0) SHOW_NOVAL(opt);
alen = strlen(arg)+1;
+ if (_attribute) free(_attribute);
_attribute = malloc(alen);
memcpy(_attribute, arg, alen);
return 2;
{
if (xmlNodeGetPos(xid, xmid, _print, i) != 0)
{
- char value[1024];
+ char *value;
- xmlCopyString(xmid, (char *)&value, 1024);
- if (_value && _attribute)
+ value = xmlGetString(xmid);
+ if (_value && _attribute && value)
{
+#if 1
+ char *a = xmlAttributeGetString(xmid, _attribute);
+ if (a && !strcmp(a, _value))
+#else
if (!xmlAttributeCompareString(xmid, _attribute, _value))
+#endif
{
printf("%s: <%s %s=\"%s\">%s</%s>\n",
_filenames[num], _print, _attribute, _value,
value, _print);
}
+ if (value) free(value);
}
else
{
{
if (xmlNodeGetPos(xid, xmid, _element, i) != 0)
{
- char nodename[64];
+ char nodename[NODE_NAME_LEN];
- xmlNodeCopyName(xmid, (char *)&nodename, 64);
+ xmlNodeCopyName(xmid, (char *)&nodename, NODE_NAME_LEN);
if (xmlCompareString(xmid, _value) == 0)
{
printf("%s: <%s>%s</%s>\n",
}
else if (xmid && _element)
{
- char parentname[64];
+ char parentname[NODE_NAME_LEN];
- xmlNodeCopyName(xid, (char *)&parentname, 64);
+ xmlNodeCopyName(xid, (char *)&parentname, NODE_NAME_LEN);
no_elements = xmlNodeGetNum(xmid, _element);
for (i=0; i<no_elements; i++)
{
if (xmlNodeGetPos(xid, xmid, _element, i) != 0)
{
- char nodename[64];
+ char nodename[NODE_NAME_LEN];
- xmlNodeCopyName(xmid, (char *)&nodename, 64);
- if (strncasecmp((char *)&nodename, _element, 64) == 0)
+ xmlNodeCopyName(xmid, (char *)&nodename, NODE_NAME_LEN);
+ if (!strncasecmp((char*)&nodename, _element, NODE_NAME_LEN))
{
- char value[64];
- xmlCopyString(xmid, (char *)&value, 64);
+ char value[NODE_NAME_LEN];
+ xmlCopyString(xmid, (char *)&value, NODE_NAME_LEN);
printf("%s: <%s> <%s>%s</%s> </%s>\n",
_filenames[num], parentname, nodename, value,
nodename, parentname);
}
}
-
void grep_file(unsigned num)
{
void *xid;
if (xid)
{
void *xrid = xmlMarkId(xid);
+ int r = 0;
+
walk_the_tree(num, xrid, _root);
+
+ r = xmlErrorGetNo(xrid, 0);
+ if (r)
+ {
+ size_t n = xmlErrorGetLineNo(xrid, 0);
+ size_t c = xmlErrorGetColumnNo(xrid, 0);
+ const char *s = xmlErrorGetString(xrid, 1); /* clear the error */
+ printf("%s: at line %u, column %u: '%s'\n",_filenames[num], n,c, s);
+ }
+
free(xrid);
}
else
xmlClose(xid);
}
+
+void grep_file_buffer(unsigned num)
+{
+ struct stat st;
+ void *xid, *buf;
+ int fd, res;
+
+ fd = open(_filenames[num], O_RDONLY);
+ if (fd == -1)
+ {
+ printf("read error opening file '%s'\n", _filenames[num]);
+ return;
+ }
+
+ fstat(fd, &st);
+ buf = malloc(st.st_size);
+ if (!buf)
+ {
+ printf("unable to allocate enough memory for reading.\n");
+ return;
+ }
+
+ res = read(fd, buf, st.st_size);
+ if (res == -1)
+ {
+ printf("unable to read from file '%s'.\n", _filenames[num]);
+ return;
+ }
+ close(fd);
+
+ xid = xmlInitBuffer(buf, st.st_size);
+ if (xid)
+ {
+ void *xrid = xmlMarkId(xid);
+ int r = 0;
+
+ walk_the_tree(num, xrid, _root);
+
+ r = xmlErrorGetNo(xrid, 0);
+ if (r)
+ {
+ size_t n = xmlErrorGetLineNo(xrid, 0);
+ size_t c = xmlErrorGetColumnNo(xrid, 0);
+ const char *s = xmlErrorGetString(xrid, 1); /* clear the error */
+ printf("%s: at line %u, column %u: '%s'\n",_filenames[num], n,c, s);
+ }
+
+ free(xrid);
+ }
+ else
+ {
+ fprintf(stderr, "Error reading file '%s'\n", _filenames[num]);
+ }
+
+ xmlClose(xid);
+ free(buf);
+}
+
int
main (int argc, char **argv)
{
- unsigned int i;
+ unsigned int u;
+ int i;
if (argc == 1)
show_help();
if (_root == 0) _root = (char *)_static_root;
if (_element == 0) _element = (char *)_static_element;
- for (i=0; i<_fcount; i++)
- grep_file(i);
+ for (u=0; u<_fcount; u++)
+#if USE_BUFFER
+ grep_file_buffer(u);
+#else
+ grep_file(u);
+#endif
free_and_exit(0);