Snippet stringFind

Darthfett

Aerospace/Cybersecurity Software Engineer
Reaction score
615
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
 

Steel

Software Engineer
Reaction score
109
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.
 

Darthfett

Aerospace/Cybersecurity Software Engineer
Reaction score
615
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.

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.
 

Darthfett

Aerospace/Cybersecurity Software Engineer
Reaction score
615
Sorry but... What would this be useful for anyway?

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.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Varine Varine:
    How can you tell the difference between real traffic and indexing or AI generation bots?
  • The Helper The Helper:
    The bots will show up as users online in the forum software but they do not show up in my stats tracking. I am sure there are bots in the stats but the way alot of the bots treat the site do not show up on the stats
  • Varine Varine:
    I want to build a filtration system for my 3d printer, and that shit is so much more complicated than I thought it would be
  • Varine Varine:
    Apparently ABS emits styrene particulates which can be like .2 micrometers, which idk if the VOC detectors I have can even catch that
  • Varine Varine:
    Anyway I need to get some of those sensors and two air pressure sensors installed before an after the filters, which I need to figure out how to calculate the necessary pressure for and I have yet to find anything that tells me how to actually do that, just the cfm ratings
  • Varine Varine:
    And then I have to set up an arduino board to read those sensors, which I also don't know very much about but I have a whole bunch of crash course things for that
  • Varine Varine:
    These sensors are also a lot more than I thought they would be. Like 5 to 10 each, idk why but I assumed they would be like 2 dollars
  • Varine Varine:
    Another issue I'm learning is that a lot of the air quality sensors don't work at very high ambient temperatures. I'm planning on heating this enclosure to like 60C or so, and that's the upper limit of their functionality
  • Varine Varine:
    Although I don't know if I need to actually actively heat it or just let the plate and hotend bring the ambient temp to whatever it will, but even then I need to figure out an exfiltration for hot air. I think I kind of know what to do but it's still fucking confusing
  • The Helper The Helper:
    Maybe you could find some of that information from AC tech - like how they detect freon and such
  • Varine Varine:
    That's mostly what I've been looking at
  • Varine Varine:
    I don't think I'm dealing with quite the same pressures though, at the very least its a significantly smaller system. For the time being I'm just going to put together a quick scrubby box though and hope it works good enough to not make my house toxic
  • Varine Varine:
    I mean I don't use this enough to pose any significant danger I don't think, but I would still rather not be throwing styrene all over the air
  • The Helper The Helper:
    New dessert added to recipes Southern Pecan Praline Cake https://www.thehelper.net/threads/recipe-southern-pecan-praline-cake.193555/
  • The Helper The Helper:
    Another bot invasion 493 members online most of them bots that do not show up on stats
  • Varine Varine:
    I'm looking at a solid 378 guests, but 3 members. Of which two are me and VSNES. The third is unlisted, which makes me think its a ghost.
    +1
  • The Helper The Helper:
    Some members choose invisibility mode
    +1
  • The Helper The Helper:
    I bitch about Xenforo sometimes but it really is full featured you just have to really know what you are doing to get the most out of it.
  • The Helper The Helper:
    It is just not easy to fix styles and customize but it definitely can be done
  • The Helper The Helper:
    I do know this - xenforo dropped the ball by not keeping the vbulletin reputation comments as a feature. The loss of the Reputation comments data when we switched to Xenforo really was the death knell for the site when it came to all the users that left. I know I missed it so much and I got way less interested in the site when that feature was gone and I run the site.
  • Blackveiled Blackveiled:
    People love rep, lol
    +1
  • The Helper The Helper:
    The recipe today is Sloppy Joe Casserole - one of my faves LOL https://www.thehelper.net/threads/sloppy-joe-casserole-with-manwich.193585/
  • The Helper The Helper:
    Decided to put up a healthier type recipe to mix it up - Honey Garlic Shrimp Stir-Fry https://www.thehelper.net/threads/recipe-honey-garlic-shrimp-stir-fry.193595/

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top