<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RedBrain @ $HOME : ~ $ &#187; Crules</title>
	<atom:link href="http://redbrain.co.uk/index.php/tag/crules/feed/" rel="self" type="application/rss+xml" />
	<link>http://redbrain.co.uk</link>
	<description>Frustrated Software Developer</description>
	<lastBuildDate>Wed, 16 Nov 2011 17:36:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Parsing the Doom Wad File</title>
		<link>http://redbrain.co.uk/index.php/random/parsing-the-doom-wad-file/</link>
		<comments>http://redbrain.co.uk/index.php/random/parsing-the-doom-wad-file/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 01:12:31 +0000</pubDate>
		<dc:creator>redbrain</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[Crules]]></category>
		<category><![CDATA[doom]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://redbrain.co.uk/?p=528</guid>
		<description><![CDATA[<p>So it was a fine Christmas, I was at home with family armed only with 2 seasons of xFiles and my laptop added to the factI didn&#8217;t upload my ssh key to my laptop so hacking on Crules was out the window. So it got me thinking on the main goals for my Crules Scripting [...]]]></description>
			<content:encoded><![CDATA[<p>So it was a fine Christmas, I was at home with family armed only with 2 seasons of xFiles and my laptop added to the factI didn&#8217;t upload my ssh key to my laptop so hacking on Crules was out the window. So it got me thinking on the main goals for my Crules Scripting Language, one of which ( the main one ) is that it should be embeddable into existing C/C++ applications like Lua or Python or even C# (mono) if your using its recently added reflection api!</p>
<p>So why not make a game engine using my language with crules as a scripting language so I can see what the API _SHOULD_ look like for the client. So i choose doom since i am terrible with graphics, i can use the doom.wad and concentrate on programming; So in the past i have written two separate 2D game engines one was a Java 2D <a href="http://en.wikipedia.org/wiki/Monkey_Island_%28series%29">Monkey Island</a> clone i done for university and it was terrible since Java is a terrible platform in my opinion, then my 2nd was a port  of it over to <a href="http://www.libsdl.org/">C++/SDL</a> and the code was terrible <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  so don&#8217;t bother asking me about it.</p>
<p>Anyway&#8217;s so the long and short i am writing doom engine from scratch, my original idea was to work with an existing game engine like <a href="http://www.crystalspace3d.org/main/Main_Page">Crystal Space</a> or <a href="http://dengine.net/">Doomsday Engine</a> though, Crystal Space i was put off since it already uses Python and i don&#8217;t really feel like trawling though lots of code and forking it essentially would be really more work than its worth. Doomsday Engine is the cream of the crop of Doom Ports at the moment, all others are practically the same in essence using the same ancient code and hacks from throughout the 90&#8242;s. And really the technology has changed somewhat since then. Though Doomsday Engine is pretty amazing and works well, it seems to need a massive cleanup and i don&#8217;t mean to be nasty on the developers or anything they have done a fantastic job!  And they have really made the code much cleaner than any other port about! Plus the lead developer has been really nice to me <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Anyway&#8217;s Games have always been a great passion to me and really doom can&#8217;t be that hard to re-implement from scratch and really it isn&#8217;t i already have a basic game engine working using OpenGL and <a href="http://www.libsdl.org/">SDL{ _ttf, _mixer }</a>. With audio, and fps counter and input bla bla. But i am just concentrating on differentiating the wad sprite formats etc while revising for exams and working on crules and many other bits and pieces. So in the end  i&#8217;ll just stick in an extract of the log of my game engine when it starts parsing the doom.wad and explain a little on how to parse the wad!</p>
<blockquote><p>debug: main.c:28 -&gt; Trying to start crldoom wad: data/doom.wad!<br />
debug: doom.c:147 -&gt; parsing wad file &lt;data/doom.wad&gt;!<br />
debug: doom.c:80 -&gt; is a wad file :: &lt;IWAD&gt;!<br />
log: doom.c:155 -&gt; wad file data/doom.wad has length 12408292!<br />
debug: doom.c:27 -&gt; debug seeking&#8230;<br />
debug: doom.c:30 -&gt; reading&#8230;.<br />
debug: doom.c:34 -&gt; parsing&#8230;<br />
log: doom.c:49 -&gt; header:: ident -&gt; 1145132873, n_lumps -&gt; 2306, infotableofs -&gt; 12371396!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 12, size -&gt; 10752, name -&gt; 1497451600, ident -&gt; PLAYPAL!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 10764, size -&gt; 8704, name -&gt; 1330401091, ident -&gt; COLORMAP!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 19468, size -&gt; 4000, name -&gt; 1329876549, ident -&gt; ENDOOM!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 23468, size -&gt; 6854, name -&gt; 1330464068, ident -&gt; DEMO1!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 30324, size -&gt; 9402, name -&gt; 1330464068, ident -&gt; DEMO2!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 39728, size -&gt; 15466, name -&gt; 1330464068, ident -&gt; DEMO3!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 55196, size -&gt; 3286, name -&gt; 1330464068, ident -&gt; DEMO4!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 58484, size -&gt; 0, name -&gt; 827142469, ident -&gt; E1M1!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 58484, size -&gt; 1430, name -&gt; 1313425492, ident -&gt; THINGS!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 59916, size -&gt; 6804, name -&gt; 1162758476, ident -&gt; LINEDEFS!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 66720, size -&gt; 19980, name -&gt; 1162103123, ident -&gt; SIDEDEFS!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 86700, size -&gt; 1880, name -&gt; 1414677846, ident -&gt; VERTEXES!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 88580, size -&gt; 8964, name -&gt; 1397179731, ident -&gt; SEGS!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 97544, size -&gt; 956, name -&gt; 1128616787, ident -&gt; SSECTORS!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 98500, size -&gt; 6664, name -&gt; 1162104654, ident -&gt; NODES!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 105164, size -&gt; 2288, name -&gt; 1413694803, ident -&gt; SECTORS!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 107452, size -&gt; 968, name -&gt; 1162495314, ident -&gt; REJECT!<br />
log: doom.c:62 -&gt; directory:: filepos -&gt; 108420, size -&gt; 6948, name -&gt; 1129270338, ident -&gt; BLOCKMAP!</p></blockquote>
<p>So this is just some of the output of the code i had written it parses out whats called the &#8216;directories&#8217; in the file and then i also have functions to parse out whats called the &#8216;lumps&#8217; from these directories the lumps are the actual data. I&#8217;ll explain more detail when i talk about how to parse this. And how to convert the music lumps to proper midi so you can play it in SDL_mixer or even in Totem if in in gnome.</p>
<p>So what do we need, if you have yourself a Doom.wad file lying about i am sure if you go through your old boxes you&#8217;ll find yourself a copy of doom, or if you cant find it you can find it on torrent sites but you didn&#8217;t read that here <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Thing is I have bought the game like 3/4 times I am sure hehe. Lets get started.</p>
<p>In the Doom wad there is whats called the &#8216;HEADER&#8217; which is of length 12 bytes which contains 3 * 4-byte integers which contain the data we care about, so lets do that lets make some code (i just wrote this code in like 10 min to illustrate the idea its ok does the job!):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdio.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdlib.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;string.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">#define WAD_HEADER_LENGTH &nbsp; &nbsp; 12</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define WAD_DIRECTORY_LENGTH &nbsp;16</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">unsigned</span> <span class="kw4">long</span> parse_int<span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> *p <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span><span class="br0">&#41;</span> &nbsp; p<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span><span class="br0">&#41;</span> p<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> &lt;&lt; <span class="nu0">8</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span><span class="br0">&#41;</span> p<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> &lt;&lt; <span class="nu0">16</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span><span class="br0">&#41;</span> p<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> &lt;&lt; <span class="nu0">24</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span> ;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span> <span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">const</span> <span class="kw4">char</span>* wad_file= <span class="st0">&quot;/home/redbrain/workspace/doom-dev/crldoom/data/doom.wad&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; FILE* wad_fd;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> !<span class="br0">&#40;</span>wad_fd= fopen<span class="br0">&#40;</span>wad_file, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>stderr, <span class="st0">&quot;error opening &lt;%s&gt;!<span class="es0">\n</span>&quot;</span>, wad_file<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> EXIT_FAILURE;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">unsigned</span> <span class="kw4">char</span> header_buffer<span class="br0">&#91;</span> WAD_HEADER_LENGTH <span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fread<span class="br0">&#40;</span> header_buffer, WAD_HEADER_LENGTH, <span class="nu0">1</span>, wad_fd <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">char</span>* wad_ident= <span class="br0">&#40;</span><span class="kw4">char</span>*<span class="br0">&#41;</span> header_buffer;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; wad_ident<span class="br0">&#91;</span> <span class="nu0">4</span> <span class="br0">&#93;</span>= <span class="st0">&#8216;<span class="es0">\0</span>&#8216;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> strncmp<span class="br0">&#40;</span> wad_ident, <span class="st0">&quot;IWAD&quot;</span>, <span class="nu0">4</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>stderr, <span class="st0">&quot;invalid wad header type &lt;%s&gt;!<span class="es0">\n</span>&quot;</span>, wad_ident <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> EXIT_FAILURE;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;doom wad is a &lt;%s&gt;!<span class="es0">\n</span>&quot;</span>, wad_ident <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> wad_length= <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fseek<span class="br0">&#40;</span> wad_fd, <span class="nu0">0</span>, SEEK_END <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; wad_length= ftell<span class="br0">&#40;</span> wad_fd <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> directory_offset= parse_int<span class="br0">&#40;</span> header_buffer<span class="nu0">+8</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> number_lumps= parse_int<span class="br0">&#40;</span> header_buffer<span class="nu0">+4</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;wad directory offset &lt;%lu&gt; with &lt;%lu&gt; lumps!<span class="es0">\n</span>&quot;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;directory_offset, number_lumps <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> t_ofs= directory_offset; <span class="kw4">unsigned</span> <span class="kw4">long</span> lump_count= <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span><span class="br0">&#40;</span> t_ofs &lt;= <span class="br0">&#40;</span> wad_length -- WAD_DIRECTORY_LENGTH <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; fseek<span class="br0">&#40;</span> wad_fd, t_ofs, SEEK_SET <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">char</span> *directory_buffer= <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span>*<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; malloc<span class="br0">&#40;</span> <span class="kw4">sizeof</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="br0">&#41;</span> * WAD_DIRECTORY_LENGTH <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; fread<span class="br0">&#40;</span> directory_buffer, WAD_DIRECTORY_LENGTH, <span class="nu0">1</span>, wad_fd <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> filepos= parse_int<span class="br0">&#40;</span> directory_buffer <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> size= parse_int<span class="br0">&#40;</span> directory_buffer<span class="nu0">+4</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw4">char</span> *directory_ident= strdup<span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw4">char</span>*<span class="br0">&#41;</span> directory_buffer<span class="nu0">+8</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; directory_ident<span class="br0">&#91;</span> strlen<span class="br0">&#40;</span>directory_ident<span class="br0">&#41;</span> <span class="br0">&#93;</span>= <span class="st0">&#8216;<span class="es0">\0</span>&#8216;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;directory name &lt;%s&gt; at offset &lt;%lu&gt; with size &lt;%lu&gt;!<span class="es0">\n</span>&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;directory_ident, filepos, size <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; free<span class="br0">&#40;</span> directory_ident <span class="br0">&#41;</span>; free<span class="br0">&#40;</span> directory_buffer <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; t_ofs += WAD_DIRECTORY_LENGTH; lump_count++;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;directorys parsed &lt;%lu&gt; total lumps &lt;%lu&gt;!<span class="es0">\n</span>&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;lump_count, number_lumps <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fclose<span class="br0">&#40;</span> wad_fd <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So lets compile and test this code &lt;remember to change the path to your doom wad&gt;:</p>
<blockquote><p>gcc doom_wad_test.c</p>
<p>./a.out</p></blockquote>
<p>So right what does any of this code mean i just chucked it up there, i wrote it up very quickly from scratch. So as i stated earlier there is a wad header which is a 12 bytes in length which i refer to as &#8216;WAD_HEADER_LENGTH&#8217; which contains 3 * 4-byte integers. So from the code we have fopen&#8217;d the wad_file and i use fread to read in the 12 bytes in a 12 byte &#8216;unsigned char[]&#8216; buffer. So to read out the integers in a neutral endian way i found a nice parse_int function in some of the wad documentation i found and in old doom source code which was GPL so it was like&#8230;. yoink&#8230; but its pretty easy to understand if you know your representations well enough but i wont go into detail.</p>
<p>The first integer is the IWAD or PWAD string, IWAD is what you will find mostly its the deployment version of the wad, the PWAD is a patch wad and very few of them are still around and i think it has similar structure. Anyways, you parse out the first integer like this</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">char</span>* wad_ident= <span class="br0">&#40;</span><span class="kw4">char</span>*<span class="br0">&#41;</span> header_buffer;</div>
</li>
<li class="li1">
<div class="de1">wad_ident<span class="br0">&#91;</span> <span class="nu0">4</span> <span class="br0">&#93;</span>= <span class="st0">&#8216;<span class="es0">\0</span>&#8216;</span>;</div>
</li>
</ol>
</div>
<p>Remember to add null string &#8216;\0&#8242;, so we don&#8217;t get buffer overflow! This string is always a length of 4 so no need to mess about! And then the next integer is the number of lumps in the wad the lumps are the actual binary data like music and graphics. Third int is the &#8216;directory offset&#8217; which contains pointers to where the lumps are their idents and the size of the lumps which have lengths of 16 &#8216;WAD_DIRECTORY_LENGTH&#8217; until the end of the wad file! so note i find the length of the file and do:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span> t_ofs &lt;= <span class="br0">&#40;</span> wad_length -- WAD_DIRECTORY_LENGTH <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So how do we parse out these directories?  We move to the directory offset and then read the 16 bytes into a buffer, which is 4 integers this time. But still contains only 3 things means the ident strings can be longer or can be with some padding between each directory lump.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">unsigned</span> <span class="kw4">long</span> filepos= parse_int<span class="br0">&#40;</span> directory_buffer <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">unsigned</span> <span class="kw4">long</span> size= parse_int<span class="br0">&#40;</span> directory_buffer<span class="nu0">+4</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">char</span> *directory_ident= strdup<span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw4">char</span>*<span class="br0">&#41;</span> directory_buffer<span class="nu0">+8</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">directory_ident<span class="br0">&#91;</span> strlen<span class="br0">&#40;</span>directory_ident<span class="br0">&#41;</span> <span class="br0">&#93;</span>= <span class="st0">&#8216;<span class="es0">\0</span>&#8216;</span>;</div>
</li>
</ol>
</div>
<p>Now we know the file offset of the lump the size of the lump and the ident of the lump and we make sure to add the null terminator again to avoid buffer overflow. And then we can parse out the lumps simply just fseek and fread <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Done its so simple and seems like there would be more to it, yet when you think of it is very much common sense there really isn&#8217;t that many ways to pack data into a file like this! If your interested i&#8217;ll be talking about it soon&#8230; on how to convert the D_E1M* lumps which are music lumps to compatible midi tracks. And finally on how <a href="http://en.wikipedia.org/wiki/Binary_space_partitioning">BSP</a> works for the levels and maybe how to draw them in C/SDL/OpenGL&#8230; if you ask i prefer C over C++, yeah when it comes to building this game engine there have been times i though woo having an object would be really nice here but then i realise well no because that&#8217;s what the scripting engine is going to do&#8230; <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Mainly due to the fact i dont like C++ syntax it feels messy to me and C is just nice and simple <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Finally I just want to wrap up with saying <a href="http://en.wikipedia.org/wiki/John_D._Carmack">John Carmack</a> has to be one of my biggest Hero&#8217;s in Computer Science along with <a href="http://tirania.org/blog/">Migel De Icaza</a>, <a href="http://en.wikipedia.org/wiki/Linus_Torvalds">Linus Torvalds</a>, Various GCC hackers&#8230; like Ian Lance Taylor But John Carmack in particular since he made Doom! But also he attended the <a title="University of Missouri–Kansas City" href="http://en.wikipedia.org/wiki/University_of_Missouri%E2%80%93Kansas_City">University of Missouri–Kansas City</a> for two semesters before withdrawing to work as a freelance programmer. Which i think that is brilliant! Since University does not teach students to be serious programmers or technology well very few do anyway and i think its great he had the balls to do that and so did Migel De Icaza and they have both done some of the most amazing things in computer science!</p>
<p>Anyways if your interested in Crules or CrlDoom see: <a href="http://crules.org">http://crules.org</a> code for crldoom is over @ <a href="http://code.redbrain.co.uk/cgit.cgi/crldoom">http://code.redbrain.co.uk/cgit.cgi/crldoom</a></p>
<p>This is a project i love <a href="http://www.moddb.com/mods/classic-doom-3">Classic Doom 3</a> it was Doom re-implemented ontop of the Doom3 Engine what more do you want!!!</p>
<p><!-- Smart Youtube --><span class="youtube"><object width="425" height="373"><param name="movie" value="http://www.youtube.com/v/woBAUk5hMD8&amp;rel=1&amp;color1=3a3a3a&amp;color2=999999&amp;border=1&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/woBAUk5hMD8&amp;rel=1&amp;color1=3a3a3a&amp;color2=999999&amp;border=1&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="373" ></embed><param name="wmode" value="transparent" /></object></span></p>
]]></content:encoded>
			<wfw:commentRss>http://redbrain.co.uk/index.php/random/parsing-the-doom-wad-file/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Crules and Intermediate Representation</title>
		<link>http://redbrain.co.uk/index.php/quick-tips/crules-and-intermediate-representation/</link>
		<comments>http://redbrain.co.uk/index.php/quick-tips/crules-and-intermediate-representation/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 02:47:00 +0000</pubDate>
		<dc:creator>redbrain</dc:creator>
				<category><![CDATA[Compilers]]></category>
		<category><![CDATA[Crules]]></category>
		<category><![CDATA[Quick Tips]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Update!]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://redbrain.co.uk/?p=491</guid>
		<description><![CDATA[<p>If you follow my blog you may have noticed i have been quiet and thats because i&#8217;ve been working on http://crules.org Its the new homepage for my project Crules, its got some good content on it but nothing really on the language yet. Though today i spend a very long time on the HACKING article [...]]]></description>
			<content:encoded><![CDATA[<p>If you follow my blog you may have noticed i have been quiet and thats because i&#8217;ve been working on <a href="http://crules.org">http://crules.org</a> Its the new homepage for my project Crules, its got some good content on it but nothing really on the language yet. Though today i spend a very long time on the<a href="http://crules.org/doku.php?id=hacking"> HACKING</a> article And i explain a lot on how Intermediate Representation&#8217;s work and <a href="http://en.wikipedia.org/wiki/Three_address_code">3-address code</a>.</p>
<p>So lets just take an extract since i am lazy: So in compilers or interpreters how do we represent:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="br0">&#40;</span> x + y <span class="br0">&#41;</span> -- <span class="br0">&#40;</span> <span class="br0">&#40;</span> x + y <span class="br0">&#41;</span> * <span class="br0">&#40;</span> x -- y <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> + <span class="br0">&#40;</span> <span class="br0">&#40;</span> x + y <span class="br0">&#41;</span> * <span class="br0">&#40;</span> x -- y <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Lets see it in a diagram first then in IR code:</p>
<div class="wp-caption alignleft" style="width: 281px"><a href="http://farm3.static.flickr.com/2718/4153843445_7f33be00d2.jpg"><img title="Expression DAG" src="http://farm3.static.flickr.com/2718/4153843445_7f33be00d2.jpg" alt="Expression" width="271" height="202" /></a><p class="wp-caption-text">Expression</p></div>
<p>So what is this? Well early on when i was getting into compiler construction when doing semantic analysis you will need to find a way of representing these semantics for your language, and you will find generally that there are 3 things you need to know: <strong>DESTINATION OPERAND A and OPERAND B</strong>. This is what&#8217;s called <a title="http://en.wikipedia.org/wiki/Three_address_code" rel="nofollow" href="http://en.wikipedia.org/wiki/Three_address_code">3-address code</a>. This is what sets compilers apart and can make or break them! Its what gives implementations flexibility and the ability to &#8216;<strong>control the flow</strong>&#8216; of execution! Any good compiler book will give you more detailed discussion on this topic its my main interest in compilers since this is what gives an implementation its logic. So lets give it a syntax we can write down to illustrate how mine works: it just so happens a <a title="http://en.wikipedia.org /wiki/Lisp_%28programming_language%29" rel="nofollow" href="http://en.wikipedia.org%20/wiki/Lisp_%28programming_language%29">LISP</a> &#8216;ish syntax can show this very well!</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span> <span class="br0">&#40;</span> IDENTIFIER <span class="br0">&#40;</span> TYPE <span class="br0">&#41;</span> <span class="br0">&#41;</span> =&gt; <span class="br0">&#40;</span> OPERAND A <span class="br0">&#41;</span> =&gt; <span class="br0">&#40;</span> OPERAND B <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
</ol>
</div>
<p>Since the parser is precedence aware it will construct the tree as shown in a symbol language which looks like this if it was output ( outputting the IR like this is a future TODO ); It may look a little like <a title="http://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html" rel="nofollow" href="http://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html">GIMPLE</a> but this IR I have as I will demonstrate more examples can encompass much much more..  ( this is a 3-address code by the way )</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_ADD <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_SUBTRACT <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_ADD <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;x&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;y&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span> <span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_MULTIPLY <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_ADD <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;x&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;y&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_SUBTRACT <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;x&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;y&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_MULTIPLY <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_ADD <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;x&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;y&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> OP_SUBTRACT <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;x&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#40;</span> SYMBOL_ACCESS <span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> &#8216;y&#8217; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; <span class="br0">&#40;</span> <span class="kw1">NIL</span> <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#41;</span><span class="co1">; )</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
</ol>
</div>
<div class="wp-caption alignright" style="width: 280px"><a href="http://icanhascheezburger.files.wordpress.com/2009/11/funny-pictures-cat-will-unroll-all-toilet-paper.jpg"><img title="Busy catz" src="http://icanhascheezburger.files.wordpress.com/2009/11/funny-pictures-cat-will-unroll-all-toilet-paper.jpg" alt="busy!" width="270" height="201" /></a><p class="wp-caption-text">busy!</p></div>
<p>Though one big note its is ok for me to leave the representation like this since in my interpreter i just evaluate this at run time but how does this affect things like code-generators like proper Compilers? Well its quite simple in a sane compiler like GCC ( although most compilers will follow this idiom i am sure) introduce another layer for IR called RTL ( <a href="http://en.wikipedia.org/wiki/Register_transfer_language">Register Transfer Language</a> ). The wikipedia article lacks and most compiler books overlook this section very much since, most books are written by the academics and generally stay away from the <a href="http://en.wikipedia.org/wiki/Compiler#Back_end">back-end of compilers</a> since that is the actual hard part since a code-gen is very specific to the instruction set your targeting and register allocation algorithms are very difficult and is a huge research project.  Its said in computer science the most difficult things to build software wise is a good JIT or any Code-Generator for that matter.  Anyways back to the problem lets take a smaller expression for sleep&#8217;s sake the expression:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">unsigned</span> <span class="kw4">int</span> retval = <span class="br0">&#40;</span> x * <span class="nu0">2</span> <span class="br0">&#41;</span> / <span class="br0">&#40;</span> <span class="nu0">7</span> + y <span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Will generate something like:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">t1 = x * <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">t2 = <span class="nu0">7</span> + y;</div>
</li>
<li class="li1">
<div class="de1">t3 = t1 / t2;</div>
</li>
<li class="li2">
<div class="de2">retval = t3;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Anyways you&#8217;ll notice in my the IR keywords such as SYMBOL_ACCESS or SYMBOL_ITEM or OP_ADD etc, these are what&#8217;s called OP_Codes and are generally represented by some symbolic hex values since its cheap to check against for the implementation to figure out what to do with symbol &#8216;x&#8217;; So ok thats a quick and dirty intro to Intermediate Representation&#8217;s!</p>
<p>I think this lolcat will sum up your feelings at the end of reading this blog post:</p>
<p>And i started getting out my old grunge cd&#8217;s which include my <a href="http://www.last.fm/music/Silverchair">Silverchair</a> collection and this is on of my favourite bands of all time and this is a pretty good song!</p>
<p><!-- Smart Youtube --><span class="youtube"><object width="425" height="373"><param name="movie" value="http://www.youtube.com/v/fTM5cDIESrY&amp;rel=1&amp;color1=3a3a3a&amp;color2=999999&amp;border=1&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/fTM5cDIESrY&amp;rel=1&amp;color1=3a3a3a&amp;color2=999999&amp;border=1&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="373" ></embed><param name="wmode" value="transparent" /></object></span></p>
]]></content:encoded>
			<wfw:commentRss>http://redbrain.co.uk/index.php/quick-tips/crules-and-intermediate-representation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Update &#8211; Interpreter CRULES &amp; Jamedo</title>
		<link>http://redbrain.co.uk/index.php/update/update-interpreter-crules-jamedo/</link>
		<comments>http://redbrain.co.uk/index.php/update/update-interpreter-crules-jamedo/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 23:51:42 +0000</pubDate>
		<dc:creator>redbrain</dc:creator>
				<category><![CDATA[Crules]]></category>
		<category><![CDATA[Update!]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[BLUG]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://redbrain.co.uk/?p=400</guid>
		<description><![CDATA[<p></p>
<p style="margin-bottom: 0cm;" align="justify">So hey, its been a little longer than i intended to update my blog! But i&#8217;ve been busy, so i have got rid of my personal work being on repositories all over the show. So I have made:</p>

http://code.redbrain.co.uk

<p style="margin-bottom: 0cm;" align="justify">There will be public git access soon, but you can download the [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } --></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So hey, its been a little longer than i intended to update my blog! But i&#8217;ve been busy, so i have got rid of my personal work being on repositories all over the show. So I have made:</span></p>
<ul>
<li><span style="font-family: Arial,sans-serif;"><a href="http://code.redbrain.co.uk/">http://code.redbrain.co.uk</a></span></li>
</ul>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">There will be public git access soon, but you can download the snapshot tarballs of the branches. And I have a wiki too there isn&#8217;t anything on there yet but it will give me room to stop putting long tutorial article&#8217;s as pages on my blog to proper wiki article&#8217;s:</span></p>
<ul>
<li><span style="font-family: Arial,sans-serif;"><a href="http://wiki.redbrain.co.uk/">http://wiki.redbrain.co.uk</a></span></li>
</ul>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } --></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So Compilers, Interpreters and programming languages are my interests&#8230; *yawn! So let me show you my interpreter pipeline for my interpreted language &#8216;CRULES&#8217;: </span></p>
<div id="attachment_401" class="wp-caption alignleft" style="width: 310px"><a rel="attachment wp-att-401" href="http://redbrain.co.uk/?attachment_id=401"><img class="size-medium wp-image-401" title="Crules-arch-diagram" src="http://redbrain.co.uk/wp-content/uploads/2009/07/Crules-arch-diagram-300x253.png" alt="Crules" width="300" height="253" /></a><p class="wp-caption-text">Crules</p></div>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So I have to admit that&#8217;s the most impressive art I ever done (I know I&#8217;m lame <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ). Its my pipeline for my programming language, but I guess a lot of programming languages would follow this kind of model/architecture. So it got me thinking this is nearly the basics for any semi-serious interpreter or &#8216;a&#8217; language so lets talk though it. </span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">I am still not going to talk about the details of my language because its not ready yet. Other than I am doing fun things like, so far the only data-structure I let the developer have is lists, so if you do something like:</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<blockquote>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">% foo := { 2,3,4,5,6,67,7}</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">#is a list and strings are lists!</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">% str := “bla”</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">#is the same as</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">% str := { &#8216;b&#8217;, &#8216;l&#8217;, &#8216;a&#8217; }</span></p>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">It works a lot around the shell so you can also do:</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">% foo := `ls`</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">#it produces a delimited list of strings with the delimited as carriage return or new line etc.</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p></blockquote>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">Though note I am going to implement an api for arrays. But not yet, because lists are going to cause problems unless I implemented a table/array of accessors to the elements in the list so you can do fast access to the elements because it doesn&#8217;t scale no matter what anyone says when say you are doing image processing on a 1024&#215;1024 list&#8230; accessing the elements isn&#8217;t going to scale.</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">Anyway so lets get back to looking into the pipeline of it: So first a user creates a program lets look at the helloworld.crl:</span></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<blockquote>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">rule main()</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">{</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"> echo “Hello World!”</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"> foo := 5 + 2 &#8211; 7</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">}</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">all := main;</span></p>
</blockquote>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So first my interpreter will start lexing this using LEX, into tokens like: rule, main &#8216;(&#8216; &#8216;)&#8217;&#8230;. and then the parser starts applying the grammar implemented using YACC. So I start producing symbols to build a symbol table the data-structure looks like this its basicly a more high-level 3 address code:</span></p>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify">
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> symtab <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">const</span> <span class="kw4">char</span> *identifier;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; uint8_t symType;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; uint8_t op_a_t;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; uint8_t op_b_t;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">union</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; _SYM_LIST_ *list;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">float</span> flt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; int32_t integer;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">char</span> ch;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//sym link to function call</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">struct</span> symtab *syms;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> op_a;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">union</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; _SYM_LIST_ *list;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">float</span> flt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; int32_t integer;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//params to a func_call</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">struct</span> symstack *syms;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">struct</span> symtab *sy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> op_b;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">struct</span> symtab *next;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> __attribute__<span class="br0">&#40;</span><span class="br0">&#40;</span>aligned<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify">
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So first it creates the rule definition! For now just think as rules as entry points to a program so you can add more identifiers to that &#8216;all&#8217; list not just main. It has a deeper meaning but I don&#8217;t want to talk or show this until I have the interpreter and language definitions more concrete!</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So the the rule &#8216;main&#8217; creates a new symbol like this:</span></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<blockquote>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">//the symbol takes the identifer of the rule identifier</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">symbol-&gt;identifer = &#8216;main&#8217;</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">//its a rule symbol</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">symbol-&gt;symType= _SYM _RULE _</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">symbol union_a is the link to the first symbol in that block of statements and union_b is NULL because I don&#8217;t need it until I have rule dependencies it needs to list.</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">symbol-&gt;next= NULL, because it is just a definition</span></p>
</blockquote>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">Then each expression like &#8216; echo “Hello World” &#8216;, creates a symbol and its next = the next expression like the &#8216; foo := 5 + 2 – 7 &#8216;. This creates an interesting one, because this can&#8217;t be reduced to a 3-address code until you split it up, for now I just assume the developer wants it to run as 5+2=7 then 7-7=0; But I am going to add precedence later. So you can be more expressive to have nested expressions in brackets to be executed first etc..</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">But yeah this expression is split up into 3 symbols for now, its an over all variable Assignment but it depends an expression of 5+2 as a temporary symbol then this temporary symbol – 7 then foo = this new temporary symbol and I can push these dead symbols to the garbage collector. </span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">When a symbol is allocated, it is allocated memory of a preallocated memory heap of default 32MB, it can be extended or shortened if needs be, but it allows me to control and see how much memory is being occupied at anyone time in the runtime of the interpreter. Any symbols to be kept such as rule definitions, function definitions or variables are kept on one massive stack. So ok, that&#8217;s a problem if you need to search for them, the answer I found was having 3 other tables that link to the symbols in the stack. When any link is broke it becomes garbage, so when I have a new variable re-assignment I can break that link and remove the entry in the variable table it still exists in the symbol stack but the <a href="http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)">Garbage collector</a> is always called on EXIT and the exit of any block statements like loops functions etc, so when you pop your way out of the stack you can have local variables instead of everything global and you have conflicts which will cause a lot of problems. Also the garbage collector is implemented as a <a href="http://en.wikipedia.org/wiki/POSIX_Threads">pthread</a> so you have have to pause for several seconds waiting for it to free the garbage. I haven&#8217;t done this yet because its going to be very awkward to keep the concurrency, the pthread mutex api should handle a lot for me but its still going to be complicated. I have thought I might like to try implementing a lot of different internal using OPEN/MP to make it even speedier, but that won&#8217;t be for a while.</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">And then I have been playing with<a href="http://llvm.org/"> LLVM</a> to create a <a href="http://llvm.org/docs/tutorial/index.html">JIT execution system</a>, you can see my posts on &#8216;Managing the JIT&#8217; on comp.compilers, I have posted there quite a few times before, its a great list of basically all programming language, compiler and interpreter experts in the world!</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So I have a variable table that links to the variables in the symbol stack and the same for the rules and functions. This speed up searching for specific identifiers.</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So that&#8217;s the basics of parsing into symbols I guess, it pains me to say but many people thing a programming language is mainly a parser is so wrong the parser just lets you build your symbols the execution and management of these symbols is much, much more complicated. That&#8217;s not to say implementing a simple programming language is difficult, the problem I see a lot is people are scared of doing it because the vocabulary is huge! I mean if you start working at an interpreter from first principle&#8217;s I&#8217;ll guarantee if you have half a brain you&#8217;ll come to a similar architecture as this. </span></p>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">I found it difficult at the start when I knew anything in a programming language can always be brought to 3 things and I got really confused when people talked about symbol tables, 3 address code, IR (intermediate representation) and parse trees or syntax tree&#8217;s. I think a lot of developers have their own prefered meanings to them, but it is mainly a barrier of academics trying to make the subject more complicated than needs be, although when you go at this from first principle&#8217;s you&#8217;ll will soon learn <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</span></p>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">So thats the main focus of my personal work but I am now also soon to be an approved <a href="http://gcc.gnu.org/">GNU/gcc</a> and <a href="http://www.gnu.org/software/automake/">GNU/automake</a> developer! Can&#8217;t wait, got my FSF paper work signed and sent back it may arrive in Boston soon I guess but yeah I am excited. I am updating the automake documentation to show the best way to handle multiple <a href="http://en.wikipedia.org/wiki/Lex_programming_tool">LEX</a> and <a href="http://en.wikipedia.org/wiki/Yacc">YACC</a> in one program. Its something only one of two people do but its a problem none the less and to make it portable is the actual problem. But I have the solutions to it now <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify">
<div class="wp-caption alignright" style="width: 262px"><a href="http://icanhascheezburger.files.wordpress.com/2009/07/funny-pictures-cat-has-pushed-in-face.jpg"><img title="Got your attention" src="http://icanhascheezburger.files.wordpress.com/2009/07/funny-pictures-cat-has-pushed-in-face.jpg" alt="Got your attention" width="252" height="188" /></a><p class="wp-caption-text">Got your attention</p></div>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">Thing is I would really love it if I had an AIX/FreeBSD/Solaris machine to do more testing on because now that I am doing work on GCC it would be so helpful to have more machines to do testing. But i&#8217;m ok for now, so far in GCC I am doing regression testing to find a regression I can tackle, its extremely difficult some are defunct on the <a href="http://gcc.gnu.org/bugzilla/">bugzilla</a> some are ancient and not perused. And the rest is very active but for MIPS or SPARC, and I don&#8217;t have a <a href="http://www.scratchbox.org/">scratchbox</a> setup to even test that yet. Would just be great to get my hands on even an old ibook for a power-pc cpu or an old IBM p-server. If anyone knows of any available I would be really grateful!<br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<p style="margin-bottom: 0cm;" align="justify">
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;">Ok this has become a very long post so I&#8217;ll shut up! <img src='http://redbrain.co.uk/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> . See you guys from <a href="http://www.belfastlinux.org/wiki/Main_Page">Beflast LUG</a> on Wednesday!</span><span style="font-family: Arial,sans-serif;"> One last thing i want to link you to 5 of my favourite bands and they are all off <a href="http://www.jamendo.com/en/">Jamendo</a>:</span></p>
<p style="margin-bottom: 0cm;" align="justify"><span style="font-family: Arial,sans-serif;"><br />
</span></p>
<ul>
<li><a href="http://www.jamendo.com/en/album/26656">http://www.jamendo.com/en/album/26656</a></li>
<li><a href="http://www.jamendo.com/en/album/34523">http://www.jamendo.com/en/album/34523</a></li>
<li><a href="http://www.jamendo.com/en/album/42122">http://www.jamendo.com/en/album/42122</a></li>
<li><a href="http://www.jamendo.com/en/album/34714">http://www.jamendo.com/en/album/34714</a></li>
<li><a href="http://www.jamendo.com/en/album/3661">http://www.jamendo.com/en/album/3661</a></li>
</ul>
<pre><span><span> </span></span></pre>
]]></content:encoded>
			<wfw:commentRss>http://redbrain.co.uk/index.php/update/update-interpreter-crules-jamedo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

