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

📄 env.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	"mk.h"enum {	ENVQUANTA=10};Envy	*envy;static int nextv;static char	*myenv[] ={	"target",	"stem",	"prereq",	"pid",	"nproc",	"newprereq",	"alltarget",	"newmember",	"stem0",		/* must be in order from here */	"stem1",	"stem2",	"stem3",	"stem4",	"stem5",	"stem6",	"stem7",	"stem8",	"stem9",	0,};voidinitenv(void){	char **p;	for(p = myenv; *p; p++)		symlook(*p, S_INTERNAL, (void *)"");	readenv();				/* o.s. dependent */}static voidenvinsert(char *name, Word *value){	static int envsize;	if (nextv >= envsize) {		envsize += ENVQUANTA;		envy = (Envy *) Realloc((char *) envy, envsize*sizeof(Envy));	}	envy[nextv].name = name;	envy[nextv++].values = value;}static voidenvupd(char *name, Word *value){	Envy *e;	for(e = envy; e->name; e++)		if(strcmp(name, e->name) == 0){			delword(e->values);			e->values = value;			return;		}	e->name = name;	e->values = value;	envinsert(0,0);}static voidecopy(Symtab *s){	char **p;	if(symlook(s->name, S_NOEXPORT, 0))		return;	for(p = myenv; *p; p++)		if(strcmp(*p, s->name) == 0)			return;	envinsert(s->name, s->u.ptr);}voidexecinit(void){	char **p;	nextv = 0;	for(p = myenv; *p; p++)		envinsert(*p, stow(""));	symtraverse(S_VAR, ecopy);	envinsert(0, 0);}Envy*buildenv(Job *j, int slot){	char **p, *cp, *qp;	Word *w, *v, **l;	int i;	char buf[256];	envupd("target", wdup(j->t));	if(j->r->attr&REGEXP)		envupd("stem",newword(""));	else		envupd("stem", newword(j->stem));	envupd("prereq", wdup(j->p));	sprint(buf, "%d", getpid());	envupd("pid", newword(buf));	sprint(buf, "%d", slot);	envupd("nproc", newword(buf));	envupd("newprereq", wdup(j->np));	envupd("alltarget", wdup(j->at));	l = &v;	v = w = wdup(j->np);	while(w){		cp = strchr(w->s, '(');		if(cp){			qp = strchr(cp+1, ')');			if(qp){				*qp = 0;				strcpy(w->s, cp+1);				l = &w->next;				w = w->next;				continue;			}		}		*l = w->next;		free(w->s);		free(w);		w = *l;	}	envupd("newmember", v);		/* update stem0 -> stem9 */	for(p = myenv; *p; p++)		if(strcmp(*p, "stem0") == 0)			break;	for(i = 0; *p; i++, p++){		if((j->r->attr&REGEXP) && j->match[i])			envupd(*p, newword(j->match[i]));		else 			envupd(*p, newword(""));	}	return envy;}

⌨️ 快捷键说明

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