local escapes = { {"\\", "b"}, {"\t", "t"}, {"\n", "n"}, {"\r", "r"}, {"\'", "a"}, {"\"", "q"}, {";" , "s"}, {":" , "c"}, } function expandescape(str) local ostrt = {} local len = #str for i=1, len do local ci = str:sub(i, i) local co = ci for escidx, esc in ipairs(escapes) do if ci==esc[1] then co = "\\"..esc[2] end end table.insert(ostrt, co) end return table.concat(ostrt) end function collapseescape(str) local ostrt = {} local i = 1 local len = #str while i<=len do local ci = str:sub(i, i) local co = ci if ci=="\\" and i=maxval then error("bitstring value too big") end num = num%maxval local bitstring = "" for i = len, 1, -1 do bitstring = bitstring..bit.rshift(bit.band(num, bit.lshift(1, i-1)), i-1) end return bitstring end function array_remove(array, value) for i = 1, #array do local v = array[i] if v==value then array[i] = array[#array] array[#array] = nil return end end error("element not in array") end function array_add(array, value) for i = 1, #array do local v = array[i] if v==value then return end end table.insert(array, value) end