13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Memory Pool Library
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * --------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Memory pool management.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "dePoolStringBuilder.h"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string.h>
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <stdarg.h>
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <stdio.h>
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef struct StringBlock_s
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*				str;
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	struct StringBlock_s*	next;
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} StringBlock;
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct dePoolStringBuilder_s
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deMemPool*		pool;
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				length;
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StringBlock*	blockListHead;
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StringBlock*	blockListTail;
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydePoolStringBuilder* dePoolStringBuilder_create (deMemPool* pool)
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	dePoolStringBuilder* builder = DE_POOL_NEW(pool, dePoolStringBuilder);
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!builder)
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return DE_NULL;
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	builder->pool			= pool;
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	builder->length			= 0;
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	builder->blockListHead	= DE_NULL;
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	builder->blockListTail	= DE_NULL;
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return builder;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
583c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeBool dePoolStringBuilder_appendString (dePoolStringBuilder* builder, const char* str)
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StringBlock*	block		= DE_POOL_NEW(builder->pool, StringBlock);
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				len			= (int)strlen(str);
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	char*			blockStr	= (char*)deMemPool_alloc(builder->pool, len + 1);
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!block || !blockStr)
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return DE_FALSE;
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Initialize block. */
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		char*		d	= blockStr;
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	s	= str;
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while (*s)
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			*d++ = *s++;
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		*d = 0;
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block->str	= blockStr;
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block->next	= DE_NULL;
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	/* Add block to list. */
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (builder->blockListTail)
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		builder->blockListTail->next = block;
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		builder->blockListHead = block;
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	builder->blockListTail = block;
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	builder->length += len;
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return DE_TRUE;
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
923c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeBool dePoolStringBuilder_appendFormat (dePoolStringBuilder* builder, const char* format, ...)
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	char	buf[512];
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	va_list	args;
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deBool	ok;
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	va_start(args, format);
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vsnprintf(buf, DE_LENGTH_OF_ARRAY(buf), format, args);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ok = dePoolStringBuilder_appendString(builder, buf);
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	va_end(args);
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return ok;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/* \todo [2009-09-05 petri] Other appends? printf style? */
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint dePoolStringBuilder_getLength (dePoolStringBuilder* builder)
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return builder->length;
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyrychar* dePoolStringBuilder_dupToString (dePoolStringBuilder* builder)
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return dePoolStringBuilder_dupToPool(builder, builder->pool);
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyrychar* dePoolStringBuilder_dupToPool (dePoolStringBuilder* builder, deMemPool* pool)
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	char* resultStr = (char*)deMemPool_alloc(pool, builder->length + 1);
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (resultStr)
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StringBlock*	block	= builder->blockListHead;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		char*			dstPtr	= resultStr;
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while (block)
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* p = block->str;
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			while (*p)
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				*dstPtr++ = *p++;
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			block = block->next;
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		*dstPtr++ = 0;
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT((int)strlen(resultStr) == builder->length);
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return resultStr;
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
142