1 /* 2 * Copyright 1998 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 7 /* All Rights Reserved */ 8 9 /* 10 * Copyright (c) 1980 Regents of the University of California. 11 * All rights reserved. The Berkeley software License Agreement 12 * specifies the terms and conditions for redistribution. 13 */ 14 15 /* t7.c: control to write table entries */ 16 # include "t..c" 17 # define realsplit ((ct=='a'||ct=='n') && table[ldata][c].rcol) 18 19 void need(void); 20 void deftail(void); 21 22 void 23 runout(void) 24 { 25 int i; 26 if (boxflg || allflg || dboxflg) need(); 27 if (ctrflg) 28 { 29 fprintf(tabout, ".nr #I \\n(.i\n"); 30 fprintf(tabout, ".in +(\\n(.lu-\\n(TWu-\\n(.iu)/2u\n"); 31 } 32 fprintf(tabout, ".fc %c %c\n", F1, F2); 33 fprintf(tabout, ".nr #T 0-1\n"); 34 deftail(); 35 for(i=0; i<nlin; i++) 36 putline(i,i); 37 if (leftover) 38 yetmore(); 39 fprintf(tabout, ".fc\n"); 40 fprintf(tabout, ".nr T. 1\n"); 41 fprintf(tabout, ".T# 1\n"); 42 if (ctrflg) 43 fprintf(tabout, ".in \\n(#Iu\n"); 44 } 45 46 void 47 runtabs(int lform, int ldata) 48 { 49 int c, ct, vforml, lf; 50 fprintf(tabout, ".ta "); 51 for(c=0; c<ncol; c++) 52 { 53 vforml=lform; 54 for(lf=prev(lform); lf>=0 && vspen(table[lf][c].col); lf=prev(lf)) 55 vforml=lf; 56 if (fspan(vforml,c)) 57 continue; 58 switch(ct=ctype(vforml,c)) 59 { 60 case 'n': 61 case 'a': 62 if (table[ldata][c].rcol) 63 if (lused[c]) /*Zero field width*/ 64 fprintf(tabout, "\\n(%du ",c+CMID); 65 case 'c': 66 case 'l': 67 case 'r': 68 if (realsplit? rused[c]: (used[c]+lused[c])) 69 fprintf(tabout, "\\n(%du ",c+CRIGHT); 70 continue; 71 case 's': 72 if (lspan(lform, c)) 73 fprintf(tabout, "\\n(%du ", c+CRIGHT); 74 continue; 75 } 76 } 77 fprintf(tabout, "\n"); 78 } 79 80 int 81 ifline(char *s) 82 { 83 if (!point(s)) return(0); 84 if (s[0] == '\\') s++; 85 if (s[1] ) return(0); 86 if (s[0] == '_') return('-'); 87 if (s[0] == '=') return('='); 88 return(0); 89 } 90 91 void 92 need(void) 93 { 94 int texlin, horlin, i; 95 96 for(texlin = horlin = i = 0; i < nlin; i++) { 97 if (allh(i)) 98 horlin++; 99 else if (instead[i] != 0) 100 continue; 101 else 102 texlin++; 103 } 104 (void) fprintf(tabout, ".ne %dv+%dp\n", texlin, 2 * horlin); 105 /* 106 * For nroff runs, we need to reserve space for the full height of the 107 * horizontal rules. If we don't reserve sufficient height, we'll have 108 * problems trying to draw the vertical lines across the page boundary. 109 */ 110 (void) fprintf(tabout, ".if n .ne %dv\n", 2 * texlin + 2 * horlin + 2); 111 } 112 113 void 114 deftail(void) 115 { 116 int i, c, lf, lwid; 117 for(i=0; i<MAXHEAD; i++) 118 if (linestop[i]) 119 fprintf(tabout, ".nr #%c 0-1\n", linestop[i]+'a'-1); 120 fprintf(tabout, ".nr #a 0-1\n"); 121 fprintf(tabout, ".eo\n"); 122 fprintf(tabout, ".de T#\n"); 123 fprintf(tabout, ".ds #d .d\n"); 124 fprintf(tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n"); 125 fprintf(tabout, ".mk ##\n"); 126 fprintf(tabout, ".nr ## -1v\n"); 127 fprintf(tabout, ".ls 1\n"); 128 for(i=0; i<MAXHEAD; i++) 129 if (linestop[i]) 130 fprintf(tabout, ".if \\n(#T>=0 .nr #%c \\n(#T\n",linestop[i]+'a'-1); 131 if (boxflg || allflg || dboxflg) { /* bottom of table line */ 132 if (!pr1403) 133 fprintf(tabout, ".if \\n(T. .vs \\n(.vu-\\n(.sp\n"); 134 fprintf(tabout, ".if \\n(T. "); 135 drawline(nlin,0,ncol, dboxflg ? '=' : '-',1,0); 136 fprintf(tabout, "\n.if \\n(T. .vs\n"); 137 /* T. is really an argument to a macro but because of 138 eqn we don't dare pass it as an argument and reference by $1 */ 139 } 140 for(c=0; c<ncol; c++) 141 { 142 if ((lf=left(nlin-1,c, &lwid))>=0) 143 { 144 fprintf(tabout, ".if \\n(#%c>=0 .sp -1\n",linestop[lf]+'a'-1); 145 fprintf(tabout, ".if \\n(#%c>=0 ", linestop[lf]+'a'-1); 146 tohcol(c); 147 drawvert(lf, nlin-1, c, lwid); 148 fprintf(tabout, "\\h'|\\n(TWu'\n"); 149 } 150 } 151 if (boxflg || allflg || dboxflg) /* right hand line */ 152 { 153 fprintf(tabout, ".if \\n(#a>=0 .sp -1\n"); 154 fprintf(tabout, ".if \\n(#a>=0 \\h'|\\n(TWu'"); 155 drawvert (0, nlin-1, ncol, dboxflg? 2 : 1); 156 fprintf(tabout, "\n"); 157 } 158 fprintf(tabout, ".ls\n"); 159 fprintf(tabout, "..\n"); 160 fprintf(tabout, ".ec\n"); 161 } 162