#include #include #include #include "istack.h" #include "dirimpl.h" #include "xmin-xmax-ymin-ymax.h" typedef struct privf PRIVF; typedef struct privi PRIVI; struct privf { int n; int err; double xmin; double xmax; double ymin; double ymax; } ; struct privi { int n; int err; int xmin; int xmax; int ymin; int ymax; } ; DIRRV dir__xmin_xmax_ymin_ymax_float(void **privp, DIROP op, VALIST *ap, void (*done)(double, double, double, double), void (*def)(void)) { PRIVF *p; char *s; char c; double v; switch (op) { default: abort(); break; case DIROP_INIT: p = malloc(sizeof(PRIVF)); p->n = 0; p->err = 0; *privp = p; return(DIRRV_MORE); break; case DIROP_ARG: p = *privp; s = va_arg(ap->ap,char *); if (s == 0) { switch (p->n++) { default: abort(); break; case 0: istack_err("missing min X value"); break; case 1: istack_err("missing max X value"); break; case 2: istack_err("missing min Y value"); break; case 3: istack_err("missing max Y value"); break; } free(p); return(DIRRV_NOMORE); } if ((p->n == 0) && !strcmp(s,"default")) { (*def)(); return(DIRRV_NOMORE); } if (!p->err && (sscanf(s,"%lg%c",&v,&c) != 1)) { p->err = 1; switch (p->n) { case 0: istack_err("invalid min X value"); break; case 1: istack_err("invalid max X value"); break; case 2: istack_err("invalid min Y value"); break; case 3: istack_err("invalid max Y 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->xmin = v; break; case 1: p->xmax = v; break; case 2: p->ymin = v; break; case 3: p->ymax = v; break; } if (p->n > 3) { (*done)(p->xmin,p->xmax,p->ymin,p->ymax); free(p); return(DIRRV_NOMORE); } return(DIRRV_MORE); break; } abort(); } DIRRV dir__xmin_xmax_ymin_ymax_int(void **privp, DIROP op, VALIST *ap, void (*done)(int, int, int, int), void (*def)(void)) { PRIVI *p; char *s; char c; int v; switch (op) { default: abort(); break; case DIROP_INIT: p = malloc(sizeof(PRIVI)); p->n = 0; p->err = 0; *privp = p; return(DIRRV_MORE); break; case DIROP_ARG: p = *privp; s = va_arg(ap->ap,char *); if (s == 0) { switch (p->n++) { default: abort(); break; case 0: istack_err("missing min X value"); break; case 1: istack_err("missing max X value"); break; case 2: istack_err("missing min Y value"); break; case 3: istack_err("missing max Y value"); break; } free(p); return(DIRRV_NOMORE); } if ((p->n == 0) && !strcmp(s,"default")) { (*def)(); return(DIRRV_NOMORE); } if (!p->err && (sscanf(s,"%d%c",&v,&c) != 1)) { p->err = 1; switch (p->n) { case 0: istack_err("invalid min X value"); break; case 1: istack_err("invalid max X value"); break; case 2: istack_err("invalid min Y value"); break; case 3: istack_err("invalid max Y 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->xmin = v; break; case 1: p->xmax = v; break; case 2: p->ymin = v; break; case 3: p->ymax = v; break; } if (p->n > 3) { (*done)(p->xmin,p->xmax,p->ymin,p->ymax); free(p); return(DIRRV_NOMORE); } return(DIRRV_MORE); break; } abort(); }