blob: 802544d982bad122540d17c1a47015f45a08d748 [file] [log] [blame]
/*
* Copyright 2001-2004 Brandon Long
* All Rights Reserved.
*
* ClearSilver Templating System
*
* This code is made available under the terms of the ClearSilver License.
* http://www.clearsilver.net/license.hdf
*
*/
#include <ruby.h>
#include "ClearSilver.h"
#include "neo_ruby.h"
static VALUE cCs;
extern VALUE mNeotonic;
extern VALUE eHdfError;
VALUE r_neo_error(NEOERR *err);
#define Srb_raise(val) rb_raise(eHdfError, "%s/%d %s",__FILE__,__LINE__,RSTRING(val)->ptr)
static void c_free (CSPARSE *csd) {
if (csd) {
cs_destroy (&csd);
}
}
static VALUE c_init (VALUE self) {
return self;
}
VALUE c_new (VALUE class, VALUE oHdf) {
CSPARSE *cs = NULL;
NEOERR *err;
t_hdfh *hdfh;
VALUE r_cs;
Data_Get_Struct(oHdf, t_hdfh, hdfh);
if (hdfh == NULL) rb_raise(eHdfError, "must include an Hdf object");
err = cs_init (&cs, hdfh->hdf);
if (err) Srb_raise(r_neo_error(err));
err = cgi_register_strfuncs(cs);
if (err) Srb_raise(r_neo_error(err));
r_cs = Data_Wrap_Struct(class, 0, c_free, cs);
rb_obj_call_init(r_cs, 0, NULL);
return r_cs;
}
static VALUE c_parse_file (VALUE self, VALUE oPath) {
CSPARSE *cs = NULL;
NEOERR *err;
char *path;
Data_Get_Struct(self, CSPARSE, cs);
path = STR2CSTR(oPath);
err = cs_parse_file (cs, path);
if (err) Srb_raise(r_neo_error(err));
return self;
}
static VALUE c_parse_str (VALUE self, VALUE oString)
{
CSPARSE *cs = NULL;
NEOERR *err;
char *s, *ms;
long l;
Data_Get_Struct(self, CSPARSE, cs);
s = rb_str2cstr(oString, &l);
/* This should be changed to use memory from the gc */
ms = strdup(s);
if (ms == NULL) rb_raise(rb_eNoMemError, "out of memory");
err = cs_parse_string (cs, ms, (size_t)l);
if (err) Srb_raise(r_neo_error(err));
return self;
}
static NEOERR *render_cb (void *ctx, char *buf)
{
STRING *str= (STRING *)ctx;
return nerr_pass(string_append(str, buf));
}
static VALUE c_render (VALUE self)
{
CSPARSE *cs = NULL;
NEOERR *err;
STRING str;
VALUE rv;
Data_Get_Struct(self, CSPARSE, cs);
string_init(&str);
err = cs_render (cs, &str, render_cb);
if (err) Srb_raise(r_neo_error(err));
rv = rb_str_new2(str.buf);
string_clear (&str);
return rv;
}
void Init_cs() {
cCs = rb_define_class_under(mNeotonic, "Cs", rb_cObject);
rb_define_singleton_method(cCs, "new", c_new, 1);
rb_define_method(cCs, "initialize", c_init, 0);
rb_define_method(cCs, "parse_file", c_parse_file, 1);
rb_define_method(cCs, "parse_string", c_parse_str, 1);
rb_define_method(cCs, "render", c_render, 0);
}