/***********************************************************************
*
*      Module  : SxmlNode
*      Fichier : SxmlNode.h
*      Auteur  : J. Ducloy et F. Parmentier
*
************************************************************************
* 
*     Copyleft
*
************************************************************************/
#ifndef _SXML_NODE_H_
#define _SXML_NODE_H_

#include <stdio.h>
#include "string.h"
#include "DilibKernel.h"
#include "Buffer.h"
#include "StrDict.h"

struct SxmlNode_Struct
{
  /*  DILIB SGML type part (to be deprecated) */
  
  char dilibSgmlType;
  char dilibSgmlSubType;
  
  /*  Sxml type part */
  
  unsigned int nodeType: 8 ; 
  unsigned int subType: 8;  
  
  /* DILIB/SGML type byte which are dedicated to applications */
  
  char    cusType;
  char    cusSubType;
  char    appli;    
  
  /*            main pointers (managed by kernel)       */
  
  struct     SxmlNode_Struct *parent;               
  struct     SxmlNode_Struct *firstChild;
  struct     SxmlNode_Struct *lastChild;
  struct     SxmlNode_Struct *previousSibling;
  struct     SxmlNode_Struct *nextSibling;
  
  struct     SxmlNode_Struct *nextNode;   /* specific for iterator XML */
  
  /*        printing pointer                     */
  
  char   *format;  /* presentation des attributs */
  
  /*           common data (managed by kernel)     */
  
  
  char	                 *name;
  char                   *value;
  struct  SxmlNode_Struct *attributes;
  /* extended value part */
  union	sgml_uvl_type
  {
    char                  *v; 
    struct SxmlNode_Struct *n;
    long                   l;
    double                 d;
  }             internalValue;
  
  /*          application data area  */
  
  union	xml_uvni_type 
  {
    char                  *v; 
    struct SxmlNode_Struct *n;
    long                   i;
    double                 d;
    char                   tc[4];
  }               custom;
  /*      free  purpose   indicators                 */

  unsigned int formatToFree:     1; 
  unsigned int valueToFree:      1;  
  unsigned int nameToFree:       1;
  unsigned int unparsed:         1; /* implicit 0=parsed */
  unsigned int isTempData:       1; /* temp var for processor */
  unsigned int nodeTypeSpecific: 1; /* defined by formal type */
  unsigned int nodeSpecific:     1; /* defined at sugType level */

};

typedef struct SxmlNode_Struct SxmlNode ;

/*================       SxmlNode type  ==================*/

#define SxmlNodeType(x)             ((x)->nodeType)
#define SxmlSetNodeType(x,y)        ((x)->nodeType=(y))

#define XML_NODE_ELEMENT                 1
#define XML_NODE_ATTRIBUTE               2
#define XML_NODE_TEXT                    3
#define XML_NODE_CDATA_SECTION           4
#define XML_NODE_PROCESSING_INSTRUCTION  7
#define XML_NODE_COMMENT                 8
#define XML_NODE_DOCUMENT                9
#define XML_NODE_DOCUMENT_TYPE          10
#define XML_NODE_DOCUMENT_FRAGMENT      11

#define XML_NODE_BEGIN_ELEMENT          15
#define XML_NODE_END_ELEMENT            16

#define XML_NODE_LIST_ATTRIBUTES        17
#define XML_NODE_CONTAINER              18
#define XML_NODE_NODE_LIST              19
#define XML_NODE_NAMED_NODE_MAP         20
#define XML_NODE_RECORD                 21
#define XML_NODE_DILIB                  22
#define XML_NODE_XPATH_EXPRESSION       23
#define XML_NODE_XPATH_RESULT           24
#define XML_NODE_PROCESSOR              25

/*
      equivalent definitions for SXML
 */

#define SXML_NODE_ELEMENT                 1
#define SXML_NODE_ATTRIBUTE               2
#define SXML_NODE_TEXT                    3
#define SXML_NODE_CDATA_SECTION           4
#define SXML_NODE_ENTITY_REFERENCE        5
#define SXML_NODE_PROCESSING_INSTRUCTION  7
#define SXML_NODE_COMMENT                 8
#define SXML_NODE_DOCUMENT                9
#define SXML_NODE_DOCUMENT_TYPE          10
#define SXML_NODE_DOCUMENT_FRAGMENT      11

