#ifndef GIMP_PRINT_MXML_H
# define GIMP_PRINT_MXML_H
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <errno.h>
# define STP_MXML_WRAP 70
# define STP_MXML_TAB 8
# define STP_MXML_NO_CALLBACK 0
# define STP_MXML_NO_PARENT 0
# define STP_MXML_DESCEND 1
# define STP_MXML_NO_DESCEND 0
# define STP_MXML_DESCEND_FIRST -1
# define STP_MXML_WS_BEFORE_OPEN 0
# define STP_MXML_WS_AFTER_OPEN 1
# define STP_MXML_WS_BEFORE_CLOSE 2
# define STP_MXML_WS_AFTER_CLOSE 3
# define STP_MXML_ADD_BEFORE 0
# define STP_MXML_ADD_AFTER 1
# define STP_MXML_ADD_TO_PARENT NULL
typedef enum stp_mxml_type_e
{
STP_MXML_ELEMENT,
STP_MXML_INTEGER,
STP_MXML_OPAQUE,
STP_MXML_REAL,
STP_MXML_TEXT
} stp_mxml_type_t;
typedef struct stp_mxml_attr_s
{
char *name;
char *value;
} stp_mxml_attr_t;
typedef struct stp_mxml_value_s
{
char *name;
int num_attrs;
stp_mxml_attr_t *attrs;
} stp_mxml_element_t;
typedef struct stp_mxml_text_s
{
int whitespace;
char *string;
} stp_mxml_text_t;
typedef union stp_mxml_value_u
{
stp_mxml_element_t element;
int integer;
char *opaque;
double real;
stp_mxml_text_t text;
} stp_mxml_value_t;
typedef struct stp_mxml_node_s stp_mxml_node_t;
struct stp_mxml_node_s
{
stp_mxml_type_t type;
stp_mxml_node_t *next;
stp_mxml_node_t *prev;
stp_mxml_node_t *parent;
stp_mxml_node_t *child;
stp_mxml_node_t *last_child;
stp_mxml_value_t value;
};
# ifdef __cplusplus
extern "C" {
# endif
extern void stp_mxmlAdd(stp_mxml_node_t *parent, int where,
stp_mxml_node_t *child, stp_mxml_node_t *node);
extern void stp_mxmlDelete(stp_mxml_node_t *node);
extern const char *stp_mxmlElementGetAttr(stp_mxml_node_t *node, const char *name);
extern void stp_mxmlElementSetAttr(stp_mxml_node_t *node, const char *name,
const char *value);
extern stp_mxml_node_t *stp_mxmlFindElement(stp_mxml_node_t *node, stp_mxml_node_t *top,
const char *name, const char *attr,
const char *value, int descend);
extern stp_mxml_node_t *stp_mxmlLoadFile(stp_mxml_node_t *top, FILE *fp,
stp_mxml_type_t (*cb)(stp_mxml_node_t *));
extern stp_mxml_node_t *stp_mxmlLoadString(stp_mxml_node_t *top, const char *s,
stp_mxml_type_t (*cb)(stp_mxml_node_t *));
extern stp_mxml_node_t *stp_mxmlNewElement(stp_mxml_node_t *parent, const char *name);
extern stp_mxml_node_t *stp_mxmlNewInteger(stp_mxml_node_t *parent, int integer);
extern stp_mxml_node_t *stp_mxmlNewOpaque(stp_mxml_node_t *parent, const char *opaque);
extern stp_mxml_node_t *stp_mxmlNewReal(stp_mxml_node_t *parent, double real);
extern stp_mxml_node_t *stp_mxmlNewText(stp_mxml_node_t *parent, int whitespace,
const char *string);
extern void stp_mxmlRemove(stp_mxml_node_t *node);
extern char *stp_mxmlSaveAllocString(stp_mxml_node_t *node,
int (*cb)(stp_mxml_node_t *, int));
extern int stp_mxmlSaveFile(stp_mxml_node_t *node, FILE *fp,
int (*cb)(stp_mxml_node_t *, int));
extern int stp_mxmlSaveString(stp_mxml_node_t *node, char *buffer,
int bufsize,
int (*cb)(stp_mxml_node_t *, int));
extern stp_mxml_node_t *stp_mxmlWalkNext(stp_mxml_node_t *node, stp_mxml_node_t *top,
int descend);
extern stp_mxml_node_t *stp_mxmlWalkPrev(stp_mxml_node_t *node, stp_mxml_node_t *top,
int descend);
# ifdef __cplusplus
}
# endif
#endif