home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Photo CD Demo 1
/
Demo.bin
/
gle
/
gle
/
graph.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-29
|
26KB
|
990 lines
#define GRAPHDEF
#include "graph.h"
int freedataset(int i);
int free_temp(void);
int set_sizelength(void);
extern int trace_on;
extern int this_line;
static int xxgrid[5];
double koffsetx=0,koffsety=0,khei=0; /* key variables */
char kpos[30];
int knobox=0; /* end key vraibles */
char *letstr[20];
int nlet;
int draw_graph(void);
begin_graph(int *pln,long *pcode, int *cp)
{
static int ct,i,ncol,ntmp,np,*m,t,d;
static int iid1,iid2,d2,st;
double *px,*py,ox,oy;
static int xset,erflg,gosret;
FILE *fptr;
nlet = 0;
koffsetx=0; koffsety=0; khei=0; /* key variables */
kpos[0] = 0;
knobox=0; /* end key vraibles */
freeafont(); /* get some more memory, we might need it */
g_hscale = .7;
g_vscale = .7;
nlet = 0;
erflg = true;
for (i=1;i<5;i++) { xxgrid[i] = 0; vinit_axis(i);}
graph_init();
/* ! set up some more constants (defaults)*/
g_get_usersize(&g_xsize,&g_ysize);
set_sizelength();
dp[0] = myallocz(sizeof(*dp[1])); /* dataset for default settings */
dp[0]->lwidth = -1;
begin_init();
this_line -= 2;
for (;;) {
srclin[0] = 0;
st = begin_token(&pcode,cp,pln,srclin,(char *) tk,&ntk,outbuff);
if (trace_on) gprint("Graph | %s %d \n",srclin,st);
if (trace_on) {
for (i=1;i<=ntk;i++) gprint("{%s} ",tk[i]);
gprint("\n");
}
this_line++;
if (!st) {draw_graph(); return;}
ct = 1;
while (ct<=ntk) {
if (strcmp(tk[ct],"BAR")==0) goto do_bar;
if (strcmp(tk[ct],"DATA")==0) goto do_data;
kw("DATA") goto do_data;
kw("EXTRACT") goto do_extract;
kw("FILL") goto do_fill;
kw("HSCALE") goto do_hscale;
kw("LET") goto do_letsave;
kw("NOBOX") goto do_nobox;
kw("NOBORDER") goto do_nobox;
kw("SIZE") goto do_size;
kw("KEY") goto do_key;
kw("VSCALE") goto do_vscale;
kw("FULLSIZE") goto do_fullsize;
kw("TITLE") goto do_main_title;
kw("!") goto do_next_line;
xset = 0;
if (strstr(tk[ct],"AXIS")!=NULL) xset = 1;
else if (strstr(tk[ct],"LABELS")!=NULL) xset = 2;
else if (strstr(tk[ct],"SIDE")!=NULL) xset = 3;
else if (strstr(tk[ct],"SUBTICKS")!=NULL) xset = 5;
else if (strstr(tk[ct],"TICKS")!=NULL) xset = 4;
if (xset>0) goto do_axisset;
if (strstr(tk[ct],"NAMES")!=NULL) goto do_names;
if (strstr(tk[ct],"PLACES")!=NULL) goto do_places;
if (strstr(tk[ct],"TITLE")!=NULL) goto do_title;
if (*tk[ct]=='D') goto do_datasets;
gprint("Unrecognised graph sub command {%s} %d \n ",tk[ct],ct);
goto do_next_line;
do_next_token:;
}
do_next_line:
erflg = true;
if (!begin_next_line(pcode,cp)) {draw_graph(); return;}
}
/* ----------------------------------------------------------------*/
/* this disgusting piece of code is due to no gosub/return */
/* (a few months later)... and my own ignorance of C */
do_axisset:
t = axis_type(tk[1]);
erflg = true;
gosret = 1;
switch (xset) {
case 1:
gosret = 2;
goto do_axis;
doax2:
erflg = false;
goto do_labels;
doax3:
goto do_side;
doax4:
goto do_ticks;
case 2:
goto do_labels;
case 3:
goto do_side;
case 4:
goto do_ticks;
case 5:
goto do_subticks;
}
end_axisset:
if (t>2) goto do_next_line;
erflg = false;
t = t + 2;
erflg = false;
gosret = 0;
switch (xset) {
case 1:
gosret = 3;
goto do_axis;
doax5: goto do_labels;
doax6: goto do_side;
doax7: goto do_ticks;
case 2:
goto do_labels;
case 3:
goto do_side;
case 4:
goto do_ticks;
case 5:
goto do_subticks;
}
goto do_next_line;
/* ----------------------------------------------------------------*/
do_bar:
/* bar d1,d2,d3 from d4,d5,d6 color red,green,blue fill grey,blue,green
dist exp, width exp, LSTYLE 3,445,1
3dbar .5 .5 top black,black,black side red,green,blue notop */
{
int ng,fi,di;
char *ss;
g_nbar++;
br[g_nbar] = myallocz(sizeof(*br[1]));
br[g_nbar]->ngrp = 0;
ct = 2;
ss = strtok(tk[ct],",");
while (ss!=NULL) {
if (*ss=='D') {
ng = (br[g_nbar]->ngrp)++;
d = atoi(ss+1);
if (d==0 || d>99) gprint("Error in bar command {%s} token number %d \n",tk[ct],ct);
br[g_nbar]->to[ng] = d;
}
ss = strtok(0,",");
}
for (i=1;i<=ng;i++) {
br[g_nbar]->color[i] = g_get_grey(0.0);
br[g_nbar]->fill[i] = g_get_grey(1.0-ng/(i));
br[g_nbar]->from[i] = 0;
g_get_line_width(&br[g_nbar]->lwidth[i]);
strcpy(br[g_nbar]->lstyle[i] ,"1\0");
}
ct++;
while (ct<=ntk) {
kw("DIST") br[g_nbar]->dist = next_exp;
else kw("WIDTH") br[g_nbar]->width = next_exp;
else kw("3D") {
br[g_nbar]->x3d = next_exp;
br[g_nbar]->y3d = next_exp;
}
else kw("NOTOP") br[g_nbar]->notop = true;
else kw("LSTYLE") next_str((char *) br[g_nbar]->lstyle);
else kw("FROM") {
fi = 0;
ct +=1;
ss = strtok(tk[ct],",");
while (ss!=NULL) {
if (*ss=='D') {
di = atoi(ss+1);
br[g_nbar]->from[fi++] = di;
}
ss = strtok(0,",");
}
}
else kw("COLOR") {
fi = 0;ct += 1;
ss = strtok(tk[ct],",");
while (ss!=NULL) {
br[g_nbar]->color[fi++] = pass_color(ss);
ss = strtok(0,",");
}
}
else kw("SIDE") {
fi = 0;ct += 1;
ss = strtok(tk[ct],",");
while (ss!=NULL) {
br[g_nbar]->side[fi++] = pass_color(ss);
ss = strtok(0,",");
}
}
else kw("TOP") {
fi = 0;ct += 1;
ss = strtok(tk[ct],",");
while (ss!=NULL) {
br[g_nbar]->top[fi++] = pass_color(ss);
ss = strtok(0,",");
}
}
else kw("FILL") {
fi = 0; ct++;
ss = strtok(tk[ct],",");
while (ss!=NULL) {
br[g_nbar]->fill[fi++] = pass_color(ss);
ss = strtok(0,",");
}
}
else gprint("Unrecognised GRAPH BAR sub command {%s} %d \n "
,tk[ct],ct);
ct++;
}
}
goto do_next_line;
/*----------------------------------------------------------------*/
/* fill x1,d2 color green xmin 1 xmax 2 ymin 1 ymax 2 */
/* fill d1,x2 color green xmin 1 xmax 2 ymin 1 ymax 2 */
/* fill d1,d2 color green xmin 1 xmax 2 ymin 1 ymax 2 */
/* fill d1 color green xmin 1 xmax 2 ymin 1 ymax 2 */
do_fill:
{
char *ss,s1[40],s2[40];
fd[++nfd] = myallocz(sizeof(*fd[1]));
ct = 2;
strcpy(s1,strtok(tk[ct],","));
ss = strtok(0,",");
if (ss==NULL) strcpy(s2,""); else {
strcpy(s2,ss);
strtok(0,",");
}
if (strcmp(s1,"X1")==0) {
fd[nfd]->type = 1;
d = atoi(s2+1);
if (d==0) { gprint("Not a valid fill option {%s} wanted FILL X1,D1 \n",tk[ct]); goto end_fill_read; }
fd[nfd]->da = d;
} else if (strcmp(s2,"X2")==0) {
fd[nfd]->type = 2;
d = atoi(s1+1);
if (d==0) { gprint("Not a valid fill option {%s} wanted FILL D2,X2 \n",tk[ct]); goto end_fill_read; }
fd[nfd]->da = d;
} else if (strcmp(s2,"")!=0) {
fd[nfd]->type = 3;
d = atoi(s1+1);
d2 = atoi(s2+1);
if (d==0 || d2==0) { gprint("Expecting FILL D1,D2 found {%s}\n",tk[ct]); goto end_fill_read; }
fd[nfd]->da = d;
fd[nfd]->db = d2;
} else if (*s1=='D') {
fd[nfd]->type = 4;
d = atoi(s1+1);
if (d==0) { gprint("Expecting FILL d1 found {%s} \n",tk[ct]); goto end_fill_read; }
fd[nfd]->da = d;
} else {
gprint("Invalid fill option, wanted d1,d2 or x1,d1 or d1,x2 or d1 \n");
goto end_fill_read;
}
ct++;
fd[nfd]->color = g_get_grey(1.0-nfd*.1);
fd[nfd]->xmin = -LARGE_NUM;
fd[nfd]->xmax = LARGE_NUM;
fd[nfd]->ymin = -LARGE_NUM;
fd[nfd]->ymax = LARGE_NUM;
while (ct<=ntk) {
kw("COLOR") {ct++; fd[nfd]->color = pass_color(tk[ct]);}
else kw("XMIN") fd[nfd]->xmin = next_exp;
else kw("XMAX") fd[nfd]->xmax = next_exp;
else kw("YMIN") fd[nfd]->ymin = next_exp;
else kw("YMAX") fd[nfd]->ymax = next_exp;
else gprint("Unrecognised GRAPH FILL sub command {%s} %d (Note: CGLE syntax change\n Expected COLOR,XMIN,XMAX,YMIN,YMAX \n "
,tk[ct],ct);
ct++;
}
}
end_fill_read:;
goto do_next_line;
/*----------------------------------------------------------------*/
do_key:
ct = 2;
while (ct<=ntk) {
kw("POS") next_str(kpos);
else kw("POSITION") next_str(kpos);
else kw("HEI") khei = next_exp;
else kw("NOBOX") knobox = true;
else kw("OFFSET") {koffsetx = next_exp;koffsety = next_exp;}
else gprint("Unrecognised GRAPH KEY sub command {%s} %d \nExpected KEY POS BL,TL,BR,TR HEI .6 NOBOX OFFSET 2 3 \n"
,tk[ct],ct);
ct++;
}
goto do_next_line;
/*----------------------------------------------------------------*/
/* data a.dat */
/* data a.dat d2 d5 */
/* data a.dat d1=c1,c3 d2=c5,c1 */
do_data:
{
static char data_d[60],data_x[60],data_y[60];
int nm=0,expect_col=0,extract=0,xi,yi,dn,j,nncol=0,allind;
char *s1,buff1[30];
char infile[80];
ntmp = 0;
allind = 0;
for (i=1;i<59;i++) { /* default mapping if no dataset names given */
data_d[i] = freedataset(i);
data_x[i] = 1;
data_y[i] = i+1;
}
while (ct<=ntk) { if (strstr(tk[ct],"=")!=NULL) extract = true; ct++; }
ct = 3;
if (extract==true) {
while (ct<=ntk) {
if (*tk[ct]=='D') {
nm++;
strncpy(buff1,tk[ct],29);
s1 = strtok(buff1,"=");
if (s1!=NULL) data_d[nm] = atoi(s1+1);
if (s1==NULL || data_d[nm]==0) gprint("Expecting Dn=Ca,Cb (no spaces) {%s}\n",tk[ct]);
s1 = strtok(NULL,",");
if (s1!=NULL) data_x[nm] = atoi(s1+1);
s1 = strtok(NULL,",");
if (*s1=='*') {
allind = data_d[nm];
} else {
if (s1!=NULL) data_y[nm] = atoi(s1+1);
if (s1==NULL || data_x[nm]==0 || data_y[nm]==0) {
gprint("Expecting Dn=Ca,Cb (no spaces) {%s}\n",tk[ct]);
goto do_next_line;
}
if (data_x[nm]>expect_col) expect_col = data_x[nm];
if (data_y[nm]>expect_col) expect_col = data_y[nm];
}
} else {
if (*tk[ct] != 0) gprint("Expecting Dn=Ca,Cb (no spaces) {%s}\n",tk[ct]);
}
ct++;
}
} else {
while (ct<=ntk) {
if (*tk[ct]==' ') ct++;
if (*tk[ct]=='D') {
nm++;
data_d[nm] = atoi(tk[ct]+1);
data_x[nm] = 1;
data_y[nm] = nm+1;
} else gprint("Warning, found {%s}, expecting data a.dat d1 d2 d3 \n",tk[ct]);
ct++;
}
}
if (expect_col==0 && nm>0) expect_col = nm+1;
if (allind>0) expect_col = 0;
/*
dbg for (i=1;i<5;i++) {
gprint("MAPPING %d = %d %d %d\n",i,data_d[i],data_x[i],data_y[i] );
}
*/
ct = 2;
strcpy(infile,tk[2]);
if (strchr(infile,'$')!=NULL) {
{ int idx,typ;
var_find(infile,&idx,&typ) ;
if (idx>=0) var_getstr(idx,infile);
}}
strlwr(infile);
fptr = fopen(infile,"r");
if (fptr==NULL) {
gprint("Unable to open data file {%s} \n",infile);
perror("Reason");
goto do_next_line;
}
for (;!(feof(fptr));) {
/* if (*tk[ct]==' ') ct++; */
inbuff[0]=0;
fgets(inbuff,200,fptr);
if (inbuff[0]=='"') continue;
alloc_temp(ntmp);
if (tmpf == NULL) {
gprint("Too many points in {%s}, reduce points, split file or use VAX CGLE \n",infile);
break;
}
token_data(inbuff,tk,&ntk,tkbuff);
ncol = 0;
for (i=1;i<=ntk;i++) {
ncol++;
if (strcmp(tk[i],"*")==0) {
tmpmiss[++ntmp] = true;
}
else if (strcmp(tk[i],"-")==0) {
tmpmiss[++ntmp] = true;
}
else if (strcmp(tk[i],".")==0) {
tmpmiss[++ntmp] = true;
}
else {
tmpf[++ntmp] = atof(tk[i]);
tmpmiss[ntmp] = false;
}
}
if (nncol == 0) nncol = ncol;
if (ncol != nncol) if (ncol>0) {
if (allind==0) gprint("MUST FIX *** Inconsistent columns in {%s} %d %d \n",infile,ncol,nncol);
}
if (nm==0 && ncol>1) nm = ncol-1;
}
fclose(fptr);
if (expect_col>0) if (expect_col>nncol) {
gprint("Warning, expecting %d columns in data file {%s} found %d \n"
,expect_col,infile,ncol);
}
if (nncol>0) np = ntmp/nncol;
if (allind>0) { /* if data file contains y values only, y1, y2 ,y3...*/
dn = allind;
np = ntmp;
if (dn>ndata) ndata = dn;
if (dp[dn]==NULL) {
dp[dn] = myallocz(sizeof(*dp[dn]));
copy_default(dn);
}
np++;
dp[dn]->xv = myallocz(sizeof(*px)*np);
dp[dn]->yv = myallocz(sizeof(*px)*np);
dp[dn]->miss = myallocz(sizeof(*m)*np);
np--;
px = dp[dn]->xv;
py = dp[dn]->yv;
m = dp[dn]->miss;
for (i=1;i<=np;i++) {
*(px++) = i;
*(py++) = tmpf[i];
*(m++) = tmpmiss[i];
setrange(*(px-1),*(py-1),*(m-1));
}
dp[dn]->np = np;
goto do_next_line;
}
for (j=1;j<=nm;j++) {
dn = data_d[j];
xi = data_x[j];
yi = data_y[j];
if (dn>ndata) ndata = dn;
if (dp[dn]==NULL) {
dp[dn] = myallocz(sizeof(*dp[dn]));
if (dp[dn]==NULL) gprint("Memory allocation error, graph dataset \n");
copy_default(dn);
}
np++;
dp[dn]->xv = myallocz(sizeof(*px)*np);
dp[dn]->yv = myallocz(sizeof(*px)*np);
dp[dn]->miss = myallocz(sizeof(*m)*np);
np--;
px = dp[dn]->xv;
py = dp[dn]->yv;
m = dp[dn]->miss;
for (i=1;i<=np;i++) {
*(px++) = tmpf[i*nncol-nncol+xi];
*(py++) = tmpf[i*nncol-nncol+yi];
*(m++) = (tmpmiss[i*nncol-nncol+xi]==true)
|| (tmpmiss[i*nncol-nncol+yi]==true);
setrange(*(px-1),*(py-1),*(m-1));
dbg gprint("(xym %f %f %d \n",*(px-1),*(py-1),*(m-1));
}
dp[dn]->np = np;
}
}
goto do_next_line;
/*----------------------------------------------------------------*/
do_extract:
goto do_next_line;
/*----------------------------------------------------------------*/
do_hscale:
g_hscale = next_exp;
goto do_next_line;
/*----------------------------------------------------------------*/
do_letsave:
letstr[++nlet] = myalloc(strlen(srclin)+1);
strcpy(letstr[nlet],srclin);
goto do_next_line;
/*----------------------------------------------------------------*/
do_nobox:
g_nobox = true;
goto do_next_line;
/*----------------------------------------------------------------*/
do_size:
g_xsize = next_exp;
g_ysize = next_exp;
/* ! set up some more constants */
set_sizelength();
goto do_next_line;
/*----------------------------------------------------------------*/
do_vscale:
g_vscale = next_exp;
goto do_next_line;
/*----------------------------------------------------------------*/
do_fullsize:
g_vscale = 1;
g_hscale = 1;
g_nobox = true;
goto do_next_line;
/*----------------------------------------------------------------*/
do_axis:
ct = 2;
/* t = axis_type(tk[1]); */
while (ct<=ntk) {
kw("BASE") xx[t].base = next_exp;
else kw("COLOR") xx[t].color = next_exp;
else kw("DSUBTICKS") xx[t].dsubticks = next_exp;
else kw("DTICKS") xx[t].dticks = next_exp;
else kw("DPOINTS") xx[t].decimal = next_exp;
else kw("SHIFT") xx[t].shift = next_exp;
else kw("GRID") xxgrid[t] = true;
else kw("FONT") xx[t].label_font = next_font;
else kw("LOG") xx[t].log = true;
else kw("LSTYLE") next_str(xx[t].side_lstyle);
else kw("LWIDTH") xx[t].side_lwidth = next_exp;
else kw("MIN") {
xx[t].min = next_exp;
xx[t].minset = true;
}
else kw("MAX") {
xx[t].max = next_exp;
xx[t].maxset = true;
}
else kw("HEI") xx[t].label_hei = next_exp;
else kw("NOLAST") xx[t].nolast = true;
else kw("LAST") xx[t].nolast = false;
else kw("FIRST") xx[t].nofirst = false;
else kw("NOFIRST") xx[t].nofirst = true;
else kw("NSUBTICKS") xx[t].nsubticks = next_exp;
else kw("NTICKS") xx[t].nticks = next_exp;
else kw("ON") xx[t].off = false;
else kw("OFF") xx[t].off = true;
else gprint("Unrecognised GRAPH %%AXIS sub command {%s} %d\n",tk[ct],ct);
ct++;
}
if (gosret==2) goto doax2; /* in axis */
if (gosret==3) goto doax5; /* in axis */
if (gosret==1) goto end_axisset; /* in axis,label,side,tick,subtick */
goto do_next_line;
/*----------------------------------------------------------------*/
do_names:
t = axis_type(tk[1]);
ct = 1;
while (ct<ntk) {
next_quote(strbuf);
i = ++xx[t].nnam;
xx[t].names[i] = myallocz(strlen(strbuf)+1);
strcpy(xx[t].names[i],strbuf);
}
goto do_next_line;
/*----------------------------------------------------------------*/
do_places: /* x2places, or xplaces, or yplaces or y2places */
t = axis_type(tk[1]);
ct = 1;
while (ct<ntk) {
xx[t].places[++xx[t].nplaces] = next_exp;
}
goto do_next_line;
/*----------------------------------------------------------------*/
do_main_title:
/* should change position and size of main title */
t = 3;
xx[t].title = myallocz(40);
ct = 1;
next_vquote(xx[t].title);
ct = 3;
xx[t].title_dist = g_fontsz*.7;
xx[t].title_hei = g_fontsz*1.5;
while (ct<=ntk) {
kw("HEI") xx[t].title_hei = next_exp;
else kw("OFF") xx[t].title_off = true;
else kw("COLOR") xx[t].title_color = next_color;
else kw("FONT") xx[t].title_font = next_font;
else kw("DIST") xx[t].title_dist = next_exp;
else gprint("Expecting TITLE sub command, found {%s} pos %d\n",tk[ct],ct);
ct++;
}
goto do_next_line;
/*----------------------------------------------------------------*/
do_title:
t = axis_type(tk[1]);
ct = 1;
next_vquote(xx[t].title);
ct = 3;
while (ct<=ntk) {
kw("HEI") xx[t].title_hei = next_exp;
else kw("OFF") xx[t].title_off = true;
else kw("ROT") xx[t].title_rot = true;
else kw("ROTATE") xx[t].title_rot = true;
else kw("COLOR") xx[t].title_color = next_color;
else kw("FONT") xx[t].title_font = next_font;
else kw("DIST") xx[t].title_dist = next_exp;
else gprint("Expecting axis TITLE sub command, found {%s} pos %d\n",tk[ct],ct);
ct++;
}
goto do_next_line;
/*----------------------------------------------------------------*/
do_labels:
ct = 2;
/* t = axis_type(tk[1]); */
while (ct<=ntk) {
if (*tk[ct]==' ') ct++;
kw("HEI") xx[t].label_hei = next_exp;
else kw("OFF") xx[t].label_off = true;
else kw("ON") xx[t].label_off = false;
else kw("COLOR") xx[t].label_color = next_color;
else kw("FONT") xx[t].label_font = next_font;
else kw("DIST") xx[t].label_dist = next_exp;
else ifer gprint("Expecting LABELS sub command, found {%s} pos %d \n",tk[ct],ct);
ct++;
}
if (gosret==2) goto doax3; /* in label */
if (gosret==3) goto doax6; /* in label */
if (gosret==1) goto end_axisset; /* in axis,label,side,tick,subtick */
goto do_next_line;
/*----------------------------------------------------------------*/
do_side:
ct = 2;
/* t = axis_type(tk[1]); */
while (ct<=ntk) {
if (*tk[ct]==' ') ct++;
kw("OFF") xx[t].side_off = true;
else kw("ON") xx[t].side_off = false;
else kw("COLOR") xx[t].side_color = next_color;
else kw("LWIDTH") xx[t].side_lwidth = next_exp;
else kw("LSTYLE") next_str(xx[t].side_lstyle);
else ifer gprint("Expecting SIDE sub command, found {%s} pos %d \n",tk[ct],ct);
ct++;
}
if (gosret==2) goto doax4; /* in side */
if (gosret==3) goto doax7; /* in side */
if (gosret==1) goto end_axisset; /* in axis,label,side,tick,subtick */
goto do_next_line;
/*----------------------------------------------------------------*/
do_ticks:
ct = 2;
/* t = axis_type(tk[1]); */
while (ct<=ntk) {
if (*tk[ct]==' ') ct++;
kw("LENGTH") xx[t].ticks_length = next_exp;
else kw("OFF") {xx[t].ticks_off = true;
xx[t].subticks_off = true;}
else kw("ON") {xx[t].ticks_off = false;
xx[t].subticks_off = false;}
else kw("COLOR") {xx[t].ticks_color = next_color;
xx[t].subticks_color = xx[t].ticks_color;}
else kw("LWIDTH") xx[t].ticks_lwidth = next_exp;
else kw("LSTYLE") next_str(xx[t].ticks_lstyle);
else ifer gprint("Expecting TICKS sub command, found {%s} pos %d \n",tk[ct],ct);
ct++;
}
if (gosret==1 || gosret==2) goto end_axisset; /* in axis,label,side,tick,subtick */
goto do_next_line;
/*----------------------------------------------------------------*/
do_subticks:
ct = 2;
/* t = axis_type(tk[1]); */
while (ct<=ntk) {
if (*tk[ct]==' ') ct++;
kw("LENGTH") xx[t].subticks_length = next_exp;
else kw("OFF") xx[t].subticks_off = true;
else kw("ON") xx[t].subticks_off = false;
else kw("COLOR") xx[t].subticks_color = next_color;
else kw("LWIDTH") xx[t].subticks_lwidth = next_exp;
else kw("LSTYLE") next_str(xx[t].subticks_lstyle);
else ifer gprint("Expecting SUBTICKS sub command, found {%s} pos %d \n",tk[ct],ct);
ct++;
}
if (gosret==1 || gosret==2) goto end_axisset; /* in axis,label,side,tick,subtick */
goto do_next_line;
/* ----------------------------------------------------------------*/
do_datasets:
d = atoi(tk[1]+1); /* dataset number (right$(k$,2)) (0=dn) */
iid1 = d;
iid2 = d;
if (d==0) iid2 = 100;
if (d!=0) if (dp[d]==NULL) {
dp[d] = myallocz(sizeof(*dp[ndata]));
if (dp[d]==NULL) gprint("Memory allocation error, graph dataset \n");
copy_default(d);
if (ndata<d) ndata=d;
}
for (d=iid1;d<=iid2;d++) {
if (dp[d]!=NULL) do_dataset(d);
iid1=iid1;
}
goto do_next_line;
/*------------------------------------------------------------------*/
/****** Mmmmm !! *****/
/*------------------------------------------------------------------*/
}
int zzzz(char *s);
zzzz(char *s)
{
/* double zz;
/*
/* g_get_line_width(&zz);
*/
dbg gprint("graph module %s done line %d \n",s,done_line);
}
draw_graph()
{
int i,freedata=false;
double ox,oy;
done_line = false;
/* ! Ok we've decoded the commands. now draw the thing. */
if (g_xsize*g_ysize==0) {
g_xsize = 10; g_ysize = 10;
g_get_usersize(&g_xsize,&g_ysize);
}
zzzz("begin");
/* do LETS now */
for (i=1;i<=nlet;i++) {
do_let(letstr[i]);
}
preview_big();
/* do_smooth(); dealt with by draw_line() */
window_set();
/* gosub scale_data scale if xmin, ymin xmax ymax for each dataset.*/
g_get_xy(&ox,&oy); /* get the origin x,y */
g_gsave();
g_get_hei(&g_fontsz);
set_sizelength();
zzzz("step1 ");
for (i=1;i<=2;i++) {
if (xxgrid[i]) {
if (i == 1) {
xx[i].ticks_length = ylength;
xx[i+2].ticks_length = 0.0000001;
xx[i].subticks_off = true;
xx[i+2].subticks_off = true;
xx[i].subticks_length = ylength;
xx[i+2].subticks_length = 0.0000001;
}
if (i==2) {
xx[i].ticks_length = xlength;
xx[i+2].ticks_length = 0.0000001;
xx[i].subticks_length = xlength;
xx[i].subticks_off = true;
xx[i+2].subticks_off = true;
xx[i+2].subticks_length = 0.0000001;
}
}
}
if (xlength<ylength) g_fontsz = xlength/23;
g_set_hei(g_fontsz);
/* draw the box */
if (!g_nobox) {
g_line(ox+g_xsize,oy);
g_line(ox+g_xsize,oy+g_ysize);
g_line(ox,oy+g_ysize);
g_line(ox,oy);
}
/* set graph globals */
graph_x1 = xbl;
graph_y1 = ybl;
graph_x2 = xbl + xlength;
graph_y2 = ybl + ylength;
graph_xmin = wxmin;
graph_xmax = wxmax;
graph_ymin = wymin;
graph_ymax = wymax;
/* Throw away missing values if NOMISS on datasets */
gr_thrownomiss();
/* Lets do any filling now. */
draw_fills();
g_move(ox,oy); /* move back to the origin x,y */
/* draw the bars */
zzzz("step2 ");
draw_bars();
zzzz("step3 ");
g_move(ox,oy); /* move back to the origin x,y */
/* Draw SHADE (psuedo contours) , shade patterns */
/* Draw the lines and markers */
draw_lines();
zzzz("step4 ");
g_move(ox,oy); /* move back to the origin x,y */
/* Draw the error bars */
draw_err();
g_move(ox,oy); /* move back to the origin x,y */
zzzz("step5 ");
/* Draw markers, */
/* (after lines so symbol blanking [white markers] will work) */
draw_markers();
if (abort_key()) goto graph_abort;
g_move(ox,oy); /* move back to the origin x,y */
zzzz("step56");
if (!done_line) {
g_hint("You must specify in a DN command wether to draw LINES, or MARKERS");
g_hint("e.g. D3 LINE or D2 MARKER TRIANGLE");
}
graph_freedata(); freedata = true;
/* Draw axises */
{
double h;
h = g_fontsz;
for (i=1;i<=4;i++) if (xx[i].base==0) xx[i].base= h;
xx[1].length = xlength;
xx[2].length = ylength;
xx[3].length = xlength;
xx[4].length = ylength;
}
xx[3].type = 3;
xx[4].type = 4;
g_move(ox,oy); /* move back to the origin x,y */
g_move(xbl,ybl);
draw_axis(&xx[1]);
if (abort_key()) goto graph_abort;
g_move(xbl,ybl);
draw_axis(&xx[2]);
if (abort_key()) goto graph_abort;
g_move(xbl,ybl+ylength);
draw_axis(&xx[3]);
if (abort_key()) goto graph_abort;
g_move(xbl+xlength,ybl);
draw_axis(&xx[4]);
if (abort_key()) goto graph_abort;
if (*kpos==0) strcpy(kpos,"TR");
if (khei==0) khei = g_fontsz;
g_move(ox,oy);
gdraw_key(koffsetx,koffsety,kpos,khei,knobox);
graph_abort:
if (freedata==false) graph_freedata();
g_move(ox,oy);
graph_free(); /* free memory, and initialize counters for next graph */
g_grestore();
return;
}
graph_init(void) /* Init all counters for next graph */
{
range_x1 = range_y1 = 1e30; range_x2 = range_y2 = -1e30;
ndata = 0;
nfd = 0;
g_nbar = 0;
}
graph_freedata(void)
{
int i,j;
for (i=1;i<=g_nbar;i++) { myfree(br[i]); br[i] = 0; }
for (i=1;i<=nfd;i++) {myfree(fd[i]); fd[i] = 0; }
for (i=0;i<=ndata;i++) {
if (dp[i]!=NULL) {
iffree(dp[i]->xv,"b");
iffree(dp[i]->yv,"c");
iffree(dp[i]->miss,"d");
dp[i]->xv = 0;
dp[i]->yv = 0;
dp[i]->miss = 0;
}
}
free_temp();
}
graph_free(void) /* free memory, */
{
int i,j;
for (i=0;i<=ndata;i++) {
if (dp[i]!=NULL) {
iffree(dp[i]->key_name,"a");
iffree(dp[i]->bigfile,"a");
iffree(dp[i]->xv,"b");
iffree(dp[i]->yv,"c");
iffree(dp[i]->miss,"d");
myfrees(dp[i],"dp");
}
dp[i] = 0;
}
for (i=1;i<=4;i++) {
iffree(xx[i].title,"t");
for (j=0;j<=xx[i].nnam;j++) {
iffree(xx[i].names[j],"q");
xx[i].names[j] = NULL;
}
}
}
iffree(void *p, char *s)
{
if (p!=NULL) myfrees(p,s);
}
set_sizelength()
{
/* ! set up some more constants */
double ox,oy;
g_get_xy(&ox,&oy); /* get the origin x,y */
if (g_hscale==0) g_hscale = .7;
if (g_vscale==0) g_vscale = .7;
xbl = ox + (g_xsize/2)-(g_xsize*g_hscale/2);
ybl = oy + (g_ysize/2)-(g_ysize*g_vscale/2);
xlength = g_xsize*g_hscale;
ylength = g_ysize*g_vscale;
g_fontsz = ylength/23;
}
freedataset(int d)
{
int i,c=0;
for (i=1;i<=ndata;i++) {
if (dp[i] == NULL) c++;
else if (dp[i]->xv == NULL) c++;
if (c==d) return i;
}
return ndata + d - c;
}
alloc_temp(int ntmp)
{
double *a;
int *b;
if (ntmp < (ntmp_alloc-20)) return;
ntmp_alloc = 50 + 2 * ntmp;
a = myallocn(ntmp_alloc,sizeof(double));
b = myallocn(ntmp_alloc,sizeof(int));
/* if (a==0 || b==0) {
gprint("Unable to allocate memory for dataset \n");
gle_abort("No memory for dataset\n");
}
*/
if (tmpf != NULL) {
memcpy(a,tmpf,(2+ntmp)*sizeof(double));
memcpy(b,tmpmiss,(2+ntmp)*sizeof(int));
myfrees(tmpf,"tmpfree"); myfree(tmpmiss);
}
tmpf = a; tmpmiss = b;
}
free_temp()
{
if (tmpf==NULL) return;
myfrees(tmpf,"tmpfree2"); myfree(tmpmiss);
tmpf = 0; tmpmiss = 0;
ntmp_alloc = 0;
}
copy_default(int dn)
{
memcpy(dp[dn],dp[0],sizeof(*dp[0]));
dp[dn]->key_name = NULL;
dp[dn]->bigfile = NULL;
dp[dn]->xv = NULL;
dp[dn]->yv = NULL;
dp[dn]->miss = NULL;
}