TextCompare: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Wikipedia python library)
 
No edit summary
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
== Links ==
{{PageAuthor|Instructor}}
; Latest version of headers "nsh.zip":
: http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost


If function used without header then put function in script before call it.
{{User:Instructor/Headers/Template}}


== The Function ==
== Function Description ==
<highlight-nsis>/*
 
<highlight-nsis>
____________________________________________________________________________
____________________________________________________________________________


                               TextCompare v1.3
                               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' +4
StrCmp $2 'FastDiff' +5
StrCmp $2 'FastEqual' +3
StrCmp $2 'FastEqual' +4
StrCmp $2 'SlowDiff' +2
StrCmp $2 'SlowDiff' +3
StrCmp $2 'SlowEqual' 0 error
StrCmp $2 'SlowEqual' +2
 
goto error
StrCpy $5 0
StrCpy $6 0
StrCpy $8 0


FileOpen $4 $0 r
FileOpen $4 $0 r
IfErrors error
IfErrors error
StrCmp $2 'FastDiff' +2
StrCmp $2 'FastEqual' 0 +3
FileOpen $5 $1 r
FileOpen $5 $1 r
goto +2
IfErrors error
SetDetailsPrint textonly
SetDetailsPrint textonly
StrCpy $6 0
StrCpy $8 0


nextline:
nextline:
StrCpy $7 ''
StrCmp $4 '' fast
IntOp $8 $8 + 1
FileRead $4 $9
FileRead $4 $9
IntOp $8 $8 + 1
IfErrors 0 +4
IfErrors +3
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
FileClose $4
goto end


fast:
fast:
StrCmp $5 '' call
StrCmp $5 '' call
IntOp $6 $6 + 1
FileRead $5 $7
FileRead $5 $7
IntOp $6 $6 + 1
IfErrors 0 +5
IfErrors +4
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
FileClose $5
StrCmp $2 'FastDiff' call end


slow:
slow:
StrCmp $4 '' close
StrCpy $6 ''
DetailPrint '$8. $9'
DetailPrint '$8. $9'
StrCpy $6 ''
FileSeek $5 0
FileOpen $5 $1 r
 
IfErrors error
slownext:
FileRead $5 $7
FileRead $5 $7
IfErrors +7
IfErrors 0 +2
StrCmp $2 'SlowDiff' call nextline
StrCmp $2 'SlowDiff' 0 +2
StrCmp $2 'SlowDiff' 0 +2
StrCmp $7 $9 +3 -3
StrCmp $7 $9 nextline slownext
IntOp $6 $6 + 1
IntOp $6 $6 + 1
StrCmp $7 $9 0 -5
StrCmp $7 $9 0 slownext
FileClose $5
StrCmp $2 'SlowDiff' nextline call
FileClose $5
StrCmp $2 'SlowDiff' 0 nextline


call:
call:
Push $0
Push $1
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
Pop $1
StrCmp $0 'StopTextCompare' 0 nextline
Pop $0
 
StrCmp $9 'StopTextCompare' end nextline
close:
FileClose $4
FileClose $5
goto end


error:
error:
Line 303: Line 332:
</highlight-nsis>
</highlight-nsis>


Page author: Instructor
[[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