rsc | c42a1d3 | 2006-02-21 18:37:05 +0000 | [diff] [blame] | 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); |
rsc | cbeb0b2 | 2006-04-01 19:24:03 +0000 | [diff] [blame] | 52 | /* warn(".fi"); */ |
rsc | c42a1d3 | 2006-02-21 18:37:05 +0000 | [diff] [blame] | 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 | } |
| 142 | |