xref: /plan9/sys/src/cmd/upas/bayes/addhash.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <regexp.h>
5 #include "hash.h"
6 
7 Hash hash;
8 
9 void
usage(void)10 usage(void)
11 {
12 	fprint(2, "addhash [-o out] file scale [file scale]...\n");
13 	exits("usage");
14 }
15 
16 void
main(int argc,char ** argv)17 main(int argc, char **argv)
18 {
19 	int i, fd, n;
20 	char err[ERRMAX], *out;
21 	Biobuf *b, bout;
22 
23 	out = nil;
24 	ARGBEGIN{
25 	case 'o':
26 		out = EARGF(usage());
27 		break;
28 	default:
29 		usage();
30 	}ARGEND;
31 
32 	if(argc==0 || argc%2)
33 		usage();
34 
35 	while(argc > 0){
36 		if((b = Bopenlock(argv[0], OREAD)) == nil)
37 			sysfatal("open %s: %r", argv[0]);
38 		n = atoi(argv[1]);
39 		if(n == 0)
40 			sysfatal("0 scale given");
41 		Breadhash(b, &hash, n);
42 		Bterm(b);
43 		argv += 2;
44 		argc -= 2;
45 	}
46 
47 	fd = 1;
48 	if(out){
49 		for(i=0; i<120; i++){
50 			if((fd = create(out, OWRITE, 0666|DMEXCL)) >= 0)
51 				break;
52 			rerrstr(err, sizeof err);
53 			if(strstr(err, "file is locked")==nil && strstr(err, "exclusive lock")==nil)
54 				break;
55 			sleep(1000);
56 		}
57 		if(fd < 0)
58 			sysfatal("could not open %s: %r", out);
59 	}
60 
61 	Binit(&bout, fd, OWRITE);
62 	Bwritehash(&bout, &hash);
63 	Bterm(&bout);
64 	exits(0);
65 }
66 
67