#include #include #include "plot.h" #include "istack.h" #include "dir-text.h" #include "text-flags.h" typedef struct priv PRIV; struct priv { int n; double x; double y; unsigned int flags; } ; DIRRV dir_text(void **privp, DIROP op, ...) { va_list ap; PRIV *p; double v; char c; char *s; va_start(ap,op); switch (op) { default: abort(); break; case DIROP_INIT: p = malloc(sizeof(PRIV)); p->n = 0; p->flags = TEXTFLAG_XF_NONE | TEXTFLAG_JUST_L | TEXTFLAG_X_L | TEXTFLAG_Y_BASE_LAST; *privp = p; return(DIRRV_MORE); break; case DIROP_ARG: p = *privp; s = va_arg(ap,char *); if (s == 0) { switch (p->n) { case 0: istack_err("missing X value"); break; case 1: istack_err("missing Y value"); break; default: istack_err("missing string"); break; } free(p); return(DIRRV_NOMORE); } else { switch (p->n) { case 0: case 1: if (sscanf(s,"%lg%c",&v,&c) != 1) { switch (p->n) { case 0: istack_err("invalid X value"); break; case 1: istack_err("invalid Y value"); break; default: abort(); break; } free(p); return(DIRRV_NOMORE); } switch (p->n) { case 0: p->x = v; break; case 1: p->y = v; break; default: abort(); break; } p->n ++; break; case 2: if (!strcmp(s,"rectbg")) { p->flags |= TEXTFLAG_RECTBG; } else if (!strcmp(s,"rot-cw")) { p->flags = (p->flags & ~TEXTFLAG_XF) | textflag_xf_compose(p->flags,TEXTFLAG_XF_ROT_CW); } else if (!strcmp(s,"rot-180")) { p->flags = (p->flags & ~TEXTFLAG_XF) | textflag_xf_compose(p->flags,TEXTFLAG_XF_ROT180); } else if (!strcmp(s,"rot-ccw")) { p->flags = (p->flags & ~TEXTFLAG_XF) | textflag_xf_compose(p->flags,TEXTFLAG_XF_ROT_CCW); } else if (!strcmp(s,"swap-x")) { p->flags = (p->flags & ~TEXTFLAG_XF) | textflag_xf_compose(p->flags,TEXTFLAG_XF_FLIP_X); } else if (!strcmp(s,"swap-y")) { p->flags = (p->flags & ~TEXTFLAG_XF) | textflag_xf_compose(p->flags,TEXTFLAG_XF_FLIP_Y); } else if (!strcmp(s,"swap-xy")) { p->flags = (p->flags & ~TEXTFLAG_XF) | textflag_xf_compose(p->flags,TEXTFLAG_XF_FLIP_XY); } else if (!strcmp(s,"swap-xmy")) { p->flags = (p->flags & ~TEXTFLAG_XF) | textflag_xf_compose(p->flags,TEXTFLAG_XF_FLIP_XMY); } else if (!strcmp(s,"ljust")) { p->flags = (p->flags & ~TEXTFLAG_JUST) | TEXTFLAG_JUST_L; } else if (!strcmp(s,"rjust")) { p->flags = (p->flags & ~TEXTFLAG_JUST) | TEXTFLAG_JUST_R; } else if (!strcmp(s,"centre") || !strcmp(s,"center")) { p->flags = (p->flags & ~TEXTFLAG_JUST) | TEXTFLAG_JUST_C; } else if (!strcmp(s,"ax-left")) { p->flags = (p->flags & ~TEXTFLAG_X) | TEXTFLAG_X_L; } else if (!strcmp(s,"ax-right")) { p->flags = (p->flags & ~TEXTFLAG_X) | TEXTFLAG_X_R; } else if (!strcmp(s,"ax-centre") || !strcmp(s,"ax-center")) { p->flags = (p->flags & ~TEXTFLAG_X) | TEXTFLAG_X_C; } else if (!strcmp(s,"ay-top")) { p->flags = (p->flags & ~TEXTFLAG_Y) | TEXTFLAG_Y_TOP; } else if (!strcmp(s,"ay-bottom")) { p->flags = (p->flags & ~TEXTFLAG_Y) | TEXTFLAG_Y_BOTTOM; } else if (!strcmp(s,"ay-baseline")) { p->flags = (p->flags & ~TEXTFLAG_Y) | TEXTFLAG_Y_BASE_LAST; } else if (!strcmp(s,"ay-topbase")) { p->flags = (p->flags & ~TEXTFLAG_Y) | TEXTFLAG_Y_BASE_FIRST; } else if (!strcmp(s,"ay-centre") || !strcmp(s,"ay-center")) { p->flags = (p->flags & ~TEXTFLAG_Y) | TEXTFLAG_Y_CENTRE; } else if (!strcmp(s,"ay-centrebase") || !strcmp(s,"ay-centerbase")) { p->flags = (p->flags & ~TEXTFLAG_Y) | TEXTFLAG_Y_CENTREBASE; } else if (!strcmp(s,"bboxmargin")) { p->flags |= TEXTFLAG_BBOXMARGIN; } else if (!strcmp(s,"no-auto-swap")) { p->flags |= TEXTFLAG_NO_AUTO_SWAP; } else if (!strcmp(s,"string")) { p->n = 3; } else { case 3: plot_text(s,p->x,p->y,p->flags); free(p); return(DIRRV_NOMORE); } break; } return(DIRRV_MORE); } break; } va_end(ap); abort(); }