| 1 | #ifndef lint |
| 2 | static char sccsid[] = "@(#)tv.c 4.3 %G%"; |
| 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 | } |