<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>FIFO data structure</title>
		<link>http://www.allegro.cc/forums/view/577795</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 12 Apr 2006 12:23:18 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I believe that FIFO is the data structure that I am after in my game. Basically when text needs to be displayed, I want it added to list (a maximum of five messages may be shown at once). New messages are added to the bottom of the list and have a lifetime variable that slowly ticks upwards. Once a message has been displayed for X amount of seconds, it perishes. In-game the messages would be rendered in order of oldest to newest:</p><div class="source-code snippet"><div class="inner"><pre>Old message
New message
</pre></div></div><p>

Which would mean that, once Old message perishes, the New message will move up and take its place.</p><p>Now, does anyone have any friendly C examples of a nice simple FIFO structure?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 08 Apr 2006 03:07:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>FIFO is just First In First Out.  You could do it easily with a linked list, always adding to the beginning of the list and removing from the beginning of the list.  </p><p>A small C-like example would be:</p><p>[EDIT] - OOops got my FIFO and FILO mixed...editing post...<br />[EDIT 2] - Actually, even witht the code for a FILO below, you should be able to figure out how to change it to a FIFO.  The only function that needs changing would be the remove() function (since it removes from the end of the list instead of the beginning).</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">typedef</span> <span class="k1">struct</span> list</td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    <span class="k1">char</span> <span class="k3">*</span>cMessage<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>    LIST <span class="k3">*</span>next<span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k2">}</span>  LIST<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>LIST <span class="k3">*</span>add<span class="k2">(</span>LIST <span class="k3">*</span>lList, <span class="k1">char</span> <span class="k3">*</span>message<span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>    LIST <span class="k3">*</span>lTemp <span class="k3">=</span> <span class="k2">(</span>LIST <span class="k3">*</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>LIST<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>lTemp-&gt;cMessage, message<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>    lTemp-&gt;next <span class="k3">=</span> lList<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>    <span class="k1">return</span> lTemp<span class="k2">;</span></td></tr><tr><td class="number">14</td><td><span class="k2">}</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>LIST <span class="k3">*</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_659.html" target="_blank">remove</a><span class="k2">(</span>LIST <span class="k3">*</span>lList<span class="k2">)</span></td></tr><tr><td class="number">17</td><td><span class="k2">{</span></td></tr><tr><td class="number">18</td><td>     LIST <span class="k3">*</span>lTemp <span class="k3">=</span> lList-&gt;next<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>     <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>lList<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>     <span class="k1">return</span> lTemp<span class="k2">;</span></td></tr><tr><td class="number">21</td><td><span class="k2">}</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">24</td><td><span class="k2">{</span></td></tr><tr><td class="number">25</td><td>     LIST <span class="k3">*</span>myList <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>     myList <span class="k3">=</span> add<span class="k2">(</span>myList, <span class="s">"Hello"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>     myList <span class="k3">=</span> add<span class="k2">(</span>myList, <span class="s">"World"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>     myList <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_659.html" target="_blank">remove</a><span class="k2">(</span>myList<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>     <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

myList would then only contain the message &quot;Hello&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Sat, 08 Apr 2006 03:23:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No... he wants FIFO. The older messages (first ones in) will expire before the new ones (last ones in), so the first ones in go out first.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Sat, 08 Apr 2006 03:29:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I noticed that after I wrote my post and tried to stick a quick edit in saying I was changing the post.  Guess it wasn&#39;t quick enough.  <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Sat, 08 Apr 2006 03:30:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think it is something similar to this:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">typedef</span> <span class="k1">struct</span> node_st <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>    <span class="k1">int</span> data<span class="k2">;</span></td></tr><tr><td class="number">3</td><td>    <span class="k1">struct</span> node_st <span class="k3">*</span>next<span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k2">}</span> node_t<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>node_t <span class="k3">*</span>head<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>node_t <span class="k3">*</span>tail<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="k1">void</span> push<span class="k2">(</span>node_t <span class="k3">*</span>node<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">if</span> <span class="k2">(</span>head <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>        head <span class="k3">=</span> node<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>        tail <span class="k3">=</span> node<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>        tail-&gt;next <span class="k3">=</span> node<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>        tail <span class="k3">=</span> node<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>node_t <span class="k3">*</span>pop<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>    node_t <span class="k3">*</span>node<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>    node <span class="k3">=</span> head<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <span class="k1">if</span> <span class="k2">(</span>head <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">25</td><td>        head <span class="k3">=</span> head-&gt;next<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>    <span class="k1">if</span> <span class="k2">(</span>head <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">28</td><td>        tail <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>    <span class="k1">return</span> <span class="k2">(</span>node<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

(Edited: Fixed pop, was doing a pile instead of a queue. Also removed the previous link as it is not a pile and cleared the tail if the last element is popped from the queue).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Sat, 08 Apr 2006 03:39:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, as far as the push and pop commands are concerned: I&#39;m slightly confused as to how the data is actually taken into account?</p><p>As for the other example of remove... I&#39;m not very familiar with pointers... but I&#39;m assuming I would have to adjust it to loop through lList until lList-&gt;next == NULL?</p><p>Something like:
</p><div class="source-code snippet"><div class="inner"><pre>LIST <span class="k3">*</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_659.html" target="_blank">remove</a><span class="k2">(</span>LIST <span class="k3">*</span>lList<span class="k2">)</span>
<span class="k2">{</span>
     LIST <span class="k3">*</span>lTemp <span class="k3">=</span> lList-&gt;next<span class="k2">;</span>

     <span class="k1">for</span><span class="k2">(</span><span class="k2">;</span><span class="k2">;</span><span class="k2">)</span> <span class="k2">{</span>
        lTemp <span class="k3">=</span> lTemp-&gt;next<span class="k2">;</span>
        <span class="k1">if</span><span class="k2">(</span> lTemp-&gt;next <span class="k3">=</span><span class="k3">=</span> NULL <span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span>
     <span class="k2">}</span>

     <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>lList<span class="k2">)</span><span class="k2">;</span>
     <span class="k1">return</span> lTemp<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 08 Apr 2006 03:45:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In a queue and a pile, data is never taken into account. It doesn&#39;t matter what the node is holding, but when it was inserted into the list. In a [ordered] list, the data is used to sort the nodes as they are inserted into the list, but you are not doing that.</p><p>The problem with your remove is having to iteract until finding the last one. That is why you should keep a pointer to the tail. However, if you are going to remove the last one (which I guess is the last one to be inserted) you are using a LIFO (last in, first out), which is a pile, not a queue.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Sat, 08 Apr 2006 04:00:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If data is not taken into account (I see what you are saying)... then why have you included a data integer in the node_st struct? </p><p>I&#39;ve explained my situation (and what I&#39;m looking to achieve)... but now I&#39;m even more confused as to which data structure I actually need!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 08 Apr 2006 04:11:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just as a side note, the term used for a LIFO data structure is typically stack, not pile (at least in english).;)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Carrus85)</author>
		<pubDate>Sat, 08 Apr 2006 04:13:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The data is there just to let you know there is some data in the node. In other words, instead of &#39;int data&#39; put all the information you need, like text, length, health point, etc, or a struct with your data. The important thing is that the node encapsulates your data, being it a simple integer or a full class.</p><p>Oh, stack... I always say pile instead of stack <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Sat, 08 Apr 2006 04:15:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Now, does anyone have any friendly C examples of a nice simple FIFO structure?
</p></div></div><p>

Google search for queue structure. If you are coding in c++ there is one in STL and probably one in BOOST as well.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Sat, 08 Apr 2006 04:21:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s my attempt using some Queue structure code I found via Google:</p><p>Most of it works well (messages are added and can be displayed). Except, after the first message dies (see SortQueue), garbage is displayed for that specific string and then the rest functions normally for a few more messages before crashing. I&#39;m guess this is down to me breaking the link between the list elements, but I&#39;m not sure how I should really go about it?</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> SortQueue<span class="k2">(</span>listelement <span class="k3">*</span> listpointer<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>     </td></tr><tr><td class="number">3</td><td>    <span class="k1">if</span> <span class="k2">(</span>listpointer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>     </td></tr><tr><td class="number">4</td><td>    <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">5</td><td>      <span class="k1">while</span> <span class="k2">(</span>listpointer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>            </td></tr><tr><td class="number">7</td><td>            listpointer-&gt;lifetime<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>            <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>listpointer-&gt;lifetime<span class="k3">/</span><span class="n">60</span><span class="k2">)</span><span class="k3">&gt;</span>MSG_LIFE<span class="k2">)</span><span class="k2">{</span> </td></tr><tr><td class="number">9</td><td>                <span class="k1">if</span> <span class="k2">(</span>listpointer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>     </td></tr><tr><td class="number">10</td><td>                <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>                                     </td></tr><tr><td class="number">11</td><td>                    listpointer <span class="k3">=</span> RemoveItem<span class="k2">(</span>listpointer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>                    message_count <span class="k3">=</span> QueueCount<span class="k2">(</span>listpointer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>                <span class="k2">}</span></td></tr><tr><td class="number">14</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>          listpointer <span class="k3">=</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">18</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">19</td><td>          </td></tr><tr><td class="number">20</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">typedef</span> <span class="k1">struct</span> <span class="k2">{</span>
    <span class="k1">char</span> message<span class="k2">[</span>MSG_SIZE<span class="k2">]</span><span class="k2">;</span>
    <span class="k1">int</span> lifetime, type<span class="k2">;</span>
    <span class="k1">struct</span> listelement <span class="k3">*</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span>
<span class="k2">}</span> listelement<span class="k2">;</span>
</pre></div></div><p>

</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>listelement <span class="k3">*</span> AddItem <span class="k2">(</span>listelement <span class="k3">*</span> listpointer, <span class="k1">int</span> type, <span class="k1">char</span> <span class="k3">*</span>msg<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td>    listelement <span class="k3">*</span> lp <span class="k3">=</span> listpointer<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>    <span class="k1">if</span> <span class="k2">(</span>listpointer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">while</span> <span class="k2">(</span>listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a> <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">7</td><td>      listpointer <span class="k3">=</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a> <span class="k3">=</span> <span class="k2">(</span><span class="k1">struct</span> listelement  <span class="k3">*</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a> <span class="k2">(</span><span class="k1">sizeof</span> <span class="k2">(</span>listelement<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  listpointer <span class="k3">=</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a> <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  listpointer <span class="k3">-</span><span class="k3">&gt;</span> type <span class="k3">=</span> type<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  listpointer <span class="k3">-</span><span class="k3">&gt;</span> lifetime <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> message, <span class="k1">sizeof</span><span class="k2">(</span>listpointer <span class="k3">-</span><span class="k3">&gt;</span> message<span class="k2">)</span>, msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="k1">return</span> lp<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>    <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">17</td><td>  listpointer <span class="k3">=</span> <span class="k2">(</span><span class="k1">struct</span> listelement  <span class="k3">*</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a> <span class="k2">(</span><span class="k1">sizeof</span> <span class="k2">(</span>listelement<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a> <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>  listpointer <span class="k3">-</span><span class="k3">&gt;</span> type <span class="k3">=</span> type<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>  listpointer <span class="k3">-</span><span class="k3">&gt;</span> lifetime <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> message, <span class="k1">sizeof</span><span class="k2">(</span>listpointer <span class="k3">-</span><span class="k3">&gt;</span> message<span class="k2">)</span>, msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="k1">return</span> listpointer<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">24</td><td><span class="k2">}</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>listelement <span class="k3">*</span> RemoveItem <span class="k2">(</span>listelement <span class="k3">*</span> listpointer<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>    listelement <span class="k3">*</span> tempp<span class="k2">;</span>    </td></tr><tr><td class="number">29</td><td>    tempp <span class="k3">=</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a> <span class="k2">(</span>listpointer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    <span class="k1">return</span> tempp<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    </td></tr><tr><td class="number">33</td><td><span class="k2">}</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td><span class="k1">void</span> PrintQueue <span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, listelement <span class="k3">*</span> listpointer, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>    <span class="k1">if</span> <span class="k2">(</span>listpointer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>     </td></tr><tr><td class="number">38</td><td>    <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">39</td><td>      <span class="k1">while</span> <span class="k2">(</span>listpointer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>            <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span> bmp, chatImg<span class="k2">[</span>listpointer-&gt;type<span class="k2">]</span>, x, <span class="k2">(</span>y <span class="k3">-</span> <span class="n">3</span><span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>            render_outline_text<span class="k2">(</span> bmp, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, listpointer-&gt;message, x <span class="k3">+</span> <span class="n">20</span>, y, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">42</td><td>          listpointer <span class="k3">=</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>          y<span class="k3">+</span><span class="k3">=</span><span class="n">15</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">45</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">46</td><td>&#160;</td></tr><tr><td class="number">47</td><td><span class="k2">}</span></td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td><span class="k1">int</span> QueueCount <span class="k2">(</span>listelement <span class="k3">*</span> listpointer<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td>    <span class="k1">int</span> count<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>&#160;</td></tr><tr><td class="number">53</td><td>    <span class="k1">if</span> <span class="k2">(</span>listpointer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>                         </td></tr><tr><td class="number">54</td><td>    <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">55</td><td>      <span class="k1">while</span> <span class="k2">(</span>listpointer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">56</td><td>          count<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>          listpointer <span class="k3">=</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">59</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">60</td><td>  </td></tr><tr><td class="number">61</td><td>  <span class="k1">return</span> count<span class="k2">;</span></td></tr><tr><td class="number">62</td><td>&#160;</td></tr><tr><td class="number">63</td><td><span class="k2">}</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td><span class="k1">void</span> ClearQueue <span class="k2">(</span>listelement <span class="k3">*</span> listpointer<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">66</td><td>&#160;</td></tr><tr><td class="number">67</td><td>    <span class="k1">while</span> <span class="k2">(</span>listpointer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">68</td><td>        listpointer <span class="k3">=</span> RemoveItem <span class="k2">(</span>listpointer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">70</td><td>    </td></tr><tr><td class="number">71</td><td><span class="k2">}</span></td></tr><tr><td class="number">72</td><td>&#160;</td></tr><tr><td class="number">73</td><td><span class="c">// Read through messages (back-&gt;front)</span></td></tr><tr><td class="number">74</td><td><span class="k1">void</span> render_messages<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span><a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>   </td></tr><tr><td class="number">76</td><td>     <span class="k1">if</span><span class="k2">(</span> message_count <span class="k3">&gt;</span> <span class="n">0</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">77</td><td>         </td></tr><tr><td class="number">78</td><td>         <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span> hud, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>         </td></tr><tr><td class="number">79</td><td>         <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span> hud, x, y, <span class="k2">(</span>x <span class="k3">+</span> <span class="k2">(</span>bmp-&gt;w <span class="k3">-</span> <span class="k2">(</span>x <span class="k3">*</span> <span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span>, y <span class="k3">+</span> <span class="k2">(</span>message_count <span class="k3">*</span> <span class="n">15</span><span class="k2">)</span>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>     </td></tr><tr><td class="number">81</td><td>         <a href="http://www.allegro.cc/manual/set_trans_blender" target="_blank"><span class="a">set_trans_blender</span></a><span class="k2">(</span> <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">55</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td>         <a href="http://www.allegro.cc/manual/draw_trans_sprite" target="_blank"><span class="a">draw_trans_sprite</span></a><span class="k2">(</span> buffer, hud, <span class="n">0</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>     </td></tr><tr><td class="number">84</td><td>         y <span class="k3">+</span><span class="k3">=</span> <span class="n">4</span><span class="k2">;</span> x <span class="k3">+</span><span class="k3">=</span> <span class="n">15</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>&#160;</td></tr><tr><td class="number">86</td><td>         PrintQueue <span class="k2">(</span>bmp, listpointer, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>         </td></tr><tr><td class="number">88</td><td>     <span class="k2">}</span></td></tr><tr><td class="number">89</td><td> </td></tr><tr><td class="number">90</td><td>     render_error_messages<span class="k2">(</span> bmp, def_large_text, <span class="n">300</span>, <span class="n">453</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td>     </td></tr><tr><td class="number">92</td><td><span class="k2">}</span></td></tr><tr><td class="number">93</td><td>&#160;</td></tr><tr><td class="number">94</td><td><span class="k1">void</span> SortQueue<span class="k2">(</span>listelement <span class="k3">*</span> listpointer<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">95</td><td>     </td></tr><tr><td class="number">96</td><td>    <span class="k1">if</span> <span class="k2">(</span>listpointer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>     </td></tr><tr><td class="number">97</td><td>    <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">98</td><td>      <span class="k1">while</span> <span class="k2">(</span>listpointer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">99</td><td>            </td></tr><tr><td class="number">100</td><td>            listpointer-&gt;lifetime<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td>            <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>listpointer-&gt;lifetime<span class="k3">/</span><span class="n">60</span><span class="k2">)</span><span class="k3">&gt;</span>MSG_LIFE<span class="k2">)</span><span class="k2">{</span> </td></tr><tr><td class="number">102</td><td>                <span class="k1">if</span> <span class="k2">(</span>listpointer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span>     </td></tr><tr><td class="number">103</td><td>                <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>                                     </td></tr><tr><td class="number">104</td><td>                    listpointer <span class="k3">=</span> RemoveItem<span class="k2">(</span>listpointer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">105</td><td>                    message_count <span class="k3">=</span> QueueCount<span class="k2">(</span>listpointer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">106</td><td>                <span class="k2">}</span></td></tr><tr><td class="number">107</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">108</td><td>          listpointer <span class="k3">=</span> listpointer <span class="k3">-</span><span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_531.html" target="_blank">link</a><span class="k2">;</span></td></tr><tr><td class="number">109</td><td>&#160;</td></tr><tr><td class="number">110</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">111</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">112</td><td>          </td></tr><tr><td class="number">113</td><td><span class="k2">}</span></td></tr><tr><td class="number">114</td><td>&#160;</td></tr><tr><td class="number">115</td><td><span class="k1">void</span> local_sort_messages<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">116</td><td>     </td></tr><tr><td class="number">117</td><td>     SortQueue<span class="k2">(</span> listpointer <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">118</td><td>     </td></tr><tr><td class="number">119</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 08 Apr 2006 06:09:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you have a fixed number of messages, then it can be even easier. Just use a ring buffer.
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">class</span> RINGBUFFER <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  protected:</td></tr><tr><td class="number">3</td><td>    string data<span class="k2">[</span>MAX_RINGBUFFER_SIZE<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>    <span class="k1">int</span> top<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">int</span> cur<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  public:</td></tr><tr><td class="number">7</td><td>    RINGBUFFER<span class="k2">(</span><span class="k2">)</span><span class="k2">:</span> top<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>, cur<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>    <span class="k1">void</span> clear<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>      top <span class="k3">=</span> cur <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>    <span class="k1">void</span> push<span class="k2">(</span>string s<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>      data<span class="k2">[</span>cur<span class="k2">]</span> <span class="k3">=</span> s<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      <span class="k3">+</span><span class="k3">+</span>cur<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>      cur %<span class="k3">=</span> MAX_RINGBUFFER_SIZE<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>      <span class="k1">if</span> <span class="k2">(</span>cur <span class="k3">=</span><span class="k3">=</span> top<span class="k2">)</span></td></tr><tr><td class="number">18</td><td>        <span class="k3">+</span><span class="k3">+</span>top<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>      top %<span class="k3">=</span> MAX_RINGBUFFER_SIZE<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>    <span class="k1">void</span> render<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmp<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">23</td><td>      <span class="k1">int</span> y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>      <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> top<span class="k2">;</span> i <span class="k3">!</span><span class="k3">=</span> cur<span class="k2">;</span> i <span class="k3">=</span> <span class="k2">(</span>i<span class="k3">+</span><span class="n">1</span><span class="k2">)</span> % MAX_RINGBUFFER_SIZE<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>        <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>bmp, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">0</span>, y, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span>, <span class="k3">-</span><span class="n">1</span>, <span class="s">"%40s"</span>, data<span class="k3">&lt;</span>i&gt;.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>        y <span class="k3">+</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/text_height" target="_blank"><span class="a">text_height</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">28</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">29</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

Something like that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Tue, 11 Apr 2006 16:49:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Just as a side note, the term used for a LIFO data structure is typically stack, not pile (at least in english).;)
</p></div></div><p>

&quot;Pila&quot; is the Spanish word we use for stack(LIFO), and &quot;pile&quot; is the most common mistake you can expect from a Spanish talker.<br />There is also another stupid examples of course, like &quot;cola&quot; which also means a$$, we say &quot;cola&quot; instead of buffer:D
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul whoknows)</author>
		<pubDate>Wed, 12 Apr 2006 10:01:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>for 5 text strings<br />just have 5 const char*&#39;s and manually move the ptrs, until you need a serious use for a FIFO LIFO FILO MOMO you should just keep things as simple as possible.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Wed, 12 Apr 2006 12:21:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wow, didn&#39;t notice you&#39;re from Argentina, Paul. Your English certainly doesn&#39;t tell. There are quite a few &quot;false friends&quot; between Spanish and most Germanic languages (English, German and Dutch are the ones I use). Took me a few weeks to find out that German / Dutch / English &quot;tempo&quot; (in music) unfortunately doesn&#39;t correspond to &quot;tiempo&quot;, but rather to &quot;aire&quot;, which, in turn, I had taken to mean something like &quot;atmosphere&quot; or &quot;general feel&quot;.<br />In Cuban music, there is also the disturbing fact that one word usually means at least 3 things. For example, a &quot;montuno&quot; can be:<br />- a pattern the piano, guitar, or tres, plays (a.k.a. &quot;guajeo&quot;, &quot;tumbao&quot;)<br />- the second part of a salsa or son, sort of an open vamp section<br />- the chord sequence used in that part of the music<br />- a music genre<br />- a dance<br />It gets less disturbing once one understands that these seemingly different things, after all, are manifestations of the same thing.<br />Also, Cubans seem to use the words &quot;bailar&quot; and &quot;tocar&quot; interchangeably when referring to playing an instrument.</p><p>Enough OT.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Wed, 12 Apr 2006 12:23:18 +0000</pubDate>
	</item>
</rss>
