ff3b73825d
This VT102 command is triggered by busybox when pressing the 'pos1' key.
284 lines
3.5 KiB
C++
284 lines
3.5 KiB
C++
/*
|
|
* \brief Test for decoding terminal input
|
|
* \author Norman Feske
|
|
* \date 2011-07-05
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2011-2013 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
/* Genode includes */
|
|
#include <base/printf.h>
|
|
#include <util/misc_math.h>
|
|
#include <util/string.h>
|
|
|
|
/* Terminal includes */
|
|
#include <terminal/decoder.h>
|
|
|
|
|
|
class Static_character_screen : public Terminal::Character_screen
|
|
{
|
|
private:
|
|
|
|
Terminal::Character_array &_char_array;
|
|
Terminal::Boundary _boundary;
|
|
Terminal::Position _cursor_pos;
|
|
|
|
public:
|
|
|
|
Static_character_screen(Terminal::Character_array &char_array)
|
|
: _char_array(char_array), _boundary(_char_array.boundary()) { }
|
|
|
|
void dump() const;
|
|
|
|
|
|
/********************************
|
|
** Character_screen interface **
|
|
********************************/
|
|
|
|
void output(Terminal::Character c)
|
|
{
|
|
// Genode::printf("output '%c'\n", c.ascii());
|
|
|
|
if (c.ascii() > 0x10)
|
|
_char_array.set(_cursor_pos, c);
|
|
_cursor_pos.x++;
|
|
if (_cursor_pos.x >= _boundary.width) {
|
|
_cursor_pos.x = 0;
|
|
_cursor_pos.y++;
|
|
}
|
|
if (_cursor_pos.y >= _boundary.height) {
|
|
// _char_array.newline();
|
|
_cursor_pos.y = _boundary.height - 1;
|
|
}
|
|
}
|
|
|
|
void civis()
|
|
{
|
|
}
|
|
|
|
void cnorm()
|
|
{
|
|
}
|
|
|
|
void cvvis()
|
|
{
|
|
}
|
|
|
|
void cpr()
|
|
{
|
|
}
|
|
|
|
void csr(int, int)
|
|
{
|
|
}
|
|
|
|
void cub(int)
|
|
{
|
|
}
|
|
|
|
void cuf(int)
|
|
{
|
|
if (_cursor_pos.x >= _boundary.width)
|
|
_cursor_pos.x++;
|
|
//
|
|
// _cursor_pos = _cursor_pos + Terminal::Offset(1, 0);
|
|
}
|
|
|
|
void cup(int y, int x)
|
|
{
|
|
using namespace Genode;
|
|
x = max(0, min(x, _boundary.width - 1));
|
|
y = max(0, min(y, _boundary.height - 1));
|
|
_cursor_pos = Terminal::Position(x, y);
|
|
}
|
|
|
|
void cuu1()
|
|
{
|
|
// if (_cursor_pos.y > 0)
|
|
// _cursor_pos.y--;
|
|
}
|
|
|
|
void dch(int)
|
|
{
|
|
}
|
|
|
|
void dl(int)
|
|
{
|
|
}
|
|
|
|
void ech(int)
|
|
{
|
|
}
|
|
|
|
void ed()
|
|
{
|
|
}
|
|
|
|
void el()
|
|
{
|
|
}
|
|
|
|
void el1()
|
|
{
|
|
}
|
|
|
|
void home()
|
|
{
|
|
_cursor_pos = Terminal::Position(0, 0);
|
|
}
|
|
|
|
void hpa(int x)
|
|
{
|
|
PDBG("hpa %d", x);
|
|
}
|
|
|
|
void hts()
|
|
{
|
|
}
|
|
|
|
void ich(int)
|
|
{
|
|
}
|
|
|
|
void il(int)
|
|
{
|
|
}
|
|
|
|
void oc()
|
|
{
|
|
}
|
|
|
|
void op()
|
|
{
|
|
}
|
|
|
|
void rc()
|
|
{
|
|
}
|
|
|
|
void ri()
|
|
{
|
|
}
|
|
|
|
void ris()
|
|
{
|
|
}
|
|
|
|
void rmam()
|
|
{
|
|
}
|
|
|
|
void rmir()
|
|
{
|
|
}
|
|
|
|
void setab(int)
|
|
{
|
|
}
|
|
|
|
void setaf(int)
|
|
{
|
|
}
|
|
|
|
void sgr(int)
|
|
{
|
|
}
|
|
|
|
virtual void sgr0()
|
|
{
|
|
}
|
|
|
|
void sc()
|
|
{
|
|
}
|
|
|
|
void smam()
|
|
{
|
|
}
|
|
|
|
void smir()
|
|
{
|
|
}
|
|
|
|
void tbc()
|
|
{
|
|
}
|
|
|
|
void u6(int, int)
|
|
{
|
|
}
|
|
|
|
void u7()
|
|
{
|
|
}
|
|
|
|
void u8()
|
|
{
|
|
}
|
|
|
|
void u9()
|
|
{
|
|
}
|
|
|
|
void vpa(int y)
|
|
{
|
|
PDBG("vpa %d", y);
|
|
}
|
|
};
|
|
|
|
|
|
void Static_character_screen::dump() const
|
|
{
|
|
using namespace Terminal;
|
|
|
|
Genode::printf("--- screen dump follows ---\n");
|
|
|
|
Boundary const boundary = _char_array.boundary();
|
|
for (int y = 0; y < boundary.height; y++) {
|
|
|
|
char line[boundary.width + 1];
|
|
|
|
for (int x = 0; x < boundary.width; x++) {
|
|
|
|
Character c = _char_array.get(Position(x, y));
|
|
if (c.is_valid())
|
|
line[x] = c.ascii();
|
|
else
|
|
line[x] = ' ';
|
|
}
|
|
|
|
line[boundary.width] = 0;
|
|
Genode::printf("%s\n", line);
|
|
}
|
|
|
|
Genode::printf("--- end of screen dump ---\n");
|
|
}
|
|
|
|
|
|
extern "C" char _binary_vim_vt_start;
|
|
extern "C" char _binary_vim_vt_end;
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
using namespace Terminal;
|
|
|
|
Static_character_array<81, 26> char_array;
|
|
|
|
Static_character_screen screen(char_array);
|
|
|
|
Decoder decoder(screen);
|
|
for (char *c = &_binary_vim_vt_start; c < &_binary_vim_vt_end; c++) {
|
|
decoder.insert(*c);
|
|
}
|
|
|
|
screen.dump();
|
|
|
|
return 0;
|
|
}
|