1/* vi: set sw=4 ts=4: */ 2/* 3 * Mini uniq implementation for busybox 4 * 5 * 6 * Copyright (C) 1999,2000,2001 by Lineo, inc. 7 * Written by John Beppu <beppu@lineo.com> 8 * Rewritten by Matt Kraai <kraai@alumni.carnegiemellon.edu> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 * 24 */ 25 26#include <stdio.h> 27#include <string.h> 28#include <getopt.h> 29#include <errno.h> 30#include <stdlib.h> 31#include "busybox.h" 32 33static int print_count; 34static int print_uniq = 1; 35static int print_duplicates = 1; 36 37static void print_line(char *line, int count, FILE *fp) 38{ 39 if ((print_duplicates && count > 1) || (print_uniq && count == 1)) { 40 if (print_count) 41 fprintf(fp, "%7d\t%s", count, line); 42 else 43 fputs(line, fp); 44 } 45} 46 47int uniq_main(int argc, char **argv) 48{ 49 FILE *in = stdin, *out = stdout; 50 char *lastline = NULL, *input; 51 int opt, count = 0; 52 53 /* parse argv[] */ 54 while ((opt = getopt(argc, argv, "cdu")) > 0) { 55 switch (opt) { 56 case 'c': 57 print_count = 1; 58 break; 59 case 'd': 60 print_duplicates = 1; 61 print_uniq = 0; 62 break; 63 case 'u': 64 print_duplicates = 0; 65 print_uniq = 1; 66 break; 67 } 68 } 69 70 if (argv[optind] != NULL) { 71 in = xfopen(argv[optind], "r"); 72 if (argv[optind+1] != NULL) 73 out = xfopen(argv[optind+1], "w"); 74 } 75 76 while ((input = get_line_from_file(in)) != NULL) { 77 if (lastline == NULL || strcmp(input, lastline) != 0) { 78 print_line(lastline, count, out); 79 free(lastline); 80 lastline = input; 81 count = 0; 82 } 83 count++; 84 } 85 print_line(lastline, count, out); 86 free(lastline); 87 88 return EXIT_SUCCESS; 89} 90