#define SXML_NODE_ENTITY_DECLARATION     14
#define SXML_NODE_BEGIN_ELEMENT          15
#define SXML_NODE_END_ELEMENT            16

#define SXML_NODE_LIST_ATTRIBUTES        17
#define SXML_NODE_CONTAINER              18
#define SXML_NODE_NODE_LIST              19
#define SXML_NODE_NAMED_NODE_MAP         20
#define SXML_NODE_RECORD                 21
#define SXML_NODE_DILIB                  22
#define SXML_NODE_XPATH_EXPRESSION       23
#define SXML_NODE_XPATH_RESULT           24
#define SXML_NODE_PROCESSOR              25

/*

 */

typedef SxmlNode SxmlLeaf;
typedef SxmlNode SxmlNodeList;
typedef SxmlNode SxmlText;
typedef SxmlNode SxmlListAttributes;
typedef SxmlNode SxmlDocumentReader;

/**
   An SxmlLeaf is an SxmlElement containing an @ref SxmlText.
 */

#define  SxmlIsElement(x)            (((x)->nodeType)==XML_NODE_ELEMENT)
#define  SxmlIsComment(x)            (((x)->nodeType)==XML_NODE_COMMENT)
#define  SxmlIsText(x)               (((x)->nodeType)==XML_NODE_TEXT)
#define  SxmlIsCdata(x)               (((x)->nodeType)==XML_NODE_CDATA_SECTION)

#define SxmlFirstChild(x)           ((x)->firstChild)
#define SxmlLastChild(x)            ((x)->lastChild)
#define SxmlNextSibling(x)          ((x)->nextSibling)
#define SxmlPreviousSibling(x)      ((x)->previousSibling)
#define SxmlParent(x)               ((x)->parent)
#define SxmlNodeName(x)             ((x)->name)
#define SxmlNodeValue(x)            ((x)->value)


#define SxmlNodeIntegerValue(x)      ((x)->internalValue.l)
#define SxmlContainerIntegerValue(x) ((x)->internalValue.l)
#define SxmlSetNodeIntegerValue(x,y) ((x)->internalValue.l=(y))
#define SxmlContainerIntegerIncr(x)  (((x)->internalValue.l)++)

#define SxmlNodeDoubleValue(x)      ((x)->internalValue.d)
#define SxmlContainerDoubleValue(x) ((x)->internalValue.d)
#define SxmlSetNodeDoubleValue(x,y) ((x)->internalValue.d=(y))

#define SxmlGetListAttributes(x)        ((x)->attributes)

#define SxmlNodeHasName(x,n)         (strcmp(SxmlNodeName(x),(n))==0)
#define SxmlNodeHasValue(x,n)        (strcmp(SxmlNodeValue(x),(n))==0)

#define SxmlRecord       SxmlNode
#define SxmlDocument     SxmlNode
#define SxmlRecordReader SxmlNode

#define XML_DOCTYPE_INTERNAL   1
#define XML_DOCTYPE_SYSTEM     2
#define XML_DOCTYPE_PUBLIC     3
#define XML_DOCTYPE_HTML       4

#define XML_ELEMENT_STANDARD  1
#define XML_ELEMENT_EMPTY     2

void     SxmlFreeContent();
SxmlNode *SxmlClone();

/**
   Set the next node to read to first child of @a x.

   @param x SxmlNode whos children have to be read
 */
#define  SxmlReset(x) ((x)->nextNode=x->firstChild)

/**
   Get the property NextNode of @a x.
   @param x XPathResultStep
   @return SxmlNode
 */
#define SxmlNextNodeProperty(x) ((x)->nextNode)
/**
   Set the property NextNode of @a x to @a y.
   @param x XPathResultStep
   @param y SxmlNode
 */
#define SxmlSetNextNodeProperty(x,y) ((x)->nextNode=y)

/*                    functions that are defined in SxmlNodeKernel.c  */

SxmlNode *SxmlNodeCreate(char nType);
void      SxmlFree(SxmlNode *n);
void      SxmlFreeChildren( SxmlNode *node);
SxmlNode *SxmlRemoveChild(SxmlNode *node);
SxmlNode *SxmlReplaceName(SxmlNode *node, char *newName);
SxmlNode *SxmlReplaceValue(SxmlNode *node, char *newValue);

