« All posts

Oct 13th, 2021

Started working on CSI sequence parser, it’s fun to do all this works from scratch, there are too many cases with almost
zero documentation/specs, lol.

According to Wikipedia, I think a CSI sequence can be parsed into a tuple of (param, intermediate, final) bytes like the
following diagram:

ESC [ <0x30-0x3F>+ <0x20-0x2F>+ <0x40-0x7E>
            ↓           ↓           ↓
          param    intermediate   final

For example, with a sequence like ESC[5A to move cursor up 5 lines, it would be parsed as (5, _, A). Longer and more
complex commands like settting foreground color ESC[38;5;94m would be parsed as (38;5;94, _, m).

At first, I think I would use nom to write a parser, but I just feel lazy, so I wrote something similar to the idea of
nom for parsing, luckily, the structure of the CSI sequence is not complex enough, so a simple iter chain would be enough
to handle it.

With the parser ready, the first CSI sequence to be implemented is ESC[2J, what you got after sending clear command :D


Read more