1 #ifndef lint 2 static char sccsid[] = "@(#)writecntl.c 1.2 (CWI) 85/10/02"; 3 #endif lint 4 5 /* 6 * control to write table entries 7 */ 8 9 #include "defs.h" 10 #include "ext.h" 11 12 #define realsplit ((ct == 'a' || ct == 'n') && table[ldata][c].rcol) 13 14 runout(){ 15 register int i; 16 17 if(boxflg || allflg || dboxflg) 18 need(); 19 if(ctrflg){ 20 printf(".nr #I \\n(.i\n"); 21 printf(".in +(\\n(.lu-\\n(TWu-\\n(.iu)/2u\n"); 22 } 23 printf(".fc %c %c\n", F1, F2); 24 printf(".nr #T 0-1\n"); 25 deftail(); 26 for(i = 0; i < nlin; i++) 27 putline(i, i); 28 if(leftover) 29 yetmore(); 30 printf(".fc\n"); 31 printf(".nr T. 1\n"); 32 printf(".T# 1\n"); 33 if(ctrflg) 34 printf(".in \\n(#Iu\n"); 35 } 36 37 runtabs(lform, ldata){ 38 int c, ct, vforml, lf; 39 40 printf(".ta "); 41 for(c = 0; c < ncol; c++){ 42 vforml = lform; 43 for(lf = prev(lform); lf >= 0 && vspen (table[lf][c].col); 44 lf = prev (lf)) 45 vforml = lf; 46 if(fspan(vforml, c)) 47 continue; 48 switch(ct = ctype(vforml, c)){ 49 50 case 'n': 51 case 'a': 52 if(table[ldata][c].rcol) 53 if(lused[c]){ 54 /* 55 * Zero field width 56 */ 57 printf("\\n(%2su ", 58 reg(c, CMID)); 59 } 60 case 'c': 61 case 'l': 62 case 'r': 63 if(realsplit ? rused[c] : (used[c] + lused[c])) 64 printf("\\n(%2su ", reg(c, CRIGHT)); 65 continue; 66 case 's': 67 if(lspan(lform, c)) 68 printf("\\n(%2su ", reg(c, CRIGHT)); 69 continue; 70 } 71 } 72 printf("\n"); 73 } 74 75 ifline(s) 76 char *s; 77 { 78 if(!point(s)) 79 return(0); 80 if(s[0] == '\\') 81 s++; 82 if(s[1]) 83 return(0); 84 if(s[0] == '_') 85 return('-'); 86 if(s[0] == '=') 87 return('='); 88 return(0); 89 } 90 91 need(){ 92 int texlin, horlin, i; 93 94 for(texlin = horlin = i = 0; i < nlin; i++){ 95 if(fullbot[i] != 0) 96 horlin++; 97 else if(instead[i] != 0) 98 continue; 99 else 100 texlin++; 101 } 102 printf(".ne %dv+%dp\n", texlin, 2 * horlin); 103 } 104 105 deftail(){ 106 int i, c, lf, lwid; 107 108 for(i = 0; i < MAXHEAD; i++) 109 if(linestop[i]) 110 printf(".nr #%c 0-1\n", linestop[i] + 'a' - 1); 111 printf(".nr #a 0-1\n"); 112 printf(".eo\n"); 113 printf(".de T#\n"); 114 printf(".ds #d .d\n"); 115 printf(".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n"); 116 printf(".mk ##\n"); 117 printf(".nr ## -1v\n"); 118 printf(".ls 1\n"); 119 for(i = 0; i < MAXHEAD; i++) 120 if(linestop[i]) 121 printf(".if \\n(#T>=0 .nr #%c \\n(#T\n", 122 linestop[i] + 'a' - 1); 123 /* 124 * bottom of table line 125 */ 126 if(boxflg || allflg || dboxflg){ 127 if(fullbot[nlin - 1] == 0){ 128 if(!pr1403) 129 printf(".if \\n(T. .vs \\n(.vu-\\n(.sp\n"); 130 printf(".if \\n(T. "); 131 drawline(nlin, 0, ncol, dboxflg ? '=' : '-', 1, 0); 132 printf("\n.if \\n(T. .vs\n"); 133 /* 134 * T. is really an argument to a macro but because 135 * of eqn we don't dare pass it as an argument and 136 * reference by $1 137 */ 138 } 139 } 140 for(c = 0; c < ncol; c++){ 141 if((lf = left(nlin - 1, c, &lwid)) >= 0){ 142 printf(".if \\n(#%c>=0 .sp -1\n", 143 linestop[lf] + 'a' - 1); 144 printf(".if \\n(#%c>=0 ", 145 linestop[lf] + 'a' - 1); 146 tohcol(c); 147 drawvert(lf, nlin - 1, c, lwid); 148 printf("\\h'|\\n(TWu'\n"); 149 } 150 } 151 /* 152 * right hand line 153 */ 154 if(boxflg || allflg || dboxflg){ 155 printf(".if \\n(#a>=0 .sp -1\n"); 156 printf(".if \\n(#a>=0 \\h'|\\n(TWu'"); 157 drawvert(0, nlin - 1, ncol, dboxflg ? 2 : 1); 158 printf("\n"); 159 } 160 printf(".ls\n"); 161 printf("..\n"); 162 printf(".ec\n"); 163 } 164