* Mini uniq implementation for busybox
*
*
- * Copyright (C) 1999,2000 by Lineo, inc.
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
* Written by John Beppu <beppu@lineo.com>
* Rewritten by Matt Kraai <kraai@alumni.carnegiemellon.edu>
*
*
*/
-#include "busybox.h"
#include <stdio.h>
#include <string.h>
+#include <getopt.h>
#include <errno.h>
+#include <stdlib.h>
+#include "busybox.h"
+
+static int print_count;
+static int print_uniq = 1;
+static int print_duplicates = 1;
+
+static void print_line(char *line, int count, FILE *fp)
+{
+ if ((print_duplicates && count > 1) || (print_uniq && count == 1)) {
+ if (print_count)
+ fprintf(fp, "%7d\t%s", count, line);
+ else
+ fputs(line, fp);
+ }
+}
int uniq_main(int argc, char **argv)
{
FILE *in = stdin, *out = stdout;
char *lastline = NULL, *input;
+ int opt, count = 0;
/* parse argv[] */
- if ((argc > 1 && **(argv + 1) == '-') || argc > 3)
- usage(uniq_usage);
+ while ((opt = getopt(argc, argv, "cdu")) > 0) {
+ switch (opt) {
+ case 'c':
+ print_count = 1;
+ break;
+ case 'd':
+ print_duplicates = 1;
+ print_uniq = 0;
+ break;
+ case 'u':
+ print_duplicates = 0;
+ print_uniq = 1;
+ break;
+ }
+ }
- if (argv[1] != NULL) {
- in = xfopen(argv[1], "r");
- if (argv[2] != NULL)
- out = xfopen(argv[2], "w");
+ if (argv[optind] != NULL) {
+ in = xfopen(argv[optind], "r");
+ if (argv[optind+1] != NULL)
+ out = xfopen(argv[optind+1], "w");
}
while ((input = get_line_from_file(in)) != NULL) {
if (lastline == NULL || strcmp(input, lastline) != 0) {
- fputs(input, out);
+ print_line(lastline, count, out);
free(lastline);
lastline = input;
+ count = 0;
}
+ count++;
}
+ print_line(lastline, count, out);
free(lastline);
return EXIT_SUCCESS;