/[pearpc]/src/debug/stdfuncs.cc
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /src/debug/stdfuncs.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 7 months ago) by dpavlin
File size: 14147 byte(s)
import upstream CVS
1 dpavlin 1 /*
2     * HT Editor
3     * stdfuncs.cc
4     *
5     * Copyright (C) 2003 Stefan Weyergraf
6     *
7     * This program is free software; you can redistribute it and/or modify
8     * it under the terms of the GNU General Public License version 2 as
9     * published by the Free Software Foundation.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19     */
20    
21     #include "tools/except.h"
22     #include "debug/stdfuncs.h"
23    
24     #define declareIntOperator1(NAME, CODE...) \
25     class NAME: public PFunction {\
26     public:\
27     virtual EvalType getReturnType() const { return ET_INTEGER;}\
28     virtual SInt64 * evalInteger() const\
29     {\
30     sint64 arg0 = ((Function *)mArgs[0])->evalInteger()->value;\
31     CODE\
32     }\
33     };\
34     static Function *create##NAME() { return new NAME(); }
35    
36     /**/
37     #define declareIntOperator2(NAME, CODE...) \
38     class NAME: public PFunction {\
39     public:\
40     virtual EvalType getReturnType() const { return ET_INTEGER;}\
41     virtual SInt64 * evalInteger() const\
42     {\
43     sint64 arg0 = ((Function *)mArgs[0])->evalInteger()->value;\
44     sint64 arg1 = ((Function *)mArgs[1])->evalInteger()->value;\
45     CODE\
46     }\
47     };\
48     static Function *create##NAME() { return new NAME(); }
49    
50     /**/
51     #define declareFloatOperator2(NAME, CODE...) \
52     class NAME: public PFunction {\
53     public:\
54     virtual EvalType getReturnType() const { return ET_FLOAT;}\
55     virtual Float * evalFloat() const\
56     {\
57     double arg0 = ((Function *)mArgs[0])->evalFloat()->value;\
58     double arg1 = ((Function *)mArgs[1])->evalFloat()->value;\
59     CODE\
60     }\
61     };\
62     static Function *create##NAME() { return new NAME(); }
63    
64     /**/
65     #define declareFloatOperator1(NAME, CODE...) \
66     class NAME: public PFunction {\
67     public:\
68     virtual EvalType getReturnType() const { return ET_FLOAT;}\
69     virtual Float * evalFloat() const\
70     {\
71     double arg0 = ((Function *)mArgs[0])->evalFloat()->value;\
72     CODE\
73     }\
74     };\
75     static Function *create##NAME() { return new NAME(); }
76    
77     /**/
78     #define declareIntFuncFloatFloat(NAME, CODE...) \
79     class NAME: public PFunction {\
80     public:\
81     virtual EvalType getReturnType() const { return ET_INTEGER;}\
82     virtual SInt64 * evalInteger() const\
83     {\
84     double arg0 = ((Function *)mArgs[0])->evalFloat()->value;\
85     double arg1 = ((Function *)mArgs[1])->evalFloat()->value;\
86     CODE\
87     }\
88     };\
89     static Function *create##NAME() { return new NAME(); }
90    
91     /**/
92     #define declareStrOperator2(NAME, CODE...) \
93     class NAME: public PFunction {\
94     public:\
95     virtual EvalType getReturnType() const { return ET_STRING;}\
96     virtual String * evalString() const\
97     {\
98     String *arg0 = ((Function *)mArgs[0])->evalString();\
99     String *arg1 = ((Function *)mArgs[1])->evalString();\
100     CODE\
101     }\
102     };\
103     static Function *create##NAME() { return new NAME(); }
104     /**/
105    
106     #define declareIntFuncStrStr(NAME, CODE...) \
107     class NAME: public PFunction {\
108     public:\
109     virtual EvalType getReturnType() const { return ET_INTEGER;}\
110     virtual SInt64 * evalInteger() const\
111     {\
112     String *arg0 = ((Function *)mArgs[0])->evalString();\
113     String *arg1 = ((Function *)mArgs[1])->evalString();\
114     CODE\
115     }\
116     };\
117     static Function *create##NAME() { return new NAME(); }
118     /**/
119    
120     /* integer functions */
121     declareIntOperator2(MulFuncInt, return new SInt64(arg0 * arg1); );
122     declareIntOperator2(DivFuncInt,
123     if (!arg1) throw MsgException("division by zero");
124     return new SInt64(arg0 / arg1);
125     );
126     declareIntOperator2(RemFuncInt,
127     if (!arg1) throw MsgException("division by zero");
128     return new SInt64(arg0 % arg1);
129     );
130     declareIntOperator2(AddFuncInt, return new SInt64(arg0 + arg1); );
131     declareIntOperator2(SubFuncInt, return new SInt64(arg0 - arg1); );
132     declareIntOperator2(AndFuncInt, return new SInt64(arg0 & arg1); );
133     declareIntOperator2(OrFuncInt, return new SInt64(arg0 | arg1); );
134     declareIntOperator2(XorFuncInt, return new SInt64(arg0 ^ arg1); );
135     declareIntOperator2(ShlFuncInt, return new SInt64((uint64)arg0 << arg1); );
136     declareIntOperator2(ShrFuncInt, return new SInt64((uint64)arg0 >> arg1); );
137     declareIntOperator2(PowFuncInt,
138     sint64 b = arg0;
139     sint64 e = arg1;
140     sint64 r = 1;
141     int ln2_e = -1;
142     uint64 uarg1 = arg1;
143     while (uarg1) {
144     uarg1 >>= 1;
145     ln2_e ++;
146     }
147     uint64 mask = 1L << ln2_e;
148     while (1) {
149     if (e & mask) r *= b;
150     mask >>= 1;
151     if (!mask) break;
152     r = r*r;
153     }
154     return new SInt64(r);
155     );
156     declareIntOperator2(MaxFuncInt, return new SInt64((arg1>arg0) ? arg1 : arg0); );
157     declareIntOperator2(MinFuncInt, return new SInt64((arg1<arg0) ? arg1 : arg0); );
158    
159     declareIntOperator2(LAndFuncInt, return new SInt64(arg0 && arg1); );
160     declareIntOperator2(LOrFuncInt, return new SInt64(arg0 || arg1); );
161     declareIntOperator2(LXorFuncInt, return new SInt64((arg0 && !arg1) || (!arg0 && arg1)); );
162    
163     declareIntOperator2(LTFuncInt, return new SInt64(arg0 < arg1); );
164     declareIntOperator2(GTFuncInt, return new SInt64(arg0 > arg1); );
165     declareIntOperator2(LEFuncInt, return new SInt64(arg0 <= arg1); );
166     declareIntOperator2(GEFuncInt, return new SInt64(arg0 >= arg1); );
167     declareIntOperator2(EQFuncInt, return new SInt64(arg0 == arg1); );
168     declareIntOperator2(NEFuncInt, return new SInt64(arg0 != arg1); );
169     declareIntOperator2(GcdFuncInt,
170     while (arg1) {
171     sint64 temp = arg1;
172     arg1 = arg0 % arg1;
173     arg0 = temp;
174     }
175     return new SInt64((arg0<0) ? -arg0 : arg0);
176     );
177    
178     declareIntOperator2(BinCoeffFuncInt,
179     // calculate (n k) = n! / (n-k)! / k!
180     uint64 n = arg0;
181     uint64 k = arg1;
182     uint64 r = 1;
183     for (uint64 i = n; i>n-k; i--) {
184     r *= i;
185     }
186     for (uint64 i = 2; i<=k; i++) {
187     r /= i;
188     }
189     return new SInt64(r);
190     );
191    
192     declareIntOperator1(FacFuncInt,
193     if (arg0 < 0) throw MsgException("invalid argument (must be >= 0)");
194     // 0! = 1!
195     if (arg0 == 0) arg0 = 1;
196     uint64 r = arg0;
197     while (arg0-- > 2) {
198     r *= arg0;
199     }
200     return new SInt64(r);
201     );
202     declareIntOperator1(NegateFuncInt, return new SInt64(-arg0); );
203    
204     /* float functions */
205     declareFloatOperator2(MulFuncFloat, return new Float(arg0 * arg1); );
206     declareFloatOperator2(DivFuncFloat,
207     if (!arg1) throw MsgException("division by zero");
208     return new Float(arg0 / arg1);
209     );
210     declareFloatOperator2(AddFuncFloat, return new Float(arg0 + arg1); );
211     declareFloatOperator2(SubFuncFloat, return new Float(arg0 - arg1); );
212     declareFloatOperator2(PowFuncFloat, return new Float(pow(arg0, arg1)); );
213    
214     declareFloatOperator2(MaxFuncFloat, return new Float((arg1>arg0) ? arg1 : arg0); );
215     declareFloatOperator2(MinFuncFloat, return new Float((arg1<arg0) ? arg1 : arg0); );
216    
217     declareFloatOperator1(SqrtFuncFloat, return new Float(sqrt(arg0)); );
218     declareFloatOperator1(ExpFuncFloat, return new Float(exp(arg0)); );
219     declareFloatOperator1(LogFuncFloat, return new Float(log(arg0)); );
220     declareFloatOperator1(CeilFuncFloat, return new Float(ceil(arg0)); );
221     declareFloatOperator1(FloorFuncFloat, return new Float(floor(arg0)); );
222     declareFloatOperator1(SinFuncFloat, return new Float(sin(arg0)); );
223     declareFloatOperator1(CosFuncFloat, return new Float(cos(arg0)); );
224     declareFloatOperator1(TanFuncFloat, return new Float(tan(arg0)); );
225     declareFloatOperator1(ASinFuncFloat, return new Float(asin(arg0)); );
226     declareFloatOperator1(ACosFuncFloat, return new Float(acos(arg0)); );
227     declareFloatOperator1(ATanFuncFloat, return new Float(atan(arg0)); );
228    
229     declareFloatOperator1(NegateFuncFloat, return new Float(-arg0); );
230    
231     declareIntFuncFloatFloat(LTFuncFloat, return new SInt64(arg0 < arg1); );
232     declareIntFuncFloatFloat(GTFuncFloat, return new SInt64(arg0 > arg1); );
233     declareIntFuncFloatFloat(LEFuncFloat, return new SInt64(arg0 <= arg1); );
234     declareIntFuncFloatFloat(GEFuncFloat, return new SInt64(arg0 >= arg1); );
235     declareIntFuncFloatFloat(EQFuncFloat, return new SInt64(arg0 == arg1); );
236     declareIntFuncFloatFloat(NEFuncFloat, return new SInt64(arg0 != arg1); );
237     /* string functions */
238     declareStrOperator2(ConcatFuncStr,
239     String *r = new String(arg0);
240     r->append(arg1);
241     return r;
242     );
243    
244     declareIntFuncStrStr(LTFuncStr, return new SInt64(arg0 < arg1); );
245     declareIntFuncStrStr(GTFuncStr, return new SInt64(arg0 > arg1); );
246     declareIntFuncStrStr(LEFuncStr, return new SInt64(arg0 <= arg1); );
247     declareIntFuncStrStr(GEFuncStr, return new SInt64(arg0 >= arg1); );
248     declareIntFuncStrStr(EQFuncStr, return new SInt64(arg0->compareTo(arg1) == 0); );
249     declareIntFuncStrStr(NEFuncStr, return new SInt64(arg0->compareTo(arg1) != 0); );
250    
251     /* special functions */
252     class MiniIf: public PFunction {
253     public:
254     virtual EvalType getReturnType() const
255     {
256     if (mArgs.count() != 3) throw MsgException("exactly 3 parameters required");
257     EvalType arg1t = ((Function *)mArgs[1])->getReturnType();
258     EvalType arg2t = ((Function *)mArgs[2])->getReturnType();
259     if ((arg1t == ET_STRING) || (arg2t == ET_STRING)) return ET_STRING;
260     if ((arg1t == ET_FLOAT) || (arg2t == ET_FLOAT)) return ET_FLOAT;
261     return ET_INTEGER;
262     }
263    
264     virtual SInt64 *evalInteger() const
265     {
266     if (mArgs.count() != 3) throw MsgException("exactly 3 parameters required");
267     sint64 arg0 = ((Function *)mArgs[0])->evalInteger()->value;
268     return new SInt64(arg0 ?
269     ((Function *)mArgs[1])->evalInteger()->value :
270     ((Function *)mArgs[2])->evalInteger()->value);
271     }
272    
273     virtual Float *evalFloat() const
274     {
275     if (mArgs.count() != 3) throw MsgException("exactly 3 parameters required");
276     sint64 arg0 = ((Function *)mArgs[0])->evalInteger()->value;
277     return new Float(arg0 ?
278     ((Function *)mArgs[1])->evalFloat()->value :
279     ((Function *)mArgs[2])->evalFloat()->value);
280     }
281    
282     virtual String *evalString() const
283     {
284     if (mArgs.count() != 3) throw MsgException("exactly 3 parameters required");
285     sint64 arg0 = ((Function *)mArgs[0])->evalInteger()->value;
286     return new String(arg0 ?
287     ((Function *)mArgs[1])->evalString() :
288     ((Function *)mArgs[2])->evalString());
289     }
290     };
291     static Function *createMiniIf() { return new MiniIf(); }
292    
293     /**/
294     class TypeOfInt: public PFunction {
295     public:
296     virtual EvalType getReturnType() const { return ET_STRING; }
297     virtual String *evalString() const { return new String("integer"); }
298     };
299     static Function *createTypeOfInt() { return new TypeOfInt(); }
300    
301     /**/
302     class TypeOfFloat: public PFunction {
303     public:
304     virtual EvalType getReturnType() const { return ET_STRING; }
305     virtual String *evalString() const { return new String("float"); }
306     };
307     static Function *createTypeOfFloat() { return new TypeOfFloat(); }
308    
309     /**/
310     class TypeOfStr: public PFunction {
311     public:
312     virtual EvalType getReturnType() const { return ET_STRING; }
313     virtual String *evalString() const { return new String("string"); }
314     };
315     static Function *createTypeOfStr() { return new TypeOfStr(); }
316    
317     /**/
318     FunctionDesc gStdEvalFunctions[] =
319     {
320     { "*", 2, {ET_INTEGER, ET_INTEGER}, &createMulFuncInt },
321     { "/", 2, {ET_INTEGER, ET_INTEGER}, &createDivFuncInt },
322     { "%", 2, {ET_INTEGER, ET_INTEGER}, &createRemFuncInt },
323     { "+", 2, {ET_INTEGER, ET_INTEGER}, &createAddFuncInt },
324     { "-", 2, {ET_INTEGER, ET_INTEGER}, &createSubFuncInt },
325     { "&", 2, {ET_INTEGER, ET_INTEGER}, &createAndFuncInt },
326     { "|", 2, {ET_INTEGER, ET_INTEGER}, &createOrFuncInt },
327     { "^", 2, {ET_INTEGER, ET_INTEGER}, &createXorFuncInt },
328     { "**", 2, {ET_INTEGER, ET_INTEGER}, &createPowFuncInt },
329     { "max",2, {ET_INTEGER, ET_INTEGER}, &createMaxFuncInt },
330     { "min",2, {ET_INTEGER, ET_INTEGER}, &createMinFuncInt },
331     { "<<", 2, {ET_INTEGER, ET_INTEGER}, &createShlFuncInt },
332     { ">>", 2, {ET_INTEGER, ET_INTEGER}, &createShrFuncInt },
333     { "&&", 2, {ET_INTEGER, ET_INTEGER}, &createLAndFuncInt },
334     { "||", 2, {ET_INTEGER, ET_INTEGER}, &createLOrFuncInt },
335     { "^^", 2, {ET_INTEGER, ET_INTEGER}, &createLXorFuncInt },
336    
337     { "<", 2, {ET_INTEGER, ET_INTEGER}, &createLTFuncInt },
338     { ">", 2, {ET_INTEGER, ET_INTEGER}, &createGTFuncInt },
339     { "<=", 2, {ET_INTEGER, ET_INTEGER}, &createLEFuncInt },
340     { ">=", 2, {ET_INTEGER, ET_INTEGER}, &createGEFuncInt },
341     { "==", 2, {ET_INTEGER, ET_INTEGER}, &createEQFuncInt },
342     { "!=", 2, {ET_INTEGER, ET_INTEGER}, &createNEFuncInt },
343     { "gcd",2, {ET_INTEGER, ET_INTEGER}, &createGcdFuncInt },
344     { "bincoeff",2, {ET_INTEGER, ET_INTEGER}, &createBinCoeffFuncInt },
345     { "-", 1, {ET_INTEGER}, &createNegateFuncInt },
346     { "fac",1, {ET_INTEGER}, &createFacFuncInt },
347    
348     { "*", 2, {ET_FLOAT, ET_FLOAT}, &createMulFuncFloat },
349     { "/", 2, {ET_FLOAT, ET_FLOAT}, &createDivFuncFloat },
350     { "+", 2, {ET_FLOAT, ET_FLOAT}, &createAddFuncFloat },
351     { "-", 2, {ET_FLOAT, ET_FLOAT}, &createSubFuncFloat },
352     { "**", 2, {ET_FLOAT, ET_FLOAT}, &createPowFuncFloat },
353     { "max",2, {ET_FLOAT, ET_FLOAT}, &createMaxFuncFloat },
354     { "min",2, {ET_FLOAT, ET_FLOAT}, &createMinFuncFloat },
355    
356     { "<", 2, {ET_FLOAT, ET_FLOAT}, &createLTFuncFloat },
357     { ">", 2, {ET_FLOAT, ET_FLOAT}, &createGTFuncFloat },
358     { "<=", 2, {ET_FLOAT, ET_FLOAT}, &createLEFuncFloat },
359     { ">=", 2, {ET_FLOAT, ET_FLOAT}, &createGEFuncFloat },
360     { "==", 2, {ET_FLOAT, ET_FLOAT}, &createEQFuncFloat },
361     { "!=", 2, {ET_FLOAT, ET_FLOAT}, &createNEFuncFloat },
362     { "sqrt", 1, {ET_FLOAT}, &createSqrtFuncFloat },
363     { "exp", 1, {ET_FLOAT}, &createExpFuncFloat },
364     { "log", 1, {ET_FLOAT}, &createLogFuncFloat },
365    
366     // FIXME: should return int, not float (use float2int)
367     { "ceil", 1, {ET_FLOAT}, &createCeilFuncFloat },
368     // FIXME: should return int, not float (use float2int)
369     { "floor", 1, {ET_FLOAT}, &createFloorFuncFloat },
370    
371     { "sin", 1, {ET_FLOAT}, &createSinFuncFloat },
372     { "cos", 1, {ET_FLOAT}, &createCosFuncFloat },
373     { "tan", 1, {ET_FLOAT}, &createTanFuncFloat },
374     { "asin", 1, {ET_FLOAT}, &createASinFuncFloat },
375     { "acos", 1, {ET_FLOAT}, &createACosFuncFloat },
376     { "atan", 1, {ET_FLOAT}, &createATanFuncFloat },
377     { "-", 1, {ET_FLOAT}, &createNegateFuncFloat },
378    
379     { ".", 2, {ET_STRING, ET_STRING}, &createConcatFuncStr },
380     { "<", 2, {ET_STRING, ET_STRING}, &createLTFuncStr },
381     { ">", 2, {ET_STRING, ET_STRING}, &createGTFuncStr },
382     { "<=", 2, {ET_STRING, ET_STRING}, &createLEFuncStr },
383     { ">=", 2, {ET_STRING, ET_STRING}, &createGEFuncStr },
384     { "==", 2, {ET_STRING, ET_STRING}, &createEQFuncStr },
385     { "!=", 2, {ET_STRING, ET_STRING}, &createNEFuncStr },
386    
387     { "?:", 2, {ET_INTEGER, ET_VARARGS}, &createMiniIf },
388     { "typeof", 1, {ET_INTEGER}, &createTypeOfInt },
389     { "typeof", 1, {ET_FLOAT}, &createTypeOfFloat },
390     { "typeof", 1, {ET_STRING}, &createTypeOfStr },
391    
392     { NULL }
393     };

  ViewVC Help
Powered by ViewVC 1.1.26