xref: /csrg-svn/old/tbl/tm.c (revision 11043)
1 /*	tm.c	4.1	83/02/12	*/
2 
3  /* tm.c: split numerical fields */
4 # include "t..c"
5 maknew(str)
6 	char *str;
7 {
8 	/* make two numerical fields */
9 	int dpoint, c;
10 	char *p, *q, *ba;
11 	p = str;
12 	for (ba= 0; c = *str; str++)
13 		if (c == '\\' && *(str+1)== '&')
14 			ba=str;
15 	str=p;
16 	if (ba==0)
17 		{
18 		for (dpoint=0; *str; str++)
19 			{
20 			if (*str=='.' && !ineqn(str,p) &&
21 				(str>p && digit(*(str-1)) ||
22 				digit(*(str+1))))
23 					dpoint=str;
24 			}
25 		if (dpoint==0)
26 			for(; str>p; str--)
27 			{
28 			if (digit( * (str-1) ) && !ineqn(str, p))
29 				break;
30 			}
31 		if (!dpoint && p==str) /* not numerical, don't split */
32 			return(0);
33 		if (dpoint) str=dpoint;
34 		}
35 	else
36 		str = ba;
37 	p =str;
38 	if (exstore ==0 || exstore >exlim)
39 		{
40 		exstore = chspace();
41 		exlim= exstore+MAXCHS;
42 		}
43 	q = exstore;
44 	while (*exstore++ = *str++);
45 	*p = 0;
46 	return(q);
47 	}
48 ineqn (s, p)
49 	char *s, *p;
50 {
51 /* true if s is in a eqn within p */
52 int ineq = 0, c;
53 while (c = *p)
54 	{
55 	if (s == p)
56 		return(ineq);
57 	p++;
58 	if ((ineq == 0) && (c == delim1))
59 		ineq = 1;
60 	else
61 	if ((ineq == 1) && (c == delim2))
62 		ineq = 0;
63 	}
64 return(0);
65 }
66