TextCompare: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Wikipedia python library)
 
m (Updated by user: Instructor.)
Line 6: Line 6:


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


                               TextCompare v1.3
                               TextCompare v1.4
____________________________________________________________________________
____________________________________________________________________________


Line 69: Line 68:
StrCpy $R0 NotEqual
StrCpy $R0 NotEqual
StrCpy $0 StopTextCompare
StrCpy $0 StopTextCompare
Push $0
Push $0
FunctionEnd
FunctionEnd
Line 210: Line 210:
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 270:
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 283:
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:

Revision as of 16:39, 21 April 2005

Links

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.

The Function

/*
____________________________________________________________________________
 
                              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*/
 
 
;---------------------------------------------------------------------------
 
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

Page author: Instructor