Add original unix v6
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
fields 0;
|
||||
letters 0;
|
||||
linec;
|
||||
mode;
|
||||
uniq;
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
extern fin, fout;
|
||||
int f;
|
||||
static char b1[1000], b2[1000];
|
||||
|
||||
loop:
|
||||
if(argc > 1) {
|
||||
if(*argv[1] == '-') {
|
||||
if(argv[1][1] <= '9')
|
||||
fields = conv(&argv[1][1]);
|
||||
else mode = argv[1][1];
|
||||
argc--;
|
||||
argv++;
|
||||
goto loop;
|
||||
}
|
||||
if(*argv[1] == '+') {
|
||||
letters = conv(&argv[1][1]);
|
||||
argc--;
|
||||
argv++;
|
||||
goto loop;
|
||||
}
|
||||
f = open(argv[1], 0);
|
||||
if(f < 0) {
|
||||
printf("cannot open %s\n", argv[1]);
|
||||
exit();
|
||||
}
|
||||
fin = f;
|
||||
} else
|
||||
fin = dup(0);
|
||||
if(argc > 2) {
|
||||
f = creat(argv[2], 0666);
|
||||
if(f < 0) {
|
||||
printf("cannot create %s\n", argv[2]);
|
||||
exit();
|
||||
}
|
||||
fout = f;
|
||||
} else
|
||||
fout = dup(1);
|
||||
close(0);
|
||||
close(1);
|
||||
gline(b1);
|
||||
l1:
|
||||
linec++;
|
||||
if(gline(b2)) {
|
||||
pline(b1);
|
||||
flush();
|
||||
exit();
|
||||
}
|
||||
if(equal(b1, b2)) goto l1;
|
||||
pline(b1);
|
||||
linec = 0;
|
||||
l2:
|
||||
linec++;
|
||||
if(gline(b1)) {
|
||||
pline(b2);
|
||||
flush();
|
||||
exit();
|
||||
}
|
||||
if(equal(b1, b2)) goto l2;
|
||||
pline(b2);
|
||||
linec = 0;
|
||||
goto l1;
|
||||
}
|
||||
|
||||
gline(buf)
|
||||
char buf[];
|
||||
{
|
||||
int c;
|
||||
|
||||
while((c = getchar()) != '\n') {
|
||||
if(c == '\0')
|
||||
return(1);
|
||||
*buf++ = c;
|
||||
}
|
||||
*buf = 0;
|
||||
return(0);
|
||||
}
|
||||
|
||||
pline(buf)
|
||||
char buf[];
|
||||
{
|
||||
int c;
|
||||
|
||||
switch(mode) {
|
||||
|
||||
case 'u':
|
||||
if(uniq) {;
|
||||
uniq = 0;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
if(uniq) break;
|
||||
return;
|
||||
|
||||
case 'c':
|
||||
printf("%4d ", linec);
|
||||
}
|
||||
uniq = 0;
|
||||
while((c = *buf++) != 0)
|
||||
putchar(c);
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
equal(b1, b2)
|
||||
char b1[], b2[];
|
||||
{
|
||||
int c;
|
||||
|
||||
b1 = skip(b1);
|
||||
b2 = skip(b2);
|
||||
while((c = *b1++) != 0)
|
||||
if(c != *b2++) return(0);
|
||||
if(*b2 != 0)
|
||||
return(0);
|
||||
uniq++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
char *
|
||||
skip(s)
|
||||
char *s;
|
||||
{
|
||||
int nf, nl;
|
||||
|
||||
nf = nl = 0;
|
||||
while(nf++ < fields) {
|
||||
while(*s==' ' || *s=='\t')
|
||||
s++;
|
||||
while( !(*s==' ' || *s=='\t') )
|
||||
if(*s == 0) return(s);
|
||||
else s++;
|
||||
}
|
||||
while(nl++ < letters)
|
||||
if(*s == 0) return(s);
|
||||
else s++;
|
||||
return(s);
|
||||
}
|
||||
|
||||
conv(s)
|
||||
char *s;
|
||||
{
|
||||
int d, n;
|
||||
|
||||
n = 0;
|
||||
for(;;) {
|
||||
d = *s++ - '0';
|
||||
if(0>d || d>9) break;
|
||||
n = n*10 + d;
|
||||
}
|
||||
return(n);
|
||||
}
|
||||
Reference in New Issue
Block a user