| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- #include <windows.h>
- #include "pluginapi.h"
- #ifdef _countof
- #define COUNTOF _countof
- #else
- #define COUNTOF(a) (sizeof(a)/sizeof(a[0]))
- #endif
- unsigned int g_stringsize;
- stack_t **g_stacktop;
- TCHAR *g_variables;
- // utility functions (not required but often useful)
- int NSISCALL popstring(TCHAR *str)
- {
- stack_t *th;
- if (!g_stacktop || !*g_stacktop) return 1;
- th=(*g_stacktop);
- if (str) lstrcpy(str,th->text);
- *g_stacktop = th->next;
- GlobalFree((HGLOBAL)th);
- return 0;
- }
- int NSISCALL popstringn(TCHAR *str, int maxlen)
- {
- stack_t *th;
- if (!g_stacktop || !*g_stacktop) return 1;
- th=(*g_stacktop);
- if (str) lstrcpyn(str,th->text,maxlen?maxlen:g_stringsize);
- *g_stacktop = th->next;
- GlobalFree((HGLOBAL)th);
- return 0;
- }
- void NSISCALL pushstring(const TCHAR *str)
- {
- stack_t *th;
- if (!g_stacktop) return;
- th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR)));
- lstrcpyn(th->text,str,g_stringsize);
- th->next=*g_stacktop;
- *g_stacktop=th;
- }
- TCHAR* NSISCALL getuservariable(const int varnum)
- {
- if (varnum < 0 || varnum >= __INST_LAST) return NULL;
- return g_variables+varnum*g_stringsize;
- }
- void NSISCALL setuservariable(const int varnum, const TCHAR *var)
- {
- if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
- lstrcpy(g_variables + varnum*g_stringsize, var);
- }
- #ifdef _UNICODE
- int NSISCALL PopStringA(char* ansiStr)
- {
- wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
- int rval = popstring(wideStr);
- WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
- GlobalFree((HGLOBAL)wideStr);
- return rval;
- }
- int NSISCALL PopStringNA(char* ansiStr, int maxlen)
- {
- int realLen = maxlen ? maxlen : g_stringsize;
- wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, realLen*sizeof(wchar_t));
- int rval = popstringn(wideStr, realLen);
- WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, realLen, NULL, NULL);
- GlobalFree((HGLOBAL)wideStr);
- return rval;
- }
- void NSISCALL PushStringA(const char* ansiStr)
- {
- wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
- MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
- pushstring(wideStr);
- GlobalFree((HGLOBAL)wideStr);
- return;
- }
- void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr)
- {
- lstrcpyW(wideStr, getuservariable(varnum));
- }
- void NSISCALL GetUserVariableA(const int varnum, char* ansiStr)
- {
- wchar_t* wideStr = getuservariable(varnum);
- WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
- }
- void NSISCALL SetUserVariableA(const int varnum, const char* ansiStr)
- {
- if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST)
- {
- wchar_t* wideStr = g_variables + varnum * g_stringsize;
- MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
- }
- }
- #else
- // ANSI defs
- int NSISCALL PopStringW(wchar_t* wideStr)
- {
- char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
- int rval = popstring(ansiStr);
- MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
- GlobalFree((HGLOBAL)ansiStr);
- return rval;
- }
- int NSISCALL PopStringNW(wchar_t* wideStr, int maxlen)
- {
- int realLen = maxlen ? maxlen : g_stringsize;
- char* ansiStr = (char*) GlobalAlloc(GPTR, realLen);
- int rval = popstringn(ansiStr, realLen);
- MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, realLen);
- GlobalFree((HGLOBAL)ansiStr);
- return rval;
- }
- void NSISCALL PushStringW(wchar_t* wideStr)
- {
- char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
- WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
- pushstring(ansiStr);
- GlobalFree((HGLOBAL)ansiStr);
- }
- void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr)
- {
- char* ansiStr = getuservariable(varnum);
- MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
- }
- void NSISCALL GetUserVariableA(const int varnum, char* ansiStr)
- {
- lstrcpyA(ansiStr, getuservariable(varnum));
- }
- void NSISCALL SetUserVariableW(const int varnum, const wchar_t* wideStr)
- {
- if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST)
- {
- char* ansiStr = g_variables + varnum * g_stringsize;
- WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
- }
- }
- #endif
- // playing with integers
- INT_PTR NSISCALL nsishelper_str_to_ptr(const TCHAR *s)
- {
- INT_PTR v=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;
- }
- return v;
- }
- unsigned int NSISCALL myatou(const TCHAR *s)
- {
- unsigned int v=0;
- for (;;)
- {
- unsigned int c=*s++;
- if (c >= _T('0') && c <= _T('9')) c-=_T('0');
- else break;
- v*=10;
- v+=c;
- }
- return v;
- }
- int NSISCALL myatoi_or(const TCHAR *s)
- {
- int v=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 |= myatoi_or(s+1);
- }
- return v;
- }
- INT_PTR NSISCALL popintptr()
- {
- TCHAR buf[128];
- if (popstringn(buf,COUNTOF(buf)))
- return 0;
- return nsishelper_str_to_ptr(buf);
- }
- int NSISCALL popint_or()
- {
- TCHAR buf[128];
- if (popstringn(buf,COUNTOF(buf)))
- return 0;
- return myatoi_or(buf);
- }
- void NSISCALL pushintptr(INT_PTR value)
- {
- TCHAR buffer[30];
- wsprintf(buffer, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), value);
- pushstring(buffer);
- }
|