=================================================================== RCS file: /cvs/mandoc/out.c,v retrieving revision 1.33 retrieving revision 1.37 diff -u -p -r1.33 -r1.37 --- mandoc/out.c 2011/01/10 14:40:30 1.33 +++ mandoc/out.c 2011/01/30 16:05:37 1.37 @@ -1,6 +1,7 @@ -/* $Id: out.c,v 1.33 2011/01/10 14:40:30 kristaps Exp $ */ +/* $Id: out.c,v 1.37 2011/01/30 16:05:37 schwarze Exp $ */ /* - * Copyright (c) 2009, 2010 Kristaps Dzonsons + * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons + * Copyright (c) 2011 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -251,6 +252,49 @@ a2roffdeco(enum roffdeco *d, const char **word, size_t break; } break; + + case ('N'): + + /* + * Sequence of characters: backslash, 'N' (i = 0), + * starting delimiter (i = 1), character number (i = 2). + */ + + *word = wp + 2; + *sz = 0; + + /* + * Cannot use a digit as a starting delimiter; + * but skip the digit anyway. + */ + + if (isdigit((int)wp[1])) + return(2); + + /* + * Any non-digit terminates the character number. + * That is, the terminating delimiter need not + * match the starting delimiter. + */ + + for (i = 2; isdigit((int)wp[i]); i++) + (*sz)++; + + /* + * This is only a numbered character + * if the character number has at least one digit. + */ + + if (*sz) + *d = DECO_NUMBERED; + + /* + * Skip the terminating delimiter, even if it does not + * match, and even if there is no character number. + */ + + return(++i); + case ('h'): /* FALLTHROUGH */ case ('v'): @@ -453,6 +497,8 @@ tblcalc_data(struct rofftbl *tbl, struct roffcol *col, case (TBL_CELL_NUMBER): tblcalc_number(tbl, col, tp, dp); break; + case (TBL_CELL_DOWN): + break; default: abort(); /* NOTREACHED */ @@ -464,6 +510,7 @@ tblcalc_literal(struct rofftbl *tbl, struct roffcol *c const struct tbl_dat *dp) { size_t sz, bufsz, spsz; + const char *str; /* * Calculate our width and use the spacing, with a minimum @@ -471,16 +518,18 @@ tblcalc_literal(struct rofftbl *tbl, struct roffcol *c * either side, while right/left get a single adjacent space). */ - sz = bufsz = spsz = 0; - if (dp->string) - sz = (*tbl->slen)(dp->string, tbl->arg); + bufsz = spsz = 0; + str = dp->string ? dp->string : ""; + sz = (*tbl->slen)(str, tbl->arg); + /* FIXME: TBL_DATA_HORIZ et al.? */ + assert(dp->layout); switch (dp->layout->pos) { case (TBL_CELL_LONG): /* FALLTHROUGH */ case (TBL_CELL_CENTRE): - bufsz = (*tbl->len)(2, tbl->arg); + bufsz = (*tbl->len)(1, tbl->arg); break; default: bufsz = (*tbl->len)(1, tbl->arg); @@ -502,9 +551,9 @@ tblcalc_number(struct rofftbl *tbl, struct roffcol *co const struct tbl *tp, const struct tbl_dat *dp) { int i; - size_t sz, psz, ssz, d, max; - char *cp; + size_t sz, psz, ssz, d; const char *str; + char *cp; char buf[2]; /* @@ -516,11 +565,11 @@ tblcalc_number(struct rofftbl *tbl, struct roffcol *co * Finally, re-assign the stored values. */ - str = dp && dp->string ? dp->string : ""; - max = dp && dp->layout ? dp->layout->spacing : 0; - + str = dp->string ? dp->string : ""; sz = (*tbl->slen)(str, tbl->arg); + /* FIXME: TBL_DATA_HORIZ et al.? */ + buf[0] = tp->decimal; buf[1] = '\0'; @@ -556,8 +605,8 @@ tblcalc_number(struct rofftbl *tbl, struct roffcol *co /* Adjust for stipulated width. */ - if (col->width < max) - col->width = max; + if (col->width < dp->layout->spacing) + col->width = dp->layout->spacing; }