/*                    functions that are defined in SxmlPrint.c  */

void SxmlNodeIndent(SxmlNode *n1, Buffer *bufInd, int inc);
void SxmlFilePrint(SxmlNode *n1, FILE *f1);
#define SxmlPrint(x) (SxmlFilePrint(x,stdout))
SxmlNode *SxmlPrintDocToFile(SxmlNode *x1, char *s1);
char    *SxmlToString(SxmlNode *x1);
char    *SxmlToStringRecursive(Buffer *b1, SxmlNode *x1);
void     SxmlDump(SxmlNode *x1);
extern Buffer *SxmlDumpBufferIndent;
void SxmlFileSave(SxmlNode *n1, FILE *f1);
#define SxmlSave(x) (SxmlFileSave(x,stdout))


/*                    functions that are defined in SxmlTree.c  */

SxmlNode      *SxmlNextNode(SxmlNode *iterNode);
SxmlNode      *SxmlIteratorHasNextNode(SxmlNode *n1);
SxmlNode      *SxmlGetFirstChildTagAtt(SxmlNode *parent, char *nameChild, char *attributeName, char *attributeValue);
SxmlNode      *SxmlGetNextSiblingTagAtt(SxmlNode *node, char *nameSibling, char *attributeName, char *attributeValue);
SxmlNode      *SxmlAppendChild(SxmlNode *n1 , SxmlNode *n2);
SxmlNode      *SxmlGetFirstChildByTagName(SxmlNode *n1, char *t1);
SxmlNode      *SxmlGetFirstDescendantByTagName(SxmlNode *n1, char *t1);
SxmlNode      *SxmlGetNextDescendantByTagName(SxmlNode *n1, SxmlNode *from, char *t1);
int SxmlRankWithTagName(SxmlNode *x1);
SxmlNodeList  *SxmlListDescendant(SxmlNode *root, char *tag);
SxmlNode      *SxmlGetFirstDescendantTagAtt(SxmlNode *root, char *tag, char *att, char *val);
SxmlNode      *SxmlGetChildByPosition(SxmlNode *n1, int pos);


/*                    functions that are defined in SxmlElement.c  */

#define  SxmlElement  SxmlNode
SxmlNode *SxmlElementCreate(char *name);
void     SxmlElementDump(SxmlNode *n1);
void     SxmlElementIndent(SxmlNode *n1, Buffer *bufInd, int inc);
void     SxmlElementFileSave(SxmlNode *e1, FILE *f1);

/*                    functions that are defined in SxmlDocument.c  */

SxmlNode    *SxmlFromFile(char *filePath);
SxmlNode    *SxmlInputNextDocumentElement();
SxmlElement *SxmlInputGetDocumentElement();
SxmlDocumentReader *SxmlDocumentReaderCreate();
SxmlDocumentReader *SxmlDocumentReaderOpen(SxmlDocumentReader *x1, char *fn1);
SxmlNode *SxmlRecordReaderNextDocumentElement(SxmlRecordReader *reader);

/*                    functions that are defined in SxmlText.c  */

void     SxmlTextIndent(SxmlNode *n1, Buffer *bufInd, int inc);
SxmlText *SxmlTextCreate(char *str);
SxmlText *SxmlTextCreateFromSubstr(char *str, int n);

SxmlLeaf *SxmlIsLeaf(SxmlNode *x1);
char     *SxmlLeafText(SxmlLeaf *xl1);
SxmlLeaf *SxmlLeafCreate(char *t1, char *s1);
SxmlLeaf *SxmlLeafCreateFromSubstr(char *t1, char *s1, int n);
SxmlLeaf *SxmlLeafSetText(SxmlLeaf *xl1, char *s1);
void      SxmlTextFilePrint(SxmlText *t1, FILE *f1);
char     *SxmlGetTextContent(SxmlNode *xn);
char     *SxmlGetTaggedTextContent(SxmlNode *node);
char     *SxmlGetSpacedTextContent(SxmlNode *xn, char r);
SxmlLeaf *SxmlFirstChildLeafText(SxmlElement *parent, char *tag, char *text);

