#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "template.h"
#include "perl_tags.h"
MODULE = Text::Tmpl PACKAGE = Text::Tmpl PREFIX = template_
PROTOTYPES: ENABLE
context_p
template_init()
PREINIT:
char *CLASS = NULL;
MAGIC *mg = NULL;
CLEANUP:
mg = mg_find(SvRV(ST(0)), '~');
mg->mg_len = 1;
int
template_set_delimiters(ctx, opentag, closetag)
context_p ctx
char * opentag
char * closetag
PREINIT:
char *CLASS = NULL;
void
template_set_debug(ctx, debug_level)
context_p ctx
int debug_level
PREINIT:
char *CLASS = NULL;
void
template_set_strip(ctx, strip)
context_p ctx
int strip
PREINIT:
char *CLASS = NULL;
int
template_set_dir(ctx, directory)
context_p ctx
char * directory
PREINIT:
char *CLASS = NULL;
int
template_set_value(ctx, name, value)
context_p ctx
char * name
char * value
PREINIT:
char *CLASS = NULL;
char *
template_strerror()
int
template_errno()
CODE:
RETVAL = template_errno;
OUTPUT:
RETVAL
void
template_DESTROY(ctx)
context_p ctx
PREINIT:
char *CLASS = NULL;
MAGIC *mg = mg_find(SvRV(ST(0)), '~');
int destroyme = mg->mg_len;
CODE:
if (destroyme)
{
template_destroy(ctx);
mg->mg_len = 0;
}
context_p
template_loop_iteration(ctx, loop_name)
context_p ctx
SV * loop_name
PREINIT:
char *CLASS = NULL;
char *r_loop_name = NULL;
INIT:
if (loop_name == &PL_sv_undef)
{
XSRETURN_UNDEF;
}
r_loop_name = (char *)SvPV(loop_name, PL_na);
CODE:
RETVAL = template_loop_iteration(ctx, r_loop_name);
OUTPUT:
RETVAL
context_p
template_fetch_loop_iteration(ctx, loop_name, iteration)
context_p ctx
SV * loop_name
SV * iteration
PREINIT:
char *CLASS = NULL;
char *r_loop_name = NULL;
int r_iteration = -1;
INIT:
if (loop_name == &PL_sv_undef)
{
XSRETURN_UNDEF;
}
if (iteration == &PL_sv_undef)
{
XSRETURN_UNDEF;
}
r_loop_name = (char *)SvPV(loop_name, PL_na);
r_iteration = SvIV(iteration);
CODE:
RETVAL = template_fetch_loop_iteration(ctx, r_loop_name,
r_iteration);
OUTPUT:
RETVAL
SV *
template_parse_file(ctx, template_filename)
context_p ctx
SV * template_filename
PREINIT:
char *CLASS = NULL;
char *output = NULL;
char *r_template_filename = NULL;
INIT:
if (template_filename == &PL_sv_undef)
{
XSRETURN_UNDEF;
}
r_template_filename = (char *)SvPV(template_filename, PL_na);
CODE:
template_parse_file(ctx, r_template_filename, &output);
if (output != NULL)
{
RETVAL = newSVpv(output, strlen(output));
template_free_output(output);
}
else
{
XSRETURN_UNDEF;
}
OUTPUT:
RETVAL
SV *
template_parse_string(ctx, template)
context_p ctx
SV * template
PREINIT:
char *CLASS = NULL;
char *output = NULL;
char *r_template = NULL;
INIT:
if (template == &PL_sv_undef)
{
XSRETURN_UNDEF;
}
r_template = (char *)SvPV(template, PL_na);
CODE:
template_parse_string(ctx, r_template, &output);
if (output != NULL)
{
RETVAL = newSVpv(output, strlen(output));
template_free_output(output);
}
else
{
XSRETURN_UNDEF;
}
OUTPUT:
RETVAL
int
template_register_simple(ctx, name, code)
context_p ctx
char * name
CV * code
PREINIT:
char *CLASS = NULL;
HV *stags;
HV *perl_simple_tags = perl_get_hv(PERL_TAGS_SIMPLE_TAG_HASH,
TRUE);
char key[20];
INIT:
snprintf(key, 20, "%p", context_root(ctx));
if (hv_exists(perl_simple_tags, key, strlen(key)))
{
stags = (HV *)SvRV(*(hv_fetch(perl_simple_tags, key,
strlen(key), FALSE)));
}
else
{
stags = newHV();
hv_store(perl_simple_tags, key, strlen(key),
newRV((SV *)stags), 0);
}
CODE:
hv_store(stags, name, strlen(name), newRV((SV*)code), 0);
RETVAL = template_register_simple(ctx, name, perl_simple_tag);
OUTPUT:
RETVAL
int
template_alias_simple(ctx, old_name, new_name)
context_p ctx
char * old_name
char * new_name
PREINIT:
char *CLASS = NULL;
HV *perl_simple_tags = perl_get_hv(PERL_TAGS_SIMPLE_TAG_HASH,
TRUE);
SV *cref = &PL_sv_undef;
HV *stags = NULL;
char key[20];
INIT:
snprintf(key, 20, "%p", context_root(ctx));
if (hv_exists(perl_simple_tags, key, strlen(key)))
{
stags = (HV *)SvRV(*(hv_fetch(perl_simple_tags, key,
strlen(key), FALSE)));
if (hv_exists(stags, old_name, strlen(old_name)))
{
cref = *(hv_fetch(stags, old_name,
strlen(old_name), FALSE));
}
}
CODE:
if ((cref != &PL_sv_undef) && (SvTYPE(SvRV(cref)) == SVt_PVCV))
{
CV *code = (CV *)SvRV(cref);
hv_store(stags, new_name, strlen(new_name),
newRV((SV *)code), 0);
}
RETVAL = template_alias_simple(ctx, old_name, new_name);
OUTPUT:
RETVAL
void
template_remove_simple(ctx, name)
context_p ctx
char * name
PREINIT:
char *CLASS = NULL;
HV *perl_simple_tags = perl_get_hv(PERL_TAGS_SIMPLE_TAG_HASH,
TRUE);
HV *stags = NULL;
char key[20];
INIT:
snprintf(key, 20, "%p", context_root(ctx));
if (hv_exists(perl_simple_tags, key, strlen(key)))
{
stags = (HV *)SvRV(*hv_fetch(perl_simple_tags, key,
strlen(key), FALSE));
}
CODE:
if ((stags != NULL)
&& (hv_exists(stags, name, strlen(name))))
{
hv_delete(stags, name, strlen(name), G_DISCARD);
}
template_remove_simple(ctx, name);
int
template_register_pair(ctx, named_context, open_name, close_name, code)
context_p ctx
int named_context
char * open_name
char * close_name
CV * code
PREINIT:
char *CLASS = NULL;
HV *tagps;
HV *perl_tag_pairs = perl_get_hv(PERL_TAGS_TAG_PAIR_HASH, TRUE);
char key[20];
INIT:
snprintf(key, 20, "%p", context_root(ctx));
if (hv_exists(perl_tag_pairs, key, strlen(key)))
{
tagps = (HV *)SvRV(*(hv_fetch(perl_tag_pairs, key,
strlen(key), FALSE)));
}
else
{
tagps = newHV();
hv_store(perl_tag_pairs, key, strlen(key),
newRV((SV *)tagps), 0);
}
CODE:
hv_store(tagps, open_name, strlen(open_name),
newRV((SV*)code), 0);
RETVAL = template_register_pair(ctx, (char)named_context,
open_name, close_name,
perl_tag_pair);
OUTPUT:
RETVAL
int
template_alias_pair(ctx,old_open_name,old_close_name,new_open_name,new_close_name)
context_p ctx
char * old_open_name
char * old_close_name
char * new_open_name
char * new_close_name
PREINIT:
char *CLASS = NULL;
HV *perl_tag_pairs = perl_get_hv(PERL_TAGS_TAG_PAIR_HASH,
TRUE);
SV *cref = &PL_sv_undef;
HV *tagps = NULL;
char key[20];
INIT:
snprintf(key, 20, "%p", context_root(ctx));
if (hv_exists(perl_tag_pairs, key, strlen(key)))
{
tagps = (HV *)SvRV(*(hv_fetch(perl_tag_pairs, key,
strlen(key), FALSE)));
if (hv_exists(tagps, old_open_name,
strlen(old_open_name)))
{
cref = *(hv_fetch(tagps, old_open_name,
strlen(old_open_name), 0));
}
}
CODE:
if ((cref != &PL_sv_undef) && (SvTYPE(SvRV(cref)) == SVt_PVCV))
{
CV *code = (CV *)SvRV(cref);
hv_store(tagps, new_open_name, strlen(new_open_name),
newRV((SV *)code), 0);
}
RETVAL = template_alias_pair(ctx, old_open_name,
old_close_name, new_open_name,
new_close_name);
OUTPUT:
RETVAL
void
template_remove_pair(ctx, open_name)
context_p ctx
char * open_name
PREINIT:
char *CLASS = NULL;
HV *perl_tag_pairs = perl_get_hv(PERL_TAGS_TAG_PAIR_HASH, TRUE);
HV *tagps = NULL;
char key[20];
INIT:
snprintf(key, 20, "%p", context_root(ctx));
if (hv_exists(perl_tag_pairs, key, strlen(key)))
{
tagps = (HV *)SvRV(*hv_fetch(perl_tag_pairs, key,
strlen(key), FALSE));
}
CODE:
if ((tagps != NULL)
&& (hv_exists(tagps, open_name, strlen(open_name))))
{
hv_delete(tagps, open_name, strlen(open_name),
G_DISCARD);
}
template_remove_pair(ctx, open_name);
char *
context_get_value(ctx, name)
context_p ctx
char * name
PREINIT:
char *CLASS = NULL;
context_p
context_get_anonymous_child(ctx)
context_p ctx
PREINIT:
char *CLASS = NULL;
context_p
context_get_named_child(ctx, name)
context_p ctx
char * name
PREINIT:
char *CLASS = NULL;
int
context_set_named_child(ctx, name)
context_p ctx
char * name
PREINIT:
char *CLASS = NULL;
context_p
context_add_peer(ctx)
context_p ctx
PREINIT:
char *CLASS = NULL;
void
context_output_contents(ctx, output_contents)
context_p ctx
int output_contents
PREINIT:
char *CLASS = NULL;
CODE:
context_output_contents(ctx, (char)output_contents);