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