void     SxmlCdataIndent(SxmlNode *n1, Buffer *bufInd, int inc);
SxmlText *SxmlCdataCreate(char *str);
void SxmlCdataFilePrint(SxmlText *t1, FILE *f1);
int SxmlTextCmp(SxmlNode *n1, SxmlNode *n2);
char *SxmlTextBufferAppend(Buffer *b1, SxmlNode *n1);
char     *SxmlGetFirstText(SxmlNode *x1);

/*                    */

SxmlNode  *SxmlReplaceChild(SxmlNode *n1, SxmlNode *n2);
SxmlNode  *SxmlGetNextSiblingByTagName(SxmlNode *n1, char *t1);
SxmlNode  *SxmlAddFirstChild(SxmlNode *parent, SxmlNode *child);
SxmlNode  *SxmlInsertBefore(SxmlNode *n1, SxmlNode *n2);
SxmlNode  *SxmlInsertAfter(SxmlNode *n1, SxmlNode *n2);

/*                    functions that are defined in SxmlComment.c  */

SxmlNode *SxmlCommentCreate(char *str);
void     SxmlCommentFilePrint(SxmlNode *c1, FILE *f1);
char    *SxmlCommentBufferCat(SxmlNode *c1, Buffer *b1);
char    *SxmlCommentToString(Buffer *b1, SxmlNode *c1);
void SxmlProcessingInstructionIndent(SxmlNode *n1, Buffer *bufInd, int inc);
void SxmlCommentIndent(SxmlNode *n1, Buffer *bufInd, int inc);

/*                    functions that are defined in SxmlDtd.c  */

void SxmlDocumentTypeIndent(SxmlNode *n1, Buffer *bufInd, int inc);
SxmlNode  *SxmlDocumentTypeCreate(char *name);
SxmlNode  *SxmlDocumentTypeAppendChild(SxmlNode *dtd, SxmlNode *c1);
SxmlNode  *SxmlDocumentTypeSetSystem(SxmlNode *dtd, char *uri);
SxmlNode  *SxmlDocumentTypeSetPublic( SxmlNode *dtd1, char *strPub, char *strSys);
SxmlNode  *SxmlDocumentTypeSetHtml(SxmlNode *dtd1);


SxmlNode *SxmlDocumentCreate();
void     SxmlDocumentFilePrint();
SxmlNode *SxmlDocumentReaderSetFile();
void     SxmlDocumentReaderClose();
void     SxmlDocumentReaderFree();

SxmlNode *SxmlDocumentFragmentCreate();
void     SxmlDocumentFragmentFilePrint();

SxmlNode *SxmlDocumentReaderCreate();
SxmlNode *SxmlDocumentReaderOpen();
SxmlNode *SxmlDocumentCreateFromReader();
SxmlNode *SxmlDocumentUnparsedCreateFromReader();
SxmlNode *SxmlDocumentCreateFromElement();
SxmlNode *SxmlDocumentGets();
void     SxmlElementFilePrint();
char    *SxmlElementToString();

/*                                      SxmlRecord.c  */

extern SxmlNode* SxmlStdinRecord;
#define          SxmlInputRecord  SxmlStdinRecord
extern SxmlNode *SxmlInputDocumentElement;
extern SxmlDocument    *SxmlInputDocument;
extern char     *SxmlInputRecordKey;

SxmlRecord *SxmlRecordCreate();
SxmlNode *SxmlStdinGetRecord();
SxmlRecordReader *SxmlRecordReaderCreate();

char *SxmlRecordKeyString(SxmlRecord *r1);
char *SxmlRecordToString(Buffer *b1, SxmlRecord *r1);
void SxmlRecordFilePrint(SxmlNode *r1, FILE *f1);
SxmlNode *SxmlRecordReaderOpen(SxmlNode *x1, char *fileName);

char *SxmlRecordDocumentString();
void     SxmlRecordDump();
void     SxmlRecordReaderClose(SxmlRecordReader *reader);
SxmlNode *SxmlRecordReaderOpen();
SxmlNode *SxmlRecordReaderGets(SxmlRecordReader *rr);
SxmlNode *SxmlRecordCreateFromReader();
SxmlNode *SxmlRecordUnparsedCreateFromReader();

