#include <varlist.h>
#include <nclist.h>
#include <context.h>
#include <staglist.h>
#include <tagplist.h>
#include <default_tags.h>
#include <tokens.h>

#ifdef WIN32
#define snprintf _snprintf
#endif

#ifndef __TEMPLATE_H
#define __TEMPLATE_H

#define TEMPLATE_TRUE           "1"
#define TEMPLATE_FALSE          "0"

#define TMPL_ENONE              0
#define TMPL_EMALLOC		1
#define TMPL_ENULLARG		2
#define TMPL_EBADARG		3
#define TMPL_ENOVALUE		4
#define TMPL_ENOCTX		5
#define TMPL_ENOSTAG		6
#define TMPL_ENOTAGP		7
#define TMPL_ENOTFOUND		8
#define TMPL_EFOPEN		9
#define TMPL_EPARSE		10
#define TMPL_ESCREWY		11
#define TMPL_ENOTOKEN		12

#define TMPL_ERR_MIN            0
#define TMPL_ERR_MAX            12

#define TMPL_VARNAME_DIR        "INTERNAL_dir"
#define TMPL_VARNAME_OTAG       "INTERNAL_otag"
#define TMPL_VARNAME_CTAG       "INTERNAL_ctag"

#define template_set_value(c, n, v)  context_set_value(c, n, v)
#define template_destroy(c)          context_destroy(c)
#define template_set_dir(c, d)       template_set_value(c, TMPL_VARNAME_DIR, d)

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

extern int template_errno;

extern char *template_errno_strings[];

context_p template_init(void);
int       template_set_delimiters(context_p ctx, char *opentag,
                                  char *closetag);
int       template_register_simple(context_p ctx, char *name,
                             void (*function)(context_p, char **, int, char**));
int       template_alias_simple(context_p ctx, char *old_name, char *new_name);
void      template_remove_simple(context_p ctx, char *name);
int       template_register_pair(context_p ctx, char named_context,
                                 char *open_name, char *close_name,
                                 void (*function)(context_p, int, char**));
int       template_alias_pair(context_p ctx, char *old_open_name,
                              char *old_close_name, char *new_open_name,
                              char *new_close_name);
void      template_remove_pair(context_p ctx, char *open_name);
void      template_set_debug(context_p ctx, int debug_level);
void      template_set_strip(context_p ctx, int strip);
context_p template_loop_iteration(context_p ctx, char *loop_name);
context_p template_fetch_loop_iteration(context_p ctx, char *loop_name,
                                        int iteration);
int       template_parse_string(context_p ctx, char *tmpl, char **output);
int       template_parse_file(context_p ctx, char *template_filename,
                              char **output);
char *    template_strerror(void);
void      template_free_output(char *output); /* XX: do not use! */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __TEMPLATE_H */