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