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