|
|
1.1 ! root 1: /* ! 2: * uniq [-udc] [-n] [+n] [input [output]] ! 3: * ! 4: * Report repeated lines in a file. ! 5: */ ! 6: ! 7: #include <stdio.h> ! 8: ! 9: #define MAXLINE 200 /* Longest line allowed */ ! 10: ! 11: char lines[2][MAXLINE]; ! 12: char *prevline = lines[0]; ! 13: char *currline = lines[1]; ! 14: ! 15: int cflag; /* Counts */ ! 16: int uflag; /* non-repeated lines */ ! 17: int dflag; /* print one copy of repeated lines */ ! 18: int nfield; /* Fields to skip */ ! 19: int nchar; /* Chars to skip */ ! 20: int count; /* Repeat count */ ! 21: ! 22: FILE *ifp, *ofp; ! 23: ! 24: char *input(); ! 25: ! 26: main(argc, argv) ! 27: char *argv[]; ! 28: { ! 29: register char *ap; ! 30: ! 31: #ifdef MSDOS ! 32: msdoscvt("uniq", &argc, &argv); ! 33: #endif ! 34: if (argc > 1) ! 35: while (*argv[1]=='-' || *argv[1]=='+') { ! 36: if (*argv[1] == '-') { ! 37: ap = &argv[1][1]; ! 38: if (*ap>='0' && *ap<='9') ! 39: nfield = atoi(ap); ! 40: else ! 41: for (; *ap; ap++) ! 42: switch (*ap) { ! 43: case 'c': ! 44: cflag = 1; ! 45: break; ! 46: ! 47: case 'd': ! 48: dflag = 1; ! 49: break; ! 50: ! 51: case 'u': ! 52: uflag = 1; ! 53: break; ! 54: ! 55: default: ! 56: usage(); ! 57: } ! 58: } else ! 59: nchar = atoi(&argv[1][1]); ! 60: argc--; ! 61: argv++; ! 62: } /* end while */ ! 63: if (cflag == 0 && dflag==0 && uflag==0) ! 64: dflag = uflag = 1; ! 65: ofp = stdout; ! 66: ifp = stdin; ! 67: if (argc > 3) ! 68: usage(); ! 69: if (argc == 3) ! 70: if ((ofp = fopen(argv[2], "w")) == NULL) { ! 71: fprintf(stderr, "Cannot open output %s\n", argv[2]); ! 72: exit(1); ! 73: } ! 74: if (argc > 1) ! 75: if ((ifp = fopen(argv[1], "r")) == NULL) { ! 76: fprintf(stderr, "Cannot open input %s\n", argv[1]); ! 77: exit(1); ! 78: } ! 79: uniq(); ! 80: exit(0); ! 81: } ! 82: ! 83: /* ! 84: * Actually do the work of checking for uniqueness. ! 85: */ ! 86: uniq() ! 87: { ! 88: register indx; ! 89: register char *pl = prevline; ! 90: register char *cl = currline; ! 91: ! 92: indx = 1; ! 93: if ((pl = input(prevline)) == NULL) ! 94: return; ! 95: for (count = 1; (cl = input(currline)) != NULL; count++) { ! 96: if (strcmp(pl, cl) != 0) { ! 97: output(prevline); ! 98: prevline = currline; ! 99: pl = cl; ! 100: indx ^= 1; ! 101: currline = lines[indx]; ! 102: count = 0; ! 103: } ! 104: } ! 105: output(prevline); ! 106: } ! 107: ! 108: /* ! 109: * Output line according to the various formats ! 110: */ ! 111: output(line) ! 112: char *line; ! 113: { ! 114: if (cflag) ! 115: fprintf(ofp, "%d: %s", count, line); ! 116: else if ((uflag && count==1) || (dflag && count>1)) ! 117: fprintf(ofp, "%s", line); ! 118: } ! 119: ! 120: /* ! 121: * Input lines, doing field and character skipping. ! 122: */ ! 123: char * ! 124: input(lp) ! 125: register char *lp; ! 126: { ! 127: register nf, nc; ! 128: ! 129: if (fgets(lp, MAXLINE, ifp) == NULL) ! 130: return (NULL); ! 131: nf = nfield; ! 132: nc = nchar; ! 133: while (nf--) { ! 134: while (*lp==' ' || *lp=='\t') ! 135: lp++; ! 136: while (*lp!=' ' && *lp!='\t' && *lp!='\n' && *lp!='\0') ! 137: lp++; ! 138: } ! 139: if (nfield) ! 140: while (*lp==' ' || *lp=='\t') ! 141: lp++; ! 142: for (; nc--; lp++) ! 143: if (*lp=='\n' || *lp=='\0') ! 144: break; ! 145: return (lp); ! 146: } ! 147: ! 148: usage() ! 149: { ! 150: fprintf(stderr, "Usage: uniq [-udc] [+n] [-n] [ input [ output ] ]\n"); ! 151: exit(1); ! 152: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.