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

  1.  /* t4.c: read table specification */
  2. # include "t..c"
  3. int oncol;
  4. getspec()
  5. {
  6. int icol, i;
  7. for(icol=0; icol<MAXCOL; icol++)
  8.     {
  9.     sep[icol]= -1;
  10.     evenup[icol]=0;
  11.     cll[icol][0]=0;
  12.     for(i=0; i<MAXHEAD; i++)
  13.         {
  14.         csize[i][icol][0]=0;
  15.         vsize[i][icol][0]=0;
  16.         font[i][icol][0] = lefline[i][icol] = 0;
  17.         ctop[i][icol]=0;
  18.         style[i][icol]= 'l';
  19.         }
  20.     }
  21. nclin=ncol=0;
  22. oncol =0;
  23. left1flg=rightl=0;
  24. readspec();
  25. fprintf(tabout, ".rm");
  26. for(i=0; i<ncol; i++)
  27.     fprintf(tabout, " %02d", 80+i);
  28. fprintf(tabout, "\n");
  29. }
  30. readspec()
  31. {
  32. int icol, c, sawchar, stopc, i;
  33. char sn[10], *snp, *temp;
  34. sawchar=icol=0;
  35. while (c=get1char())
  36.     {
  37.     switch(c)
  38.         {
  39.         default:
  40.             if (c != tab)
  41.             error("bad table specification character");
  42.         case ' ': /* note this is also case tab */
  43.             continue;
  44.         case '\n':
  45.             if(sawchar==0) continue;
  46.         case ',':
  47.         case '.': /* end of table specification */
  48.             ncol = max(ncol, icol);
  49.             if (lefline[nclin][ncol]>0) {ncol++; rightl++;};
  50.             if(sawchar)
  51.                 nclin++;
  52.             if (nclin>=MAXHEAD)
  53.                 error("too many lines in specification");
  54.             icol=0;
  55.             if (ncol==0 || nclin==0)
  56.                 error("no specification");
  57.             if (c== '.')
  58.                 {
  59.                 while ((c=get1char()) && c != '\n')
  60.                     if (c != ' ' && c != '\t')
  61.                         error("dot not last character on format line");
  62.                 /* fix up sep - default is 3 except at edge */
  63.                 for(icol=0; icol<ncol; icol++)
  64.                     if (sep[icol]<0)
  65.                         sep[icol] =  icol+1<ncol ? 3 : 1;
  66.                 if (oncol == 0)
  67.                     oncol = ncol;
  68.                 else if (oncol +2 <ncol)
  69.                     error("tried to widen table in T&, not allowed");
  70.                 return;
  71.                 }
  72.             sawchar=0;
  73.             continue;
  74.         case 'C': case 'S': case 'R': case 'N': case 'L':  case 'A':
  75.             c += ('a'-'A');
  76.         case '_': if (c=='_') c= '-';
  77.         case '=': case '-':
  78.         case '^':
  79.         case 'c': case 's': case 'n': case 'r': case 'l':  case 'a':
  80.             style[nclin][icol]=c;
  81.             if (c== 's' && icol<=0)
  82.                 error("first column can not be S-type");
  83.             if (c=='s' && style[nclin][icol-1] == 'a')
  84.                 {
  85.                 fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n");
  86.                 style[nclin][icol-1] = 'l';
  87.                 }
  88.             if (c=='s' && style[nclin][icol-1] == 'n')
  89.                 {
  90.                 fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n");
  91.                 style[nclin][icol-1] = 'c';
  92.                 }
  93.             icol++;
  94.             if (c=='^' && nclin<=0)
  95.                 error("first row can not contain vertical span");
  96.             if (icol>=MAXCOL)
  97.                 error("too many columns in table");
  98.             sawchar=1;
  99.             continue;
  100.         case 'b': case 'i': 
  101.             c += 'A'-'a';
  102.         case 'B': case 'I':
  103.             if (icol==0) continue;
  104.             snp=font[nclin][icol-1];
  105.             snp[0]= (c=='I' ? '2' : '3');
  106.             snp[1]=0;
  107.             continue;
  108.         case 't': case 'T':
  109.             if (icol>0)
  110.             ctop[nclin][icol-1] = 1;
  111.             continue;
  112.         case 'd': case 'D':
  113.             if (icol>0)
  114.             ctop[nclin][icol-1] = -1;
  115.             continue;
  116.         case 'f': case 'F':
  117.             if (icol==0) continue;
  118.             snp=font[nclin][icol-1];
  119.             snp[0]=snp[1]=stopc=0;
  120.             for(i=0; i<2; i++)
  121.                 {
  122.                 c = get1char();
  123.                 if (i==0 && c=='(')
  124.                     {
  125.                     stopc=')';
  126.                     c = get1char();
  127.                     }
  128.                 if (c==0) break;
  129.                 if (c==stopc) {stopc=0; break;}
  130.                 if (stopc==0)  if (c==' ' || c== tab ) break;
  131.                 if (c=='\n'){un1getc(c); break;}
  132.                 snp[i] = c;
  133.                 if (c>= '0' && c<= '9') break;
  134.                 }
  135.             if (stopc) if (get1char()!=stopc)
  136.                 error("Nonterminated font name");
  137.             continue;
  138.         case 'P': case 'p':
  139.             if (icol<=0) continue;
  140.             temp = snp = csize[nclin][icol-1];
  141.             while (c = get1char())
  142.                 {
  143.                 if (c== ' ' || c== tab || c=='\n') break;
  144.                 if (c=='-' || c == '+')
  145.                     if (snp>temp)
  146.                         break;
  147.                     else
  148.                         *snp++=c;
  149.                 else
  150.                 if (digit(c))
  151.                     *snp++ = c;
  152.                 else break;
  153.                 if (snp-temp>4)
  154.                     error("point size too large");
  155.                 }
  156.             *snp = 0;
  157.             if (atoi(temp)>36)
  158.                 error("point size unreasonable");
  159.             un1getc (c);
  160.             continue;
  161.         case 'V': case 'v':
  162.             if (icol<=0) continue;
  163.             temp = snp = vsize[nclin][icol-1];
  164.             while (c = get1char())
  165.                 {
  166.                 if (c== ' ' || c== tab || c=='\n') break;
  167.                 if (c=='-' || c == '+')
  168.                     if (snp>temp)
  169.                         break;
  170.                     else
  171.                         *snp++=c;
  172.                 else
  173.                 if (digit(c))
  174.                     *snp++ = c;
  175.                 else break;
  176.                 if (snp-temp>4)
  177.                     error("vertical spacing value too large");
  178.                 }
  179.             *snp=0;
  180.             un1getc(c);
  181.             continue;
  182.         case 'w': case 'W':
  183.             snp = cll [icol-1];
  184.         /* Dale Smith didn't like this check - possible to have two text blocks
  185.            of different widths now ....
  186.             if (*snp)
  187.                 {
  188.                 fprintf(tabout, "Ignored second width specification");
  189.                 continue;
  190.                 }
  191.         /* end commented out code ... */
  192.             stopc=0;
  193.             while (c = get1char())
  194.                 {
  195.                 if (snp==cll[icol-1] && c=='(')
  196.                     {
  197.                     stopc = ')';
  198.                     continue;
  199.                     }
  200.                 if ( !stopc && (c>'9' || c< '0'))
  201.                     break;
  202.                 if (stopc && c== stopc)
  203.                     break;
  204.                 *snp++ =c;
  205.                 }
  206.             *snp=0;
  207.             if (snp-cll[icol-1]>CLLEN)
  208.                 error ("column width too long");
  209.             if (!stopc)
  210.                 un1getc(c);
  211.             continue;
  212.         case 'e': case 'E':
  213.             if (icol<1) continue;
  214.             evenup[icol-1]=1;
  215.             evenflg=1;
  216.             continue;
  217.         case '0': case '1': case '2': case '3': case '4':
  218.         case '5': case '6': case '7': case '8': case '9': 
  219.             sn[0] = c;
  220.             snp=sn+1;
  221.             while (digit(*snp++ = c = get1char()))
  222.                 ;
  223.             un1getc(c);
  224.             sep[icol-1] = max(sep[icol-1], numb(sn));
  225.             continue;
  226.         case '|':
  227.             lefline[nclin][icol]++;
  228.             if (icol==0) left1flg=1;
  229.             continue;
  230.         }
  231.     }
  232. error("EOF reading table specification");
  233. }
  234.