Splice: Cut string @ index from array type string

From NSIS Wiki
Jump to navigationJump to search
Author: Afrow UK (talk, contrib)


Description

This function works a little like Perl's Splice() function in that it cuts a string at a selected index from an array type string. However, unlike Perl's Splice() function, this returns the string that has been Spliced (or Sliced rather).

Usage

Push $ArrayString ; Array string
Push "12" ; Index number (just like e.g. $ArrayString[12] : Zero-based)
Push "|" ; Array string seperator
 Call Splice
Pop $ArrayString ; New array with $ArrayString[12] cut away
Pop $R0 ; Value of $ArrayString[12]

Example

; $ArrayString == "string1|string2|string3|string4"
Push $ArrayString
Push "2"
Push "|"
 Call Splice
Pop $ArrayString ; Now "string1|string2|string4"
Pop $R0 ; Returns "string3"

The Function

Function Splice
 Exch $R0 ; seperator character
 Exch
 Exch $R1 ; chunk to slice
 Exch
 Exch 2
 Exch $R2 ; string
 Push $R3
 Push $R4
 Push $R5
 Push $R6
 Push $R7
 Push $R8
 
 StrCpy $R3 0
 StrCpy $R5 -1
 StrCpy $R2 "$R0$R2$R0"
 
 Loop1:
  IntOp $R3 $R3 + 1
  StrCpy $R4 $R2 1 $R3
  StrCmp $R4 "" +5
  StrCmp $R4 $R0 0 Loop1
   StrCpy $R8 $R3
   IntOp $R5 $R5 + 1
   StrCmp $R5 $R1 0 Loop1
   StrLen $R4 $R2
   IntOp $R8 $R4 - $R8
   StrCpy $R6 $R2 "" -$R8 ; right side
   StrCpy $R7 $R2 -$R8 ; left side + slice
 
 StrCpy $R3 0
 
 Loop2:
  IntOp $R3 $R3 - 1
  StrCpy $R4 $R7 1 $R3
  StrCmp $R4 $R0 0 Loop2
   StrCpy $R0 $R7 $R3 ; left side
   IntOp $R3 $R3 + 1
   StrCpy $R1 $R7 "" $R3 ; slice
   StrCpy $R0 "$R0$R6"
 
  StrCpy $R0 $R0 -1
  StrLen $R2 $R0
  IntOp $R2 $R2 - 1
  StrCpy $R0 $R0 "" -$R2
 
 Pop $R8
 Pop $R7
 Pop $R6
 Pop $R5
 Pop $R4
 Pop $R3
 Pop $R2
 Exch $R1 ; slice
 Exch
 Exch $R0 ; new string
FunctionEnd

-Stu