xref: /plan9/sys/src/cmd/upas/bayes/addhash.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
14246b616SDavid du Colombier #include <u.h>
24246b616SDavid du Colombier #include <libc.h>
34246b616SDavid du Colombier #include <bio.h>
44246b616SDavid du Colombier #include <regexp.h>
54246b616SDavid du Colombier #include "hash.h"
64246b616SDavid du Colombier 
74246b616SDavid du Colombier Hash hash;
84246b616SDavid du Colombier 
94246b616SDavid du Colombier void
usage(void)104246b616SDavid du Colombier usage(void)
114246b616SDavid du Colombier {
124246b616SDavid du Colombier 	fprint(2, "addhash [-o out] file scale [file scale]...\n");
134246b616SDavid du Colombier 	exits("usage");
144246b616SDavid du Colombier }
154246b616SDavid du Colombier 
164246b616SDavid du Colombier void
main(int argc,char ** argv)174246b616SDavid du Colombier main(int argc, char **argv)
184246b616SDavid du Colombier {
194246b616SDavid du Colombier 	int i, fd, n;
204246b616SDavid du Colombier 	char err[ERRMAX], *out;
214246b616SDavid du Colombier 	Biobuf *b, bout;
224246b616SDavid du Colombier 
234246b616SDavid du Colombier 	out = nil;
244246b616SDavid du Colombier 	ARGBEGIN{
254246b616SDavid du Colombier 	case 'o':
264246b616SDavid du Colombier 		out = EARGF(usage());
274246b616SDavid du Colombier 		break;
284246b616SDavid du Colombier 	default:
294246b616SDavid du Colombier 		usage();
304246b616SDavid du Colombier 	}ARGEND;
314246b616SDavid du Colombier 
324246b616SDavid du Colombier 	if(argc==0 || argc%2)
334246b616SDavid du Colombier 		usage();
344246b616SDavid du Colombier 
354246b616SDavid du Colombier 	while(argc > 0){
364246b616SDavid du Colombier 		if((b = Bopenlock(argv[0], OREAD)) == nil)
374246b616SDavid du Colombier 			sysfatal("open %s: %r", argv[0]);
384246b616SDavid du Colombier 		n = atoi(argv[1]);
394246b616SDavid du Colombier 		if(n == 0)
404246b616SDavid du Colombier 			sysfatal("0 scale given");
414246b616SDavid du Colombier 		Breadhash(b, &hash, n);
424246b616SDavid du Colombier 		Bterm(b);
434246b616SDavid du Colombier 		argv += 2;
444246b616SDavid du Colombier 		argc -= 2;
454246b616SDavid du Colombier 	}
464246b616SDavid du Colombier 
474246b616SDavid du Colombier 	fd = 1;
484246b616SDavid du Colombier 	if(out){
494246b616SDavid du Colombier 		for(i=0; i<120; i++){
504246b616SDavid du Colombier 			if((fd = create(out, OWRITE, 0666|DMEXCL)) >= 0)
514246b616SDavid du Colombier 				break;
524246b616SDavid du Colombier 			rerrstr(err, sizeof err);
53375daca8SDavid du Colombier 			if(strstr(err, "file is locked")==nil && strstr(err, "exclusive lock")==nil)
544246b616SDavid du Colombier 				break;
554246b616SDavid du Colombier 			sleep(1000);
564246b616SDavid du Colombier 		}
574246b616SDavid du Colombier 		if(fd < 0)
58*14cc0f53SDavid du Colombier 			sysfatal("could not open %s: %r", out);
594246b616SDavid du Colombier 	}
604246b616SDavid du Colombier 
614246b616SDavid du Colombier 	Binit(&bout, fd, OWRITE);
624246b616SDavid du Colombier 	Bwritehash(&bout, &hash);
634246b616SDavid du Colombier 	Bterm(&bout);
644246b616SDavid du Colombier 	exits(0);
654246b616SDavid du Colombier }
664246b616SDavid du Colombier 
67