#include #include #include "plot.h" #include "istack.h" #include "dirimpl.h" #include "dir-point.h" typedef struct priv PRIV; struct priv { int n; int err; double x; double y; } ; DIRRV dir_point(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 X value"); break; case 1: istack_err("missing Y 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 X value"); break; case 1: istack_err("invalid Y value"); break; default: abort(); break; } } if (p->err) { p->n ++; if (p->n < 2) return(DIRRV_MORE); free(p); return(DIRRV_NOMORE); } switch (p->n++) { case 0: p->x = v; break; case 1: p->y = v; break; } if (p->n > 1) { plot_point(p->x,p->y); free(p); return(DIRRV_NOMORE); } return(DIRRV_MORE); break; } va_end(ap); abort(); }