]> git.cameronkatri.com Git - mandoc.git/blobdiff - term.c
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 b609b0e8615d65391ec2d53ca41f2509eb298d13..32b04e9f26c06d9891a0404ed2268eeb1adece9f 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
-/*     $Id: term.c,v 1.172 2010/09/23 20:26:00 schwarze 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) 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
  *
  * 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 <string.h>
 
 #include "mandoc.h"
-#include "chars.h"
 #include "out.h"
 #include "term.h"
 #include "main.h"
 #include "out.h"
 #include "term.h"
 #include "main.h"
@@ -80,12 +79,7 @@ term_alloc(enum termenc enc)
 {
        struct termp    *p;
 
 {
        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);
 }
        p->enc = enc;
        return(p);
 }
@@ -146,24 +140,21 @@ term_flushln(struct termp *p)
         * an indentation, but can be, for tagged lists or columns, a
         * small set of values. 
         */
         * an indentation, but can be, for tagged lists or columns, a
         * small set of values. 
         */
-
-       assert(p->offset < p->rmargin);
-
-       maxvis = (int)(p->rmargin - p->offset) - p->overstep < 0 ?
-               /* LINTED */ 
-               0 : p->rmargin - p->offset - p->overstep;
-       mmax = (int)(p->maxrmargin - p->offset) - p->overstep < 0 ?
-               /* LINTED */
-               0 : p->maxrmargin - p->offset - p->overstep;
+       assert  (p->rmargin >= p->offset);
+       dv     = p->rmargin - p->offset;
+       maxvis = (int)dv > p->overstep ? dv - (size_t)p->overstep : 0;
+       dv     = p->maxrmargin - p->offset;
+       mmax   = (int)dv > p->overstep ? dv - (size_t)p->overstep : 0;
 
        bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;
 
        /*
         * Indent the first line of a paragraph.
         */
 
        bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;
 
        /*
         * Indent the first line of a paragraph.
         */
-       vbl = p->flags & TERMP_NOLPAD ? 0 : p->offset;
+       vbl = p->flags & TERMP_NOLPAD ? (size_t)0 : p->offset;
 
 
-       vis = vend = i = 0;
+       vis = vend = 0;
+       i = 0;
 
        while (i < (int)p->col) {
                /*
 
        while (i < (int)p->col) {
                /*
@@ -184,7 +175,6 @@ term_flushln(struct termp *p)
                 * space is printed according to regular spacing rules).
                 */
 
                 * space is printed according to regular spacing rules).
                 */
 
-               /* LINTED */
                for (j = i, jhy = 0; j < (int)p->col; j++) {
                        if ((j && ' ' == p->buf[j]) || '\t' == p->buf[j])
                                break;
                for (j = i, jhy = 0; j < (int)p->col; j++) {
                        if ((j && ' ' == p->buf[j]) || '\t' == p->buf[j])
                                break;
@@ -223,8 +213,7 @@ term_flushln(struct termp *p)
 
                        /* Remove the p->overstep width. */
 
 
                        /* Remove the p->overstep width. */
 
-                       bp += (int)/* LINTED */
-                               p->overstep;
+                       bp += (size_t)p->overstep;
                        p->overstep = 0;
                }
 
                        p->overstep = 0;
                }
 
@@ -238,7 +227,7 @@ term_flushln(struct termp *p)
                                j = i;
                                while (' ' == p->buf[i])
                                        i++;
                                j = i;
                                while (' ' == p->buf[i])
                                        i++;
-                               dv = (i - j) * (*p->width)(p, ' ');
+                               dv = (size_t)(i - j) * (*p->width)(p, ' ');
                                vbl += dv;
                                vend += dv;
                                break;
                                vbl += dv;
                                vend += dv;
                                break;
