<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>log file for game</title>
		<link>http://www.allegro.cc/forums/view/611548</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 08 Dec 2012 01:05:23 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Need some advice on how to deal with the log file in my game.</p><p>The way I do things at the moment is :</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifdef USE_LOG_FILE</span>
   logfile <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"some message about something.\n"</span><span class="k2">;</span>
<span class="p">#endif</span>
</pre></div></div><p>

So the code only runs if there&#39;s a define for USE_LOG_FILE in a header somewhere.</p><p>What I&#39;m thinking of doing instead is :-</p><div class="source-code snippet"><div class="inner"><pre>
<span class="k1">if</span><span class="k2">(</span>use_log<span class="k2">)</span>
<span class="k2">{</span>
   logfile <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"........\n"</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>


Where the use_log is a variable set in the config file for the game.</p><p>This way means that the code is always run, even if it&#39;s just checking the if condition.</p><p>Is this way an acceptable way to do things ?</p><p>I prefer it because it means the log file doesn&#39;t have to get created.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Mon, 03 Dec 2012 18:08:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/611548/971405#target">William Labbett</a> said:</div><div class="quote"><p> Is this way an acceptable way to do things ?</p></div></div><p>Certainly.  The checks aren&#39;t going to affect the game performance, and it means the logs can easily be enabled after the application has already been deployed, which is not possible when using the preprocessor method.</p><p>The only downside is that if the logs are never needed, the executable will be bigger than necessary.  But the additional size is most likely insignificant, so this is a mostly moot point.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p> I prefer it because it means the log file doesn&#39;t have to get created.</p></div></div><p>That applies to both methods.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Mon, 03 Dec 2012 18:13:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
 Thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Mon, 03 Dec 2012 19:10:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/611548/971405#target">William Labbett</a> said:</div><div class="quote"><p>#ifdef USE_LOG_FILE<br />   logfile &lt;&lt; &quot;some message about something.\n&quot;;<br />#endif</p></div></div><p>
This is usually done like:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifdef USE_LOG_FILE</span>
<span class="p">#define LOG(blah) logfile&lt;&lt;(blah)</span>
<span class="p">#else</span>
<span class="p">#define LOG(blah)</span>
<span class="p">#endif</span>
...
LOG<span class="k2">(</span><span class="s">".....\n"</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>if(use_log)<br />{<br />   logfile &lt;&lt; &quot;........\n&quot;;<br />}</p></div></div><p>
Also nice. You could similarly stick that into an inlined function and have an easier time typing it; You can even use varargs to make it behave more like you&#39;d expect a logging function to behave.</p><p>Though maybe I&#39;m saying obvious things.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Slartibartfast)</author>
		<pubDate>Mon, 03 Dec 2012 19:19:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>And an example in plain C:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">/*</span>
<span class="number">  2</span><span class="c">Log file example with allegro config file use.</span>
<span class="number">  3</span><span class="c">Compile with gcc on Linux:</span>
<span class="number">  4</span><span class="c"></span>
<span class="number">  5</span><span class="c">gcc forum_2.c -I /usr/local/include -L /usr/local/lib -lallegro_color -lallegro_font -lallegro_ttf -lallegro -o forum2</span>
<span class="number">  6</span><span class="c"></span>
<span class="number">  7</span><span class="c">Make an app.ini file in the executable file's directory that contains </span>
<span class="number">  8</span><span class="c">log=app.log and the log will be written to app.log. If the config value is </span>
<span class="number">  9</span><span class="c">empty, no logging takes place.</span>
<span class="number"> 10</span><span class="c">*/</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number"> 13</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number"> 14</span><span class="p">#include &lt;stdarg.h&gt;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>
<span class="number"> 17</span><span class="p">#define APP_CONFIG_NAME "app.ini"</span>
<span class="number"> 18</span>
<span class="number"> 19</span>FILE <span class="k3">*</span> log_open<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 20</span>  FILE <span class="k3">*</span> result<span class="k2">;</span>
<span class="number"> 21</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_CONFIG"><span class="a">ALLEGRO_CONFIG</span></a> <span class="k3">*</span> config<span class="k2">;</span>
<span class="number"> 22</span>  <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span> logname<span class="k2">;</span>
<span class="number"> 23</span>  config  <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_config_file"><span class="a">al_load_config_file</span></a><span class="k2">(</span>APP_CONFIG_NAME<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>config<span class="k2">)</span> <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 25</span>  logname <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_config_value"><span class="a">al_get_config_value</span></a><span class="k2">(</span>config, NULL, <span class="s">"log"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>  <span class="k1">if</span> <span class="k2">(</span>logname<span class="k2">)</span> <span class="k2">{</span> 
<span class="number"> 27</span>    result <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span>logname, <span class="s">"at"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>  <span class="k2">}</span>
<span class="number"> 29</span>  <a href="http://www.allegro.cc/manual/al_destroy_config"><span class="a">al_destroy_config</span></a><span class="k2">(</span>config<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>  <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 31</span><span class="k2">}</span>
<span class="number"> 32</span>
<span class="number"> 33</span><span class="k1">void</span> log_close<span class="k2">(</span>FILE <span class="k3">*</span> logfile<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 34</span>  <span class="k1">if</span><span class="k2">(</span>logfile<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>logfile<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span><span class="k2">}</span>
<span class="number"> 36</span>
<span class="number"> 37</span><span class="k1">void</span> log_log<span class="k2">(</span>FILE <span class="k3">*</span> logfile, <span class="k1">char</span> <span class="k3">*</span> format, ...<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 38</span>  va_list ap<span class="k2">;</span>
<span class="number"> 39</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>logfile<span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 40</span>  va_start<span class="k2">(</span>ap, format<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_851.html" target="_blank">vfprintf</a><span class="k2">(</span>logfile, format, ap<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>  va_end<span class="k2">(</span>ap<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_315.html" target="_blank">fflush</a><span class="k2">(</span>logfile<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span><span class="k2">}</span>
<span class="number"> 45</span>
<span class="number"> 46</span>
<span class="number"> 47</span><span class="k1">int</span> main <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 48</span>  FILE <span class="k3">*</span> logfile  <span class="k3">=</span> log_open<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>  log_log<span class="k2">(</span>logfile, <span class="s">"This will be logged, but only if app.ini specifies it.\n"</span><span class="k2">)</span><span class="k2">;</span> log_log<span class="k2">(</span>logfile, <span class="s">"And with arguments: %d, %f\n"</span>, <span class="n">11</span>, <span class="n">20</span>.<span class="n">13</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>  log_close<span class="k2">(</span>logfile<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 51</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 52</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Tue, 04 Dec 2012 01:17:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/611548/971440#target">beoran</a> said:</div><div class="quote"><p> And an example in plain C:</p></div></div><p>That looks almost identical to mine, except that I add a timestamp to each line as it is written to the log.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Tue, 04 Dec 2012 08:08:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, LennyLen, and with some changes and a macro or two you can get <u>_LINE</u>_ and <u>_FILE</u>_ in there as well. Just flex it to your own needs. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Wed, 05 Dec 2012 02:33:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Also very useful, but not vital since you can gleam it from <span class="source-code">__FILE__</span> and <span class="source-code">__LINE__</span>, is <span class="source-code">__func__</span>. However, <span class="source-code">__func__</span> is C99 and MSVC calls it <span class="source-code">__FUNCTION__</span>. Luckily, Allegro 5 is awesome and will automatically define <span class="source-code">__func__</span> as <span class="source-code">__FUNCTION__</span> for MSVC and will simply define it to &quot;???&quot; where not supported. I&#39;d recommend log lines like:</p><p><span class="source-code">__FILE__:__LINE__:__func__: Super important message</span></p><p>I.e.</p><p><span class="source-code">kernel.c:1924:farbiktubennagen: Holy shit look a dog<span class="k3">!</span><span class="k3">!</span><span class="k3">!</span><span class="k3">!</span><span class="k3">!</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Luiji99)</author>
		<pubDate>Fri, 07 Dec 2012 11:40:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I like these threads. Pinned !
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 07 Dec 2012 14:40:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/611548/971741#target">Luiji99</a> said:</div><div class="quote"><p>Also very useful, but not vital since you can gleam it from <u>_FILE</u>_ and <u>_LINE</u>_, is <u>_func</u>_. However, <u>_func</u>_ is C99 and MSVC calls it __FUNCTION__.</p></div></div><p>GCC also has <span class="source-code">__FUNCTION__</span> it also has <span class="source-code">__PRETTY_FUNCTION__</span> which helps out with C++ somewhat.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 07 Dec 2012 17:04:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>

Thanks for the help guys.</p><p>I like</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span><span class="k2">(</span>use_log<span class="k2">)</span>
<span class="k2">{</span>
   logfile <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Initialising tertiary subsystem 3.\n"</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

It&#39;s super simple.</p><p>If I have to use conditional includes then there&#39;s two versions of the program, one which can do logs and another that can&#39;t. I&#39;d rather have one program that can do both depending on config file.</p><p>I think I&#39;ll do</p><p>LOG(x) (if(use_log) logfile &lt;&lt; x &lt;&lt; &quot;\n&quot;;)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Fri, 07 Dec 2012 20:47:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That type of <span class="source-code"><span class="p">#define</span></span> is good, too. In fact, I&#39;d definitely recommend that over two executables considering you want it to be enabled/disabled by the user. You could still use <span class="source-code"><span class="p">#define LOG(x) (use_log ? logfile &lt;&lt; __FILE__ &lt;&lt; ":" __LINE__ ":" &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; ": " &lt;&lt; (x) : (void) 0)</span></span></p><p>I&#39;m pretty sure that putting an <span class="source-code"><span class="k1">if</span></span> statement in parenthesis is invalid. You will have to use the tertiary operator like <span class="source-code">boolean_value ? true_execution <span class="k2">:</span> <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="n">0</span></span>, as most implementations of <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a></span> do.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Luiji99)</author>
		<pubDate>Fri, 07 Dec 2012 21:03:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The general issue of &quot;; in macro?&quot; is solved by a construct, seemingly ugly but fully working:<br /><span class="source-code"><span class="p">#define MYMACRO do { your stuff } while (0)</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Fri, 07 Dec 2012 21:11:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;d imagine that the <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a></span> method would be more efficient, only because I haven&#39;t yet found an implementation of <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a></span> that uses the <span class="source-code"><span class="k1">do</span> <span class="k2">{</span><span class="k2">}</span> <span class="k1">while</span><span class="k2">(</span><span class="n">0</span><span class="k2">)</span></span> kludge.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Luiji99)</author>
		<pubDate>Fri, 07 Dec 2012 22:34:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">class</span> Logger
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">bool</span> enabled_<span class="k2">;</span>
<span class="number">  4</span>    std::ofstream log_<span class="k2">;</span>
<span class="number">  5</span>public:
<span class="number">  6</span>    Logger<span class="k2">(</span><span class="k2">)</span><span class="k2">:</span>
<span class="number">  7</span>        enabled_<span class="k2">(</span><span class="k1">false</span><span class="k2">)</span>
<span class="number">  8</span>    <span class="k2">{</span>
<span class="number">  9</span>    <span class="k2">}</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    Logger<span class="k2">(</span><span class="k1">const</span> std::string <span class="k3">&amp;</span> file, <span class="k1">bool</span> enabled <span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span><span class="k2">:</span>
<span class="number"> 12</span>        enabled_<span class="k2">(</span>enabled<span class="k2">)</span>
<span class="number"> 13</span>        log_<span class="k2">(</span>file, ios::base::app<span class="k2">)</span>
<span class="number"> 14</span>    <span class="k2">{</span>
<span class="number"> 15</span>    <span class="k2">}</span>
<span class="number"> 16</span>
<span class="number"> 17</span>    <span class="c">// ... etc ...</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    <span class="k1">const</span> Logger <span class="k3">&amp;</span> <span class="k1">operator</span><span class="k3">&lt;</span><span class="k3">&lt;</span><span class="k2">(</span><span class="k1">const</span> std::string <span class="k3">&amp;</span> arg<span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 20</span>    <span class="k2">{</span>
<span class="number"> 21</span>        <span class="k1">if</span><span class="k2">(</span>this-&gt;enabled_<span class="k2">)</span>
<span class="number"> 22</span>        <span class="k2">{</span>
<span class="number"> 23</span>            this-&gt;log_ <span class="c">/* etc ... */</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> arg <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 24</span>        <span class="k2">}</span>
<span class="number"> 25</span>
<span class="number"> 26</span>        <span class="k1">return</span> <span class="k3">*</span><span class="k1">this</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>

(Untested, but you get the idea...)</p><div class="source-code snippet"><div class="inner"><pre>Logger null<span class="k2">;</span>
Logger disabled<span class="k2">(</span><span class="s">"my.log"</span>, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
Logger <a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a><span class="k2">(</span><span class="s">"my.log"</span><span class="k2">)</span><span class="k2">;</span>

null <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"This isn't logged anywhere."</span><span class="k2">;</span>
disabled <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"This either."</span><span class="k2">;</span>
<a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"This is."</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Sat, 08 Dec 2012 00:29:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I second bamccaig, although I abstract my log even further to point to any ostream and then OutputLog() retrieves a reference.</p><div class="source-code snippet"><div class="inner"><pre>   OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Write this to the log ...."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span>
</pre></div></div><p>

It doesn&#39;t allow for disabling the log but I usually only use the log for diagnostic purposes.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 08 Dec 2012 01:05:23 +0000</pubDate>
	</item>
</rss>
