aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/eqn.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-07-21 13:18:24 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-07-21 13:18:24 +0000
commita81f461489b2bf2b5e7068e28199fb91696818b5 (patch)
treef27c5d398f34a45ea9a214ddc08378b786b05239 /eqn.c
parentc5ab7f7879cd81f9d23c71ca68bf4af0159fc64f (diff)
downloadmandoc-a81f461489b2bf2b5e7068e28199fb91696818b5.tar.gz
mandoc-a81f461489b2bf2b5e7068e28199fb91696818b5.tar.zst
mandoc-a81f461489b2bf2b5e7068e28199fb91696818b5.zip
Add support for markers. These decorate the last box: see eqn.7.
Diffstat (limited to 'eqn.c')
-rw-r--r--eqn.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/eqn.c b/eqn.c
index 9aa0af78..ee51c83b 100644
--- a/eqn.c
+++ b/eqn.c
@@ -1,4 +1,4 @@
-/* $Id: eqn.c,v 1.15 2011/07/21 12:30:44 kristaps Exp $ */
+/* $Id: eqn.c,v 1.16 2011/07/21 13:18:24 kristaps Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -37,6 +37,11 @@ struct eqnpart {
int (*fp)(struct eqn_node *);
};
+struct eqnmark {
+ const char *name;
+ size_t sz;
+};
+
enum eqnpartt {
EQN_DEFINE = 0,
EQN_SET,
@@ -63,6 +68,18 @@ static const struct eqnpart eqnparts[EQN__MAX] = {
{ "undef", 5, eqn_do_undef }, /* EQN_UNDEF */
};
+static const struct eqnmark eqnmarks[EQNMARK__MAX] = {
+ { "", 0 }, /* EQNMARK_NONE */
+ { "dot", 3 }, /* EQNMARK_DOT */
+ { "dotdot", 6 }, /* EQNMARK_DOTDOT */
+ { "hat", 3 }, /* EQNMARK_HAT */
+ { "tilde", 5 }, /* EQNMARK_TILDE */
+ { "vec", 3 }, /* EQNMARK_VEC */
+ { "dyad", 4 }, /* EQNMARK_DYAD */
+ { "bar", 3 }, /* EQNMARK_BAR */
+ { "under", 5 }, /* EQNMARK_UNDER */
+};
+
/* ARGSUSED */
enum rofferr
eqn_read(struct eqn_node **epp, int ln,
@@ -139,13 +156,15 @@ eqn_end(struct eqn_node *ep)
* Otherwise, return the equation.
*/
- if ((c = eqn_box(ep, root, &last)) > 0) {
+ if (0 == (c = eqn_box(ep, root, &last))) {
+ if (last != root) {
+ EQN_MSG(MANDOCERR_EQNSCOPE, ep);
+ c = 0;
+ }
+ } else if (c > 0)
EQN_MSG(MANDOCERR_EQNNSCOPE, ep);
- c = 0;
- } else if (0 == c && last != root)
- EQN_MSG(MANDOCERR_EQNSCOPE, ep);
- return(1 == c ? ROFF_EQN : ROFF_IGN);
+ return(0 == c ? ROFF_EQN : ROFF_IGN);
}
static int
@@ -179,6 +198,15 @@ again:
goto again;
}
+ for (i = 0; i < (int)EQNMARK__MAX; i++) {
+ if (eqnmarks[i].sz != sz)
+ continue;
+ if (strncmp(eqnmarks[i].name, start, sz))
+ continue;
+ last->mark = (enum eqn_markt)i;
+ goto again;
+ }
+
/* Exit this [hopefully] subexpression. */
if (sz == 1 && 0 == strncmp("}", start, 1))