typedef enum print_state {
	PS_HEAD,      /* file header (before first opening) */
	PS_OPENING,   /* tree node opening (all children will follow recursively) */
	PS_CLOSING,   /* tree node closed (all children already printed) */
	PS_TAIL       /* file footer (after last closing) */
} print_state_t;

/* Output formats */
int Nprint_ind(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_awk(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_xml(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_plist(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_json(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_perl(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_web3(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_c(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);
int Nprint_dot(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);

/* callback to print using a specific output format; !opening
   terminates the current node (after callback had been called for
   all children nodes recursively); return non-zero if no more processing is
   required for the subtree */
extern int (*Nprint_cb)(void **nprint_ctx, const char *prefix, const node_t *node, print_state_t state);

/* true if longer, more verbose output should be generated */
extern int format_long;
