1 /* Copyright (c) 2013-2019 Mahmoud Fayed <msfclipper@yahoo.com> */
5 void ring_vm_math_loadfunctions ( RingState *pRingState )
7 ring_vm_funcregister("sin",ring_vm_math_sin);
8 ring_vm_funcregister("cos",ring_vm_math_cos);
9 ring_vm_funcregister("tan",ring_vm_math_tan);
10 ring_vm_funcregister("asin",ring_vm_math_asin);
11 ring_vm_funcregister("acos",ring_vm_math_acos);
12 ring_vm_funcregister("atan",ring_vm_math_atan);
13 ring_vm_funcregister("atan2",ring_vm_math_atan2);
14 ring_vm_funcregister("sinh",ring_vm_math_sinh);
15 ring_vm_funcregister("cosh",ring_vm_math_cosh);
16 ring_vm_funcregister("tanh",ring_vm_math_tanh);
17 ring_vm_funcregister("exp",ring_vm_math_exp);
18 ring_vm_funcregister("log",ring_vm_math_log);
19 ring_vm_funcregister("log10",ring_vm_math_log10);
20 ring_vm_funcregister("ceil",ring_vm_math_ceil);
21 ring_vm_funcregister("floor",ring_vm_math_floor);
22 ring_vm_funcregister("fabs",ring_vm_math_fabs);
23 ring_vm_funcregister("pow",ring_vm_math_pow);
24 ring_vm_funcregister("sqrt",ring_vm_math_sqrt);
25 ring_vm_funcregister("unsigned",ring_vm_math_unsigned);
26 ring_vm_funcregister("decimals",ring_vm_math_decimals);
27 ring_vm_funcregister("murmur3hash",ring_vm_math_murmur3hash);
30 void ring_vm_math_sin ( void *pPointer )
32 if ( RING_API_PARACOUNT != 1 ) {
33 RING_API_ERROR(RING_API_MISS1PARA);
36 if ( RING_API_ISNUMBER(1) ) {
37 RING_API_RETNUMBER(sin(RING_API_GETNUMBER(1)));
39 RING_API_ERROR(RING_API_BADPARATYPE);
43 void ring_vm_math_cos ( void *pPointer )
45 if ( RING_API_PARACOUNT != 1 ) {
46 RING_API_ERROR(RING_API_MISS1PARA);
49 if ( RING_API_ISNUMBER(1) ) {
50 RING_API_RETNUMBER(cos(RING_API_GETNUMBER(1)));
52 RING_API_ERROR(RING_API_BADPARATYPE);
56 void ring_vm_math_tan ( void *pPointer )
58 if ( RING_API_PARACOUNT != 1 ) {
59 RING_API_ERROR(RING_API_MISS1PARA);
62 if ( RING_API_ISNUMBER(1) ) {
63 RING_API_RETNUMBER(tan(RING_API_GETNUMBER(1)));
65 RING_API_ERROR(RING_API_BADPARATYPE);
69 void ring_vm_math_asin ( void *pPointer )
71 if ( RING_API_PARACOUNT != 1 ) {
72 RING_API_ERROR(RING_API_MISS1PARA);
75 if ( RING_API_ISNUMBER(1) ) {
76 RING_API_RETNUMBER(asin(RING_API_GETNUMBER(1)));
78 RING_API_ERROR(RING_API_BADPARATYPE);
82 void ring_vm_math_acos ( void *pPointer )
84 if ( RING_API_PARACOUNT != 1 ) {
85 RING_API_ERROR(RING_API_MISS1PARA);
88 if ( RING_API_ISNUMBER(1) ) {
89 RING_API_RETNUMBER(acos(RING_API_GETNUMBER(1)));
91 RING_API_ERROR(RING_API_BADPARATYPE);
95 void ring_vm_math_atan ( void *pPointer )
97 if ( RING_API_PARACOUNT != 1 ) {
98 RING_API_ERROR(RING_API_MISS1PARA);
101 if ( RING_API_ISNUMBER(1) ) {
102 RING_API_RETNUMBER(atan(RING_API_GETNUMBER(1)));
104 RING_API_ERROR(RING_API_BADPARATYPE);
108 void ring_vm_math_atan2 ( void *pPointer )
110 if ( RING_API_PARACOUNT != 2 ) {
111 RING_API_ERROR(RING_API_MISS2PARA);
114 if ( RING_API_ISNUMBER(1) && RING_API_ISNUMBER(2) ) {
115 RING_API_RETNUMBER(atan2(RING_API_GETNUMBER(1),RING_API_GETNUMBER(2)));
117 RING_API_ERROR(RING_API_BADPARATYPE);
121 void ring_vm_math_sinh ( void *pPointer )
123 if ( RING_API_PARACOUNT != 1 ) {
124 RING_API_ERROR(RING_API_MISS1PARA);
127 if ( RING_API_ISNUMBER(1) ) {
128 RING_API_RETNUMBER(sinh(RING_API_GETNUMBER(1)));
130 RING_API_ERROR(RING_API_BADPARATYPE);
134 void ring_vm_math_cosh ( void *pPointer )
136 if ( RING_API_PARACOUNT != 1 ) {
137 RING_API_ERROR(RING_API_MISS1PARA);
140 if ( RING_API_ISNUMBER(1) ) {
141 RING_API_RETNUMBER(cosh(RING_API_GETNUMBER(1)));
143 RING_API_ERROR(RING_API_BADPARATYPE);
147 void ring_vm_math_tanh ( void *pPointer )
149 if ( RING_API_PARACOUNT != 1 ) {
150 RING_API_ERROR(RING_API_MISS1PARA);
153 if ( RING_API_ISNUMBER(1) ) {
154 RING_API_RETNUMBER(tanh(RING_API_GETNUMBER(1)));
156 RING_API_ERROR(RING_API_BADPARATYPE);
160 void ring_vm_math_exp ( void *pPointer )
162 if ( RING_API_PARACOUNT != 1 ) {
163 RING_API_ERROR(RING_API_MISS1PARA);
166 if ( RING_API_ISNUMBER(1) ) {
167 RING_API_RETNUMBER(exp(RING_API_GETNUMBER(1)));
169 RING_API_ERROR(RING_API_BADPARATYPE);
173 void ring_vm_math_log ( void *pPointer )
175 if ( RING_API_PARACOUNT != 1 ) {
176 RING_API_ERROR(RING_API_MISS1PARA);
179 if ( RING_API_ISNUMBER(1) ) {
180 RING_API_RETNUMBER(log(RING_API_GETNUMBER(1)));
182 RING_API_ERROR(RING_API_BADPARATYPE);
186 void ring_vm_math_log10 ( void *pPointer )
188 if ( RING_API_PARACOUNT != 1 ) {
189 RING_API_ERROR(RING_API_MISS1PARA);
192 if ( RING_API_ISNUMBER(1) ) {
193 RING_API_RETNUMBER(log10(RING_API_GETNUMBER(1)));
195 RING_API_ERROR(RING_API_BADPARATYPE);
199 void ring_vm_math_ceil ( void *pPointer )
201 if ( RING_API_PARACOUNT != 1 ) {
202 RING_API_ERROR(RING_API_MISS1PARA);
205 if ( RING_API_ISNUMBER(1) ) {
206 RING_API_RETNUMBER(ceil(RING_API_GETNUMBER(1)));
208 RING_API_ERROR(RING_API_BADPARATYPE);
212 void ring_vm_math_floor ( void *pPointer )
214 if ( RING_API_PARACOUNT != 1 ) {
215 RING_API_ERROR(RING_API_MISS1PARA);
218 if ( RING_API_ISNUMBER(1) ) {
219 RING_API_RETNUMBER(floor(RING_API_GETNUMBER(1)));
221 RING_API_ERROR(RING_API_BADPARATYPE);
225 void ring_vm_math_fabs ( void *pPointer )
227 if ( RING_API_PARACOUNT != 1 ) {
228 RING_API_ERROR(RING_API_MISS1PARA);
231 if ( RING_API_ISNUMBER(1) ) {
232 RING_API_RETNUMBER(fabs(RING_API_GETNUMBER(1)));
234 RING_API_ERROR(RING_API_BADPARATYPE);
238 void ring_vm_math_pow ( void *pPointer )
240 if ( RING_API_PARACOUNT != 2 ) {
241 RING_API_ERROR(RING_API_MISS2PARA);
244 if ( RING_API_ISNUMBER(1) && RING_API_ISNUMBER(2) ) {
245 RING_API_RETNUMBER(pow(RING_API_GETNUMBER(1),RING_API_GETNUMBER(2)));
247 RING_API_ERROR(RING_API_BADPARATYPE);
251 void ring_vm_math_sqrt ( void *pPointer )
253 if ( RING_API_PARACOUNT != 1 ) {
254 RING_API_ERROR(RING_API_MISS1PARA);
257 if ( RING_API_ISNUMBER(1) ) {
258 RING_API_RETNUMBER(sqrt(RING_API_GETNUMBER(1)));
260 RING_API_ERROR(RING_API_BADPARATYPE);
264 void ring_vm_math_unsigned ( void *pPointer )
266 unsigned long nNum1,nNum2,nNum3 ;
268 if ( RING_API_PARACOUNT != 3 ) {
269 RING_API_ERROR(RING_API_MISS3PARA);
272 if ( RING_API_ISNUMBER(1) && RING_API_ISNUMBER(2) && RING_API_ISSTRING(3) ) {
273 nNum1 = (unsigned long) RING_API_GETNUMBER(1) ;
274 nNum2 = (unsigned long) RING_API_GETNUMBER(2) ;
275 cStr = RING_API_GETSTRING(3) ;
276 if ( strcmp(cStr,">>") == 0 ) {
277 nNum3 = nNum1 >> nNum2 ;
279 else if ( strcmp(cStr,"<<") == 0 ) {
280 nNum3 = nNum1 << nNum2 ;
282 else if ( strcmp(cStr,"+") == 0 ) {
283 nNum3 = nNum1 + nNum2 ;
285 else if ( strcmp(cStr,"-") == 0 ) {
286 nNum3 = nNum1 - nNum2 ;
288 else if ( strcmp(cStr,"*") == 0 ) {
289 nNum3 = nNum1 * nNum2 ;
291 else if ( strcmp(cStr,"/") == 0 ) {
293 nNum3 = nNum1 / nNum2 ;
296 RING_API_ERROR(RING_VM_ERROR_DIVIDEBYZERO);
300 else if ( strcmp(cStr,"^") == 0 ) {
301 nNum3 = nNum1 ^ nNum2 ;
303 else if ( strcmp(cStr,"<") == 0 ) {
304 nNum3 = nNum1 < nNum2 ;
306 else if ( strcmp(cStr,">") == 0 ) {
307 nNum3 = nNum1 > nNum2 ;
309 else if ( strcmp(cStr,"<=") == 0 ) {
310 nNum3 = nNum1 <= nNum2 ;
312 else if ( strcmp(cStr,">=") == 0 ) {
313 nNum3 = nNum1 >= nNum2 ;
315 else if ( strcmp(cStr,"=") == 0 ) {
316 nNum3 = nNum1 == nNum2 ;
318 else if ( strcmp(cStr,"!=") == 0 ) {
319 nNum3 = nNum1 != nNum2 ;
321 else if ( strcmp(cStr,"&") == 0 ) {
322 nNum3 = nNum1 & nNum2 ;
324 else if ( strcmp(cStr,"|") == 0 ) {
325 nNum3 = nNum1 | nNum2 ;
327 else if ( strcmp(cStr,"~") == 0 ) {
330 RING_API_ERROR(RING_API_BADPARATYPE);
333 RING_API_RETNUMBER((double) nNum3);
335 RING_API_ERROR(RING_API_BADPARATYPE);
339 void ring_vm_math_decimals ( void *pPointer )
342 if ( RING_API_PARACOUNT == 1 ) {
343 if ( RING_API_ISNUMBER(1) ) {
344 nNum1 = (int) RING_API_GETNUMBER(1) ;
345 if ( (nNum1 >= 0) && (nNum1 <= 14) ) {
346 ((VM *) pPointer)->nDecimals = nNum1 ;
349 RING_API_ERROR(RING_VM_ERROR_BADDECIMALNUMBER);
352 RING_API_ERROR(RING_API_BADPARATYPE);
355 RING_API_ERROR(RING_API_BADPARACOUNT);
360 void ring_vm_math_murmur3hash ( void *pPointer )
362 unsigned int nResult ;
363 if ( RING_API_PARACOUNT != 2 ) {
364 RING_API_ERROR(RING_API_MISS2PARA);
367 if ( RING_API_ISSTRING(1) && RING_API_ISNUMBER(2) ) {
368 nResult = ring_murmur3_32(RING_API_GETSTRING(1),RING_API_GETSTRINGSIZE(1),RING_API_GETNUMBER(2));
369 RING_API_RETNUMBER(nResult);
371 RING_API_ERROR(RING_API_BADPARATYPE);