/*
 * Summary: API to build regexp automata
 * Description: the API to build regexp automata
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */

#ifndef __XML_AUTOMATA_H__
#define __XML_AUTOMATA_H__

#include "xmlversion.h"
#include "tree.h"

#ifdef LIBXML_REGEXP_ENABLED
#ifdef LIBXML_AUTOMATA_ENABLED
#include "xmlregexp.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * xmlAutomataPtr:
 *
 * A libxml automata description, It can be compiled into a regexp
 */
typedef struct _xmlAutomata xmlAutomata;
typedef xmlAutomata *xmlAutomataPtr;

/**
 * xmlAutomataStatePtr:
 *
 * A state int the automata description,
 */
typedef struct _xmlAutomataState xmlAutomataState;
typedef xmlAutomataState *xmlAutomataStatePtr;

/*
 * Building API
 */
XMLPUBFUN xmlAutomataPtr XMLCALL                
                    xmlNewAutomata              (void);
XMLPUBFUN void XMLCALL                  
                    xmlFreeAutomata             (xmlAutomataPtr am);

XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataGetInitState     (xmlAutomataPtr am);
XMLPUBFUN int XMLCALL                   
                    xmlAutomataSetFinalState    (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr state);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewState         (xmlAutomataPtr am);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewTransition    (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 const xmlChar *token,
                                                 void *data);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewTransition2   (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 const xmlChar *token,
                                                 const xmlChar *token2,
                                                 void *data);
XMLPUBFUN xmlAutomataStatePtr XMLCALL
                    xmlAutomataNewNegTrans      (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 const xmlChar *token,
                                                 const xmlChar *token2,
                                                 void *data);

XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewCountTrans    (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 const xmlChar *token,
                                                 int min,
                                                 int max,
                                                 void *data);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewCountTrans2   (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 const xmlChar *token,
                                                 const xmlChar *token2,
                                                 int min,
                                                 int max,
                                                 void *data);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewOnceTrans     (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 const xmlChar *token,
                                                 int min,
                                                 int max,
                                                 void *data);
XMLPUBFUN xmlAutomataStatePtr XMLCALL
                    xmlAutomataNewOnceTrans2    (xmlAutomataPtr am, 
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to, 
                                                 const xmlChar *token,
                                                 const xmlChar *token2,
                                                 int min, 
                                                 int max, 
                                                 void *data);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewAllTrans      (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 int lax);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewEpsilon       (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewCountedTrans  (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 int counter);
XMLPUBFUN xmlAutomataStatePtr XMLCALL   
                    xmlAutomataNewCounterTrans  (xmlAutomataPtr am,
                                                 xmlAutomataStatePtr from,
                                                 xmlAutomataStatePtr to,
                                                 int counter);
XMLPUBFUN int XMLCALL                   
                    xmlAutomataNewCounter       (xmlAutomataPtr am,
                                                 int min,
                                                 int max);

XMLPUBFUN xmlRegexpPtr XMLCALL          
                    xmlAutomataCompile          (xmlAutomataPtr am);
XMLPUBFUN int XMLCALL                   
                    xmlAutomataIsDeterminist    (xmlAutomataPtr am);

#ifdef __cplusplus
}
#endif 

#endif /* LIBXML_AUTOMATA_ENABLED */
#endif /* LIBXML_REGEXP_ENABLED */

#endif /* __XML_AUTOMATA_H__ */
