1 #ifndef lint 2 static char sccsid[] = "@(#)horlines.c 1.2 (CWI) 85/10/02"; 3 #endif lint 4 5 6 /* 7 * draw horizontal lines 8 */ 9 10 #include "defs.h" 11 #include "ext.h" 12 13 makeline(i, c, lintype){ 14 int cr, type, shortl; 15 16 type = thish(i, c); 17 if(type == 0) 18 return; 19 cr = c; 20 shortl = (table[i][c].col[0] == '\\'); 21 if(c > 0 && !shortl && thish(i, c - 1) == type) 22 return; 23 if(shortl == 0) 24 for(cr = c; 25 cr < ncol && (ctype(i, cr) == 's' || type == thish (i, cr)); 26 cr++) 27 ; 28 else 29 for(cr = c + 1; cr < ncol && ctype(i, cr) == 's'; cr++) 30 ; 31 drawline(i, c, cr - 1, lintype, 0, shortl); 32 } 33 34 fullwide(i, lintype) 35 { 36 int cr, cl; 37 38 if(!pr1403) 39 printf(".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS); 40 cr = 0; 41 while(cr < ncol){ 42 cl = cr; 43 while(i > 0 && vspand(prev (i), cl, 1)) 44 cl++; 45 for(cr = cl; cr < ncol; cr++) 46 if(i > 0 && vspand(prev (i), cr, 1)) 47 break; 48 if(cl < ncol) 49 drawline(i, cl, (cr < ncol ? cr - 1 : cr), lintype, 50 1, 0); 51 } 52 printf("\n"); 53 if(!pr1403) 54 printf(".vs \\n(%du\n", SVS); 55 } 56 57 drawline(i, cl, cr, lintype, noheight, shortl) 58 { 59 char *exhr, *exhl; 60 int lcount, ln, linpos, oldpos, nodata, lnch; 61 62 lcount = 0; 63 exhr = exhl = ""; 64 switch(lintype){ 65 66 case '-': 67 lcount = 1; 68 break; 69 case '=': 70 lcount = pr1403 ? 1 : 2; 71 break; 72 case SHORTLINE: 73 lcount = 1; 74 break; 75 } 76 if(lcount <= 0) 77 return; 78 nodata = cr - cl >= ncol || noheight || allh(i); 79 if(!nodata) 80 printf("\\v'-.5m'"); 81 for(ln = oldpos = 0; ln < lcount; ln++){ 82 linpos = 2 * ln - lcount + 1; 83 if(linpos != oldpos) 84 printf("\\v'%dp'", linpos - oldpos); 85 oldpos = linpos; 86 if(shortl == 0){ 87 tohcol(cl); 88 if(lcount > 1){ 89 switch(interv(i, cl)){ 90 case TOP: 91 exhl = ln == 0 ? "1p" : "-1p"; 92 break; 93 case BOT: 94 exhl = ln == 1 ? "1p" : "-1p"; 95 break; 96 case THRU: 97 exhl = "1p"; 98 break; 99 } 100 if(exhl[0]) 101 printf("\\h'%s'", exhl); 102 } else { 103 if(lcount == 1){ 104 switch(interv(i, cl)){ 105 106 case TOP: 107 case BOT: 108 exhl = "-1p"; 109 break; 110 case THRU: 111 exhl = "1p"; 112 break; 113 } 114 if(exhl[0]) 115 printf("\\h'%s'", exhl); 116 } 117 } 118 if(lcount > 1){ 119 switch(interv(i, cr + 1)){ 120 121 case TOP: 122 exhr = ln == 0 ? "-1p" : "+1p"; 123 break; 124 case BOT: 125 exhr = ln == 1 ? "-1p" : "+1p"; 126 break; 127 case THRU: 128 exhr = "-1p"; 129 break; 130 } 131 } else { 132 if(lcount == 1){ 133 switch(interv(i, cr + 1)){ 134 135 case TOP: 136 case BOT: 137 exhr = "+1p"; 138 break; 139 case THRU: 140 exhr = "-1p"; 141 break; 142 } 143 } 144 } 145 } else 146 printf("\\h'|\\n(%du'", reg(cl, CLEFT)); 147 printf("\\s\\n(%d", LSIZE); 148 printf("\\v'-\\n(#|n/100u'"); 149 if(shortl) 150 printf("\\l'|\\n(%du'", reg(cr, CRIGHT)); 151 else { 152 lnch = (int) "\\(ul"; 153 if(pr1403) 154 lnch = lintype == 2 ? (int) "=" : (int) "\\(ru"; 155 if(cr + 1 >= ncol) 156 printf("\\l'|\\n(TWu%s%s'", exhr, lnch); 157 else 158 printf("\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", 159 reg(cr, CRIGHT), 160 reg(cr + 1, CLEFT), exhr, lnch); 161 } 162 printf("\\v'\\n(#|n/100u'"); 163 printf("\\s0"); 164 } 165 if(oldpos != 0) 166 printf("\\v'%dp'", -oldpos); 167 if(!nodata) 168 printf("\\v'+.5m'"); 169 } 170