/*
* 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.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/* 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);
}