⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findscore.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "stdinc.h"#include "dat.h"#include "fns.h"enum{	ClumpChunks	= 32*1024};static int	verbose;static int	writeClumpHead(Arena *arena, u64int aa, Clump *cl);static int	writeClumpMagic(Arena *arena, u64int aa, u32int magic);intclumpInfoEq(ClumpInfo *c, ClumpInfo *d){	return c->type == d->type		&& c->size == d->size		&& c->uncsize == d->uncsize		&& scoreEq(c->score, d->score);}/* * synchronize the clump info directory with * with the clumps actually stored in the arena. * the directory should be at least as up to date * as the arena's trailer. * * checks/updates at most n clumps. * * returns 1 if ok, -1 if an error occured, 0 if blocks were updated */intfindscore(Arena *arena, uchar *score){	IEntry ie;	ClumpInfo *ci, *cis;	u64int a;	u32int clump;	int i, n, found;	if(arena->clumps && verbose)		fprint(2, "reading directory for arena=%s with %d entries\n", arena->name, arena->clumps);	cis = MKN(ClumpInfo, ClumpChunks);	found = 0;	a = 0;	memset(&ie, 0, sizeof(IEntry));	for(clump = 0; clump < arena->clumps; clump += n){		n = ClumpChunks;		if(n > arena->clumps - clump)			n = arena->clumps - clump;		if(readClumpInfos(arena, clump, cis, n) != n){			setErr(EOk, "arena directory read failed: %R");			break;		}		for(i = 0; i < n; i++){			ci = &cis[i];			if(scoreEq(score, ci->score)){				fprint(2, "found at clump=%d with type=%d size=%d csize=%d position=%lld\n",					clump + i, ci->type, ci->uncsize, ci->size, a);				found++;			}			a += ci->size + ClumpSize;		}	}	free(cis);	return found;}voidusage(void){	fprint(2, "usage: findscore [-v] arenafile score\n");	exits(0);}intmain(int argc, char *argv[]){	ArenaPart *ap;	Part *part;	char *file;	u8int score[VtScoreSize];	int i, found;	fmtinstall('V', vtScoreFmt);	fmtinstall('R', vtErrFmt);	vtAttach();	statsInit();	ARGBEGIN{	case 'v':		verbose++;		break;	default:		usage();		break;	}ARGEND	readonly = 1;	if(argc != 2)		usage();	file = argv[0];	if(!strScore(argv[1], score))		fatal("bad score %s\n", argv[1]);	part = initPart(file, 0);	if(part == nil)		fatal("can't open partition %s: %r", file);	ap = initArenaPart(part);	if(ap == nil)		fatal("can't initialize arena partition in %s: %R", file);	if(verbose > 1){		printArenaPart(2, ap);		fprint(2, "\n");	}	initDCache(8 * MaxDiskBlock);	found = 0;	for(i = 0; i < ap->narenas; i++)		found += findscore(ap->arenas[i], score);	print("found %d occurences of %V\n", found, score);	if(verbose > 1)		printStats();	exits(0);	return 0;	/* shut up stupid compiler */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -