File:  [parser3project] / parser3 / src / main / pa_string.C
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Fri Jan 26 14:47:52 2001 UTC (25 years, 5 months ago) by paf
Branches: MAIN
CVS tags: HEAD
Initial revision

#include <string.h>

#include "pa_pool.h"

void *String::operator new(size_t size, Pool *apool) {
	return apool->alloc(size);
}

void String::construct(Pool *apool, int achunk_items) {
	pool=apool;
	chunk_items=achunk_items;

	head_chunk=static_cast<Chunk *>(
		pool->calloc(sizeof(Chunk::Row)*chunk_items+sizeof(Chunk *)));
	append_here=&head_chunk->first;
	chunk_link_row=&head_chunk->first+chunk_items;
}

void String::expand() {
	chunk_link_row->link=static_cast<Chunk *>(
		pool->calloc(sizeof(Chunk::Row)*chunk_items+sizeof(Chunk *)));
	append_here=&chunk_link_row->link->first;
	chunk_link_row=&chunk_link_row->link->first+chunk_items;
}

String& String::operator += (char *src) {
	if(chunk_is_full())
		expand();

	append_here->item.ptr=src;
	append_here->item.size=strlen(src);
	append_here++;

	return *this;
}

size_t String::size() {
	int result=0;
	for(Chunk::Row *row=&head_chunk->first; row; row=&row->link->first)
		for(int i=0; i<chunk_items; i++) {
			if(row==append_here)
				goto break2;

			result+=row->item.size;
			row++;
		}
break2:
	return result;
}

char *String::c_str() {
	char *result=static_cast<char *>(pool->alloc(size()+1));

	char *copy_here=result;
	for(Chunk::Row *row=&head_chunk->first; row; row=&row->link->first)
		for(int i=0; i<chunk_items; i++) {
			if(row==append_here)
				goto break2;

			memcpy(copy_here, row->item.ptr, row->item.size);
			copy_here+=row->item.size;
			row++;
		}
break2:
	*copy_here=0;
	return result;
}


E-mail: