File:  [Research Unix] / researchv9 / jtools / src / sux / string.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:59 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

#include <jerq.h>
#include "frame.h"

#define	MAXROOM	1024	/* maximum extra number of chars after insure() */

char *
GCalloc(n, p)
	int n;
	char **p;
{
	gcalloc((unsigned long)n, p);
}

insure(p, n)
	register String *p;
	register short n;
{
	register i;
	char *old;
	if (p->size < n) {	/* p needs to grow */
		for (i = 1; i < n; i <<= 1)
			;
		if(i > n+MAXROOM)
			i = n+MAXROOM;
		if(p->s==0)
			old=0;
		else{
			GCalloc(p->n, &old);
			movstring(p->n, p->s, old);
			gcfree(p->s);
		}
		GCalloc(i, &p->s);
		if(old){
			movstring(p->n, old, p->s);
			gcfree(old);
		}
		p->size = i;
	}
}
#define	MINCHARS 64	/* for efficiency; min size of a string we'll alloc */
strzero(p)
	String *p;
{
	if(p->s && p->size>MINCHARS){
		p->n=0;
		p->size=0;	/* forces strinsure to free the old stuff */
	}
	insure(p, MINCHARS);
	p->n = 0;
}
insstring(p, i, q)
	register String *p, *q;
	register short i;
{
	insure(p, p->n+q->n);
	movstring(i-p->n, p->s+p->n, p->s+p->n+q->n);
	movstring(q->n, q->s, p->s+i);
	p->n += q->n;
}
delstring(p, i, j)
	register String *p;
	register short i, j;
{
	register n = j-i;
	movstring(p->n-j, p->s+j, p->s+i);
	p->n -= n;
}
movstring(i, s, d)
	register short i;
	register char *s, *d;
{
	if (i > 0)
		do
			*d++ = *s++;
		while (--i > 0);
	else {
		if (i++ < 0)		/* transfer -i chars in loop */
			do
				*--d = *--s;
			while (i++ < 0);
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.