plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

findscore.c (2193B)


      1 #include "stdinc.h"
      2 #include "dat.h"
      3 #include "fns.h"
      4 
      5 enum
      6 {
      7 	ClumpChunks	= 32*1024
      8 };
      9 
     10 static int	verbose;
     11 
     12 int
     13 clumpinfoeq(ClumpInfo *c, ClumpInfo *d)
     14 {
     15 	return c->type == d->type
     16 		&& c->size == d->size
     17 		&& c->uncsize == d->uncsize
     18 		&& scorecmp(c->score, d->score)==0;
     19 }
     20 
     21 int
     22 findscore(Arena *arena, uchar *score)
     23 {
     24 	IEntry ie;
     25 	ClumpInfo *ci, *cis;
     26 	u64int a;
     27 	u32int clump;
     28 	int i, n, found;
     29 
     30 //ZZZ remove fprint?
     31 	if(arena->memstats.clumps)
     32 		fprint(2, "reading directory for arena=%s with %d entries\n",
     33 			arena->name, arena->memstats.clumps);
     34 
     35 	cis = MKN(ClumpInfo, ClumpChunks);
     36 	found = 0;
     37 	a = 0;
     38 	memset(&ie, 0, sizeof(IEntry));
     39 	for(clump = 0; clump < arena->memstats.clumps; clump += n){
     40 		n = ClumpChunks;
     41 		if(n > arena->memstats.clumps - clump)
     42 			n = arena->memstats.clumps - clump;
     43 		if(readclumpinfos(arena, clump, cis, n) != n){
     44 			seterr(EOk, "arena directory read failed: %r");
     45 			break;
     46 		}
     47 
     48 		for(i = 0; i < n; i++){
     49 			ci = &cis[i];
     50 			if(scorecmp(score, ci->score)==0){
     51 				fprint(2, "found at clump=%d with type=%d size=%d csize=%d position=%lld\n",
     52 					clump + i, ci->type, ci->uncsize, ci->size, a);
     53 				found++;
     54 			}
     55 			a += ci->size + ClumpSize;
     56 		}
     57 	}
     58 	free(cis);
     59 	return found;
     60 }
     61 
     62 void
     63 usage(void)
     64 {
     65 	fprint(2, "usage: findscore [-v] arenafile score\n");
     66 	threadexitsall(0);
     67 }
     68 
     69 void
     70 threadmain(int argc, char *argv[])
     71 {
     72 	ArenaPart *ap;
     73 	Part *part;
     74 	char *file;
     75 	u8int score[VtScoreSize];
     76 	int i, found;
     77 
     78 	ventifmtinstall();
     79 
     80 	ARGBEGIN{
     81 	case 'v':
     82 		verbose++;
     83 		break;
     84 	default:
     85 		usage();
     86 		break;
     87 	}ARGEND
     88 
     89 	readonly = 1;
     90 
     91 	if(argc != 2)
     92 		usage();
     93 
     94 	file = argv[0];
     95 	if(strscore(argv[1], score) < 0)
     96 		sysfatal("bad score %s", argv[1]);
     97 
     98 	part = initpart(file, OREAD|ODIRECT);
     99 	if(part == nil)
    100 		sysfatal("can't open partition %s: %r", file);
    101 
    102 	ap = initarenapart(part);
    103 	if(ap == nil)
    104 		sysfatal("can't initialize arena partition in %s: %r", file);
    105 
    106 	if(verbose > 1){
    107 		printarenapart(2, ap);
    108 		fprint(2, "\n");
    109 	}
    110 
    111 	initdcache(8 * MaxDiskBlock);
    112 
    113 	found = 0;
    114 	for(i = 0; i < ap->narenas; i++)
    115 		found += findscore(ap->arenas[i], score);
    116 
    117 	print("found %d occurrences of %V\n", found, score);
    118 
    119 	if(verbose > 1)
    120 		printstats();
    121 	threadexitsall(0);
    122 }