#include <string.h>

#include "reclinker.h"

#define movetonew(arr,newp) { 					\
	arr->str = newp + (arr->str - arr->array);		\
	arr->strmid = newp + (arr->strmid - arr->array);	\
	arr->strend = newp + (arr->strend - arr->array);	\
	arr->array = newp;					\
}

int
appendtomyarray(struct myarray *arr, char *string)
{
	size_t len = strlen(string);

	if (arr->array + arr->length <  arr->strend + len + 1) {
		char *newp;
		arr->length = 2 * arr->length + len + 1;
	       	newp = (char *)REALLOC(arr->array,arr->length);
		movetonew(arr,newp);
	}
			
	arr->strend = (char *)memcpy(arr->strend,string,len) + len;
	*(arr->strend) = '\0';
	return len;
}

int
prependtomyarray(struct myarray *arr, char *string)
{
	size_t len = strlen(string);
	if (arr->str < arr->array + len + 1) {
		char *p, *q, *newp;
		newp = (char *)REALLOC(arr->array,arr->length * 2 + len + 1);
		movetonew(arr,newp);
		p = arr->strend;	
		q = arr->strend + arr->length + len + 1;
		arr->strend = q;
		while (1) {
			*q = *p;
			if(p == arr->str)
				break;
			q--;
			p--;
		}
		arr->strmid = q + (arr->strmid - arr->str);
		arr->str = q;
		arr->length = arr->length * 2 + len + 1;
	}		
				
	arr->str -= len;
	arr->str = memcpy(arr->str,string,len);
	return len;
}


syntax highlighted by Code2HTML, v. 0.9.1