/* * 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); }