home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / tbl / tm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.0 KB  |  64 lines

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