diff options
-rw-r--r-- | dummy.c | 139 | ||||
-rw-r--r-- | private.h | 1 | ||||
-rw-r--r-- | roff.c | 21 |
3 files changed, 104 insertions, 57 deletions
@@ -33,6 +33,9 @@ static int md_dummy_blk_in(int); static int md_dummy_blk_out(int); static int md_dummy_text_in(int, int *, char **); static int md_dummy_text_out(int); +static int md_dummy_special(int); +static int md_dummy_head(void); +static int md_dummy_tail(void); static void dbg_prologue(const char *); static void dbg_epilogue(void); @@ -45,6 +48,61 @@ struct md_dummy { struct roffcb cb; }; + +int +md_line_dummy(void *arg, char *buf, size_t sz) +{ + struct md_dummy *p; + + p = (struct md_dummy *)arg; + return(roff_engine(p->tree, buf, sz)); +} + + +int +md_exit_dummy(void *data, int flush) +{ + int c; + struct md_dummy *p; + + p = (struct md_dummy *)data; + c = roff_free(p->tree, flush); + free(p); + + return(c); +} + + +void * +md_init_dummy(const struct md_args *args, + struct md_mbuf *mbuf, const struct md_rbuf *rbuf) +{ + struct md_dummy *p; + + if (NULL == (p = malloc(sizeof(struct md_dummy)))) { + warn("malloc"); + return(NULL); + } + + p->cb.roffhead = md_dummy_head; + p->cb.rofftail = md_dummy_tail; + p->cb.roffin = md_dummy_text_in; + p->cb.roffout = md_dummy_text_out; + p->cb.roffblkin = md_dummy_blk_in; + p->cb.roffblkout = md_dummy_blk_out; + p->cb.roffspecial = md_dummy_special; + + p->tree = roff_alloc(args, mbuf, rbuf, &p->cb); + + if (NULL == p->tree) { + free(p); + return(NULL); + } + + return(p); +} + + static void dbg_prologue(const char *p) { @@ -68,6 +126,34 @@ dbg_epilogue(void) static int +md_dummy_head(void) +{ + + return(1); +} + + +static int +md_dummy_tail(void) +{ + + return(1); +} + + +static int +md_dummy_special(int tok) +{ + + dbg_prologue("noop"); + (void)strlcat(dbg_line, toknames[tok], sizeof(dbg_line) - 1); + dbg_epilogue(); + + return(1); +} + + +static int md_dummy_blk_in(int tok) { @@ -124,56 +210,3 @@ md_dummy_text_out(int tok) return(1); } - - -int -md_line_dummy(void *arg, char *buf, size_t sz) -{ - struct md_dummy *p; - - p = (struct md_dummy *)arg; - return(roff_engine(p->tree, buf, sz)); -} - - -int -md_exit_dummy(void *data, int flush) -{ - int c; - struct md_dummy *p; - - p = (struct md_dummy *)data; - c = roff_free(p->tree, flush); - free(p); - - return(c); -} - - -void * -md_init_dummy(const struct md_args *args, - struct md_mbuf *mbuf, const struct md_rbuf *rbuf) -{ - struct md_dummy *p; - - if (NULL == (p = malloc(sizeof(struct md_dummy)))) { - warn("malloc"); - return(NULL); - } - - p->cb.roffhead = NULL; - p->cb.rofftail = NULL; - p->cb.roffin = md_dummy_text_in; - p->cb.roffout = md_dummy_text_out; - p->cb.roffblkin = md_dummy_blk_in; - p->cb.roffblkout = md_dummy_blk_out; - - p->tree = roff_alloc(args, mbuf, rbuf, &p->cb); - - if (NULL == p->tree) { - free(p); - return(NULL); - } - - return(p); -} @@ -215,6 +215,7 @@ struct roffcb { int (*roffout)(int); int (*roffblkin)(int); int (*roffblkout)(int); + int (*roffspecial)(int); }; __BEGIN_DECLS @@ -35,7 +35,9 @@ /* FIXME: ; : } ) (etc.) after text macros? */ -#define ROFF_MAXARG 10 +/* FIXME: NAME section needs specific elements. */ + +#define ROFF_MAXARG 32 enum roffd { ROFF_ENTER = 0, @@ -45,7 +47,8 @@ enum roffd { enum rofftype { ROFF_COMMENT, ROFF_TEXT, - ROFF_LAYOUT + ROFF_LAYOUT, + ROFF_SPECIAL }; #define ROFFCALL_ARGS \ @@ -107,6 +110,7 @@ static int roff_layout(ROFFCALL_ARGS); static int roff_text(ROFFCALL_ARGS); static int roff_comment(ROFFCALL_ARGS); static int roff_close(ROFFCALL_ARGS); +static int roff_special(ROFFCALL_ARGS); static struct roffnode *roffnode_new(int, struct rofftree *); static void roffnode_free(int, struct rofftree *); @@ -224,7 +228,7 @@ static const struct rofftok tokens[ROFF_MAX] = { { NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Bq */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bsx */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bx */ - { NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Db */ /* XXX */ + {roff_special, NULL, NULL, NULL, 0, ROFF_SPECIAL, 0 }, /* Db */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dc */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Do */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dq */ @@ -251,7 +255,7 @@ static const struct rofftok tokens[ROFF_MAX] = { { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sc */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* So */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sq */ - { NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Sm */ + {roff_special, NULL, NULL, NULL, 0, ROFF_SPECIAL, 0 }, /* Sm */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sx */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sy */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Tn */ @@ -1110,3 +1114,12 @@ roff_close(ROFFCALL_ARGS) return(1); } + + +/* ARGSUSED */ +static int +roff_special(ROFFCALL_ARGS) +{ + + return((*tree->cb->roffspecial)(tok)); +} |