=================================================================== RCS file: /cvs/mandoc/Attic/mlg.c,v retrieving revision 1.24 retrieving revision 1.28 diff -u -p -r1.24 -r1.28 --- mandoc/Attic/mlg.c 2008/12/10 00:52:46 1.24 +++ mandoc/Attic/mlg.c 2008/12/10 13:41:58 1.28 @@ -1,4 +1,4 @@ -/* $Id: mlg.c,v 1.24 2008/12/10 00:52:46 kristaps Exp $ */ +/* $Id: mlg.c,v 1.28 2008/12/10 13:41:58 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -33,7 +33,7 @@ enum md_tok { MD_INLINE_IN, MD_INLINE_OUT, MD_BLK_IN, - MD_BLK_OUT, + MD_BLK_OUT }; struct md_mlg { @@ -58,8 +58,10 @@ static int mlg_roffmsg(void *arg, const char *, const char *); static int mlg_roffhead(void *, const struct tm *, const char *, const char *, - enum roffmsec, const char *); -static int mlg_rofftail(void *); + enum roffmsec, enum roffvol); +static int mlg_rofftail(void *, const struct tm *, + const char *, const char *, + enum roffmsec, enum roffvol); static int mlg_roffin(void *, int, int *, const char **); static int mlg_roffdata(void *, int, @@ -90,6 +92,10 @@ static int mlg_function_special(struct md_mlg *, const char *, const char **); static int mlg_atom_special(struct md_mlg *, int, const char *, const char **); +static int mlg_link_special(struct md_mlg *, int, + const char *, const char **); +static int mlg_anchor_special(struct md_mlg *, + int, const char **); static int mlg_begintag(struct md_mlg *, enum md_ns, int, int *, const char **); @@ -404,7 +410,7 @@ mlg_alloc(const struct md_args *args, static int mlg_roffhead(void *arg, const struct tm *tm, const char *os, - const char *title, enum roffmsec sec, const char *vol) + const char *title, enum roffmsec sec, enum roffvol vol) { struct md_mlg *p; @@ -413,7 +419,8 @@ mlg_roffhead(void *arg, const struct tm *tm, const cha mlg_mode(p, MD_BLK_IN); - if ( ! (*p->cbs.ml_begin)(p->mbuf, p->args, tm, os, title, sec, vol)) + if ( ! (*p->cbs.ml_begin)(p->mbuf, p->args, + tm, os, title, sec, vol)) return(0); p->indent++; @@ -422,7 +429,8 @@ mlg_roffhead(void *arg, const struct tm *tm, const cha static int -mlg_rofftail(void *arg) +mlg_rofftail(void *arg, const struct tm *tm, const char *os, + const char *title, enum roffmsec sec, enum roffvol vol) { struct md_mlg *p; @@ -433,11 +441,11 @@ mlg_rofftail(void *arg) if ( ! mlg_newline(p)) return(0); - if ( ! (*p->cbs.ml_end)(p->mbuf, p->args)) + if ( ! (*p->cbs.ml_end)(p->mbuf, p->args, + tm, os, title, sec, vol)) return(0); mlg_mode(p, MD_BLK_OUT); - return(mlg_newline(p)); } @@ -494,6 +502,7 @@ mlg_ref_special(struct md_mlg *p, int tok, } +/* ARGSUSED */ static int mlg_formatted_special(struct md_mlg *p, int tok, const char *start, const int *argc, const char **argv, const char **more) @@ -529,7 +538,6 @@ mlg_atom_special(struct md_mlg *p, int tok, if ( ! mlg_string(p, start, *more++)) return(0); - /*assert(NULL == *more);*/ /* FIXME: ROFF_Sx */ return(mlg_endtag(p, MD_NS_INLINE, tok)); } @@ -578,6 +586,34 @@ mlg_function_special(struct md_mlg *p, } +static int +mlg_anchor_special(struct md_mlg *p, int tok, const char **more) +{ + if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more)) + return(0); + return(mlg_endtag(p, MD_NS_INLINE, tok)); +} + + +static int +mlg_link_special(struct md_mlg *p, int tok, + const char *start, const char **more) +{ + + if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more)) + return(0); + if ( ! mlg_string(p, start, *more++)) + return(0); + while (*more) { + if ( ! mlg_string(p, start, " ")) + return(0); + if ( ! mlg_string(p, start, *more++)) + return(0); + } + return(mlg_endtag(p, MD_NS_INLINE, tok)); +} + + /* ARGSUSED */ static int mlg_roffspecial(void *arg, int tok, const char *start, @@ -606,9 +642,13 @@ mlg_roffspecial(void *arg, int tok, const char *start, case (ROFF_Xr): return(mlg_ref_special(p, tok, start, more)); + + case (ROFF_Sh): + return(mlg_anchor_special(p, tok, more)); - case (ROFF_Sx): /* FIXME */ - /* FALLTHROUGH */ + case (ROFF_Sx): + return(mlg_link_special(p, tok, start, more)); + case (ROFF_Nm): return(mlg_atom_special(p, tok, start, more));