#include #include #include #include "irdr.h" #include "dirimpl.h" #include "directive.h" typedef struct directive DIRECTIVE; struct directive { const char *name; DIRRV (*impl)(void **, DIROP, ...); } ; #include "dir-fg.h" #include "dir-bg.h" #include "dir-op.h" #include "dir-end.h" #include "dir-read.h" #include "dir-font.h" #include "dir-text.h" #include "dir-rect.h" #include "dir-size.h" #include "dir-line.h" #include "dir-type.h" #include "dir-clear.h" #include "dir-scale.h" #include "dir-point.h" #include "dir-output.h" #include "dir-window.h" #include "dir-clipwin.h" #include "dir-scalewin.h" static DIRECTIVE directives[] = { { "read", &dir_read }, { "end", &dir_end }, { "clear", &dir_clear }, { "size", &dir_size }, { "scale", &dir_scale }, { "fg", &dir_fg }, { "op", &dir_op }, { "type", &dir_type }, { "point", &dir_point }, { "line", &dir_line }, { "rect", &dir_rect }, { "output", &dir_output }, { "window", &dir_window }, { "clipwin", &dir_clipwin }, { "scalewin", &dir_scalewin }, { "bg", &dir_bg }, { "font", &dir_font }, { "text", &dir_text }, { 0 } }; int lookup_directive(const char *s) { int i; for (i=0;directives[i].name;i++) { if (!strcmp(s,directives[i].name)) return(i); } return(DIR_NONE); } void dir_process(int dir, void (*next)(void *, TOKEN *), void *arg) { int more; TOKEN t; void *priv; more = (*directives[dir].impl)(&priv,DIROP_INIT); while (1) { switch (more) { case DIRRV_MORE: break; case DIRRV_NOMORE: return; break; default: abort(); break; } (*next)(arg,&t); switch (t.type) { case TT_EOF: case TT_SEP: (*directives[dir].impl)(&priv,DIROP_ARG,(char *)0); return; break; case TT_STR: more = (*directives[dir].impl)(&priv,DIROP_ARG,t.str); break; default: abort(); break; } } }