root/usr/src/cmd/tbl/tm.c
/*
 * Copyright 1991 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */

/*
 * Copyright (c) 1980 Regents of the University of California.
 * All rights reserved. The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

 /* tm.c: split numerical fields */
# include "t..c"

char *
maknew(char *str)
{
        /* make two numerical fields */
        int c;
        char *dpoint, *p, *q, *ba;
        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 = chspace();
                exlim= exstore+MAXCHS;
                }
        q = exstore;
        ba = exstore + MAXSTR;
        do {
                if (exstore > ba)
                        error(gettext("numeric field too big"));
        } 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);
}