summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eqn.76
-rw-r--r--eqn.c23
-rw-r--r--mandoc.h16
-rw-r--r--tree.c12
4 files changed, 49 insertions, 8 deletions
diff --git a/eqn.7 b/eqn.7
index 9e558d6d..083f2b64 100644
--- a/eqn.7
+++ b/eqn.7
@@ -67,9 +67,15 @@ box : text
| DEFINE text text
| SET text text
| UNDEF text
+ | box pos box
| box mark
| font box
text : TEXT
+pos : OVER
+ | SUP
+ | SUB
+ | TO
+ | FROM
mark : DOT
| DOTDOT
| HAT
diff --git a/eqn.c b/eqn.c
index 37488919..b4087f26 100644
--- a/eqn.c
+++ b/eqn.c
@@ -80,11 +80,22 @@ static const struct eqnstr eqnmarks[EQNMARK__MAX] = {
};
static const struct eqnstr eqnfonts[EQNFONT__MAX] = {
+ { "", 0 },
{ "roman", 5 },
{ "bold", 4 },
{ "italic", 6 },
};
+static const struct eqnstr eqnposs[EQNPOS__MAX] = {
+ { "", 0 },
+ { "over", 4 },
+ { "sup", 3 },
+ { "sub", 3 },
+ { "to", 2 },
+ { "from", 4 },
+ { "above", 5 },
+};
+
/* ARGSUSED */
enum rofferr
eqn_read(struct eqn_node **epp, int ln,
@@ -189,8 +200,7 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last, struct eqn_box **sv)
*sv = last;
nextc = 1;
- font = EQNFONT_NONE;
-
+ font = EQNFONT_NONE;
again:
if (NULL == (start = eqn_nexttok(ep, &sz)))
return(0);
@@ -204,6 +214,15 @@ again:
goto again;
}
+ for (i = 0; i < (int)EQNFONT__MAX; i++) {
+ if (eqnposs[i].sz != sz)
+ continue;
+ if (strncmp(eqnposs[i].name, start, sz))
+ continue;
+ last->pos = (enum eqn_post)i;
+ goto again;
+ }
+
for (i = 0; i < (int)EQN__MAX; i++) {
if (eqnparts[i].str.sz != sz)
continue;
diff --git a/mandoc.h b/mandoc.h
index 231497e9..68ae3b02 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -306,6 +306,17 @@ enum eqn_fontt {
EQNFONT__MAX
};
+enum eqn_post {
+ EQNPOS_NONE = 0,
+ EQNPOS_OVER,
+ EQNPOS_SUP,
+ EQNPOS_SUB,
+ EQNPOS_TO,
+ EQNPOS_FROM,
+ EQNPOS_ABOVE,
+ EQNPOS__MAX
+};
+
/*
* A "box" is a parsed mathematical expression as defined by the eqn.7
* grammar.
@@ -314,11 +325,16 @@ struct eqn_box {
enum eqn_boxt type; /* type of node */
struct eqn_box *child; /* child node */
struct eqn_box *next; /* next in tree */
+ enum eqn_post pos; /* position of next box */
char *text; /* text (or NULL) */
enum eqn_markt mark; /* a mark about the box */
enum eqn_fontt font; /* font of box */
};
+/*
+ * An equation consists of a tree of expressions starting at a given
+ * line and position.
+ */
struct eqn {
struct eqn_box *root; /* root mathematical expression */
int ln; /* invocation line */
diff --git a/tree.c b/tree.c
index 722e396c..22f91a10 100644
--- a/tree.c
+++ b/tree.c
@@ -270,18 +270,18 @@ print_box(const struct eqn_box *ep, int indent)
switch (ep->type) {
case (EQN_ROOT):
- printf("eqn-root(%d, %d)\n",
- ep->font, ep->mark);
+ printf("eqn-root(%d, %d, %d)\n",
+ ep->pos, ep->font, ep->mark);
print_box(ep->child, indent + 1);
break;
case (EQN_SUBEXPR):
- printf("eqn-subxpr(%d, %d)\n",
- ep->font, ep->mark);
+ printf("eqn-subxpr(%d, %d, %d)\n",
+ ep->pos, ep->font, ep->mark);
print_box(ep->child, indent + 1);
break;
case (EQN_TEXT):
- printf("eqn-text(%d, %d): [%s]\n",
- ep->font, ep->mark, ep->text);
+ printf("eqn-text(%d, %d, %d): [%s]\n",
+ ep->pos, ep->font, ep->mark, ep->text);
break;
default:
break;