/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _PARSER_H
#define _PARSER_H

#include <stdio.h>

#undef CLASS_IMPORT_EXPORT
#ifdef HHCTRL
#define CLASS_IMPORT_EXPORT
#else
#define CLASS_IMPORT_EXPORT __declspec(dllimport)
#endif

#define PARSER_API_INLINE
#define MAX_LINE_LEN 1024

#define F_OK 0
#define F_NOFILE 1
#define F_READ 2
#define F_WRITE 3
#define F_MEMORY 4
#define F_EOF 5
#define F_END 6
#define F_TAGMISSMATCH 7
#define F_MISSINGENDTAG 8
#define F_NOTFOUND 9
#define F_NOPARENT 10
#define F_NULL 11
#define F_NOTITLE 12
#define F_LOCATION 13
#define F_REFERENCED 14
#define F_DUPLICATE 15
#define F_DELETE 16
#define F_CLOSE 17
#define F_EXISTCHECK 19

class CParseXML {
private:
  CHAR m_cCurToken[MAX_LINE_LEN];
  CHAR m_cCurWord[MAX_LINE_LEN];
  CHAR m_cCurBuffer[MAX_LINE_LEN];
  FILE *m_fh;
  CHAR *m_pCurrentIndex;
  DWORD m_dwError;
private:
  DWORD Read();
  DWORD SetError(DWORD dw) { m_dwError = dw; return m_dwError; }
public:
  CParseXML() {
    m_fh = NULL;
    m_cCurBuffer[0] = '\0';
    m_pCurrentIndex = NULL;
    m_dwError = F_OK;
  }
  ~CParseXML() {
    End();
  }
  CHAR *GetFirstWord(CHAR *);
  CHAR *GetValue(CHAR *);
  DWORD Start(const CHAR *szFile);
  void End();
  CHAR *GetToken();
  DWORD GetError() { return m_dwError; }
};

typedef struct fifo {
  CHAR *string;
  fifo *prev;
} FIFO;

class CLASS_IMPORT_EXPORT CFIFOString {
private:
  FIFO *m_fifoTail;
public:
  CFIFOString() { m_fifoTail = NULL; }
  ~CFIFOString();
  void RemoveAll();
  DWORD AddTail(CHAR *sz);
  DWORD GetTail(CHAR **sz);
};
#endif
