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