V10/cmd/plot/driver.c
#include <stdio.h>
#include <ctype.h>
#define void int
#ifdef T5620
#include "jcom.h"
extern int openflg;
extern int t;
#endif
#define MAXL 16
double atof();
char *strchr();
char *getl();
void idle();
void arc();
void box();
void circle();
void disc();
void erase();
void closepl();
void color();
void cfill();
void pen();
void frame();
void grade();
void ppause();
void line();
void move();
void openpl();
void point();
void parabola();
void range();
void rmove();
void text();
void sbox();
void vec();
void rvec();
void fill();
void poly();
void spline();
void fspline();
void lspline();
void dspline();
void cspline();
void save();
void restore();
void define();
void call();
void pinclude();
struct pcall {
void (*plot)();
int kount;
char *cc;
int numc;
} plots[] = {
arc, 7, "a", 1,
box, 4, "bo", 2,
circle, 3, "ci", 2,
disc, 3, "di", 2,
erase, -1, "e", 1,
closepl, -1, "cl", 2,
frame, 4, "fr", 2,
grade, 1, "g", 1,
ppause, -1, "pau", 3,
color, 0, "co", 2,
cfill, 0, "cf", 2,
pen, 0, "pe", 2,
line, 4, "li", 2,
move, 2, "m", 1,
idle, -2, "id", 2,
openpl, 0, "o", 1,
point, 2, "poi", 3,
parabola, 6, "par", 3,
range, 4, "ra", 2,
rmove, 2, "rm", 2,
text, 0, "t", 1,
sbox, 4, "sb", 2,
vec, 2, "v", 1,
rvec, 2, "rv", 2,
fill, 256, "fi", 2,
poly, 256, "pol", 3,
spline, 256, "sp", 2,
fspline, 256, "fs", 2,
lspline, 256, "ls", 2,
dspline, 256, "ds", 2,
cspline, 256, "cs", 2,
save, -1, "sa", 2,
restore, -1, "re", 2,
define, 0, "de", 2,
call, 0, "ca", 2,
pinclude, 0, "in", 2,
0, 0, 0, 0
};
struct pcall *pplots;
struct fcall {
char *name;
char *stash;
} flibr[MAXL];
struct fcall *fptr = flibr;
short FN = 1;
double SC = 1.0;
char *fstack[64], **fstp;
int num[256],*nn;
double *ff[256], **fp;
char aa[256];
FILE *fd;
main(arc, arv)
int arc;
char **arv;
{
char *ap;
fd = stdin;
for (; arc > 1; arc--, arv++) {
if (arv[1][0] == '-') {
ap = arv[1];
ap++;
if (*ap == 'T')
continue;
if (*ap == 'D') {
ptype(++ap);
continue;
}
switch (*ap) {
case 'e':
erase();
continue;
case 'C':
closepl();
continue;
case 'w':
ppause();
continue;
case 'c':
color(++ap);
continue;
case 'f':
cfill(++ap);
continue;
case 'p':
pen(++ap);
continue;
case 'o':
openpl(++ap);
continue;
case 'g':
grade(atof(++ap));
continue;
default:
fprintf(stderr, "%s not allowed as argument\n",
ap);
exit(1);
}
continue;
}
if ((fd = fopen(arv[1], "r")) == NULL) {
perror();
fprintf(stderr, "Cannot find file %s\n", arv[1]);
continue;
}
if(!process())
break;
fclose(fd);
}
if (fd == stdin)
process();
#ifdef T5620
closep();
#endif
exit(0);
}
process()
{
short acn,curl;
double X[512], *xp;
char *ap, *aq, truef;
fstp = fstack;
fp = ff;
nn = num;
while((ap=getl(aa))){
#ifdef T5620
if(t == TQUIT)
return(0);
#endif
while(isspace(*ap)){
if(*ap == '\n')
ap=getl(aa);
else ap++;
}
if(*ap == ':')continue;
while(*ap == '.' && !(isdigit(*(ap+1))))
ap++;
if (isupper(*ap))
*ap = tolower(*ap);
if (!islower(*ap)){
if(pplots == 0){
closepl();
fprintf(stderr,"file probably not jplot input\n");
exit(1);
}
if (pplots->kount > 1)
goto aresume;
continue;
}
if(fp != ff){
if(acn%2 != 0){
#ifdef T5620
if(openflg) closep();
#endif
fprintf(stderr,"phase error\n");
exit(1);
}
*nn++ = acn/2;
*nn = 0;
(*pplots->plot)(num,ff);
fp = ff;
nn = num;
}
for (pplots = plots; pplots->plot != 0; pplots++)
if (strncmp(ap, pplots->cc, pplots->numc) == 0){
break;
}
if (pplots->plot == 0) {
#ifdef T5620
if(openflg) closep();
#endif
fprintf(stderr,"no command for %s\n", ap);
exit();
}
if (pplots->kount < 0) {
(*pplots->plot)();
continue;
}
if (*ap != '\n')
while(islower(*ap))
ap++;
if (*ap != '\n')
while (isspace(*ap) || *ap == ',')
ap++;
if (*ap == '\n') {
if (!(pplots->kount))
(*pplots->plot)(" ");
continue;
}
if (!(pplots->kount)) {
for(aq=ap; *aq != '\n';aq++)
if(*aq == '\\')aq++;
if (*ap == '"'){
ap++;
if(*(aq-1) == '"')
aq--;
}
*aq = NULL;
(*pplots->plot)(ap);
continue;
}
acn = 0;
xp = X;
if(pplots->kount == 256){
curl = 0;
*fp++ = X;
}
aresume:
while (*ap != '\n') {
while (isspace(*ap) || *ap == ',')
ap++;
if (*ap == '\n')
break;
if(*ap == '{'){
ap++;
if(curl==0 || ( curl==1 && acn == 0)){
curl++;
continue;
}
*fp++ = xp;
continue;
}
if(*ap == '}'){
ap++;
curl++;
if(acn==0){
*nn = 0;
(*pplots->plot)(num,ff);
fp = ff;
nn = num;
continue;
}
if(acn%2 != 0){
#ifdef T5620
closep();
#endif
fprintf(stderr,"phase error\n");
exit(1);
}
*nn++ = acn/2;
acn = 0;
continue;
}
aq = ap;
while (!(isspace(*ap)) && *ap != ',' && *ap != '\n')
ap++;
if (isdigit(*aq)||(*aq == '-'||*aq == '+'||*aq == '.')){
*xp++ = atof(aq)*SC;
if (++acn >= pplots->kount&&pplots->kount != 256) {
switch (acn) {
case 1:
(*pplots->plot)(X[0]);
break;
case 2:
(*pplots->plot)(X[0], X[1]);
break;
case 3:
(*pplots->plot)(X[0],X[1],X[2]);
break;
case 4:
(*pplots->plot)(X[0],X[1],X[2],X[3]);
break;
case 6:
(*pplots->plot)(X[0],X[1],X[2],
X[3], X[4], X[5]);
break;
case 7:
(*pplots->plot)(X[0],X[1],X[2],
X[3], X[4], X[5], X[6]);
break;
}
acn = 0;
xp = X;
}
}
}
}
return(1);
}
char *malloc();
char *realloc();
char *names = 0;
char *enames = 0;
char *bstash = 0;
char *estash = 0;
unsigned size = 1024;
char *nstash = 0;
define(a)
char *a;
{
char *ap, *aq;
short i, j;
int curly = 0;
ap = a;
while(isalpha(*ap))ap++;
if(ap == a){
fprintf(stderr,"no name with define\n");
exit(1);
}
i = ap - a;
if(names+i+1 > enames){
names = malloc((unsigned)512);
enames = names + 512;
}
fptr->name = names;
strncpy(names, a,i);
names += i;
*names++ = '\0';
if(!bstash){
bstash = nstash = malloc(size);
estash = bstash + size;
}
fptr->stash = nstash;
while(*ap != '{')
if(*ap == '\n'){
if((ap=fgets(aa,256,fd))==NULL){
fprintf(stderr,"unexpected end of file\n");
exit(1);
}
}
else ap++;
while((j=getc(fd))!= EOF){
if(j == '{')curly++;
else if(j == '}'){
if(curly == 0)break;
else curly--;
}
*nstash++ = j;
if(nstash == estash){
free(bstash);
size += 1024;
bstash = realloc(bstash,size);
estash = bstash+size;
}
}
*nstash++ = '\0';
if(fptr++ >= &flibr[MAXL]){
fprintf(stderr,"Too many objects\n");
exit(1);
}
}
call(a)
char *a;
{
char *ap;
struct fcall *f;
char sav;
ap = a;
while(isalpha(*ap))ap++;
sav = *ap;
*ap = '\0';
for(f=flibr;f<fptr;f++){
if (!(strcmp(a, f->name)))
break;
}
if(f == fptr){
fprintf(stderr, "object %s not defined\n",a);
exit(1);
}
*ap = sav;
while (isspace(*ap) || *ap == ',')
ap++;
if (*ap != '\0')
SC = atof(ap);
else SC = 1.;
*(++fstp) = f->stash;
FN = 0;
}
pinclude(a)
char *a;
{
FILE * fd1;
char aa[256], *ap;
double x[256], *xp;
int n;
if ((fd1 = fopen(a + 1, "r")) == NULL) {
perror();
fprintf(stderr, "Cannot find %s\n", a + 1);
return(0);
}
xp = x;
while (fgets(aa, 256, fd1) != NULL) {
ap = aa;
while (*ap != NULL && *ap != '\n') {
while (isspace(*ap) || *ap == ',')
ap++;
if (*ap == NULL)
break;
*xp++ = atof(ap);
while (!(isspace(*ap)) && *ap != ',' && *ap != NULL)
ap++;
}
}
fclose(fd1);
}
char *getl(a)
char a[];
{
char *ap;
newl:
if(FN){
if (fgets(a, 256, fd) == NULL)
return(0);
if(*a == '\n')goto newl;
return(a);
} else {
if(**fstp == '\0'){
fstp--;
if(fstp == fstack){
SC = 1.;
FN = 1;
}
goto newl;
}
ap = *fstp;
*fstp = strchr(*fstp,'\n') +1;
return(ap);
}
}
spline(n1, f1)
int n1[];
double *f1[];
{
splin(0,n1,f1);
}
fspline(n1,f1)
int n1[];
double *f1[];
{
splin(1,n1,f1);
}
lspline(n1,f1)
int n1[];
double *f1[];
{
splin(2,n1,f1);
}
dspline(n1,f1)
int n1[];
double *f1[];
{
splin(3,n1,f1);
}
cspline(n1,f1)
int n1[];
double *f1[];
{
splin(4,n1,f1);
}