/*
 * testOOM.c: Test out-of-memory handling
 *
 * See Copyright for the status of this software.
 *
 * hp@redhat.com
 */

#include "libxml.h"

#include <string.h>
#include <stdarg.h>

#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif

#include <libxml/xmlreader.h>

#include "testOOMlib.h"

#ifndef TRUE
#define TRUE (1)
#endif
#ifndef FALSE
#define FALSE (0)
#endif

#define EXIT_OOM 2

int error = FALSE;
int errcount = 0;
int noent = 0;
int count = 0;
int valid = 0;
int showErrs = 0;

/*
 * Since we are using the xmlTextReader functions, we set up
 * strings for the element types to help in debugging any error
 * output
 */
const char *elementNames[] = {
    "XML_READER_TYPE_NONE",
    "XML_READER_TYPE_ELEMENT",
    "XML_READER_TYPE_ATTRIBUTE",
    "XML_READER_TYPE_TEXT",
    "XML_READER_TYPE_CDATA",
    "XML_READER_TYPE_ENTITY_REFERENCE",
    "XML_READER_TYPE_ENTITY",
    "XML_READER_TYPE_PROCESSING_INSTRUCTION",
    "XML_READER_TYPE_COMMENT",
    "XML_READER_TYPE_DOCUMENT",
    "XML_READER_TYPE_DOCUMENT_TYPE",
    "XML_READER_TYPE_DOCUMENT_FRAGMENT",
    "XML_READER_TYPE_NOTATION",
    "XML_READER_TYPE_WHITESPACE",
    "XML_READER_TYPE_SIGNIFICANT_WHITESPACE",
    "XML_READER_TYPE_END_ELEMENT",
    "XML_READER_TYPE_END_ENTITY",
    "XML_READER_TYPE_XML_DECLARATION"};

/* not using xmlBuff here because I don't want those
 * mallocs to interfere */
struct buffer {
    char *str;
    size_t len;
    size_t max;
};

static struct buffer *buffer_create (size_t init_len)
{
    struct buffer *b;
    b = malloc (sizeof *b);
    if (b == NULL)
	exit (EXIT_OOM);
    if (init_len) {
	b->str = malloc (init_len);
	if (b->str == NULL)
	    exit (EXIT_OOM);
    }
    else
	b->str = NULL;
    b->len = 0;
    b->max = init_len;
    return b;
}

static void buffer_free (struct buffer *b)
{
    free (b->str);
    free (b);
}

static size_t buffer_get_length (struct buffer *b)
{
    return b->len;
}

static void buffer_expand (struct buffer *b, size_t min)
{
    void *new_str;
    size_t new_size = b->max ? b->max : 512;
    while (new_size < b->len + min)
	new_size *= 2;
    if (new_size > b->max) {
	new_str = realloc (b->str, new_size);
	if (new_str == NULL)
	    exit (EXIT_OOM);
	b->str = new_str;
	b->max = new_size;
    }
}

static void buffer_add_char (struct buffer *b, char c)
{
    buffer_expand (b, 1);
    b->str[b->len] = c;
    b->len += 1;
}

static void buffer_add_string (struct buffer *b, const char *s)
{
    size_t size = strlen(s) + 1;
    unsigned int ix;
    for (ix=0; ix<size-1; ix++) {
        if (s[ix] < 0x20)
	    printf ("binary data [0x%02x]?\n", (unsigned char)s[ix]);
    }
    buffer_expand (b, size);
    strcpy (b->str + b->len, s);
    b->str[b->len+size-1] = '\n';	/* replace string term with newline */
    b->len += size;
}

static int buffer_equal (struct buffer *b1, struct buffer *b2)
{
    return (b1->len == b2->len &&
	    (b1->len == 0 || (memcmp (b1->str, b2->str, b1->len) == 0)));
}

static void buffer_dump (struct buffer *b, const char *fname)
{
    FILE *f = fopen (fname, "wb");
    if (f != NULL) {
	fwrite (b->str, 1, b->len, f);
	fclose (f);
    }
}


static void usage(const char *progname) {
    printf("Usage : %s [options] XMLfiles ...\n", progname);
    printf("\tParse the XML files using the xmlTextReader API\n");
    printf("\t --count: count the number of attribute and elements\n");
    printf("\t --valid: validate the document\n");
    printf("\t --show:  display the error messages encountered\n");
    exit(1);
}
static unsigned int elem, attrs, chars;

