TextCompare: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
m (Wikipedia python library) |
Instructor (talk | contribs) No edit summary |
||
(6 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{PageAuthor|Instructor}} | |||
{{User:Instructor/Headers/Template}} | |||
== | == Function Description == | ||
<highlight-nsis> | |||
<highlight-nsis> | |||
____________________________________________________________________________ | ____________________________________________________________________________ | ||
TextCompare v1. | TextCompare v1.4 | ||
____________________________________________________________________________ | ____________________________________________________________________________ | ||
Line 51: | Line 50: | ||
-Error flag if File1 or File2 isn't exist | -Error flag if File1 or File2 isn't exist | ||
-Error flag if syntax error | -Error flag if syntax error | ||
</highlight-nsis> | |||
Example (Different or Equal): | <b>Example (Different or Equal):</b> | ||
Section | <highlight-nsis>Section | ||
StrCpy $R0 '' | StrCpy $R0 '' | ||
${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1" | ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1" | ||
Line 69: | Line 69: | ||
StrCpy $R0 NotEqual | StrCpy $R0 NotEqual | ||
StrCpy $0 StopTextCompare | StrCpy $0 StopTextCompare | ||
Push $0 | Push $0 | ||
FunctionEnd | FunctionEnd | ||
</highlight-nsis> | |||
Example (Compare line-by-line - Different): | <b>Example (Compare line-by-line - Different):</b> | ||
Section | <highlight-nsis>Section | ||
StrCpy $R0 'Text1.txt' | StrCpy $R0 'Text1.txt' | ||
StrCpy $R1 'Text2.txt' | StrCpy $R1 'Text2.txt' | ||
Line 95: | Line 97: | ||
Push $0 | Push $0 | ||
FunctionEnd | FunctionEnd | ||
</highlight-nsis> | |||
Example (Compare line-by-line - Equal): | <b>Example (Compare line-by-line - Equal):</b> | ||
Section | <highlight-nsis>Section | ||
StrCpy $R0 'Text1.txt' | StrCpy $R0 'Text1.txt' | ||
StrCpy $R1 'Text2.txt' | StrCpy $R1 'Text2.txt' | ||
Line 118: | Line 121: | ||
Push $0 | Push $0 | ||
FunctionEnd | FunctionEnd | ||
</highlight-nsis> | |||
Example (Compare all lines - Different): | <b>Example (Compare all lines - Different):</b> | ||
Section | <highlight-nsis>Section | ||
StrCpy $R0 'Text1.txt' | StrCpy $R0 'Text1.txt' | ||
StrCpy $R1 'Text2.txt' | StrCpy $R1 'Text2.txt' | ||
Line 149: | Line 153: | ||
Push $0 | Push $0 | ||
FunctionEnd | FunctionEnd | ||
</highlight-nsis> | |||
Example (Compare all lines - Equal): | <b>Example (Compare all lines - Equal):</b> | ||
Section | <highlight-nsis>Section | ||
StrCpy $R0 'Text1.txt' | StrCpy $R0 'Text1.txt' | ||
StrCpy $R1 'Text2.txt' | StrCpy $R1 'Text2.txt' | ||
Line 171: | Line 176: | ||
Push $0 | Push $0 | ||
FunctionEnd | FunctionEnd | ||
</highlight-nsis> | |||
<b>Example (Show variables):</b> | |||
<highlight-nsis>Section | |||
${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example6" | |||
IfErrors 0 +2 | |||
MessageBox MB_OK "Error" | |||
SectionEnd | |||
Function Example6 | |||
MessageBox MB_OKCANCEL '$$9 "Line File1" =[$9]$\n$$8 "Line #" =[$8]$\n$$7 "Line File2" =[$7]$\n$$6 "Line #" =[$6]' IDOK +2 | |||
StrCpy $0 StopTextCompare | |||
Push $0 | |||
FunctionEnd | |||
</highlight-nsis> | |||
== Function Code == | |||
<highlight-nsis> | |||
Function TextCompare | Function TextCompare | ||
!define TextCompare `!insertmacro TextCompareCall` | !define TextCompare `!insertmacro TextCompareCall` | ||
Line 210: | Line 234: | ||
IfFileExists $0 0 error | IfFileExists $0 0 error | ||
IfFileExists $1 0 error | IfFileExists $1 0 error | ||
StrCmp $2 'FastDiff' + | StrCmp $2 'FastDiff' +5 | ||
StrCmp $2 'FastEqual' + | StrCmp $2 'FastEqual' +4 | ||
StrCmp $2 'SlowDiff' + | StrCmp $2 'SlowDiff' +3 | ||
StrCmp $2 'SlowEqual' | StrCmp $2 'SlowEqual' +2 | ||
goto error | |||
FileOpen $4 $0 r | FileOpen $4 $0 r | ||
IfErrors error | IfErrors error | ||
FileOpen $5 $1 r | FileOpen $5 $1 r | ||
IfErrors error | |||
SetDetailsPrint textonly | SetDetailsPrint textonly | ||
StrCpy $6 0 | |||
StrCpy $8 0 | |||
nextline: | nextline: | ||
StrCmp $4 '' fast | |||
IntOp $8 $8 + 1 | |||
FileRead $4 $9 | FileRead $4 $9 | ||
IfErrors 0 +4 | |||
FileClose $4 | |||
StrCpy $4 '' | |||
StrCmp $5 '' end | |||
StrCmp $2 'FastDiff' fast | StrCmp $2 'FastDiff' fast | ||
StrCmp $2 'FastEqual' fast slow | StrCmp $2 'FastEqual' fast slow | ||
fast: | fast: | ||
StrCmp $5 '' call | StrCmp $5 '' call | ||
IntOp $6 $6 + 1 | |||
FileRead $5 $7 | FileRead $5 $7 | ||
IfErrors 0 +5 | |||
FileClose $5 | |||
StrCpy $5 '' | |||
StrCmp $4 '' end | |||
StrCmp $2 'FastDiff' call close | |||
StrCmp $2 'FastDiff' 0 +2 | StrCmp $2 'FastDiff' 0 +2 | ||
StrCmp $7 $9 nextline call | StrCmp $7 $9 nextline call | ||
StrCmp $7 $9 call nextline | StrCmp $7 $9 call nextline | ||
slow: | slow: | ||
StrCmp $4 '' close | |||
StrCpy $6 '' | |||
DetailPrint '$8. $9' | DetailPrint '$8. $9' | ||
FileSeek $5 0 | |||
slownext: | |||
FileRead $5 $7 | FileRead $5 $7 | ||
IfErrors + | IfErrors 0 +2 | ||
StrCmp $2 'SlowDiff' call nextline | |||
StrCmp $2 'SlowDiff' 0 +2 | StrCmp $2 'SlowDiff' 0 +2 | ||
StrCmp $7 $9 | StrCmp $7 $9 nextline slownext | ||
IntOp $6 $6 + 1 | IntOp $6 $6 + 1 | ||
StrCmp $7 $9 0 | StrCmp $7 $9 0 slownext | ||
call: | call: | ||
Push $2 | Push $2 | ||
Push $3 | Push $3 | ||
Line 272: | Line 294: | ||
Push $5 | Push $5 | ||
Push $6 | Push $6 | ||
Push $7 | |||
Push $8 | Push $8 | ||
Push $9 | |||
Call $3 | Call $3 | ||
Pop $0 | |||
Pop $9 | Pop $9 | ||
Pop $8 | Pop $8 | ||
Pop $7 | |||
Pop $6 | Pop $6 | ||
Pop $5 | Pop $5 | ||
Line 281: | Line 307: | ||
Pop $3 | Pop $3 | ||
Pop $2 | Pop $2 | ||
StrCmp $0 'StopTextCompare' 0 nextline | |||
close: | |||
FileClose $4 | |||
FileClose $5 | |||
goto end | |||
error: | error: | ||
Line 303: | Line 332: | ||
</highlight-nsis> | </highlight-nsis> | ||
[[Category:Text Files Manipulation Functions]] |
Latest revision as of 12:01, 30 November 2005
Author: Instructor (talk, contrib) |
Page for NSIS 2.07 and below users
You can use the latest version of headers (recommended) or the following function code (put the function code in your script before calling it)
Function Description
____________________________________________________________________________ TextCompare v1.4 ____________________________________________________________________________ Compare two text files. Syntax: ${TextCompare} "[File1]" "[File2]" "[Option]" "Function" "[File1]" ; File1 Compare these lines "[File2]" ; File2 Compare with these lines "[Options]" ; (line-by-line): ; FastDiff Compare line N (File1) with line N (File2) ; Call function if Different lines found ; FastEqual Compare line N (File1) with line N (File2) ; Call function if Equal lines found ; (line number independent): ; SlowDiff Compare line N (File1) with all lines (File2) ; Call function if line N (File1) Different ; SlowEqual Compare line N (File1) with all lines (File2) ; Call function if line N (File1) Equal "Function" ; Callback function Function "Function" ; $9 "Line File1" ; $8 "Line number" ; $7 "Line File2" (empty if SlowDiff) ; $6 "Line number" (empty if SlowDiff) ; $R0-$R9 are not used (save data in them). ; ... Push $var ; If $var="StopTextCompare" Then exit from function FunctionEnd Note: -Error flag if File1 or File2 isn't exist -Error flag if syntax error
Example (Different or Equal):
Section StrCpy $R0 '' ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1" IfErrors 0 +2 MessageBox MB_OK "Error" IDOK +4 StrCmp $R0 NotEqual 0 +2 MessageBox MB_OK "Files differ" IDOK +2 MessageBox MB_OK "Files identical" SectionEnd Function Example1 StrCpy $R0 NotEqual StrCpy $0 StopTextCompare Push $0 FunctionEnd
Example (Compare line-by-line - Different):
Section StrCpy $R0 'Text1.txt' StrCpy $R1 'Text2.txt' GetTempFileName $R2 FileOpen $R3 $R2 w FileWrite $R3 "$R0 | $R1$\r$\n" ${TextCompare} "$R0" "$R1" "FastDiff" "Example2" IfErrors 0 +2 MessageBox MB_OK "Error" IDOK +2 Exec "notepad.exe $R2" FunctionEnd Function Example2 FileWrite $R3 '$8=$9' FileWrite $R3 '$6=$7$\r$\n' Push $0 FunctionEnd
Example (Compare line-by-line - Equal):
Section StrCpy $R0 'Text1.txt' StrCpy $R1 'Text2.txt' GetTempFileName $R2 FileOpen $R3 $R2 w FileWrite $R3 "$R0 | $R1$\r$\n" ${TextCompare} "$R0" "$R1" "FastEqual" "Example3" IfErrors 0 +2 MessageBox MB_OK "Error" IDOK +2 Exec "notepad.exe $R2" FunctionEnd Function Example3 FileWrite $R3 '$8|$6=$9' Push $0 FunctionEnd
Example (Compare all lines - Different):
Section StrCpy $R0 'Text1.txt' StrCpy $R1 'Text2.txt' GetTempFileName $R2 FileOpen $R3 $R2 w FileWrite $R3 "$R0 | $R1$\r$\n" ${TextCompare} "$R0" "$R1" "SlowDiff" "Example4" IfErrors 0 +2 MessageBox MB_OK "Error" IDOK end FileWrite $R3 "$\r$\n$R1 | $R0$\r$\n" ${TextCompare} "$R1" "$R0" "SlowDiff" "Example4" FileClose $R3 IfErrors 0 +2 MessageBox MB_OK "Error" IDOK end Exec "notepad.exe $R2" end: FunctionEnd Function Example4 FileWrite $R3 '$8=$9' Push $0 FunctionEnd
Example (Compare all lines - Equal):
Section StrCpy $R0 'Text1.txt' StrCpy $R1 'Text2.txt' GetTempFileName $R2 FileOpen $R3 $R2 w FileWrite $R3 "$R0 | $R1$\r$\n" ${TextCompare} "$R0" "$R1" "SlowEqual" "Example5" IfErrors 0 +2 MessageBox MB_OK "Error" IDOK +2 Exec "notepad.exe $R2" FunctionEnd Function Example5 FileWrite $R3 '$8|$6=$9' Push $0 FunctionEnd
Example (Show variables):
Section ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example6" IfErrors 0 +2 MessageBox MB_OK "Error" SectionEnd Function Example6 MessageBox MB_OKCANCEL '$$9 "Line File1" =[$9]$\n$$8 "Line #" =[$8]$\n$$7 "Line File2" =[$7]$\n$$6 "Line #" =[$6]' IDOK +2 StrCpy $0 StopTextCompare Push $0 FunctionEnd
Function Code
Function TextCompare !define TextCompare `!insertmacro TextCompareCall` !macro TextCompareCall _FILE1 _FILE2 _OPTION _FUNC Push $0 Push `${_FILE1}` Push `${_FILE2}` Push `${_OPTION}` GetFunctionAddress $0 `${_FUNC}` Push `$0` Call TextCompare Pop $0 !macroend Exch $3 Exch Exch $2 Exch Exch 2 Exch $1 Exch 2 Exch 3 Exch $0 Exch 3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 ClearErrors IfFileExists $0 0 error IfFileExists $1 0 error StrCmp $2 'FastDiff' +5 StrCmp $2 'FastEqual' +4 StrCmp $2 'SlowDiff' +3 StrCmp $2 'SlowEqual' +2 goto error FileOpen $4 $0 r IfErrors error FileOpen $5 $1 r IfErrors error SetDetailsPrint textonly StrCpy $6 0 StrCpy $8 0 nextline: StrCmp $4 '' fast IntOp $8 $8 + 1 FileRead $4 $9 IfErrors 0 +4 FileClose $4 StrCpy $4 '' StrCmp $5 '' end StrCmp $2 'FastDiff' fast StrCmp $2 'FastEqual' fast slow fast: StrCmp $5 '' call IntOp $6 $6 + 1 FileRead $5 $7 IfErrors 0 +5 FileClose $5 StrCpy $5 '' StrCmp $4 '' end StrCmp $2 'FastDiff' call close StrCmp $2 'FastDiff' 0 +2 StrCmp $7 $9 nextline call StrCmp $7 $9 call nextline slow: StrCmp $4 '' close StrCpy $6 '' DetailPrint '$8. $9' FileSeek $5 0 slownext: FileRead $5 $7 IfErrors 0 +2 StrCmp $2 'SlowDiff' call nextline StrCmp $2 'SlowDiff' 0 +2 StrCmp $7 $9 nextline slownext IntOp $6 $6 + 1 StrCmp $7 $9 0 slownext call: Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Call $3 Pop $0 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 StrCmp $0 'StopTextCompare' 0 nextline close: FileClose $4 FileClose $5 goto end error: SetErrors end: SetDetailsPrint both Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 FunctionEnd