=================================================================== RCS file: /cvs/mandoc/out.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -p -r1.13 -r1.14 --- mandoc/out.c 2010/04/07 07:49:38 1.13 +++ mandoc/out.c 2010/04/07 11:25:38 1.14 @@ -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,17 +298,26 @@ a2roffdeco(enum roffdeco *d, return(4); case ('['): - offs = 1; - break; + *word = ++wp; + for (j = 0; *wp && ']' != *wp; wp++, j++) + /* Loop... */ ; - default: + if ('\0' == *wp) + return(j + 2); + *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; if ('\0' == *(++wp)) @@ -300,59 +371,30 @@ 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; *sz = 1; 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); }