From ac0babc62f7cea46ace617a6bd1be66bef058f3f Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Wed, 7 Apr 2010 11:25:38 +0000 Subject: Add support/ignoring of \f(xy, \f[X...], \F(xy, \FX, \F[X...] roff-style font escapes (noted by Frantisek Holop). --- mandoc.c | 10 ++--- out.c | 148 ++++++++++++++++++++++++++++++++++++++++----------------------- out.h | 4 +- 3 files changed, 103 insertions(+), 59 deletions(-) diff --git a/mandoc.c b/mandoc.c index 3bdb171b..17d6d103 100644 --- a/mandoc.c +++ b/mandoc.c @@ -1,4 +1,4 @@ -/* $Id: mandoc.c,v 1.10 2010/01/05 19:51:10 kristaps Exp $ */ +/* $Id: mandoc.c,v 1.11 2010/04/07 11:25:38 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -73,10 +73,6 @@ mandoc_special(const char *p) return(2); case ('e'): return(2); - case ('f'): - if ('\0' == *++p || ! isgraph((u_char)*p)) - return(0); - return(3); case ('s'): if ('\0' == *++p) return(2); @@ -152,6 +148,10 @@ mandoc_special(const char *p) } return(c); + case ('f'): + /* FALLTHROUGH */ + case ('F'): + /* FALLTHROUGH */ case ('*'): if (0 == *++p || ! isgraph((u_char)*p)) return(0); diff --git a/out.c b/out.c index c3161e58..d58123cf 100644 --- a/out.c +++ b/out.c @@ -1,4 +1,4 @@ -/* $Id: out.c,v 1.13 2010/04/07 07:49:38 kristaps Exp $ */ +/* $Id: out.c,v 1.14 2010/04/07 11:25:38 kristaps Exp $ */ /* * Copyright (c) 2009 Kristaps Dzonsons * @@ -198,13 +198,14 @@ a2roffdeco(enum roffdeco *d, const char **word, size_t *sz) { int j, offs, term, lim; + char set; const char *wp, *sp; *d = DECO_NONE; wp = *word; offs = 0; - switch (*wp) { + switch ((set = *wp)) { case ('\0'): return(0); @@ -219,6 +220,67 @@ a2roffdeco(enum roffdeco *d, *word = wp; return(3); + case ('F'): + /* FALLTHROUGH */ + case ('f'): + /* + * FIXME: this needs work and consolidation (it should + * follow the sequence that special characters do, for + * one), but isn't a priority at the moment. Note, for + * one, that in reality \fB != \FB, although here we let + * these slip by. + */ + switch (*(++wp)) { + case ('\0'): + return(1); + case ('3'): + /* FALLTHROUGH */ + case ('B'): + *d = DECO_BOLD; + return(2); + case ('2'): + /* FALLTHROUGH */ + case ('I'): + *d = DECO_ITALIC; + return(2); + case ('P'): + *d = DECO_PREVIOUS; + return(2); + case ('1'): + /* FALLTHROUGH */ + case ('R'): + *d = DECO_ROMAN; + return(2); + case ('('): + if ('\0' == *(++wp)) + return(2); + if ('\0' == *(wp + 1)) + return(3); + + *d = 'F' == set ? DECO_FFONT : DECO_FONT; + *sz = 2; + *word = wp; + return(4); + case ('['): + *word = ++wp; + for (j = 0; *wp && ']' != *wp; wp++, j++) + /* Loop... */ ; + + if ('\0' == *wp) + return(j + 2); + + *d = 'F' == set ? DECO_FFONT : DECO_FONT; + *sz = (size_t)j; + return(j + 3); + default: + break; + } + + *d = 'F' == set ? DECO_FFONT : DECO_FONT; + *sz = 1; + *word = wp; + return(2); + case ('*'): switch (*(++wp)) { case ('\0'): @@ -236,16 +298,25 @@ a2roffdeco(enum roffdeco *d, return(4); case ('['): - offs = 1; - break; + *word = ++wp; + for (j = 0; *wp && ']' != *wp; wp++, j++) + /* Loop... */ ; + + if ('\0' == *wp) + return(j + 2); - default: *d = DECO_RESERVED; - *sz = 1; - *word = wp; - return(2); + *sz = (size_t)j; + return(j + 3); + + default: + break; } - break; + + *d = DECO_RESERVED; + *sz = 1; + *word = wp; + return(2); case ('s'): sp = wp; @@ -300,36 +371,18 @@ a2roffdeco(enum roffdeco *d, *d = DECO_SIZE; return((int)(wp - sp)); - case ('f'): - switch (*(++wp)) { - case ('\0'): - return(1); - case ('3'): - /* FALLTHROUGH */ - case ('B'): - *d = DECO_BOLD; - break; - case ('2'): - /* FALLTHROUGH */ - case ('I'): - *d = DECO_ITALIC; - break; - case ('P'): - *d = DECO_PREVIOUS; - break; - case ('1'): - /* FALLTHROUGH */ - case ('R'): - *d = DECO_ROMAN; - break; - default: - break; - } + case ('['): + *word = ++wp; - return(2); + for (j = 0; *wp && ']' != *wp; wp++, j++) + /* Loop... */ ; - case ('['): - break; + if ('\0' == *wp) + return(j + 1); + + *d = DECO_SPECIAL; + *sz = (size_t)j; + return(j + 2); case ('c'): *d = DECO_NOSPACE; @@ -337,22 +390,11 @@ a2roffdeco(enum roffdeco *d, return(1); default: - *d = DECO_SPECIAL; - *word = wp; - *sz = 1; - return(1); + break; } - *word = ++wp; - - for (j = 0; *wp && ']' != *wp; wp++, j++) - /* Loop... */ ; - - if ('\0' == *wp) - return(j + 1 + offs); - - *d = offs ? DECO_RESERVED : DECO_SPECIAL; - *sz = (size_t)j; - - return (j + 2 + offs); + *d = DECO_SPECIAL; + *word = wp; + *sz = 1; + return(1); } diff --git a/out.h b/out.h index 9ace7117..b5eb7c81 100644 --- a/out.h +++ b/out.h @@ -1,4 +1,4 @@ -/* $Id: out.h,v 1.9 2009/11/12 08:21:05 kristaps Exp $ */ +/* $Id: out.h,v 1.10 2010/04/07 11:25:38 kristaps Exp $ */ /* * Copyright (c) 2009 Kristaps Dzonsons * @@ -45,6 +45,8 @@ enum roffdeco { DECO_PREVIOUS, DECO_SIZE, DECO_NOSPACE, + DECO_FONT, /* font */ + DECO_FFONT, /* font family */ DECO_MAX }; -- cgit v1.2.3-56-ge451