Add original unix v6
This commit is contained in:
+317
@@ -0,0 +1,317 @@
|
||||
#
|
||||
# define ever (;;)
|
||||
# define MAXCHS 2000
|
||||
main(argc,argv)
|
||||
char *argv[];
|
||||
{
|
||||
char line[200];
|
||||
extern int cin;
|
||||
extern char *cspace;
|
||||
cspace = getvec(MAXCHS + 100);
|
||||
for ever
|
||||
{
|
||||
if (argc>1)
|
||||
{
|
||||
argc--;
|
||||
argv++;
|
||||
if (match(*argv, "-ms"))
|
||||
*argv = "/usr/lib/tmac.s";
|
||||
cin = copen(*argv, 'r');
|
||||
if (cin < 0)
|
||||
{
|
||||
printf(2,"where is input file %s\n",*argv);
|
||||
cexit();
|
||||
}
|
||||
}
|
||||
while (gets(line))
|
||||
if (match(line, ".TS"))
|
||||
tableput();
|
||||
else
|
||||
puts(line);
|
||||
if (argc <= 1) break;
|
||||
}
|
||||
cexit();
|
||||
}
|
||||
# define MAXCOL 35
|
||||
# define MAXLIN 220
|
||||
# define ONELINE 250
|
||||
char *tabentry[MAXLIN][MAXCOL];
|
||||
char extra[MAXCHS];
|
||||
char *cspace, *cstore;
|
||||
char *exstore extra;
|
||||
int sep[MAXCOL], dwide[MAXCOL];
|
||||
char *instead[MAXLIN];
|
||||
int newtab[MAXLIN];
|
||||
char *style[MAXCOL];
|
||||
tableput()
|
||||
{
|
||||
/* read input, write output, make tables on the way */
|
||||
char st[ONELINE], *format;
|
||||
int ilin, nlin, icol, ncol, k, ch, ws, cs, ns;
|
||||
int maxchnge, ct;
|
||||
printf(".TS\n");
|
||||
/* get command line */
|
||||
cstore = cspace;
|
||||
exstore = extra;
|
||||
ncol = 0;
|
||||
for (ilin=0; ilin<MAXLIN; ilin++)
|
||||
newtab[ilin]=0;
|
||||
gets (st);
|
||||
for (k=0; k<ONELINE && st[k] != '\0'; k++)
|
||||
if (!space(st[k]))
|
||||
{
|
||||
style[ncol] = st+k;
|
||||
dwide[ncol] =0;
|
||||
for(; letter(st[k]); k++)
|
||||
{
|
||||
if ((st[k]=='n' || st[k] == 'N') &&
|
||||
!dwide[ncol])
|
||||
{
|
||||
dwide[ncol]=1;
|
||||
sep[ncol++] = 0;
|
||||
style[ncol] = style[ncol-1];
|
||||
dwide [ncol] = 0;
|
||||
}
|
||||
}
|
||||
if (digit(st[k]))
|
||||
sep[ncol] = numb(st+k);
|
||||
else
|
||||
sep[ncol] = 3;
|
||||
ncol++;
|
||||
while (digit(st[k]))
|
||||
st[k++] = '\0';
|
||||
if (st[k] == '\0')
|
||||
break;
|
||||
st[k] = '\0';
|
||||
}
|
||||
/* now get input lines */
|
||||
for (nlin=0; gets(cstore) && !match(cstore, ".TE"); nlin++)
|
||||
{
|
||||
if (cstore[0] == '.' && letter(cstore[1]))
|
||||
{
|
||||
instead[nlin] = cstore;
|
||||
while (*cstore) cstore++;
|
||||
}
|
||||
else instead[nlin] = 0;
|
||||
for (icol = 0; icol <ncol; icol++)
|
||||
{
|
||||
tabentry[nlin][icol] = cstore;
|
||||
for(; (ch= *cstore) != '\0' && ch != '\t'; cstore++)
|
||||
;
|
||||
*cstore++ = '\0';
|
||||
if (dwide[icol] )
|
||||
if (broken(style[icol],nlin))
|
||||
{
|
||||
tabentry[nlin][icol+1]=maknew(tabentry[nlin][icol]);
|
||||
icol++;
|
||||
if (tabentry[nlin][icol] ==0)
|
||||
newtab[nlin]=newtab[nlin+1]=1;
|
||||
}
|
||||
else
|
||||
tabentry[nlin][++icol] = 0;
|
||||
while (span(style[icol+1],nlin) )
|
||||
tabentry[nlin][++icol] = "";
|
||||
if (ch == '\0') break;
|
||||
}
|
||||
while (++icol <ncol)
|
||||
tabentry[nlin][icol] = "";
|
||||
while (*cstore != '\0')
|
||||
*cstore++;
|
||||
if (cstore-cspace > MAXCHS)
|
||||
cstore = cspace = getvec(MAXCHS+100);
|
||||
}
|
||||
/* find longest command string */
|
||||
for (icol=maxchnge=0; icol<ncol; icol++)
|
||||
if (slen(style[icol]) >maxchnge)
|
||||
maxchnge = slen(style[icol]);
|
||||
/* set tab stops */
|
||||
printf(".nr 49 0\n");
|
||||
for (icol = 0; icol<ncol; icol++)
|
||||
{
|
||||
ct = 1 + (icol>0 ? sep[icol-1] : 0);
|
||||
printf(".nr %2d 0\n", icol+50);
|
||||
for (ilin=0; ilin < nlin; ilin++)
|
||||
{
|
||||
if (icol>0 && dwide[icol-1]>0 && tabentry[ilin][icol]==0)
|
||||
{
|
||||
printf(".nr 48 \\n(%2d+\\w'%s'+%dn\n",
|
||||
icol+48, tabentry[ilin][icol-1], sep[icol-1]);
|
||||
printf(".if \\n(48-\\n(%2d .nr %2d \\n(48\n",
|
||||
icol+50,icol+50);
|
||||
}
|
||||
if ( !span(style[icol],ilin) && /* not part of span */
|
||||
(dwide[icol] == 0 || tabentry[ilin][icol+1]!= 0)
|
||||
/* not a double item */
|
||||
&& (!span(style[icol+1],ilin) || icol==ncol))
|
||||
{
|
||||
printf(".nr 47 \\n(%2d+\\w'%s'+%dn\n",
|
||||
icol+49,tabentry[ilin][icol], ct);
|
||||
printf(".if \\n(47-\\n(%2d .nr %2d \\n(47\n",
|
||||
icol+50,icol+50);
|
||||
}
|
||||
}
|
||||
/* clean up spanned headings */
|
||||
for(ilin=0; ilin<maxchnge; ilin++)
|
||||
{
|
||||
if( !(span(style[icol],ilin)) &&
|
||||
(icol ==1 || dwide[icol-1] == 0) &&
|
||||
span(style[icol+(dwide[icol]?2:1)],ilin))
|
||||
printf(".nr %d \\n(%2d+\\w'%s'+%dn\n",
|
||||
ilin+30, icol+49, tabentry[ilin][icol], ct);
|
||||
else if (span(style[icol],ilin) &&
|
||||
(icol+1==ncol || !span(style[icol+1],ilin)))
|
||||
printf(".if \\n(%d-\\n(%d .nr %d \\n(%d\n",
|
||||
30+ilin, icol+50, icol+50, ilin+30);
|
||||
}
|
||||
}
|
||||
/* run out table, put field characters in */
|
||||
printf (".fc @\n");
|
||||
for (ilin=0; ilin<nlin; ilin++)
|
||||
{
|
||||
if (instead[ilin])
|
||||
{
|
||||
printf("%s\n",instead[ilin]);
|
||||
continue;
|
||||
}
|
||||
/* is a new set of tab stops needed */
|
||||
if (ilin < maxchnge || newtab[ilin])
|
||||
settab(ncol, ilin);
|
||||
for (icol=0; icol<ncol; icol++)
|
||||
{
|
||||
switch ( ylet(style[icol],ilin))
|
||||
{
|
||||
default:
|
||||
case 'L': case 'l':
|
||||
format = "%s@"; break;
|
||||
case 'R': case 'r':
|
||||
format= "@%s"; break;
|
||||
case 'n': case 'N':
|
||||
if (!dwide[icol] || tabentry[ilin][icol+1] != 0)
|
||||
{
|
||||
format=dwide[icol]? "@%s" : "%s@";
|
||||
break;
|
||||
}
|
||||
case 'c': case 'C':
|
||||
format = "@%s@"; break;
|
||||
case 's': case 'S':
|
||||
format= "";
|
||||
break;
|
||||
}
|
||||
if (! (dwide [icol-1]>0 && tabentry[ilin][icol] == 0 ))
|
||||
printf(format, tabentry[ilin][icol]);
|
||||
if (!span(style[icol+1],ilin))
|
||||
for (k=sep[icol]; k>0; k--)
|
||||
printf(" ");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
printf(".fc\n");
|
||||
printf(".TE\n");
|
||||
}
|
||||
match (s1, s2)
|
||||
char *s1, *s2;
|
||||
{
|
||||
while (*s1 == *s2)
|
||||
if (*s1++ == '\0')
|
||||
return(1);
|
||||
else
|
||||
*s2++;
|
||||
return(0);
|
||||
}
|
||||
slen(str)
|
||||
char *str;
|
||||
{
|
||||
int k;
|
||||
for (k=0; *str++ != '\0'; k++);
|
||||
return(k);
|
||||
}
|
||||
space(ch)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
case ' ': case '\t':
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
letter (ch)
|
||||
{
|
||||
if (ch >= 'a' && ch <= 'z')
|
||||
return(1);
|
||||
if (ch >= 'A' && ch <= 'Z')
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
numb(str)
|
||||
char *str;
|
||||
{
|
||||
/* convert to integer */
|
||||
int k;
|
||||
for (k=0; *str >= '0' && *str <= '9'; str++)
|
||||
k = k*10 + *str - '0';
|
||||
return(k);
|
||||
}
|
||||
broken(str, nlin)
|
||||
{
|
||||
switch(ylet(str,nlin))
|
||||
{
|
||||
case 'n': case 'N':
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
ylet (str, k)
|
||||
char *str;
|
||||
{
|
||||
k++;
|
||||
while (*str &&k--)
|
||||
str++;
|
||||
return(*--str);
|
||||
}
|
||||
span(str, k)
|
||||
{
|
||||
switch(ylet(str,k))
|
||||
{
|
||||
case 's': case 'S':
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
maknew(str)
|
||||
char *str;
|
||||
{
|
||||
/* make two numerical fields */
|
||||
int point;
|
||||
char *p, *q;
|
||||
p = str;
|
||||
for (point=0; *str; str++)
|
||||
if (*str=='.')
|
||||
point=1;
|
||||
if (!point && *(str-1)== '$')
|
||||
return(0);
|
||||
for(; str>p; str--)
|
||||
if ( (point && *str == '.') ||
|
||||
(!point && digit(*(str-1)) ) )
|
||||
break;
|
||||
if (!point && p==str) /* not numerical, don't split */
|
||||
return(0);
|
||||
p= str;
|
||||
q = exstore;
|
||||
while (*exstore++ = *str++);
|
||||
*p = 0;
|
||||
return(q);
|
||||
}
|
||||
digit(x)
|
||||
{
|
||||
return(x>= '0' && x<= '9');
|
||||
}
|
||||
settab(ncol, ilin)
|
||||
{
|
||||
int k, icol;
|
||||
printf(".ta ");
|
||||
for (icol = 0; icol<ncol; icol++)
|
||||
if ((dwide[icol] == 0 || tabentry[ilin][icol+1] != 0)
|
||||
&& !span(style[icol+1],ilin))
|
||||
printf("\\n(%du ",icol+50);
|
||||
printf("\n");
|
||||
}
|
||||
Reference in New Issue
Block a user