/* Program: UNIQ.C Author : Kim Moser Date : 4/16/89 System : IBM PC / Borland Turbo-C 2.0 Descrip: Reads lines from stdin, copies unique lines (i.e. those with no identical adjacent counterpart) to stdout. Usage : UNIQ [-switches] SWITCH MEANING u print unique lines d print lines that are duplicated (i.e. not unique) */ #include #include int MSG=1, WARN=1; void credits(void) { static int yet=0; if (!yet++ && MSG) fprintf( stderr, "UNIQ v1.0 (4/16/89) Copyright (c) Kim Moser All Rights Reserved\n" ); } void usage(void) { if (!MSG) return; fprintf( stderr, " Reads stdin, prints either unique lines (i.e. those without an identical\n" ); fprintf( stderr, " adjacent counterpart), or lines with duplicates (i.e. with an identical\n" ); fprintf( stderr, " adjacent counterpart), depending on switch. Assumes no line > 512 chars.\n\n" ); fprintf( stderr, " SWITCH MEANING\n" ); fprintf( stderr, " u print unique lines (default)\n" ); fprintf( stderr, " d print duplicate lines\n" ); fprintf( stderr, " M suppress messages\n" ); fprintf( stderr, " W suppress warnings\n" ); } int getline(s) /* Reads stdin into string 's', until '\n' or EOF encountered. Returns 0 if first char read was EOF, otherwise returns 1. */ char *s; { int c; int i=0; while ((c=getchar())!=EOF && (c!='\n')) s[i++]=c; s[i]=0; /* Terminate string */ return !((c==EOF)&&(i==0)); } void main(argc,argv) int argc; char **argv; { int DUPE=0, UNIQUE=1; char line[512]={0}, prev[512]={0}; int count=0; /* How many lines read */ int i; int isdiff=1; /* Whether line differes from prev line */ int wasdiff=1; /* Whether prev line differed from line before it */ if (argc==2) { if (argv[1][0]=='-') { UNIQUE=0; for (i=1; argv[1][i]; i++) { switch(argv[1][i]) { case 'd': /* Print dupes */ DUPE=1; break; case 'u': /* Print unique lines */ UNIQUE=1; break; case 'M': /* Suppress msgs */ MSG=0; break; case 'W': /* Suppress warnings */ WARN=0; break; default: usage(); } } } } if (!UNIQUE && !DUPE) usage(); credits(); if (MSG) { if (UNIQUE) fprintf( stderr, "Display unique lines\n" ); if (DUPE) fprintf( stderr, "Display duplicate lines\n" ); } while(getline(line)) { if (count++) { if (isdiff=strcmp(line,prev)) { /* It's different from prev line */ if (DUPE && !wasdiff) printf( "%s\n", prev ); if (UNIQUE && wasdiff) printf( "%s\n", prev ); } wasdiff=isdiff; } strcpy(prev,line); } /* Only 1 line read (it can't be anything but unique), or just last line: */ if (((count==1)&&(UNIQUE)) || (!isdiff&&DUPE) || (isdiff&&UNIQUE)) printf( "%s\n", line); if (MSG) fprintf( stderr, "\n%d lines read.\n", count ); }