33 bool nobreakp, novalue;
34 bool ylogscale =
false;
36 char *line1, *line2,
c, cb;
37 double xrange[2], yrange[2], x1, x2, yy1, y2, x, y;
38 double tenpowmag, diff, *
values;
43 int maxx, maxy, omaxy;
45 int mag, hmt, lmt, dst, spacing, nsp, ypt,
upper, lower, curline;
61 (void) sprintf(buf,
"%1.1e", 0.0);
62 shift = strlen(buf) - 7;
85 maxy -= (margin +
FUDGE);
87 xrange[0] = gr->
xlims[0];
88 xrange[1] = gr->
xlims[1];
89 yrange[0] = gr->
ylims[0];
90 yrange[1] = gr->
ylims[1];
94 "Error: asciiplot can't handle scale with length < 2\n");
99 fprintf(
cp_err,
"Note: no points to plot\n");
103 for (dl = dl0, i = 0; dl; dl = dl->
dl_next) {
107 field =
tmalloc((maxy + 1) * (maxx + 1));
111 values = (
double *)
tmalloc(maxx *
sizeof (
double));
116 for (i = 0, j = (maxx + 1) * (maxy + 1); i < j; i++)
118 for (i = 0, j = maxy + margin +
FUDGE; i < j; i++) {
122 line1[j] = line2[j] =
'\0';
125 if ((xrange[0] > xrange[1]) || (yrange[0] > yrange[1])) {
127 "ft_agraf: Internal Error: bad limits %lg, %lg, %lg, %lg\n",
128 xrange[0], xrange[1], yrange[0], yrange[1]);
133 if (gr->
ylims[1] == 0.0) {
135 tenpowmag = pow(10.0, (
double) mag);
137 else if (gr->
ylims[0] == 0.0) {
139 tenpowmag = pow(10.0, (
double) mag);
143 mag = (int) floor(
mylog10(diff));
144 tenpowmag = pow(10.0, (
double) mag);
147 lmt = (int) floor(gr->
ylims[0] / tenpowmag);
148 yrange[0] = gr->
ylims[0] = lmt * tenpowmag;
149 hmt = (int) ceil(gr->
ylims[1] / tenpowmag);
150 yrange[1] = gr->
ylims[1] = hmt * tenpowmag;
165 for (nsp = 4; nsp < 8; nsp++)
169 for (nsp = 2; nsp < 4; nsp++)
172 spacing = maxy / nsp;
176 maxy = spacing * nsp;
178 for (i = 0, j = lmt; j <= hmt; i += spacing, j += dst / nsp) {
179 for (k = 0; k < maxx; k++)
180 field[k * omaxy + i] =
LCHAR;
181 line1[i + margin + 2 * shift] =
'|';
182 (void) sprintf(buf,
"%.2e", j * pow(10.0, (
double) mag));
183 bcopy(buf, &line2[i + margin - ((j < 0) ? 2 : 1) - shift],
186 line1[i - spacing + margin + 1] =
'\0';
188 for (i = 1; i < omargin - 1 && xscale->
v_name[i - 1]; i++)
189 line2[i] = xscale->
v_name[i - 1];
191 for (i = omargin + 1;
203 for (i = 0; i < maxx; i++) {
207 else if (xlog && xrange[0] > 0.0 && xrange[1] > 0.0)
208 x = xrange[0] * pow( 10.0,
mylog10(xrange[1]/xrange[0])
211 x = xrange[0] + (xrange[1] - xrange[0]) * i /
215 (upper < xscale->v_length))
219 (lower < xscale->v_length - 1))
230 fprintf(
cp_err,
"Error: X scale (%s) not monotonic\n",
234 for (dl = dl0; dl; dl = dl->
dl_next) {
243 y = yy1 + (y2 - yy1) * (x - x1) / (x2 - x1);
244 if (!novalue && (dl == dl0))
247 c = field[omaxy * i + ypt];
248 if ((c ==
' ') || (c ==
LCHAR))
251 field[omaxy * i + ypt] =
MCHAR;
255 for (i = 0; i < omaxy + margin; i++)
258 i = (omaxy + margin - strlen(plot->
pl_title)) / 2;
262 buf[maxy + margin] =
'\0';
266 buf[maxy + margin] =
'\0';
267 i = (omaxy + margin - strlen(buf)) / 2;
275 j = (maxx + margin - 8) / 20;
278 for (dl = dl0; dl; dl = dl->
dl_next) {
281 if (!(++i % j) && v->
v_link2) {
287 for (i = 0; i < omaxy + margin; i++)
293 for (i = 0; i < maxx; i++) {
297 else if (xlog && xrange[0] > 0.0 && xrange[1] > 0.0)
298 x = xrange[0] * pow( 10.0,
mylog10(xrange[1]/xrange[0])
301 x = xrange[0] + (xrange[1] - xrange[0]) * i / (maxx - 1);
309 if (values[i] < 0.0) {
316 cb = field[(i + 1) * omaxy];
317 field[(i + 1) * omaxy] =
'\0';
319 field[(i + 1) * omaxy] = cb;
321 if (((curline++ % height) == 0) && (i < maxx - 1) &&
323 out_printf(
"%s\n%s\n\014\n%s\n%s\n", line1, line2,
static char buf[MAXPROMPT]
bool cp_getvar(char *n, int t, char *r)
char * kw_noasciiplotvalue
void bcopy(char *from, char *to, int num)