#define  SxmlInputNextRecord() SxmlStdinGetRecord()
#define  SxmlInputGetRecord()  SxmlStdinGetRecord()
#define  SxmlStdinNextRecord() SxmlStdinGetRecord()
SxmlNode *SxmlInputGetRecordLastItem();
SxmlNode *SxmlInputNextElementWithName();
SxmlNode *SxmlRecordReaderGets();
SxmlNode *SxmlRecordReaderSetFile();

#define SxmlElementSetEmpty(x)   ((x)->subType=XML_ELEMENT_EMPTY)
#define SxmlElementResetEmpty(x)   ((x)->subType=XML_ELEMENT_STANDARD)
#define SxmlElementIsEmpty(x)    ((x)->subType==XML_ELEMENT_EMPTY)
#define SxmlNodeSubType(x)       ((x)->subType)

/**
   An SxmlText is an @a ref SxmlNode, which type is @c XML_NODE_TEXT,
   which name is @c #text, and which value is a text (a string).
 */


SxmlNode *SxmlAttributeCreate(char *n1, char *v1);
void SxmlAttributeFilePrint( SxmlNode *a1, FILE *f1);
void SxmlListAttributesFilePrint(SxmlNode *l1, FILE *f1);
char *SxmlAttributeToString(Buffer  *b1, SxmlNode *a1);
char *SxmlListAttributesToString(Buffer  *b1, SxmlNode *l1);


void     SxmlDocumentTypeFilePrint();
/*                                           From SxmlText.c  */

/*                                           From SxmlAtt.c  */

SxmlNode  *SxmlSetAttribute( SxmlNode *e1, char *n1, char *v1);
SxmlNode  *SxmlSetIntAttribute( SxmlNode *e1, char *n1, int v1);
char      *SxmlGetAttribute(SxmlNode *x1, char *a1);
char      *SxmlHasAttribute(SxmlNode *x1, char *a1,  char *v1);

SxmlNode *SxmlGetAttributeNode(SxmlNode *e1, char *n1);




SxmlNode *SxmlChildNameReset();
SxmlNode *SxmlChildNameNextNode();

#define SxmlDilibType(x)       ((x)->dilibSgmlType)
#define SxmlSetDilibType(x,y)  ((x)->dilibSgmlType=y)

SxmlNode *SxmlProcessingInstructionCreate(char *target, char *data);
#define  SxmlProcessingInstructionTarget(x)  ((x)->name)
#define  SxmlProcessingInstructionData(x)  ((x)->value)
void     SxmlProcessingInstructionFilePrint();



#define SxmlSetParsed(x)   (x->unparsed=0)
#define SxmlSetUnparsed(x) (x->unparsed=1)
#define SxmlParsed(x)      (!(x->unparsed))


/*                                             SxmlNodeList   */

SxmlNodeList *SxmlNodeListCreate();
SxmlNode     *SxmlNodeListAppend(SxmlNodeList *l1, SxmlNode *n1);
SxmlNode     *SxmlNodeListNextNode(SxmlNodeList *l1);
SxmlNode *SxmlNodeListLastItem(SxmlNode *l1);
SxmlNode *SxmlNodeListFreeLast(SxmlNode *l1);
SxmlNode *SxmlNodeListPull(SxmlNodeList *l1);

/*=================== Debug... =============================*/

int SxmlSetTraceLevel();
void SxmlInternalDump();

/*=================== SxmlContainer =========================*/

#define XML_CONTAINER_INTEGER          1
#define XML_CONTAINER_DOUBLE           2
#define XML_CONTAINER_STRING           3
#define XML_CONTAINER_BUFFER           4
#define XML_CONTAINER_BUFFER_PARSER    5
#define XML_CONTAINER_STR_SEARCH_TABLE 6
#define XML_CONTAINER_REG_EXP          7

#define XML_CONTAINER_XML_NODE         10         
#define XML_CONTAINER_XML_SEARCH_TABLE 11
#define XML_CONTAINER_XML_FUNCTION     12

#define XML_CONTAINER_OBJECT           20