@@ -287,8 +276,7 @@ term_flushln(struct termp *p)
 
        if (TERMP_HANG & p->flags) {
                /* We need one blank after the tag. */
 
        if (TERMP_HANG & p->flags) {
                /* We need one blank after the tag. */
-               p->overstep = /* LINTED */
-                       vis - maxvis + (*p->width)(p, ' ');
+               p->overstep = (int)(vis - maxvis + (*p->width)(p, ' '));
 
                /*
                 * Behave exactly the same way as groff:
 
                /*
                 * Behave exactly the same way as groff:
@@ -302,8 +290,7 @@ term_flushln(struct termp *p)
                 */
                if (p->overstep >= -1) {
                        assert((int)maxvis + p->overstep >= 0);
                 */
                if (p->overstep >= -1) {
                        assert((int)maxvis + p->overstep >= 0);
-                       /* LINTED */
-                       maxvis += p->overstep;
+                       maxvis += (size_t)p->overstep;
                } else
                        p->overstep = 0;
 
                } else
                        p->overstep = 0;
 
@@ -311,9 +298,8 @@ term_flushln(struct termp *p)
                return;
 
        /* Right-pad. */
                return;
 
        /* Right-pad. */
-       if (maxvis > vis + /* LINTED */
-                       ((TERMP_TWOSPACE & p->flags) ? 
-                        (*p->width)(p, ' ') : 0)) {
+       if (maxvis > vis +
+           ((TERMP_TWOSPACE & p->flags) ? (*p->width)(p, ' ') : 0)) {
                p->viscol += maxvis - vis;
                (*p->advance)(p, maxvis - vis);
                vis += (maxvis - vis);
                p->viscol += maxvis - vis;
                (*p->advance)(p, maxvis - vis);
                vis += (maxvis - vis);
@@ -360,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)
 {
 static void
 spec(struct termp *p, enum roffdeco d, const char *word, size_t len)
 {
@@ -465,30 +462,6 @@ term_word(struct termp *p, const char *word)
 
        sv = 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)
        if ( ! (TERMP_NOSPACE & p->flags)) {
                if ( ! (TERMP_KEEP & p->flags)) {
                        if (TERMP_PREKEEP & p->flags)
@@ -505,13 +478,13 @@ term_word(struct termp *p, const char *word)
        else
                p->flags |= TERMP_NOSPACE;
 
        else
                p->flags |= TERMP_NOSPACE;
 
-       p->flags &= ~TERMP_SENTENCE;
+       p->flags &= ~(TERMP_SENTENCE | TERMP_IGNDELIM);
 
        while (*word) {
                if ((ssz = strcspn(word, "\\")) > 0)
                        encode(p, word, ssz);
 
 
        while (*word) {
                if ((ssz = strcspn(word, "\\")) > 0)
                        encode(p, word, ssz);
 
-               word += ssz;
+               word += (int)ssz;
                if ('\\' != *word)
                        continue;
 
                if ('\\' != *word)
                        continue;
 
@@ -519,6 +492,9 @@ term_word(struct termp *p, const char *word)
                word += a2roffdeco(&deco, &seq, &ssz);
 
                switch (deco) {
                word += a2roffdeco(&deco, &seq, &ssz);
 
                switch (deco) {
+               case (DECO_NUMBERED):
+                       numbered(p, seq, ssz);
+                       break;
                case (DECO_RESERVED):
                        res(p, seq, ssz);
                        break;
                case (DECO_RESERVED):
                        res(p, seq, ssz);
                        break;
@@ -546,21 +522,6 @@ term_word(struct termp *p, const char *word)
                if (DECO_NOSPACE == deco && '\0' == *word)
                        p->flags |= TERMP_NOSPACE;
        }
                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;
-               }
 }
 
 
 }
 
 
@@ -573,11 +534,7 @@ adjbuf(struct termp *p, size_t sz)
        while (sz >= p->maxcols)
                p->maxcols <<= 2;
 
        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);
 }
 
 
 }
 
 
@@ -685,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++);
                        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++);
 
                } else
                        sz += (*p->width)(p, *cp++);