NSIS/Contrib/Math/Source/plugin.c
wizou 752d7d239a Jim Park's Unicode NSIS merging - Step 1 : switch to TCHARs where relevant.
Compiler output is identical before & after this step

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/branches/wizou@6036 212acab6-be3b-0410-9dea-997c60f758d6
2010-03-24 17:22:56 +00:00

100 lines
2.6 KiB
C

// Unicode support by Jim Park -- 08/22/2007
#include <windows.h>
#include "MyMath.h"
#include "Math.h"
#ifdef _DEBUG_LEAKS
#include <crtdbg.h>
int blocksnum = 0;
HGLOBAL blocks[100000];
HGLOBAL watchGlobalAlloc(UINT Flags, UINT size)
{
HGLOBAL block = GlobalAlloc(Flags, size);
blocks[blocksnum++] = block;
return block;
}
void watchGlobalFree(HGLOBAL block)
{
for (int i = 0; i < blocksnum; i++)
if (blocks[i] == block) blocks[i] = NULL;
GlobalFree(block);
}
void watchGlobal()
{
for (int i = 0; i < blocksnum; i++)
if (blocks[i] != NULL)
{
_RPT2(_CRT_WARN, _T("Memory leak %d at %8X\n"), i, blocks[i]);
}
}
#endif
TCHAR *AllocString()
{
return (TCHAR*) dbgGlobalAlloc(GPTR,g_stringsize*sizeof(TCHAR));
}
ExpressionItem *AllocItem()
{
ExpressionItem *item = (ExpressionItem*)dbgGlobalAlloc(GPTR,sizeof(ExpressionItem));
item->next = NULL;
item->type = IT_CONST | ITC_INT;
item->param1 = item->param2 = 0;
return item;
}
ExpressionItem *AllocArray(int s)
{
int size = DEFAULT_ARRAY_SIZE;
while (s > size) size*=2;
ExpressionItem *ai = (ExpressionItem*)dbgGlobalAlloc(GPTR,sizeof(ExpressionItem));
ai->type = IT_CONST | ITC_ARRAY;
ai->param1 = (EIPARAM) dbgGlobalAlloc(GPTR, sizeof(ArrayDesc));
ArrayDesc *ad = *((ArrayDesc**)&(ai->param1));
// initialize and clear the array memory
ad->array = (ExpressionItem**) dbgGlobalAlloc(GPTR, size*sizeof(ExpressionItem*));
ad->size = size;
ad->count = 0;
ad->references = 1;
return ai;
}
ExpressionItem *CopyItem(ExpressionItem *citem, int NeedConst)
{
if (!citem) return NULL;
ExpressionItem *item = NULL;
if ((NeedConst) && ((citem->type & ITEMTYPE) != IT_CONST))
{
// in case of non constant expression - flat it to const
RunTree(citem, item, RTO_NEEDCONST | ITC_INT | ITC_STRING | ITC_FLOAT | ITC_ARRAY);
if (item) return item;
}
item = AllocItem();
item->type = citem->type;
if ((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_STRING))
{
item->param1 = (EIPARAM) AllocString();
lstrcpy((LPTSTR) item->param1, (LPTSTR) citem->param1);
} else if (((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_ARRAY))
||
((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_VARIABLE | ITV_ARRITEM)))
{
item->param1 = citem->param1;
ArrayDesc *ad = (ArrayDesc*) item->param1;
ad->references++;
}
else item->param1 = citem->param1;
item->param2 = citem->param2;
item->next = NULL;
return item;
}