#define SXML_CONTAINER_INTEGER          1
#define SXML_CONTAINER_DOUBLE           2
#define SXML_CONTAINER_STRING           3
#define SXML_CONTAINER_BUFFER           4
#define SXML_CONTAINER_BUFFER_PARSER    5
#define SXML_CONTAINER_STR_DICT         6
#define SXML_CONTAINER_REG_EXP          7

#define SXML_CONTAINER_SXML_NODE         10         
#define SXML_CONTAINER_SXML_SEARCH_TABLE 11
#define SXML_CONTAINER_SXML_FUNCTION     12

#define SXML_CONTAINER_OBJECT           20

extern StrDict *SxmlContainerTypeTable;

void     SxmlContainerValueFree();
SxmlNode *SxmlNodeContainerFilePrint();
void     SxmlContainerDump();
SxmlNode *SxmlContainerCreate(char);
SxmlNode *SxmlContainerObjectCreate();
#define  SxmlContainerObjectName(x)      (x->custom.v)
#define  SxmlContainerSetObjectName(x,y) ((x->custom.v)=(y))
SxmlNode *SxmlContainerBufferCreate();
char    *SxmlContainerBufferString();
SxmlNode *SxmlContainerIntegerCreate(int i);
SxmlNode *SxmlContainerDoubleCreate(double d);
SxmlNode *SxmlLeafDoubleCreate(char *tag, double r1);
double    SxmlLeafDoubleValue(SxmlNode *dl1);
SxmlNode *SxmlContainerStringCreate();
SxmlNode *SxmlContainerRegExpCreate();
SxmlNode *SxmlNodePointerCreate();
#define  SxmlNodePointerValue(x) ((SxmlNode *)SxmlNodeValue(x))
SxmlNode *SxmlContainerSxmlFunctionCreate();
void     SxmlContainerObjetSetMethod();
#define  SxmlContainerObjectSetMethod(n1,f1) (SxmlContainerObjetSetMethod(n1,f1))
void     SxmlContainerFilePrint();
void SxmlContainerFilePrint(SxmlNode *e1, FILE *f1);
void SxmlContainerFileSave(SxmlNode *e1, FILE *f1);
void SxmlContainerIndent(SxmlNode *n1, Buffer *bufInd, int inc);
/*                                         SxmlSearchTable    SxmlDict */
#define SxmlDict SxmlNode

SxmlDict *SxmlDictCreate(char *profile);
SxmlDict *NewSxmlStrDict();
SxmlDict *SxmlDictSet(SxmlDict *d1, char *k, char *v);
char     *SxmlDictSearch(SxmlDict *d1, char *k);

/*                                         to be deprecated */  
#define SxmlSearchTable SxmlNode

#define SxmlSearchTableCreate SxmlDictCreate
/* SxmlNode *SxmlSearchTableCreate(); */
#define SxmlSearchTableSetKeyItem SxmlDictSet
/* SxmlNode *SxmlSearchTableSetKeyItem(); */
SxmlNode *SxmlSearchTableGetKeyedItem();
char    *SxmlSearchTableReset();
char    *SxmlSearchTableNextKey();
SxmlNode *SxmlSearchTableAddStream();
#define  SxmlSearchTableKey(t)   (SxmlNodeValue(SxmlNextSibling(SxmlFirstChild(t)))
#define  SxmlSearchTableValue(t) ((SxmlNode *)SxmlNodeValue(SxmlLastChild(t)))
SxmlNode *SxmlSearchTableAddFromProcNode();
SxmlNode *SxmlSearchTableToFile();

/*                                                       SxmlParser.c */


typedef struct {
  char    *nextStr; /**< Current focus of the SxmlParser */
  Buffer  *bufText; /**< Temporary buffer */
  Buffer  *bufName; 
  SxmlNode *rootElem;
  SxmlNode *lastTag;
} SxmlParser;

#define    SxmlParserContextChar(x)  ((x)->nextStr[0]) 
#define    SxmlParserContextStr(x)   ((x)->nextStr)
#define    SxmlParserNull(x) ((!x)||(!(x->nextStr))||(!(x->nextStr[0])))
SxmlParser *SxmlParserCreate();
#define    SxmlParserSkip1(x)  ((x)->nextStr++)
#define    SxmlParserSkip(x,y)  ((x)->nextStr+=y)

