xref: /plan9/sys/src/cmd/tbl/tm.c (revision 5e91980f0bca263e952809e3dc0cfc5dde74b999)
13e12c5d1SDavid du Colombier /* tm.c: split numerical fields */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier char	*
maknew(char * str)53e12c5d1SDavid du Colombier maknew(char *str)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier 				/* make two numerical fields */
8*5e91980fSDavid du Colombier 	int	c;
9*5e91980fSDavid du Colombier 	char	*p, *q, *ba, *dpoint;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier 	p = str;
123e12c5d1SDavid du Colombier 	for (ba = 0; c = *str; str++)
133e12c5d1SDavid du Colombier 		if (c == '\\' && *(str + 1) == '&')
143e12c5d1SDavid du Colombier 			ba = str;
153e12c5d1SDavid du Colombier 	str = p;
163e12c5d1SDavid du Colombier 	if (ba == 0) {
173e12c5d1SDavid du Colombier 		for (dpoint = 0; *str; str++) {
183e12c5d1SDavid du Colombier 			if (*str == '.' && !ineqn(str, p) &&
193e12c5d1SDavid du Colombier 			    (str > p && digit(*(str - 1)) ||
203e12c5d1SDavid du Colombier 			    digit(*(str + 1))))
21*5e91980fSDavid du Colombier 				dpoint = str;
223e12c5d1SDavid du Colombier 		}
233e12c5d1SDavid du Colombier 		if (dpoint == 0)
243e12c5d1SDavid du Colombier 			for (; str > p; str--) {
253e12c5d1SDavid du Colombier 				if (digit( *(str - 1) ) && !ineqn(str, p))
263e12c5d1SDavid du Colombier 					break;
273e12c5d1SDavid du Colombier 			}
283e12c5d1SDavid du Colombier 		if (!dpoint && p == str) /* not numerical, don't split */
293e12c5d1SDavid du Colombier 			return(0);
303e12c5d1SDavid du Colombier 		if (dpoint)
31*5e91980fSDavid du Colombier 			str = dpoint;
323e12c5d1SDavid du Colombier 	} else
333e12c5d1SDavid du Colombier 		str = ba;
343e12c5d1SDavid du Colombier 	p = str;
353e12c5d1SDavid du Colombier 	if (exstore == 0 || exstore > exlim) {
363e12c5d1SDavid du Colombier 		exstore = exspace = chspace();
373e12c5d1SDavid du Colombier 		exlim = exstore + MAXCHS;
383e12c5d1SDavid du Colombier 	}
393e12c5d1SDavid du Colombier 	q = exstore;
403e12c5d1SDavid du Colombier 	while (*exstore++ = *str++)
413e12c5d1SDavid du Colombier 		;
423e12c5d1SDavid du Colombier 	*p = 0;
433e12c5d1SDavid du Colombier 	return(q);
443e12c5d1SDavid du Colombier }
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier int
ineqn(char * s,char * p)483e12c5d1SDavid du Colombier ineqn (char *s, char *p)
493e12c5d1SDavid du Colombier {
503e12c5d1SDavid du Colombier 				/* true if s is in a eqn within p */
513e12c5d1SDavid du Colombier 	int	ineq = 0, c;
523e12c5d1SDavid du Colombier 
533e12c5d1SDavid du Colombier 	while (c = *p) {
543e12c5d1SDavid du Colombier 		if (s == p)
553e12c5d1SDavid du Colombier 			return(ineq);
563e12c5d1SDavid du Colombier 		p++;
573e12c5d1SDavid du Colombier 		if ((ineq == 0) && (c == delim1))
583e12c5d1SDavid du Colombier 			ineq = 1;
593e12c5d1SDavid du Colombier 		else if ((ineq == 1) && (c == delim2))
603e12c5d1SDavid du Colombier 			ineq = 0;
613e12c5d1SDavid du Colombier 	}
623e12c5d1SDavid du Colombier 	return(0);
633e12c5d1SDavid du Colombier }
643e12c5d1SDavid du Colombier 
653e12c5d1SDavid du Colombier 
66