]> git.cameronkatri.com Git - mandoc.git/commitdiff
Most important move in getting predefined strings entirely contained
authorKristaps Dzonsons <kristaps@bsd.lv>
Tue, 24 May 2011 21:18:06 +0000 (21:18 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Tue, 24 May 2011 21:18:06 +0000 (21:18 +0000)
within roff.c.  These are now grokked from a table in the roff
allocation routine and rest in the newly-created predefs.in (for
consistency with chars.in).  This is a first implementation and will
likely be optimised along with the ds/de lookup table itself.

This allows mandoc-defined predefined strings to be correctly removed or
whatnot; earlier they couldn't.  What will follow is the stripping-away
of all predefined-string crud in the other parts of the system.

Makefile
predefs.in [new file with mode: 0644]
roff.c

index efc8987539b6e91be1d358a42bf2326eeedf97a2..2f49ffd2fa2844beff2339dd9323ef89d1cc7d7b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -88,6 +88,7 @@ SRCS           = Makefile \
                   msec.in \
                   out.c \
                   out.h \
                   msec.in \
                   out.c \
                   out.h \
+                  predefs.in \
                   read.c \
                   roff.7 \
                   roff.c \
                   read.c \
                   roff.7 \
                   roff.c \
@@ -174,6 +175,7 @@ att.o att.ln: att.in
 chars.o chars.ln: chars.in
 lib.o lib.ln: lib.in
 msec.o msec.ln: msec.in
 chars.o chars.ln: chars.in
 lib.o lib.ln: lib.in
 msec.o msec.ln: msec.in
+roff.o roff.ln: predefs.in
 st.o st.ln: st.in
 vol.o vol.ln: vol.in
 
 st.o st.ln: st.in
 vol.o vol.ln: vol.in
 
diff --git a/predefs.in b/predefs.in
new file mode 100644 (file)
index 0000000..b36e152
--- /dev/null
@@ -0,0 +1,65 @@
+/*     $Id: predefs.in,v 1.1 2011/05/24 21:18:06 kristaps Exp $ */
+/*
+ * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * The predefined-string translation tables.  Each corresponds to a
+ * predefined strings from (e.g.) tmac/mdoc/doc-nroff.  The left-hand
+ * side corresponds to the input sequence (\*x, \*(xx and so on).  The
+ * right-hand side is what's produced by libroff.
+ *
+ * XXX - C-escape strings!
+ * XXX - update PREDEF_MAX in roff.c if adding more!
+ */
+
+PREDEF("Am", "&")
+PREDEF("Ba", "|")
+PREDEF("Ge", "\\(>=")
+PREDEF("Gt", ">")
+PREDEF("If", "\\(if")
+PREDEF("Le", "\\(<=")
+PREDEF("Lq", "\\(lq")
+PREDEF("Lt", "<")
+PREDEF("Na", "NaN")
+PREDEF("Ne", "\\(!=")
+PREDEF("Pi", "\\(*p")
+PREDEF("Pm", "\\(+-")
+PREDEF("Rq", "\\(rq")
+PREDEF("left-bracket", "[")
+PREDEF("left-parenthesis", "(")
+PREDEF("lp", "(")
+PREDEF("left-singlequote", "\\(oq")
+PREDEF("q", "\"")
+PREDEF("quote-left", "\\(oq")
+PREDEF("quote-right", "\\(cq")
+PREDEF("R", "\\(rg")
+PREDEF("right-bracket", "]")
+PREDEF("right-parenthesis", ")")
+PREDEF("rp", ")")
+PREDEF("right-singlequote", "\\(cq")
+PREDEF("Tm", "\\(tm")
+PREDEF("Px", "POSIX")
+PREDEF("Ai", "ANSI")
+PREDEF("\'", "\\\'")
+PREDEF("aa", "\\(aa")
+PREDEF("ga", "\\(ga")
+PREDEF("`",  "\\`")
+PREDEF("lq", "\\(lq")
+PREDEF("rq", "\\(rq")
+PREDEF("ua", "\\(ua")
+PREDEF("va", "\\(va")
+PREDEF("<=", "\\(<=")
+PREDEF(">=", "\\(>=")
diff --git a/roff.c b/roff.c
index 4960d947d4168a80908d9d29acfe165edcb3d538..a9dbce22a58db061900e7d4a6c9778e45880463d 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.140 2011/05/24 15:22:14 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);
 }