=================================================================== RCS file: /cvs/mandoc/Attic/dummy.c,v retrieving revision 1.3 retrieving revision 1.7 diff -u -p -r1.3 -r1.7 --- mandoc/Attic/dummy.c 2008/11/24 14:24:55 1.3 +++ mandoc/Attic/dummy.c 2008/11/26 16:50:34 1.7 @@ -1,4 +1,4 @@ -/* $Id: dummy.c,v 1.3 2008/11/24 14:24:55 kristaps Exp $ */ +/* $Id: dummy.c,v 1.7 2008/11/26 16:50:34 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -18,17 +18,114 @@ */ #include #include +#include #include +#include #include "libmdocml.h" #include "private.h" +#ifdef __linux__ +#define strlcat strncat +#endif +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 void dbg_prologue(const char *); +static void dbg_epilogue(void); + +static int dbg_lvl = 0; +static char dbg_line[72]; + struct md_dummy { struct rofftree *tree; + struct roffcb cb; }; +static void +dbg_prologue(const char *p) +{ + int i; + (void)snprintf(dbg_line, sizeof(dbg_line) - 1, "%6s", p); + (void)strlcat(dbg_line, ": ", sizeof(dbg_line) - 1); + /* LINTED */ + for (i = 0; i < dbg_lvl; i++) + (void)strlcat(dbg_line, " ", sizeof(dbg_line) - 1); +} + + +static void +dbg_epilogue(void) +{ + + assert(0 != dbg_line[0]); + (void)printf("%s\n", dbg_line); +} + + +static int +md_dummy_blk_in(int tok) +{ + + dbg_prologue("blk"); + (void)strlcat(dbg_line, toknames[tok], sizeof(dbg_line) - 1); + dbg_epilogue(); + + dbg_lvl++; + return(1); +} + + +static int +md_dummy_blk_out(int tok) +{ + + dbg_lvl--; + return(1); +} + + +/* ARGSUSED */ +static int +md_dummy_text_in(int tok, int *argcp, char **argvp) +{ + + dbg_prologue("text"); + (void)strlcat(dbg_line, toknames[tok], sizeof(dbg_line) - 1); + (void)strlcat(dbg_line, " ", sizeof(dbg_line) - 1); + while (ROFF_ARGMAX != *argcp) { + (void)strlcat(dbg_line, "[", sizeof(dbg_line) - 1); + (void)strlcat(dbg_line, tokargnames[*argcp], + sizeof(dbg_line) - 1); + if (*argvp) { + (void)strlcat(dbg_line, " [", + sizeof(dbg_line) - 1); + (void)strlcat(dbg_line, *argvp, + sizeof(dbg_line) - 1); + (void)strlcat(dbg_line, "]", + sizeof(dbg_line) - 1); + } + (void)strlcat(dbg_line, "]", sizeof(dbg_line) - 1); + argcp++; + argvp++; + } + dbg_epilogue(); + return(1); +} + + +static int +md_dummy_text_out(int tok) +{ + + return(1); +} + + int md_line_dummy(void *arg, char *buf, size_t sz) { @@ -64,7 +161,16 @@ md_init_dummy(const struct md_args *args, return(NULL); } - if (NULL == (p->tree = roff_alloc(args, mbuf, rbuf))) { + 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); }