The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#ifndef _XH_H_
#define _XH_H_

#include "xh_config.h"
#include "xh_core.h"

#define XH_INTERNAL_ENCODING "utf-8"

/* Default opts */
#define XH_DEF_OUTPUT        NULL
#define XH_DEF_METHOD        "NATIVE"
#define XH_DEF_ROOT          "root"
#define XH_DEF_VERSION       "1.0"
#define XH_DEF_ENCODING      ""
#define XH_DEF_UTF8          TRUE
#define XH_DEF_INDENT        0
#define XH_DEF_CANONICAL     FALSE
#define XH_DEF_USE_ATTR      FALSE
#define XH_DEF_CONTENT       ""
#define XH_DEF_XML_DECL      TRUE
#define XH_DEF_KEEP_ROOT     FALSE
#ifdef XH_HAVE_DOM
#define XH_DEF_DOC           FALSE
#endif
#define XH_DEF_FORCE_ARRAY   &PL_sv_undef
#define XH_DEF_FORCE_CONTENT FALSE
#define XH_DEF_MERGE_TEXT    FALSE

#define XH_DEF_ATTR          "-"
#define XH_DEF_TEXT          "#text"
#define XH_DEF_TRIM          FALSE
#define XH_DEF_CDATA         ""
#define XH_DEF_COMM          ""

#define XH_DEF_MAX_DEPTH     1024
#define XH_DEF_BUF_SIZE      4096

typedef enum {
    XH_METHOD_NATIVE = 0,
    XH_METHOD_NATIVE_ATTR_MODE,
    XH_METHOD_LX
} xh_method_t;

typedef struct {
    xh_method_t            method;

    /* native options */
    xh_char_t              version[XH_PARAM_LEN];
    xh_char_t              encoding[XH_PARAM_LEN];
    xh_char_t              root[XH_PARAM_LEN];
    xh_bool_t              utf8;
    xh_bool_t              xml_decl;
    xh_bool_t              keep_root;
    xh_bool_t              canonical;
    xh_char_t              content[XH_PARAM_LEN];
    xh_int_t               indent;
    void                  *output;
#ifdef XH_HAVE_DOM
    xh_bool_t              doc;
#endif
    xh_int_t               max_depth;
    xh_int_t               buf_size;
    xh_pattern_t           force_array;
    xh_bool_t              force_content;
    xh_bool_t              merge_text;
    xh_pattern_t           filter;
    SV                    *cb;

    /* LX options */
    xh_char_t              attr[XH_PARAM_LEN];
    size_t                 attr_len;
    xh_char_t              text[XH_PARAM_LEN];
    xh_bool_t              trim;
    xh_char_t              cdata[XH_PARAM_LEN];
    xh_char_t              comm[XH_PARAM_LEN];
} xh_opts_t;

xh_opts_t *xh_create_opts(void);
void xh_destroy_opts(xh_opts_t *opts);
xh_bool_t xh_init_opts(xh_opts_t *opts);
void xh_parse_param(xh_opts_t *opts, xh_int_t first, I32 ax, I32 items);
void xh_copy_opts(xh_opts_t *dst, xh_opts_t *src);
void *xh_get_obj_param(xh_int_t *nparam, I32 ax, I32 items, char *class);
SV *xh_get_hash_param(xh_int_t *nparam, I32 ax, I32 items);
SV *xh_get_str_param(xh_int_t *nparam, I32 ax, I32 items);
void xh_merge_opts(xh_opts_t *ctx_opts, xh_opts_t *opts, xh_int_t nparam, I32 ax, I32 items);

#endif /* _XH_H_ */