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

📄 va.c

📁 举世闻名的joe记事本源程序
💻 C
字号:
/* *	Variable length array of strings *	Copyright *		(C) 1992 Joseph H. Allen * *	This file is part of JOE (Joe's Own Editor) */#include "types.h"aELEMENT *vamk(int len){	int *new = (int *) joe_malloc((1 + len) * sizeof(aELEMENT) + 2 * sizeof(int));	new[0] = len;	new[1] = 0;	((aELEMENT *)(new + 2))[0] = aterm;	return (aELEMENT *)(new + 2);}void varm(aELEMENT *vary){	if (vary) {		vazap(vary, 0, aLen(vary));		joe_free((int *) vary - 2);	}}int alen(aELEMENT *ary){	if (ary) {		aELEMENT *beg = ary;		while (acmp(*ary, aterm))			++ary;		return ary - beg;	} else		return 0;}aELEMENT *vaensure(aELEMENT *vary, int len){	if (!vary)		vary = vamk(len);	else if (len > aSiz(vary)) {		len += (len >> 2);		vary = (aELEMENT *)(2 + (int *) joe_realloc((int *) vary - 2, (len + 1) * sizeof(aELEMENT) + 2 * sizeof(int)));		aSiz(vary) = len;	}	return vary;}aELEMENT *vazap(aELEMENT *vary, int pos, int n){	if (vary) {		int x;		if (pos < aLen(vary)) {			if (pos + n <= aLen(vary)) {				for (x = pos; x != pos + n; ++x)					adel(vary[x]);			} else {				for (x = pos; x != aLen(vary); ++x)					adel(vary[x]);			}		}	}	return vary;}aELEMENT *vatrunc(aELEMENT *vary, int len){	if (!vary || len > aLEN(vary))		vary = vaensure(vary, len);	if (len < aLen(vary)) {		vary = vazap(vary, len, aLen(vary) - len);		vary[len] = vary[aLen(vary)];		aLen(vary) = len;	} else if (len > aLen(vary)) {		vary = vafill(vary, aLen(vary), ablank, len - aLen(vary));	}	return vary;}aELEMENT *vafill(aELEMENT *vary, int pos, aELEMENT el, int len){	int olen = aLEN(vary), x;	if (!vary || pos + len > aSIZ(vary))		vary = vaensure(vary, pos + len);	if (pos + len > olen) {		vary[pos + len] = vary[olen];		aLen(vary) = pos + len;	}	for (x = pos; x != pos + len; ++x)		vary[x] = adup(el);	if (pos > olen)		vary = vafill(vary, pos, ablank, pos - olen);	return vary;}#ifdef junkaELEMENT *vancpy(aELEMENT *vary, int pos, aELEMENT *array, int len){	int olen = aLEN(vary);	if (!vary || pos + len > aSIZ(vary))		vary = vaensure(vary, pos + len);	if (pos + len > olen) {		vary[pos + len] = vary[olen];		aLen(vary) = pos + len;	}	if (pos > olen)		vary = vafill(vary, olen, ablank, pos - olen);	mfwrd(vary + pos, array, len * sizeof(aELEMENT));	return vary;}#endifaELEMENT *vandup(aELEMENT *vary, int pos, aELEMENT *array, int len){	int olen = aLEN(vary), x;	if (!vary || pos + len > aSIZ(vary))		vary = vaensure(vary, pos + len);	if (pos + len > olen) {		vary[pos + len] = vary[olen];		aLen(vary) = pos + len;	}	if (pos > olen)		vary = vafill(vary, olen, ablank, pos - olen);	for (x = 0; x != len; ++x)		vary[x + pos] = adup(array[x]);	return vary;}aELEMENT *vadup(aELEMENT *vary){	return vandup(NULL, 0, vary, aLEN(vary));}aELEMENT *_vaset(aELEMENT *vary, int pos, aELEMENT el){	if (!vary || pos + 1 > aSIZ(vary))		vary = vaensure(vary, pos + 1);	if (pos > aLen(vary)) {		vary = vafill(vary, aLen(vary), ablank, pos - aLen(vary));		vary[pos + 1] = vary[pos];		vary[pos] = el;		aLen(vary) = pos + 1;	} else if (pos == aLen(vary)) {		vary[pos + 1] = vary[pos];		vary[pos] = el;		aLen(vary) = pos + 1;	} else {		adel(vary[pos]);		vary[pos] = el;	}	return vary;}static int _acmp(aELEMENT *a, aELEMENT *b){	return acmp(*a, *b);}aELEMENT *vasort(aELEMENT *ary, int len){	if (!ary || !len)		return ary;	qsort(ary, len, sizeof(aELEMENT), (int (*)(const void *, const void *))_acmp);	return ary;}aELEMENT *vawords(aELEMENT *a, unsigned char *s, int len, unsigned char *sep, int seplen){	int x;	if (!a)		a = vamk(10);	else		a = vatrunc(a, 0);      loop:	x = vsspan(s, len, sep, seplen);	s += x;	len -= x;	if (len) {		x = vsscan(s, len, sep, seplen);		if (x != ~0) {			a = vaadd(a, vsncpy(vsmk(x), 0, s, x));			s += x;			len -= x;			if (len)				goto loop;		} else			a = vaadd(a, vsncpy(vsmk(len), 0, s, len));	}	return a;}

⌨️ 快捷键说明

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