xref: /plan9/sys/src/cmd/tbl/tc.c (revision 43af371b8d63420d32d0cb0b58914db16dcd7715)
13e12c5d1SDavid du Colombier /* tc.c: find character not in table to delimit fields */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier 
4*43af371bSDavid du Colombier # define COMMON "\002\003\005\006\007!%&#/?,:;<=>@`^~_{}+-*" \
5*43af371bSDavid du Colombier 	"ABCDEFGHIJKMNOPQRSTUVWXZabcdefgjkoqrstwxyz"
6*43af371bSDavid du Colombier 
73e12c5d1SDavid du Colombier void
choochar(void)83e12c5d1SDavid du Colombier choochar(void)
93e12c5d1SDavid du Colombier {
103e12c5d1SDavid du Colombier 				/* choose funny characters to delimit fields */
113e12c5d1SDavid du Colombier 	int	had[128], ilin, icol, k;
123e12c5d1SDavid du Colombier 	char	*s;
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier 	for (icol = 0; icol < 128; icol++)
153e12c5d1SDavid du Colombier 		had[icol] = 0;
163e12c5d1SDavid du Colombier 	F1 = F2 = 0;
173e12c5d1SDavid du Colombier 	for (ilin = 0; ilin < nlin; ilin++) {
18*43af371bSDavid du Colombier 		if (instead[ilin] || fullbot[ilin])
193e12c5d1SDavid du Colombier 			continue;
203e12c5d1SDavid du Colombier 		for (icol = 0; icol < ncol; icol++) {
213e12c5d1SDavid du Colombier 			k = ctype(ilin, icol);
223e12c5d1SDavid du Colombier 			if (k == 0 || k == '-' || k == '=')
233e12c5d1SDavid du Colombier 				continue;
243e12c5d1SDavid du Colombier 			s = table[ilin][icol].col;
253e12c5d1SDavid du Colombier 			if (point(s))
26*43af371bSDavid du Colombier 				for (; *s; s++)
272cca75a1SDavid du Colombier 					if((unsigned char)*s < 128)
282cca75a1SDavid du Colombier 						had[(unsigned char)*s] = 1;
293e12c5d1SDavid du Colombier 			s = table[ilin][icol].rcol;
303e12c5d1SDavid du Colombier 			if (point(s))
31*43af371bSDavid du Colombier 				for (; *s; s++)
322cca75a1SDavid du Colombier 					if((unsigned char)*s < 128)
332cca75a1SDavid du Colombier 						had[(unsigned char)*s] = 1;
343e12c5d1SDavid du Colombier 		}
353e12c5d1SDavid du Colombier 	}
363e12c5d1SDavid du Colombier 				/* choose first funny character */
37*43af371bSDavid du Colombier 	for (s = COMMON "Y"; *s; s++) {
383e12c5d1SDavid du Colombier 		if (had[*s] == 0) {
393e12c5d1SDavid du Colombier 			F1 = *s;
403e12c5d1SDavid du Colombier 			had[F1] = 1;
413e12c5d1SDavid du Colombier 			break;
423e12c5d1SDavid du Colombier 		}
433e12c5d1SDavid du Colombier 	}
443e12c5d1SDavid du Colombier 				/* choose second funny character */
45*43af371bSDavid du Colombier 	for (s = COMMON "u"; *s; s++) {
463e12c5d1SDavid du Colombier 		if (had[*s] == 0) {
473e12c5d1SDavid du Colombier 			F2 = *s;
483e12c5d1SDavid du Colombier 			break;
493e12c5d1SDavid du Colombier 		}
503e12c5d1SDavid du Colombier 	}
513e12c5d1SDavid du Colombier 	if (F1 == 0 || F2 == 0)
523e12c5d1SDavid du Colombier 		error("couldn't find characters to use for delimiters");
533e12c5d1SDavid du Colombier }
543e12c5d1SDavid du Colombier 
553e12c5d1SDavid du Colombier int
point(char * ss)564de34a7eSDavid du Colombier point(char *ss)
573e12c5d1SDavid du Colombier {
58*43af371bSDavid du Colombier 	vlong s = (uintptr)ss;
594de34a7eSDavid du Colombier 
604de34a7eSDavid du Colombier 	return(s >= 128 || s < 0);
613e12c5d1SDavid du Colombier }
62