<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: allocator code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 19:49:04 GMT</pubDate>
    <description>DZone Snippets: allocator code</description>
    <item>
      <title>C memory manager "MemoryBlock "</title>
      <link>http://snippets.dzone.com/posts/show/437</link>
      <description>&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com&lt;br /&gt;&lt;br /&gt;#ifndef __MEMORYBLOCK__&lt;br /&gt;#define __MEMORYBLOCK__&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-- includes -----------------------------------------------&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-- data types ---------------------------------------------&lt;br /&gt;typedef struct _MemoryBlock {&lt;br /&gt;	void *data;&lt;br /&gt;	size_t capacity, used, dataSize;&lt;br /&gt;}* MemoryBlock;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-- functions ----------------------------------------------&lt;br /&gt;MemoryBlock getMemoryBlock( register const size_t dataSize, register const size_t initialSize ){&lt;br /&gt;&lt;br /&gt;	MemoryBlock mb = (MemoryBlock)malloc( sizeof( struct _MemoryBlock ) );&lt;br /&gt;	&lt;br /&gt;	if( mb ) {&lt;br /&gt;		mb-&gt;used = 0;&lt;br /&gt;		mb-&gt;data = NULL;&lt;br /&gt;		mb-&gt;dataSize = dataSize;&lt;br /&gt;		mb-&gt;capacity = initialSize &amp;&amp; ( mb-&gt;data = (void *)malloc( initialSize * dataSize ) ) ? initialSize : 0;&lt;br /&gt;	}&lt;br /&gt;	return mb;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void freeMemoryBlock( register const MemoryBlock mb ){&lt;br /&gt;	free( mb-&gt;data );&lt;br /&gt;	free( mb );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int resizeMemoryBlock( register const size_t newSize, register const MemoryBlock mb ){&lt;br /&gt;&lt;br /&gt;	void *newData = (void *)realloc( mb-&gt;data, newSize * mb-&gt;dataSize );&lt;br /&gt;&lt;br /&gt;	if( newData ){&lt;br /&gt;		mb-&gt;data = newData;&lt;br /&gt;		return mb-&gt;capacity = newSize;&lt;br /&gt;	}&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int growMemoryBlock( register const MemoryBlock mb ){&lt;br /&gt;&lt;br /&gt;	size_t delta = mb-&gt;capacity &gt; 64 ? mb-&gt;capacity / 4 : mb-&gt;capacity &gt; 8 ? 16 : 4;&lt;br /&gt;	void *newData = (void *)realloc( mb-&gt;data, ( mb-&gt;capacity + delta ) * mb-&gt;dataSize );&lt;br /&gt;&lt;br /&gt;	if( newData ){&lt;br /&gt;		mb-&gt;data = newData;&lt;br /&gt;		return mb-&gt;capacity += delta;&lt;br /&gt;	}&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int growExMemoryBlock( register const size_t neededBlocks, register const MemoryBlock mb ){&lt;br /&gt;	while( mb-&gt;used+neededBlocks &gt; mb-&gt;capacity )&lt;br /&gt;		if( !growMemoryBlock( mb ) )&lt;br /&gt;			return 0;&lt;br /&gt;	return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int incMemoryBlock( register const MemoryBlock mb ){&lt;br /&gt;	return  mb-&gt;used+1 &lt;= mb-&gt;capacity || growMemoryBlock( mb );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 02 Jul 2005 03:53:59 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/437</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
