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