home *** CD-ROM | disk | FTP | other *** search
- 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);
- }
-