-/* $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) 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
#include <string.h>
#include "mandoc.h"
-#include "chars.h"
#include "out.h"
#include "term.h"
#include "main.h"
{
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);
}
* 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.
*/
- 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) {
/*
* 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;
/* Remove the p->overstep width. */
- bp += (int)/* LINTED */
- p->overstep;
+ bp += (size_t)p->overstep;
p->overstep = 0;
}
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;
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:
*/
if (p->overstep >= -1) {
assert((int)maxvis + p->overstep >= 0);
- /* LINTED */
- maxvis += p->overstep;
+ maxvis += (size_t)p->overstep;
} else
p->overstep = 0;
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);
}
+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)
{
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)
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;
word += a2roffdeco(&deco, &seq, &ssz);
switch (deco) {
+ case (DECO_NUMBERED):
+ numbered(p, seq, ssz);
+ break;
case (DECO_RESERVED):
res(p, seq, ssz);
break;
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;
- }
}
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);
}
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++);