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 if(linsize) 134 printf("\\v'-\\n(%dp/6u'", LSIZE); 135 /* 136 * adjustment for T450 nroff boxes 137 * 138 * Changed by JNA, the register #~ will contain in general 139 * the device dependency adjustment for vertical lines 140 */ 141 printf("\\h'-\\n(#~u'"); 142 /* 143 * Extra corrections for double lines 144 * Works OK on the HARRIS, probably needed for all devices 145 */ 146 if(device == HARRIS && ln == 1) 147 printf("\\h'-\\n(#~u'"); 148 149 printf("\\L'|\\n(#%cu-%s", 150 linestop[start] + 'a' -1, vm == 'v' ? "1v" : "\\n(35u"); 151 if(ext) 152 printf("-(%s)", ext); 153 if(exb) 154 printf("-(%s)", exb); 155 pos = ept - epb; 156 if(pos) 157 printf("%s%dp", pos >= 0 ? "+" : "", pos); 158 /* 159 * the string #d is either "nl" or ".d" depending on diversions; 160 * on GCOS not the same 161 */ 162 printf("'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", 163 linestop[start] + 'a' -1, vm == 'v' ? "1v" : "\\n(35u"); 164 if(ext) 165 printf("+%s", ext); 166 if(ept) 167 printf("%s%dp", (-ept) > 0 ? "+" : "", (-ept)); 168 printf("'"); 169 if(linsize) 170 printf("\\v'\\n(%dp/6u'", LSIZE); 171 } 172 } 173 174 midbar(i, c){ 175 int k; 176 177 k = midbcol(i, c); 178 if(k == 0 && c > 0) 179 k = midbcol(i, c - 1); 180 return(k); 181 } 182 183 midbcol(i, c){ 184 int ct; 185 186 while((ct = ctype(i, c)) == 's') 187 c--; 188 if(ct == '-' || ct == '=') 189 return(ct); 190 if(ct = barent(table[i][c].col)) 191 return(ct); 192 return(0); 193 } 194 195 barent(s) 196 char *s; 197 { 198 if(s == 0) 199 return(1); 200 if(!point(s)) 201 return(1); 202 if(s[0] == '\\') 203 s++; 204 if(s[1] != 0) 205 return(0); 206 switch(s[0]){ 207 208 case '_': 209 return('-'); 210 case '=': 211 return('='); 212 } 213 return(0); 214 } 215