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

📄 config.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "stdinc.h"#include "dat.h"#include "fns.h"Index			*mainIndex;int			paranoid = 1;		/* should verify hashes on disk read */static ArenaPart	*configArenas(char *file);static ISect		*configISect(char *file);intinitVenti(char *file, Config *pconf){	Config conf;	fmtinstall('V', vtScoreFmt);	fmtinstall('R', vtErrFmt);	statsInit();	if(file == nil){		setErr(EOk, "no configuration file");		return 0;	}	if(!runConfig(file, &conf)){		setErr(EOk, "can't initialize venti: %R");		return 0;	}	mainIndex = initIndex(conf.index, conf.sects, conf.nsects);	if(mainIndex == nil)		return 0;	if(pconf)		*pconf = conf;	return 1;}static intnumOk(char *s){	char *p;	strtoull(s, &p, 0);	if(p == s)		return 0;	if(*p == 0)		return 1;	if(p[1] == 0 && strchr("MmGgKk", *p))		return 1;	return 0;}/* * configs	: *		| configs config * config	: "isect" filename *		| "arenas" filename *		| "index" name *		| "bcmem" num *		| "mem" num *		| "icmem" num *		| "queuewrites" *		| "httpaddr" address *		| "addr" address * * '#' and \n delimit comments */enum{	MaxArgs	= 2};intrunConfig(char *file, Config *config){	ArenaPart **av;	ISect **sv;	IFile f;	char *s, *line, *flds[MaxArgs + 1];	int i, ok;	if(!readIFile(&f, file))		return 0;	memset(config, 0, sizeof *config);	config->mem = 0xFFFFFFFFUL;	ok = 0;	line = nil;	for(;;){		s = ifileLine(&f);		if(s == nil){			ok = 1;			break;		}		line = estrdup(s);		i = getfields(s, flds, MaxArgs + 1, 1, " \t\r");		if(i == 2 && strcmp(flds[0], "isect") == 0){			sv = MKN(ISect*, config->nsects + 1);			for(i = 0; i < config->nsects; i++)				sv[i] = config->sects[i];			free(config->sects);			config->sects = sv;			config->sects[config->nsects] = configISect(flds[1]);			if(config->sects[config->nsects] == nil)				break;			config->nsects++;		}else if(i == 2 && strcmp(flds[0], "arenas") == 0){			av = MKN(ArenaPart*, config->naparts + 1);			for(i = 0; i < config->naparts; i++)				av[i] = config->aparts[i];			free(config->aparts);			config->aparts = av;			config->aparts[config->naparts] = configArenas(flds[1]);			if(config->aparts[config->naparts] == nil)				break;			config->naparts++;		}else if(i == 2 && strcmp(flds[0], "index") == 0){			if(!nameOk(flds[1])){				setErr(EAdmin, "illegal index name %s in config file %s", flds[1], file);				break;			}			if(config->index != nil){				setErr(EAdmin, "duplicate indices in config file %s", file);				break;			}			config->index = estrdup(flds[1]);		}else if(i == 2 && strcmp(flds[0], "bcmem") == 0){			if(!numOk(flds[1])){				setErr(EAdmin, "illegal size %s in config file %s",					flds[1], file);				break;			}			if(config->bcmem != 0){				setErr(EAdmin, "duplicate bcmem lines in config file %s", file);				break;			}			config->bcmem = unittoull(flds[1]);		}else if(i == 2 && strcmp(flds[0], "mem") == 0){			if(!numOk(flds[1])){				setErr(EAdmin, "illegal size %s in config file %s",					flds[1], file);				break;			}			if(config->mem != 0xFFFFFFFFUL){				setErr(EAdmin, "duplicate mem lines in config file %s", file);				break;			}			config->mem = unittoull(flds[1]);		}else if(i == 2 && strcmp(flds[0], "icmem") == 0){			if(!numOk(flds[1])){				setErr(EAdmin, "illegal size %s in config file %s",					flds[1], file);				break;			}			if(config->icmem != 0){				setErr(EAdmin, "duplicate icmem lines in config file %s", file);				break;			}			config->icmem = unittoull(flds[1]);		}else if(i == 1 && strcmp(flds[0], "queuewrites") == 0){			config->queueWrites = 1;		}else if(i == 2 && strcmp(flds[0], "httpaddr") == 0){			if(!nameOk(flds[1])){				setErr(EAdmin, "illegal http address '%s' in configuration file %s", flds[1], file);				break;			}			if(config->haddr){				setErr(EAdmin, "duplicate httpaddr lines in configuration file %s", file);				break;			}			config->haddr = estrdup(flds[1]);		}else if(i == 2 && strcmp(flds[0], "addr") == 0){			if(!nameOk(flds[1])){				setErr(EAdmin, "illegal venti address '%s' in configuration file %s", flds[1], file);				break;			}			if(config->vaddr){				setErr(EAdmin, "duplicate addr lines in configuration file %s", file);				break;			}			config->vaddr = estrdup(flds[1]);		}else{			setErr(EAdmin, "illegal line '%s' in configuration file %s", line, file);			break;		}		free(line);		line = nil;	}	free(line);	freeIFile(&f);	if(!ok){		free(config->sects);		config->sects = nil;		free(config->aparts);		config->aparts = nil;	}	return ok;}static ISect*configISect(char *file){	Part *part;//	fprint(2, "configure index section in %s\n", file);	part = initPart(file, 0);	if(part == nil)		return 0;	return initISect(part);}static ArenaPart*configArenas(char *file){	Part *part;//	fprint(2, "configure arenas in %s\n", file);	part = initPart(file, 0);	if(part == nil)		return 0;	return initArenaPart(part);}

⌨️ 快捷键说明

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