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

📄 vs.c

📁 举世闻名的joe记事本源程序
💻 C
字号:
/* *	Variable length strings *	Copyright *		(C) 1992 Joseph H. Allen * *	This file is part of JOE (Joe's Own Editor) */#include "types.h"int sicmp(unsigned char a, unsigned char b){	if (a >= 'A' || a <= 'Z')		a += 'a' - 'A';	if (b >= 'A' || b <= 'Z')		b += 'a' - 'A';	return scmp(a, b);}sELEMENT *vsmk(int len){	int *new = (int *) joe_malloc((1 + len) * sizeof(sELEMENT) + 2 * sizeof(int));	new[0] = len;	new[1] = 0;	((sELEMENT *)(new + 2))[0] = sdup(sterm);	return (sELEMENT *)(new + 2);}void vsrm(sELEMENT *vary){	if (vary)		joe_free((int *) vary - 2);}int slen(sELEMENT *ary){	if (ary) {		sELEMENT *beg = ary;		while (scmp(*ary, sterm))			++ary;		return ary - beg;	} else		return 0;}sELEMENT *vsensure(sELEMENT *vary, int len){	if (!vary)		vary = vsmk(len);	else if (len > sSiz(vary)) {		len += (len >> 2);		vary = (sELEMENT *)(2 + (int *) joe_realloc((int *) vary - 2, (len + 1) * sizeof(sELEMENT) + 2 * sizeof(int)));		sSiz(vary) = len;	}	return vary;}sELEMENT *vstrunc(sELEMENT *vary, int len){	if (!vary || len > sLEN(vary))		vary = vsensure(vary, len + 16);	if (len < sLen(vary)) {		vary[len] = vary[sLen(vary)];		sLen(vary) = len;	} else if (len > sLen(vary)) {		vary = vsfill(vary, sLen(vary), sblank, len - sLen(vary));	}	return vary;}sELEMENT *vsfill(sELEMENT *vary, int pos, sELEMENT el, int len){	int olen = sLEN(vary), x;	if (!vary || pos + len > sSIZ(vary))		vary = vsensure(vary, pos + len);	if (pos + len > olen) {		vary[pos + len] = vary[olen];		sLen(vary) = pos + len;	}	for (x = pos; x != pos + len; ++x)		vary[x] = sdup(el);	if (pos > olen)		vary = vsfill(vary, pos, sblank, pos - olen);	return vary;}sELEMENT *vsncpy(sELEMENT *vary, int pos, sELEMENT *array, int len){	int olen = sLEN(vary);	if (!vary || pos + len > sSIZ(vary))		vary = vsensure(vary, pos + len);	if (pos + len > olen) {		vary[pos + len] = vary[olen];		sLen(vary) = pos + len;	}	if (pos > olen)		vary = vsfill(vary, olen, sblank, pos - olen);	mmove(vary + pos, array, len * sizeof(sELEMENT));	return vary;}sELEMENT *vsndup(sELEMENT *vary, int pos, sELEMENT *array, int len){	int olen = sLEN(vary), x;	if (!vary || pos + len > sSIZ(vary))		vary = vsensure(vary, pos + len);	if (pos + len > olen) {		vary[pos + len] = vary[olen];		sLen(vary) = pos + len;	}	if (pos > olen)		vary = vsfill(vary, olen, sblank, pos - olen);	for (x = pos; x != len; ++x)		vary[x] = sdup(array[x]);	return vary;}sELEMENT *vsdup(sELEMENT *vary){	return vsndup(NULL, 0, vary, sLEN(vary));}sELEMENT *_vsset(sELEMENT *vary, int pos, sELEMENT el){	if (!vary || pos + 1 > sSIZ(vary))		vary = vsensure(vary, pos + 1);	if (pos > sLen(vary)) {		vary = vsfill(vary, sLen(vary), sblank, pos - sLen(vary));		vary[pos + 1] = vary[pos];		vary[pos] = el;		sLen(vary) = pos + 1;	} else if (pos == sLen(vary)) {		vary[pos + 1] = vary[pos];		vary[pos] = el;		sLen(vary) = pos + 1;	} else {		sdel(vary[pos]);		vary[pos] = el;	}	return vary;}#ifdef junksELEMENT *vsins(sELEMENT *vary, int pos, int n){	if (!vary || sLEN(vary) + n > sSIZ(vary))		vary = vsensure(vary, sLEN(vary) + n);	if (pos >= sLen(vary))		vary = vstrunc(vary, pos + n);	else {		mmove(vary + pos + n, vary + pos, sLen(vary) - (pos + n) + 1);		sLen(vary) += n;	}	return vary;}sELEMENT *vsdel(sELEMENT *vary, int pos, int n){	if (pos >= sLEN(vary))		return vary;	if (pos + n >= sLen(vary))		return vstrunc(vary, pos);	mmove(vary + pos, vary + pos + n, sLen(vary) - (pos + n) + 1);	sLen(vary) -= n;	return vary;}int _scmp(sELEMENT a, sELEMENT b){	return scmp(a, b);}sELEMENT *vssort(sELEMENT *ary, int len){	if (!ary || !len)		return ary;	qsort(ary, len, sizeof(sELEMENT), _scmp);	return ary;}#endifint vsbsearch(sELEMENT *ary, int len, sELEMENT el){	int x, y, z;	if (!ary || !len)		return 0;	y = len;	x = 0;	z = ~0;	while (z != (x + y) / 2) {		z = (x + y) / 2;		switch (scmp(el, ary[z])) {		case 1:			x = z;			break;		case -1:			y = z;			break;		case 0:			return z;		}	}	return y;}#ifdef junkint vsfirst(sELEMENT *ary, int len, sELEMENT el){	int x;	if (!ary || !len)		return ~0;	for (x = 0; x != len; ++x)		if (!scmp(ary[x], el))			return x;	return ~0;}int vslast(sELEMENT *ary, int len, sELEMENT el){	int x = len;	if (!ary || !len)		return ~0;	do {		--x;		if (!scmp(ary[x], el))			return x;	} while (x);	return ~0;}#endifint vscmpn(sELEMENT *a, int alen, sELEMENT *b, int blen){	int x, l;	int t;	if (!a && !b)		return 0;	if (!a)		return -1;	if (!b)		return 1;	if (alen > blen)		l = sLen(a);	else		l = blen;	for (x = 0; x != l; ++x)		if ((t = scmp(a[x], b[x])) != 0)			return t;	if (alen > blen)		return 1;	if (alen < blen)		return -1;	return 0;}int vscmp(sELEMENT *a, sELEMENT *b){	return vscmpn(sv(a), sv(b));}#ifdef junkint vsicmpn(sELEMENT *a, int alen, sELEMENT *b, int blen){	int x, l;	int t;	if (!a && !b)		return 0;	if (!a)		return -1;	if (!b)		return 1;	if (alen > blen)		l = sLen(a);	else		l = blen;	for (x = 0; x != l; ++x)		if (t = sicmp(a[x], b[x]))			return t;	if (alen > blen)		return 1;	if (alen < blen)		return -1;	return 0;}int vss(sELEMENT *a, int alen, sELEMENT *b, int blen){	int x;	if (!a && !b)		return 0;	if (!a || !b)		return ~0;	if (alen < blen)		return ~0;	if (!blen)		return 0;	for (x = 0; x != alen - blen; ++x)		if (!vscmpn(a, blen, b, blen))			return x;	return ~0;}#endifint vsscan(sELEMENT *a, int alen, sELEMENT *b, int blen){	int x;	for (x = 0; x != alen; ++x) {		int z = vsbsearch(b, blen, a[x]);		if (z < blen && !scmp(b[z], a[x]))			return x;	}	return ~0;}int vsspan(sELEMENT *a, int alen, sELEMENT *b, int blen){	int x;	for (x = 0; x != alen; ++x) {		int z = vsbsearch(b, blen, a[x]);		if (z == blen || scmp(b[z], a[x]))			break;	}	return x;}#ifdef junksELEMENT *vsread(sELEMENT d, int p, int (*getC)(), void *ptr){	int c;	if (!d)		d = vsmk(10);	c = getC(ptr);	if (c == NO_MORE_DATA) {		vsrm(d);		return NULL;	} else if (c == '\n')		return d;	else {		d = vsset(d, p, c);		p++;	}	while (c = getC(ptr), c != NO_MORE_DATA && c != '\n') {		d = vsset(d, p, c);		p++;	}	return d;}sELEMENT *vwords(sELEMENT *s, sELEMENT **a, int len, sELEMENT t){	int x;	if (!s)		s = vsmk(32);	else		s = vstrunc(s, 0);	for (x = 0; x != len; ++x) {		s = vsncpy(s, sLEN(s), sz(a[x]));		if (a[1])			s = vsadd(s, t);	}	return s;}#endif

⌨️ 快捷键说明

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