StrTok function: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Added category links.)
m (Adding new author and category links.)
 
Line 1: Line 1:
{|align=right
{{PageAuthor|bigmac666}}
|<small>Author: [[{{ns:2}}:bigmac666|bigmac666]] ([[{{ns:3}}:bigmac666|talk]], [[{{ns:-1}}:Contributions/bigmac666|contrib]])</small>
 
|}
<br style="clear:both;">
== Description ==
== Description ==
Here's a StrTok function which works most like the 'c' strtok function. First push the string that needs tokenizing; then push the token string, call the func, and get the first part back from stack, with the remains of the initial string also still on stack, ready for the next call.
Here's a StrTok function which works most like the 'c' strtok function. First push the string that needs tokenizing; then push the token string, call the func, and get the first part back from stack, with the remains of the initial string also still on stack, ready for the next call.
Line 94: Line 92:
bigmac666
bigmac666


[[{{ns:14}}:String Functions]]
[[Category:String Functions]]

Latest revision as of 13:54, 24 June 2005

Author: bigmac666 (talk, contrib)


Description

Here's a StrTok function which works most like the 'c' strtok function. First push the string that needs tokenizing; then push the token string, call the func, and get the first part back from stack, with the remains of the initial string also still on stack, ready for the next call.

Example of Usage

Push "version 1.24"
Push " ."
Call StrTok
Pop $R0 ; R0 now contains 'version'
Pop $R1 ; R1 is now '1.24'; popping just for demo purposes
Push $R1 ; continue parsing the same string
Push " ."
Call StrTok
Pop $R0 ; R0 now contains '1'
Push " ."
Call StrTok
Pop $R0 ; R0 now contains '24'
Pop $R1 ; should be empty string now, this just to clean the stack

The Function

Here's the source of the function:

;author bigmac666
Function StrTok
  Exch $R1
  Exch 1
  Exch $R0
  Push $R2
  Push $R3
  Push $R4
  Push $R5
 
  ;R0 fullstring
  ;R1 tokens
  ;R2 len of fullstring
  ;R3 len of tokens
  ;R4 char from string
  ;R5 testchar
 
  StrLen $R2 $R0
  IntOp $R2 $R2 + 1
 
  loop1:
    IntOp $R2 $R2 - 1
    IntCmp $R2 0 exit
 
    StrCpy $R4 $R0 1 -$R2
 
    StrLen $R3 $R1
    IntOp $R3 $R3 + 1
 
    loop2:
      IntOp $R3 $R3 - 1
      IntCmp $R3 0 loop1
 
      StrCpy $R5 $R1 1 -$R3
 
      StrCmp $R4 $R5 Found
    Goto loop2
  Goto loop1
 
  exit:
  ;Not found!!!
  StrCpy $R1 ""
  StrCpy $R0 ""
  Goto Cleanup
 
  Found:
  StrLen $R3 $R0
  IntOp $R3 $R3 - $R2
  StrCpy $R1 $R0 $R3
 
  IntOp $R2 $R2 - 1
  IntOp $R3 $R3 + 1
  StrCpy $R0 $R0 $R2 $R3
 
  Cleanup:
  Pop $R5
  Pop $R4
  Pop $R3
  Pop $R2
  Exch $R0
  Exch 1
  Exch $R1
 
FunctionEnd

Questions/comments/bugs/fixes? Send a private message. Enjoy,

bigmac666