diff --git a/connect4.c b/connect4.c index ef18406..056ee25 100644 --- a/connect4.c +++ b/connect4.c @@ -122,10 +122,10 @@ int main( int argc, char *argv[] ){ fprintf( stderr, "ERR: AMOUT OF ROWS MUST BE AT LEAST 1\n" ); return -1; } -#define ROWOVERFLOW ( sizeof(column_t) * CHAR_BIT ) +#define ROWOVERFLOW (rowsint_t)( sizeof(column_t) * CHAR_BIT ) if( playboard.rows >= ROWOVERFLOW ){ fprintf( stderr, - "ERR: AMOUT OF ROWS MUST BE LESS THAN %d\n", (int)ROWOVERFLOW + "ERR: AMOUT OF ROWS MUST BE LESS THAN %d\n", ROWOVERFLOW ); return -1; } @@ -164,7 +164,7 @@ int main( int argc, char *argv[] ){ initBoard( playboard ); // Begin loopin for(;; playboard.player = !playboard.player ){ - int column = askColumn( playboard ); + columnsint_t column = askColumn( playboard ); playMove( &playboard, column ); calcWins( &wins, playboard, column ); updateBoard( wins, playboard, column ); diff --git a/makefile b/makefile index b770171..09d37db 100644 --- a/makefile +++ b/makefile @@ -1,10 +1,11 @@ #!/usr/bin/make -f -FLAGS = -std=gnu23 +FLAGS = -std=c23 FLAGS += -O3 FLAGS += -pedantic FLAGS += -Wall FLAGS += -Wextra FLAGS += -Werror +FLAGS += -Wformat-truncation=0 GITFLAG = -D'GITHASH=$(shell git rev-parse --short=1 HEAD)' diff --git a/types.h b/types.h index 49ee1eb..7ec4fa5 100644 --- a/types.h +++ b/types.h @@ -4,14 +4,26 @@ #include #include "config.h" -typedef int column_t; +#if INT_FAST16_MAX == INT_FAST64_MAX +typedef int rowsint_t; +typedef int columnsint_t; +typedef unsigned winint_t; +typedef uintmax_t column_t; +#else +typedef int_fast8_t rowsint_t; +typedef int_fast8_t columnsint_t; +typedef uint_fast8_t winint_t; +typedef uint_fast8_t column_t; +#endif + +#define WININT_FORMAT "%3d" typedef struct { - int player; - column_t *height; + bool player; + rowsint_t *height; column_t *column; - uint8_t rows; - uint8_t columns; + rowsint_t rows; + columnsint_t columns; } board_t; typedef struct { @@ -26,11 +38,11 @@ typedef struct { } directions_t; typedef struct { - int total; - int horizontal; - int vertical; - int diagonalUp; - int diagonalDown; + winint_t total; + winint_t horizontal; + winint_t vertical; + winint_t diagonalUp; + winint_t diagonalDown; } wincount_t; typedef struct { diff --git a/ui.h b/ui.h index e9575a6..6ab5588 100644 --- a/ui.h +++ b/ui.h @@ -11,7 +11,7 @@ extern void initBoard( extern void updateBoard( const wins_t wins, const board_t board, - const int column + const columnsint_t column ); extern int askColumn( diff --git a/ui_ncurses.c b/ui_ncurses.c index 6043abd..b86f255 100644 --- a/ui_ncurses.c +++ b/ui_ncurses.c @@ -71,15 +71,17 @@ void initBoard( const board_t board ){ keypad(stdscr, TRUE); nonl(); echo(); - for( int column = 0; column < board.columns; column++ ){ + for( columnsint_t column = 0; column < board.columns; column++ ){ char colnum[4]; - sprintf( colnum, "%2d", column + FIRST_NUMBER ); + snprintf( + colnum, sizeof(colnum), "%2d", column + FIRST_NUMBER + ); mvaddstr( BOARD_Y, BOARD_X + BOARD_DX * ( column + 1 ), colnum ); - for(int row = 0; row < board.rows; row++){ + for( rowsint_t row = 0; row < board.rows; row++ ){ mvaddstr( BOARD_Y + BOARD_DY * ( row + 1 ), BOARD_X + BOARD_DX * ( column + 1 ), @@ -92,9 +94,11 @@ void initBoard( const board_t board ){ colnum ); } - for(int row = 0; row < board.rows; row++ ){ + for( rowsint_t row = 0; row < board.rows; row++ ){ char rownum[4]; - sprintf( rownum, "%2d", board.rows - row + FIRST_NUMBER - 1 ); + snprintf( + rownum, sizeof(rownum), "%2d", board.rows - row + FIRST_NUMBER - 1 + ); mvaddstr( BOARD_Y + BOARD_DY * ( row + 1 ), BOARD_X, @@ -106,7 +110,7 @@ void initBoard( const board_t board ){ rownum ); } - for( int y = 0; y < SCOREBOARD_HEIGHT; y++ ){ + for( uint_fast8_t y = 0; y < SCOREBOARD_HEIGHT; y++ ){ char *str; switch(y){ case 0: str = "┌───────────────┬────┬────┐"; break; @@ -132,70 +136,70 @@ void initBoard( const board_t board ){ void updateBoard( const wins_t wins, const board_t board, - const int column + const columnsint_t column ){ - int height = board.height[ column ]; + rowsint_t height = board.height[ column ]; mvaddstr( BOARD_Y + BOARD_DY * ( board.rows - height + 1 ), BOARD_X + 1 + BOARD_DX * ( column + 1 ), board.column[ column ] & 1 << ( height - 1 ) ? "1" : "0" ); char num[4]; - sprintf( num, "%3d", wins.count0.vertical ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count0.vertical ); mvaddstr( SCOREBOARD_Y + 3, SCOREBOARD_X + 17, num ); - sprintf( num, "%3d", wins.count1.vertical ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count1.vertical ); mvaddstr( SCOREBOARD_Y + 3, SCOREBOARD_X + 22, num ); - sprintf( num, "%3d", wins.count0.horizontal ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count0.horizontal ); mvaddstr( SCOREBOARD_Y + 4, SCOREBOARD_X + 17, num ); - sprintf( num, "%3d", wins.count1.horizontal ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count1.horizontal ); mvaddstr( SCOREBOARD_Y + 4, SCOREBOARD_X + 22, num ); - sprintf( num, "%3d", wins.count0.diagonalUp ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count0.diagonalUp ); mvaddstr( SCOREBOARD_Y + 5, SCOREBOARD_X + 17, num ); - sprintf( num, "%3d", wins.count1.diagonalUp ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count1.diagonalUp ); mvaddstr( SCOREBOARD_Y + 5, SCOREBOARD_X + 22, num ); - sprintf( num, "%3d", wins.count0.diagonalDown ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count0.diagonalDown ); mvaddstr( SCOREBOARD_Y + 6, SCOREBOARD_X + 17, num ); - sprintf( num, "%3d", wins.count1.diagonalDown ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count1.diagonalDown ); mvaddstr( SCOREBOARD_Y + 6, SCOREBOARD_X + 22, num ); - sprintf( num, "%3d", wins.count0.total ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count0.total ); mvaddstr( SCOREBOARD_Y + 8, SCOREBOARD_X + 17, num ); - sprintf( num, "%3d", wins.count1.total ); + snprintf( num, sizeof(num), WININT_FORMAT, wins.count1.total ); mvaddstr( SCOREBOARD_Y + 8, SCOREBOARD_X + 22, @@ -206,7 +210,7 @@ void updateBoard( int askColumn( const board_t board ){ - int column = 0; + columnsint_t column = 0; #ifdef ARROWS move( BOARD_Y, BOARD_X ); if( board.player ) addstr( "p1" ); diff --git a/ui_vt100.c b/ui_vt100.c index 625bd78..c38131d 100644 --- a/ui_vt100.c +++ b/ui_vt100.c @@ -27,26 +27,24 @@ #define SCOREBOARD_HEIGHT 9 void initBoard( const board_t board ){ - for( int i = SCOREBOARD_HEIGHT - ( board.rows + 2 ); i > 0; i-- ) + for( rowsint_t i = SCOREBOARD_HEIGHT - ( board.rows + 2 ); i > 0; i-- ) putchar( '\n' ); printf( "\n " ); - for( int column = 0; column < board.columns; column++ ) + for( columnsint_t column = 0; column < board.columns; column++ ) printf( "%2d ", column + FIRST_NUMBER ); putchar( '\n' ); - for( int row = board.rows - 1; row > -1; row-- ){ + for( rowsint_t row = board.rows - 1; row > -1; row-- ){ // begin row printf( "%2d " , row + FIRST_NUMBER ); - for( int column = 0; column < board.columns; column++ ) + for( columnsint_t column = 0; column < board.columns; column++ ) printf( "[ ]" ); // end of row printf( "%2d" , row + FIRST_NUMBER ); - switch( row ){ - } putchar( '\n' ); } // end of board printf( " " ); - for( int column = 0; column < board.columns; column++ ) + for( columnsint_t column = 0; column < board.columns; column++ ) printf( "%2d ", column + FIRST_NUMBER ); #define SCOREBOARD_LINE_END "\033[B\033["XSTR(SCOREBOARD_WIDTH)"D" printf("\033["XSTR(SCOREBOARD_OFFSET)"C\033["XSTR(SCOREBOARD_HEIGHT)"A" @@ -69,9 +67,9 @@ void initBoard( const board_t board ){ void updateBoard( const wins_t wins, const board_t board, - const int column + const columnsint_t column ){ - int height = board.height [ column ]; + rowsint_t height = board.height [ column ]; printf( "\033[%dA\033[%dC%c\033[%dB", height + 3, @@ -81,11 +79,11 @@ void updateBoard( ); printf( "\r\033[7A\033[%dC" - "%3d │%3d\033[B\033[8D" - "%3d │%3d\033[B\033[8D" - "%3d │%3d\033[B\033[8D" - "%3d │%3d\033[2B\033[8D" - "%3d │%3d\033[2B" + "" WININT_FORMAT " │" WININT_FORMAT "\033[B\033[8D" + "" WININT_FORMAT " │" WININT_FORMAT "\033[B\033[8D" + "" WININT_FORMAT " │" WININT_FORMAT "\033[B\033[8D" + "" WININT_FORMAT " │" WININT_FORMAT "\033[2B\033[8D" + "" WININT_FORMAT " │" WININT_FORMAT "\033[2B" ,( 3 * board.columns + 6 ) + SCOREBOARD_WIDTH - 8 ,wins.count0.vertical, wins.count1.vertical ,wins.count0.horizontal, wins.count1.horizontal @@ -99,7 +97,7 @@ void updateBoard( int askColumn( const board_t board ){ - int column; + columnsint_t column; for(;;){ printf( "Wher player %d put? ", board.player ); printf( "\033[K" ); // clear everything after cursor @@ -112,7 +110,7 @@ int askColumn( else column *= 10; if( column >= 0 ) - column += ( int )( ch - '0' ); + column += (columnsint_t)( ch - '0' ); } else { column = -2; }