#include "a.h"
/*
* 4 - Text filling, centering, and adjusting.
* "\ " - unbreakable space
* .n register - length of last line
* nl register - text baseline position on this page
* .h register - baseline high water mark
* .k register - current horizontal output position
* \p - cause break at end of word, justify
* \& - non-printing zero-width filler
* tr - output translation
* \c - break (but don't) input line in .nf mode
* \c - break (but don't) word in .fi mode
*/
int
e_space(void)
{
return 0xA0; /* non-breaking space */
}
int
e_amp(void)
{
return Uempty;
}
int
e_c(void)
{
getrune();
bol = 1;
return 0;
}
void
r_br(int argc, Rune **argv)
{
USED(argc);
USED(argv);
br();
}
/* fill mode on */
void
r_fi(int argc, Rune **argv)
{
USED(argc);
USED(argv);
nr(L(".fi"), 1);
// warn(".fi");
}
/* no-fill mode */
void
r_nf(int argc, Rune **argv)
{
USED(argc);
USED(argv);
nr(L(".fi"), 0);
}
/* adjust */
void
r_ad(int argc, Rune **argv)
{
int c, n;
nr(L(".j"), getnr(L(".j"))|1);
if(argc < 2)
return;
c = argv[1][0];
switch(c){
default:
fprint(2, "%L: bad adjust %C\n", c);
return;
case 'r':
n = 2*2|1;
break;
case 'l':
n = 0;
break;
case 'c':
n = 1*2|1;
break;
case 'b':
case 'n':
n = 0*2|1;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
n = c-'0';
break;
}
nr(L(".j"), n);
}
/* no adjust */
void
r_na(int argc, Rune **argv)
{
USED(argc);
USED(argv);
nr(L(".j"), getnr(L(".j"))&~1);
}
/* center next N lines */
void
r_ce(int argc, Rune **argv)
{
if(argc < 2)
nr(L(".ce"), 1);
else
nr(L(".ce"), eval(argv[1]));
/* XXX set trap */
}
void
t4init(void)
{
nr(L(".fi"), 1);
nr(L(".j"), 1);
addreq(L("br"), r_br, 0);
addreq(L("fi"), r_fi, 0);
addreq(L("nf"), r_nf, 0);
addreq(L("ad"), r_ad, -1);
addreq(L("na"), r_na, 0);
addreq(L("ce"), r_ce, -1);
addesc(' ', e_space, 0);
addesc('p', e_warn, 0);
addesc('&', e_amp, 0);
addesc('c', e_c, 0);
}
|