/* RexxPlPlot V0.2 - an ARexx front-end to PlPlot * - written by Glenn M. Lewis - Caltech - 9/12/89 * - based on code by Tomas Rokicki of Radical Eye Software */ #include #include #include "minrexx.h" #define MAX(m,n) ((m)>(n)?(m):(n)) /* These are the functions we want to patch into */ void pladv(), plbeg(), plbin(), plbox(), plbox3(), plclr(), plcol(), plcont(), plend(), plenv(), plerrx(), plerry(), plfont(), plgra(), plgrid3(), plgspa(), plhist(), pljoin(), pllab(), plline(), plmtex(), plot3d(), plpoin(), plptex(), plschr(), plside3(), plsmaj(), plsmin(), plssym(), plstar(), plstyl(), plsvpa(), plsym(), pltext(), plthicken(), plvpor(), plvsta(), plw3d(), plwind(), xform(), set_transformation(); void *malloc(), disp(); double atof(); int get_next_int(); float get_next_float(); char *get_char_pointer(), *parse_arg(); void get_float_array(), get_2D_float_array(), get_int_array(), write_next_float(); /* Static Variables */ static int still_going; /* Flag to shut down RexxPlPlot */ static int parsed, quoted; /* Flag to represent parsing success */ static int return_result; /* Flag whether function returns result */ static char return_string[256]; /* Actual return result string */ float tr[6] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0 }; /* Here are all of the patching rountines */ void Rpladv(msg, s) struct RexxMsg *msg; char *s; { int sub; sub = get_next_int(msg, &s); #ifdef DEBUG printf("pladv(%d);\n", sub); #endif if (parsed) pladv(sub); } void Rplbeg(msg, s) struct RexxMsg *msg; char *s; { int dev, nx, ny; dev = get_next_int(msg, &s); nx = get_next_int(msg, &s); ny = get_next_int(msg, &s); #ifdef DEBUG printf("plbeg(%d,%d,%d);\n", dev,nx,ny); #endif if (parsed) plbeg(dev, nx, ny); } void out_of_mem() ; /* forward declare this routine */ void Rplbin(msg, s) struct RexxMsg *msg; char *s; { int nbin, cen; float *x=0, *y=0; nbin = get_next_int(msg, &s); if (!parsed) return; if (nbin) { if (!(x = (float *) malloc(2*nbin*sizeof(float)))) out_of_mem(); y = &x[nbin]; get_float_array(msg, &s, x, nbin); get_float_array(msg, &s, y, nbin); cen = get_next_int(msg, &s); #ifdef DEBUG printf("plbin(%d,%08x,%08x,%d);\n", nbin, x, y, cen); #endif } if (parsed) plbin(nbin, x, y, cen); if (nbin) free((void *) x); } void Rplbox(msg, s) struct RexxMsg *msg; char *s; { char *xopt, *yopt; float xtick, ytick; int nxsub, nysub; xopt = get_char_pointer(msg, &s); xtick = get_next_float(msg, &s); nxsub = get_next_int(msg, &s); yopt = get_char_pointer(msg, &s); ytick = get_next_float(msg, &s); nysub = get_next_int(msg, &s); #ifdef DEBUG printf("plbox('%s',%0.4f,%d,'%s',%0.4f,%d);\n", xopt, xtick, nxsub, yopt, ytick, nysub); #endif if (parsed) plbox(xopt, xtick, nxsub, yopt, ytick, nysub); } void Rplbox3(msg, s) struct RexxMsg *msg; char *s; { char *xopt, *xlabel, *yopt, *ylabel, *zopt, *zlabel; float xtick, ytick, ztick; int nxsub, nysub, nzsub; xopt = get_char_pointer(msg, &s); xlabel = get_char_pointer(msg, &s); xtick = get_next_float(msg, &s); nxsub = get_next_int(msg, &s); yopt = get_char_pointer(msg, &s); ylabel = get_char_pointer(msg, &s); ytick = get_next_float(msg, &s); nysub = get_next_int(msg, &s); zopt = get_char_pointer(msg, &s); zlabel = get_char_pointer(msg, &s); ztick = get_next_float(msg, &s); nzsub = get_next_int(msg, &s); #ifdef DEBUG printf("plbox3('%s','%s',%0.4f,%d,'%s','%s',%0.4f,%d,'%s','%s',%0.4f,%d);\n", xopt,xlabel,xtick,nxsub,yopt,ylabel,ytick,nysub,zopt,zlabel,ztick,nzsub); #endif if (parsed) plbox3(xopt,xlabel,xtick,nxsub,yopt,ylabel,ytick,nysub,zopt,zlabel,ztick,nzsub); } void Rplclr(msg, s) struct RexxMsg *msg; char *s; { #ifdef DEBUG printf("plclr();\n"); #endif plclr(); } void Rplcol(msg, s) struct RexxMsg *msg; char *s; { int color; color = get_next_int(msg, &s); #ifdef DEBUG printf("plcol(%d);\n", color); #endif if (parsed) plcol(color); } void Rplcont(msg, s) struct RexxMsg *msg; char *s; { float *z, *clevel; int nx, ny, kx, lx, ky, ly, nlevel; char *tmp_s = &return_string[0]; strcpy(tmp_s, s); /* Save 'z' variable name */ parse_arg(&s); nx = get_next_int(msg, &s); ny = get_next_int(msg, &s); if (nx==0 || ny==0) { parsed = 0; return; } kx = get_next_int(msg, &s); lx = get_next_int(msg, &s); ky = get_next_int(msg, &s); ly = get_next_int(msg, &s); if (!parsed) return; if (!(z = (float *) malloc(nx*ny*sizeof(float)))) out_of_mem(); get_2D_float_array(msg, &tmp_s, z, nx, ny); /* Use original name */ tmp_s = &return_string[0]; strcpy(tmp_s, s); /* Save 'clevel' variable name */ parse_arg(&s); nlevel = get_next_int(msg, &s); if (!nlevel) { parsed = 0; return; } if (!(clevel = (float *) malloc(nlevel*sizeof(float)))) out_of_mem(); if (!parsed) { free((void *)z); return; } get_float_array(msg, &tmp_s, clevel, nlevel); #ifdef DEBUG printf("plcont(%08x,%d,%d,%d,%d,%d,%d,%08x,%d,%08x);\n", z,nx,ny,kx,lx,ky,ly,clevel,nlevel,&xform); #endif if (parsed) plcont(z,nx,ny,kx,lx,ky,ly,clevel,nlevel,&xform); free((void *) z); } void Rplend(msg, s) struct RexxMsg *msg; char *s; { still_going = 0; /* This function stops PlPlot */ #ifdef DEBUG printf("plend();\n"); #endif plend(); } void Rplenv(msg, s) struct RexxMsg *msg; char *s; { float xmin, xmax, ymin, ymax; int just, axis; xmin = get_next_float(msg, &s); xmax = get_next_float(msg, &s); ymin = get_next_float(msg, &s); ymax = get_next_float(msg, &s); just = get_next_int(msg, &s); axis = get_next_int(msg, &s); #ifdef DEBUG printf("plenv(%0.4f,%0.4f,%0.4f,%0.4f,%d,%d);\n", xmin,xmax,ymin,ymax,just,axis); #endif if (parsed) plenv(xmin,xmax,ymin,ymax,just,axis); } void Rplerrx(msg, s) struct RexxMsg *msg; char *s; { int n; float *xmin, *xmax, *y; n = get_next_int(msg, &s); if (n==0) parsed=0; if (!parsed) return; if (!(xmin = (float *) malloc(3*n*sizeof(float)))) out_of_mem(); xmax = &xmin[n]; y = &xmax[n]; get_float_array(msg, &s, xmin, n); get_float_array(msg, &s, xmax, n); get_float_array(msg, &s, y , n); #ifdef DEBUG printf("plerrx(%d,%08x,%08x,%08x);\n", n,xmin,xmax,y); #endif if (parsed) plerrx(n,xmin,xmax,y); free((void *) xmin); } void Rplerry(msg, s) struct RexxMsg *msg; char *s; { int n; float *x, *ymin, *ymax; n = get_next_int(msg, &s); if (n==0) parsed=0; if (!parsed) return; if (!(x = (float *) malloc(3*n*sizeof(float)))) out_of_mem(); ymin = &x[n]; ymax = &ymin[n]; get_float_array(msg, &s, x , n); get_float_array(msg, &s, ymin, n); get_float_array(msg, &s, ymax, n); #ifdef DEBUG printf("plerry(%d,%08x,%08x,%08x);\n", n,x,ymin,ymax); #endif if (parsed) plerry(n,x,ymin,ymax); free((void *) x); } void Rplfont(msg, s) struct RexxMsg *msg; char *s; { int font; font = get_next_int(msg, &s); #ifdef DEBUG printf("plfont(%d);\n", font); #endif if (parsed) plfont(font); } void Rplgra(msg, s) struct RexxMsg *msg; char *s; { #ifdef DEBUG printf("plgra();\n"); #endif plgra(); } void Rplgrid3(msg, s) struct RexxMsg *msg; char *s; { float ztick; ztick = get_next_float(msg, &s); #ifdef DEBUG printf("plgrid3(%0.4f);\n", ztick); #endif if (parsed) plgrid3(ztick); } void Rplgspa(msg, s) struct RexxMsg *msg; char *s; { float xmin, xmax, ymin, ymax; plgspa(&xmin, &xmax, &ymin, &ymax); write_next_float(msg, &s, xmin); write_next_float(msg, &s, xmax); write_next_float(msg, &s, ymin); write_next_float(msg, &s, ymax); #ifdef DEBUG printf("plgspa(%0.4f,%0.4f,%0.4f,%0.4f);\n", xmin,xmax,ymin,ymax); #endif } void Rplhist(msg, s) struct RexxMsg *msg; char *s; { int n, nbin, oldwin; float *data, datmin, datmax; n = get_next_int(msg, &s); if (n==0) parsed=0; if (!parsed) return; if (!(data = (float *) malloc(n*sizeof(float)))) out_of_mem(); get_float_array(msg, &s, data, n); datmin = get_next_float(msg, &s); datmax = get_next_float(msg, &s); nbin = get_next_int(msg, &s); oldwin = get_next_int(msg, &s); #ifdef DEBUG printf("plhist(%d,%08x,%0.4f,%0.4f,%d,%d);\n", n,data,datmin,datmax,nbin,oldwin); #endif if (parsed) plhist(n,data,datmin,datmax,nbin,oldwin); free((void *) data); } void Rpliff(msg, s) struct RexxMsg *msg; char *s; { int x1, y1, x2, y2 ; char *name ; x1 = get_next_int(msg, &s); y1 = get_next_int(msg, &s); x2 = get_next_int(msg, &s); y2 = get_next_int(msg, &s); name = get_char_pointer(msg, &s) ; #ifdef DEBUG printf("pliff(%d,%d,%d,%d,%s);\n", x1, y1, x2, y2, name); #endif if (parsed) pliff(x1, y1, x2, y2, name); } void Rpljoin(msg, s) struct RexxMsg *msg; char *s; { float x1, y1, x2, y2; x1 = get_next_float(msg, &s); y1 = get_next_float(msg, &s); x2 = get_next_float(msg, &s); y2 = get_next_float(msg, &s); #ifdef DEBUG printf("pljoin(%0.4f,%0.4f,%0.4f,%0.4f);\n", x1, y1, x2, y2); #endif if (parsed) pljoin(x1, y1, x2, y2); } void Rpllab(msg, s) struct RexxMsg *msg; char *s; { char *xlabel, *ylabel, *tlabel; xlabel = get_char_pointer(msg, &s); ylabel = get_char_pointer(msg, &s); tlabel = get_char_pointer(msg, &s); #ifdef DEBUG printf("pllab('%s','%s','%s');\n", xlabel, ylabel, tlabel); #endif if (parsed) pllab(xlabel, ylabel, tlabel); } void Rplline(msg, s) struct RexxMsg *msg; char *s; { int n; float *x, *y; n = get_next_int(msg, &s); if (n==0) parsed=0; if (!parsed) return; if (!(x = (float *) malloc(2*n*sizeof(float)))) out_of_mem(); y = &x[n]; get_float_array(msg, &s, x, n); get_float_array(msg, &s, y, n); #ifdef DEBUG printf("plline(%d,%08x,%08x);\n", n, x, y); #endif if (parsed) plline(n, x, y); free((void *) x); } void Rplmtex(msg, s) struct RexxMsg *msg; char *s; { char *side, *text; float disp, pos, just; side = get_char_pointer(msg, &s); disp = get_next_float(msg, &s); pos = get_next_float(msg, &s); just = get_next_float(msg, &s); text = get_char_pointer(msg, &s); #ifdef DEBUG printf("plmtex('%s',%0.4f,%0.4f,%0.4f,'%s');\n", side, disp, pos, just, text); #endif if (parsed) plmtex(side, disp, pos, just, text); } void Rplot3d(msg, s) struct RexxMsg *msg; char *s; { float *x, *y, *z; int *work, ly, nx, ny, opt; char *tmp_s = &return_string[0]; strcpy(tmp_s, s); /* Save array variable names */ parse_arg(&s); parse_arg(&s); parse_arg(&s); /* Delete variable names */ parse_arg(&s); /* Get rid of 'WORK' argument */ ly = get_next_int(msg, &s); nx = get_next_int(msg, &s); ny = get_next_int(msg, &s); opt = get_next_int(msg, &s); if (nx==0 || ny==0) parsed=0; if (!parsed) return; if (!(x = (float *) malloc((nx+1)*(ny+1)*sizeof(float)))) out_of_mem(); y = &x[nx]; z = &y[ny]; if (!(work = (int *) malloc(4*MAX(nx,ny)*sizeof(int)))) out_of_mem(); get_float_array(msg, &tmp_s, x, nx); get_float_array(msg, &tmp_s, y, ny); get_2D_float_array(msg, &tmp_s, z, nx, ly); #ifdef DEBUG printf("plot3d(%08x,%08x,%08x,%08x,%d,%d,%d,%d);\n", x,y,z,work,ly,nx,ny,opt); #endif if (parsed) plot3d(x,y,z,work,ly,nx,ny,opt); free((void *) work); free((void *) x); } void Rplpoin(msg, s) struct RexxMsg *msg; char *s; { int n, code; float *x, *y; n = get_next_int(msg, &s); if (n==0) parsed=0; if (!parsed) return; if (!(x = (float *) malloc(2*n*sizeof(float)))) out_of_mem(); y = &x[n]; get_float_array(msg, &s, x, n); get_float_array(msg, &s, y, n); if (!parsed) { free((void *) x); return; } code = get_next_int(msg, &s); #ifdef DEBUG printf("plpoin(%d,%08x,%08x,%d);\n", n,x,y,code); #endif if (parsed) plpoin(n,x,y,code); free((void *) x); } void Rplptex(msg, s) struct RexxMsg *msg; char *s; { float x, y, dx, dy, just; char *text; x = get_next_float(msg, &s); y = get_next_float(msg, &s); dx = get_next_float(msg, &s); dy = get_next_float(msg, &s); just = get_next_float(msg, &s); text = get_char_pointer(msg, &s); #ifdef DEBUG printf("plptex(%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,'%s');\n", x,y,dx,dy,just,text); #endif if (parsed) plptex(x,y,dx,dy,just,text); } void Rplschr(msg, s) struct RexxMsg *msg; char *s; { float def, scale; def = get_next_float(msg, &s); scale = get_next_float(msg, &s); #ifdef DEBUG printf("plschr(%0.4f,%0.4f);\n",def, scale); #endif if (parsed) plschr(def, scale); } void Rplside3(msg, s) struct RexxMsg *msg; char *s; { float *x, *y, *z; int ly, nx, ny, opt; char *tmp_s = &return_string[0]; strcpy(tmp_s, s); /* Save array variable names */ parse_arg(&s); parse_arg(&s); parse_arg(&s); /* Delete variable names */ ly = get_next_int(msg, &s); nx = get_next_int(msg, &s); ny = get_next_int(msg, &s); opt = get_next_int(msg, &s); if (nx==0 || ny==0) parsed=0; if (!parsed) return; if (!(x = (float *) malloc((nx+1)*(ny+1)*sizeof(float)))) out_of_mem(); y = &x[nx]; z = &y[ny]; get_float_array(msg, &tmp_s, x, nx); get_float_array(msg, &tmp_s, y, ny); get_2D_float_array(msg, &tmp_s, z, nx, ly); #ifdef DEBUG printf("plside3(%08x,%08x,%08x,%d,%d,%d,%d);\n", x,y,z,ly,nx,ny,opt); #endif if (parsed) plside3(x,y,z,ly,nx,ny,opt); free((void *) x); } void Rplsmaj(msg, s) struct RexxMsg *msg; char *s; { float def, scale; def = get_next_float(msg, &s); scale = get_next_float(msg, &s); #ifdef DEBUG printf("plsmaj(%0.4f,%0.4f);\n",def, scale); #endif if (parsed) plsmaj(def, scale); } void Rplsmin(msg, s) struct RexxMsg *msg; char *s; { float def, scale; def = get_next_float(msg, &s); scale = get_next_float(msg, &s); #ifdef DEBUG printf("plsmin(%0.4f,%0.4f);\n",def, scale); #endif if (parsed) plsmin(def, scale); } void Rplssym(msg, s) struct RexxMsg *msg; char *s; { float def, scale; def = get_next_float(msg, &s); scale = get_next_float(msg, &s); #ifdef DEBUG printf("plssym(%0.4f,%0.4f);\n",def, scale); #endif if (parsed) plssym(def, scale); } void Rplstar(msg, s) struct RexxMsg *msg; char *s; { int nx, ny; nx = get_next_int(msg, &s); ny = get_next_int(msg, &s); #ifdef DEBUG printf("plstar(%d,%d);\n",nx,ny); #endif if (parsed) plstar(nx, ny); } void Rplstyl(msg, s) struct RexxMsg *msg; char *s; { int nels, *mark=0, *space=0; nels = get_next_int(msg, &s); if (!parsed) return; if (nels) { if (!(mark = (int *) malloc(2*nels*sizeof(int)))) out_of_mem(); space = &mark[nels]; get_int_array(msg, &s, mark, nels); get_int_array(msg, &s, space, nels); #ifdef DEBUG printf("plstyl(%d,%08x,%08x);\n", nels, mark, space); #endif } if (parsed) plstyl(nels, mark, space); if (nels) { free((void *) mark ); free((void *) space); } } void Rplsvpa(msg, s) struct RexxMsg *msg; char *s; { float xmin, xmax, ymin, ymax; xmin = get_next_float(msg, &s); xmax = get_next_float(msg, &s); ymin = get_next_float(msg, &s); ymax = get_next_float(msg, &s); #ifdef DEBUG printf("plsvpa(%0.4f,%0.4f,%0.4f,%0.4f);\n",xmin,xmax,ymin,ymax); #endif if (parsed) plsvpa(xmin,xmax,ymin,ymax); } void Rplsym(msg, s) struct RexxMsg *msg; char *s; { int n, code; float *x, *y; n = get_next_int(msg, &s); if (n==0) parsed=0; if (!parsed) return; if (!(x = (float *) malloc(2*n*sizeof(float)))) out_of_mem(); y = &x[n]; get_float_array(msg, &s, x, n); get_float_array(msg, &s, y, n); code = get_next_int(msg, &s); #ifdef DEBUG printf("plsym(%d,%08x,%08x,%d);\n",n,x,y,code); #endif if (parsed) plsym(n,x,y,code); free((void *) x); } void Rpltext(msg, s) struct RexxMsg *msg; char *s; { #ifdef DEBUG printf("pltext();\n"); #endif pltext(); } void Rplthicken(msg, s) struct RexxMsg *msg; char *s; { #ifdef DEBUG printf("plthicken();\n"); #endif plthicken(); } void Rplvpor(msg, s) struct RexxMsg *msg; char *s; { float xmin, xmax, ymin, ymax; xmin = get_next_float(msg, &s); xmax = get_next_float(msg, &s); ymin = get_next_float(msg, &s); ymax = get_next_float(msg, &s); #ifdef DEBUG printf("plvpor(%0.4f,%0.4f,%0.4f,%0.4f);\n",xmin,xmax,ymin,ymax); #endif if (parsed) plvpor(xmin,xmax,ymin,ymax); } void Rplvsta(msg, s) struct RexxMsg *msg; char *s; { #ifdef DEBUG printf("plvsta();\n"); #endif plvsta(); } void Rplw3d(msg, s) struct RexxMsg *msg; char *s; { float basex, basey, height, xmin, xmax, ymin, ymax, zmin, zmax, alt, az; basex = get_next_float(msg, &s); basey = get_next_float(msg, &s); height = get_next_float(msg, &s); xmin = get_next_float(msg, &s); xmax = get_next_float(msg, &s); ymin = get_next_float(msg, &s); ymax = get_next_float(msg, &s); zmin = get_next_float(msg, &s); zmax = get_next_float(msg, &s); alt = get_next_float(msg, &s); az = get_next_float(msg, &s); #ifdef DEBUG printf("plw3d(%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f);\n", basex,basey,height,xmin,xmax,ymin,ymax,zmin,zmax,alt,az); #endif if (parsed) plw3d(basex,basey,height,xmin,xmax,ymin,ymax,zmin,zmax,alt,az); } void Rplwind(msg, s) struct RexxMsg *msg; char *s; { float xmin, xmax, ymin, ymax; xmin = get_next_float(msg, &s); xmax = get_next_float(msg, &s); ymin = get_next_float(msg, &s); ymax = get_next_float(msg, &s); #ifdef DEBUG printf("plwind(%0.4f,%0.4f,%0.4f,%0.4f);\n",xmin,xmax,ymin,ymax); #endif if (parsed) plwind(xmin,xmax,ymin,ymax); } void set_transformation(msg, s) struct RexxMsg *msg; char *s; { #ifdef DEBUG printf("Before: tr[6] = {%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f}\n", tr[0], tr[1], tr[2], tr[3], tr[4], tr[5]); #endif tr[0] = get_next_float(msg, &s); tr[1] = get_next_float(msg, &s); tr[2] = get_next_float(msg, &s); tr[3] = get_next_float(msg, &s); tr[4] = get_next_float(msg, &s); tr[5] = get_next_float(msg, &s); #ifdef DEBUG printf("After: tr[6] = {%0.4f,%0.4f,%0.4f,%0.4f,%0.4f,%0.4f}\n", tr[0], tr[1], tr[2], tr[3], tr[4], tr[5]); #endif } /* * Here is our command association list. Note that in this case, * we are setting the userdata field to be a function to call. * Dispatch will still take place through disp(), so common head * and tail stuff can go there. * * Commands are all lower case, so we match either upper or lower. * (This is a requirement of minrexx.) */ struct rexxCommandList rcl[] = { { "pladv", (APTR)&Rpladv }, { "plbeg", (APTR)&Rplbeg }, { "plbin", (APTR)&Rplbin }, { "plbox3", (APTR)&Rplbox3 }, { "plbox", (APTR)&Rplbox }, { "plclr", (APTR)&Rplclr }, { "plcol", (APTR)&Rplcol }, { "plcont", (APTR)&Rplcont }, { "plend", (APTR)&Rplend }, { "plenv", (APTR)&Rplenv }, { "plerrx", (APTR)&Rplerrx }, { "plerry", (APTR)&Rplerry }, { "plfont", (APTR)&Rplfont }, { "plgra", (APTR)&Rplgra }, { "plgrid3", (APTR)&Rplgrid3 }, { "plgspa", (APTR)&Rplgspa }, { "pliff", (APTR)&Rpliff }, { "plhist", (APTR)&Rplhist }, { "pljoin", (APTR)&Rpljoin }, { "pllab", (APTR)&Rpllab }, { "plline", (APTR)&Rplline }, { "plmtex", (APTR)&Rplmtex }, { "plot3d", (APTR)&Rplot3d }, { "plpoin", (APTR)&Rplpoin }, { "plptex", (APTR)&Rplptex }, { "plschr", (APTR)&Rplschr }, { "plside3", (APTR)&Rplside3 }, { "plsmaj", (APTR)&Rplsmaj }, { "plsmin", (APTR)&Rplsmin }, { "plssym", (APTR)&Rplssym }, { "plstar", (APTR)&Rplstar }, { "plstyl", (APTR)&Rplstyl }, { "plsvpa", (APTR)&Rplsvpa }, { "plsym", (APTR)&Rplsym }, { "pltext", (APTR)&Rpltext }, { "plthicken", (APTR)&Rplthicken }, { "plvpor", (APTR)&Rplvpor }, { "plvsta", (APTR)&Rplvsta }, { "plw3d", (APTR)&Rplw3d }, { "plwind", (APTR)&Rplwind }, { "plset_tr", (APTR)&set_transformation }, { NULL, NULL } } ; /* Main rountine. Open up Libraries, print message, * detach from CLI (eventually), and wait for ARexx messages */ main(argc, argv) int argc; char *argv[]; { long rexxbit ; /* Maybe we should do more safety initialization here !?!? */ #ifdef LATTICE onexit(dnRexxPort) ; #endif printf("This is RexxPlPlot V0.3 by Glenn M. Lewis built on PlPlot 1.1a\n") ; printf(" by Tony Richardson with modifcations by Sam Paolucci.\n") ; printf(" IFF, Preferences and minrexx support by Tomas Rokicki.\n") ; rexxbit = upRexxPort("PlPlot", rcl, "plot", &disp) ; if (argc > 1) asyncRexxCmd(argv[1]) ; else printf("[waiting for ARexx to send me a command...]\n"); still_going = 1; while (still_going) { /* Main loop */ Wait(rexxbit); dispRexxPort() ; } /* * With Rexx, we need to bring the port down. You might make this * part of exit() for programs that have multiple paths to exit. */ dnRexxPort() ; Exit(0); /* Call the AmigaDOS routine to shut down */ } /* Make sure that the string is copied before it is chopped up. ARexx * doesn't like other programs tampering with its strings */ static char work_string[256]; /* * This is our main dispatch function. * If everything else was successful, we return a 0 to ARexx. * Otherwise, we return a failure of 20 to indicate that the arguments * were messed up. */ void disp(msg, dat, s) register struct RexxMsg *msg; register struct rexxCommandList *dat; char *s; { parsed = 1; /* Assume that everything went OK */ strcpy(work_string, s); ((void (*)()) dat->userdata)(msg, work_string); if (!parsed) replyRexxCmd(msg, 20L, 10L, NULL); /* Fail */ else if (return_result) replyRexxCmd(msg, 0L, 0L, return_string); /* It worked */ else replyRexxCmd(msg, 0L, 0L, NULL); /* It worked */ } void out_of_mem() { printf("Ooops. Out of memory. Sorry. I died.\n"); still_going = 0; plend(); Exit(0); } /* We have to make our own exit so that when PlPlot exit()'s, we close ARexx */ #ifndef LATTICE void _exit() { dnRexxPort(); Exit(0); /* Call the AmigaDOS exit function */ } #endif void uppercase(s) register char *s; { while (*s) { if (islower(*s)) *s = toupper(*s); s++; } } /* Here are all of the parsing routines to perform the conversion magic */ char *parse_arg(s) char **s; { register char *p, *p2; char delimiter; quoted = 0; /* Let routines know if it was a string */ p = *s; while (*p && (isspace(*p) || *p=='(' || *p==',')) p++; /* Pass junk */ p2 = p; if (*p2 == '\"' || *p2 == '\'') { /* This arg is enclosed in quotes */ quoted = 1; delimiter = *p2++; p++; /* Chop off first delimiter */ while (*p2 && *p2 != delimiter) p2++; /* Find matching delimiter */ if (*p2) *p2++ = '\0'; /* Chop off final delimiter */ while (*p2 && (isspace(*p2) || *p2==')' || *p2==',')) p2++; *s = p2; /* Point to next argument */ return(p); } /* Argument was not enclosed in quotes. Find any delimiter */ while (*p2 && !isspace(*p2) && *p2 != ',' && *p2 != ')') p2++; if (*p2) *p2++ = '\0'; /* Chop off final delimiter */ *s = p2; return(p); } void check_for_stems(msg, s) /* Replace variable stems with integer */ struct RexxMsg *msg; char *s; { char temp[256], *value; register int i, j; uppercase(s); for (i=0; s[i]; ) if (s[i++] == '.') { for (j=0; s[i+j] && s[i+j]!='.'; j++) ; if (j) strncpy(temp, &s[i], j); temp[j] = '\0'; GetRexxVar(msg, temp, &value); if (!(*value)) { parsed = 0; return; } /* Got the variable contents - make room in the string */ strcpy(temp, &s[i+j]); /* Check that 'value' is an integer */ for (j=0; value[j]; j++) if (value[j] <= '0' || value[j] >= '9') { parsed=0; return; } strcpy(&s[i], value); strcpy(&s[i+j], temp); /* Add contents onto end */ i += j; } } int get_next_int(msg, s) struct RexxMsg *msg; char **s; { register char *p; char *value; p = parse_arg(s); /* Return pointer to argument, advance 's' past it */ if ((*p >= '0' && *p <= '9') || *p == '-' || *p == '+') return(atoi(p)); /* It's a number */ check_for_stems(msg, p); if (!parsed) return(0); GetRexxVar(msg, p, &value); if (!(*value)) { parsed = 0; return(0); } return(atoi(value)); } float get_next_float(msg, s) struct RexxMsg *msg; char **s; { register char *p; char *value; p = parse_arg(s); /* Return pointer to argument, advance 's' past it */ if ((*p >= '0' && *p <= '9') || *p == '-' || *p == '+') return((float)atof(p)); /* It's a number */ check_for_stems(msg, p); if (!parsed) return(0.0); GetRexxVar(msg, p, &value); if (!(*value)) { parsed = 0; return(0.0); } return((float)atof(value)); } static char save_it_away[256]; char *get_char_pointer(msg, s) struct RexxMsg *msg; char **s; { register char *p; char *value; p = parse_arg(s); /* Return pointer to argument, advance 's' past it */ if (quoted) return(p); /* It's a quoted string... return it */ strcpy(save_it_away, p); /* Save it away for later */ check_for_stems(msg, save_it_away); if (!parsed) { parsed=1; return(p); } /* Not a stem - return as string */ GetRexxVar(msg, save_it_away, &value); if (!(*value)) { return(p); } /* Not a variable... return it */ /* Yes, it was a variable. Pass the pointer of its value: */ return(value); } void get_float_array(msg, s, array, n) struct RexxMsg *msg; char **s; float *array; int n; { register int i; register char *p; char *value; p = parse_arg(s); /* Return pointer to argument, advance 's' past it */ uppercase(p); /* If there is only one value, then there is no need for a stem */ if (n==1) { GetRexxVar(msg, p, &value); if (*value) { array[0] = (float) atof(value); return; } /* If it got to this line, couldn't find the variable. Check stem. */ } /* Start reading all of its values */ for (i=0; i