ref: 61f4c085c402af665b436f6d010d61107551d8a3
dir: /sys/src/cmd/tbl/tm.c/
/* 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); }