more helper functions
このコミットが含まれているのは:
コミット
1bd60845b6
75
uttt.c
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);
|
||||
|
|
読み込み中…
新しいイシューから参照