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

📄 array.c

📁 使用BorlandC++4.5编译的一个MUD客户端程序
💻 C
字号:
head	2.1;access;symbols;locks; strict;comment	@ * @;2.1date	95.10.24.15.46.14;	author tsurace;	state Release;branches;next	1.1;1.1date	95.10.12.17.44.28;	author tsurace;	state Beta;branches;next	;desc@Array maniupation routines.@2.1log@Roll.@text@/* array.c: Handle allocation and manipulation of arrays */
/* RCS: $Id: array.c 1.1 1995/10/12 17:44:28 tsurace Beta tsurace $ */

#include "vt.h"

#ifdef PROTOTYPES
static Array *aralloc(void);
static void mark_cframes(int, Cframe *);
static void mark_estates(Estate *);
static void mark_dframes(int, Dframe *);
static void mark_dframe(Dframe *);
#else
static Array *aralloc();
static void mark_cframes(), mark_estates(), mark_dframes();
static void mark_dframe();
#endif

#define INIT_INDEX_SIZE 128
#define BLOCK_SIZE 64
static Array **index, firstblock[BLOCK_SIZE], *unused;
static int index_size, ipos = 1, bpos = 0, collecting = 0;

#define PTSIZE 101
typedef struct aentry Aentry;
typedef struct asubelem Asubelem;
struct aentry { char *name; Asubelem *sub; Aentry *left, *right; };
struct asubelem { int *assoc; int num; Asubelem *next; };
static Aentry *atbl[PTSIZE];

extern Array *gvars;
extern Dframe *dstack;
extern Cframe *cstack;
extern int dpos, cpos;
extern Unode rmt_ring, win_ring;
extern Estate *events, *gen_read, *gen_high, *gen_low;

void init_array()
{
	index = Newarray(Array *, index_size = INIT_INDEX_SIZE);
	index[0] = firstblock;
}

static Array *aralloc()
{
	Array *temp;

	if (unused) {
		temp = unused;
		temp->used = 1;
		unused = unused->r.next;
		return temp;
	}
	if (bpos == BLOCK_SIZE) {
		if (ipos == index_size)
			Double(index, Array *, index_size);
		index[ipos++] = Newarray(Array, BLOCK_SIZE);
		bpos = 0;
	}
	index[ipos - 1][bpos].used = 1;
	return &index[ipos - 1][bpos++];
}

void arfree(ar)
	Array *ar;
{
	ar->used = 0;
	ar->r.next = unused;
	unused = ar;
}

Dframe *dfalloc(num)
	int num;
{
	Dframe *vals, *vp;

	vals = Newarray(Dframe, num);
	for (vp = vals; num--; vp++)
		vp->type = F_NULL;
	return vals;
}

Array *add_array(size, vals, intern, fixed, isp)
	int size, intern, fixed, isp;
	Dframe *vals;
{
	Array *new;

	new = aralloc();
	new->alloc = size;
	new->vals = vals;
	new->intern = intern;
	new->fixed = fixed;
	new->isp = isp;
	return new;
}

void del_array(array)
	Array *array;
{
	deref_frames(array->alloc, array->vals);
	Discardarray(array->vals, Dframe, array->alloc);
	arfree(array);
}

void extend_array(ar, size)
	Array *ar;
	int size;
{
	Dframe *new;

	if (size <= ar->alloc)
		return;
	size *= 2;
	new = Newarray(Dframe, size);
	Copy(ar->vals, new, ar->alloc, Dframe);
	move_frames_refs(ar->alloc, ar->vals, new);
	Discardarray(ar->vals, Dframe, ar->alloc);
	ar->vals = new;
	for (new += ar->alloc; ar->alloc < size; ar->alloc++)
		new++->type = F_NULL;
}

void dec_ref_array(ar)
	Array *ar;
{
	if (!--ar->r.refs && !collecting)
		del_array(ar);
}

void dec_ref_plist(plist)
	Plist *plist;
{
	if (!--plist->refs && !collecting) {
		del_array(plist->array);
		Discard(plist, Plist);
	}
}

int lookup(assoc, str)
	int *assoc;
	char *str;
{
	Aentry **a;
	Asubelem **s;
	int val;

	a = &atbl[hash(str, PTSIZE)];
	while (*a) {
		val = strcmp(str, (*a)->name);
		if (!val)
			break;
		a = (val > 0) ? &(*a)->right : &(*a)->left;
	}
	if (!*a) {
		*a = New(Aentry);
		(*a)->name = vtstrdup(str);
		(*a)->left = (*a)->right = NULL;
		(*a)->sub = NULL;
	}
	for (s = &(*a)->sub; *s && (*s)->assoc != assoc; s = &(*s)->next);
	if (!*s) {
		*s = New(Asubelem);
		(*s)->assoc = assoc;
		(*s)->next = NULL;
		(*s)->num = (*assoc)++;
	}
	return (*s)->num;
}

int garbage()
{
	int i, j, counter = 0, n;
	Unode *un;
	Array *ar;

	for (i = 0; i < ipos; i++) {
		n = (i == ipos - 1) ? bpos : BLOCK_SIZE;
		for (j = 0; j < n; j++)
			index[i][j].garbage = 0;
	}
	mark_dframes(gvars->alloc, gvars->vals);
	mark_dframes(dpos, dstack);
	mark_cframes(cpos, cstack);
	for (un = rmt_ring.next; !un->dummy; un = un->next) {
		if (un->Robj)
			mark_dframe(un->Robj);
		mark_estates(un->Rrstack);
	}
	for (un = win_ring.next; !un->dummy; un = un->next) {
		if (un->Wobj)
			mark_dframe(un->Wobj);
		mark_estates(un->Wghstack);
		mark_estates(un->Wglstack);
		mark_estates(un->Wrstack);
	}
	mark_estates(events);
	mark_estates(gen_read);
	mark_estates(gen_high);
	mark_estates(gen_low);
	collecting = 1;
	for (i = 0; i < ipos; i++) {
		n = (i == ipos - 1) ? bpos : BLOCK_SIZE;
		for (j = 0; j < n; j++) {
			ar = &index[i][j];
			if (ar->used && !ar->intern && !ar->garbage) {
				if (ar->isp)
					Discard(ar->r.plist, Plist);
				del_array(ar);
				counter++;
			}
		}
	}
	collecting = 0;
	return counter;
}

static void mark_cframes(num, frames)
	int num;
	Cframe *frames;
{
	for (; num--; frames++)
	       mark_dframes(frames->lvars->alloc, frames->lvars->vals);
}

static void mark_estates(es)
	Estate *es;
{
	for (; es; es = es->next) {
		mark_dframes(es->dframes, es->dimage);
		mark_cframes(es->cframes, es->cimage);
	}
}

static void mark_dframes(num, frames)
	int num;
	Dframe *frames;
{
	while (num--)
		mark_dframe(frames++);
}

static void mark_dframe(f)
	Dframe *f;
{
	Array *a = NULL;

	if (f->type == F_APTR && !f->Darray->intern)
		a = f->Darray;
	else if (f->type == F_PLIST)
		a = f->Dplist->array;
	if (a && !a->garbage) {
		a->garbage = 1;
		mark_dframes(a->alloc, a->vals);
	}
}


@1.1log@Initial revision@text@d2 1a2 1/* RCS: $Id$ */@

⌨️ 快捷键说明

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