1 /*- 2 * %sccs.include.proprietary.c% 3 */ 4 5 #ifndef lint 6 static char sccsid[] = "@(#)tv.c 4.4 (Berkeley) 04/18/91"; 7 #endif /* not lint */ 8 9 /* tv.c: draw vertical lines */ 10 # include "t..c" 11 drawvert(start,end, c, lwid) 12 { 13 char *exb=0, *ext=0; 14 int tp=0, sl, ln, pos, epb, ept, vm; 15 end++; 16 vm='v'; 17 /* note: nr 35 has value of 1m outside of linesize */ 18 while (instead[end]) end++; 19 for(ln=0; ln<lwid; ln++) 20 { 21 epb=ept=0; 22 pos = 2*ln-lwid+1; 23 if (pos!=tp) fprintf(tabout, "\\h'%dp'", pos-tp); 24 tp = pos; 25 if (end<nlin) 26 { 27 if (fullbot[end]|| (!instead[end] && allh(end))) 28 epb=2; 29 else 30 switch (midbar(end,c)) 31 { 32 case '-': 33 exb = "1v-.5m"; break; 34 case '=': 35 exb = "1v-.5m"; 36 epb = 1; break; 37 } 38 } 39 if (lwid>1) 40 switch(interh(end, c)) 41 { 42 case THRU: epb -= 1; break; 43 case RIGHT: epb += (ln==0 ? 1 : -1); break; 44 case LEFT: epb += (ln==1 ? 1 : -1); break; 45 } 46 if (lwid==1) 47 switch(interh(end,c)) 48 { 49 case THRU: epb -= 1; break; 50 case RIGHT: case LEFT: epb += 1; break; 51 } 52 if (start>0) 53 { 54 sl = start-1; 55 while (sl>=0 && instead[sl]) sl--; 56 if (sl>=0 && (fullbot[sl] || allh(sl))) 57 ept=0; 58 else 59 if (sl>=0) 60 switch(midbar(sl,c)) 61 { 62 case '-': 63 ext = ".5m"; break; 64 case '=': 65 ext= ".5m"; ept = -1; break; 66 default: 67 vm = 'm'; break; 68 } 69 else 70 ept = -4; 71 } 72 else if (start==0 && allh(0)) 73 { 74 ept=0; 75 vm = 'm'; 76 } 77 if (lwid>1) 78 switch(interh(start,c)) 79 { 80 case THRU: ept += 1; break; 81 case LEFT: ept += (ln==0 ? 1 : -1); break; 82 case RIGHT: ept += (ln==1 ? 1 : -1); break; 83 } 84 else if (lwid==1) 85 switch(interh(start,c)) 86 { 87 case THRU: ept += 1; break; 88 case LEFT: case RIGHT: ept -= 1; break; 89 } 90 if (exb) 91 fprintf(tabout, "\\v'%s'", exb); 92 if (epb) 93 fprintf(tabout, "\\v'%dp'", epb); 94 fprintf(tabout, "\\s\\n(%d",LSIZE); 95 if (linsize) 96 fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE); 97 fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */ 98 fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start]+'a'-1, vm=='v'? "1v" : "\\n(35u"); 99 if (ext) 100 fprintf(tabout, "-(%s)",ext); 101 if (exb) 102 fprintf(tabout, "-(%s)", exb); 103 pos = ept-epb; 104 if (pos) 105 fprintf(tabout, "%s%dp", pos>=0? "+" : "", pos); 106 /* the string #d is either "nl" or ".d" depending 107 on diversions; on GCOS not the same */ 108 fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", linestop[start]+'a'-1,vm=='v' ? "1v" : "\\n(35u"); 109 if (ext) 110 fprintf(tabout, "+%s",ext); 111 if (ept) 112 fprintf(tabout, "%s%dp", (-ept)>0 ? "+" : "", (-ept)); 113 fprintf(tabout, "'"); 114 if (linsize) 115 fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE); 116 } 117 } 118 119 120 midbar(i,c) 121 { 122 int k; 123 k = midbcol(i,c); 124 if (k==0 && c>0) 125 k = midbcol(i, c-1); 126 return(k); 127 } 128 midbcol(i,c) 129 { 130 int ct; 131 while ( (ct=ctype(i,c)) == 's') 132 c--; 133 if (ct=='-' || ct == '=') 134 return(ct); 135 if (ct=barent(table[i][c].col)) 136 return(ct); 137 return(0); 138 } 139 140 barent(s) 141 char *s; 142 { 143 if (s==0) return (1); 144 if (!point(s)) return(1); 145 if (s[0]== '\\') s++; 146 if (s[1]!= 0) 147 return(0); 148 switch(s[0]) 149 { 150 case '_': 151 return('-'); 152 case '=': 153 return('='); 154 } 155 return(0); 156 } 157