Snippet stringFind

Discussion in 'Systems and Snippets' started by Darthfett, Jan 4, 2010.

  1. Darthfett

    Darthfett Super Mod

    Ratings:
    +614 / 0 / -0
    stringFind
    Created by Darthfett

    Description:
    A small collection of functions used to iterate and search through a string, such as finding "run" in "Grunts stink"

    Requirements:
    N/A

    The rest of the documentation can be found in the system code, below:

    JASS:
    library stringFind
    /*
    __________________________________________________________________________________
    
            stringFind library, created by Darthfett - version 1.1
            http://www.thehelper.net/forums/showthread.php?t=143591
            
                                    Requirements
                                    
    -vJass compiler (such as JASSHelper)
        -If you remove the library and multi-line comment(s), you can make this JASS compatable.
    
                                    Documentation
                                    
    -All functions are standalone.  Feel free to copy an individual function.
    
    -Credit for this library is not necessary.  Feel free to use it in your map.
    If you feel obligated to credit me, I won't object.  I only ask that you do 
    not simply copy and paste the library as your own.
    
                                        API
                                
    function ContainsString takes string s, string find, boolean checkCase returns boolean
        returns whether s contains find.  checkCase determines whether case is checked
        
    function StartsWith takes string s, string find, boolean checkCase returns boolean
        returns whether s starts with find.  checkCase determines whether case is checked.
        
    function EndsWith takes string s, string find, boolean checkCase returns boolean
        returns whether s ends with find.  checkCase determines whether case is checked.
        
    function CountInString takes string s, string find, boolean allowOverlap, boolean checkCase returns integer
        returns the number of times 'find' can be found in 's'.  If allowOverlap
        is true, 'aa' can be found in 'aaa' 2 times.  Otherwise, only once.
        checkCase determines whether case is checked
        
    function FindFirstOf takes string s, integer start, string find, boolean checkCase returns integer
        returns the index of the first instance of find in s starting from 'start'.
        If 'find' is not found, it will return the length of s.
        checkCase determines whether case is checked
        
    function FindString takes string s, string find, boolean checkCase returns integer
        returns the index of the first instance of find in s, starting from 0.
        If 'find' is not found, it will return the length of s.
        checkCase determines whether case is checked
            
        Yes, this is a duplicate of FindFirstOf. It is included, to show an 
        example of how to use FindFirstOf (simply use 0), and for simplifying
        code/syntax.
        
    function FindLastOf takes string s, integer end, string find, boolean checkCase returns integer
        returns the index of the last instance of find in s, going back from end.
        If 'find' is not found, it will return 0.
        checkCase determines whether case is checked
        
    function FindStringLast takes string s, string find, boolean checkCase returns integer
        returns the index of the last instance of find in s.
        If 'find' is not found, it will return 0.
        checkCase determines whether case is checked
    
    __________________________________________________________________________________
    */ 
    
    function ContainsString takes string s, string find, boolean checkCase returns boolean
        local integer i = 0
        local integer findLen = StringLength(find)
        local integer sLen = StringLength(s)
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        loop
            exitwhen i+findLen > sLen
            if SubString(s,i,i+findLen) == find then
                return true
            endif
            set i = i + 1
        endloop
        return false
    endfunction
    
    function StartsWith takes string s, string find, boolean checkCase returns boolean
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        return SubString(s,0,StringLength(find)) == find
    endfunction
    
    function EndsWith takes string s, string find, boolean checkCase returns boolean
        local integer sLen = StringLength(s)
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        return SubString(s,sLen - StringLength(find),sLen) == find
    endfunction   
    
    function CountInString takes string s, string find, boolean allowOverlap, boolean checkCase returns integer
        local integer i = 0
        local integer findLen = StringLength(find)
        local integer sLen = StringLength(s)
        local integer count = 0
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        loop
            exitwhen i+findLen > sLen
            if SubString(s,i,i+findLen) == find then
                set count = count + 1
                if allowOverlap then
                    set i = i + 1
                else
                    set i = i + findLen
                endif
            else
                set i = i + 1
            endif
        endloop
        return count
    endfunction
    
    function FindFirstOf takes string s, integer start, string find, boolean checkCase returns integer
        local integer sLen = StringLength(s)
        local integer findLen = StringLength(find)
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        loop
            exitwhen start + findLen > sLen
            if SubString(s,start,start+findLen) == find then
                return start
            endif
            set start = start + 1
        endloop
        return sLen
    endfunction
    
    function FindString takes string s, string find, boolean checkCase returns integer
        local integer start = 0
        local integer sLen = StringLength(s)
        local integer findLen = StringLength(find)
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        loop
            exitwhen start + findLen > sLen
            if SubString(s,start,start+findLen) == find then
                return start
            endif
            set start = start + 1
        endloop
        return sLen
    endfunction
    
    function FindLastOf takes string s, integer end, string find, boolean checkCase returns integer
        local integer findLen = StringLength(find)
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        loop
            exitwhen end - findLen < 0
            if SubString(s,end-findLen,end) == find then
                return end-findLen
            endif
            set end = end - 1
        endloop
        return 0
    endfunction
    
    function FindStringLast takes string s, string find, boolean checkCase returns integer
        local integer end = StringLength(s)
        local integer findLen = StringLength(find)
        if not checkCase then
            set s = StringCase(s,false)
            set find = StringCase(find,false)
        endif
        loop
            exitwhen end - findLen < 0
            if SubString(s,end-findLen,end) == find then
                return end-findLen
            endif
            set end = end - 1
        endloop
        return 0
    endfunction
    
    endlibrary
     
    • Like Like x 1
  2. Steel

    Steel Software Engineer

    Ratings:
    +109 / 0 / -0
    Something on all of these newly submitted snippets of yours you should work on is better variable names.

    JASS:
    
    function ContainsString takes string s, string find returns boolean


    Is much better as

    JASS:
    
    function ContainsString takes string source, string tofind returns boolean


    This indicates which string is which. String s doesn't tell the user much and they have to imply what the second string is based on the word.
     
  3. Darthfett

    Darthfett Super Mod

    Ratings:
    +614 / 0 / -0
    s and find should be pretty obvious. There's also documentation on them, and it's consistent throughout all the libraries. In other functions which have other arguments, I try to be more precise in naming these, but finding 'find' in 's' is common to many functions in this library.

    Anyways, this is an update to 1.1, as I added the checkCase boolean to each function, along with the StartsWith and EndsWith functions.
     
  4. RaiJin

    RaiJin New Member

    Ratings:
    +40 / 0 / -0
    wow this is very wicked, something i REALLY NEEDED.

    +REP
     
  5. Tyman2007

    Tyman2007 Ya Rly >.

    Ratings:
    +74 / 0 / -0
    Sorry but... What would this be useful for anyway?
     
  6. Darthfett

    Darthfett Super Mod

    Ratings:
    +614 / 0 / -0
    For the most part, easily creating commands. For examples, see this, or my cmd systems:

    JASS:
    library cmdTest initializer Init uses stringFind
    
        globals
            boolean enabled = false
        endglobals
    
        private function Conditions takes nothing returns boolean
            return StartsWith(GetEventPlayerChatString(),"-test",false)
        endfunction
    
        private function Actions takes nothing returns nothing
            if enabled then
                set enabled = false
                call BJDebugMsg("Test mode disabled")
            else
                set enabled = true
                call BJDebugMsg("Test mode enabled")
            endif
        endfunction
    
        private function Init takes nothing returns nothing
            local trigger t = CreateTrigger()
            call TriggerRegisterPlayerChatEvent(t,Player(0))
            call TriggerAddCondition(t,Condition(function Conditions))
            call TriggerAddActions(t,function Actions)
        endfunction
    
    endlibrary


    This is an extremely simple way to have a "-test" command. Keep in mind, this is freehanded.

    Using the FindString or ContainsString functions will allow you to use multiple commands in one line, and/or commands with arguments.
     
  7. Darthfett

    Darthfett Super Mod

    Ratings:
    +614 / 0 / -0
    Any ideas on additional 'finding' functions, or any problems with the code? I've tried to make sure the string library is as efficient as possible. :)
     
  8. Ghan

    Ghan Administrator - Servers are fun Staff Member

    Ratings:
    +773 / 0 / -0
    Approved.
     
  9. SanKakU

    SanKakU Member

    Ratings:
    +21 / 0 / -0
    this looks interesting, i'll be sure to check it out.
     
  10. SineCosine

    SineCosine I'm still looking for my Tangent

    Ratings:
    +76 / 0 / -0
    Darth, your snippets are really, really, really useful ._.
     
  11. Darthfett

    Darthfett Super Mod

    Ratings:
    +614 / 0 / -0
    Thank you. :)
     

Share This Page