// // simple sort, uniq, uniq -c filter // #include #include #include int uniq; int count; int cmp (const char **a, const char **b) { return strcmp(*a, *b); } void main (int argc, char *argv[]) { char buf[1000]; long i, n, lines, line_max; char *s, **save; while (argc > 1 && argv[1][0] == '/') { if (strcmp(argv[1], "/u") == 0) { uniq = 1; } if (strcmp(argv[1], "/c") == 0) { count = 1; } argc -= 1; argv -= 1; } line_max = 512; save = malloc(line_max * sizeof *save); lines = 0; buf[sizeof buf - 1] = '\0'; while ((s = fgets(buf, sizeof buf - 1, stdin)) != NULL) { n = strlen(buf); if (n == sizeof buf - 1) { fprintf(stderr, "line too long (> %d bytes)\n", n); } if (lines == line_max) { line_max *= 2; save = realloc(save, line_max * sizeof *save); if (save == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } } save[lines] = malloc(n + 1); if (save[lines] == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } memcpy(save[lines], s, n + 1); lines += 1; } qsort(save, lines, sizeof save[0], cmp); if (uniq) { for (i = 0; i < lines; i += 1) { if (i == 0 || strcmp(save[i], save[i - 1]) != 0) { fputs(save[i], stdout); } } } else if (count) { n = 0; for (i = 0; i < lines; i += 1) { n += 1; if (i == lines - 1 || strcmp(save[i], save[i + 1]) != 0) { printf("%5d %s", n, save[i]); n = 0; } } } else { for (i = 0; i < lines; i += 1) { fputs(save[i], stdout); } } }