=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.171 retrieving revision 1.182 diff -u -p -r1.171 -r1.182 --- mandoc/term.c 2010/09/15 14:36:16 1.171 +++ mandoc/term.c 2011/03/22 14:05:45 1.182 @@ -1,7 +1,7 @@ -/* $Id: term.c,v 1.171 2010/09/15 14:36:16 kristaps Exp $ */ +/* $Id: term.c,v 1.182 2011/03/22 14:05:45 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons - * Copyright (c) 2010 Ingo Schwarze + * Copyright (c) 2010, 2011 Ingo Schwarze * * 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 #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); } @@ -134,6 +128,7 @@ term_flushln(struct termp *p) size_t vbl; /* number of blanks to prepend to output */ size_t vend; /* end of word visual position on output */ size_t bp; /* visual right border position */ + size_t dv; /* temporary for visual pos calculations */ int j; /* temporary loop index for p->buf */ int jhy; /* last hyph before overflow w/r/t j */ size_t maxvis; /* output position of visible boundary */ @@ -145,24 +140,21 @@ term_flushln(struct termp *p) * an indentation, but can be, for tagged lists or columns, a * small set of values. */ + 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; - 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; - 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) { /* @@ -183,7 +175,6 @@ term_flushln(struct termp *p) * 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; @@ -222,8 +213,7 @@ term_flushln(struct termp *p) /* Remove the p->overstep width. */ - bp += (int)/* LINTED */ - p->overstep; + bp += (size_t)p->overstep; p->overstep = 0; } @@ -237,7 +227,9 @@ term_flushln(struct termp *p) j = i; while (' ' == p->buf[i]) i++; - vbl += (i - j) * (*p->width)(p, ' '); + dv = (size_t)(i - j) * (*p->width)(p, ' '); + vbl += dv; + vend += dv; break; } if (ASCII_NBRSP == p->buf[i]) { @@ -264,7 +256,6 @@ term_flushln(struct termp *p) p->viscol += (*p->width)(p, p->buf[i]); } } - vend += vbl; vis = vend; } @@ -285,8 +276,7 @@ term_flushln(struct termp *p) 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: @@ -300,8 +290,7 @@ term_flushln(struct termp *p) */ if (p->overstep >= -1) { assert((int)maxvis + p->overstep >= 0); - /* LINTED */ - maxvis += p->overstep; + maxvis += (size_t)p->overstep; } else p->overstep = 0; @@ -309,9 +298,8 @@ term_flushln(struct termp *p) 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); @@ -359,6 +347,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) { const char *rhs; @@ -463,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,13 +478,13 @@ term_word(struct termp *p, const char *word) 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); - word += ssz; + word += (int)ssz; if ('\\' != *word) continue; @@ -517,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; @@ -544,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; - } } @@ -571,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); } @@ -683,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++);