1 2 using System; 3 using System.Runtime.InteropServices; 4 5 namespace Clearsilver { 6 7 // opaque types 8 public unsafe struct HDF {}; 9 public unsafe struct NEOERR {}; 10 11 public unsafe class Hdf { 12 13 [DllImport("libneo", EntryPoint="hdf_init")] hdf_init(HDF **foo)14 private static extern unsafe NEOERR* hdf_init(HDF **foo); 15 16 // NEOERR* hdf_set_value (HDF *hdf, char *name, char *value) 17 [DllImport("libneo")] hdf_set_value(HDF *hdf, [MarshalAs(UnmanagedType.LPStr)] string name, [MarshalAs(UnmanagedType.LPStr)] string value)18 private static unsafe extern NEOERR* hdf_set_value(HDF *hdf, 19 [MarshalAs(UnmanagedType.LPStr)] 20 string name, 21 [MarshalAs(UnmanagedType.LPStr)] 22 string value); 23 24 // char* hdf_get_value (HDF *hdf, char *name, char *defval) 25 26 [DllImport("libneo")] 27 [return: MarshalAs(UnmanagedType.LPStr)] hdf_get_value(HDF *hdf, [MarshalAs(UnmanagedType.LPStr)] string name, [MarshalAs(UnmanagedType.LPStr)] string defval)28 private static unsafe extern string hdf_get_value(HDF *hdf, 29 [MarshalAs(UnmanagedType.LPStr)] 30 string name, 31 [MarshalAs(UnmanagedType.LPStr)] 32 string defval); 33 34 // NEOERR* hdf_dump (HDF *hdf, char *prefix); 35 36 [DllImport("libneo", EntryPoint="hdf_dump")] hdf_dump( HDF *hdf, [MarshalAs(UnmanagedType.LPStr)] string prefix)37 private static extern void hdf_dump( 38 HDF *hdf, 39 [MarshalAs(UnmanagedType.LPStr)] 40 string prefix); 41 42 // HDF* hdf_get_obj (HDF *hdf, char *name) 43 44 [DllImport("libneo", EntryPoint="hdf_get_obj")] hdf_get_obj( HDF *hdf, [MarshalAs(UnmanagedType.LPStr)] string name)45 private static extern HDF* hdf_get_obj( 46 HDF *hdf, 47 [MarshalAs(UnmanagedType.LPStr)] 48 string name); 49 50 51 // ----------------------------------------------------------- 52 53 public HDF *hdf_root; 54 Hdf()55 public Hdf() { 56 fixed (HDF **hdf_ptr = &hdf_root) { 57 hdf_init(hdf_ptr); 58 } 59 // Console.WriteLine((int)hdf_root); 60 } 61 setValue(string name,string value)62 public void setValue(string name,string value) { 63 hdf_set_value(hdf_root,name,value); 64 65 } getValue(string name,string defvalue)66 public string getValue(string name,string defvalue) { 67 return hdf_get_value(hdf_root,name,defvalue); 68 } 69 test()70 public void test() { 71 hdf_set_value(hdf_root,"b","1"); 72 // hdf_read_file(hdf_root,"test.hdf"); 73 // Console.WriteLine("b ", hdf_get_value(hdf_root,"b","5")); 74 hdf_dump(hdf_root,null); 75 76 // HDF *n = hdf_get_obj(hdf_root,"b"); 77 // Console.WriteLine("object name {0}", 78 // Marshal.PtrToStringAnsi((IntPtr)n->name)); 79 } 80 81 }; 82 83 unsafe struct CSPARSE {}; 84 85 public class CSTContext { 86 unsafe CSPARSE *csp; CSTContext(Hdf hdf)87 unsafe public CSTContext(Hdf hdf) { 88 fixed (CSPARSE **csp_ptr = &csp) { 89 cs_init(csp_ptr, hdf.hdf_root); 90 } 91 } 92 93 [DllImport("libneo")] cs_init(CSPARSE **parse, HDF *hdf)94 extern static unsafe NEOERR *cs_init (CSPARSE **parse, HDF *hdf); 95 parseFile(string filename)96 public unsafe void parseFile(string filename) { 97 cs_parse_file(csp,filename); 98 } 99 100 [DllImport("libneo")] cs_parse_file(CSPARSE *parse, [MarshalAs(UnmanagedType.LPStr)] string path)101 extern static unsafe NEOERR *cs_parse_file (CSPARSE *parse, 102 [MarshalAs(UnmanagedType.LPStr)] 103 string path); 104 105 // [DllImport("libneo")] 106 // extern static unsafe NEOERR *cs_parse_string (CSPARSE *parse, 107 // char *buf, 108 // size_t blen); 109 110 111 // NEOERR *cs_render (CSPARSE *parse, void *ctx, CSOUTFUNC cb); 112 // typedef NEOERR* (*CSOUTFUNC)(void *ctx, char *more_str_bytes); 113 114 [DllImport("libneo")] cs_render(CSPARSE *parse, void *ctx, [MarshalAs(UnmanagedType.FunctionPtr)] CSOUTFUNC cb)115 extern static unsafe NEOERR *cs_render (CSPARSE *parse, 116 void *ctx, 117 [MarshalAs(UnmanagedType.FunctionPtr)] 118 CSOUTFUNC cb); 119 CSOUTFUNC(void* ctx, sbyte* more_bytes)120 private unsafe delegate NEOERR* CSOUTFUNC(void* ctx, sbyte* more_bytes); 121 122 private class OutputBuilder { 123 private string output = ""; handleOutput(void* ctx, sbyte* more_bytes)124 public unsafe NEOERR* handleOutput(void* ctx, sbyte* more_bytes) { 125 // add the more_bytes to the current string buffer 126 127 output += new String(more_bytes); 128 // Console.WriteLine("handleOutput called"); 129 return null; 130 } result()131 public string result() { 132 return output; 133 } 134 } 135 render()136 public unsafe string render() { 137 OutputBuilder ob = new OutputBuilder(); 138 cs_render(csp,null,new CSOUTFUNC(ob.handleOutput)); 139 return ob.result(); 140 } 141 142 143 [DllImport("libneo")] cs_destroy(CSPARSE **parse)144 extern static unsafe void cs_destroy (CSPARSE **parse); 145 146 }; 147 148 149 } // namespace Clearsilver 150