From 96bf1d211b47e1cec0386b4e21dcf9542b7a94d3 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Sat, 22 Jan 2011 05:10:18 -0500 Subject: [PATCH] Handle cursor position (CUP) --- terminal.cpp | 21 +++++++++++++++++++-- terminal.hpp | 1 + terminalcsi.cpp | 10 ++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/terminal.cpp b/terminal.cpp index 5b7c942..d477449 100644 --- a/terminal.cpp +++ b/terminal.cpp @@ -256,7 +256,10 @@ void Emulator::parse_params( void ) errno = 0; char *endptr; int val = strtol( segment_begin, &endptr, 10 ); - if ( (errno == 0) && (endptr != segment_begin) ) { + if ( endptr == segment_begin ) { + val = -1; + } + if ( errno == 0 ) { parsed_params.push_back( val ); } @@ -267,7 +270,21 @@ void Emulator::parse_params( void ) errno = 0; char *endptr; int val = strtol( segment_begin, &endptr, 10 ); - if ( (errno == 0) && (endptr != segment_begin) ) { + if ( endptr == segment_begin ) { + val = -1; + } + if ( errno == 0 ) { parsed_params.push_back( val ); } } + +int Emulator::getparam( size_t N, int defaultval ) +{ + int ret = defaultval; + if ( parsed_params.size() > N ) { + ret = parsed_params[ N ]; + } + if ( ret < 1 ) ret = defaultval; + + return ret; +} diff --git a/terminal.hpp b/terminal.hpp index de37ce1..4cacd7c 100644 --- a/terminal.hpp +++ b/terminal.hpp @@ -62,6 +62,7 @@ namespace Terminal { void parse_params( void ); std::vector parsed_params; + int getparam( size_t N, int defaultval ); /* CSI methods */ void CSI_EL( void ); diff --git a/terminalcsi.cpp b/terminalcsi.cpp index 5215e22..23cfe20 100644 --- a/terminalcsi.cpp +++ b/terminalcsi.cpp @@ -22,10 +22,7 @@ void Emulator::CSI_EL( void ) void Emulator::CSI_cursormove( void ) { parse_params(); - int num = 1; - if ( parsed_params.size() >= 1 ) { - num = parsed_params[ 0 ]; - } + int num = getparam( 0, 1 ); switch ( dispatch_chars[ 0 ] ) { case 'A': @@ -40,6 +37,11 @@ void Emulator::CSI_cursormove( void ) case 'D': cursor_col -= num; break; + case 'H': + int x = getparam( 0, 1 ); + int y = getparam( 1, 1 ); + cursor_row = x - 1; + cursor_col = y - 1; } if ( cursor_row < 0 ) cursor_row = 0;