xref: /plan9/sys/src/cmd/auth/uniq.c (revision d854de5991c7e0df387efa3ede5edcfdd69b65da)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier typedef struct Who Who;
67dd7cddfSDavid du Colombier struct Who
77dd7cddfSDavid du Colombier {
87dd7cddfSDavid du Colombier 	Who *next;
97dd7cddfSDavid du Colombier 	char *line;
107dd7cddfSDavid du Colombier 	char *name;
117dd7cddfSDavid du Colombier };
127dd7cddfSDavid du Colombier 
cmp(void * arg1,void * arg2)137dd7cddfSDavid du Colombier int cmp(void *arg1, void *arg2)
147dd7cddfSDavid du Colombier {
157dd7cddfSDavid du Colombier 	Who **a = arg1, **b = arg2;
167dd7cddfSDavid du Colombier 
177dd7cddfSDavid du Colombier 	return strcmp((*a)->name, (*b)->name);
187dd7cddfSDavid du Colombier }
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier void
main(int argc,char ** argv)217dd7cddfSDavid du Colombier main(int argc, char **argv)
227dd7cddfSDavid du Colombier {
237dd7cddfSDavid du Colombier 	int changed, i, n;
247dd7cddfSDavid du Colombier 	Biobuf *b;
257dd7cddfSDavid du Colombier 	char *p, *name;
267dd7cddfSDavid du Colombier 	Who *first, *last, *w, *nw, **l;
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier 	if(argc != 2){
297dd7cddfSDavid du Colombier 		fprint(2, "usage: auth/uniq file\n");
307dd7cddfSDavid du Colombier 		exits(0);
317dd7cddfSDavid du Colombier 	}
327dd7cddfSDavid du Colombier 
337dd7cddfSDavid du Colombier 	last = first = 0;
347dd7cddfSDavid du Colombier 	b = Bopen(argv[1], OREAD);
357dd7cddfSDavid du Colombier 	if(b == 0)
367dd7cddfSDavid du Colombier 		exits(0);
377dd7cddfSDavid du Colombier 
387dd7cddfSDavid du Colombier 	n = 0;
397dd7cddfSDavid du Colombier 	changed = 0;
407dd7cddfSDavid du Colombier 	while(p = Brdline(b, '\n')){
417dd7cddfSDavid du Colombier 		p[Blinelen(b)-1] = 0;
427dd7cddfSDavid du Colombier 		name = p;
437dd7cddfSDavid du Colombier 		while(*p && *p != '|')
447dd7cddfSDavid du Colombier 			p++;
457dd7cddfSDavid du Colombier 		if(*p)
467dd7cddfSDavid du Colombier 			*p++ = 0;
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier 		for(nw = first; nw; nw = nw->next){
497dd7cddfSDavid du Colombier 			if(strcmp(nw->name, name) == 0){
507dd7cddfSDavid du Colombier 				free(nw->line);
517dd7cddfSDavid du Colombier 				nw->line = strdup(p);
527dd7cddfSDavid du Colombier 				changed = 1;
537dd7cddfSDavid du Colombier 				break;
547dd7cddfSDavid du Colombier 			}
557dd7cddfSDavid du Colombier 		}
567dd7cddfSDavid du Colombier 		if(nw)
577dd7cddfSDavid du Colombier 			continue;
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier 		w = malloc(sizeof(Who));
607dd7cddfSDavid du Colombier 		if(w == 0){
61*d854de59SDavid du Colombier 			fprint(2, "auth/uniq: out of memory\n");
627dd7cddfSDavid du Colombier 			exits(0);
637dd7cddfSDavid du Colombier 		}
647dd7cddfSDavid du Colombier 		memset(w, 0, sizeof(Who));
657dd7cddfSDavid du Colombier 		w->name = strdup(name);
667dd7cddfSDavid du Colombier 		w->line = strdup(p);
677dd7cddfSDavid du Colombier 		if(first == 0)
687dd7cddfSDavid du Colombier 			first = w;
697dd7cddfSDavid du Colombier 		else
707dd7cddfSDavid du Colombier 			last->next = w;
717dd7cddfSDavid du Colombier 		last = w;
727dd7cddfSDavid du Colombier 		n++;
737dd7cddfSDavid du Colombier 	}
747dd7cddfSDavid du Colombier 	Bterm(b);
757dd7cddfSDavid du Colombier 
767dd7cddfSDavid du Colombier 	l = malloc(n*sizeof(Who*));
777dd7cddfSDavid du Colombier 	for(i = 0, nw = first; nw; nw = nw->next, i++)
787dd7cddfSDavid du Colombier 		l[i] = nw;
797dd7cddfSDavid du Colombier 	qsort(l, n, sizeof(Who*), cmp);
807dd7cddfSDavid du Colombier 
817dd7cddfSDavid du Colombier 	if(!changed)
827dd7cddfSDavid du Colombier 		exits(0);
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier 	b = Bopen(argv[1], OWRITE);
857dd7cddfSDavid du Colombier 	if(b == 0){
867dd7cddfSDavid du Colombier 		fprint(2, "auth/uniq: can't open %s\n", argv[1]);
877dd7cddfSDavid du Colombier 		exits(0);
887dd7cddfSDavid du Colombier 	}
897dd7cddfSDavid du Colombier 	for(i = 0; i < n; i++)
907dd7cddfSDavid du Colombier 		Bprint(b, "%s|%s\n", l[i]->name, l[i]->line);
917dd7cddfSDavid du Colombier 	Bterm(b);
927dd7cddfSDavid du Colombier }
93