#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "xmlreader.h"

int cstream(BYTE *buf, int cBytes, int *cBytesActual, void *inputData)
{
  *cBytesActual = fread(buf, 1, cBytes, (FILE*)inputData);
  return (*cBytesActual < cBytes);
}

int main(int argc, char* argv[])
{
  struct XMLReader_t r;

  if (!XMLReader_Create(&r, 0)) {
    puts("Error creating parser");
    return EXIT_FAILURE;
  }

  if (XMLReader_Parse(&r, cstream, stdin, 0)) {
    union XMLReaderNode_t *rn;
    int i;

    while((rn = XMLReader_Read(&r))) {
      if (rn->type == XMLREADERTYPE_STARTELEMENT) {
        if (!strcmp((const char*)rn->startelement.qname, "toni.uusitalo")) {
          printf("Don't be silly, illegal naming policy of xml element,\n"
            "Your parsing will be terminated immediately!\n");
          XMLReader_AbortParse(&r);
          break; /* note: DON'T call Read after AbortParse */
        }
        printf("STARTELEMENT -- uri: %s localName: %s qName: %s\n"
          "  attributes count: %d\n",
            rn->startelement.uri,
            rn->startelement.localname,
            rn->startelement.qname,
            rn->startelement.atts->length);
        for(i=0; i<rn->startelement.atts->length; i++) {
          struct XMLReaderAttribute_t *a = XMLVector_Get(rn->startelement.atts, i);
          printf("  name: %s value: %s\n",
            XMLReader_GetAttributeQName(&r, a),
            XMLReader_GetAttributeValue(&r, a));
        }
      }
      else if (rn->type == XMLREADERTYPE_ENDELEMENT) {
        printf("ENDELEMENT -- uri: %s localName: %s qName: %s\n",
            rn->endelement.uri,
            rn->endelement.localname,
            rn->endelement.qname);
      }
      else if (rn->type == XMLREADERTYPE_CHARS) {
        printf("CHARS -- text: %s length: %d\n",
            rn->chars.text, rn->chars.length);
      }
      else if (rn->type == XMLREADERTYPE_COMMENT) {
        printf("COMMENT -- text: %s length: %d\n",
            rn->comment.text, rn->comment.length);
      }
      else if (rn->type == XMLREADERTYPE_PI) {
        printf("PROCESSINGINSTRUCTION -- target: %s data: %s\n",
            rn->pi.target, rn->pi.data);
      }
    } /* while read != NULL */
  } /* parse ok */

  if (r.errorcode) {
    if (r.errorcode == ERR_XMLP_VALIDATION)
      fprintf(stderr, "\nValidation Error: %s\nAt line %d, col %d, code %d\n",
        r.dtdv->ErrorString, r.dtdv->ErrorLine, r.dtdv->ErrorColumn, r.dtdv->ErrorCode);
    else
      fprintf(stderr, "\nParsing Error: %s\nAt line %d, col %d, code %d\n",
        r.parser->ErrorString, r.parser->ErrorLine, r.parser->ErrorColumn, r.errorcode);

  }

  XMLReader_Free(&r);
  return 0;
}