diff options
-rw-r--r-- | mandoc.c | 8 | ||||
-rw-r--r-- | out.c | 146 | ||||
-rw-r--r-- | out.h | 2 |
3 files changed, 100 insertions, 56 deletions
@@ -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); @@ -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); } @@ -45,6 +45,8 @@ enum roffdeco { DECO_PREVIOUS, DECO_SIZE, DECO_NOSPACE, + DECO_FONT, /* font */ + DECO_FFONT, /* font family */ DECO_MAX }; |