X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/d8cf9c21f978da4a6a3c9a39237a853b40906392..8dc0685213ead3f8896c83cadc130143ccc4d181:/src/math.c diff --git a/src/math.c b/src/math.c index 7813305..941f706 100644 --- a/src/math.c +++ b/src/math.c @@ -23,11 +23,18 @@ #include "modcmd.h" #include "saxdb.h" #include "timeq.h" + +#ifdef HAVE_TGMATH_H +#include +#else +#include +#include +#endif + #include #include #include #include -#include #include #ifdef WIN32 @@ -118,6 +125,81 @@ void do_math(char *Buffer, char *Math) int Index; int OEndExpected; + + /* This is a HACK to insert * before ( so multiplication takes place + * in things such as 3(3) instead of ignoring the first 3. Submitted + * by Osiris. + * I spent some time tlooking at calc.c and I didnt see an easy way + * to do this there... and that file gives me a headache.. so.. -Rubin + */ + char newMath[MAXLEN]; + char *ptr; + char lastNumber = false; + char lastBracket = false; + + + ptr = newMath; + while(*Math && ptr < newMath+MAXLEN-1) + { + switch(*Math) + { + case '1': case '2': + case '3': case '4': + case '5': case '6': + case '7': case '8': + case '9': case '0': + lastNumber = true; + if(lastBracket == true) + { + *ptr = '*'; + ptr++; + } + *ptr = *Math; + lastBracket = false; + break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': + case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': + case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': + case 'v': case 'w': case 'x': case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': + case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': + case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': + case 'V': case 'W': case 'X': case 'Y': case 'Z': + case ')': case ']': /* Support sin[12](3) also */ + lastNumber = true; + lastBracket = true; + *ptr = *Math; + break; + case '(': case '[': + if (lastNumber == true) + { + *ptr = '*'; + ptr++; + } + *ptr = *Math; + lastNumber = false; + lastBracket = false; + break; + default: + if(isalpha(*Math)) + { + if(lastNumber == true) + { + *ptr = '*'; + ptr++; + } + } + *ptr = *Math; + lastNumber = false; + lastBracket = false; + break; + } + Math++; + ptr++; + } + *ptr = '\0'; + Math = newMath; + if (!(List = ListFirst = malloc(sizeof(struct MathToken)))) goto MemError; if (!(Stack = StackFirst = malloc(sizeof(struct MathToken)))) goto MemError; if (!(PostFix = PostFixFirst = malloc(sizeof(struct MathToken)))) goto MemError;