#include #include #include "plot.h" #include "istack.h" #include "dirimpl.h" #include "dir-bg.h" typedef struct priv PRIV; struct priv { int n; int err; unsigned int bg; } ; DIRRV dir_bg(void **privp, DIROP op, ...) { va_list ap; PRIV *p; char *s; char c; unsigned int 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 R value"); if (0) { case 2: istack_err("missing B value"); } free(p); return(DIRRV_NOMORE); break; case 1: break; } if (! p->err) plot_bg(p->bg); free(p); return(DIRRV_NOMORE); } if (!p->err && (sscanf(s,"%u%c",&v,&c) != 1)) { p->err = 1; switch (p->n) { case 0: istack_err("invalid R value"); break; case 1: istack_err("invalid G value"); break; case 2: istack_err("invalid B value"); break; default: abort(); break; } } if (p->err) { p->n ++; if (p->n < 3) return(DIRRV_MORE); free(p); return(DIRRV_NOMORE); } if (v > 255) { switch (p->n) { case 0: istack_err("invalid R value"); break; case 1: istack_err("invalid G value"); break; case 2: istack_err("invalid B value"); break; } p->err = 1; if (p->n < 2) return(DIRRV_MORE); free(p); return(DIRRV_NOMORE); } switch (p->n++) { case 0: p->bg = v * 0x010101; break; case 1: p->bg = (p->bg & 255) | (v << 8); break; case 2: p->bg |= v << 16; break; } if (p->n > 2) { plot_bg(p->bg); free(p); return(DIRRV_NOMORE); } return(DIRRV_MORE); break; } va_end(ap); abort(); }