OSDN Git Service

Initial contents of nt2chview
[nt2chview/stable.git] / NT2chCtrl45 / html / js / JsCmpFunction.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using System.Threading.Tasks;\r
6 \r
7 namespace NT2chCtrl.html.js\r
8 {\r
9     class JsCmpFunction : JsFunction\r
10     {\r
11         JsVariant mLhsValue;\r
12         JsVariant mRhsValue;\r
13         JsToken mOpToken;\r
14 \r
15         public JsCmpFunction(int lineNo, int srcIdx, JsToken opToken)\r
16             : base(lineNo, srcIdx)\r
17         {\r
18             mOpToken = opToken;\r
19         }\r
20         public override int getPriority()\r
21         {\r
22             return FUNC_PRIORITY_COMPARE;\r
23         }\r
24 \r
25         public override bool rearegeSquence(List<JsVariant> insList, int currIdx)\r
26         {\r
27             int count = insList.Count;\r
28             if (count < 3 || count <= (currIdx + 1))\r
29                 return false;\r
30 \r
31             mRhsValue = insList[currIdx + 1];\r
32             mLhsValue = insList[currIdx - 1];\r
33             insList.RemoveAt(currIdx + 1);\r
34             insList.RemoveAt(currIdx - 1);\r
35             mArranged = true;\r
36             return true;\r
37         }\r
38 \r
39         public override JsVariant Execute(JsFunctionContext ctx, HtmlElement rootElement)\r
40         {\r
41             base.Execute(ctx, rootElement);\r
42 \r
43             JsVariant lhs = ctx.getParamValue(rootElement, mLhsValue);\r
44             JsVariant rhs = ctx.getParamValue(rootElement, mRhsValue);\r
45 \r
46             switch (mOpToken)\r
47             {\r
48                 case JsToken.KEY_OP_CMP_EQUAL:\r
49                     return cmpEqual(lhs, rhs);\r
50                 case JsToken.KEY_OP_CMP_STRICT_EQUAL:\r
51                     return cmpStrictEqual(lhs, rhs);\r
52                 case JsToken.KEY_OP_CMP_NOT_EQUAL:\r
53                     return cmpNotEqual(lhs, rhs);\r
54                 case JsToken.KEY_OP_CMP_STRICT_NOT_EQUAL:\r
55                     return cmpStrictNotEqual(lhs, rhs);\r
56                 case JsToken.KEY_OP_CMP_LT:\r
57                 case JsToken.KEY_OP_CMP_GT:\r
58                 case JsToken.KEY_OP_CMP_LT_EQUAL:\r
59                 case JsToken.KEY_OP_CMP_GT_EQUAL:\r
60                     return cmpValues(mOpToken, lhs, rhs);\r
61             }\r
62             return null;\r
63         }\r
64 \r
65         private JsVariant cmpValues(JsToken token, JsVariant lhs, JsVariant rhs)\r
66         {\r
67             JsNumberValue nVal1 = lhs.getNumberValue();\r
68             if (nVal1 == null)\r
69                 return null;\r
70 \r
71             JsNumberValue nVal2 = rhs.getNumberValue();\r
72             if (nVal2 == null)\r
73                 return null;\r
74             double d1 = nVal1.getValue();\r
75             double d2 = nVal2.getValue();\r
76             switch (mOpToken)\r
77             {\r
78                 case JsToken.KEY_OP_CMP_LT:\r
79                     return JsBooleanValue.getConstantValue(d1 < d2);\r
80                 case JsToken.KEY_OP_CMP_GT:\r
81                     return JsBooleanValue.getConstantValue(d1 > d2);\r
82                 case JsToken.KEY_OP_CMP_LT_EQUAL:\r
83                     return JsBooleanValue.getConstantValue(d1 <= d2);\r
84                 case JsToken.KEY_OP_CMP_GT_EQUAL:\r
85                     return JsBooleanValue.getConstantValue(d1 >= d2);\r
86             }\r
87             return null;\r
88         }\r
89 \r
90         private JsVariant cmpStrictNotEqual(JsVariant lhs, JsVariant rhs)\r
91         {\r
92             JsBooleanValue bVal = cmpStrictEqual(lhs, rhs) as JsBooleanValue;\r
93             if (bVal != null)\r
94             {\r
95                 if (bVal.getValue())\r
96                     return JsBooleanValue.getFalseValue();\r
97                 else\r
98                     return JsBooleanValue.getTrueValue();\r
99             }\r
100             return null;\r
101         }\r
102 \r
103         private JsVariant cmpStrictEqual(JsVariant lhs, JsVariant rhs)\r
104         {\r
105             JsNumberValue nVal1, nVal2;\r
106             JsStringValue sVal1, sVal2;\r
107             string s1, s2;\r
108 \r
109             if (lhs == null || rhs == null)\r
110                 return null;\r
111 \r
112             if (lhs is JsNullValue)\r
113             {\r
114                 return JsBooleanValue.getConstantValue(rhs is JsNullValue);\r
115             }\r
116             if (rhs is JsNullValue)\r
117             {\r
118                 return JsBooleanValue.getConstantValue(lhs is JsNullValue);\r
119             }\r
120             if (lhs is JsUndefValue)\r
121             {\r
122                 return JsBooleanValue.getConstantValue(rhs is JsNullValue);\r
123             }\r
124             if (rhs is JsUndefValue)\r
125             {\r
126                 return JsBooleanValue.getConstantValue(lhs is JsUndefValue);\r
127             }\r
128 \r
129             nVal1 = lhs as JsNumberValue;\r
130             if (nVal1 != null)\r
131             {\r
132                 if (!(rhs is JsNumberValue))\r
133                     return JsBooleanValue.getFalseValue();\r
134                 nVal2 = rhs.getNumberValue();\r
135                 if (nVal2 == null)\r
136                     return JsBooleanValue.getFalseValue();\r
137                 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());\r
138             }\r
139             nVal1 = rhs as JsNumberValue;\r
140             if (nVal1 != null)\r
141             {\r
142                 if (!(lhs is JsNumberValue))\r
143                     return JsBooleanValue.getFalseValue();\r
144                 nVal2 = lhs.getNumberValue();\r
145                 if (nVal2 == null)\r
146                     return JsBooleanValue.getFalseValue();\r
147                 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());\r
148             }\r
149             sVal1 = lhs as JsStringValue;\r
150             if (sVal1 != null)\r
151             {\r
152                 if (!(rhs is JsStringValue))\r
153                     return JsBooleanValue.getFalseValue();\r
154                 sVal2 = rhs.getStringValue();\r
155                 if (sVal2 == null)\r
156                     return JsBooleanValue.getFalseValue();\r
157                 s1 = sVal1.getValue();\r
158                 s2 = sVal2.getValue();\r
159                 if (s1 == null || s2 == null)\r
160                     return JsBooleanValue.getFalseValue();\r
161                 return JsBooleanValue.getConstantValue(s1.Equals(s2));\r
162             }\r
163             sVal1 = rhs as JsStringValue;\r
164             if (sVal1 != null)\r
165             {\r
166                 if (!(lhs is JsStringValue))\r
167                     return JsBooleanValue.getFalseValue();\r
168                 sVal2 = lhs.getStringValue();\r
169                 if (sVal2 == null)\r
170                     return JsBooleanValue.getFalseValue();\r
171                 s1 = sVal1.getValue();\r
172                 s2 = sVal2.getValue();\r
173                 if (s1 == null || s2 == null)\r
174                     return JsBooleanValue.getFalseValue();\r
175                 return JsBooleanValue.getConstantValue(s1.Equals(s2));\r
176             }\r
177             return null;\r
178         }\r
179         private JsVariant cmpNotEqual(JsVariant lhs, JsVariant rhs)\r
180         {\r
181             JsBooleanValue bVal = cmpEqual(lhs, rhs) as JsBooleanValue;\r
182             if (bVal != null)\r
183             {\r
184                 if (bVal.getValue())\r
185                     return JsBooleanValue.getFalseValue();\r
186                 else\r
187                     return JsBooleanValue.getTrueValue();\r
188             }\r
189             return null;\r
190         }\r
191 \r
192         private JsVariant cmpEqual(JsVariant lhs, JsVariant rhs)\r
193         {\r
194             JsNumberValue nVal1, nVal2;\r
195             JsStringValue sVal1, sVal2;\r
196             string s1, s2;\r
197 \r
198             if (lhs == null || rhs == null)\r
199                 return null;\r
200 \r
201             if (lhs is JsNullValue || lhs is JsUndefValue)\r
202             {\r
203                 if (rhs is JsNullValue || rhs is JsUndefValue)\r
204                     return JsBooleanValue.getTrueValue();\r
205                 if (rhs is JsNumberValue)\r
206                 {\r
207                     double d = ((JsNumberValue)rhs).getValue();\r
208                     return JsBooleanValue.getConstantValue(d == 0);\r
209                 }\r
210                 return JsBooleanValue.getFalseValue();\r
211             }\r
212             if (rhs is JsNullValue || rhs is JsUndefValue)\r
213             {\r
214                 if (lhs is JsNullValue || lhs is JsUndefValue)\r
215                     return JsBooleanValue.getTrueValue();\r
216                 if (lhs is JsNumberValue)\r
217                 {\r
218                     double d = ((JsNumberValue)lhs).getValue();\r
219                     return JsBooleanValue.getConstantValue(d == 0);\r
220                 }\r
221                 return JsBooleanValue.getFalseValue();\r
222             }\r
223 \r
224             nVal1 = lhs as JsNumberValue;\r
225             if (nVal1 != null)\r
226             {\r
227                 nVal2 = rhs.getNumberValue();\r
228                 if (nVal2 == null)\r
229                     return JsBooleanValue.getFalseValue();\r
230                 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());\r
231             }\r
232             nVal1 = rhs as JsNumberValue;\r
233             if (nVal1 != null)\r
234             {\r
235                 nVal2 = lhs.getNumberValue();\r
236                 if (nVal2 == null)\r
237                     return JsBooleanValue.getFalseValue();\r
238                 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());\r
239             }\r
240             sVal1 = lhs as JsStringValue;\r
241             if (sVal1 != null)\r
242             {\r
243                 sVal2 = rhs.getStringValue();\r
244                 if (sVal2 == null)\r
245                     return JsBooleanValue.getFalseValue();\r
246                 s1 = sVal1.getValue();\r
247                 s2 = sVal2.getValue();\r
248                 if (s1 == null || s2 == null)\r
249                     return JsBooleanValue.getFalseValue();\r
250                 return JsBooleanValue.getConstantValue(s1.Equals(s2));\r
251             }\r
252             sVal1 = rhs as JsStringValue;\r
253             if (sVal1 != null)\r
254             {\r
255                 sVal2 = lhs.getStringValue();\r
256                 if (sVal2 == null)\r
257                     return JsBooleanValue.getFalseValue();\r
258                 s1 = sVal1.getValue();\r
259                 s2 = sVal2.getValue();\r
260                 if (s1 == null || s2 == null)\r
261                     return JsBooleanValue.getFalseValue();\r
262                 return JsBooleanValue.getConstantValue(s1.Equals(s2));\r
263             }\r
264             return null;\r
265         }\r
266 \r
267 \r
268 \r
269 \r
270 \r
271 \r
272     }\r
273 }\r