| |
| using System; |
| using System.Runtime.InteropServices; |
| |
| namespace Clearsilver { |
| |
| // opaque types |
| public unsafe struct HDF {}; |
| public unsafe struct NEOERR {}; |
| |
| public unsafe class Hdf { |
| |
| [DllImport("libneo", EntryPoint="hdf_init")] |
| private static extern unsafe NEOERR* hdf_init(HDF **foo); |
| |
| // NEOERR* hdf_set_value (HDF *hdf, char *name, char *value) |
| [DllImport("libneo")] |
| private static unsafe extern NEOERR* hdf_set_value(HDF *hdf, |
| [MarshalAs(UnmanagedType.LPStr)] |
| string name, |
| [MarshalAs(UnmanagedType.LPStr)] |
| string value); |
| |
| // char* hdf_get_value (HDF *hdf, char *name, char *defval) |
| |
| [DllImport("libneo")] |
| [return: MarshalAs(UnmanagedType.LPStr)] |
| private static unsafe extern string hdf_get_value(HDF *hdf, |
| [MarshalAs(UnmanagedType.LPStr)] |
| string name, |
| [MarshalAs(UnmanagedType.LPStr)] |
| string defval); |
| |
| // NEOERR* hdf_dump (HDF *hdf, char *prefix); |
| |
| [DllImport("libneo", EntryPoint="hdf_dump")] |
| private static extern void hdf_dump( |
| HDF *hdf, |
| [MarshalAs(UnmanagedType.LPStr)] |
| string prefix); |
| |
| // HDF* hdf_get_obj (HDF *hdf, char *name) |
| |
| [DllImport("libneo", EntryPoint="hdf_get_obj")] |
| private static extern HDF* hdf_get_obj( |
| HDF *hdf, |
| [MarshalAs(UnmanagedType.LPStr)] |
| string name); |
| |
| |
| // ----------------------------------------------------------- |
| |
| public HDF *hdf_root; |
| |
| public Hdf() { |
| fixed (HDF **hdf_ptr = &hdf_root) { |
| hdf_init(hdf_ptr); |
| } |
| // Console.WriteLine((int)hdf_root); |
| } |
| |
| public void setValue(string name,string value) { |
| hdf_set_value(hdf_root,name,value); |
| |
| } |
| public string getValue(string name,string defvalue) { |
| return hdf_get_value(hdf_root,name,defvalue); |
| } |
| |
| public void test() { |
| hdf_set_value(hdf_root,"b","1"); |
| // hdf_read_file(hdf_root,"test.hdf"); |
| // Console.WriteLine("b ", hdf_get_value(hdf_root,"b","5")); |
| hdf_dump(hdf_root,null); |
| |
| // HDF *n = hdf_get_obj(hdf_root,"b"); |
| // Console.WriteLine("object name {0}", |
| // Marshal.PtrToStringAnsi((IntPtr)n->name)); |
| } |
| |
| }; |
| |
| unsafe struct CSPARSE {}; |
| |
| public class CSTContext { |
| unsafe CSPARSE *csp; |
| unsafe public CSTContext(Hdf hdf) { |
| fixed (CSPARSE **csp_ptr = &csp) { |
| cs_init(csp_ptr, hdf.hdf_root); |
| } |
| } |
| |
| [DllImport("libneo")] |
| extern static unsafe NEOERR *cs_init (CSPARSE **parse, HDF *hdf); |
| |
| public unsafe void parseFile(string filename) { |
| cs_parse_file(csp,filename); |
| } |
| |
| [DllImport("libneo")] |
| extern static unsafe NEOERR *cs_parse_file (CSPARSE *parse, |
| [MarshalAs(UnmanagedType.LPStr)] |
| string path); |
| |
| // [DllImport("libneo")] |
| // extern static unsafe NEOERR *cs_parse_string (CSPARSE *parse, |
| // char *buf, |
| // size_t blen); |
| |
| |
| // NEOERR *cs_render (CSPARSE *parse, void *ctx, CSOUTFUNC cb); |
| // typedef NEOERR* (*CSOUTFUNC)(void *ctx, char *more_str_bytes); |
| |
| [DllImport("libneo")] |
| extern static unsafe NEOERR *cs_render (CSPARSE *parse, |
| void *ctx, |
| [MarshalAs(UnmanagedType.FunctionPtr)] |
| CSOUTFUNC cb); |
| |
| private unsafe delegate NEOERR* CSOUTFUNC(void* ctx, sbyte* more_bytes); |
| |
| private class OutputBuilder { |
| private string output = ""; |
| public unsafe NEOERR* handleOutput(void* ctx, sbyte* more_bytes) { |
| // add the more_bytes to the current string buffer |
| |
| output += new String(more_bytes); |
| // Console.WriteLine("handleOutput called"); |
| return null; |
| } |
| public string result() { |
| return output; |
| } |
| } |
| |
| public unsafe string render() { |
| OutputBuilder ob = new OutputBuilder(); |
| cs_render(csp,null,new CSOUTFUNC(ob.handleOutput)); |
| return ob.result(); |
| } |
| |
| |
| [DllImport("libneo")] |
| extern static unsafe void cs_destroy (CSPARSE **parse); |
| |
| }; |
| |
| |
| } // namespace Clearsilver |