scriptable-client-installers/tools/Include/TextFunc.nsh
2023-12-15 16:09:19 -05:00

1212 lines
23 KiB
Plaintext

/*
_____________________________________________________________________________
Text Functions Header v2.4
_____________________________________________________________________________
2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
See documentation for more information about the following functions.
Usage in script:
1. !include "TextFunc.nsh"
2. [Section|Function]
${TextFunction} "File" "..." $var
[SectionEnd|FunctionEnd]
TextFunction=[LineFind|LineRead|FileReadFromEnd|LineSum|FileJoin|
TextCompare|TextCompareS|ConfigRead|ConfigReadS|
ConfigWrite|ConfigWriteS|FileRecode|TrimNewLines]
_____________________________________________________________________________
Thanks to:
_____________________________________________________________________________
LineRead
Afrow UK (Based on his idea of Function "ReadFileLine")
LineSum
Afrow UK (Based on his idea of Function "LineCount")
FileJoin
Afrow UK (Based on his idea of Function "JoinFiles")
ConfigRead
vbgunz (His idea)
ConfigWrite
vbgunz (His idea)
TrimNewLines
sunjammer (Based on his Function "TrimNewLines")
*/
;_____________________________________________________________________________
;
; Macros
;_____________________________________________________________________________
;
; Change log window verbosity (default: 3=no script)
;
; Example:
; !include "TextFunc.nsh"
; !insertmacro LineFind
; ${TEXTFUNC_VERBOSE} 4 # all verbosity
; !insertmacro LineSum
; ${TEXTFUNC_VERBOSE} 3 # no script
!ifndef TEXTFUNC_INCLUDED
!verbose push 3
!define /IfNDef _TEXTFUNC_VERBOSE 3
!verbose ${_TEXTFUNC_VERBOSE}
!define TEXTFUNC_VERBOSE `!insertmacro TEXTFUNC_VERBOSE`
!define TEXTFUNC_INCLUDED
!include FileFunc.nsh
!include Util.nsh
!macro TEXTFUNC_VERBOSE _VERBOSE
!verbose push 3
!define /ReDef _TEXTFUNC_VERBOSE ${_VERBOSE}
!verbose pop
!macroend
!macro LineFindCall _INPUT _OUTPUT _RANGE _FUNC
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push $0
Push `${_INPUT}`
Push `${_OUTPUT}`
Push `${_RANGE}`
GetFunctionAddress $0 `${_FUNC}`
Push `$0`
${CallArtificialFunction} LineFind_
Pop $0
!verbose pop
!macroend
!macro LineReadCall _FILE _NUMBER _RESULT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
Push `${_NUMBER}`
${CallArtificialFunction} LineRead_
Pop ${_RESULT}
!verbose pop
!macroend
!macro FileReadFromEndCall _FILE _FUNC
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push $0
Push `${_FILE}`
GetFunctionAddress $0 `${_FUNC}`
Push `$0`
${CallArtificialFunction} FileReadFromEnd_
Pop $0
!verbose pop
!macroend
!macro LineSumCall _FILE _RESULT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
${CallArtificialFunction} LineSum_
Pop ${_RESULT}
!verbose pop
!macroend
!macro FileJoinCall _FILE1 _FILE2 _FILE3
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE1}`
Push `${_FILE2}`
Push `${_FILE3}`
${CallArtificialFunction} FileJoin_
!verbose pop
!macroend
!macro TextCompareCall _FILE1 _FILE2 _OPTION _FUNC
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push $0
Push `${_FILE1}`
Push `${_FILE2}`
Push `${_OPTION}`
GetFunctionAddress $0 `${_FUNC}`
Push `$0`
${CallArtificialFunction} TextCompare_
Pop $0
!verbose pop
!macroend
!macro TextCompareSCall _FILE1 _FILE2 _OPTION _FUNC
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push $0
Push `${_FILE1}`
Push `${_FILE2}`
Push `${_OPTION}`
GetFunctionAddress $0 `${_FUNC}`
Push `$0`
${CallArtificialFunction} TextCompareS_
Pop $0
!verbose pop
!macroend
!macro ConfigReadCall _FILE _ENTRY _RESULT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
Push `${_ENTRY}`
${CallArtificialFunction} ConfigRead_
Pop ${_RESULT}
!verbose pop
!macroend
!macro ConfigReadSCall _FILE _ENTRY _RESULT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
Push `${_ENTRY}`
${CallArtificialFunction} ConfigReadS_
Pop ${_RESULT}
!verbose pop
!macroend
!macro ConfigWriteCall _FILE _ENTRY _VALUE _RESULT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
Push `${_ENTRY}`
Push `${_VALUE}`
${CallArtificialFunction} ConfigWrite_
Pop ${_RESULT}
!verbose pop
!macroend
!macro ConfigWriteSCall _FILE _ENTRY _VALUE _RESULT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
Push `${_ENTRY}`
Push `${_VALUE}`
${CallArtificialFunction} ConfigWriteS_
Pop ${_RESULT}
!verbose pop
!macroend
!macro FileRecodeCall _FILE _FORMAT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
Push `${_FORMAT}`
${CallArtificialFunction} FileRecode_
!verbose pop
!macroend
!macro TrimNewLinesCall _FILE _RESULT
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Push `${_FILE}`
${CallArtificialFunction} TrimNewLines_
Pop ${_RESULT}
!verbose pop
!macroend
!macro _TextFunc_TempFileForFile _FILE _RESULT
# XXX replace with GetParent
Push `${_FILE}`
Exch $0
Push $1
Push $2
StrCpy $2 $0 1 -1
StrCmp $2 '\' 0 +3
StrCpy $0 $0 -1
goto -3
StrCpy $1 0
IntOp $1 $1 - 1
StrCpy $2 $0 1 $1
StrCmp $2 '\' +2
StrCmp $2 '' 0 -3
StrCpy $0 $0 $1
Pop $2
Pop $1
Exch $0
Pop ${_RESULT}
# XXX
StrCmp ${_RESULT} "" 0 +2
StrCpy ${_RESULT} $EXEDIR
GetTempFileName ${_RESULT} ${_RESULT}
StrCmp ${_RESULT} "" 0 +2
GetTempFileName ${_RESULT}
ClearErrors
!macroend
!define LineFind `!insertmacro LineFindCall`
!define un.LineFind `!insertmacro LineFindCall`
!macro LineFind
!macroend
!macro un.LineFind
!macroend
!macro LineFind_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
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
Push $R4
Push $R5
Push $R6
Push $R7
Push $R8
Push $R9
ClearErrors
IfFileExists '$0' 0 TextFunc_LineFind_error
StrCmp $1 '/NUL' TextFunc_LineFind_begin
StrCpy $8 0
IntOp $8 $8 - 1
StrCpy $9 $1 1 $8
StrCmp $9 \ +2
StrCmp $9 '' +3 -3
StrCpy $9 $1 $8
IfFileExists '$9\*.*' 0 TextFunc_LineFind_error
TextFunc_LineFind_begin:
StrCpy $4 1
StrCpy $5 -1
StrCpy $6 0
StrCpy $7 0
StrCpy $R4 ''
StrCpy $R6 ''
StrCpy $R7 ''
StrCpy $R8 0
StrCpy $8 $2 1
StrCmp $8 '{' 0 TextFunc_LineFind_delspaces
StrCpy $2 $2 '' 1
StrCpy $8 $2 1 -1
StrCmp $8 '}' 0 TextFunc_LineFind_delspaces
StrCpy $2 $2 -1
StrCpy $R6 TextFunc_LineFind_cut
TextFunc_LineFind_delspaces:
StrCpy $8 $2 1
StrCmp $8 ' ' 0 +3
StrCpy $2 $2 '' 1
goto -3
StrCmp $2$7 '0' TextFunc_LineFind_file
StrCpy $4 ''
StrCpy $5 ''
StrCmp $2 '' TextFunc_LineFind_writechk
TextFunc_LineFind_range:
StrCpy $8 0
StrCpy $9 $2 1 $8
StrCmp $9 '' +5
StrCmp $9 ' ' +4
StrCmp $9 ':' +3
IntOp $8 $8 + 1
goto -5
StrCpy $5 $2 $8
IntOp $5 $5 + 0
IntOp $8 $8 + 1
StrCpy $2 $2 '' $8
StrCmp $4 '' 0 +2
StrCpy $4 $5
StrCmp $9 ':' TextFunc_LineFind_range
IntCmp $4 0 0 +2
IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp
StrCmp $R7 '' 0 TextFunc_LineFind_minus2plus
StrCpy $R7 0
FileOpen $8 $0 r
FileRead $8 $9
IfErrors +3
IntOp $R7 $R7 + 1
Goto -3
FileClose $8
TextFunc_LineFind_minus2plus:
IntCmp $4 0 +5 0 +5
IntOp $4 $R7 + $4
IntOp $4 $4 + 1
IntCmp $4 0 +2 0 +2
StrCpy $4 0
IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp
IntOp $5 $R7 + $5
IntOp $5 $5 + 1
TextFunc_LineFind_growthcmp:
IntCmp $4 $5 TextFunc_LineFind_goto TextFunc_LineFind_goto
StrCpy $5 $4
TextFunc_LineFind_goto:
goto $7
TextFunc_LineFind_file:
StrCmp $1 '/NUL' TextFunc_LineFind_notemp
!insertmacro _TextFunc_TempFileForFile $1 $R4
Push $R4
FileOpen $R4 $R4 w
TextFunc_LineFind_notemp:
FileOpen $R5 $0 r
IfErrors TextFunc_LineFind_preerror
TextFunc_LineFind_loop:
IntOp $R8 $R8 + 1
FileRead $R5 $R9
IfErrors TextFunc_LineFind_handleclose
TextFunc_LineFind_cmp:
StrCmp $2$4$5 '' TextFunc_LineFind_writechk
IntCmp $4 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_writechk
StrCmp $5 -1 TextFunc_LineFind_call
IntCmp $5 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_call
GetLabelAddress $7 TextFunc_LineFind_cmp
goto TextFunc_LineFind_delspaces
TextFunc_LineFind_call:
StrCpy $7 $R9
Push $0
Push $1
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
Push $R4
Push $R5
Push $R6
Push $R7
Push $R8
StrCpy $R6 '$4:$5'
StrCmp $R7 '' +3
IntOp $R7 $R8 - $R7
IntOp $R7 $R7 - 1
Call $3
Pop $9
Pop $R8
Pop $R7
Pop $R6
Pop $R5
Pop $R4
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
IfErrors TextFunc_LineFind_preerror
StrCmp $9 'StopLineFind' 0 +3
IntOp $6 $6 + 1
goto TextFunc_LineFind_handleclose
StrCmp $1 '/NUL' TextFunc_LineFind_loop
StrCmp $9 'SkipWrite' 0 +3
IntOp $6 $6 + 1
goto TextFunc_LineFind_loop
StrCmp $7 $R9 TextFunc_LineFind_write
IntOp $6 $6 + 1
goto TextFunc_LineFind_write
TextFunc_LineFind_writechk:
StrCmp $1 '/NUL' TextFunc_LineFind_loop
StrCmp $R6 TextFunc_LineFind_cut 0 TextFunc_LineFind_write
IntOp $6 $6 + 1
goto TextFunc_LineFind_loop
TextFunc_LineFind_write:
FileWrite $R4 $R9
goto TextFunc_LineFind_loop
TextFunc_LineFind_preerror:
SetErrors
TextFunc_LineFind_handleclose:
StrCmp $1 '/NUL' +3
FileClose $R4
Pop $R4
FileClose $R5
IfErrors TextFunc_LineFind_error
StrCmp $1 '/NUL' TextFunc_LineFind_end
StrCmp $1 '' 0 +2
StrCpy $1 $0
StrCmp $6 0 0 TextFunc_LineFind_rename
FileOpen $7 $0 r
FileSeek $7 0 END $8
FileClose $7
FileOpen $7 $R4 r
FileSeek $7 0 END $9
FileClose $7
IntCmp $8 $9 0 TextFunc_LineFind_rename
Delete $R4
StrCmp $1 $0 TextFunc_LineFind_end
CopyFiles /SILENT $0 $1
goto TextFunc_LineFind_end
TextFunc_LineFind_rename:
Delete '$EXEDIR\$1'
Rename $R4 '$EXEDIR\$1'
IfErrors 0 TextFunc_LineFind_end
Delete $1
Rename $R4 $1
IfErrors 0 TextFunc_LineFind_end
TextFunc_LineFind_error:
SetErrors
TextFunc_LineFind_end:
Pop $R9
Pop $R8
Pop $R7
Pop $R6
Pop $R5
Pop $R4
Pop $9
Pop $8
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
!verbose pop
!macroend
!define LineRead `!insertmacro LineReadCall`
!define un.LineRead `!insertmacro LineReadCall`
!macro LineRead
!macroend
!macro un.LineRead
!macroend
!macro LineRead_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
ClearErrors
IfFileExists $0 0 TextFunc_LineRead_error
IntOp $1 $1 + 0
IntCmp $1 0 TextFunc_LineRead_error 0 TextFunc_LineRead_plus
StrCpy $4 0
FileOpen $2 $0 r
IfErrors TextFunc_LineRead_error
FileRead $2 $3
IfErrors +3
IntOp $4 $4 + 1
Goto -3
FileClose $2
IntOp $1 $4 + $1
IntOp $1 $1 + 1
IntCmp $1 0 TextFunc_LineRead_error TextFunc_LineRead_error
TextFunc_LineRead_plus:
FileOpen $2 $0 r
IfErrors TextFunc_LineRead_error
StrCpy $3 0
IntOp $3 $3 + 1
FileRead $2 $0
IfErrors +4
StrCmp $3 $1 0 -3
FileClose $2
goto TextFunc_LineRead_end
FileClose $2
TextFunc_LineRead_error:
SetErrors
StrCpy $0 ''
TextFunc_LineRead_end:
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
!verbose pop
!macroend
!define FileReadFromEnd `!insertmacro FileReadFromEndCall`
!define un.FileReadFromEnd `!insertmacro FileReadFromEndCall`
!macro FileReadFromEnd
!macroend
!macro un.FileReadFromEnd
!macroend
!macro FileReadFromEnd_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Exch $1
Exch
Exch $0
Exch
Push $7
Push $8
Push $9
ClearErrors
StrCpy $7 -1
StrCpy $8 0
IfFileExists $0 0 TextFunc_FileReadFromEnd_error
FileOpen $0 $0 r
IfErrors TextFunc_FileReadFromEnd_error
FileRead $0 $9
IfErrors +4
Push $9
IntOp $8 $8 + 1
goto -4
FileClose $0
TextFunc_FileReadFromEnd_nextline:
StrCmp $8 0 TextFunc_FileReadFromEnd_end
Pop $9
Push $1
Push $7
Push $8
Call $1
Pop $0
Pop $8
Pop $7
Pop $1
IntOp $7 $7 - 1
IntOp $8 $8 - 1
IfErrors TextFunc_FileReadFromEnd_error
StrCmp $0 'StopFileReadFromEnd' TextFunc_FileReadFromEnd_clearstack TextFunc_FileReadFromEnd_nextline
TextFunc_FileReadFromEnd_error:
SetErrors
TextFunc_FileReadFromEnd_clearstack:
StrCmp $8 0 TextFunc_FileReadFromEnd_end
Pop $9
IntOp $8 $8 - 1
goto TextFunc_FileReadFromEnd_clearstack
TextFunc_FileReadFromEnd_end:
Pop $9
Pop $8
Pop $7
Pop $1
Pop $0
!verbose pop
!macroend
!define LineSum `!insertmacro LineSumCall`
!define un.LineSum `!insertmacro LineSumCall`
!macro LineSum
!macroend
!macro un.LineSum
!macroend
!macro LineSum_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Exch $0
Push $1
Push $2
ClearErrors
IfFileExists $0 0 TextFunc_LineSum_error
StrCpy $2 0
FileOpen $0 $0 r
IfErrors TextFunc_LineSum_error
FileRead $0 $1
IfErrors +3
IntOp $2 $2 + 1
Goto -3
FileClose $0
StrCpy $0 $2
goto TextFunc_LineSum_end
TextFunc_LineSum_error:
SetErrors
StrCpy $0 ''
TextFunc_LineSum_end:
Pop $2
Pop $1
Exch $0
!verbose pop
!macroend
!define FileJoin `!insertmacro FileJoinCall`
!define un.FileJoin `!insertmacro FileJoinCall`
!macro FileJoin
!macroend
!macro un.FileJoin
!macroend
!macro FileJoin_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Exch $2
Exch
Exch $1
Exch
Exch 2
Exch $0
Exch 2
Push $3
Push $4
Push $5
ClearErrors
IfFileExists $0 0 TextFunc_FileJoin_error
IfFileExists $1 0 TextFunc_FileJoin_error
StrCpy $3 0
IntOp $3 $3 - 1
StrCpy $4 $2 1 $3
StrCmp $4 \ +2
StrCmp $4 '' +3 -3
StrCpy $4 $2 $3
IfFileExists '$4\*.*' 0 TextFunc_FileJoin_error
StrCmp $2 $0 0 +2
StrCpy $2 ''
StrCmp $2 '' 0 +3
StrCpy $4 $0
Goto TextFunc_FileJoin_notemp
!insertmacro _TextFunc_TempFileForFile $2 $4
CopyFiles /SILENT $0 $4
TextFunc_FileJoin_notemp:
FileOpen $3 $4 a
IfErrors TextFunc_FileJoin_error
FileSeek $3 -1 END
FileRead $3 $5
StrCmp $5 '$\r' +3
StrCmp $5 '$\n' +2
FileWrite $3 '$\r$\n'
;FileWrite $3 '$\r$\n--Divider--$\r$\n'
FileOpen $0 $1 r
IfErrors TextFunc_FileJoin_error
FileRead $0 $5
IfErrors +3
FileWrite $3 $5
goto -3
FileClose $0
FileClose $3
StrCmp $2 '' TextFunc_FileJoin_end
Delete '$EXEDIR\$2'
Rename $4 '$EXEDIR\$2'
IfErrors 0 TextFunc_FileJoin_end
Delete $2
Rename $4 $2
IfErrors 0 TextFunc_FileJoin_end
TextFunc_FileJoin_error:
SetErrors
TextFunc_FileJoin_end:
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
!verbose pop
!macroend
!macro TextCompareBody _TEXTFUNC_S
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 TextFunc_TextCompare${_TEXTFUNC_S}_error
IfFileExists $1 0 TextFunc_TextCompare${_TEXTFUNC_S}_error
StrCmp $2 'FastDiff' +5
StrCmp $2 'FastEqual' +4
StrCmp $2 'SlowDiff' +3
StrCmp $2 'SlowEqual' +2
goto TextFunc_TextCompare${_TEXTFUNC_S}_error
FileOpen $4 $0 r
IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error
FileOpen $5 $1 r
IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error
SetDetailsPrint textonly
StrCpy $6 0
StrCpy $8 0
TextFunc_TextCompare${_TEXTFUNC_S}_nextline:
StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_fast
IntOp $8 $8 + 1
FileRead $4 $9
IfErrors 0 +4
FileClose $4
StrCpy $4 ''
StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_end
StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_fast
StrCmp $2 'FastEqual' TextFunc_TextCompare${_TEXTFUNC_S}_fast TextFunc_TextCompare${_TEXTFUNC_S}_slow
TextFunc_TextCompare${_TEXTFUNC_S}_fast:
StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_call
IntOp $6 $6 + 1
FileRead $5 $7
IfErrors 0 +5
FileClose $5
StrCpy $5 ''
StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_end
StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_close
StrCmp $2 'FastDiff' 0 +2
StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_call
StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline
TextFunc_TextCompare${_TEXTFUNC_S}_slow:
StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_close
StrCpy $6 ''
DetailPrint '$8. $9'
FileSeek $5 0
TextFunc_TextCompare${_TEXTFUNC_S}_slownext:
FileRead $5 $7
IfErrors 0 +2
StrCmp $2 'SlowDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline
StrCmp $2 'SlowDiff' 0 +2
StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_slownext
IntOp $6 $6 + 1
StrCmp${_TEXTFUNC_S} $7 $9 0 TextFunc_TextCompare${_TEXTFUNC_S}_slownext
TextFunc_TextCompare${_TEXTFUNC_S}_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 TextFunc_TextCompare${_TEXTFUNC_S}_nextline
TextFunc_TextCompare${_TEXTFUNC_S}_close:
FileClose $4
FileClose $5
goto TextFunc_TextCompare${_TEXTFUNC_S}_end
TextFunc_TextCompare${_TEXTFUNC_S}_error:
SetErrors
TextFunc_TextCompare${_TEXTFUNC_S}_end:
SetDetailsPrint both
Pop $9
Pop $8
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
!macroend
!define TextCompare `!insertmacro TextCompareCall`
!define un.TextCompare `!insertmacro TextCompareCall`
!macro TextCompare
!macroend
!macro un.TextCompare
!macroend
!macro TextCompare_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
!insertmacro TextCompareBody ''
!verbose pop
!macroend
!define TextCompareS `!insertmacro TextCompareSCall`
!define un.TextCompareS `!insertmacro TextCompareSCall`
!macro TextCompareS
!macroend
!macro un.TextCompareS
!macroend
!macro TextCompareS_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
!insertmacro TextCompareBody 'S'
!verbose pop
!macroend
!macro ConfigReadBody _TEXTFUNC_S
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
ClearErrors
FileOpen $2 $0 r
IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error
StrLen $0 $1
StrCmp${_TEXTFUNC_S} $0 0 TextFunc_ConfigRead${_TEXTFUNC_S}_error
TextFunc_ConfigRead${_TEXTFUNC_S}_readnext:
FileRead $2 $3
IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error
StrCpy $4 $3 $0
StrCmp${_TEXTFUNC_S} $4 $1 0 TextFunc_ConfigRead${_TEXTFUNC_S}_readnext
StrCpy $0 $3 '' $0
StrCpy $4 $0 1 -1
StrCmp${_TEXTFUNC_S} $4 '$\r' +2
StrCmp${_TEXTFUNC_S} $4 '$\n' 0 TextFunc_ConfigRead${_TEXTFUNC_S}_close
StrCpy $0 $0 -1
goto -4
TextFunc_ConfigRead${_TEXTFUNC_S}_error:
SetErrors
StrCpy $0 ''
TextFunc_ConfigRead${_TEXTFUNC_S}_close:
FileClose $2
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
!macroend
!define ConfigRead `!insertmacro ConfigReadCall`
!define un.ConfigRead `!insertmacro ConfigReadCall`
!macro ConfigRead
!macroend
!macro un.ConfigRead
!macroend
!macro ConfigRead_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
!insertmacro ConfigReadBody ''
!verbose pop
!macroend
!define ConfigReadS `!insertmacro ConfigReadSCall`
!define un.ConfigReadS `!insertmacro ConfigReadSCall`
!macro ConfigReadS
!macroend
!macro un.ConfigReadS
!macroend
!macro ConfigReadS_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
!insertmacro ConfigReadBody 'S'
!verbose pop
!macroend
!macro ConfigWriteBody _TEXTFUNC_S
Exch $2
Exch
Exch $1
Exch
Exch 2
Exch $0
Exch 2
Push $3
Push $4
Push $5
Push $6
ClearErrors
IfFileExists $0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_error
FileOpen $3 $0 a
IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_error
StrLen $0 $1
StrCmp${_TEXTFUNC_S} $0 0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext
StrCpy $0 ''
goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext:
FileRead $3 $4
IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_add
StrCpy $5 $4 $0
StrCmp${_TEXTFUNC_S} $5 $1 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext
StrCpy $5 0
IntOp $5 $5 - 1
StrCpy $6 $4 1 $5
StrCmp${_TEXTFUNC_S} $6 '$\r' -2
StrCmp${_TEXTFUNC_S} $6 '$\n' -3
StrCpy $6 $4
StrCmp${_TEXTFUNC_S} $5 -1 +3
IntOp $5 $5 + 1
StrCpy $6 $4 $5
StrCmp${_TEXTFUNC_S} $2 '' TextFunc_ConfigWrite${_TEXTFUNC_S}_change
StrCmp${_TEXTFUNC_S} $6 '$1$2' 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_change
StrCpy $0 SAME
goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
TextFunc_ConfigWrite${_TEXTFUNC_S}_change:
FileSeek $3 0 CUR $5
StrLen $4 $4
IntOp $4 $5 - $4
FileSeek $3 0 END $6
IntOp $6 $6 - $5
System::Alloc $6
Pop $0
FileSeek $3 $5 SET
System::Call 'kernel32::ReadFile(p r3, p r0, i $6, t.,)'
FileSeek $3 $4 SET
StrCmp${_TEXTFUNC_S} $2 '' +2
FileWrite $3 '$1$2$\r$\n'
System::Call 'kernel32::WriteFile(p r3, p r0, i $6, t.,)'
System::Call 'kernel32::SetEndOfFile(p r3)'
System::Free $0
StrCmp${_TEXTFUNC_S} $2 '' +3
StrCpy $0 CHANGED
goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
StrCpy $0 DELETED
goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
TextFunc_ConfigWrite${_TEXTFUNC_S}_add:
StrCmp${_TEXTFUNC_S} $2 '' 0 +3
StrCpy $0 SAME
goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
FileSeek $3 -1 END
FileRead $3 $4
IfErrors +4
StrCmp${_TEXTFUNC_S} $4 '$\r' +3
StrCmp${_TEXTFUNC_S} $4 '$\n' +2
FileWrite $3 '$\r$\n'
FileWrite $3 '$1$2$\r$\n'
StrCpy $0 ADDED
TextFunc_ConfigWrite${_TEXTFUNC_S}_close:
FileClose $3
goto TextFunc_ConfigWrite${_TEXTFUNC_S}_end
TextFunc_ConfigWrite${_TEXTFUNC_S}_error:
SetErrors
StrCpy $0 ''
TextFunc_ConfigWrite${_TEXTFUNC_S}_end:
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
!macroend
!define ConfigWrite `!insertmacro ConfigWriteCall`
!define un.ConfigWrite `!insertmacro ConfigWriteCall`
!macro ConfigWrite
!macroend
!macro un.ConfigWrite
!macroend
!macro ConfigWrite_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
!insertmacro ConfigWriteBody ''
!verbose pop
!macroend
!define ConfigWriteS `!insertmacro ConfigWriteSCall`
!define un.ConfigWriteS `!insertmacro ConfigWriteSCall`
!macro ConfigWriteS
!macroend
!macro un.ConfigWriteS
!macroend
!macro ConfigWriteS_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
!insertmacro ConfigWriteBody 'S'
!verbose pop
!macroend
!define FileRecode `!insertmacro FileRecodeCall`
!define un.FileRecode `!insertmacro FileRecodeCall`
!macro FileRecode
!macroend
!macro un.FileRecode
!macroend
!macro FileRecode_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
IfFileExists $0 0 TextFunc_FileRecode_error
StrCmp $1 OemToChar +2
StrCmp $1 CharToOem 0 TextFunc_FileRecode_error
FileOpen $2 $0 a
FileSeek $2 0 END $3
System::Alloc $3
Pop $4
FileSeek $2 0 SET
System::Call 'kernel32::ReadFile(p r2, p r4, i $3, t.,)'
System::Call 'user32::$1Buff(p r4, p r4, i $3)'
FileSeek $2 0 SET
System::Call 'kernel32::WriteFile(p r2, p r4, i $3, t.,)'
System::Free $4
FileClose $2
goto TextFunc_FileRecode_end
TextFunc_FileRecode_error:
SetErrors
TextFunc_FileRecode_end:
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
!verbose pop
!macroend
!define TrimNewLines `!insertmacro TrimNewLinesCall`
!define un.TrimNewLines `!insertmacro TrimNewLinesCall`
!macro TrimNewLines
!macroend
!macro un.TrimNewLines
!macroend
!macro TrimNewLines_
!verbose push
!verbose ${_TEXTFUNC_VERBOSE}
Exch $0
Push $1
Push $2
StrCpy $1 0
IntOp $1 $1 - 1
StrCpy $2 $0 1 $1
StrCmp $2 '$\r' -2
StrCmp $2 '$\n' -3
StrCmp $1 -1 +3
IntOp $1 $1 + 1
StrCpy $0 $0 $1
Pop $2
Pop $1
Exch $0
!verbose pop
!macroend
!verbose pop
!endif