Include/RecFind.nsh
changeset 0 d5ce4c64ef88
--- /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