]> git.cameronkatri.com Git - mandoc.git/blobdiff - eqn.c
Make the character table available to libroff so it can check the
[mandoc.git] / eqn.c
diff --git a/eqn.c b/eqn.c
index 1cc0874a9dbb64fcb26217d225eee8863e713ae9..a64031b29b9c8e158eee91e685b711053cd2e170 100644 (file)
--- a/eqn.c
+++ b/eqn.c
@@ -1,4 +1,4 @@
-/*     $Id: eqn.c,v 1.53 2014/10/12 20:08:58 schwarze Exp $ */
+/*     $Id: eqn.c,v 1.56 2014/10/25 15:06:30 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -36,8 +36,6 @@
 #define        EQN_NEST_MAX     128 /* maximum nesting of defines */
 #define        STRNEQ(p1, sz1, p2, sz2) \
        ((sz1) == (sz2) && 0 == strncmp((p1), (p2), (sz1)))
-#define        EQNSTREQ(x, p, sz) \
-       STRNEQ((x)->name, (x)->sz, (p), (sz))
 
 enum   eqn_tok {
        EQN_TOK_DYAD = 0,
@@ -315,24 +313,12 @@ eqn_read(struct eqn_node **epp, int ln,
 }
 
 struct eqn_node *
-eqn_alloc(const char *name, int pos, int line, struct mparse *parse)
+eqn_alloc(int pos, int line, struct mparse *parse)
 {
        struct eqn_node *p;
-       size_t           sz;
-       const char      *end;
 
        p = mandoc_calloc(1, sizeof(struct eqn_node));
 
-       if (name && '\0' != *name) {
-               sz = strlen(name);
-               assert(sz);
-               do {
-                       sz--;
-                       end = name + (int)sz;
-               } while (' ' == *end || '\t' == *end);
-               p->eqn.name = mandoc_strndup(name, sz + 1);
-       }
-
        p->parse = parse;
        p->eqn.ln = line;
        p->eqn.pos = pos;
@@ -587,6 +573,30 @@ eqn_box_makebinary(struct eqn_node *ep,
        return(newb);
 }
 
+/*
+ * Parse the "delim" control statement.
+ */
+static void
+eqn_delim(struct eqn_node *ep)
+{
+       const char      *start;
+       size_t           sz;
+
+       if ((start = eqn_nextrawtok(ep, &sz)) == NULL)
+               mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse,
+                   ep->eqn.ln, ep->eqn.pos, "delim");
+       else if (strncmp(start, "off", 3) == 0)
+               ep->delim = 0;
+       else if (strncmp(start, "on", 2) == 0) {
+               if (ep->odelim && ep->cdelim)
+                       ep->delim = 1;
+       } else if (start[1] != '\0') {
+               ep->odelim = start[0];
+               ep->cdelim = start[1];
+               ep->delim = 1;
+       }
+}
+
 /*
  * Undefine a previously-defined string.
  */
@@ -674,7 +684,9 @@ eqn_parse(struct eqn_node *ep, struct eqn_box *parent)
        char             sym[64];
        const char      *start;
 
-       assert(NULL != parent);
+       assert(parent != NULL);
+       if (ep->data == NULL)
+               return(-1);
 
 next_tok:
        tok = eqn_tok_parse(ep, &p);
@@ -698,6 +710,8 @@ this_tok:
                        EQN_MSG(MANDOCERR_EQNEOF, ep);
                break;
        case (EQN_TOK_DELIM):
+               eqn_delim(ep);
+               break;
        case (EQN_TOK_GFONT):
                if (eqn_nextrawtok(ep, NULL) == NULL)
                        mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse,
@@ -1082,7 +1096,6 @@ eqn_free(struct eqn_node *p)
                free(p->defs[i].val);
        }
 
-       free(p->eqn.name);
        free(p->data);
        free(p->defs);
        free(p);