1 // vim:set ts=4 sts=4 sw=4 tw=0: 2 3 using System; 4 using System.Runtime.InteropServices; 5 using System.Text.RegularExpressions; 6 7 namespace KaoriYa.Migemo 8 { 9 public class Migemo : IDisposable 10 { 11 #region Enumerations (from migemo.h) 12 #region enum DictionaryIndex 13 public enum DictionaryId 14 { 15 Invalid = 0, 16 Migemo = 1, 17 RomaToHira = 2, 18 HiraToKata = 3, 19 HanToZen = 4, 20 } 21 #endregion 22 23 #region enum OperatorIndex 24 public enum OperatorIndex 25 { 26 Or = 0, 27 NestIn = 1, 28 NestOut = 2, 29 SelectIn = 3, 30 SelectOut = 4, 31 NewLine = 5, 32 } 33 #endregion 34 #endregion 35 36 #region Link to migemo.dll 37 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] migemo_open(string dict)38 private static extern IntPtr migemo_open(string dict); 39 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl)] migemo_close(IntPtr obj)40 private static extern void migemo_close(IntPtr obj); 41 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] migemo_query(IntPtr obj, string query)42 private static extern IntPtr migemo_query(IntPtr obj, string query); 43 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl)] migemo_release(IntPtr obj, IntPtr result)44 private static extern void migemo_release(IntPtr obj, IntPtr result); 45 46 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] migemo_set_operator(IntPtr obj, OperatorIndex index, string op)47 private static extern int migemo_set_operator(IntPtr obj, 48 OperatorIndex index, string op); 49 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl)] migemo_get_operator(IntPtr obj, OperatorIndex index)50 private static extern IntPtr migemo_get_operator(IntPtr obj, 51 OperatorIndex index); 52 53 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] migemo_load(IntPtr obj, DictionaryId id, string file)54 private static extern DictionaryId migemo_load(IntPtr obj, 55 DictionaryId id, string file); 56 [DllImport("migemo.dll", CallingConvention = CallingConvention.Cdecl)] migemo_is_enable(IntPtr obj)57 private static extern int migemo_is_enable(IntPtr obj); 58 #endregion 59 60 private IntPtr migemoObject = IntPtr.Zero; 61 62 public IntPtr MigemoObject 63 { 64 get 65 { 66 return this.migemoObject; 67 } 68 } 69 SetOperator(OperatorIndex index, string op)70 public bool SetOperator(OperatorIndex index, string op) 71 { 72 return migemo_set_operator(this.migemoObject, index, op) != 0; 73 } GetOperator(OperatorIndex index)74 public string GetOperator(OperatorIndex index) 75 { 76 IntPtr result = migemo_get_operator(this.migemoObject, index); 77 if (result != IntPtr.Zero) 78 return Marshal.PtrToStringAnsi(result); 79 else 80 return ""; 81 } 82 83 #region Operator properties 84 public string OperatorOr { 85 get { return GetOperator(OperatorIndex.Or); } 86 set { SetOperator(OperatorIndex.Or, value); } 87 } 88 public string OperatorNestIn { 89 get { return GetOperator(OperatorIndex.NestIn); } 90 set { SetOperator(OperatorIndex.NestIn, value); } 91 } 92 public string OperatorNestOut { 93 get { return GetOperator(OperatorIndex.NestOut); } 94 set { SetOperator(OperatorIndex.NestOut, value); } 95 } 96 public string OperatorSelectIn { 97 get { return GetOperator(OperatorIndex.SelectIn); } 98 set { SetOperator(OperatorIndex.SelectIn, value); } 99 } 100 public string OperatorSelectOut { 101 get { return GetOperator(OperatorIndex.SelectOut); } 102 set { SetOperator(OperatorIndex.SelectOut, value); } 103 } 104 public string OperatorNewLine { 105 get { return GetOperator(OperatorIndex.NewLine); } 106 set { SetOperator(OperatorIndex.NewLine, value); } 107 } 108 #endregion 109 LoadDictionary(DictionaryId id, string file)110 public bool LoadDictionary(DictionaryId id, string file) 111 { 112 DictionaryId result = migemo_load(this.migemoObject, id, file); 113 return result == id; 114 } 115 IsEnable()116 public bool IsEnable() 117 { 118 return migemo_is_enable(this.migemoObject) != 0; 119 } 120 GetRegex(string query)121 public Regex GetRegex(string query) 122 { 123 return new Regex(Query(query)); 124 } 125 Query(string query)126 public string Query(string query) 127 { 128 IntPtr result = migemo_query(this.migemoObject, query); 129 if (result != IntPtr.Zero) 130 { 131 string retval = Marshal.PtrToStringAnsi(result); 132 migemo_release(this.migemoObject, result); 133 return retval; 134 } 135 else 136 return ""; 137 } 138 Dispose()139 public void Dispose() 140 { 141 //Console.WriteLine("HERE ("+this.migemoObject+")"); 142 if (this.migemoObject != IntPtr.Zero) 143 { 144 //Console.WriteLine("migemo_close() is called"); 145 migemo_close(this.migemoObject); 146 this.migemoObject = IntPtr.Zero; 147 } 148 GC.SuppressFinalize(this); 149 } 150 Migemo(string dictpath)151 public Migemo(string dictpath) 152 { 153 this.migemoObject = migemo_open(dictpath); 154 this.OperatorNestIn = "(?:"; 155 //this.OperatorNewLine = "\\s*"; 156 } 157 Migemo()158 public Migemo() : this(null) 159 { 160 } 161 ~Migemo()162 ~Migemo() 163 { 164 this.Dispose(); 165 } 166 167 #region Test entrypoint 168 #if TEST_MIGEMO 169 // �e�X�g�� Main(string[] args)170 public static int Main(string[] args) 171 { 172 Migemo m; 173 174 if (args.Length > 0) 175 { 176 m = new Migemo(args[0]); 177 Console.WriteLine("Migemo object is initialized with " 178 +args[0]); 179 } 180 else 181 { 182 m = new Migemo(); 183 Console.WriteLine("Migemo object is initialized"); 184 } 185 Console.WriteLine("MigemoObject="+m.MigemoObject); 186 187 string result = m.Query("ao"); 188 Console.WriteLine("ai="+result); 189 190 OperatorIndex[] opall = { 191 OperatorIndex.Or, OperatorIndex.NestIn, 192 OperatorIndex.NestOut, OperatorIndex.SelectIn, 193 OperatorIndex.SelectOut, OperatorIndex.NewLine 194 }; 195 foreach (OperatorIndex index in opall) 196 Console.WriteLine("OperatorIndex[{0}]={1}", 197 index, m.GetOperator(index)); 198 return 0; 199 } 200 #endif 201 #endregion 202 203 } 204 } 205