V8/usr/src/cmd/qed/string.c

Compare this file to the similar file:
Show the results in this format:

/*% cc -c -O %
 */
#include "vars.h"
#define	strfree string[NSTRING].str
char *strstart;

length(s)
	register char *s;
{
	register char *t;
	if((t=s)==0)
		return(0);
	do;while(*t++);
	return(t-s-1);
}
startstring(){
	strstart=strfree;
}
addstring(c){
	if(strfree==strchars+NSTRCHARS)
		strcompact();
	*strfree++ = c;
}
dropstring(){
	--strfree;
}
cpstr(a, b)
	register char *a, *b;
{
	do;while (*b++ = *a++);
}
shiftstring(up){	/* A highly machine-dependent routine */
	register struct string *sp;
	for(sp=string; sp<=string+NSTRING; sp++)
		if(up)
			sp->str += (int)strarea;
		else
			sp->str -= (int)strarea;
}
clearstring(z){
	string[z].len = 0;
	string[z].str = nullstr;
}
copystring(s)
	register char *s;
{
	while(*s)
		addstring(*s++);
}
eqstr(a, b)
	register char *a, *b;
{
	while(*a)
		if(*a++ != *b++)
			return(FALSE);
	return(*b=='\0');
}
/*
 * dupstring duplicates a string.
 * Because we may strcompact(), we do it first if necessary.
 */
dupstring(z)
{
	if(strfree+string[z].len > strchars+NSTRCHARS)
		strcompact();	/* if insufficient, will get error when we copystring() */
	copystring(string[z].str);
}
setstring(n){
	addstring('\0');
	if((string[n].len = length(strstart)) == 0)
		string[n].str = nullstr;
	else
		string[n].str = strstart;
	if(strfree >= strchars + NSTRCHARS)
		strcompact();
}
strcompact(){
	register struct string *cursor;
	struct string *thisstr;
	register char *s, *t;
	lock++;
	s=strchars;
	for(;;){
		t=strchars+NSTRCHARS;
		for(cursor=string;cursor!=string+NSTRING;cursor++)
			if(s<=cursor->str && cursor->str<t){
				t = cursor->str;
				thisstr = cursor;
			}
		if(t==strchars+NSTRCHARS)
			break;
		thisstr->str=s;
		do;while(*s++ = *t++);
	}
	t=strstart;
	strstart=s;
	while(t!=strfree)
		*s++ = *t++;
	strfree=s;
	if(s==strchars+NSTRCHARS){
		strfree=strstart;
		error('Z');
	}
	unlock();
}