Include/NSISArray.nsh
changeset 0 d5ce4c64ef88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Include/NSISArray.nsh	Tue Oct 16 00:07:41 2007 -0400
@@ -0,0 +1,694 @@
+#####################################################
+# NSISArray.nsh by Afrow UK
+# Array script header for NSISArray plugin by Afrow UK
+# For usage, see Docs\NSISArray\Readme.html
+#
+# Script header v1.3 (RC3)
+# Only for use with the same plugin version.
+#
+# Last modified: 28th April 2005
+#
+#
+
+!ifndef NSISArray
+!define NSISArray
+
+!macro Array Name Size StrLen
+
+ !ifndef Array_ScriptHeaderInited
+
+  !ifdef ArrayCallInstDLL
+   !define ArrayPluginDLL `${ArrayCallInstDLL}`
+  !else ifndef ArrayPluginDLL
+   !define ArrayPluginDLL `NSISArray`
+  !endif
+
+  !ifndef ArrayValVar
+   Var ArrayVal
+   !define ArrayValVar $ArrayVal
+  !endif
+
+  !ifndef ArrayErrVar
+   Var ArrayErr
+   !define ArrayErrVar $ArrayErr
+  !endif
+
+ !define Array_ScriptHeaderInited
+ !endif
+
+ !ifndef `Array_${Name}_Declared`
+
+ !ifdef Array_Obj
+  !undef Array_Obj
+ !endif
+ !define Array_Obj `->`
+
+ !ifdef ArrayObj
+  !undef ArrayObj
+ !endif
+ !define ArrayObj `!insertmacro ArrayObj`
+
+ !ifdef Array_Name
+  !undef Array_Name
+ !endif
+ !define Array_Name "${Name}"
+
+ !ifdef Array_Size
+  !undef Array_Size
+ !endif
+ !define Array_Size "${Size}"
+
+ !ifdef Array_StrLen
+  !undef Array_StrLen
+ !endif
+ !define Array_StrLen "${StrLen}"
+
+ !define `Array_${Name}_Declared`
+ !else
+  !error "NSISArray: You cannot declare more than one array with the same name."
+ !endif
+!macroend
+!define Array `!insertmacro Array`
+
+!macro ArrayObj Obj
+ !ifdef Array_Obj
+  !undef Array_Obj
+ !endif
+ !define Array_Obj `${Obj}`
+!macroend
+
+!macro Array_ObjErr Null
+ !error "NSISArray: You can only set the array object style once."
+!macroend
+
+!macro ArrayFunc Func
+
+ !define `Func_${Func}`
+ !ifdef Func_Inited \
+      | Func_Print \
+      | Func_Write \
+      | Func_WriteList \
+      | Func_WriteListC \
+      | Func_Put \
+      | Func_Read \
+      | Func_ReadToStack \
+      | Func_Cut \
+      | Func_Push \
+      | Func_Pop \
+      | Func_Shift \
+      | Func_Unshift \
+      | Func_Reverse \
+      | Func_Sort \
+      | Func_Clear \
+      | Func_Splice \
+      | Func_Swap \
+      | Func_Copy \
+      | Func_Join \
+      | Func_Concat \
+      | Func_Exists \
+      | Func_ExistsI \
+      | Func_Search \
+      | Func_SearchI \
+      | Func_SizeOf \
+      | Func_ReadFirst \
+      | Func_ReadNext \
+      | Func_ReadClose \
+      | Func_Debug \
+      | Func_SetSize \
+      | Func_ReDim \
+      | Func_FreeUnusedMem
+
+  !ifndef Array_Name
+   !error "NSISArray: Please declare an array before declaring functions."
+  !else
+
+   !ifndef `Array_FuncDefined_${Array_Name}${Func}`
+    !define `Array_FuncDefined_${Array_Name}${Func}`
+   !else
+    !error "NSISArray: You cannot declare a function more than once."
+   !endif
+
+   !ifdef ArrayObj
+    !undef ArrayObj
+   !endif
+   !define ArrayObj `!insertmacro Array_ObjErr`
+
+   !ifndef "${Array_Name}${Array_Obj}Init"
+    !define "${Array_Name}${Array_Obj}Init" `!insertmacro Array_Init "${Array_Name}" "${Array_Size}" "${Array_StrLen}"`
+   !endif
+   !ifndef "${Array_Name}${Array_Obj}Delete"
+    !define "${Array_Name}${Array_Obj}Delete" `!insertmacro Array_Delete "${Array_Name}"`
+   !endif
+
+   !ifdef ArrayCallInstDLL
+    !ifdef Func_WriteList
+     !define "${Array_Name}${Array_Obj}WriteListBegin" `!insertmacro Array_WriteListBegin `
+     !define "${Array_Name}${Array_Obj}WriteListItem"  `!insertmacro Array_WriteListItem`
+     !define "${Array_Name}${Array_Obj}WriteListEnd"   `!insertmacro Array_WriteListEnd "${Array_Name}"`
+    !else \
+     ifdef Func_Splice
+     !define "${Array_Name}${Array_Obj}SpliceBegin" `!insertmacro Array_SpliceBegin `
+     !define "${Array_Name}${Array_Obj}SpliceItem"  `!insertmacro Array_SpliceItem`
+     !define "${Array_Name}${Array_Obj}SpliceEnd"   `!insertmacro Array_SpliceEnd "${Array_Name}"`
+    !else
+     !define "${Array_Name}${Array_Obj}${Func}" `!insertmacro Array_${Func} "${Array_Name}"`
+    !endif
+   !else
+    !define "${Array_Name}${Array_Obj}${Func}" `!insertmacro Array_${Func} "${Array_Name}"`
+   !endif
+
+  !endif
+
+ !else \
+  ifdef Func_Init \
+      | Func_Delete
+  !error "NSISArray: You do not need to declare the Init and Delete functions."
+ !else
+  !error "NSISArray: An invalid function Name has been declared."
+ !endif
+ !undef `Func_${Func}`
+
+!macroend
+!define ArrayFunc `!insertmacro ArrayFunc`
+
+!macro Array_ErrorStyle ErrorStyle
+ !define `ErrorStyle_${ErrorStyle}`
+ !ifdef ErrorStyle_logwin
+  !define ErrorStyleNum 5
+ !else ifdef ErrorStyle_msgbox
+  !define ErrorStyleNum 3
+ !else
+  !define ErrorStyleNum 1
+ !endif
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::ErrorStyle /NOUNLOAD "${ErrorStyleNum}"
+ !else
+  Push "${ErrorStyleNum}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ErrorStyle
+ !endif
+ !undef ErrorStyleNum
+ !undef `ErrorStyle_${ErrorStyle}`
+!macroend
+!define ArrayErrorStyle `!insertmacro Array_ErrorStyle`
+
+!macro Array_PopErrVar
+ Pop "${ArrayErrVar}"
+ !ifdef ArraySetErrors
+  StrCmp "${ArrayErrVar}" 0 +2
+  SetErrors
+ !endif
+!macroend
+!define Array_PopErrVar `!insertmacro Array_PopErrVar`
+
+!macro Array_Init Name Size StrLen
+ !ifndef `Array_${Name}_Inited`
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::ErrorStyle /NOUNLOAD ""
+  Pop "${ArrayErrVar}"
+  StrCmp "${ArrayErrVar}" 3 +3
+  StrCmp "${ArrayErrVar}" 5 +2
+  ${ArrayPluginDLL}::ErrorStyle /NOUNLOAD "1"
+ !else
+  Push ""
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ErrorStyle
+  Pop "${ArrayErrVar}"
+  StrCmp "${ArrayErrVar}" 3 +4
+  StrCmp "${ArrayErrVar}" 5 +3
+  Push "1"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ErrorStyle
+ !endif
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::New /NOUNLOAD "${Name}" "${Size}" "${StrLen}"
+ !else
+  Push "${StrLen}"
+  Push "${Size}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD New
+ !endif
+ ${Array_PopErrVar}
+ !define `Array_${Name}_Inited`
+ !else
+  !error "NSISArray: An array can only be initialised once."
+ !endif
+!macroend
+
+!macro Array_Delete Name
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Delete /NOUNLOAD "${Name}"
+ ${Array_PopErrVar}
+  ${ArrayPluginDLL}::ArrayCount /NOUNLOAD
+   Pop "${ArrayValVar}"
+  StrCmp "${ArrayValVar}" 0 0 +2
+  ${ArrayPluginDLL}::Unload
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Delete
+ ${Array_PopErrVar}
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ArrayCount
+   Pop "${ArrayValVar}"
+  StrCmp "${ArrayValVar}" 0 0 +2
+  CallInstDLL `${ArrayPluginDLL}` Unload
+ !endif
+!macroend
+
+!macro Array_ReDim Name Size StrLen
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::ReDim /NOUNLOAD "${Name}" "${Size}" "${StrLen}"
+ !else
+  Push "${StrLen}"
+  Push "${Size}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ReDim
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_FreeUnusedMem Name
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::FreeUnusedMem /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD FreeUnusedMem
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Inited Name JumpInited JumpNotInited
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::ArrayExists /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ArrayExists
+ !endif
+ ${Array_PopErrVar}
+  Pop "${ArrayValVar}"
+ StrCmp "${ArrayValVar}" 1 "${JumpInited}" "${JumpNotInited}"
+!macroend
+
+!macro Array_Write Name Index Value
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Write /NOUNLOAD "${Name}" "${Index}" "${Value}"
+ !else
+  Push "${Value}"
+  Push "${Index}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Write
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!ifndef ArrayCallInstDLL
+!macro Array_WriteList Name List
+  ${ArrayPluginDLL}::WriteList /NOUNLOAD "${Name}" ${List} "/END"
+ ${Array_PopErrVar}
+!macroend
+!else
+!macro Array_WriteListBegin
+  Push "/END"
+!macroend
+!macro Array_WriteListItem Item
+  Push `${Item}`
+!macroend
+!macro Array_WriteListEnd Name
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD WriteList
+ ${Array_PopErrVar}
+!macroend
+!endif
+
+!macro Array_WriteListC Name List Char
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::WriteListC /NOUNLOAD "${Name}" "${List}" "${Char}"
+ !else
+  Push "${Char}"
+  Push "${List}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD WriteListC
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Put Name Index Value
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Put /NOUNLOAD "${Name}" "${Index}" "${Value}"
+ !else
+  Push "${Value}"
+  Push "${Index}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Put
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Read Name Var Index
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Read /NOUNLOAD "${Name}" "${Index}"
+ !else
+  Push "${Index}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Read
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_ReadToStack Name IndexA IndexB
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::ReadToStack /NOUNLOAD "${Name}" "${IndexA}" "${IndexB}"
+ !else
+  Push "${IndexB}"
+  Push "${IndexA}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ReadToStack
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Cut Name Var Index
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Cut /NOUNLOAD "${Name}" "${Index}"
+ !else
+  Push "${Index}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Cut
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_Push Name Value
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Push /NOUNLOAD "${Name}" "${Value}"
+ !else
+  Push "${Value}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Push
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Pop Name Var
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Pop /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Pop
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_Shift Name Value
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Shift /NOUNLOAD "${Name}" "${Value}"
+ !else
+  Push "${Value}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Shift
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Unshift Name Var
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Unshift /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Unshift
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_Reverse Name
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Reverse /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Reverse
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Sort NameA NameB
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Sort /NOUNLOAD "${NameA}" "${NameB}"
+ !else
+  Push "${NameB}"
+  Push "${NameA}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Sort
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Clear Name
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Clear /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Clear
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!ifndef ArrayCallInstDLL
+!macro Array_Splice Name IndexA IndexB List
+ ${ArrayPluginDLL}::Splice /NOUNLOAD "${Name}" "${IndexA}" "${IndexB}" ${List} "/END"
+ ${Array_PopErrVar}
+!macroend
+!else
+!macro Array_SpliceBegin IndexA IndexB
+ !define Array_Splice_IndexA `${IndexA}`
+ !define Array_Splice_IndexB `${IndexB}`
+  Push "/END"
+!macroend
+!macro Array_SpliceItem Item
+  Push `${Item}`
+!macroend
+!macro Array_SpliceEnd Name
+  Push "${Array_Splice_IndexB}"
+  Push "${Array_Splice_IndexA}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Splice
+ ${Array_PopErrVar}
+  !undef Array_Splice_IndexB
+  !undef Array_Splice_IndexA
+!macroend
+!endif
+
+!macro Array_Swap Name IndexA IndexB
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Swap /NOUNLOAD "${Name}" "${IndexA}" "${IndexB}"
+ !else
+  Push "${IndexB}"
+  Push "${IndexA}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Swap
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Copy Name ToArray
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Copy /NOUNLOAD "${Name}" "${ToArray}"
+ !else
+  Push "${ToArray}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Copy
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Join Name ToArray
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Join /NOUNLOAD "${Name}" "${ToArray}"
+ !else
+  Push "${ToArray}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Join
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_Concat Name Var Chars
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Concat /NOUNLOAD "${Name}" "${Chars}"
+ !else
+  Push "${Chars}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Concat
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_Exists Name Var Value Index
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Exists /NOUNLOAD "${Name}" "${Value}" "${Index}"
+ !else
+  Push "${Index}"
+  Push "${Value}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Exists
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_ExistsI Name Var Value Index
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::ExistsI /NOUNLOAD "${Name}" "${Value}" "${Index}"
+ !else
+  Push "${Index}"
+  Push "${Value}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD ExistsI
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_Search Name Var Value Index
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Search /NOUNLOAD "${Name}" "${Value}" "${Index}"
+ !else
+  Push "${Index}"
+  Push "${Value}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Search
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_SearchI Name Var Value Index
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::SearchI /NOUNLOAD "${Name}" "${Value}" "${Index}"
+ !else
+  Push "${Index}"
+  Push "${Value}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD SearchI
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+!macroend
+
+!macro Array_SizeOf Name VarItems VarSize VarStrLen
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::SizeOf /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD SizeOf
+ !endif
+ ${Array_PopErrVar}
+  Pop "${VarStrLen}"
+  Pop "${VarSize}"
+  Pop "${VarItems}"
+!macroend
+
+!macro Array_Debug Name
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Debug /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Debug
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_SetSize Name Size
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::SetSize /NOUNLOAD "${Name}" "${Size}"
+ !else
+  Push "${Size}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD SetSize
+ !endif
+ ${Array_PopErrVar}
+!macroend
+
+!macro Array_ReadFirst Name Handle Var
+ !tempfile F
+ !delfile ${F}
+ !define Local ${__LINE__}-${F}
+ !undef F
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::SizeOf /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD SizeOf
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+  Pop "${Var}"
+  Pop "${Var}"
+  StrCmp "${Var}" 0 0 +4
+   StrCpy "${Var}" ""
+   SetErrors
+   Goto Done_${Local}
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Read /NOUNLOAD "${Name}" "0"
+ !else
+  Push "0"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Read
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+  StrCpy "${Handle}" 1
+ Done_${Local}:
+ !undef Local
+!macroend
+
+!macro Array_ReadNext Name Handle Var
+ !tempfile F
+ !delfile ${F}
+ !define Local ${__LINE__}-${F}
+ !undef F
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::SizeOf /NOUNLOAD "${Name}"
+ !else
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD SizeOf
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+  Pop "${Var}"
+  Pop "${Var}"
+  StrCmp "${Var}" "${Handle}" 0 +4
+   StrCpy "${Var}" ""
+   SetErrors
+   Goto Done_${Local}
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Read /NOUNLOAD "${Name}" "${Handle}"
+ !else
+  Push "${Handle}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Read
+ !endif
+ ${Array_PopErrVar}
+  Pop "${Var}"
+  IntOp "${Handle}" "${Handle}" + 1
+ Done_${Local}:
+ !undef Local
+!macroend
+
+!macro Array_ReadClose Name Handle
+ StrCpy "${Handle}" ""
+!macroend
+
+!macro Array_Print Name Index
+ !ifndef ArrayCallInstDLL
+  ${ArrayPluginDLL}::Read /NOUNLOAD "${Name}" "${Index}"
+ !else
+  Push "${Index}"
+  Push "${Name}"
+  CallInstDLL `${ArrayPluginDLL}` /NOUNLOAD Read
+ !endif
+ ${Array_PopErrVar}
+  Pop "${ArrayValVar}"
+  DetailPrint "${ArrayValVar}"
+!macroend
+
+!endif
\ No newline at end of file