diff options
Diffstat (limited to 'plugins/Variables/src/parse_math.cpp')
-rw-r--r-- | plugins/Variables/src/parse_math.cpp | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/plugins/Variables/src/parse_math.cpp b/plugins/Variables/src/parse_math.cpp new file mode 100644 index 0000000000..c214898b5d --- /dev/null +++ b/plugins/Variables/src/parse_math.cpp @@ -0,0 +1,225 @@ +/*
+ Variables Plugin for Miranda-IM (www.miranda-im.org)
+ Copyright 2003-2006 P. Boon
+
+ This program is mir_free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+#include "variables.h"
+#include "parse_math.h"
+
+static TCHAR *parseAdd(ARGUMENTSINFO *ai) {
+
+ unsigned int i;
+ int result;
+
+ if (ai->argc < 3) {
+ return NULL;
+ }
+ result = 0;
+ for (i=1;i<ai->argc;i++) {
+ result += ttoi(ai->targv[i]);
+ }
+ return itot(result);
+}
+
+static TCHAR *parseDiv(ARGUMENTSINFO *ai) {
+
+ int val1, val2;
+
+ if (ai->argc != 3) {
+ return NULL;
+ }
+
+ val1 = ttoi(ai->targv[1]);
+ val2 = ttoi(ai->targv[2]);
+ if (val2 == 0) {
+ return NULL;
+ }
+ return itot(val1/val2);
+}
+
+static TCHAR *parseHex(ARGUMENTSINFO *ai) {
+
+ int val;
+ unsigned int i, zeros;
+ int padding;
+ TCHAR *res, szVal[34];
+
+ if (ai->argc != 3)
+ return NULL;
+
+ val = ttoi(ai->targv[1]);
+ padding = ttoi(ai->targv[2]);
+ mir_sntprintf(szVal, SIZEOF(szVal), _T("%x"), val);
+ zeros = max(padding - (signed int)_tcslen(szVal), 0);
+ res = (TCHAR*)mir_alloc((zeros + _tcslen(szVal) + 3)*sizeof(TCHAR));
+ if (res == NULL)
+ return NULL;
+
+ ZeroMemory(res, (zeros + _tcslen(szVal) + 3)*sizeof(TCHAR));
+ _tcscpy(res, _T("0x"));
+ for (i=0;i<zeros;i++)
+ *(res+2+i) = _T('0');
+
+ _tcscat(res, szVal);
+ return res;
+}
+
+static TCHAR *parseMod(ARGUMENTSINFO *ai) {
+
+ int val1, val2;
+
+ if (ai->argc != 3) {
+ return NULL;
+ }
+ val1 = ttoi(ai->targv[1]);
+ val2 = ttoi(ai->targv[2]);
+ if (val2 == 0) {
+ return NULL;
+ }
+
+ return itot(val1%val2);
+}
+
+static TCHAR *parseMul(ARGUMENTSINFO *ai) {
+
+ unsigned int i;
+ int result;
+
+ if (ai->argc < 3) {
+ return NULL;
+ }
+ result = ttoi(ai->targv[1]);
+ for (i=2;i<ai->argc;i++) {
+ result *= ttoi(ai->targv[i]);
+ }
+
+ return itot(result);
+}
+
+static TCHAR *parseMuldiv(ARGUMENTSINFO *ai) {
+
+ if (ai->argc != 4) {
+ return NULL;
+ }
+ if (ttoi(ai->targv[3]) == 0) {
+ return NULL;
+ }
+
+ return itot((ttoi(ai->targv[1])*ttoi(ai->targv[2]))/ttoi(ai->targv[3]));
+}
+
+static TCHAR *parseMin(ARGUMENTSINFO *ai) {
+
+ unsigned int i;
+ int minVal;
+
+ if (ai->argc < 2) {
+ return NULL;
+ }
+ minVal = ttoi(ai->targv[1]);
+ for (i=2;i<ai->argc;i++) {
+ minVal = min(ttoi(ai->targv[i]), minVal);
+ }
+
+ return itot(minVal);
+}
+
+static TCHAR *parseMax(ARGUMENTSINFO *ai) {
+
+ unsigned int i;
+ int maxVal;
+
+ if (ai->argc < 2) {
+ return NULL;
+ }
+ maxVal = ttoi(ai->targv[1]);
+ for (i=2;i<ai->argc;i++) {
+ maxVal = max(ttoi(ai->targv[i]), maxVal);
+ }
+
+ return itot(maxVal);
+}
+
+static TCHAR *parseNum(ARGUMENTSINFO *ai) {
+
+ int val;
+ unsigned int zeros, i;
+ int padding;
+ TCHAR *res, *szVal, *cur;
+
+ if (ai->argc != 3)
+ return NULL;
+
+ val = ttoi(ai->targv[1]);
+ padding = ttoi(ai->targv[2]);
+ szVal = itot(val);
+ if (szVal == NULL)
+ return NULL;
+
+ zeros = max(padding - (signed int)_tcslen(szVal), 0);
+ res = (TCHAR*)mir_alloc((zeros + _tcslen(szVal) + 1)*sizeof(TCHAR));
+ if (res == NULL)
+ return NULL;
+
+ ZeroMemory(res, (zeros + _tcslen(szVal) + 1)*sizeof(TCHAR));
+ cur = res;
+ for (i=0;i<zeros;i++)
+ *cur++ = _T('0');
+
+ _tcscat(res, szVal);
+ mir_free(szVal);
+
+ return res;
+}
+
+static TCHAR *parseRand(ARGUMENTSINFO *ai) {
+
+ return itot(rand());
+}
+
+static TCHAR *parseSub(ARGUMENTSINFO *ai) {
+
+ unsigned int i;
+ int result;
+
+ if (ai->argc < 3) {
+ return NULL;
+ }
+ result = ttoi(ai->targv[1]);
+ for (i=2;i<ai->argc;i++) {
+ result -= ttoi(ai->targv[i]);
+ }
+
+ return itot(result);
+}
+
+int registerMathTokens() {
+
+ registerIntToken(_T(ADD), parseAdd, TRF_FUNCTION, "Mathematical Functions\t(x,y ,...)\tx + y + ...");
+ registerIntToken(_T(DIV), parseDiv, TRF_FUNCTION, "Mathematical Functions\t(x,y)\tx divided by y");
+ registerIntToken(_T(HEX), parseHex, TRF_FUNCTION, "Mathematical Functions\t(x,y)\tconverts decimal value x to hex value and padds to length y");
+ registerIntToken(_T(MOD), parseMod, TRF_FUNCTION, "Mathematical Functions\t(x,y)\tx modulo y (remainder of x divided by y)");
+ registerIntToken(_T(MUL), parseMul, TRF_FUNCTION, "Mathematical Functions\t(x,y)\tx times y");
+ registerIntToken(_T(MULDIV), parseMuldiv, TRF_FUNCTION, "Mathematical Functions\t(x,y,z)\tx times y divided by z");
+ registerIntToken(_T(MIN), parseMin, TRF_FUNCTION, "Mathematical Functions\t(x,y,...)\tminimum value of (decimal) arguments");
+ registerIntToken(_T(MAX), parseMax, TRF_FUNCTION, "Mathematical Functions\t(x,y,...)\tmaximum value of (decimal) arguments");
+ registerIntToken(_T(NUM), parseNum, TRF_FUNCTION, "Mathematical Functions\t(x,y)\tpads decimal value x to length y with zeros");
+ registerIntToken(_T(RAND), parseRand, TRF_FUNCTION, "Mathematical Functions\t()\trandom number");
+ registerIntToken(_T(SUB), parseSub, TRF_FUNCTION, "Mathematical Functions\t(x,y,...)\tx - y - ...");
+ srand((unsigned int)GetTickCount());
+
+ return 0;
+}
|