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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
#include "dbar.h"
void
dbardefaults(Dbar *dbar, int mode) {
dbar->bg = "darkgrey";
dbar->fg = "white";
dbar->label = NULL;
dbar->sym = '=';
dbar->val = 0;
dbar->minval = 0;
dbar->maxval = 100.0;
dbar->mode = mode ? graphical : textual;
dbar->style = norm;
dbar->width = mode ? 80 : 25;
dbar->height = 10;
dbar->segw = 6;
dbar->segh = 2;
dbar->segb = 0;
dbar->gs = 0;
dbar->gw = 1;
dbar->gc = 0;
dbar->pnl = 1;
memset(dbar->gb, '\0', MAX_GRAPH_VALS);
}
void
fdbar(Dbar *dbar, FILE *stream) {
int i, rp, p, t;
int segs, segsa;
double l, perc;
perc = (100 * (dbar->val - dbar->minval)) / (dbar->maxval - dbar->minval);
switch(dbar->style) {
case outlined:
l = perc * ((double)(dbar->width-2) / 100);
break;
case vertical:
l = perc * ((double)dbar->height / 100);
break;
case graph:
l = perc * ((double)dbar->height / 100);
break;
default:
l = perc * ((double)dbar->width / 100);
break;
}
l=(int)(l + 0.5) >= (int)l ? l+0.5 : l;
rp=(int)(perc + 0.5) >= (int)perc ? (int)(perc + 0.5) : (int)perc;
if(dbar->mode == textual) {
fprintf(stream, "%s%3d%% [", dbar->label ? dbar->label : "", rp);
for(i=0; i < (int)l; i++)
if(i == dbar->width) {
fputc('>', stream);
break;
} else
fputc(dbar->sym, stream);
for(; i < dbar->width; i++)
fputc(' ', stream);
fprintf(stream, "]%s", dbar->pnl ? "\n" : "");
} else {
switch(dbar->style) {
case outlined:
if(dbar->segb == 0) {
fprintf(stream, "%s^ib(1)^fg(%s)^ro(%dx%d)^p(%d)^fg(%s)^r(%dx%d)^p(%d)^ib(0)^fg()%s",
dbar->label ? dbar->label : "",
dbar->bg, (int)dbar->width, dbar->height, -1*(dbar->width-2),
dbar->fg, (int)l, dbar->height-4>0?dbar->height-4:1,
dbar->width-(int)l-1, dbar->pnl ? "\n" : "");
} else {
segs = dbar->width / (dbar->segw + dbar->segb);
segsa = rp * segs / 100;
fprintf(stream, "%s^ib(1)^fg(%s)^ro(%dx%d)^p(%d)",
dbar->label ? dbar->label : "",
dbar->bg, (int)dbar->width, dbar->height, -1*(dbar->width-2));
for(i=0; i < segs; i++) {
if(i<segsa)
fprintf(stream, "^fg(%s)^r(%dx%d+%d+%d')", dbar->fg, dbar->segw, dbar->height-4>0?dbar->height-4:1, i?dbar->segb:0, 0);
else
break;
}
printf("^fg()^ib(0)^p(%d)%s", dbar->width - i*(dbar->segw + dbar->segb), dbar->pnl ? "\n" : "");
}
break;
case vertical:
segs = dbar->height / (dbar->segh + dbar->segb);
segsa = rp * segs / 100;
fprintf(stream, "%s^ib(1)", dbar->label ? dbar->label : "");
if(dbar->segb == 0) {
//fprintf(stream, "^fg(%s)^r(%dx%d+%d-%d)^fg(%s)^p(-%d)^r(%dx%d+%d-%d)",
// dbar->bg, dbar->segw, dbar->height, 0, dbar->height+1,
// dbar->fg, dbar->segw, dbar->segw, (int)l, 0, (int)l+1);
fprintf(stream, "^fg(%s)^r(%dx%d)^fg(%s)^r(%dx%d-%d+%d)",
dbar->bg, dbar->segw, dbar->height,
dbar->fg,
dbar->segw, (int)l, dbar->segw, (int)((dbar->height-l)/2.0 + .5));
} else {
for(i=0; i < segs; i++) {
t = dbar->height/2-(dbar->segh+dbar->segb)*i;
//if(i<segsa)
fprintf(stream, "^fg(%s)^r(%dx%d-%d%c%d)",
i < segsa ? dbar->fg : dbar->bg, dbar->segw, dbar->segh,
i?dbar->segw:0, t > 0 ? '+' : '-', abs(t));
//fprintf(stream, "^fg(%s)^p(-%d)^r(%dx%d+%d-%d)",
// dbar->fg, i?dbar->segw:0, dbar->segw,
// dbar->segh, 0, (dbar->segh+dbar->segb)*(i+1));
//else
//fprintf(stream, "^fg(%s)^r(%dx%d-%d-%d)",
// dbar->bg, dbar->segw,
// dbar->segh,i?dbar->segw:0, (dbar->segh+dbar->segb)*i);
//fprintf(stream, "^fg(%s)^p(-%d)^r(%dx%d+%d-%d)",
// dbar->bg, i?dbar->segw:0, dbar->segw,
// dbar->segh, 0, (dbar->segh+dbar->segb)*(i+1));
}
}
fprintf(stream, "^ib(0)^fg()%s", dbar->pnl ? "\n" : "");
break;
case graph:
dbar->gc = dbar->gc < MAX_GRAPH_VALS &&
(dbar->gs == 0 ? dbar->gc : dbar->gc * dbar->gs + dbar->gc * dbar->gw)
< dbar->width ? ++dbar->gc : 0;
dbar->gb[dbar->gc] = l;
printf("%s", dbar->label ? dbar->label : "");
for(i=dbar->gc+1; i<MAX_GRAPH_VALS && (i*(dbar->gs+dbar->gw)) < dbar->width; ++i) {
p=100*dbar->gb[i]/dbar->height;
p=(int)p+0.5 >= (int)p ? (int)(p+0.5) : (int)p;
fprintf(stream, "^fg(%s)^p(%d)^r(%dx%d+0-%d)",
dbar->fg, dbar->gs, dbar->gw, (int)dbar->gb[i], (int)dbar->gb[i]+1);
}
for(i=0; i < dbar->gc; ++i) {
p=100*dbar->gb[i]/dbar->height;
p=(int)p+0.5 >= (int)p ? (int)(p+0.5) : (int)p;
fprintf(stream, "^fg(%s)^p(%d)^r(%dx%d+0-%d)",
dbar->fg, dbar->gs, dbar->gw, (int)dbar->gb[i], (int)dbar->gb[i]+1);
}
fprintf(stream, "^fg()%s", dbar->pnl ? "\n" : "");
break;
case pie:
fprintf(stream, "^ib(1)^fg(%s)^c(%d)^p(-%d)^fg(%s)^c(%d-%d)%s",
dbar->bg, dbar->width, dbar->width,
dbar->fg, dbar->width, (int)(rp*360/100),
dbar->pnl ? "\n" : "");
break;
default:
if(dbar->segb == 0)
//printf("%s%3d%% ^fg(%s)^r(%dx%d)^fg(%s)^r(%dx%d)^fg()%s",
printf("%s^fg(%s)^r(%dx%d)^fg(%s)^r(%dx%d)^fg()%s",
dbar->label ? dbar->label : "",
dbar->fg, (int)l, dbar->height,
dbar->bg, dbar->width-(int)l, dbar->height,
dbar->pnl ? "\n" : "");
else {
segs = dbar->width / (dbar->segw + dbar->segb);
segsa = rp * segs / 100;
//printf("%s%3d%% ", dbar->label ? dbar->label : "", rp);
printf("%s", dbar->label ? dbar->label : "");
for(i=0; i < segs; i++) {
if(i<segsa)
fprintf(stream, "^fg(%s)^r(%dx%d+%d+%d)",
dbar->fg, dbar->segw, dbar->height, i?dbar->segb:0, 0);
else
fprintf(stream, "^fg(%s)^r(%dx%d+%d+%d)",
dbar->bg, dbar->segw, dbar->height, i?dbar->segb:0, 0);
}
fprintf(stream, "^p(%d)^fg()%s", dbar->segb, dbar->pnl ? "\n" : "");
}
break;
}
}
fflush(stream);
}
|