| /* tm.c: split numerical fields */ |
| # include "t.h" |
| |
| char * |
| maknew(char *str) |
| { |
| /* make two numerical fields */ |
| int c; |
| char *p, *q, *ba, *dpoint; |
| |
| p = str; |
| for (ba = 0; c = *str; str++) |
| if (c == '\\' && *(str + 1) == '&') |
| ba = str; |
| str = p; |
| if (ba == 0) { |
| for (dpoint = 0; *str; str++) { |
| if (*str == '.' && !ineqn(str, p) && |
| (str > p && digit(*(str - 1)) || |
| digit(*(str + 1)))) |
| dpoint = str; |
| } |
| if (dpoint == 0) |
| for (; str > p; str--) { |
| if (digit( *(str - 1) ) && !ineqn(str, p)) |
| break; |
| } |
| if (!dpoint && p == str) /* not numerical, don't split */ |
| return(0); |
| if (dpoint) |
| str = dpoint; |
| } else |
| str = ba; |
| p = str; |
| if (exstore == 0 || exstore > exlim) { |
| exstore = exspace = chspace(); |
| exlim = exstore + MAXCHS; |
| } |
| q = exstore; |
| while (*exstore++ = *str++) |
| ; |
| *p = 0; |
| return(q); |
| } |
| |
| |
| int |
| ineqn (char *s, char *p) |
| { |
| /* true if s is in a eqn within p */ |
| int ineq = 0, c; |
| |
| while (c = *p) { |
| if (s == p) |
| return(ineq); |
| p++; |
| if ((ineq == 0) && (c == delim1)) |
| ineq = 1; |
| else if ((ineq == 1) && (c == delim2)) |
| ineq = 0; |
| } |
| return(0); |
| } |
| |
| |