143 lines
1.9 KiB
C
143 lines
1.9 KiB
C
#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);
|
|
}
|
|
|