|
|
1.1 ! root 1: /* ! 2: * Deal with duplicated lines in a file ! 3: */ ! 4: #include <stdio.h> ! 5: #include <ctype.h> ! 6: #define SIZE 1000 ! 7: int fields = 0; ! 8: int letters = 0; ! 9: int linec = 0; ! 10: char mode; ! 11: int uniq; ! 12: char *skip(); ! 13: ! 14: main(argc, argv) ! 15: int argc; ! 16: char *argv[]; ! 17: { ! 18: static char b1[SIZE], b2[SIZE]; ! 19: ! 20: while(argc > 1) { ! 21: if(*argv[1] == '-') { ! 22: if (isdigit(argv[1][1])) ! 23: fields = atoi(&argv[1][1]); ! 24: else mode = argv[1][1]; ! 25: argc--; ! 26: argv++; ! 27: continue; ! 28: } ! 29: if(*argv[1] == '+') { ! 30: letters = atoi(&argv[1][1]); ! 31: argc--; ! 32: argv++; ! 33: continue; ! 34: } ! 35: if (freopen(argv[1], "r", stdin) == NULL) { ! 36: fprintf(stderr, "cannot open %s\n", argv[1]); ! 37: exit(1); ! 38: } ! 39: break; ! 40: } ! 41: if(argc > 2) { ! 42: fprintf(stderr, "unexpected argument %s\n", argv[2]); ! 43: exit(1); ! 44: } ! 45: ! 46: if(gline(b1)) ! 47: exit(0); ! 48: for(;;) { ! 49: linec++; ! 50: if(gline(b2)) { ! 51: pline(b1); ! 52: exit(0); ! 53: } ! 54: if(!equal(b1, b2)) { ! 55: pline(b1); ! 56: linec = 0; ! 57: do { ! 58: linec++; ! 59: if(gline(b1)) { ! 60: pline(b2); ! 61: exit(0); ! 62: } ! 63: } while(equal(b1, b2)); ! 64: pline(b2); ! 65: linec = 0; ! 66: } ! 67: } ! 68: } ! 69: ! 70: gline(buf) ! 71: register char buf[]; ! 72: { ! 73: register c, n; ! 74: ! 75: n = 0; ! 76: while((c = getchar()) != '\n') { ! 77: if(c == 0) ! 78: continue; ! 79: if(c == EOF) ! 80: return(1); ! 81: *buf++ = c; ! 82: n++; ! 83: if(n >= SIZE-1) { ! 84: fprintf(stderr, "line too long\n"); ! 85: exit(1); ! 86: } ! 87: } ! 88: *buf = 0; ! 89: return(0); ! 90: } ! 91: ! 92: pline(buf) ! 93: register char buf[]; ! 94: { ! 95: ! 96: switch(mode) { ! 97: ! 98: case 'u': ! 99: if(uniq) { ! 100: uniq = 0; ! 101: return; ! 102: } ! 103: break; ! 104: ! 105: case 'd': ! 106: if(uniq) break; ! 107: return; ! 108: ! 109: case 'c': ! 110: printf("%4d ", linec); ! 111: } ! 112: uniq = 0; ! 113: fputs(buf, stdout); ! 114: putchar('\n'); ! 115: } ! 116: ! 117: equal(b1, b2) ! 118: register char b1[], b2[]; ! 119: { ! 120: register char c; ! 121: ! 122: b1 = skip(b1); ! 123: b2 = skip(b2); ! 124: while((c = *b1++) != 0) ! 125: if(c != *b2++) return(0); ! 126: if(*b2 != 0) ! 127: return(0); ! 128: uniq++; ! 129: return(1); ! 130: } ! 131: ! 132: char * ! 133: skip(s) ! 134: register char *s; ! 135: { ! 136: register nf, nl; ! 137: ! 138: nf = nl = 0; ! 139: while(nf++ < fields) { ! 140: while(*s == ' ' || *s == '\t') ! 141: s++; ! 142: while( !(*s == ' ' || *s == '\t' || *s == 0) ) ! 143: s++; ! 144: } ! 145: while(nl++ < letters && *s != 0) ! 146: s++; ! 147: return(s); ! 148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.