t4.c (1972B)
1 #include "a.h" 2 3 /* 4 * 4 - Text filling, centering, and adjusting. 5 * "\ " - unbreakable space 6 * .n register - length of last line 7 * nl register - text baseline position on this page 8 * .h register - baseline high water mark 9 * .k register - current horizontal output position 10 * \p - cause break at end of word, justify 11 * \& - non-printing zero-width filler 12 * tr - output translation 13 * \c - break (but don't) input line in .nf mode 14 * \c - break (but don't) word in .fi mode 15 */ 16 17 int 18 e_space(void) 19 { 20 return 0xA0; /* non-breaking space */ 21 } 22 23 int 24 e_amp(void) 25 { 26 return Uempty; 27 } 28 29 int 30 e_c(void) 31 { 32 getrune(); 33 bol = 1; 34 return 0; 35 } 36 37 void 38 r_br(int argc, Rune **argv) 39 { 40 USED(argc); 41 USED(argv); 42 br(); 43 } 44 45 /* fill mode on */ 46 void 47 r_fi(int argc, Rune **argv) 48 { 49 USED(argc); 50 USED(argv); 51 nr(L(".fi"), 1); 52 /* warn(".fi"); */ 53 } 54 55 /* no-fill mode */ 56 void 57 r_nf(int argc, Rune **argv) 58 { 59 USED(argc); 60 USED(argv); 61 nr(L(".fi"), 0); 62 } 63 64 /* adjust */ 65 void 66 r_ad(int argc, Rune **argv) 67 { 68 int c, n; 69 70 nr(L(".j"), getnr(L(".j"))|1); 71 if(argc < 2) 72 return; 73 c = argv[1][0]; 74 switch(c){ 75 default: 76 fprint(2, "%L: bad adjust %C\n", c); 77 return; 78 case 'r': 79 n = 2*2|1; 80 break; 81 case 'l': 82 n = 0; 83 break; 84 case 'c': 85 n = 1*2|1; 86 break; 87 case 'b': 88 case 'n': 89 n = 0*2|1; 90 break; 91 case '0': 92 case '1': 93 case '2': 94 case '3': 95 case '4': 96 case '5': 97 n = c-'0'; 98 break; 99 } 100 nr(L(".j"), n); 101 } 102 103 /* no adjust */ 104 void 105 r_na(int argc, Rune **argv) 106 { 107 USED(argc); 108 USED(argv); 109 110 nr(L(".j"), getnr(L(".j"))&~1); 111 } 112 113 /* center next N lines */ 114 void 115 r_ce(int argc, Rune **argv) 116 { 117 if(argc < 2) 118 nr(L(".ce"), 1); 119 else 120 nr(L(".ce"), eval(argv[1])); 121 /* XXX set trap */ 122 } 123 124 void 125 t4init(void) 126 { 127 nr(L(".fi"), 1); 128 nr(L(".j"), 1); 129 130 addreq(L("br"), r_br, 0); 131 addreq(L("fi"), r_fi, 0); 132 addreq(L("nf"), r_nf, 0); 133 addreq(L("ad"), r_ad, -1); 134 addreq(L("na"), r_na, 0); 135 addreq(L("ce"), r_ce, -1); 136 137 addesc(' ', e_space, 0); 138 addesc('p', e_warn, 0); 139 addesc('&', e_amp, 0); 140 addesc('c', e_c, 0); 141 }