OSDN Git Service

bee35679d4b87660652ce619f222a1433151ef9d
[fugashi/fugashi.git] / Fugashi / MainForm.cs
1 /*\r
2  *      Fugashi Project\r
3  *\r
4  *      This software is distributed under a BSD-style license.\r
5  *      See license.txt for more information.\r
6  */\r
7 \r
8 using System;\r
9 using System.Collections.Generic;\r
10 using System.ComponentModel;\r
11 using System.Data;\r
12 using System.Drawing;\r
13 using System.Text;\r
14 using System.Windows.Forms;\r
15 \r
16 namespace Fugashi\r
17 {\r
18     public partial class MainForm : Form\r
19     {\r
20         private BitSwitch[] bits;\r
21         private int length = 4;\r
22 \r
23         public MainForm()\r
24         {\r
25             InitializeComponent();\r
26 \r
27             bits = new BitSwitch[64];\r
28             foreach (Control c in table.Controls)\r
29             {\r
30                 if (c is BitSwitches4)\r
31                 {\r
32                     BitSwitches4 bs = c as BitSwitches4;\r
33                     int i = bs.StartBit;\r
34                     bits[i + 0] = bs.B0;\r
35                     bits[i + 1] = bs.B1;\r
36                     bits[i + 2] = bs.B2;\r
37                     bits[i + 3] = bs.B3;\r
38                 }\r
39             }\r
40             foreach (BitSwitch b in bits)\r
41             {\r
42                 b.StateChanged += BitChanged;\r
43             }\r
44             Font mono = new Font(FontFamily.GenericMonospace, textHex.Font.Size);\r
45             textHex.Font = mono;\r
46             textValue.Font = mono;\r
47 \r
48             PerformAutoScale();\r
49         }\r
50 \r
51         private void radioUint_CheckedChanged(object sender, EventArgs e)\r
52         {\r
53             if (radioUint.Checked)\r
54             {\r
55                 UpdateValue(GetBytes());\r
56             }\r
57         }\r
58 \r
59         private void radioInt_CheckedChanged(object sender, EventArgs e)\r
60         {\r
61             if (radioInt.Checked)\r
62             {\r
63                 UpdateValue(GetBytes());\r
64             }\r
65         }\r
66 \r
67         private void radioFloat_CheckedChanged(object sender, EventArgs e)\r
68         {\r
69             if (radioFloat.Checked)\r
70             {\r
71                 radio1B.Enabled = false;\r
72                 radio2B.Enabled = false;\r
73                 if (radio1B.Checked || radio2B.Checked)\r
74                 {\r
75                     radio4B.Checked = true;\r
76                 }\r
77                 SetForFloatingPoint(radio8B.Checked);\r
78                 UpdateValue(GetBytes());\r
79             }\r
80             else\r
81             {\r
82                 SetForInteger();\r
83                 radio1B.Enabled = true;\r
84                 radio2B.Enabled = true;\r
85             }\r
86         }\r
87 \r
88         private void MainForm_Load(object sender, EventArgs e)\r
89         {\r
90             radioUint.Checked = true;\r
91             radio4B.Checked = true;\r
92             BitChanged(null, null);\r
93         }\r
94 \r
95         private void SetForFloatingPoint(bool isDouble)\r
96         {\r
97             for (int i = 23; i < 31; ++i)\r
98             {\r
99                 bits[i].IsExponential = !isDouble;\r
100             }\r
101             for (int i = 52; i < 63; ++i)\r
102             {\r
103                 bits[i].IsExponential = isDouble;\r
104             }\r
105         }\r
106 \r
107         private void SetForInteger()\r
108         {\r
109             for (int i = 0; i < 64; ++i)\r
110             {\r
111                 bits[i].IsExponential = false;\r
112             }\r
113         }\r
114 \r
115         private byte[] GetBytes()\r
116         {\r
117             byte[] b = new Byte[8];\r
118             int i = 0;\r
119             for (int j = 0; j < 8; ++j)\r
120             {\r
121                 b[j] = 0;\r
122                 i += 8;\r
123                 for (int k = 0; k < 8; ++k)\r
124                 {\r
125                     b[j] = (byte)(b[j] << 1 | (bits[--i].State ? 1 : 0));\r
126                 }\r
127                 i += 8;\r
128             }\r
129             return b;\r
130         }\r
131 \r
132         private long ToInt64(byte[] bytes)\r
133         {\r
134             switch (length)\r
135             {\r
136                 case 1:\r
137                     return (sbyte)bytes[0];\r
138                 case 2:\r
139                     return BitConverter.ToInt16(bytes, 0);\r
140                 case 4:\r
141                     return BitConverter.ToInt32(bytes, 0);\r
142                 case 8:\r
143                     return BitConverter.ToInt64(bytes, 0);\r
144             }\r
145             return 0;\r
146         }\r
147 \r
148         private ulong ToUInt64(byte[] bytes)\r
149         {\r
150             switch (length)\r
151             {\r
152                 case 1:\r
153                     return bytes[0];\r
154                 case 2:\r
155                     return BitConverter.ToUInt16(bytes, 0);\r
156                 case 4:\r
157                     return BitConverter.ToUInt32(bytes, 0);\r
158                 case 8:\r
159                     return BitConverter.ToUInt64(bytes, 0);\r
160             }\r
161             return 0;\r
162         }\r
163 \r
164         private void radio8B_CheckedChanged(object sender, EventArgs e)\r
165         {\r
166             if (radio8B.Checked)\r
167             {\r
168                 SetLength(8);\r
169                 if (radioFloat.Checked)\r
170                 {\r
171                     SetForFloatingPoint(true);\r
172                 }\r
173             }\r
174         }\r
175 \r
176         private void radio4B_CheckedChanged(object sender, EventArgs e)\r
177         {\r
178             if (radio4B.Checked)\r
179             {\r
180                 SetLength(4);\r
181                 if (radioFloat.Checked)\r
182                 {\r
183                     SetForFloatingPoint(false);\r
184                 }\r
185             }\r
186         }\r
187 \r
188         private void radio2B_CheckedChanged(object sender, EventArgs e)\r
189         {\r
190             if (radio2B.Checked)\r
191             {\r
192                 SetLength(2);\r
193             }\r
194         }\r
195 \r
196         private void radio1B_CheckedChanged(object sender, EventArgs e)\r
197         {\r
198             if (radio1B.Checked)\r
199             {\r
200                 SetLength(1);\r
201                 UpdateValue(GetBytes());\r
202             }\r
203         }\r
204 \r
205         private void SetLength(int length)\r
206         {\r
207             this.length = length;\r
208             int b = length * 8;\r
209             for (int i = 8; i < b; ++i)\r
210             {\r
211                 bits[i].Enabled = true;\r
212             }\r
213             for (int i = b; i < 64; ++i)\r
214             {\r
215                 bits[i].Enabled = false;\r
216             }\r
217             if (radioFloat.Checked)\r
218             {\r
219                 textValue_TextChanged(null, null);\r
220             }\r
221             else\r
222             {\r
223                 BitChanged(null, null);\r
224             }\r
225         }\r
226 \r
227         private void BitChanged(object sender, EventArgs e)\r
228         {\r
229             byte[] b = GetBytes();\r
230             UpdateValue(b);\r
231             UpdateHex(b);\r
232         }\r
233 \r
234         private void UpdateValue(byte[] bytes)\r
235         {\r
236             if (radioUint.Checked)\r
237             {\r
238                 textValue.Text = ToUInt64(bytes).ToString();\r
239             }\r
240             else if (radioInt.Checked)\r
241             {\r
242                 textValue.Text = ToInt64(bytes).ToString();\r
243             }\r
244             else if (radioFloat.Checked)\r
245             {\r
246                 if (length == 4)\r
247                 {\r
248                     float value = BitConverter.ToSingle(bytes, 0);\r
249                     textValue.Text = value.ToString("g8");\r
250                 }\r
251                 else\r
252                 {\r
253                     double value = BitConverter.ToDouble(bytes, 0);\r
254                     textValue.Text = value.ToString("g17");\r
255                 }\r
256             }\r
257         }\r
258 \r
259         private void UpdateHex(byte[] bytes)\r
260         {\r
261             textHex.Text = "";\r
262             for (int i = length - 1; i >= 0; --i)\r
263             {\r
264                 textHex.Text += bytes[i].ToString("X2");\r
265             }\r
266         }\r
267 \r
268         private void UpdateBits(byte[] bytes)\r
269         {\r
270             int i = 0;\r
271             for (int j = 0; j < length; ++j)\r
272             {\r
273                 int mask = 1;\r
274                 for (int k = 0; k < 8; ++k)\r
275                 {\r
276                     bits[i++].SetStateWithoutEvent((bytes[j] & mask) != 0);\r
277                     mask <<= 1;\r
278                 }\r
279             }\r
280         }\r
281 \r
282         private void UpdateAll(byte[] bytes)\r
283         {\r
284             UpdateBits(bytes);\r
285             UpdateValue(bytes);\r
286             UpdateHex(bytes);\r
287         }\r
288 \r
289         private void textHex_TextChanged(object sender, EventArgs e)\r
290         {\r
291             if (!textHex.Focused)\r
292             {\r
293                 return;\r
294             }\r
295             ulong value;\r
296             UInt64.TryParse(textHex.Text,\r
297                 System.Globalization.NumberStyles.HexNumber, null, out value);\r
298             byte[] b = BitConverter.GetBytes(value);\r
299             UpdateBits(b);\r
300             UpdateValue(b);\r
301         }\r
302 \r
303         private void textValue_TextChanged(object sender, EventArgs e)\r
304         {\r
305             string text = textValue.Text;\r
306             if (!textValue.Focused && sender != null)\r
307             {\r
308                 return;\r
309             }\r
310             byte[] b;\r
311             if (radioUint.Checked)\r
312             {\r
313                 ulong value;\r
314                 UInt64.TryParse(text, out value);\r
315                 b = BitConverter.GetBytes(value);\r
316             }\r
317             else if (radioInt.Checked)\r
318             {\r
319                 long value;\r
320                 Int64.TryParse(text, out value);\r
321                 b = BitConverter.GetBytes(value);\r
322             }\r
323             else if (radioFloat.Checked && length == 4)\r
324             {\r
325                 float value;\r
326                 Single.TryParse(text, out value);\r
327                 b = BitConverter.GetBytes(value);\r
328             }\r
329             else if (radioFloat.Checked && length == 8)\r
330             {\r
331                 double value;\r
332                 Double.TryParse(text, out value);\r
333                 b = BitConverter.GetBytes(value);\r
334             }\r
335             else\r
336             {\r
337                 throw new Exception();\r
338             }\r
339             UpdateBits(b);\r
340             UpdateHex(b);\r
341         }\r
342 \r
343         private void buttonInc_Click(object sender, EventArgs e)\r
344         {\r
345             if (radioFloat.Checked)\r
346             {\r
347 \r
348             }\r
349             else\r
350             {\r
351                 ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
352                 UpdateAll(BitConverter.GetBytes(++value));\r
353             }\r
354         }\r
355         private void buttonDec_Click(object sender, EventArgs e)\r
356         {\r
357             if (radioFloat.Checked)\r
358             {\r
359 \r
360             }\r
361             else\r
362             {\r
363                 ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
364                 UpdateAll(BitConverter.GetBytes(--value));\r
365             }\r
366         }\r
367 \r
368         private void buttonClr_Click(object sender, EventArgs e)\r
369         {\r
370             UpdateAll(BitConverter.GetBytes((ulong)0));\r
371         }\r
372 \r
373         private void buttonNot_Click(object sender, EventArgs e)\r
374         {\r
375             ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
376             UpdateAll(BitConverter.GetBytes(~value));\r
377         }\r
378 \r
379         private void buttonLsh_Click(object sender, EventArgs e)\r
380         {\r
381             ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
382             UpdateAll(BitConverter.GetBytes(value << 1));\r
383         }\r
384 \r
385         private void buttonRsh_Click(object sender, EventArgs e)\r
386         {\r
387             if (radioInt.Checked)\r
388             {\r
389                 long value = ToInt64(GetBytes());\r
390                 UpdateAll(BitConverter.GetBytes(value >> 1));\r
391             }\r
392             else\r
393             {\r
394                 ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
395                 UpdateAll(BitConverter.GetBytes(value >> 1));\r
396             }\r
397         }\r
398 \r
399 \r
400     }\r
401 }\r