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