| 1231 | // parameters to the function. |
| 1232 | |
| 1233 | flag FEvalFunction(int ifun, PAR *rgpar, char *rgpchEval[2]) |
| 1234 | { |
| 1235 | int ipar, nType, n = 0, n1, n2, n3, n4; |
| 1236 | real r = 0.0, r1, r2, r3, r4; |
| 1237 | char sz[cchSzMax]; |
| 1238 | flag fRetOpt = fFalse, fRetReal = fFalse, fOpt = fFalse, fOptReal = fFalse; |
| 1239 | #ifdef WIN |
| 1240 | POINT pt; |
| 1241 | #endif |
| 1242 | |
| 1243 | // Analyze the input and output parameter types. |
| 1244 | for (ipar = 0; ipar <= rgfun[ifun].nParam; ipar++) { |
| 1245 | nType = (rgfun[ifun].nType >> (ipar << 1)) & 3; |
| 1246 | if (ipar == 0) { |
| 1247 | if (nType == R_) |
| 1248 | fRetReal = fTrue; |
| 1249 | else if (nType == E_) |
| 1250 | fRetOpt = fTrue; |
| 1251 | continue; |
| 1252 | } |
| 1253 | if (nType == I_) { |
| 1254 | if (rgpar[ipar].fReal) |
| 1255 | rgpar[ipar].n = (int)rgpar[ipar].r; |
| 1256 | } else if (nType == R_) { |
| 1257 | if (!rgpar[ipar].fReal) |
| 1258 | rgpar[ipar].r = (real)rgpar[ipar].n; |
| 1259 | } else if (nType == E_) { |
| 1260 | fOpt = fTrue; |
| 1261 | if (rgpar[ipar].fReal) |
| 1262 | fOptReal = fTrue; |
| 1263 | } |
| 1264 | } |
| 1265 | |
| 1266 | // Convert optional type parameters to real if any are real. |
| 1267 | if (fOpt && fOptReal) |
| 1268 | for (ipar = 1; ipar <= rgfun[ifun].nParam; ipar++) { |
| 1269 | nType = (rgfun[ifun].nType >> (ipar << 1)) & 3; |
| 1270 | if (nType == E_ && !rgpar[ipar].fReal) { |
| 1271 | rgpar[ipar].r = (real)rgpar[ipar].n; |
| 1272 | rgpar[ipar].fReal = fTrue; |
| 1273 | } |
| 1274 | } |
| 1275 | if (fRetOpt && fOptReal) |
| 1276 | fRetReal = fTrue; |
| 1277 | |
| 1278 | n1 = rgpar[1].n; n2 = rgpar[2].n; n3 = rgpar[3].n; n4 = rgpar[4].n; |
| 1279 | r1 = rgpar[1].r; r2 = rgpar[2].r; r3 = rgpar[3].r; r4 = rgpar[4].r; |
| 1280 | |
| 1281 | switch (ifun) { |
| 1282 | // General functions (independent of Astrolog and astrology) |
| 1283 | case funFalse: n = fFalse; break; |
| 1284 | case funTrue: n = fTrue; break; |
| 1285 | case funInt: n = n1; break; |
| 1286 | case funReal: r = r1; break; |
| 1287 | case funBool: n = (n1 != 0); break; |
| 1288 | case funType: n = fOptReal; break; |
| 1289 | case funAdd: EIR(n1 + n2, r1 + r2); break; |
| 1290 | case funSub: EIR(n1 - n2, r1 - r2); break; |
no test coverage detected