char       *SxmlParserGetBetweenParenthesis(SxmlParser *,char,char);
SxmlNode   *SxmlParserGetRootNode();
SxmlNode   *SxmlParserGetBeginElement();
char       *SxmlParserGetInteger();
char       *SxmlParserSkipBrk();
char       *SxmlParserGetTextUntilBrk();
SxmlNode   *SxmlParserGetAttribute();
char       *SxmlParserGetName();
SxmlParser *SxmlParserInit(SxmlParser *xp, char *str);
int         SxmlParserNextDomType(SxmlParser *xp);
void        SxmlParserFree();
SxmlNode   *SxmlParserGetSxmlUnit(SxmlParser *xp);
SxmlNode   *SxmlParserGetProcessingInstruction(SxmlParser *xp);
SxmlNode   *SxmlParserGetDocType(SxmlParser *xp);
#define     SxmlParserSkipSeparator(xp) SxmlParserSkipBrk(xp," \t\n\015");
SxmlNode   *SxmlDocumentEntityDeclarationCreate(char *name);





SxmlNode   *SxmlFromString(char * str);
SxmlParser *SxmlFromStringInit(char *str);
SxmlNode   *SxmlFromStringNext();
SxmlNode   *SxmlDocumentFromString(char * str);

#define SxmlNodeDilibSgmlType(x)   ((x)->dilibSgmlType)
#define SxmlSetNodeDilibSgmlType(x,y)   ((x)->dilibSgmlType=(y))
#define SxmlNodeCustomType(x)   ((x)->cusType)
#define SxmlSetNodeCustomType(x,y)   ((x)->cusType=(y))
#define SxmlNodeCustomValue(x)   ((x)->custom.n)
#define SxmlSetNodeCustomValue(x,y)   ((x)->custom.n=(y))

/* int SxmlLenght();   deprecated-> deleted */
int SxmlLength (SxmlNode *x1); 
int SxmlRank (SxmlNode *x1);
/*               Private Part  */

extern int       SxmlNumberOfNodes;
int      SxmlNodesFreeListLenght();


#define SxmlProcessingInstructionSetTarget(x,y) ((x)->name=y)
#define SxmlProcessingInstructionSetData(x,y) ((x)->value=y)
#define SxmlSetNodeName(x,y)         ((x)->name=y)
#define SxmlSetNodeValue(x,y)        ((x)->value=y)
#define SxmlSetParent(x,y)            ((x)->parent=(y))
#define SxmlSetFirstChild(x,y)        ((x)->firstChild=(y))
#define SxmlSetLastChild(x,y)         ((x)->lastChild=(y))
#define SxmlSetNextSibling(x,y)        ((x)->nextSibling=(y))
#define SxmlSetPreviousSibling(x,y)    ((x)->previousSibling=(y))
#define SxmlSetNodeSubType(x,y)        ((x)->subType=(y))

SxmlNode *SxmlSetListAttributes();
SxmlNode *SxmlListAttributesCreate();

#define SxmlSetNodeNameToFree(x) ((x)->nameToFree=1)
#define SxmlNodeNameToFree(x)    ((x)->nameToFree)
#define SxmlSetNodeValueToFree(x) ((x)->valueToFree=1)
#define SxmlSetNodeValueFreed(x) ((x)->valueToFree=0)
#define SxmlNodeValueToFree(x)    ((x)->valueToFree)
void    SxmlSearchTableDump();

/*                                                       SxmlUnIndent.c */

struct SxmlUnIndentManager_Struct
{
  char     mode;
  Buffer  *bufClean;
  StrDict *dict;
};

typedef struct SxmlUnIndentManager_Struct SxmlUnIndentManager ;

SxmlUnIndentManager *SxmlUnIndentManagerCreate();
StrDict *SxmlNodeUnIndentSetDict (SxmlUnIndentManager *manager, char *pathDict);

SxmlNode *SxmlNodeUnIndent(SxmlUnIndentManager *manager, SxmlNode *x1);
SxmlNode *SxmlNodeUnIndentDocument(SxmlUnIndentManager *manager, SxmlNode *x1);

/*                                                       End SxmlUnIndent */

SxmlNode *SxmlFreeNodeInTree();

#endif  /* _SXML_NODE_H_  */



