more helper functions

このコミットが含まれているのは:
woosh 2023-11-13 13:50:02 +00:00
コミット 1bd60845b6
1個のファイルの変更52行の追加23行の削除

75
uttt.c
ファイルの表示

@ -13,6 +13,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdarg.h>
struct ut_state
{
@ -236,6 +237,57 @@ int ut_click(const struct ut_state *state, int *r, int *c)
#undef P
}
int info_line; // set this to 21 and reset it on erase TODO
void ut_info(const char *str, int n)
{
mvaddnstr(info_line, 0, str, n);
// info_line++; // depends on str not containing newlines
int y, x;
getyx(stdscr, y, x);
info_line = y + 1;
}
int readfill(int fd, char *x, size_t l)
{
while(l > 0)
{
int r = read(fd, x, l);
if(r < 0)
{
if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {continue;}
else {return 1;}
}
else if(r == 0) {return 2;}
x += r; l -= r;
}
return 0;
}
#define MAX_LINE 128
int ut_dprintf(int fd, const char *restrict format, ...)
{
char line[MAX_LINE];
va_list ap;
va_start(ap, format);
int n = vsnprintf(line, MAX_LINE, format, ap);
va_end(ap);
if(n < 0 || n > MAX_LINE - 1) {return -1;}
if(readfill(fd, line, n)) {return -1;}
return n;
}
int ut_cursprintf(const char *restrict format, ...)
{
char line[MAX_LINE];
va_list ap;
va_start(ap, format);
int n = vsnprintf(line, MAX_LINE, format, ap);
va_end(ap);
if(n < 0 || n > MAX_LINE - 1) {return -1;}
if(ut_info(line)) {return -1;}
return n;
}
void ut_show(const struct ut_state *state, FILE *file, bool as_comment) {
#define tiles state->tiles
printf("Turn: %c\nPlay board: %d\n", (int)state->player, state->playBoard);
@ -286,29 +338,6 @@ void ut_show_boards(const struct ut_state *state) {
}
}
int info_line; // set this to 21 and reset it on erase TODO
void ut_info(const char *str)
{
mvaddstr(info_line, 0, str);
info_line++;
}
int readfill(int fd, char *x, size_t l)
{
while(l > 0)
{
int r = read(fd, x, l);
if(r < 0)
{
if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {continue;}
else {return 1;}
}
else if(r == 0) {return 2;}
x += r; l -= r;
}
return 0;
}
bool getpos(const struct ut_state *state, int *x, int *y) {
while (true) {
printf("Place token %c at position x,y: ", state->player);