summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2017-06-22 00:30:07 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2017-06-22 00:30:07 +0000
commitcac4d2d39bd3043c6f8ea358b2b3d7f6b933e2c6 (patch)
treec2f7bca603709a63b2fc2492827542e1c6c6e68e /usr.bin
parentc9c83e973c35038d88e6b2f57642d842a8085616 (diff)
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.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/mandoc/eqn.c30
1 files 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 <kristaps@bsd.lv>
* Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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.
*/