blob: 221f62f9ccd304d38cdd61b7cb6e889428b6f9ee [file] [log] [blame]
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ClearSilver.h"
/* #define DEBUG_MODE 1
*/
typedef struct {
HDF* hdf;
NEOERR* err;
} perlHDF;
typedef struct {
CSPARSE* cs;
NEOERR* err;
} perlCS;
typedef perlHDF* ClearSilver__HDF;
typedef perlCS* ClearSilver__CS;
static char* g_sort_func_name;
static void debug(char* fmt, ...)
{
#ifdef DEBUG_MODE
va_list argp;
va_start(argp, fmt);
vprintf(fmt, argp);
va_end(argp);
#endif
}
static NEOERR *output (void *ctx, char *s)
{
sv_catpv((SV*)ctx, s);
return STATUS_OK;
}
static int sortFunction(const void* in_a, const void* in_b)
{
HDF** hdf_a;
HDF** hdf_b;
perlHDF a, b;
SV* sv_a;
SV* sv_b;
int count;
int ret;
dSP;
hdf_a = (HDF**)in_a;
hdf_b = (HDF**)in_b;
/* convert to a type Perl can access */
a.hdf = *hdf_a;
a.err = STATUS_OK;
b.hdf = *hdf_b;
b.err = STATUS_OK;
ENTER;
SAVETMPS;
PUSHMARK(SP);
sv_a = sv_newmortal();
sv_setref_pv(sv_a, "ClearSilver::HDF", (void*)&a);
sv_b = sv_newmortal();
sv_setref_pv(sv_b, "ClearSilver::HDF", (void*)&b);
XPUSHs(sv_a);
XPUSHs(sv_b);
PUTBACK;
count = call_pv(g_sort_func_name, G_SCALAR);
SPAGAIN;
if (count != 1)
croak("Big trouble\n");
PUTBACK;
ret = POPi;
FREETMPS;
LEAVE;
return ret;
}
MODULE = ClearSilver PACKAGE = ClearSilver::HDF PREFIX = perlhdf_
ClearSilver::HDF
perlhdf_new(self)
char* self
PREINIT:
ClearSilver__HDF hdf;
CODE:
debug("%s\n", self);
hdf = (ClearSilver__HDF)malloc(sizeof(perlHDF));
if (!hdf) {
RETVAL = NULL;
} else {
hdf->err = hdf_init(&(hdf->hdf));
RETVAL = hdf;
}
OUTPUT:
RETVAL
void
perlhdf_DESTROY(hdf)
ClearSilver::HDF hdf;
CODE:
debug("hdf_DESTROY:%x\n", hdf);
hdf_destroy(&(hdf->hdf));
int
perlhdf_setValue(hdf, key, value)
ClearSilver::HDF hdf
char* key
char* value
CODE:
hdf->err = hdf_set_value(hdf->hdf, key, value);
if (hdf->err == STATUS_OK) {
RETVAL = 0;
} else {
RETVAL = 1;
}
OUTPUT:
RETVAL
char*
perlhdf_getValue(hdf, key, default_value)
ClearSilver::HDF hdf
char* key
char* default_value
CODE:
RETVAL = hdf_get_value(hdf->hdf, key, default_value);
OUTPUT:
RETVAL
int
perlhdf_copy(hdf, name, src);
ClearSilver::HDF hdf
char* name
ClearSilver::HDF src
CODE:
hdf->err = hdf_copy(hdf->hdf, name, src->hdf);
if (hdf->err == STATUS_OK) {
RETVAL = 0;
} else {
RETVAL = 1;
}
OUTPUT:
RETVAL
int
perlhdf_readFile(hdf, filename)
ClearSilver::HDF hdf
char* filename
CODE:
hdf->err = hdf_read_file(hdf->hdf, filename);
if (hdf->err == STATUS_OK) {
RETVAL = 1;
} else {
RETVAL = 0;
}
OUTPUT:
RETVAL
int
perlhdf_writeFile(hdf, filename)
ClearSilver::HDF hdf
char* filename
CODE:
hdf->err = hdf_write_file(hdf->hdf, filename);
if (hdf->err == STATUS_OK) {
RETVAL = 1;
} else {
RETVAL = 0;
}
OUTPUT:
RETVAL
ClearSilver::HDF
perlhdf_getObj(hdf, name)
ClearSilver::HDF hdf;
char* name
PREINIT:
HDF* tmp_hdf;
perlHDF* perlhdf;
CODE:
do {
tmp_hdf = hdf_get_obj(hdf->hdf, name);
if (!tmp_hdf) {
RETVAL = NULL;
break;
}
perlhdf = (perlHDF*)malloc(sizeof(perlHDF));
if (!perlhdf) {
RETVAL = NULL;
break;
}
perlhdf->hdf = tmp_hdf;
perlhdf->err = STATUS_OK;
RETVAL = perlhdf;
} while (0);
OUTPUT:
RETVAL
ClearSilver::HDF
perlhdf_objChild(hdf)
ClearSilver::HDF hdf;
PREINIT:
HDF* tmp_hdf;
perlHDF* child;
CODE:
do {
tmp_hdf = hdf_obj_child(hdf->hdf);
if (!tmp_hdf) {
RETVAL = NULL;
break;
}
child = (perlHDF*)malloc(sizeof(perlHDF));
if (!child) {
RETVAL = NULL;
break;
}
child->hdf = tmp_hdf;
child->err = STATUS_OK;
RETVAL = child;
} while (0);
OUTPUT:
RETVAL
ClearSilver::HDF
perlhdf_getChild(hdf, name)
ClearSilver::HDF hdf;
char* name;
PREINIT:
HDF* tmp_hdf;
perlHDF* child;
CODE:
do {
tmp_hdf = hdf_get_child(hdf->hdf, name);
if (!tmp_hdf) {
RETVAL = NULL;
break;
}
child = (perlHDF*)malloc(sizeof(perlHDF));
if (!child) {
RETVAL = NULL;
break;
}
child->hdf = tmp_hdf;
child->err = STATUS_OK;
RETVAL = child;
} while (0);
OUTPUT:
RETVAL
char*
perlhdf_objValue(hdf)
ClearSilver::HDF hdf;
CODE:
RETVAL = hdf_obj_value(hdf->hdf);
OUTPUT:
RETVAL
char*
perlhdf_objName(hdf)
ClearSilver::HDF hdf;
CODE:
RETVAL = hdf_obj_name(hdf->hdf);
OUTPUT:
RETVAL
ClearSilver::HDF
perlhdf_objNext(hdf)
ClearSilver::HDF hdf;
PREINIT:
HDF* tmp_hdf;
perlHDF* next;
CODE:
do {
tmp_hdf = hdf_obj_next(hdf->hdf);
if (!tmp_hdf) {
RETVAL = NULL;
break;
}
next = (perlHDF*)malloc(sizeof(perlHDF));
if (!next) {
RETVAL = NULL;
break;
}
next->hdf = tmp_hdf;
next->err = STATUS_OK;
RETVAL = next;
} while (0);
OUTPUT:
RETVAL
int
perlhdf_sortObj(hdf, func_name)
ClearSilver::HDF hdf;
char* func_name;
PREINIT:
NEOERR* err;
CODE:
g_sort_func_name = func_name;
err = hdf_sort_obj(hdf->hdf, sortFunction);
RETVAL = 0;
OUTPUT:
RETVAL
int
perlhdf_setSymlink(hdf, src, dest)
ClearSilver::HDF hdf;
char* src;
char* dest;
PREINIT:
NEOERR* err;
CODE:
err = hdf_set_symlink (hdf->hdf, src, dest);
if (err == STATUS_OK) {
RETVAL = 1;
} else {
RETVAL = 0;
}
OUTPUT:
RETVAL
int
perlhdf_removeTree(hdf, name)
ClearSilver::HDF hdf;
char* name;
PREINIT:
NEOERR* err;
CODE:
err = hdf_remove_tree(hdf->hdf, name);
if (err == STATUS_OK) {
RETVAL = 1;
} else {
RETVAL = 0;
}
OUTPUT:
RETVAL
MODULE = ClearSilver PACKAGE = ClearSilver::CS PREFIX = perlcs_
ClearSilver::CS
perlcs_new(self, hdf)
char* self
ClearSilver::HDF hdf;
PREINIT:
perlCS* cs;
CODE:
cs = (perlCS*)malloc(sizeof(perlCS));
if (!cs) {
RETVAL = NULL;
} else {
cs->err = cs_init(&(cs->cs), hdf->hdf);
if (cs->err == STATUS_OK) {
cs->err = cgi_register_strfuncs(cs->cs);
}
RETVAL = cs;
}
OUTPUT:
RETVAL
void
perlcs_DESTROY(cs)
ClearSilver::CS cs;
CODE:
debug("perlcs_DESTROY() is called\n");
cs_destroy(&(cs->cs));
void
perlcs_displayError(cs)
ClearSilver::CS cs;
CODE:
nerr_log_error(cs->err);
char *
perlcs_render(cs)
ClearSilver::CS cs
CODE:
{
SV *str = newSV(0);
cs->err = cs_render(cs->cs, str, output);
if (cs->err == STATUS_OK) {
ST(0) = sv_2mortal(str);
} else {
SvREFCNT_dec(str);
ST(0) = &PL_sv_undef;
}
XSRETURN(1);
}
int
perlcs_parseFile(cs, cs_file)
ClearSilver::CS cs
char* cs_file
CODE:
do {
cs->err = cs_parse_file(cs->cs, cs_file);
if (cs->err != STATUS_OK) {
cs->err = nerr_pass(cs->err);
RETVAL = 0;
break;
}
RETVAL = 1;
} while (0);
OUTPUT:
RETVAL
int
perlcs_parseString(cs, in_str)
ClearSilver::CS cs
char* in_str
PREINIT:
char* cs_str;
int len;
CODE:
do {
len = strlen(in_str);
cs_str = (char *)malloc(len);
if (!cs_str) {
RETVAL = 0;
break;
}
strcpy(cs_str, in_str);
cs->err = cs_parse_string(cs->cs, cs_str, len);
if (cs->err != STATUS_OK)
RETVAL = 0;
RETVAL = 1;
} while (0);
OUTPUT:
RETVAL