/* _____________________________________________________________________________ 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 !define TEXTFUNC_INCLUDED !include FileFunc.nsh !include Util.nsh !verbose push !verbose 3 !ifndef _TEXTFUNC_VERBOSE !define _TEXTFUNC_VERBOSE 3 !endif !verbose ${_TEXTFUNC_VERBOSE} !define TEXTFUNC_VERBOSE `!insertmacro TEXTFUNC_VERBOSE` !verbose pop !macro TEXTFUNC_VERBOSE _VERBOSE !verbose push !verbose 3 !undef _TEXTFUNC_VERBOSE !define _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(i r3, i r0, i $6, t.,)' FileSeek $3 $4 SET StrCmp${_TEXTFUNC_S} $2 '' +2 FileWrite $3 '$1$2$\r$\n' System::Call 'kernel32::WriteFile(i r3, i r0, i $6, t.,)' System::Call 'kernel32::SetEndOfFile(i 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(i r2, i r4, i $3, t.,)' System::Call 'user32::$1Buff(i r4, i r4, i $3)' FileSeek $2 0 SET System::Call 'kernel32::WriteFile(i r2, i 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 !endif