-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathathr_canvas.c
73 lines (65 loc) · 1.5 KB
/
athr_canvas.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "athr_canvas.h"
#include "athr_max.h"
#include "athr_min.h"
#include "athr_terminal.h"
#include <stdatomic.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static atomic_bool use_stderr = false;
void athr_canvas_use_stderr(bool use) { atomic_store(&use_stderr, use); }
void athr_canvas_create(struct athr_canvas *x)
{
x->len = 0;
x->min_len = 0;
x->max_len = 0;
}
void athr_canvas_draw(struct athr_canvas const *x)
{
if (use_stderr)
{
fprintf(stderr, "%.*s", x->len, x->buff);
fflush(stderr);
}
else
{
fprintf(stdout, "%.*s", x->len, x->buff);
fflush(stdout);
}
}
bool athr_canvas_resize(struct athr_canvas *x)
{
unsigned ncols = athr_terminal_width() + 1;
unsigned prev_len = x->len;
x->len = ncols;
x->len = athr_min(x->len, x->max_len);
x->len = athr_max(x->len, x->min_len);
return prev_len != x->len;
}
void athr_canvas_setup(struct athr_canvas *x, unsigned min_len,
unsigned max_len)
{
x->min_len = min_len;
x->max_len = athr_min(max_len, ATHR_CANVAS_MAX_LEN);
}
void athr_canvas_clean(struct athr_canvas *x)
{
memset(x->buff, ' ', x->len - 1);
x->buff[x->len - 1] = '\r';
}
void athr_canvas_close(struct athr_canvas *x)
{
(void)x;
if (use_stderr)
{
fprintf(stderr, "\n");
fflush(stderr);
}
else
{
fprintf(stdout, "\n");
fflush(stdout);
}
}