--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Include/RecFind.nsh Tue Oct 16 00:07:41 2007 -0400
@@ -0,0 +1,149 @@
+#################################################################################################
+# RecFind.nsh - Recursive FindFirst, FindNext, FindClose.
+# by Afrow UK
+#
+# Last modified 5th July 2005
+
+; Usage:
+; ------------------------------------------------------------
+; ${RecFindOpen} "Dir\Path" $CurrentDirVar $CurrentFileVar
+; ... Do stuff with $CurrentDirVar ...
+; ${RecFindFirst}
+; ... Do stuff with $CurrentFileVar ...
+; ${RecFindNext}
+; ${RecFindClose}
+
+; Notes:
+; ------------------------------------------------------------
+
+; Looping is handled by the macro's internally.
+
+; ${RecFindOpen} opens a search in a new directory in the tree.
+; The macro's will loop back to this instruction when a new
+; directory is opened for searching.
+
+; ${RecFindFirst} gets file names out of the current directory.
+; The macro's will loop back to this instruction when a new file
+; is found.
+
+; ${RecFindNext} gets the next file in the current directory, and loops to
+; ${RecFindFirst} again.
+
+; ${RecFindClose} closes the search and clears the stack.
+
+; Example 1:
+; ------------------------------------------------------------
+; ${RecFindOpen} "C:\Dir" $R0 $R1
+; DetailPrint "Dir: C:\Dir$R0"
+; ${RecFindFirst}
+; DetailPrint "File: C:\Dir$R0\$R1"
+; ${RecFindNext}
+; ${RecFindClose}
+
+; Example 2:
+; ------------------------------------------------------------
+; ${RecFindOpen} "C:\Dir" $R0 $R1
+; DetailPrint "Dir: C:\Dir$R0"
+; ${RecFindFirst}
+; DetailPrint "File: C:\Dir$R0\$R1"
+; StrCmp $R1 "a_file.txt" Found
+; ${RecFindNext}
+; Found:
+; ${RecFindClose}
+
+#################################################################################################
+
+!ifndef RecFind-Included
+!define RecFind-Included
+
+Var RecFindVar1
+Var RecFindVar2
+
+!macro RecFindOpen DirVar CurrentDirVar CurrentFileVar
+
+ !define Local "${__LINE__}"
+ !define Dir "${DirVar}"
+ !define CurrentDir "${CurrentDirVar}"
+ !define CurrentFile "${CurrentFileVar}"
+
+ !define RecFindOpenSet
+
+ StrCpy $RecFindVar2 1
+ Push ""
+
+ "nextDir${Local}:"
+ Pop "${CurrentDir}"
+ IntOp $RecFindVar2 $RecFindVar2 - 1
+
+!macroend
+!define RecFindOpen "!insertmacro RecFindOpen"
+
+!macro RecFindFirst
+
+ !ifndef RecFindOpenSet
+ !error "Incorrect use of RecFind commands!"
+ !else
+ !define RecFindFirstSet
+ !endif
+
+ ClearErrors
+ FindFirst $RecFindVar1 "${CurrentFile}" "${Dir}${CurrentDir}\*.*"
+ IfErrors "Done${Local}"
+
+ "checkFile${Local}:"
+ StrCmp ${CurrentFile} . "nextFile${Local}"
+ StrCmp ${CurrentFile} .. "nextFile${Local}"
+
+ IfFileExists "${Dir}${CurrentDir}\${CurrentFile}\*.*" 0 +4
+ Push "${CurrentDir}\${CurrentFile}"
+ IntOp $RecFindVar2 $RecFindVar2 + 1
+ Goto "nextFile${Local}"
+
+!macroend
+!define RecFindFirst "!insertmacro RecFindFirst"
+
+!macro RecFindNext
+
+ !ifndef RecFindOpenSet | RecFindFirstSet
+ !error "Incorrect use of RecFind commands!"
+ !else
+ !define RecFindNextSet
+ !endif
+
+ "nextFile${Local}:"
+
+ ClearErrors
+ FindNext $RecFindVar1 "${CurrentFile}"
+ IfErrors 0 "checkFile${Local}"
+
+ StrCmp $RecFindVar2 0 0 "nextDir${Local}"
+!macroend
+!define RecFindNext "!insertmacro RecFindNext"
+
+!macro RecFindClose
+
+ !ifndef RecFindOpenSet | RecFindFirstSet | RecFindNextSet
+ !error "Incorrect use of RecFind commands!"
+ !else
+ !undef RecFindOpenSet
+ !undef RecFindFirstSet
+ !undef RecFindNextSet
+ !endif
+
+ "Done${Local}:"
+ FindClose $RecFindVar1
+
+ StrCmp $RecFindVar2 0 +4
+ Pop $RecFindVar1
+ IntOp $RecFindVar2 $RecFindVar2 - 1
+ Goto -3
+
+ !undef CurrentFile
+ !undef CurrentDir
+ !undef Dir
+ !undef Local
+
+!macroend
+!define RecFindClose "!insertmacro RecFindClose"
+
+!endif