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