#include #include #include #include "plot.h" #include "istack.h" #include "dirimpl.h" #include "dir-size.h" typedef struct priv PRIV; struct priv { int err; int n; unsigned int x; unsigned int y; } ; DIRRV dir_size(void **privp, DIROP op, ...) { va_list ap; PRIV *p; char *s; char c; unsigned int v; unsigned int *vp; const char *desc; va_start(ap,op); switch (op) { case DIROP_INIT: p = malloc(sizeof(PRIV)); p->err = 0; p->n = 0; *privp = p; return(DIRRV_MORE); break; case DIROP_ARG: p = *privp; s = va_arg(ap,char *); switch (p->n++) { case 0: vp = &p->x; desc = "X"; break; case 1: vp = &p->y; desc = "Y"; break; default: abort(); break; } if (! s) { istack_err("missing %s size",desc); free(p); return(DIRRV_NOMORE); } if ((p->n == 0) && !strcmp(s,"same")) { plot_justclear(0); free(p); return(DIRRV_NOMORE); } if (! p->err) { if (sscanf(s,"%u%c",&v,&c) != 1) { istack_err("invalid %s size",desc); p->err = 1; return(DIRRV_MORE); } *vp = v; } if (p->n > 1) { if (! p->err) plot_clear(p->x,p->y,0); free(p); return(DIRRV_NOMORE); } return(DIRRV_MORE); break; } va_end(ap); abort(); }