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

  1.  /* t5.c: read data for table */
  2. # include "t..c"
  3. gettbl()
  4. {
  5. int icol, ch;
  6. cstore=cspace= chspace();
  7. textflg=0;
  8. for (nlin=nslin=0; gets1(cstore); nlin++)
  9.     {
  10.     stynum[nlin]=nslin;
  11.     if (prefix(".TE", cstore))
  12.         {
  13.         leftover=0;
  14.         break;
  15.         }
  16.     if (prefix(".TC", cstore) || prefix(".T&", cstore))
  17.         {
  18.         readspec();
  19.         nslin++;
  20.         }
  21.     if (nlin>=MAXLIN)
  22.         {
  23.         leftover=cstore;
  24.         break;
  25.         }
  26.     fullbot[nlin]=0;
  27.     if (cstore[0] == '.' && !isdigit(cstore[1]))
  28.         {
  29.         instead[nlin] = cstore;
  30.         while (*cstore++);
  31.         continue;
  32.         }
  33.     else instead[nlin] = 0;
  34.     if (nodata(nlin))
  35.         {
  36.         if (ch = oneh(nlin))
  37.             fullbot[nlin]= ch;
  38.         nlin++;
  39.         nslin++;
  40.         instead[nlin]=fullbot[nlin]=0;
  41.         }
  42.     table[nlin] = alocv((ncol+2)*sizeof(table[0][0]));
  43.     if (cstore[1]==0)
  44.     switch(cstore[0])
  45.         {
  46.         case '_': fullbot[nlin]= '-'; continue;
  47.         case '=': fullbot[nlin]= '='; continue;
  48.         }
  49.     stynum[nlin] = nslin;
  50.     nslin = min(nslin+1, nclin-1);
  51.     for (icol = 0; icol <ncol; icol++)
  52.         {
  53.         table[nlin][icol].col = cstore;
  54.         table[nlin][icol].rcol=0;
  55.         ch=1;
  56.         if (match(cstore, "T{")) /* text follows */
  57.             table[nlin][icol].col =
  58.                 gettext(cstore, nlin, icol,
  59.                     font[stynum[nlin]][icol],
  60.                     csize[stynum[nlin]][icol]);
  61.         else
  62.             {
  63.             for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
  64.                     ;
  65.             *cstore++ = '\0';
  66.             switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
  67.                 {
  68.                 case 'n':
  69.                     table[nlin][icol].rcol = maknew(table[nlin][icol].col);
  70.                     break;
  71.                 case 'a':
  72.                     table[nlin][icol].rcol = table[nlin][icol].col;
  73.                     table[nlin][icol].col = "";
  74.                     break;
  75.                 }
  76.             }
  77.         while (ctype(nlin,icol+1)== 's') /* spanning */
  78.             table[nlin][++icol].col = "";
  79.         if (ch == '\0') break;
  80.         }
  81.     while (++icol <ncol+2)
  82.         {
  83.         table[nlin][icol].col = "";
  84.         table [nlin][icol].rcol=0;
  85.         }
  86.     while (*cstore != '\0')
  87.          cstore++;
  88.     if (cstore-cspace > MAXCHS)
  89.         cstore = cspace = chspace();
  90.     }
  91. last = cstore;
  92. permute();
  93. if (textflg) untext();
  94. return;
  95. }
  96. nodata(il)
  97. {
  98. int c;
  99. for (c=0; c<ncol;c++)
  100.     {
  101.     switch(ctype(il,c))
  102.         {
  103.         case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
  104.             return(0);
  105.         }
  106.     }
  107. return(1);
  108. }
  109. oneh(lin)
  110. {
  111. int k, icol;
  112. k = ctype(lin,0);
  113. for(icol=1; icol<ncol; icol++)
  114.     {
  115.     if (k != ctype(lin,icol))
  116.         return(0);
  117.     }
  118. return(k);
  119. }
  120. # define SPAN "\\^"
  121. permute()
  122. {
  123. int irow, jcol, is;
  124. char *start, *strig;
  125. for(jcol=0; jcol<ncol; jcol++)
  126.     {
  127.     for(irow=1; irow<nlin; irow++)
  128.         {
  129.         if (vspand(irow,jcol,0))
  130.             {
  131.             is = prev(irow);
  132.             if (is<0)
  133.                 error("Vertical spanning in first row not allowed");
  134.             start = table[is][jcol].col;
  135.             strig = table[is][jcol].rcol;
  136.             while (irow<nlin &&vspand(irow,jcol,0))
  137.                 irow++;
  138.             table[--irow][jcol].col = start;
  139.             table[irow][jcol].rcol = strig;
  140.             while (is<irow)
  141.                 {
  142.                 table[is][jcol].rcol =0;
  143.                 table[is][jcol].col= SPAN;
  144.                 is = next(is);
  145.                 }
  146.             }
  147.         }
  148.     }
  149. }
  150. vspand(ir,ij,ifform)
  151. {
  152. if (ir<0) return(0);
  153. if (ir>=nlin)return(0);
  154. if (instead[ir]) return(0);
  155. if (ifform==0 && ctype(ir,ij)=='^') return(1);
  156. if (table[ir][ij].rcol!=0) return(0);
  157. if (fullbot[ir]) return(0);
  158. return(vspen(table[ir][ij].col));
  159. }
  160. vspen(s)
  161.     char *s;
  162. {
  163. if (s==0) return(0);
  164. if (!point(s)) return(0);
  165. return(match(s, SPAN));
  166. }
  167.