|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 4191 (0x105f)
Types: TextFile
Notes: UNIX file
Names: »c.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »cmd/c.c«
#include <stdio.h>
#define NAV 5 /* max # environmental args */
struct line {
struct line *l_next;
char *l_line;
};
int width = 80, /* # columns across page */
length = 24, /* # lines down page */
fieldmax, /* # columns of widest field */
nacross, /* # fields across page */
ndown, /* # fields down page */
nfields; /* # fields read from input */
char *sel0( ),
*sel1( ),
*sel2( ),
*(*select)( ) = sel1;
char *getenv();
struct line *lhead,
*ltail;
main( argc, argv)
char *argv[];
{
char obuf[BUFSIZ],
av[NAV];
envargs( av);
setflags( av);
setflags( &argv[1]);
setbuf( stdout, obuf);
input( );
output( );
return (0);
}
setflags( av)
register char **av;
{
for (; *av; ++av) {
if (av[0][0] != '-')
fatal( "%s is not a flag", av[0]);
switch (av[0][1]) {
case '0':
select = sel0;
break;
case '1':
select = sel1;
break;
case '2':
select = sel2;
break;
case 'w':
width = atoi( &av[0][2]);
break;
case 'l':
length = atoi( &av[0][2]);
break;
default:
fatal( "bad flag %s", av[0]);
}
}
}
input( )
{
register struct line *lp;
register i;
char lbuf[BUFSIZ];
while ((i=getline( lbuf)) >= 0) {
lp = malloc( sizeof *lp);
if (lp == NULL)
nomem( );
if (lhead)
ltail->l_next = lp;
else
lhead = lp;
ltail = lp;
lp->l_next = NULL;
if (i) {
lp->l_line = malloc( i+1);
if (lp->l_line == NULL)
nomem( );
strcpy( lp->l_line, lbuf);
}
else
lp->l_line = NULL;
++nfields;
}
++fieldmax;
}
output( )
{
register i,
j;
nacross = (width+1) / fieldmax;
if (nacross <= 0)
nacross = 1;
ndown = (nfields+nacross-1) / nacross;
for (i=0; i<ndown; ++i) {
for (j=0; j<nacross; ++j)
putline( (*select)( i, j));
putline( (char *)0);
}
fclose( stdout);
}
getline( lbuf)
char lbuf[];
{
register char *p;
register col,
xcol;
int c;
p = lbuf;
col = 0;
xcol = 0;
for (; ; ) {
switch (c = getchar( )) {
case EOF:
return (-1);
case '\n':
break;
case ' ':
++xcol;
continue;
case '\t':
xcol = (xcol|7) + 1;
continue;
case '\b':
if (xcol > col)
--xcol;
else if (col) {
--col;
--xcol;
*p++ = c;
}
continue;
default:
while (col < xcol) {
*p++ = ' ';
++col;
}
*p++ = c;
++col;
++xcol;
continue;
}
break;
}
if (col > fieldmax)
fieldmax = col;
*p = '\0';
return (p - lbuf);
}
putline( lbuf)
char *lbuf;
{
register c;
register char *p;
static col,
xcol;
p = lbuf;
if (p == NULL) {
col = 0;
xcol = 0;
putchar( '\n');
return;
}
while (c = *p++)
switch (c) {
case ' ':
++xcol;
break;
case '\b':
--col;
--xcol;
putchar( c);
break;
default:
while ((col|7)+1 <= xcol) {
putchar( '\t');
col = (col|7) + 1;
}
while (col < xcol) {
putchar( ' ');
++col;
}
putchar( c);
++col;
++xcol;
break;
}
xcol += fieldmax - xcol%fieldmax;
}
char *
sel0( i, j)
{
register struct line *lp;
register m,
n;
n = i*nacross + j;
m = 0;
for (lp=lhead; lp; lp=lp->l_next)
if (++m > n)
return (lp->l_line? lp->l_line: "");
return ("");
}
char *
sel1( i, j)
{
register struct line *lp;
register m,
n;
n = i + j*ndown;
m = 0;
for (lp=lhead; lp; lp=lp->l_next)
if (++m > n)
return (lp->l_line? lp->l_line: "");
return ("");
}
char *
sel2( i, j)
{
register struct line *lp;
register m,
n;
n = i + j*(ndown-1) + (j>nfields%nacross? nfields%nacross: j);
if (i*nacross+j >= nfields)
return ("");
lp = lhead;
for (m=0; m<n; ++m)
lp = lp->l_next;
return (lp->l_line? lp->l_line: "");
}
envargs( av)
char **av;
{
register fl;
register char *p;
register char **ap;
ap = av;
*ap = NULL;
if ((p=getenv( "C")) == NULL)
return;
fl = 0;
while (*p)
switch (*p++) {
case '\t':
case '\n':
case ' ':
fl = 0;
p[-1] = '\0';
break;
default:
if (fl)
break;
if (ap >= &av[NAV-1])
fatal( "too many env args");
*ap++ = &p[-1];
++fl;
break;
}
*ap = NULL;
}
nomem( )
{
fatal( "out of mem");
}
fatal( arg0)
char *arg0;
{
fflush( stdout);
fprintf( stderr, "c: %r\n", &arg0);
exit( 1);
}