From 06ab0c631449c259df1ec3f821217cf7dc910dd6 Mon Sep 17 00:00:00 2001 From: kichik Date: Fri, 12 Dec 2008 19:27:02 +0000 Subject: [PATCH] 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 --- Contrib/Math/Math.txt | 12 +++---- Contrib/Math/SConscript | 1 + Contrib/Math/Source/Math.c | 19 +++++++++-- Contrib/Math/Source/Math.h | 62 ++---------------------------------- Contrib/Math/Source/plugin.c | 38 ---------------------- Contrib/Math/math.nsi | 6 ---- 6 files changed, 24 insertions(+), 114 deletions(-) diff --git a/Contrib/Math/Math.txt b/Contrib/Math/Math.txt index 83fdd796..e304b343 100644 --- a/Contrib/Math/Math.txt +++ b/Contrib/Math/Math.txt @@ -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 diff --git a/Contrib/Math/SConscript b/Contrib/Math/SConscript index cac91a14..aaf7cd10 100644 --- a/Contrib/Math/SConscript +++ b/Contrib/Math/SConscript @@ -8,6 +8,7 @@ files = Split(""" libs = Split(""" kernel32 + user32 """) examples = Split(""" diff --git a/Contrib/Math/Source/Math.c b/Contrib/Math/Source/Math.c index 7077c84f..96e6fc55 100644 --- a/Contrib/Math/Source/Math.c +++ b/Contrib/Math/Source/Math.c @@ -1,4 +1,5 @@ #include +#include // 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; } diff --git a/Contrib/Math/Source/Math.h b/Contrib/Math/Source/Math.h index 23dad925..f80b11b6 100644 --- a/Contrib/Math/Source/Math.h +++ b/Contrib/Math/Source/Math.h @@ -1,5 +1,7 @@ #pragma once +#include // 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); diff --git a/Contrib/Math/Source/plugin.c b/Contrib/Math/Source/plugin.c index 93cb37e1..11a44568 100644 --- a/Contrib/Math/Source/plugin.c +++ b/Contrib/Math/Source/plugin.c @@ -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 @@ -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); diff --git a/Contrib/Math/math.nsi b/Contrib/Math/math.nsi index bde76168..a32ab3c0 100644 --- a/Contrib/Math/math.nsi +++ b/Contrib/Math/math.nsi @@ -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