From 21b465225d10f259e1380db89c1f075eba6ed764 Mon Sep 17 00:00:00 2001 From: schwarze Date: Thu, 22 Jun 2017 00:30:06 +0000 Subject: [PATCH] Fix font selection for text boxes in the terminal formatter. Issue reported by bentley@. The AST data structure is powerful enough that all required information can easily be provided in the parser, and no change of the formatting code is needed. --- usr.bin/mandoc/eqn.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/usr.bin/mandoc/eqn.c b/usr.bin/mandoc/eqn.c index 071bb8ee904..eb94a083043 100644 --- a/usr.bin/mandoc/eqn.c +++ b/usr.bin/mandoc/eqn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eqn.c,v 1.29 2017/06/21 20:47:46 schwarze Exp $ */ +/* $OpenBSD: eqn.c,v 1.30 2017/06/22 00:30:06 schwarze Exp $ */ /* * Copyright (c) 2011, 2014 Kristaps Dzonsons * Copyright (c) 2014, 2015, 2017 Ingo Schwarze @@ -82,6 +82,8 @@ enum eqn_tok { EQN_TOK_ABOVE, EQN_TOK__MAX, EQN_TOK_FUNC, + EQN_TOK_QUOTED, + EQN_TOK_SYM, EQN_TOK_EOF }; @@ -515,7 +517,7 @@ eqn_tok_parse(struct eqn_node *ep, char **p) if (quoted) { if (p != NULL) *p = mandoc_strndup(start, sz); - return EQN_TOK__MAX; + return EQN_TOK_QUOTED; } for (i = 0; i < EQN_TOK__MAX; i++) @@ -526,7 +528,7 @@ eqn_tok_parse(struct eqn_node *ep, char **p) if (STRNEQ(start, sz, eqnsyms[i].str, strlen(eqnsyms[i].str))) { mandoc_asprintf(p, "\\[%s]", eqnsyms[i].sym); - return EQN_TOK__MAX; + return EQN_TOK_SYM; } } @@ -1082,8 +1084,10 @@ this_tok: * TODO: make sure we're not in an open subexpression. */ return ROFF_EQN; - case EQN_TOK_FUNC: case EQN_TOK__MAX: + case EQN_TOK_FUNC: + case EQN_TOK_QUOTED: + case EQN_TOK_SYM: assert(p != NULL); /* * If we already have something in the stack and we're @@ -1110,17 +1114,27 @@ this_tok: cur->text = p; /* * If not inside any explicit font context, - * give every letter its own box. + * quoted strings become italic, and every letter + * of a bare string gets its own italic box. */ - if (fontp == NULL && *p != '\0') { + do { + if (fontp != NULL || *p == '\0' || + tok == EQN_TOK_SYM) + break; + if (tok == EQN_TOK_QUOTED) { + cur->font = EQNFONT_ITALIC; + break; + } cp = p; for (;;) { + if (isalpha((unsigned char)*cp)) + cur->font = EQNFONT_ITALIC; cpn = cp + 1; if (*cp == '\\') mandoc_escape(&cpn, NULL, NULL); if (*cpn == '\0') break; - if (isalpha((unsigned char)*cp) == 0 && + if (cur->font != EQNFONT_ITALIC && isalpha((unsigned char)*cpn) == 0) { cp = cpn; continue; @@ -1135,7 +1149,7 @@ this_tok: cur = nbox; cp = nbox->text; } - } + } while (0); /* * Post-process list status. */ -- 2.20.1