[bmx] Escape unsafe characters in strings by Pineapple [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:43

Previous topic - Next topic

BlitzBot

Title : Escape unsafe characters in strings
Author : Pineapple
Posted : 1+ years ago

Description : Turns things like " into " or ~q and back again

Code :
Code (blitzmax) Select
'   --+-----------------------------------------------------------------------------------------+--
'     |   This code was originally written by Sophie Kirschner (sophiek@pineapplemachine.com)   |  
'     | It is released as public domain. Please don't interpret that as liberty to claim credit |  
'     |   that isn't yours, or to sell this code when it could otherwise be obtained for free   |  
'     |                because that would be a really shitty thing of you to do.                |
'   --+-----------------------------------------------------------------------------------------+--

superstrict



' Example code

rem

framework brl.standardio

local str$ = "tab: ~t~n double quote: ~q~n single quote: '~n tilde: ~~~n backslash: "

print "test string looks like this:"
print str

print "c escapes:"
local cescape:stringescape = new stringescape.c()
local cresult$ = cescape.escape( str )
print cresult
assert cescape.unescape( cresult ) = str

print "json escapes:"
local jsonescape:stringescape = new stringescape.json()
local jsonresult$ = jsonescape.escape( str )
print jsonresult
assert jsonescape.unescape( jsonresult ) = str

print "blitzmax escapes:"
local bmaxescape:stringescape = new stringescape.bmax()
local bmaxresult$ = bmaxescape.escape( str )
print bmaxresult
assert bmaxescape.unescape( bmaxresult ) = str

endrem



type stringescape

    field escapechar$
    field escapes$[][]
   
    ' intialize with C escapes
    method c:stringescape()
        escapechar = ""
        escapes = [ ..
            [ "~q", "~q" ], [ "/", "/" ], ..
            [ "'", "'" ], [ "?", "?" ], ..
            [ chr($08), "b" ], .. ' backspace
            [ chr($0C), "f" ], .. ' form feed
            [ chr($0A), "n" ], .. ' newline
            [ chr($0D), "r" ], .. ' carriage return
            [ chr($09), "t" ], .. ' tab
            [ chr($0B), "v" ], .. ' vertical tab
            [ chr($07), "a" ]  .. ' alarm
        ]
        return self
    end method
   
    ' initialize with javascript escapes
    method js:stringescape()
        escapechar = ""
        escapes = [ ..
            [ "~q", "~q" ], [ "'", "'" ], ..
            [ chr($08), "b" ], .. ' backspace
            [ chr($0C), "f" ], .. ' form feed
            [ chr($0A), "n" ], .. ' newline
            [ chr($0D), "r" ], .. ' carriage return
            [ chr($09), "t" ]  .. ' tab
        ]
        return self
    end method
   
    ' initialize with json escapes
    method json:stringescape()
        escapechar = ""
        escapes = [ ..
            [ "~q", "~q" ], ..
            [ chr($08), "b" ], .. ' backspace
            [ chr($0C), "f" ], .. ' form feed
            [ chr($0A), "n" ], .. ' newline
            [ chr($0D), "r" ], .. ' carriage return
            [ chr($09), "t" ], .. ' tab
            [ chr($0B), "v" ]  .. ' vertical tab
        ]
        return self
    end method
   
    ' initialize with blitzmax escapes
    method bmax:stringescape()
        escapechar = "~~"
        escapes = [ ..
            [ chr($00), "0" ], .. ' null
            [ chr($09), "t" ], .. ' tab
            [ chr($0D), "r" ], .. ' return
            [ chr($0A), "n" ], .. ' newline
            [ chr($22), "q" ]  .. ' quote
        ]
        return self
    end method
   
    ' initialize with regex escapes
    method regex:stringescape()
        escapechar = ""
        escapes = [ ..
            [ "/", "/" ], [ "^", "^" ], ..
            [ "$", "$" ], [ ".", "." ], ..
            [ "|", "|" ], [ "?", "?" ], ..
            [ "*", "*" ], [ "+", "+" ], ..
            [ "(", "(" ], [ ")", ")" ], ..
            [ "[", "[" ], [ "]", "]" ], ..
            [ "{", "{" ], [ "}", "}" ]  ..
        ]
        return self
    end method
   
    ' escape unsafe characters in input string
    method escape$( str$ )
        local out$ = ""
        for local i% = 0 until str.length
            local char$ = chr( str[i] )
            local needesc% = (char = escapechar)
            local escchar$
            if not needesc
                for local j% = 0 until escapes.length
                    if char = escapes[j][0]
                        needesc = true
                        escchar = escapes[j][1]
                        exit
                    endif
                next
            endif
            if needesc
                out :+ escapechar
                if escchar
                    out :+ escchar
                else
                    out :+ char
                endif
            else
                out :+ char
            endif
        next
        return out
    end method
    ' get escaped string with unsafe chars not escaped
    method unescape$( str$ )
        local out$ = ""
        for local i% = 0 until str.length
            local char$ = chr( str[i] )
            if char = escapechar and i-1 < str.length
                local escchar$ = str[i+1]
                local subchar$ = escchar
                for local j% = 0 until escapes.length
                    if char = escapes[j][1]
                        subchar = escapes[j][0]
                        exit
                    endif
                next
                out :+ subchar
                i :+ 1
            else
                out :+ char
            endif
        next
        return out
    end method
   
end type


Comments :


Pineapple(Posted 1+ years ago)

 23 Feb 2015: Added a default escape constructor for regex characters.