def read_escape
case
when src.scan(/\\/) then
'\\'
when src.scan(/n/) then
"\n"
when src.scan(/t/) then
"\t"
when src.scan(/r/) then
"\r"
when src.scan(/f/) then
"\f"
when src.scan(/v/) then
"\13"
when src.scan(/a/) then
"\007"
when src.scan(/e/) then
"\033"
when src.scan(/b/) then
"\010"
when src.scan(/s/) then
" "
when src.scan(/[0-7]{1,3}/) then
src.matched.to_i(8).chr
when src.scan(/x([0-9a-fA-F]{1,2})/) then
src[1].to_i(16).chr
when src.check(/M-\\[\\MCc]/) then
src.scan(/M-\\/)
c = self.read_escape
c[0] = (c[0].ord | 0x80).chr
c
when src.scan(/M-(.)/) then
c = src[1]
c[0] = (c[0].ord | 0x80).chr
c
when src.check(/(C-|c)\\[\\MCc]/) then
src.scan(/(C-|c)\\/)
c = self.read_escape
c[0] = (c[0].ord & 0x9f).chr
c
when src.scan(/C-\?|c\?/) then
127.chr
when src.scan(/(C-|c)(.)/) then
c = src[2]
c[0] = (c[0].ord & 0x9f).chr
c
when src.scan(/[McCx0-9]/) || src.eos? then
rb_compile_error("Invalid escape character syntax")
else
src.getch
end
end