convert to plug-in library and never unload so user variables are saved

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5843 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2008-12-12 19:27:02 +00:00
parent 608b642375
commit 06ab0c6314
6 changed files with 24 additions and 114 deletions

View file

@ -7,10 +7,9 @@ twice before run :)
New HOW TO USE: run the MathTest.Exe, and try yourself. After spending
some minutes your should be able to write your script by yourself.
To include it to your NSIS script just insert that (don't forget /NOUNLOAD
in case of multiple calls):
Math::Script /NOUNLOAD "YourScript1"
Math::Script /NOUNLOAD "YourScript2"
To include it to your NSIS script just insert that:
Math::Script "YourScript1"
Math::Script "YourScript2"
Math::Script "YourScriptFinal"
How to use it? Simple:
@ -104,8 +103,7 @@ other. All sub-expressions separated by (;) are the part of one expression,
and the result of the last one of these sub-exprs gives you the result of
expression.
All the shit (like variables and functions) will be saved between calls if
you'll use /NOUNLOAD or setpluginunload alwaysoff.
All the shit (like variables and functions) will be saved between calls.
Functions:
type conversions:
@ -173,7 +171,7 @@ declare as additional arguments, which will never be used. Example:
No matter how many arguments will be passed to function, the values of all three
vars (a,b,c) will be saved.
Such variable-safe functions could be recursive:
Math::Script /NOUNLOAD 'rec(a) (#[a > 0, rec(a-1), 0]+a);'
Math::Script 'rec(a) (#[a > 0, rec(a-1), 0]+a);'
Math::Script 'R1 = rec(10)'
will set R1 to right result 55.
Sometimes functions will need to return more than one value, in this case you

View file

@ -8,6 +8,7 @@ files = Split("""
libs = Split("""
kernel32
user32
""")
examples = Split("""

View file

@ -1,4 +1,5 @@
#include <windows.h>
#include <plugin.h> // nsis plugin library
#include "MyMath.h"
#include "Math.h"
@ -1480,14 +1481,25 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
}
}
static UINT_PTR PluginCallback(enum NSPIM msg)
{
return 0;
}
HINSTANCE g_hInstance;
extern "C"
void __declspec(dllexport) Script(HWND hwndParent, int string_size,
char *variables, stack_t **stacktop)
char *variables, stack_t **stacktop,
extra_parameters *extra)
{
Math_INIT();
EXDLL_INIT();
char *buffer = AllocString(), *buf = buffer;
ExpressionItem *root = NULL; // root of current tree
// keep loaded to save user defined variables
extra->RegisterPluginCallback(g_hInstance, PluginCallback);
// pop script string
popstring(buffer);
@ -1540,8 +1552,9 @@ void CleanAll(int init)
}
}
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance = hInst;
CleanAll(ul_reason_for_call == DLL_PROCESS_ATTACH);
return TRUE;
}

View file

@ -1,5 +1,7 @@
#pragma once
#include <plugin.h> // nsis plugin api
#ifdef _DEBUG
//#define _DEBUG_LEAKS
#endif
@ -21,66 +23,6 @@ HGLOBAL watchGlobalAlloc(UINT Flags, UINT size);
#endif
// only include this file from one place in your DLL.
// (it is all static, if you use it in two places it will fail)
#define Math_INIT() { \
g_stringsize=string_size; \
g_stacktop=stacktop; \
g_variables=variables; }
// For page showing plug-ins
#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
#define NOTIFY_BYE_BYE 'x'
typedef struct _stack_t {
struct _stack_t *next;
char text[1]; // this should be the length of string_size
} stack_t;
extern unsigned int g_stringsize;
extern stack_t **g_stacktop;
extern char *g_variables;
enum
{
INST_0, // $0
INST_1, // $1
INST_2, // $2
INST_3, // $3
INST_4, // $4
INST_5, // $5
INST_6, // $6
INST_7, // $7
INST_8, // $8
INST_9, // $9
INST_R0, // $R0
INST_R1, // $R1
INST_R2, // $R2
INST_R3, // $R3
INST_R4, // $R4
INST_R5, // $R5
INST_R6, // $R6
INST_R7, // $R7
INST_R8, // $R8
INST_R9, // $R9
INST_CMDLINE, // $CMDLINE
INST_INSTDIR, // $INSTDIR
INST_OUTDIR, // $OUTDIR
INST_EXEDIR, // $EXEDIR
INST_LANG, // $LANGUAGE
__INST_LAST
};
// utility functions (not required but often useful)
int popstring(char *str);
void pushstring(char *str);
char *getuservariable(int varnum);
void setuservariable(int varnum, char *var);
char *AllocString();
ExpressionItem *AllocItem();
ExpressionItem *AllocArray(int size);

View file

@ -2,10 +2,6 @@
#include "MyMath.h"
#include "Math.h"
unsigned int g_stringsize;
stack_t **g_stacktop;
char *g_variables;
#ifdef _DEBUG_LEAKS
#include <crtdbg.h>
@ -38,40 +34,6 @@ void watchGlobal()
#endif
// utility functions (not required but often useful)
int popstring(char *str)
{
stack_t *th;
if (!g_stacktop || !*g_stacktop) return 1;
th=(*g_stacktop);
lstrcpy(str,th->text);
*g_stacktop = th->next;
dbgGlobalFree((HGLOBAL)th);
return 0;
}
void pushstring(char *str)
{
stack_t *th;
if (!g_stacktop) return;
th=(stack_t*)dbgGlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
lstrcpyn(th->text,str,g_stringsize);
th->next=*g_stacktop;
*g_stacktop=th;
}
char *getuservariable(int varnum)
{
if (varnum < 0 || varnum >= __INST_LAST) return NULL;
return g_variables+varnum*g_stringsize;
}
void setuservariable(int varnum, char *var)
{
if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
lstrcpy(g_variables + varnum*g_stringsize, var);
}
char *AllocString()
{
return (char*) dbgGlobalAlloc(GPTR,g_stringsize);

View file

@ -5,7 +5,6 @@
Name "Math Plugin Example"
OutFile "math.exe"
SetPluginUnload alwaysoff
ShowInstDetails show
XPStyle on
@ -29,11 +28,6 @@ Section "ThisNameIsIgnoredSoWhyBother?"
DetailPrint "'$R5'"
DetailPrint "'$R6'"
DetailPrint "'$R7'"
; last plugin call must not have /NOUNLOAD so NSIS will be able to delete the temporary DLL
SetPluginUnload manual
; do nothing
Math::Script ""
SectionEnd
; eof