]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
Most important move in getting predefined strings entirely contained
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index 35e0f883ef74eaa9ed41ab20c9eed25b2775b85f..a9dbce22a58db061900e7d4a6c9778e45880463d 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.139 2011/05/24 14:00:39 kristaps Exp $ */
+/*     $Id: roff.c,v 1.141 2011/05/24 21:18:06 kristaps Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -28,6 +28,7 @@
 #include "libroff.h"
 #include "libmandoc.h"
 
 #include "libroff.h"
 #include "libmandoc.h"
 
+/* Maximum number of nested if-else conditionals. */
 #define        RSTACK_MAX      128
 
 enum   rofft {
 #define        RSTACK_MAX      128
 
 enum   rofft {
@@ -60,7 +61,7 @@ enum  rofft {
        ROFF_EQ,
        ROFF_EN,
        ROFF_cblock,
        ROFF_EQ,
        ROFF_EN,
        ROFF_cblock,
-       ROFF_ccond, /* FIXME: remove this. */
+       ROFF_ccond,
        ROFF_USERDEF,
        ROFF_MAX
 };
        ROFF_USERDEF,
        ROFF_MAX
 };
@@ -124,6 +125,14 @@ struct     roffmac {
        struct roffmac  *next;
 };
 
        struct roffmac  *next;
 };
 
+struct predef {
+       const char      *name; /* predefined input name */
+       const char      *str; /* replacement symbol */
+};
+
+#define        PREDEF(__name, __str) \
+       { (__name), (__str) },
+
 static enum rofferr     roff_block(ROFF_ARGS);
 static enum rofferr     roff_block_text(ROFF_ARGS);
 static enum rofferr     roff_block_sub(ROFF_ARGS);
 static enum rofferr     roff_block(ROFF_ARGS);
 static enum rofferr     roff_block_text(ROFF_ARGS);
 static enum rofferr     roff_block_sub(ROFF_ARGS);
@@ -195,6 +204,12 @@ static     struct roffmac   roffs[ROFF_MAX] = {
        { NULL, roff_userdef, NULL, NULL, 0, NULL },
 };
 
        { NULL, roff_userdef, NULL, NULL, 0, NULL },
 };
 
+/* Array of injected predefined strings. */
+#define        PREDEFS_MAX      38
+static const struct predef predefs[PREDEFS_MAX] = {
+#include "predefs.in"
+};
+
 static void             roff_free1(struct roff *);
 static enum rofft       roff_hash_find(const char *, size_t);
 static void             roff_hash_init(void);
 static void             roff_free1(struct roff *);
 static enum rofft       roff_hash_find(const char *, size_t);
 static void             roff_hash_init(void);
@@ -228,7 +243,6 @@ roff_hash_init(void)
        }
 }
 
        }
 }
 
-
 /*
  * Look up a roff token by its name.  Returns ROFF_MAX if no macro by
  * the nil-terminated string name could be found.
 /*
  * Look up a roff token by its name.  Returns ROFF_MAX if no macro by
  * the nil-terminated string name could be found.
@@ -351,6 +365,7 @@ struct roff *
 roff_alloc(struct regset *regs, struct mparse *parse)
 {
        struct roff     *r;
 roff_alloc(struct regset *regs, struct mparse *parse)
 {
        struct roff     *r;
+       int              i;
 
        r = mandoc_calloc(1, sizeof(struct roff));
        r->regs = regs;
 
        r = mandoc_calloc(1, sizeof(struct roff));
        r->regs = regs;
@@ -358,6 +373,10 @@ roff_alloc(struct regset *regs, struct mparse *parse)
        r->rstackpos = -1;
        
        roff_hash_init();
        r->rstackpos = -1;
        
        roff_hash_init();
+
+       for (i = 0; i < PREDEFS_MAX; i++) 
+               roff_setstr(r, predefs[i].name, predefs[i].str, 0);
+
        return(r);
 }
 
        return(r);
 }
 
@@ -853,17 +872,12 @@ roff_cond_sub(ROFF_ARGS)
         */
 
        if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos))) {
         */
 
        if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos))) {
-               /*
-                * Jump through hoops to detect a \}, because it could
-                * be (say) \\}, which is something completely
-                * different.
-                */
                ep = &(*bufp)[pos];
                for ( ; NULL != (ep = strchr(ep, '\\')); ep++) {
                        ep++;
                        if ('}' != *ep)
                                continue;
                ep = &(*bufp)[pos];
                for ( ; NULL != (ep = strchr(ep, '\\')); ep++) {
                        ep++;
                        if ('}' != *ep)
                                continue;
-                       *--ep = '\0';
+                       *ep = '&';
                        roff_ccond(r, ROFF_ccond, bufp, szp, 
                                        ln, pos, pos + 2, offs);
                        break;
                        roff_ccond(r, ROFF_ccond, bufp, szp, 
                                        ln, pos, pos + 2, offs);
                        break;
@@ -887,37 +901,28 @@ roff_cond_sub(ROFF_ARGS)
                                ln, ppos, pos, offs));
 }
 
                                ln, ppos, pos, offs));
 }
 
-
 /* ARGSUSED */
 static enum rofferr
 roff_cond_text(ROFF_ARGS)
 {
 /* ARGSUSED */
 static enum rofferr
 roff_cond_text(ROFF_ARGS)
 {
-       char            *ep, *st;
+       char            *ep;
        enum roffrule    rr;
 
        rr = r->last->rule;
        enum roffrule    rr;
 
        rr = r->last->rule;
+       roffnode_cleanscope(r);
 
 
-       /*
-        * We display the value of the text if out current evaluation
-        * scope permits us to do so.
-        */
-
-       /* FIXME: use roff_ccond? */
-
-       st = &(*bufp)[pos];
-       if (NULL == (ep = strstr(st, "\\}"))) {
-               roffnode_cleanscope(r);
-               return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);
+       ep = &(*bufp)[pos];
+       for ( ; NULL != (ep = strchr(ep, '\\')); ep++) {
+               ep++;
+               if ('}' != *ep)
+                       continue;
+               *ep = '&';
+               roff_ccond(r, ROFF_ccond, bufp, szp, 
+                               ln, pos, pos + 2, offs);
        }
        }
-
-       if (ep == st || (ep > st && '\\' != *(ep - 1)))
-               roffnode_pop(r);
-
-       roffnode_cleanscope(r);
        return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);
 }
 
        return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);
 }
 
-
 static enum roffrule
 roff_evalcond(const char *v, int *pos)
 {
 static enum roffrule
 roff_evalcond(const char *v, int *pos)
 {