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

📄 list.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <bio.h>#include <ctype.h>#include <mach.h>#define Extern extern#include "acid.h"static List **tail;List*construct(Node *l){	List *lh, **save;	save = tail;	lh = 0;	tail = &lh;	build(l);	tail = save;	return lh;}intlistlen(List *l){	int len;	len = 0;	while(l) {		len++;		l = l->next;	}	return len;}voidbuild(Node *n){	List *l;	Node res;	if(n == 0)		return;	switch(n->op) {	case OLIST:		build(n->left);		build(n->right);		return;	default:		expr(n, &res);		l = al(res.type);		l->Store = res.Store;		*tail = l;		tail = &l->next;		}}List*addlist(List *l, List *r){	List *f;	if(l == 0)		return r;	for(f = l; f->next; f = f->next)		;	f->next = r;	return l;}voidappend(Node *r, Node *list, Node *val){	List *l, *f;	l = al(val->type);	l->Store = val->Store;	l->next = 0;	r->op = OCONST;	r->type = TLIST;	if(list->l == 0) {		list->l = l;		r->l = l;		return;	}	for(f = list->l; f->next; f = f->next)		;	f->next = l;	r->l = list->l;}intlistcmp(List *l, List *r){	if(l == r)		return 1;	while(l) {		if(r == 0)			return 0;		if(l->type != r->type)			return 0;		switch(l->type) {		case TINT:			if(l->ival != r->ival)				return 0;			break;		case TFLOAT:			if(l->fval != r->fval)				return 0;			break;		case TSTRING:			if(scmp(l->string, r->string) == 0)				return 0;			break;		case TLIST:			if(listcmp(l->l, r->l) == 0)				return 0;			break;		}		l = l->next;		r = r->next;	}	if(l != r)		return 0;	return 1;}voidnthelem(List *l, int n, Node *res){	if(n < 0)		error("negative index in []");	while(l && n--)		l = l->next;	res->op = OCONST;	if(l == 0) {		res->type = TLIST;		res->l = 0;		return;	}	res->type = l->type;	res->Store = l->Store;}voiddelete(List *l, int n, Node *res){	List **tl;	if(n < 0)		error("negative index in delete");	res->op = OCONST;	res->type = TLIST;	res->l = l;	for(tl = &res->l; l && n--; l = l->next)		tl = &l->next;	if(l == 0)		error("element beyond end of list");	*tl = l->next;}List*listvar(char *s, vlong v){	List *l, *tl;	tl = al(TLIST);	l = al(TSTRING);	tl->l = l;	l->fmt = 's';	l->string = strnode(s);	l->next = al(TINT);	l = l->next;	l->fmt = 'X';	l->ival = v;	return tl;}static List*listlocals(Map *map, Symbol *fn, uvlong fp){	int i;	uvlong val;	Symbol s;	List **tail, *l2;	l2 = 0;	tail = &l2;	s = *fn;	for(i = 0; localsym(&s, i); i++) {		if(s.class != CAUTO)			continue;		if(s.name[0] == '.')			continue;		if(geta(map, fp-s.value, &val) > 0) {			*tail = listvar(s.name, val);			tail = &(*tail)->next;		}	}	return l2;}static List*listparams(Map *map, Symbol *fn, uvlong fp){	int i;	Symbol s;	uvlong v;	List **tail, *l2;	l2 = 0;	tail = &l2;	fp += mach->szaddr;			/* skip saved pc */	s = *fn;	for(i = 0; localsym(&s, i); i++) {		if (s.class != CPARAM)			continue;		if(geta(map, fp+s.value, &v) > 0) {			*tail = listvar(s.name, v);			tail = &(*tail)->next;		}	}	return l2;}voidtrlist(Map *map, uvlong pc, uvlong sp, Symbol *sym){	List *q, *l;	static List **tail;	if (tracelist == 0) {		/* first time */		tracelist = al(TLIST);		tail = &tracelist;	}	q = al(TLIST);	*tail = q;	tail = &q->next;	l = al(TINT);			/* Function address */	q->l = l;	l->ival = sym->value;	l->fmt = 'X';	l->next = al(TINT);		/* called from address */	l = l->next;	l->ival = pc;	l->fmt = 'Y';	l->next = al(TLIST);		/* make list of params */	l = l->next;	l->l = listparams(map, sym, sp);	l->next = al(TLIST);		/* make list of locals */	l = l->next;	l->l = listlocals(map, sym, sp);}

⌨️ 快捷键说明

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