| #ifndef lint |
| static char sccsid[] = "@(#)tv.c 4.3 8/11/83"; |
| #endif |
| |
| /* tv.c: draw vertical lines */ |
| # include "t..c" |
| |
| extern int allh(int i); |
| extern int interh(int i,int c); |
| extern int ctype(int il,int ic); |
| extern int point(int s); |
| |
| int midbar(int i,int c); |
| int midbcol(int i,int c); |
| int barent(char *s); |
| |
| void drawvert(int start,int end,int c,int lwid) |
| { |
| char *exb=0, *ext=0; |
| int tp=0, sl, ln, pos, epb, ept, vm; |
| end++; |
| vm='v'; |
| /* note: nr 35 has value of 1m outside of linesize */ |
| while (instead[end]) end++; |
| for(ln=0; ln<lwid; ln++) |
| { |
| epb=ept=0; |
| pos = 2*ln-lwid+1; |
| if (pos!=tp) fprintf(tabout, "\\h'%dp'", pos-tp); |
| tp = pos; |
| if (end<nlin) |
| { |
| if (fullbot[end]|| (!instead[end] && allh(end))) |
| epb=2; |
| else |
| switch (midbar(end,c)) |
| { |
| case '-': |
| exb = "1v-.5m"; break; |
| case '=': |
| exb = "1v-.5m"; |
| epb = 1; break; |
| } |
| } |
| if (lwid>1) |
| switch(interh(end, c)) |
| { |
| case THRU: epb -= 1; break; |
| case RIGHT: epb += (ln==0 ? 1 : -1); break; |
| case LEFT: epb += (ln==1 ? 1 : -1); break; |
| } |
| if (lwid==1) |
| switch(interh(end,c)) |
| { |
| case THRU: epb -= 1; break; |
| case RIGHT: case LEFT: epb += 1; break; |
| } |
| if (start>0) |
| { |
| sl = start-1; |
| while (sl>=0 && instead[sl]) sl--; |
| if (sl>=0 && (fullbot[sl] || allh(sl))) |
| ept=0; |
| else |
| if (sl>=0) |
| switch(midbar(sl,c)) |
| { |
| case '-': |
| ext = ".5m"; break; |
| case '=': |
| ext= ".5m"; ept = -1; break; |
| default: |
| vm = 'm'; break; |
| } |
| else |
| ept = -4; |
| } |
| else if (start==0 && allh(0)) |
| { |
| ept=0; |
| vm = 'm'; |
| } |
| if (lwid>1) |
| switch(interh(start,c)) |
| { |
| case THRU: ept += 1; break; |
| case LEFT: ept += (ln==0 ? 1 : -1); break; |
| case RIGHT: ept += (ln==1 ? 1 : -1); break; |
| } |
| else if (lwid==1) |
| switch(interh(start,c)) |
| { |
| case THRU: ept += 1; break; |
| case LEFT: case RIGHT: ept -= 1; break; |
| } |
| if (exb) |
| fprintf(tabout, "\\v'%s'", exb); |
| if (epb) |
| fprintf(tabout, "\\v'%dp'", epb); |
| fprintf(tabout, "\\s\\n(%d",LSIZE); |
| if (linsize) |
| fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE); |
| fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */ |
| fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start]+'a'-1, vm=='v'? "1v" : "\\n(35u"); |
| if (ext) |
| fprintf(tabout, "-(%s)",ext); |
| if (exb) |
| fprintf(tabout, "-(%s)", exb); |
| pos = ept-epb; |
| if (pos) |
| fprintf(tabout, "%s%dp", pos>=0? "+" : "", pos); |
| /* the string #d is either "nl" or ".d" depending |
| on diversions; on GCOS not the same */ |
| fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", linestop[start]+'a'-1,vm=='v' ? "1v" : "\\n(35u"); |
| if (ext) |
| fprintf(tabout, "+%s",ext); |
| if (ept) |
| fprintf(tabout, "%s%dp", (-ept)>0 ? "+" : "", (-ept)); |
| fprintf(tabout, "'"); |
| if (linsize) |
| fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE); |
| } |
| } |
| |
| |
| int midbar(int i,int c) |
| { |
| int k; |
| k = midbcol(i,c); |
| if (k==0 && c>0) |
| k = midbcol(i, c-1); |
| return(k); |
| } |
| |
| int midbcol(int i,int c) |
| { |
| int ct; |
| while ( (ct=ctype(i,c)) == 's') |
| c--; |
| if (ct=='-' || ct == '=') |
| return(ct); |
| if (ct=barent(table[i][c].col)) |
| return(ct); |
| return(0); |
| } |
| |
| int barent(char *s) |
| { |
| if (s==0) return (1); |
| if (!point((int)s)) return(1); |
| if (s[0]== '\\') s++; |
| if (s[1]!= 0) |
| return(0); |
| switch(s[0]) |
| { |
| case '_': |
| return('-'); |
| case '=': |
| return('='); |
| } |
| return(0); |
| } |