StrTok: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
m ("existant" -> "existent".) |
m (→Function Code: fixed script bug) |
||
Line 57: | Line 57: | ||
!macro StrTok ResultVar String Separators ResultPart SkipEmptyParts | !macro StrTok ResultVar String Separators ResultPart SkipEmptyParts | ||
Push "${String}" | Push "${String}" | ||
Push "${ | Push "${Separators}" | ||
Push "${ResultPart}" | Push "${ResultPart}" | ||
Push "${SkipEmptyParts}" | Push "${SkipEmptyParts}" |
Revision as of 15:43, 14 September 2005
Author: deguix (talk, contrib) |
Description
Requires: LogicLib.
Version: 2.0.1.
This function returns a specific part of a string between separators.
How To Use
Syntax
${StrTok} "ResultVar" "String" "Separators" "ResultPart" "SkipEmptyParts"
or
Push "String" Push "Separators" Push "ResultPart" Push "SkipEmptyParts" Call StrTok Pop "ResultVar"
Parameters
- ResultVar
- Variable where the part indicated by ResultPart found in String is returned. If no Separators are found, the entire string is considered the one and only part existent.
- String
- String where to search for SubString.
- Separators
- Characters to find in String.
- ResultPart
- Number which indicates which part inside two Separators (including the start and end of String). This number starts at zero (0). "L" is the last part that can be found. Default is "L" (last part).
- SkipEmptyParts
- Indicates whether to skip empty string parts. 1 = True, 0 = False. Default is 1 (True).
Example
${StrTok} $0 "This is, or is not, just an example" " ," "4" "1" ;$0 = "not"
Function Code
!define StrTok "!insertmacro StrTok" !macro StrTok ResultVar String Separators ResultPart SkipEmptyParts Push "${String}" Push "${Separators}" Push "${ResultPart}" Push "${SkipEmptyParts}" Call StrTok Pop "${ResultVar}" !macroend Function StrTok /*After this point: ------------------------------------------ $0 = SkipEmptyParts (input) $1 = ResultPart (input) $2 = Separators (input) $3 = String (input) $4 = SeparatorsLen (temp) $5 = StrLen (temp) $6 = StartCharPos (temp) $7 = TempStr (temp) $8 = CurrentLoop $9 = CurrentSepChar $R0 = CurrentSepCharNum */ ;Get input from user Exch $0 Exch Exch $1 Exch Exch 2 Exch $2 Exch 2 Exch 3 Exch $3 Exch 3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R0 ;Parameter defaults ${IfThen} $2 == `` ${|} StrCpy $2 `|` ${|} ${IfThen} $1 == `` ${|} StrCpy $1 `L` ${|} ${IfThen} $0 == `` ${|} StrCpy $0 `0` ${|} ;Get "String" and "Separators" length StrLen $4 $2 StrLen $5 $3 ;Start "StartCharPos" and "ResultPart" counters StrCpy $6 0 StrCpy $8 -1 ;Loop until "ResultPart" is met, "Separators" is found or ;"String" reaches its end ResultPartLoop: ;"CurrentLoop" Loop ;Increase "CurrentLoop" counter IntOp $8 $8 + 1 StrSearchLoop: ${Do} ;"String" Loop ;Remove everything before and after the searched part ("TempStr") StrCpy $7 $3 1 $6 ;Verify if it's the "String" end ${If} $6 >= $5 ;If "CurrentLoop" is what the user wants, remove the part ;after "TempStr" and itself and get out of here ${If} $8 == $1 ${OrIf} $1 == `L` StrCpy $3 $3 $6 ${Else} ;If not, empty "String" and get out of here StrCpy $3 `` ${EndIf} StrCpy $R0 `End` ${ExitDo} ${EndIf} ;Start "CurrentSepCharNum" counter (for "Separators" Loop) StrCpy $R0 0 ${Do} ;"Separators" Loop ;Use one "Separators" character at a time ${If} $R0 <> 0 StrCpy $9 $2 1 $R0 ${Else} StrCpy $9 $2 1 ${EndIf} ;Go to the next "String" char if it's "Separators" end ${IfThen} $R0 >= $4 ${|} ${ExitDo} ${|} ;Or, if "TempStr" equals "CurrentSepChar", then... ${If} $7 == $9 StrCpy $7 $3 $6 ;If "String" is empty because this result part doesn't ;contain data, verify if "SkipEmptyParts" is activated, ;so we don't return the output to user yet ${If} $7 == `` ${AndIf} $0 = 1 ;${TRUE} IntOp $6 $6 + 1 StrCpy $3 $3 `` $6 StrCpy $6 0 Goto StrSearchLoop ${ElseIf} $8 == $1 StrCpy $3 $3 $6 StrCpy $R0 "End" ${ExitDo} ${EndIf} ;If not, go to the next result part IntOp $6 $6 + 1 StrCpy $3 $3 `` $6 StrCpy $6 0 Goto ResultPartLoop ${EndIf} ;Increase "CurrentSepCharNum" counter IntOp $R0 $R0 + 1 ${Loop} ${IfThen} $R0 == "End" ${|} ${ExitDo} ${|} ;Increase "StartCharPos" counter IntOp $6 $6 + 1 ${Loop} /*After this point: ------------------------------------------ $3 = ResultVar (output)*/ ;Return output to user Pop $R0 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $0 Pop $1 Pop $2 Exch $3 FunctionEnd
Versions History
- 2.0.1
- Fixed stack problems.