@@ -847,6 +847,26 @@ static void console_clear_xy(TextConsole *s, int x, int y)
847
847
update_xy (s , x , y );
848
848
}
849
849
850
+ /* set cursor, checking bounds */
851
+ static void set_cursor (TextConsole * s , int x , int y )
852
+ {
853
+ if (x < 0 ) {
854
+ x = 0 ;
855
+ }
856
+ if (y < 0 ) {
857
+ y = 0 ;
858
+ }
859
+ if (y >= s -> height ) {
860
+ y = s -> height - 1 ;
861
+ }
862
+ if (x >= s -> width ) {
863
+ x = s -> width - 1 ;
864
+ }
865
+
866
+ s -> x = x ;
867
+ s -> y = y ;
868
+ }
869
+
850
870
static void console_putchar (TextConsole * s , int ch )
851
871
{
852
872
TextCell * c ;
@@ -918,7 +938,8 @@ static void console_putchar(TextConsole *s, int ch)
918
938
s -> esc_params [s -> nb_esc_params ] * 10 + ch - '0' ;
919
939
}
920
940
} else {
921
- s -> nb_esc_params ++ ;
941
+ if (s -> nb_esc_params < MAX_ESC_PARAMS )
942
+ s -> nb_esc_params ++ ;
922
943
if (ch == ';' )
923
944
break ;
924
945
#ifdef DEBUG_CONSOLE
@@ -932,59 +953,37 @@ static void console_putchar(TextConsole *s, int ch)
932
953
if (s -> esc_params [0 ] == 0 ) {
933
954
s -> esc_params [0 ] = 1 ;
934
955
}
935
- s -> y -= s -> esc_params [0 ];
936
- if (s -> y < 0 ) {
937
- s -> y = 0 ;
938
- }
956
+ set_cursor (s , s -> x , s -> y - s -> esc_params [0 ]);
939
957
break ;
940
958
case 'B' :
941
959
/* move cursor down */
942
960
if (s -> esc_params [0 ] == 0 ) {
943
961
s -> esc_params [0 ] = 1 ;
944
962
}
945
- s -> y += s -> esc_params [0 ];
946
- if (s -> y >= s -> height ) {
947
- s -> y = s -> height - 1 ;
948
- }
963
+ set_cursor (s , s -> x , s -> y + s -> esc_params [0 ]);
949
964
break ;
950
965
case 'C' :
951
966
/* move cursor right */
952
967
if (s -> esc_params [0 ] == 0 ) {
953
968
s -> esc_params [0 ] = 1 ;
954
969
}
955
- s -> x += s -> esc_params [0 ];
956
- if (s -> x >= s -> width ) {
957
- s -> x = s -> width - 1 ;
958
- }
970
+ set_cursor (s , s -> x + s -> esc_params [0 ], s -> y );
959
971
break ;
960
972
case 'D' :
961
973
/* move cursor left */
962
974
if (s -> esc_params [0 ] == 0 ) {
963
975
s -> esc_params [0 ] = 1 ;
964
976
}
965
- s -> x -= s -> esc_params [0 ];
966
- if (s -> x < 0 ) {
967
- s -> x = 0 ;
968
- }
977
+ set_cursor (s , s -> x - s -> esc_params [0 ], s -> y );
969
978
break ;
970
979
case 'G' :
971
980
/* move cursor to column */
972
- s -> x = s -> esc_params [0 ] - 1 ;
973
- if (s -> x < 0 ) {
974
- s -> x = 0 ;
975
- }
981
+ set_cursor (s , s -> esc_params [0 ] - 1 , s -> y );
976
982
break ;
977
983
case 'f' :
978
984
case 'H' :
979
985
/* move cursor to row, column */
980
- s -> x = s -> esc_params [1 ] - 1 ;
981
- if (s -> x < 0 ) {
982
- s -> x = 0 ;
983
- }
984
- s -> y = s -> esc_params [0 ] - 1 ;
985
- if (s -> y < 0 ) {
986
- s -> y = 0 ;
987
- }
986
+ set_cursor (s , s -> esc_params [1 ] - 1 , s -> esc_params [0 ] - 1 );
988
987
break ;
989
988
case 'J' :
990
989
switch (s -> esc_params [0 ]) {
0 commit comments