version 2 final
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@1511 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
47e865d306
commit
0a1b4aa83c
12 changed files with 159 additions and 879 deletions
|
@ -3,6 +3,14 @@
|
|||
#include "System.h"
|
||||
#include "Buffers.h"
|
||||
|
||||
typedef struct tagTempStack TempStack;
|
||||
typedef struct tagTempStack
|
||||
{
|
||||
TempStack *Next;
|
||||
char Data[0];
|
||||
} TempStack;
|
||||
TempStack *tempstack = NULL;
|
||||
|
||||
PLUGINFUNCTIONSHORT(Alloc)
|
||||
{
|
||||
int size;
|
||||
|
@ -27,10 +35,10 @@ PLUGINFUNCTIONSHORT(Copy)
|
|||
if (str[0] == '/')
|
||||
{
|
||||
size = (int) myatoi(str+1);
|
||||
dest = popint();
|
||||
dest = (HANDLE) popint();
|
||||
}
|
||||
else dest = (HANDLE) myatoi(str+1);
|
||||
source = popint();
|
||||
source = (HANDLE) popint();
|
||||
|
||||
// Ok, check the size
|
||||
if (size == 0) size = (int) GlobalSize(source);
|
||||
|
@ -46,36 +54,53 @@ PLUGINFUNCTIONEND
|
|||
|
||||
PLUGINFUNCTIONSHORT(Free)
|
||||
{
|
||||
char *str;
|
||||
// Get the string
|
||||
if ((str = popstring()) == NULL) return;
|
||||
// Check for callback clear
|
||||
if (lstrcmpi(str,"/callback") == 0)
|
||||
{
|
||||
SystemProc *proc, *next;
|
||||
next = (SystemProc*) popint();
|
||||
// Clear all the clone queue of callback
|
||||
while ((proc = next) != NULL)
|
||||
{
|
||||
next = proc->Clone;
|
||||
GlobalFree((HANDLE)proc);
|
||||
}
|
||||
}
|
||||
else
|
||||
GlobalFree((HANDLE) myatoi(str));
|
||||
GlobalFree(str);
|
||||
GlobalFree((HANDLE) popint());
|
||||
}
|
||||
PLUGINFUNCTIONEND
|
||||
|
||||
char *copymem(char *output, char *input, int size)
|
||||
PLUGINFUNCTION(Store)
|
||||
{
|
||||
char *out = output;
|
||||
while (size-- > 0) *(out++) = *(input++);
|
||||
return output;
|
||||
}
|
||||
TempStack *tmp;
|
||||
int size = ((INST_R9+1)*g_stringsize);
|
||||
|
||||
HANDLE GlobalCopy(HANDLE Old)
|
||||
{
|
||||
SIZE_T size = GlobalSize(Old);
|
||||
return copymem(GlobalAlloc(GPTR, size), Old, (int) size);
|
||||
}
|
||||
char *command, *cmd = command = popstring();
|
||||
while (*cmd != 0)
|
||||
{
|
||||
switch (*(cmd++))
|
||||
{
|
||||
case 's':
|
||||
case 'S':
|
||||
// Store the whole variables range
|
||||
tmp = (TempStack*) GlobalAlloc(GPTR, sizeof(TempStack)+size);
|
||||
tmp->Next = tempstack;
|
||||
tempstack = tmp;
|
||||
|
||||
// Fill with data
|
||||
copymem(tempstack->Data, g_variables, size);
|
||||
break;
|
||||
case 'l':
|
||||
case 'L':
|
||||
// Fill with data
|
||||
copymem(g_variables, tempstack->Data, size);
|
||||
|
||||
// Restore stack
|
||||
tmp = tempstack->Next;
|
||||
GlobalFree((HANDLE) tempstack);
|
||||
tempstack = tmp;
|
||||
break;
|
||||
case 'P':
|
||||
*cmd += 10;
|
||||
case 'p':
|
||||
GlobalFree((HANDLE) pushstring(getuservariable(*(cmd++)-'0')));
|
||||
break;
|
||||
case 'R':
|
||||
*cmd += 10;
|
||||
case 'r':
|
||||
GlobalFree((HANDLE) setuservariable(*(cmd++)-'0', popstring()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
GlobalFree((HANDLE) command);
|
||||
}
|
||||
PLUGINFUNCTIONEND
|
Loading…
Add table
Add a link
Reference in a new issue