aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/eqn.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-07-23 12:01:54 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-07-23 12:01:54 +0000
commitefaacbc5e152b979e7091412535d15dddd047469 (patch)
tree0c7f9619784327a9a00eb27a8f479264340c43cd /eqn.c
parentf6bc0fd9fcfb2e7b43ecfbce0031a626d9118240 (diff)
downloadmandoc-efaacbc5e152b979e7091412535d15dddd047469.tar.gz
mandoc-efaacbc5e152b979e7091412535d15dddd047469.tar.zst
mandoc-efaacbc5e152b979e7091412535d15dddd047469.zip
Add matrix support. Also remove "above" notion, as all elements in a
list are delimited by their "aboveness" and it's superfluous.
Diffstat (limited to 'eqn.c')
-rw-r--r--eqn.c59
1 files changed, 57 insertions, 2 deletions
diff --git a/eqn.c b/eqn.c
index e43a0f2d..4a1a9a9a 100644
--- a/eqn.c
+++ b/eqn.c
@@ -1,4 +1,4 @@
-/* $Id: eqn.c,v 1.31 2011/07/23 09:47:25 kristaps Exp $ */
+/* $Id: eqn.c,v 1.32 2011/07/23 12:01:54 kristaps Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -144,6 +144,7 @@ static int eqn_do_set(struct eqn_node *);
static int eqn_do_undef(struct eqn_node *);
static enum eqn_rest eqn_eqn(struct eqn_node *, struct eqn_box *);
static enum eqn_rest eqn_list(struct eqn_node *, struct eqn_box *);
+static enum eqn_rest eqn_matrix(struct eqn_node *, struct eqn_box *);
static const char *eqn_nexttok(struct eqn_node *, size_t *);
static const char *eqn_nextrawtok(struct eqn_node *, size_t *);
static const char *eqn_next(struct eqn_node *,
@@ -191,6 +192,9 @@ static const struct eqnstr eqnpiles[EQNPILE__MAX] = {
{ "cpile", 5 }, /* EQNPILE_CPILE */
{ "rpile", 5 }, /* EQNPILE_RPILE */
{ "lpile", 5 }, /* EQNPILE_LPILE */
+ { "ccol", 4 }, /* EQNPILE_CCOL */
+ { "rcol", 4 }, /* EQNPILE_RCOL */
+ { "lcol", 4 }, /* EQNPILE_LCOL */
};
static const struct eqnsym eqnsyms[EQNSYM__MAX] = {
@@ -348,6 +352,55 @@ eqn_eqn(struct eqn_node *ep, struct eqn_box *last)
}
static enum eqn_rest
+eqn_matrix(struct eqn_node *ep, struct eqn_box *last)
+{
+ struct eqn_box *bp;
+ const char *start;
+ size_t sz;
+ enum eqn_rest c;
+
+ bp = eqn_box_alloc(ep, last);
+ bp->type = EQN_MATRIX;
+
+ if (NULL == (start = eqn_nexttok(ep, &sz))) {
+ EQN_MSG(MANDOCERR_EQNEOF, ep);
+ return(EQN_ERR);
+ }
+ if ( ! STRNEQ(start, sz, "{", 1)) {
+ EQN_MSG(MANDOCERR_EQNSYNT, ep);
+ return(EQN_ERR);
+ }
+
+ while (EQN_OK == (c = eqn_box(ep, bp)))
+ switch (bp->last->pile) {
+ case (EQNPILE_LCOL):
+ /* FALLTHROUGH */
+ case (EQNPILE_CCOL):
+ /* FALLTHROUGH */
+ case (EQNPILE_RCOL):
+ continue;
+ default:
+ EQN_MSG(MANDOCERR_EQNSYNT, ep);
+ return(EQN_ERR);
+ };
+
+ if (EQN_DESCOPE != c) {
+ if (EQN_EOF == c)
+ EQN_MSG(MANDOCERR_EQNEOF, ep);
+ return(EQN_ERR);
+ }
+
+ eqn_rewind(ep);
+ start = eqn_nexttok(ep, &sz);
+ assert(start);
+ if (STRNEQ(start, sz, "}", 1))
+ return(EQN_OK);
+
+ EQN_MSG(MANDOCERR_EQNBADSCOPE, ep);
+ return(EQN_ERR);
+}
+
+static enum eqn_rest
eqn_list(struct eqn_node *ep, struct eqn_box *last)
{
struct eqn_box *bp;
@@ -373,7 +426,6 @@ eqn_list(struct eqn_node *ep, struct eqn_box *last)
assert(start);
if ( ! STRNEQ(start, sz, "above", 5))
break;
- bp->last->above = 1;
}
if (EQN_DESCOPE != c) {
@@ -442,6 +494,9 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last)
return(c);
}
+ if (STRNEQ(start, sz, "matrix", 6))
+ return(eqn_matrix(ep, last));
+
if (STRNEQ(start, sz, "left", 4)) {
if (NULL == (start = eqn_nexttok(ep, &sz))) {
EQN_MSG(MANDOCERR_EQNEOF, ep);