#include #include #include "plot.h" #include "istack.h" #include "dirimpl.h" #include "dir-line.h" typedef struct priv PRIV; struct priv { int n; int err; double x1; double y1; double x2; double y2; } ; DIRRV dir_line(void **privp, DIROP op, ...) { va_list ap; PRIV *p; char *s; char c; double v; va_start(ap,op); switch (op) { default: abort(); break; case DIROP_INIT: p = malloc(sizeof(PRIV)); p->n = 0; p->err = 0; *privp = p; return(DIRRV_MORE); break; case DIROP_ARG: p = *privp; s = va_arg(ap,char *); if (s == 0) { switch (p->n++) { default: abort(); break; case 0: istack_err("missing X1 value"); break; case 1: istack_err("missing Y1 value"); break; case 2: istack_err("missing X2 value"); break; case 3: istack_err("missing Y2 value"); break; } free(p); return(DIRRV_NOMORE); } if (!p->err && (sscanf(s,"%lg%c",&v,&c) != 1)) { p->err = 1; switch (p->n) { case 0: istack_err("invalid X1 value"); break; case 1: istack_err("invalid Y1 value"); break; case 2: istack_err("invalid X2 value"); break; case 3: istack_err("invalid Y2 value"); break; default: abort(); break; } } if (p->err) { p->n ++; if (p->n < 4) return(DIRRV_MORE); free(p); return(DIRRV_NOMORE); } switch (p->n++) { case 0: p->x1 = v; break; case 1: p->y1 = v; break; case 2: p->x2 = v; break; case 3: p->y2 = v; break; } if (p->n > 3) { plot_line(p->x1,p->y1,p->x2,p->y2); free(p); return(DIRRV_NOMORE); } return(DIRRV_MORE); break; } va_end(ap); abort(); }