1 /* 2 * Copyright 1990 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 7 /* All Rights Reserved */ 8 9 /* 10 * Copyright (c) 1980 Regents of the University of California. 11 * All rights reserved. The Berkeley software License Agreement 12 * specifies the terms and conditions for redistribution. 13 */ 14 15 #pragma ident "%Z%%M% %I% %E% SMI" 16 17 /* tt.c: subroutines for drawing horizontal lines */ 18 # include "t..c" 19 20 int 21 ctype(int il, int ic) 22 { 23 if (instead[il]) 24 return(0); 25 if (fullbot[il]) 26 return(0); 27 il = stynum[il]; 28 return(style[il][ic]); 29 } 30 31 int 32 min(int a, int b) 33 { 34 return(a<b ? a : b); 35 } 36 37 int 38 fspan(int i, int c) 39 { 40 c++; 41 return(c<ncol && ctype(i,c)=='s'); 42 } 43 44 int 45 lspan(int i, int c) 46 { 47 int k; 48 if (ctype(i,c) != 's') return(0); 49 c++; 50 if (c < ncol && ctype(i,c)== 's') 51 return(0); 52 for(k=0; ctype(i,--c) == 's'; k++); 53 return(k); 54 } 55 56 int 57 ctspan(int i, int c) 58 { 59 int k; 60 c++; 61 for(k=1; c<ncol && ctype(i,c)=='s'; k++) 62 c++; 63 return(k); 64 } 65 66 void 67 tohcol(int ic) 68 { 69 if (ic==0) 70 fprintf(tabout, "\\h'|0'"); 71 else 72 fprintf(tabout, "\\h'(|\\n(%du+|\\n(%du)/2u'", ic+CLEFT, ic+CRIGHT-1); 73 } 74 75 int 76 allh(int i) 77 { 78 /* return true if every element in line i is horizontal */ 79 /* also at least one must be horizontl */ 80 int c, one, k; 81 if (fullbot[i]) return(1); 82 for(one=c=0; c<ncol; c++) 83 { 84 k = thish(i,c); 85 if (k==0) return(0); 86 if (k==1) continue; 87 one=1; 88 } 89 return(one); 90 } 91 92 int 93 thish(int i, int c) 94 { 95 int t; 96 char *s; 97 struct colstr *pc; 98 if (c<0)return(0); 99 if (i<0) return(0); 100 t = ctype(i,c); 101 if (t=='_' || t == '-') 102 return('-'); 103 if (t=='=')return('='); 104 if (t=='^') return(1); 105 if (fullbot[i] ) 106 return(fullbot[i]); 107 if (t=='s') return(thish(i,c-1)); 108 if (t==0) return(1); 109 pc = &table[i][c]; 110 s = (t=='a' ? pc->rcol : pc->col); 111 if (s==0 || (point(s) && *s==0)) 112 return(1); 113 if (vspen(s)) return(1); 114 if (t=barent( s)) 115 return(t); 116 return(0); 117 } 118