/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #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 */ inte_space(void){ return 0xA0; /* non-breaking space */} inte_amp(void){ return Uempty;} inte_c(void){ getrune(); bol = 1; return 0;} voidr_br(int argc, Rune **argv){ USED(argc); USED(argv); br();} /* fill mode on */voidr_fi(int argc, Rune **argv){ USED(argc); USED(argv); nr(L(".fi"), 1);// warn(".fi");} /* no-fill mode */voidr_nf(int argc, Rune **argv){ USED(argc); USED(argv); nr(L(".fi"), 0);} /* adjust */voidr_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 */voidr_na(int argc, Rune **argv){ USED(argc); USED(argv); nr(L(".j"), getnr(L(".j"))&~1);} /* center next N lines */voidr_ce(int argc, Rune **argv){ if(argc < 2) nr(L(".ce"), 1); else nr(L(".ce"), eval(argv[1])); /* XXX set trap */} voidt4init(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);}
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
#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);
}