1 #ifndef lint
2 static char sccsid[] = "@(#)getstop.c	1.2 (CWI) 85/10/02";
3 #endif lint
4 
5 
6 /*
7  * find the start points for the line drawing routines
8  */
9 
10 #include "defs.h"
11 #include "ext.h"
12 
13 getstop()
14 {
15 	register int i, c, k;
16 	int junk, stopp;
17 
18 	stopp = 1;
19 	for(i = 0; i < MAXLIN; i++)
20 		linestop[i] = 0;
21 	for(i = 0; i < nlin; i++){
22 		for(c = 0; c < ncol; c++){
23 			k = left(i, c, &junk);
24 			if(k >= 0 && linestop[k] == 0)
25 				linestop[k] = ++stopp;
26 		}
27 	}
28 	if(boxflg || allflg || dboxflg)
29 		linestop[0] = 1;
30 }
31 
32 /*
33  * returns -1 if no line to left
34  * returns number of line where it starts
35  * stores into lwid the kind of line
36  */
37 left(i, c, lwidp)
38 int i, c;
39 int *lwidp;
40 {
41 	register int kind, li, lj;
42 
43 	*lwidp = 0;
44 	kind = lefdata(i, c);
45 	if(kind == 0)
46 		return(-1);
47 	if(i + 1 < nlin){
48 		if(lefdata(next (i), c) == kind)
49 			return(-1);
50 	}
51 	while(i >= 0 && lefdata(i, c) == kind)
52 		i = prev(li = i);
53 	if(prev(li) == -1)
54 		li = 0;
55 	*lwidp = kind;
56 	for(lj = i + 1; lj < li; lj++){
57 		if(instead[lj] && strcmp(instead[lj], ".TH") == 0)
58 			return(li);
59 	}
60 	for(i = i + 1; i < li; i++){
61 		if(fullbot[i])
62 			li = i;
63 	}
64 	return(li);
65 }
66 
67 lefdata(i, c)
68 {
69 	register int ck;
70 
71 	if(i >= nlin)
72 		i = nlin - 1;
73 	if(ctype(i, c) == 's'){
74 		for(ck = c; ctype(i, ck) == 's'; ck--)
75 			;
76 		if(thish(i, ck) == 0)
77 			return(0);
78 	}
79 	i = stynum[i];
80 	i = lefline[i][c];
81 	if(i > 0)
82 		return(i);
83 	if(dboxflg && c == 0)
84 		return(2);
85 	if(allflg)
86 		return(1);
87 	if(boxflg && c == 0)
88 		return(1);
89 	return(0);
90 }
91 
92 next(i)
93 {
94 	while(i + 1 < nlin){
95 		i++;
96 		if(!fullbot[i] && !instead[i])
97 			break;
98 	}
99 	return(i);
100 }
101 
102 prev(i){
103 	while(--i >= 0 && (fullbot[i] || instead[i]))
104 		;
105 	return(i);
106 }
107