PLUGINFUNCTIONEND PLUGINFUNCTIONSHORT(Copy) { int size = 0; HANDLE source, dest; char *str; // Get the string if ((str = system_popstring()) == NULL) return; // Check for size option if (str[0] == '/') { size = (int) myatoi64(str+1); dest = (HANDLE) popint64(); } else dest = (HANDLE) myatoi64(str); source = (HANDLE) popint64(); // Ok, check the size if (size == 0) size = (int) GlobalSize(source); // and the destinantion if ((int) dest == 0) { dest = GlobalAlloc((GPTR), size); system_pushint((int) dest); } // COPY! copymem(dest, source, size); GlobalFree(str); }
} PLUGINFUNCTIONEND PLUGINFUNCTIONSHORT(Int64Op) { __int64 i1, i2 = 0, i3, i4; TCHAR *op; #ifndef _WIN64 TCHAR buf[25], *o1, *o2; #endif // Get parameters: <num1> <op> [num2] #ifdef _WIN64 i1 = system_popintptr(); #else o1 = system_popstring(), i1 = myatoi64(o1); #endif op = system_popstring(); if ((*op != _T('~')) && (*op != _T('!'))) { #ifdef _WIN64 i2 = system_popintptr(); #else o2 = system_popstring(), i2 = myatoi64(o2), GlobalFree(o2); #endif } // operation switch (*op) { case _T('+'): i1 += i2; break; case _T('-'): i1 -= i2; break; case _T('*'): i1 *= i2; break; case _T('/'): case _T('%'): // It's unclear, but in this case compiler will use DivMod rountine // instead of two separate Div and Mod rountines. if (i2 == 0) { i3 = 0; i4 = i1; } else {i3 = i1 / i2; i4 = i1 % i2; } if (*op == _T('/')) i1 = i3; else i1 = i4; break; case _T('|'): if (op[1] == _T('|')) i1 = i1 || i2; else i1 |= i2; break; case _T('&'): if (op[1] == _T('&')) i1 = i1 && i2; else i1 &= i2; break; case _T('^'): i1 ^= i2; break; case _T('~'): i1 = ~i1; break; case _T('!'): i1 = !i1; break; case _T('<'): if (op[1] == _T('<')) i1 = i1 << i2; else i1 = i1 < i2; break; case _T('>'): if (op[1] == _T('>')) i1 = i1 >> i2; else i1 = i1 > i2; break; case _T('='): i1 = (i1 == i2); break; }
int popint64() { int value; TCHAR *str; if ((str = system_popstring()) == NULL) return -1; value = (int) myatoi64(str); GlobalFree(str); return value; }
} PLUGINFUNCTIONEND PLUGINFUNCTIONSHORT(Int64Op) { __int64 i1, i2 = 0, i3, i4; TCHAR *op, *o1, *o2; TCHAR buf[128]; // Get strings o1 = system_popstring(); op = system_popstring(); i1 = myatoi64(o1); // convert first arg to int64 if ((*op != _T('~')) && (*op != _T('!'))) { // get second arg, convert it, free it o2 = system_popstring(); i2 = myatoi64(o2); GlobalFree(o2); } // operation switch (*op) { case _T('+'): i1 += i2; break; case _T('-'): i1 -= i2; break; case _T('*'): i1 *= i2; break; case _T('/'): case _T('%'): // It's unclear, but in this case compiler will use DivMod rountine // instead of two separate Div and Mod rountines. if (i2 == 0) { i3 = 0; i4 = i1; } else {i3 = i1 / i2; i4 = i1 % i2; } if (*op == _T('/')) i1 = i3; else i1 = i4; break; case _T('|'): if (op[1] == _T('|')) i1 = i1 || i2; else i1 |= i2; break; case _T('&'): if (op[1] == _T('&')) i1 = i1 && i2; else i1 &= i2; break; case _T('^'): i1 ^= i2; break; case _T('~'): i1 = ~i1; break; case _T('!'): i1 = !i1; break; case _T('<'): if (op[1] == _T('<')) i1 = i1 << i2; else i1 = i1 < i2; break; case _T('>'): if (op[1] == _T('>')) i1 = i1 >> i2; else i1 = i1 > i2; break; case _T('='): i1 = (i1 == i2); break; }
// Updated for int64 and simple bitwise operations __int64 myatoi64(TCHAR *s) { __int64 v=0; // Check for right input if (!s) return 0; if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) { s++; for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('9')) c-=_T('0'); else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; else break; v<<=4; v+=c; } } else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) { for (;;) { int c=*(++s); if (c >= _T('0') && c <= _T('7')) c-=_T('0'); else break; v<<=3; v+=c; } } else { int sign=0; if (*s == _T('-')) sign++; else s--; for (;;) { int c=*(++s) - _T('0'); if (c < 0 || c > 9) break; v*=10; v+=c; } if (sign) v = -v; } // Support for simple ORed expressions if (*s == _T('|')) { v |= myatoi64(s+1); } return v; }
__int64 JNL_HTTPGet::content_length() { char *p=getheader("content-length:"); if (!p) return 0; __int64 cl = myatoi64(p); if (cl > 0) return cl; // workaround for bug #1744091 // some buggy apache servers return negative values for sizes // over 2gb - fix it for them if (cl < 0) return (__int64)((unsigned int)(cl)); return 0; }