aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/htmlroff/t4.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-02-21 18:37:05 +0000
committerrsc <devnull@localhost>2006-02-21 18:37:05 +0000
commitc42a1d3d6168df56f966ea1f3ba3ef39ebbff4e4 (patch)
tree400f263e56681842ba1e6e1fdd8be453856474ef /src/cmd/htmlroff/t4.c
parent49a1496cbbb871bc623cfd0925566628e246c9ba (diff)
downloadplan9port-c42a1d3d6168df56f966ea1f3ba3ef39ebbff4e4.tar.gz
plan9port-c42a1d3d6168df56f966ea1f3ba3ef39ebbff4e4.tar.bz2
plan9port-c42a1d3d6168df56f966ea1f3ba3ef39ebbff4e4.zip
add
Diffstat (limited to 'src/cmd/htmlroff/t4.c')
-rw-r--r--src/cmd/htmlroff/t4.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/cmd/htmlroff/t4.c b/src/cmd/htmlroff/t4.c
new file mode 100644
index 00000000..eadc76ed
--- /dev/null
+++ b/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);
+}
+