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