static int processNode (xmlTextReaderPtr reader, void *data)
{
    struct buffer *buff = data;
    int type;

    type = xmlTextReaderNodeType(reader);
    if (count) {
	if (type == 1) {
	    elem++;
	    attrs += xmlTextReaderAttributeCount(reader);
	} else if (type == 3) {
	  const xmlChar *txt;
	  txt = xmlTextReaderConstValue(reader);
	  if (txt != NULL)
	    chars += xmlStrlen (txt);
	  else
	    return FALSE;
	}
    }

    if (buff != NULL) {
	int ret;
	const char *s;

	buffer_add_string (buff, elementNames[type]);

	if (type == 1) {
	    s = (const char *)xmlTextReaderConstName (reader);
	    if (s == NULL) return FALSE;
	    buffer_add_string (buff, s);
	    while ((ret = xmlTextReaderMoveToNextAttribute (reader)) == 1) {
		s = (const char *)xmlTextReaderConstName (reader);
		if (s == NULL) return FALSE;
		buffer_add_string (buff, s);
		buffer_add_char (buff, '=');
		s = (const char *)xmlTextReaderConstValue (reader);
		if (s == NULL) return FALSE;
		buffer_add_string (buff, s);
	    }
	    if (ret == -1) return FALSE;
	}
	else if (type == 3) {
	    s = (const char *)xmlTextReaderConstValue (reader);
	    if (s == NULL) return FALSE;
	    buffer_add_string (buff, s);
	}
    }

    return TRUE;
}


struct file_params {
    const char *filename;
    struct buffer *verif_buff;
};

static void
error_func (void *data ATTRIBUTE_UNUSED, xmlErrorPtr err)
{

    errcount++;
    if (err->level == XML_ERR_ERROR ||
        err->level == XML_ERR_FATAL)
        error = TRUE;
    if (showErrs) {
        printf("%3d line %d: %s\n", error, err->line, err->message);
    }
}

static int
check_load_file_memory_func (void *data)
{
     struct file_params *p = data;
     struct buffer *b;
     xmlTextReaderPtr reader;
     int ret, status, first_run;

     if (count) {
         elem = 0;
         attrs = 0;
         chars = 0;
     }

     first_run = p->verif_buff == NULL;
     status = TRUE;
     error = FALSE;
     if (first_run)
	 b = buffer_create (0);
     else
	 b = buffer_create (buffer_get_length (p->verif_buff));

     reader = xmlNewTextReaderFilename (p->filename);
     if (reader == NULL)
       goto out;

     xmlTextReaderSetStructuredErrorHandler (reader, error_func, NULL);
     xmlSetStructuredErrorFunc(NULL, error_func);

     if (valid) {
       if (xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1) == -1)
	 goto out;
     }

     /*
      * Process all nodes in sequence
      */
     while ((ret = xmlTextReaderRead(reader)) == 1) {
	 if (!processNode(reader, b))
	 goto out;
     }
     if (ret == -1)
       goto out;

     if (error) {
	 fprintf (stdout, "error handler was called but parse completed successfully (last error #%d)\n", errcount);
	 return FALSE;
     }

     /*
      * Done, cleanup and status
      */
     if (! first_run) {
	 status = buffer_equal (p->verif_buff, b);
	 if (! status) {
	     buffer_dump (p->verif_buff, ".OOM.verif_buff");
	     buffer_dump (b, ".OOM.buff");
	 }
     }

     if (count)
       {
	   fprintf (stdout, "# %s: %u elems, %u attrs, %u chars %s\n",
		    p->filename, elem, attrs, chars,
		    status ? "ok" : "wrong");
       }

 out:
     if (first_run)
	 p->verif_buff = b;
     else
	 buffer_free (b);
     if (reader)
	 xmlFreeTextReader (reader);
     return status;
}

int main(int argc, char **argv) {
    int i;
    int files = 0;

    if (argc <= 1) {
	usage(argv[0]);
	return(1);
    }
    LIBXML_TEST_VERSION;

    xmlMemSetup (test_free,
                 test_malloc,
                 test_realloc,
                 test_strdup);

    xmlInitParser();

    for (i = 1; i < argc ; i++) {
        if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count")))
	    count++;
	else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
	    valid++;
	else if ((!strcmp(argv[i], "-noent")) ||
	         (!strcmp(argv[i], "--noent")))
	    noent++;
	else if ((!strcmp(argv[i], "-show")) ||
		 (!strcmp(argv[i], "--show")))
	    showErrs++;
    }
    if (noent != 0)
      xmlSubstituteEntitiesDefault(1);
    for (i = 1; i < argc ; i++) {
	if (argv[i][0] != '-') {
             struct file_params p;
	     p.filename = argv[i];
	     p.verif_buff = NULL;

             if (!test_oom_handling (check_load_file_memory_func,
                                     &p)) {
                  fprintf (stdout, "Failed!\n");
                  return 1;
             }

	     buffer_free (p.verif_buff);
             xmlCleanupParser();

             if (test_get_malloc_blocks_outstanding () > 0) {
                  fprintf (stdout, "%d blocks leaked\n",
                           test_get_malloc_blocks_outstanding ());
		  xmlMemoryDump();
                  return 1;
             }

	    files ++;
	}
    }
    xmlMemoryDump();

    return 0;
}
