-/* $Id: mdocterm.c,v 1.20 2009/02/28 20:13:06 kristaps Exp $ */
+/* $Id: mdocterm.c,v 1.23 2009/03/01 23:23:55 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
for (i = 0; i < p->col; i++) {
/*
* Count up visible word characters. Control sequences
- * (starting with the CSI) aren't counted.
+ * (starting with the CSI) aren't counted. A space
+ * generates a non-printing word, which is valid (the
+ * space is printed according to regular spacing rules).
*/
- assert( ! xisspace(p->buf[i]));
/* LINTED */
for (j = i, vsz = 0; j < p->col; j++) {
} else
vsz++;
}
- assert(vsz > 0);
/*
+ * If we're breaking normally...
+ *
* If a word is too long and we're within a line, put it
* on the next line. Puke if we're being asked to write
* something that will exceed the right margin (i.e.,
- * from a fresh line or when we're not allowed to break
- * the line with TERMP_NOBREAK).
+ * from a fresh line).
+ *
+ * If we're not breaking...
+ *
+ * Don't let the visible size exceed the full margin.
*/
- /* FIXME: allow selective right-margin breaking. */
-
- if (vis && vis + vsz > maxvis) {
- if (p->flags & TERMP_NOBREAK)
+ if ( ! (TERMP_NOBREAK & p->flags)) {
+ if (vis && vis + vsz > maxvis) {
+ putchar('\n');
+ for (j = 0; j < p->offset; j++)
+ putchar(' ');
+ vis = 0;
+ } else if (vis + vsz > maxvis)
errx(1, "word breaks right margin");
- putchar('\n');
- for (j = 0; j < p->offset; j++)
- putchar(' ');
- vis = 0;
- } else if (vis + vsz > maxvis)
+ } else if (vis + vsz > p->maxrmargin)
errx(1, "word breaks right margin");
/*
}
}
+ if ((TERMP_NOBREAK & p->flags) && vis >= maxvis) {
+ putchar('\n');
+ for (i = 0; i < p->rmargin; i++)
+ putchar(' ');
+ p->col = 0;
+ return;
+ }
+
/*
* If we're not to right-marginalise it (newline), then instead
* pad to the right margin and stay off.
*/
if (p->flags & TERMP_NOBREAK) {
- if ( ! (p->flags & TERMP_NORPAD))
- for ( ; vis < maxvis; vis++)
- putchar(' ');
+ for ( ; vis < maxvis; vis++)
+ putchar(' ');
} else
putchar('\n');
/* FALLTHROUGH */
case ('.'):
chara(p, word[*i]);
+ break;
+ case ('e'):
+ chara(p, '\\');
+ break;
default:
break;
}
{
size_t i;
- /*assert(len > 0);*/ /* Can be, if literal. */
-
/*
* Handle pwords, partial words, which may be either a single
* word or a phrase that cannot be broken down (such as a