📄 neo_cs.c
字号:
/* * 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -