#include <stdio.h>
#include "libparsifal/parsifal.h"

int StartElement(void *UserData, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName, LPXMLVECTOR atts);
int EndElement(void *UserData, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName);
void ErrorHandler(LPXMLPARSER parser) {} /* dummy, only for switching ErrorString etc. on */

int cstream(BYTE *buf, int cBytes, int *cBytesActual, void *inputData);

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

int StartElement(void *UserData, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName, LPXMLVECTOR atts)
{
  int i;
    int *depthPtr = UserData;
    for (i = 0; i < *depthPtr; i++)
      putchar('\t');
    puts(qName);
    *depthPtr += 1;
  return 0;
}

int EndElement(void *UserData, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName)
{
  int *depthPtr = UserData;
  *depthPtr -= 1;
  return 0;
}

int main(int argc, char* argv[])
{
  LPXMLPARSER parser;
  int depth = 0;

  if (!XMLParser_Create(&parser)) {
    printf("Error creating parser!\n");
    return 1;
  }

  parser->errorHandler = ErrorHandler;
  parser->startElementHandler = StartElement;
  parser->endElementHandler = EndElement;
  parser->UserData = &depth;

  if (!XMLParser_Parse(parser, cstream, stdin, 0))
    printf("Error: %s\nLine: %d Col: %d\n",
      parser->ErrorString, parser->ErrorLine, parser->ErrorColumn);

  XMLParser_Free(parser);
  return 0;
}