70 if (
cieq(fname,
"temp") ||
cieq(fname,
"tmp")) {
75 (void)
plotit(wl, fname,
"xgraph");
106 char *fname, *devtype, *
s;
120 device[0] =
'l'; device[1] =
'p'; device[2] =
'\0';
134 devtype =
"postscript";
153 (*tempgraph->
redraw)(tempgraph);
230 char *hcopy, *devname;
233 struct pnode *n, *names;
235 struct dvlist *dl0, *dl, *tl, *dn, *lastv;
239 bool sameflag, gfound, pfound, oneval =
false;
243 parsewl(&wl,&sameflag,&gfound,&pfound);
246 fprintf(
cp_err,
"Error: no vectors given\n");
254 for (ww = wl; ww; ww = ww->
wl_next) {
258 sprintf(buf,
"-%s",ww->
wl_word);
279 for (n = names; n; n = n->
pn_next) {
291 for (dl = dl0; dl; dl = dn) {
297 fprintf(
cp_err,
"Error: misplaced vs arg\n");
305 for ( ; tl != dl; lastv = tl, tl = tl->
dl_next)
318 for (dl = dl0; dl; dl = dl->
dl_next) {
320 fprintf(
cp_err,
"Error: %s: no such vector\n",
327 if (devname && (
eq(devname,
"xgraph") ||
eq(devname,
"lpr"))) {
332 for (dl = dl0; dl; dl = dn) {
360 for (dl = dl0; dl; dl = dl->
dl_next) {
372 for (dl = dl0; dl; dl = dl->
dl_next) {
377 for (dl = dl0; dl; dl = dl->
dl_next) {
387 for (dl = dl0; dl; dl = dl->
dl_next) {
404 if (!sameflag && !pfound) {
406 for (dl = dl0; dl; dl = dl->
dl_next) {
420 for (dl = dl0; dl; dl = dl->
dl_next) {
425 "Error: plot must be either all pole-zero or contain no poles or zeros\n");
437 for (dl = dl0; dl; dl = dl->
dl_next) {
447 for (dl = dl0; dl; dl = dl->
dl_next) {
456 if (!
fixlimits(dl0,xlims,ylims,oneval)) {
483 for (dl = dl0, i = 0; dl; dl = dl->
dl_next, i++) ;
491 if (
eq(devname,
"xgraph")) {
497 if (
eq(devname,
"lpr")) {
513 graph =
gr_init(dl0,(
char*)&gr);
541 struct dvec *
d, *newv_scale;
555 newscale = (
double *)
tmalloc(newlen *
sizeof(
double));
567 for (i = 0, ttime = p->
pl_start; i < newlen;
571 for (dl = dl0; dl; dl = dl->
dl_next) {
573 newdata = (
double *)
tmalloc(newlen *
sizeof (
double));
577 newscale, newlen, 1)) {
579 "Error: can't interpolate %s\n", d->
v_name);
589 dl0->dl_dvec->v_scale = newv_scale;
608 #define NumGrTypes sizeof(gtypes)/sizeof(struct sPlotFlags) 615 #define NumPlTypes sizeof(ptypes)/sizeof(struct sPlotFlags) 638 (void)
getlims(&wwl,
"xlimit", 2);
640 (void)
getlims(&wwl,
"ylimit", 2);
642 (void) sprintf(buf,
"plot %s", s);
652 *sameflag =
getflag(pwl,
"samep");
657 dd =
getlims(pwl,
"xlimit", 2);
668 (void)
getlims(pwl,
"xlimit", 2);
674 dd =
getlims(pwl,
"ylimit", 2);
685 (void)
getlims(pwl,
"ylimit", 2);
689 dd =
getlims(pwl,
"xcompress", 1);
700 (void)
getlims(pwl,
"xcompress", 1);
701 (void)
getlims(pwl,
"xcomp", 1);
705 dd =
getlims(pwl,
"xindices", 2);
717 (void)
getlims(pwl,
"xindices", 2);
718 (void)
getlims(pwl,
"xind", 2);
722 dd =
getlims(pwl,
"xdelta", 1);
733 (void)
getlims(pwl,
"xdelta", 1);
734 (void)
getlims(pwl,
"xdel", 1);
737 dd =
getlims(pwl,
"ydelta", 1);
748 (void)
getlims(pwl,
"ydelta", 1);
749 (void)
getlims(pwl,
"ydel", 1);
759 "Warning: too many grid types given\n");
767 if (!*sameflag && !*gfound) {
770 if (
eq(buf, gtypes[i].
name)) {
775 if (i == NumGrTypes) {
776 fprintf(
cp_err,
"Warning: strange grid type %s\n", buf);
791 "Warning: too many plot types given\n");
799 if (!*sameflag && !*pfound) {
802 if (
eq(buf, ptypes[i].
name)) {
807 if (i == NumPlTypes) {
808 fprintf(
cp_err,
"Warning: strange plot type %s\n", buf);
834 if (!*sameflag || (!
grs.
title && s)) {
844 else if (
getflag(pwl,
"nointerp"))
853 double *xlims,*ylims;
856 double *dd,
tt, mx, my, rad;
880 for (dl = dl0; dl; dl = dl->
dl_next) {
896 if (ylims[0] > ylims[1]) {
901 if (dd[0] < ylims[0]) ylims[0] = dd[0];
902 if (dd[1] > ylims[1]) ylims[1] = dd[1];
909 for (dl = dl0; dl; dl = dl->
dl_next) {
912 if (ylims[0] > ylims[1]) {
917 if (dd[0] < ylims[0]) ylims[0] = dd[0];
918 if (dd[1] > ylims[1]) ylims[1] = dd[1];
923 for (dl = dl0; dl; dl = dl->
dl_next) {
953 for (dl = dl0; dl; dl = dl->
dl_next) {
969 if (xlims[0] > xlims[1]) {
974 if (dd[0] < xlims[0]) xlims[0] = dd[0];
975 if (dd[1] > xlims[1]) xlims[1] = dd[1];
982 for (dl = dl0; dl; dl = dl->
dl_next) {
985 if (xlims[0] > xlims[1]) {
990 if (dd[0] < xlims[0]) xlims[0] = dd[0];
991 if (dd[1] > xlims[1]) xlims[1] = dd[1];
994 for (dl = dl0; dl; dl = dl->
dl_next) {
1006 if ((xlims[0] == 0) && (xlims[1] == 0)) {
1010 if ((ylims[0] == 0) && (ylims[1] == 0)) {
1014 if (xlims[0] > xlims[1]) {
1016 xlims[1] = xlims[0];
1019 if (ylims[0] > ylims[1]) {
1021 ylims[1] = ylims[0];
1024 if (xlims[0] == xlims[1]) {
1025 xlims[0] *= (xlims[0] > 0) ? 0.9 : 1.1;
1026 xlims[1] *= (xlims[1] > 0) ? 1.1 : 0.9;
1028 if (ylims[0] == ylims[1]
1029 || fabs(ylims[0])/(ylims[1]-ylims[0]) > 1.0e9
1030 || fabs(ylims[1])/(ylims[1]-ylims[0]) > 1.0e9) {
1031 ylims[0] *= (ylims[0] > 0) ? 0.9 : 1.1;
1032 ylims[1] *= (ylims[1] > 0) ? 1.1 : 0.9;
1040 tt = xlims[1] - xlims[0];
1041 xlims[0] += tt * 0.001;
1042 xlims[1] -= tt * 0.001;
1046 tt = ylims[1] - ylims[0];
1047 ylims[0] += tt * 0.001;
1048 ylims[1] -= tt * 0.001;
1054 "Error: X values must be >= 0 for log scale\n");
1060 "Error: Y values must be >= 0 for log scale\n");
1067 mx = (fabs(xlims[0]) > fabs(xlims[1])) ? fabs(xlims[0]) :
1069 my = (fabs(ylims[0]) > fabs(ylims[1])) ? fabs(ylims[0]) :
1071 rad = (mx > my) ? mx : my;
1079 mx = (fabs(xlims[0]) > fabs(xlims[1])) ? fabs(xlims[0]) :
1081 my = (fabs(ylims[0]) > fabs(ylims[1])) ? fabs(ylims[0]) :
1083 rad = (mx > my) ? mx : my;
1116 for (beg = *wl; beg; beg = beg->
wl_next) {
1120 for (n = 0; n < number; n++) {
1150 fprintf(
cp_err,
"Error: bad %s parameters.\n", name);
1165 for (beg = *wl; beg; beg = beg->
wl_next) {
1168 fprintf(
cp_err,
"Syntax error.\n");
1196 for (beg = *wl; beg; beg = beg->
wl_next) {
1226 if (v->v_length == length)
1228 if (v->v_length > length) {
1229 v->v_length = length;
1234 v->v_realdata = (
double *)
tmalloc(length *
sizeof (
double));
1235 for (i = 0; i < v->v_length; i++)
1236 v->v_realdata[i] = od[i];
1239 v->v_realdata[i++] = d;
1245 for (i = 0; i < v->v_length; i++) {
1251 while (i < length) {
1257 v->v_length = length;
1270 double *xcomp, *xind;
1272 int cfac, ihi, ilo, newlen, i, j, blocks, bsize;
1276 if (d->v_numdims > 1) {
1277 bsize = d->v_dims[d->v_numdims-1];
1278 blocks = d->v_length/bsize;
1281 bsize = d->v_length;
1286 ilo = (int) xind[0];
1287 ihi = (int) xind[1];
1289 if ((ilo <= ihi) && (ilo > 0) && (ilo < bsize) &&
1290 (ihi > 1) && (ihi <= bsize)) {
1292 i = d->v_length - blocks*bsize;
1300 dd = (
double *)
tmalloc(newlen*blocks *
sizeof(
double));
1302 src = d->v_realdata + ilo;
1303 for (i = 0; i < blocks; i++) {
1304 DCOPY(src, dst, newlen);
1308 txfree((
char*)d->v_realdata);
1316 src = d->v_compdata + ilo;
1317 for (i = 0; i < blocks; i++) {
1318 CCOPY(src, dst, newlen);
1322 txfree((
char*)d->v_compdata);
1325 d->v_length = newlen*blocks;
1326 if (d->v_numdims <= 1) {
1328 d->v_dims[0] = newlen;
1331 d->v_dims[d->v_numdims-1] = newlen;
1337 cfac = (int) *xcomp;
1338 if ((cfac > 1) && (cfac < bsize)) {
1339 newlen = bsize/cfac;
1340 for (j = 0; j < blocks; j++) {
1341 for (i = 0; i < newlen; i++)
1343 d->v_realdata[i + j*newlen] =
1344 d->v_realdata[i*cfac + j*bsize];
1346 d->v_compdata[i + j*newlen] =
1347 d->v_compdata[i*cfac + j*bsize];
1349 d->v_length = blocks*newlen;
1350 if (d->v_numdims <= 1)
1351 d->v_dims[0] = d->v_length;
1353 d->v_dims[d->v_numdims-1] = d->v_length;
1361 #define XG_MAXVECTORS 64 1375 struct dvec *v, *scale;
1378 int i, numVecs, linewidth;
1379 bool xlog, ylog, nogrid, markers;
1384 for (dl = dl0, numVecs = 0; dl; dl = dl->
dl_next) {
1391 fprintf(
cp_err,
"Error: too many vectors for Xgraph.\n" );
1396 if (linewidth < 1) linewidth = 1;
1405 nogrid = xlog = ylog =
false;
1409 nogrid = ylog =
false;
1413 nogrid = xlog =
false;
1420 for (dl = dl0, numVecs = 0; dl; dl = dl->
dl_next)
1422 xlog = ylog =
false;
1425 fprintf(
cp_err,
"Error: grid type unsupported by Xgraph.\n" );
1430 if (!(file = fopen(gr->
hcopy,
"w"))) {
1437 fprintf( file,
"TitleText: %s\n", gr->
plotname );
1439 fprintf( file,
"XUnitText: %s\n", gr->
xlabel );
1441 fprintf( file,
"YUnitText: %s\n", gr->
ylabel );
1444 fprintf( file,
"Ticks: True\n" );
1447 fprintf( file,
"LogX: True\n" );
1449 fprintf( file,
"XLowLimit: % e\n", log10(gr->
xlims[0]) );
1450 fprintf( file,
"XHighLimit: % e\n", log10(gr->
xlims[1]) );
1455 fprintf( file,
"XLowLimit: % e\n", gr->
xlims[0] );
1456 fprintf( file,
"XHighLimit: % e\n", gr->
xlims[1] );
1460 fprintf( file,
"LogY: True\n" );
1462 fprintf( file,
"YLowLimit: % e\n", log10(gr->
ylims[0]) );
1463 fprintf( file,
"YHighLimit: % e\n", log10(gr->
ylims[1]) );
1468 fprintf( file,
"YLowLimit: % e\n", gr->
ylims[0] );
1469 fprintf( file,
"YHighLimit: % e\n", gr->
ylims[1] );
1472 fprintf( file,
"LineWidth: %d\n", linewidth );
1473 fprintf( file,
"BoundBox: True\n" );
1475 fprintf( file,
"BarGraph: True\n" );
1476 fprintf( file,
"NoLines: True\n" );
1480 fprintf( file,
"Markers: True\n" );
1483 fprintf( file,
"LargePixels: True\n" );
1485 fprintf( file,
"NoLines: True\n" );
1489 for (dl = dl0; dl; dl = dl->
dl_next) {
1493 fprintf( file,
"\"%s\"\n", v->
v_name );
1495 for ( i = 0; i < scale->
v_length; i++ ) {
1500 fprintf( file,
"% e % e\n", xval, yval );
1502 fprintf( file,
"\n" );
1504 (void) fclose( file );
1505 (void) sprintf( buf,
"xgraph %s &", gr->
hcopy );
static char buf[MAXPROMPT]
bool cp_getvar(char *n, int t, char *r)
void com_plot(wordlist *wl)
struct dvlist * ft_dvlist()
struct pnode * ft_getpnames()
void ft_xgraph(struct dvlist *dl0, char *grp)
void com_xgraph(wordlist *wl)
struct dvec * vec_mkfamily()
SMITH_tfm(double re, double im, double *x, double *y)
wordlist * outmenuprompt()
double * ft_SMITHminmax()
static struct grstuff grs
struct wordlist * wl_prev
void com_asciiplot(wordlist *wl)
while(TDesc->tSucc!=NULL)
void plot_extend(struct dvec *v, int length)
struct wordlist * wl_next
void ft_hardcopy(wordlist *wl, GRAPH *graph, bool copygraph, char *mesg, bool fileonly)
static struct sPlotFlags gtypes[]
static double * getlims()
static struct sPlotFlags ptypes[]
void com_hardcopy(wordlist *wl)