Add manual page for mandoc-db (mostly to document the file format of
[mandoc.git] / term.c
diff --git a/term.c b/term.c
index d402968ef56550799e3aefae1f9cdea47a9db823..32b04e9f26c06d9891a0404ed2268eeb1adece9f 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
-/*     $Id: term.c,v 1.175 2010/12/06 13:25:25 kristaps Exp $ */
+/*     $Id: term.c,v 1.182 2011/03/22 14:05:45 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -29,7 +29,6 @@
 #include <string.h>
 
 #include "mandoc.h"
-#include "chars.h"
 #include "out.h"
 #include "term.h"
 #include "main.h"
@@ -80,12 +79,7 @@ term_alloc(enum termenc enc)
 {
        struct termp    *p;
 
-       p = calloc(1, sizeof(struct termp));
-       if (NULL == p) {
-               perror(NULL);
-               exit((int)MANDOCLEVEL_SYSERR);
-       }
-
+       p = mandoc_calloc(1, sizeof(struct termp));
        p->enc = enc;
        return(p);
 }
@@ -352,6 +346,17 @@ term_vspace(struct termp *p)
 }
 
 
+static void
+numbered(struct termp *p, const char *word, size_t len)
+{
+       const char      *rhs;
+
+       rhs = chars_num2char(word, len);
+       if (rhs) 
+               encode(p, rhs, 1);
+}
+
+
 static void
 spec(struct termp *p, enum roffdeco d, const char *word, size_t len)
 {
@@ -457,30 +462,6 @@ term_word(struct termp *p, const char *word)
 
        sv = word;
 
-       if (word[0] && '\0' == word[1])
-               switch (word[0]) {
-               case('.'):
-                       /* FALLTHROUGH */
-               case(','):
-                       /* FALLTHROUGH */
-               case(';'):
-                       /* FALLTHROUGH */
-               case(':'):
-                       /* FALLTHROUGH */
-               case('?'):
-                       /* FALLTHROUGH */
-               case('!'):
-                       /* FALLTHROUGH */
-               case(')'):
-                       /* FALLTHROUGH */
-               case(']'):
-                       if ( ! (TERMP_IGNDELIM & p->flags))
-                               p->flags |= TERMP_NOSPACE;
-                       break;
-               default:
-                       break;
-               }
-
        if ( ! (TERMP_NOSPACE & p->flags)) {
                if ( ! (TERMP_KEEP & p->flags)) {
                        if (TERMP_PREKEEP & p->flags)
@@ -503,7 +484,7 @@ term_word(struct termp *p, const char *word)
                if ((ssz = strcspn(word, "\\")) > 0)
                        encode(p, word, ssz);
 
-               word += ssz;
+               word += (int)ssz;
                if ('\\' != *word)
                        continue;
 
@@ -511,6 +492,9 @@ term_word(struct termp *p, const char *word)
                word += a2roffdeco(&deco, &seq, &ssz);
 
                switch (deco) {
+               case (DECO_NUMBERED):
+                       numbered(p, seq, ssz);
+                       break;
                case (DECO_RESERVED):
                        res(p, seq, ssz);
                        break;
@@ -538,21 +522,6 @@ term_word(struct termp *p, const char *word)
                if (DECO_NOSPACE == deco && '\0' == *word)
                        p->flags |= TERMP_NOSPACE;
        }
-
-       /* 
-        * Note that we don't process the pipe: the parser sees it as
-        * punctuation, but we don't in terms of typography.
-        */
-       if (sv[0] && '\0' == sv[1])
-               switch (sv[0]) {
-               case('('):
-                       /* FALLTHROUGH */
-               case('['):
-                       p->flags |= TERMP_NOSPACE;
-                       break;
-               default:
-                       break;
-               }
 }
 
 
@@ -565,11 +534,7 @@ adjbuf(struct termp *p, size_t sz)
        while (sz >= p->maxcols)
                p->maxcols <<= 2;
 
-       p->buf = realloc(p->buf, p->maxcols);
-       if (NULL == p->buf) {
-               perror(NULL);
-               exit((int)MANDOCLEVEL_SYSERR);
-       }
+       p->buf = mandoc_realloc(p->buf, p->maxcols);
 }
 
 
@@ -677,6 +642,12 @@ term_strlen(const struct termp *p, const char *cp)
                        if (rhs)
                                for (i = 0; i < rsz; i++)
                                        sz += (*p->width)(p, *rhs++);
+               } else if (ASCII_NBRSP == *cp) {
+                       sz += (*p->width)(p, ' ');
+                       cp++;
+               } else if (ASCII_HYPH == *cp) {
+                       sz += (*p->width)(p, '-');
+                       cp++;
                } else
                        sz += (*p->width)(p, *cp++);