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<len then
			i = i+1
			ci = str:sub(i, i)
			for escidx, esc in ipairs(escapes) do
				if ci==esc[2] then co = esc[1] end
			end
		end
		
		table.insert(ostrt, co)
		i = i+1
	end
	
	return table.concat(ostrt)
end

function tobitstring(num, len)
	local maxval = bit.lshift(1, len)
	if num>=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