1 /*
2 * Copyright 1991 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 /* tm.c: split numerical fields */
16 # include "t..c"
17
18 char *
maknew(char * str)19 maknew(char *str)
20 {
21 /* make two numerical fields */
22 int c;
23 char *dpoint, *p, *q, *ba;
24 p = str;
25 for (ba= 0; c = *str; str++)
26 if (c == '\\' && *(str+1)== '&')
27 ba=str;
28 str=p;
29 if (ba==0)
30 {
31 for (dpoint=0; *str; str++)
32 {
33 if (*str=='.' && !ineqn(str,p) &&
34 (str>p && digit(*(str-1)) ||
35 digit(*(str+1))))
36 dpoint=str;
37 }
38 if (dpoint==0)
39 for(; str>p; str--)
40 {
41 if (digit( * (str-1) ) && !ineqn(str, p))
42 break;
43 }
44 if (!dpoint && p==str) /* not numerical, don't split */
45 return(0);
46 if (dpoint) str=dpoint;
47 }
48 else
49 str = ba;
50 p =str;
51 if (exstore ==0 || exstore >exlim)
52 {
53 exstore = chspace();
54 exlim= exstore+MAXCHS;
55 }
56 q = exstore;
57 ba = exstore + MAXSTR;
58 do {
59 if (exstore > ba)
60 error(gettext("numeric field too big"));
61 } while (*exstore++ = *str++);
62 *p = 0;
63 return(q);
64 }
65
66 int
ineqn(char * s,char * p)67 ineqn (char *s, char *p)
68 {
69 /* true if s is in a eqn within p */
70 int ineq = 0, c;
71 while (c = *p)
72 {
73 if (s == p)
74 return(ineq);
75 p++;
76 if ((ineq == 0) && (c == delim1))
77 ineq = 1;
78 else
79 if ((ineq == 1) && (c == delim2))
80 ineq = 0;
81 }
82 return(0);
83 }
84