diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/htmlroff/t4.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/htmlroff/t4.c')
-rwxr-xr-x | sys/src/cmd/htmlroff/t4.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/sys/src/cmd/htmlroff/t4.c b/sys/src/cmd/htmlroff/t4.c new file mode 100755 index 000000000..eadc76edf --- /dev/null +++ b/sys/src/cmd/htmlroff/t4.c @@ -0,0 +1,142 @@ +#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); +} + |