diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-04-07 11:25:38 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-04-07 11:25:38 +0000 |
commit | 84656c571204bca5fbcfe0ff94a6e39739bd404b (patch) | |
tree | 36337e7317266c2466c8fabc3ae37308e7923abf /out.c | |
parent | 203a7fc981fef187b30804a2cab03e1d993e9152 (diff) | |
download | mandoc-84656c571204bca5fbcfe0ff94a6e39739bd404b.tar.gz |
Add support/ignoring of \f(xy, \f[X...], \F(xy, \FX, \F[X...] roff-style font escapes (noted by Frantisek Holop).
Diffstat (limited to 'out.c')
-rw-r--r-- | out.c | 146 |
1 files changed, 94 insertions, 52 deletions
@@ -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); } |