#include <stdio.h>
#include <strings.h>

extern char	*curptr, *curstash;
extern int	howlong, maxdeflen;

char	*malloc(), *realloc();

/*
 * handed a null-terminated string, add it to curstash, punting any
 * '\r' along the way.
 */
void
addtodef(string)
char	*string;
{
	int	memerror();
	int	i;
	int	len = strlen(string);
	/* we will overwrite the null on the next pass */

	if ((howlong + len) >= maxdeflen) {
		int	morestash = len + (BUFSIZ / 4);

		/*
		 * here we stomp a subtle bug: the assumption that 
		 * len < BUFSIZ.  Instead of adding BUFSIZ to
		 * curstash, add (len + (BUFSIZ / 4)).
		 */
		maxdeflen += morestash;
		if (maxdeflen == morestash) {

			/* ie, was this the first trip through? */
			curptr = curstash = malloc((unsigned)sizeof
						   (char *) * maxdeflen);
			if (curptr == (char *) NULL)
				memerror();
		} else {
			curstash = realloc(curstash, ((unsigned) sizeof
			     (char *) * maxdeflen));
			if (curstash == (char *) NULL)
				memerror();
			curptr = &(curstash[howlong]);
		}
	}

	for (i = 0; i < len; i++) {
		if (string[i] != '\r') {
			*curptr++ = string[i];
			howlong++;
		}
	}
}


/*
 * handed a single character, add it to curstash, as long as it is
 * not '\r'.
 */
void
addctodef(c)
register char	c;
{
	int	memerror();

	if (c == '\r')
		return;

	if ((howlong + 1) >= maxdeflen) {

		maxdeflen += BUFSIZ;
		if (maxdeflen == BUFSIZ) {

			/* ie, was this the first trip through? */
			curstash = malloc((unsigned) sizeof
			    (char *) * maxdeflen);
			if (curstash == (char *) NULL)
				memerror();
		} else {
			curstash = realloc(curstash, ((unsigned) sizeof
			    (char *) * maxdeflen));
			if (curstash == (char *) NULL)
				memerror();
		}
		curptr = curstash + howlong;
	}

	*curptr++ = c;
	howlong++;
}


