<?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>NIX/WIN/WEB &#187; c++</title>
	<atom:link href="http://www.formboss.net/blog/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.formboss.net/blog</link>
	<description>Modern Web Application Development</description>
	<lastBuildDate>Thu, 02 Feb 2012 18:43:36 +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>GCC Vs. LLVM &#8211; Simple Test Code Optimizations</title>
		<link>http://www.formboss.net/blog/2011/09/gcc-vs-llvm-simple-low-level-optimizations/</link>
		<comments>http://www.formboss.net/blog/2011/09/gcc-vs-llvm-simple-low-level-optimizations/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 05:04:13 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Clang]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[LLVM]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=1412</guid>
		<description><![CDATA[As a companion piece to this test suite on Phoronix I took the following *very simple* code and ran it though GCC 4.6 (Fedora 15) and the Clang/LLVM 2.8 Suite to check performance and various optimizations being performed: This code is purpose built to thwart basic compiler optimizations. In particular the printf() call at the [...]]]></description>
			<content:encoded><![CDATA[<p>As a companion piece to this test suite on <a href="http://www.phoronix.com/scan.php?page=article&amp;item=gcc_46_llvm29&amp;num=1">Phoronix</a> I took the following *very simple* code and ran it though GCC 4.6 (Fedora 15) and the Clang/LLVM 2.8 Suite to check performance and various optimizations being performed:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int test_noRef(int value)
{
	return value + 1;
}

int test_ref(int &amp;value){
	return value += 1;
}

int main(int argc, char *argv[]){

	int t = 1;

	for(int i = 0; i &lt; 100000000; i++){
		//t = test_noRef(t);
		test_ref(t);
	}

	// final result = n loops + 1
	printf(&quot;%d\n&quot;, t);

}
</pre>
<p><span id="more-1412"></span></p>
<p>This code is purpose built to thwart basic compiler optimizations. In particular the printf() call at the end prevents the compilers from simply skipping the entire function call block.</p>
<p>While simplistic, the basic idea is to see what optimizations each compiler performs and at what optimization level. Note that the LLVM/Clang suite can easily be installed on Fedora 15 by searching for LLVM. You&#8217;ll want to install LLVM <em>and </em>Clang:</p>
<p><a href="http://www.formboss.net/blog/2011/09/gcc-vs-llvm-simple-low-level-optimizations/llvm-clang-install/" rel="attachment wp-att-1414"><img class="alignnone size-full wp-image-1414" title="llvm-clang-install" src="http://www.formboss.net/blog/wp-content/uploads/2011/09/llvm-clang-install.png" alt="" width="675" height="558" /></a></p>
<h2>No Optimizations</h2>
<p>We start with a basic compile with no optimizations; in each case we&#8217;ll focus on test_ref() and test_noRef(). Please note I&#8217;ve removed the stack management code from these listings as they differ very little by compiler.</p>
<pre class="brush: plain; title: ; notranslate">
g++ main.cpp -S
clang main.cpp -S
</pre>
<p>[GCC]</p>
<pre class="brush: plain; title: ; notranslate">
_Z10test_noRefi:
.LFB0:
	movl	%edi, -4(%rbp)
	movl	-4(%rbp), %eax
	addl	$1, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
</pre>
<p>The noRef call in GCC moves our parameter to eax, adds 1, and cleans up the stack.</p>
<p>[LLVM]</p>
<pre class="brush: plain; title: ; notranslate">
_Z10test_noRefi:
.Leh_func_begin0:
	pushq	%rbp
.Ltmp0:
	movq	%rsp, %rbp
.Ltmp1:
	movl	%edi, -4(%rbp)
	movl	-4(%rbp), %edi
	addl	$1, %edi
	movl	%edi, %eax
	popq	%rbp
	ret
</pre>
<p>The LLMV code for the noRef() function is quite similar. The main difference is LLVM uses edi for the addition step, then pushes the result to eax before returning.</p>
<p>[GCC]</p>
<pre class="brush: plain; title: ; notranslate">
_Z8test_refRi:
.LFB1:
	movq	%rdi, -8(%rbp)
	movq	-8(%rbp), %rax
	movl	(%rax), %eax
	leal	1(%rax), %edx
	movq	-8(%rbp), %rax
	movl	%edx, (%rax)
	movq	-8(%rbp), %rax
	movl	(%rax), %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
</pre>
<p>The reference using version performs the same basic logic, but instead of using movl we issue movq, which means our parameters are twice as large. That inefficiency aside we do use an optimization for adding the 1 to our input argument via the leal instruction.</p>
<p>[LLVM]</p>
<pre class="brush: plain; title: ; notranslate">
_Z8test_refRi:
.Leh_func_begin1:
	pushq	%rbp
.Ltmp3:
	movq	%rsp, %rbp
.Ltmp4:
	movq	%rdi, -8(%rbp)
	movq	-8(%rbp), %rdi
	movl	(%rdi), %eax
	addl	$1, %eax
	movl	%eax, (%rdi)
	popq	%rbp
	ret
</pre>
<p>LLVM&#8217;s code is a bit cleaner, focusing on pulling the value from the stack, performing the addl, and retuning the result.</p>
<p>[GCC]</p>
<pre class="brush: plain; title: ; notranslate">
main:
.L5:
	leaq	-8(%rbp), %rax
	movq	%rax, %rdi
	call	_Z8test_refRi
	addl	$1, -4(%rbp)
.L4:
	cmpl	$99999999, -4(%rbp)
	setle	%al
	testb	%al, %al
	jne	.L5
	movl	-8(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	movl	$0, %eax
	leave
</pre>
<p>As with the function calls I&#8217;ve removed the activation record code. LLVM&#8217;s main function definition is essentially the same, so we won&#8217;t cover it here.</p>
<p>A quick benchmark between the two shows what we would expect from the extra fluff in GCC&#8217;s implementation:</p>
<p><strong>GCC</strong><br />
real 0m0.407s<br />
user 0m0.405s<br />
sys 0m0.002s</p>
<p><strong>LLVM</strong><br />
real 0m0.396s<br />
user 0m0.394s<br />
sys 0m0.000s</p>
<h2>Level 1 Optimizations</h2>
<p>It&#8217;s a bit unfair to draw comparisons without some optimizations turned on, so let&#8217;s do so now:</p>
<pre class="brush: plain; title: ; notranslate">
g++ main.cpp -O1 -S
clang main.cpp -O1 -S
</pre>
<p>[GCC]</p>
<pre class="brush: plain; title: ; notranslate">
_Z10test_noRefi:
.LFB19:
	leal	1(%rdi), %eax
	ret
</pre>
<p>Already we can see a huge difference in GCC&#8217;s output, which whittles this call down to a simple Load Effective Address and return.</p>
<p>[LLVM]</p>
<pre class="brush: plain; title: ; notranslate">
_Z10test_noRefi:
	leal	1(%rdi), %eax
	popq	%rbp
	ret
</pre>
<p>As expected LLVM performs the same lea optimization as GCC.</p>
<p>[GCC]</p>
<pre class="brush: plain; title: ; notranslate">
_Z8test_refRi:
.LFB20:
	movl	(%rdi), %eax
	addl	$1, %eax
	movl	%eax, (%rdi)
	ret
</pre>
<p>The reference-using version still has to contend with the indirection call via movl ($rdi), %eax, but still a good improvement.</p>
<p>[LLVM]</p>
<pre class="brush: plain; title: ; notranslate">
.Ltmp4:
	movl	(%rdi), %eax
	incl	%eax
	movl	%eax, (%rdi)
	popq	%rbp
	ret
</pre>
<p>LLVM is using incl to perform our addition call, GCC uses addl. A quick check on Google shows Intel <a href="http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2009-January/000547.html">recommends the GCC way</a>.</p>
<p>[GCC]</p>
<pre class="brush: plain; title: ; notranslate">
	movl	$1, 12(%rsp)
	movl	$100000000, %ebx
.L4:
	leaq	12(%rsp), %rdi
	call	_Z8test_refRi
	subl	$1, %ebx
	jne	.L4
</pre>
<p>The main() function has been reduced to the basics, counting down from our loop initialization value and calling the test_ref() function.</p>
<p>[LLVM]</p>
<pre class="brush: plain; title: ; notranslate">
.Ltmp8:
	movl	$1, -20(%rbp)
	movl	$100000000, %ebx
	leaq	-20(%rbp), %r14
	.align	16, 0x90
.LBB2_1:
	movq	%r14, %rdi
	callq	_Z8test_refRi
	decl	%ebx
	jne	.LBB2_1
</pre>
<p>LLVM&#8217;s main function loop has also been optimized, though again we&#8217;re using decl instead of subl.</p>
<p>Although the two compilers perform similar optimizations here, lets examine how LLVM&#8217;s structured our reference value for the loop.</p>
<p>Right before the main loop it calls:</p>
<pre class="brush: plain; title: ; notranslate">leaq    -20(%rbp), %r14</pre>
<p>Which maps the address at that base-pointer location to r14. In essence its created an alias. Why it&#8217;s done this make sense when we see the rest of the loop.</p>
<p>The first call of every iteration is:</p>
<pre class="brush: plain; title: ; notranslate">movq	%r14, %rdi</pre>
<p>So we pass the address in %r14 to rdi and in the function call we have:</p>
<pre class="brush: plain; title: ; notranslate">movl    (%rdi), %eax</pre>
<p>Which essentially means dereference the value in rdi and push to eax for the incl call. That gets us our added value but it&#8217;s the next call where the magic happens, where we tie the whole thing together:</p>
<pre class="brush: plain; title: ; notranslate">movl    %eax, (%rdi)</pre>
<p>Now we&#8217;ve moved the value of eax to the <em>address location</em> in rdi. Since that address and the one in %r14 are one in the same, the next call in the main loop to:</p>
<pre class="brush: plain; title: ; notranslate">movq    %r14, %rdi</pre>
<p>Means that his freshly increased value from the function call being pointed to by %r14 is once again pushed to rdi, which in turn is dereferenced in the function call and incremented.</p>
<p>That&#8217;s a pretty neat bit of optimization so let&#8217;s see how it pans out in terms of performance:</p>
<p><strong>GCC</strong><br />
real 0m0.165s<br />
user 0m0.163s<br />
sys 0m0.001s</p>
<p><strong>LLVM</strong><br />
real 0m0.163s<br />
user 0m0.161s<br />
sys 0m0.001s</p>
<p>It&#8217;s much the same, as GCC performs a similar trick using %rdi and the stack.</p>
<h2>Level 2 Optimizations</h2>
<p>Finally, let&#8217;s enable the highest level of optimization:</p>
<pre class="brush: plain; title: ; notranslate">
g++ main.cpp -O2 -S
clang main.cpp -O2 -S
</pre>
<p>[GCC]</p>
<pre class="brush: plain; title: ; notranslate">
main:
.LFB21:
	.cfi_startproc
	subq	$8, %rsp
	.cfi_def_cfa_offset 16
	movl	$100000001, %esi
	movl	$.LC0, %edi
	xorl	%eax, %eax
	call	printf
	xorl	%eax, %eax
	addq	$8, %rsp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
</pre>
<p>[LLVM]</p>
<pre class="brush: plain; title: ; notranslate">
.Ltmp7:
	movl	$.L.str, %edi
	movl	$100000001, %esi
	xorb	%al, %al
	callq	printf
	xorl	%eax, %eax
	popq	%rbp
	ret
</pre>
<p>No need to show anything other than main() because it doesn&#8217;t matter.</p>
<p>Both LLVM and GCC have done what we&#8217;d expect with such a silly bit of code. Both compilers analyzed the code and came to the same conclusion: the final output value to prinf() can be calculated directly within the compiler, so no need to call anything. Just push 100000001 to %esi for printf() and call it a day : )</p>
<h3>In Conclusion</h3>
<p>While the code tested was simple, it&#8217;s interesting to see how the actual assembly differs. It&#8217;s clear that this simple test LLVM produces faster binaries, though not by much.</p>
<p>The other important bit is at least on Fedora, installing and using GCC and LLVM couldn&#8217;t be simpler.</p>
<h3>Links</h3>
<p><a href="http://llvm.org/docs/GettingStarted.html#tutorial4">Installing and Using LLVM</a></p>
<p><a href="http://llvm.org/demo/index.cgi">LLVM Online Compiler Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2011/09/gcc-vs-llvm-simple-low-level-optimizations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ Performance &#8211; Counting Clocks</title>
		<link>http://www.formboss.net/blog/2010/07/c-performance-counting-clocks/</link>
		<comments>http://www.formboss.net/blog/2010/07/c-performance-counting-clocks/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 01:03:04 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[assembly code]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[optimizing code]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=503</guid>
		<description><![CDATA[Performance computing can be an interesting task to undertake, as it lets us get under the hood of a complex abstraction (C++) and talk to the machine directly. In the next two posts we&#8217;ll take a look at the Fibonacci algorithm used in a few other posts and see just how fast we can make [...]]]></description>
			<content:encoded><![CDATA[<p>Performance computing can be an interesting task to undertake, as it lets us get under the hood of a complex  abstraction (C++) and talk to the machine directly.</p>
<p>In the next two posts we&#8217;ll take a look at the Fibonacci algorithm used in a few other posts and see just how fast we can make it by looking at loop implementation, data type usage, and assembly code optimizations. In this first post we&#8217;ll take a look at some basic timing code, what gcc will do for us using the -O2 flag, then in the second post, see what we can do (if anything) to improve upon the generated code. </p>
<p><span id="more-503"></span></p>
<p>The Algorithm<br />
The traditional use of the Fibonacci sequence is to show off the use of recursive function calls. The only problem with this is for every recursive call we dump the result of the previous call back on the functions call stack. For a few recursions this isn&#8217;t that bad, but in the case of a Fibonacci sequence it can lead to millions of calls and loads of memory&#8211;the most common end result then is too many calls will simply stall or crash the application.</p>
<p>The solution then is to use an iterative approach to solving the sequence.</p>
<p>Recall that the fib sequence is simply the sum of the previous two numbers in the sequence:</p>
<p>1+1=2, 1+2=3, 2+3=5, 3+5=8, 5+8=13, 8+13=21 [...]</p>
<p>For the sake of my implementation, we need to tell the loop how many times to run, and to shift the variables values down by 1 for each loop.</p>
<p>So on the first turn we set x and y to be 1 and 1 respectively. We then add them together, placing the value into a third variable.</p>
<p>We then swap the values of x and y down &#8220;1&#8243;, with x getting y&#8217;s old value and y getting z.</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> iterations <span class="sy1">=</span> <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> values<span class="br0">&#91;</span>iterations<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> x,y,z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; x <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; y <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// standard loop</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy3">&amp;</span>lt; iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy1">=</span> x <span class="sy2">+</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; values<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So how can we make this run as fast as possible? The first step is to figure out how fast it currently is. With modern CPU&#8217;s being as fast as they are seconds and milliseconds simply won&#8217;t do. Thus, we need to look at the finest grain counter an x86 CPU offers: CPU clocks.</p>
<p>To count clocks we&#8217;ll implement a CPU clock counting benchmark routine valid on gcc and x86-64 hardware:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/* </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* File: &nbsp; main.cpp</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Author: M. Grdinic</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Created on July 19, 2010, 3:30 PM</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</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;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">typedef</span> <span class="kw4">long</span> <span class="kw4">long</span> __int64;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">inline</span> __int64 rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __int64 hi, lo;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;xorl %%eax, %%eax;<span class="es0">\n</span><span class="es0">\t</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;push %%rbx;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;cpuid<span class="es0">\n</span><span class="es0">\t</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">::</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">:</span><span class="st0">&quot;%rax&quot;</span>, <span class="st0">&quot;%rbx&quot;</span>, <span class="st0">&quot;%rcx&quot;</span>, <span class="st0">&quot;%rdx&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;rdtsc;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">:</span> <span class="st0">&quot;=a&quot;</span> <span class="br0">&#40;</span>lo<span class="br0">&#41;</span>, &nbsp;<span class="st0">&quot;=d&quot;</span> <span class="br0">&#40;</span>hi<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">::</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;xorl %%eax, %%eax; cpuid;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;pop %%rbx;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">::</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">:</span><span class="st0">&quot;%rax&quot;</span>, <span class="st0">&quot;%rbx&quot;</span>, <span class="st0">&quot;%rcx&quot;</span>, <span class="st0">&quot;%rdx&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>__int64<span class="br0">&#41;</span>hi <span class="sy1">&lt;&lt;</span> <span class="nu0">32</span> <span class="sy3">|</span> lo;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define COUNT 20</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> tester<span class="br0">&#40;</span>__int64 overhead<span class="br0">&#91;</span><span class="br0">&#93;</span>, __int64 clocks<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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __int64 s, f, t1, t2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> x_i; <span class="kw4">int</span> x_it <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// set locals</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> iterations <span class="sy1">=</span> <span class="nu0">20</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> values<span class="br0">&#91;</span>iterations<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> x,y,z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; x <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; y <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// LOOP CONTROL CODE</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>x_it <span class="sy1">=</span> <span class="nu0">0</span>; x_it <span class="sy1">&lt;</span> COUNT; x_it<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>x_i <span class="sy1">=</span> <span class="nu0">0</span>; x_i <span class="sy1">&lt;</span> <span class="nu0">3</span>; x_i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t1 <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t2 <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overhead<span class="br0">&#91;</span>x_it<span class="br0">&#93;</span> <span class="sy1">=</span> t2 <span class="sy2">-</span> t1;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; s <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><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; &nbsp; <span class="co1">// CODE START</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// standard loop</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; asm<span class="br0">&#40;</span><span class="st0">&quot;nop&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy1">=</span> x <span class="sy2">+</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; asm<span class="br0">&#40;</span><span class="st0">&quot;nop&quot;</span><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; &nbsp; <span class="co1">// CODE END</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; f <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><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; &nbsp; <span class="co1">// reset locals values</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; clocks<span class="br0">&#91;</span>x_it<span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#40;</span>f <span class="sy2">-</span> s<span class="br0">&#41;</span> <span class="sy2">-</span> overhead<span class="br0">&#91;</span>x_it<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&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; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> values<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</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="br0">&#41;</span> <span class="br0">&#123;</span> &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __int64 overhead<span class="br0">&#91;</span>COUNT<span class="br0">&#93;</span>, clocks<span class="br0">&#91;</span>COUNT<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// run test</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; tester<span class="br0">&#40;</span>overhead, clocks<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// print results</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> COUNT; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Overhead:&quot;</span> <span class="sy1">&lt;&lt;</span> overhead<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es0">\t</span>Clocks: &quot;</span> <span class="sy1">&lt;&lt;</span> clocks<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> endl;</div>
</li>
<li class="li1">
<div class="de1">&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; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw2">EXIT_SUCCESS</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The basic idea is we define a number for how many tests to perform, then loop over the code this many times. On each iteration we call our inline rdtsc() routine which is written in assembly. It&#8217;s important to note that with modern processors we need to serialize the instruction stream (via CPUID), as well as issue clobbers for the effected registers from the CPUID call. We&#8217;ll also measure the overhead of calling CPUID and subtract this from the final result. In the end this routine allow us to get a good feel for how many CPU clocks our code consumed.</p>
<p>Finally, as a general point of interest, context switches present in all modern operating systems can and will effect the clock count of very large functions. Thus, in our case we make sure to only benchmark small sections of code. </p>
<p>With our counting routine ready for action the first thing I wanted to look at was the base performance. Running through the first 8 iterations shows:</p>
<p>Overhead:440	Clocks: 363<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 407<br />
Overhead:440	Clocks: 308<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 286</p>
<p>In other words, after a cache warm up period we stabilize at 286 cycles. </p>
<p>We&#8217;ll then add the -O2 optimization flag to the compiler directives (in NetBeans, open your projects options page and select the C++ Compiler options &gt; Additional Options) and see what we get:</p>
<p>Overhead:429	Clocks: 121<br />
Overhead:429	Clocks: 99<br />
Overhead:429	Clocks: 66<br />
Overhead:429	Clocks: 55<br />
Overhead:429	Clocks: 66<br />
Overhead:429	Clocks: 55<br />
Overhead:429	Clocks: 66<br />
Overhead:429	Clocks: 66</p>
<p>To make sense of this we&#8217;ll check out the assembly for each:</p>
<p>First, the unoptimized version:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp;movl $<span class="nu0">0</span>, <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jmp</span> .L7</div>
</li>
<li class="li1">
<div class="de1">.L8:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-88</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-80</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;leaq <span class="br0">&#40;</span>%rdx,%rax<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rax, <span class="nu0">-96</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-88</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rax, <span class="nu0">-80</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-96</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rax, <span class="nu0">-88</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %<span class="kw3">edx</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-112</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movslq %<span class="kw3">edx</span>,%rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-96</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rcx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rcx, <span class="br0">&#40;</span>%rax,%rdx,<span class="nu0">8</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;addl $<span class="nu0">1</span>, <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">.L7:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;cmpl <span class="nu0">-36</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">setl</span> %<span class="kw3">al</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;testb %<span class="kw3">al</span>, %<span class="kw3">al</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jne</span> .L8</div>
</li>
</ol>
</div>
<p>And the -O2 optimized version:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp;xorl %<span class="kw3">eax</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl $<span class="nu0">1</span>, %<span class="kw3">edx</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl $<span class="nu0">1</span>, %<span class="kw3">ebx</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">4</span>,,<span class="nu0">10</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">3</span></div>
</li>
<li class="li1">
<div class="de1">.L6:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;leaq <span class="br0">&#40;</span>%rdx,%rbx<span class="br0">&#41;</span>, %rcx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rdx, %rbx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rcx, <span class="br0">&#40;</span>%r12,%rax<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;addq $<span class="nu0">8</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rcx, %rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;cmpq $<span class="nu0">80</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jne</span> .L6</div>
</li>
</ol>
</div>
<p>The first thing that jumps out is the loop counting&#8211;whereas in the unoptimized version we count using the 16-bit registers against main memory, the optimized version adds &#8216;logic&#8217; to the process, using cmpq to check an immediate value from a register (%rax).</p>
<p>This explains some of the speedup, but not all. The get to bottom of why the optimized code is so much smaller (faster) we can take a huge hint from the number of raw instructions, of which the optimized code of course has far fewer.</p>
<p>Part of this is a side-effect of the 64-bit architecture we&#8217;re compiling too, as %rdx and %rbx are leaq&#8217;d to %rcx to produce code which stores loop values in registers at all times, as opposed to the unoptimized code which continually pushes values to the call stack. This eliminates almost all of the movq&#8217;s which certainly helps, but far more importantly, we no longer access main memory.</p>
<p>All that said, it <em>still </em>doesn&#8217;t explain everything in terms of raw performance. </p>
<p>The big hint comes from recompiling the application to use only 4 Fibonacci loops. It&#8217;s a bit hard to see, so I&#8217;ve added an intermediate asm(&#8220;nop&#8221;) in the loop so it becomes clear: </p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">2</span>, <span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">72</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">3</span>, <span class="nu0">8</span><span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">72</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">5</span>, <span class="nu0">16</span><span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">72</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">8</span>, <span class="nu0">24</span><span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
</ol>
</div>
<p>gcc has unrolled the loop for us. Of course we only have so many registers, so one more loop to make 5 means we lose the unroll, and we&#8217;re back to standard loop code.</p>
<p>This is related to another important rule -O2 brings to the mix, which is if we remove the call to save our values in <em>values[n]</em>, -O2 literally removes our code from the final assembly file:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy1">=</span> x <span class="sy2">+</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//values[i] = z;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Generates:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"># <span class="nu0">67</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">74</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
</ol>
</div>
<p>If however, we add a: cout << y; call after our loop, we generate:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp;xorl %<span class="kw3">eax</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">4</span>,,<span class="nu0">10</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">3</span></div>
</li>
<li class="li1">
<div class="de1">.L6:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;leaq <span class="br0">&#40;</span>%rsi,%rdi<span class="br0">&#41;</span>, %rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;addl $<span class="nu0">1</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rsi, %rdi</div>
</li>
<li class="li1">
<div class="de1">&nbsp;cmpl $<span class="nu0">10</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rdx, %rsi</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jne</span> .L6</div>
</li>
</ol>
</div>
<p>In other words, the secret to the speed-up is in -O2 mode gcc adds just enough code to get the correct result, but nothing more. We&#8217;ll see this time and again when using optimizations, gcc stripping away the fat and making intelligent decisions based on your actual code, as opposed to blindly creating assembly that fits the most general scenario.</p>
<p>That said, nothings stopping us from rewriting the code using hand-crafted assembly to match the -O2 version, though with -O2 being 3 characters away, one could ask why bother&#8230;though we will anyway in the next post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/07/c-performance-counting-clocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ 64-bit Inline Assembly Primer – Part 2</title>
		<link>http://www.formboss.net/blog/2010/07/c-64-bit-inline-assembly-primer-%e2%80%93-part-2/</link>
		<comments>http://www.formboss.net/blog/2010/07/c-64-bit-inline-assembly-primer-%e2%80%93-part-2/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 04:25:43 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[64-bit assembly]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=541</guid>
		<description><![CDATA[In this series we examine the relationship and implementations of C++ and raw assembly code. In this post we create our own add function in gcc extended assembly. In the previous post we wrote a short C++ program that loaded two numbers. Despite its simplicity in C++, we saw how the assembly version was comprised [...]]]></description>
			<content:encoded><![CDATA[<p>In this series we examine the relationship and implementations of C++ and raw assembly code. In this post we create our own add function in gcc extended assembly.</p>
<p>In the previous post we wrote a short C++ program that loaded two numbers. Despite its simplicity in C++, we saw how the assembly version was comprised of several dozen individual instructions in a rather cryptic format. Much of this complexity stems from the fact that in our sample program we called a function to perform our addition. Calling functions means dealing with a stack, base pointers, and the setup and maintenance of that stack. It means dealing with memory offsets, relative positions, and several other factors. The good news is that at this point we can safely ignore these details. In fact, we will do well to ignore them and focus on just the core competencies of function implementation code. In other words, we&#8217;ll let gcc create the function shells, calls, and stack management, we&#8217;ll focus on the core logic.</p>
<p><span id="more-541"></span></p>
<p>The general idea is that we want to write assembly that adds two numbers together. There is a direct assembly instruction for doing so, <strong>add</strong>, and in this post we&#8217;ll implement it.</p>
<p>One of the key things to remember about writing assembly is that we&#8217;re dealing with very few abstractions. In C++:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">int</span> t <span class="sy1">=</span> <span class="nu0">10</span>;</div>
</li>
</ol>
</div>
<p>Has a very specific meaning, but its <em>true</em> meaning to the machine it runs on is hidden. It&#8217;s only after gcc compiles the code that int, t, and 10 mean anything to the processor. In assembly we free ourselves from these abstractions and deal with the very direct process of moving bits around.</p>
<p>Thus, our first step in writing assembly to add two numbers is to realize that the add instruction we&#8217;ll be using expects two parameters, neither of which can be memory locations. They can however, be registers. Thus, our first steps in code must be to load two registers with the values we want to add.</p>
<p>To load a value into a register we use the <strong>mov</strong> instruction, which for us in AT&#038;T syntax takes the form of:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">mov</span> $0&#215;2, %%rax<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>This moves the immediate value (2) into the %rax register. Please keep in mind %rax is a 64-bit register, it would be %eax on 32-bit systems.</p>
<p>We then push our second number:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">mov</span> $0&#215;1, %%rcx<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>And finally, call the add instruction, passing in our two registers:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">add</span> %%rcx, %%rax<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>The whole function in extended assembly looks like:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov $0&#215;2, %%rax; &nbsp; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov $0&#215;1, %%rcx; &nbsp; &nbsp; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add %%rcx, %%rax; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;rax&quot;</span>, <span class="st0">&quot;rcx&quot;</span><span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
</ol>
</div>
<p>Should we run this in our IDE, we would watch the rax and rcx register&#8217;s end up with 0&#215;1 and 0&#215;3, respectively. </p>
<p>Thing is, this is not a very useful construct, as immediate values means we&#8217;ve hard coded the return in by default. It&#8217;s much more realistic to accept parameters.</p>
<p>To do so, we take advantage of gcc extended syntax like so:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rax = <span class="nu0">2</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rcx = <span class="nu0">1</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) before: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov %1, %%rax; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov %2, %%rcx; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add %%rcx, %0; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;=m&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;m&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span>, <span class="st0">&quot;m&quot;</span> <span class="br0">&#40;</span>rcx<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;rax&quot;</span>, <span class="st0">&quot;rcx&quot;</span><span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) after: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>Will output:</p>
<div class="geshi no ini">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>rax<span class="br0">&#41;</span> before: <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>rax<span class="br0">&#41;</span> after: <span class="nu0">3</span></div>
</li>
<li class="li1">
<div class="de1">Press <span class="re0"><span class="br0">&#91;</span>Enter<span class="br0">&#93;</span></span> to close the terminal &#8230;</div>
</li>
</ol>
</div>
<p>While we now have plenty of control over implementation, it&#8217;s still a bit heavy on syntax. Thus, we can further optimize by letting gcc have full control over register assignment:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rax = <span class="nu0">2</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rcx = <span class="nu0">1</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) before: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add %2, %0; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;=r&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;r&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span>, <span class="st0">&quot;r&quot;</span> <span class="br0">&#40;</span>rcx<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) after: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>Here we let gcc decide which registers to use, which leads to slightly faster code generation, but we may lose the exacting control we need.</p>
<p>At this point we now have a functioning addition routine. Of course we already know it&#8217;s not the most efficient, as we could/should be using lea. This is because while our actual hand-written assembly is shorter, we still need to place values in registers and use the two-step addition instruction.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/07/c-64-bit-inline-assembly-primer-%e2%80%93-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 4</title>
		<link>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/</link>
		<comments>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 01:45:48 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=329</guid>
		<description><![CDATA[Having created a shell of our app in step 2, porting the image cleaner code in step 3, we&#8217;re now at the stage where we can to port our command line XML cleaner code to Qt. At the end of this post we&#8217;ll have a fully functioning C++ Qt app. The Original &#8216;Command Line&#8217; Code [...]]]></description>
			<content:encoded><![CDATA[<p>Having created a shell of our app in step 2, porting the image cleaner code in step 3, we&#8217;re now at the stage where we can to port our command line XML cleaner code to Qt. At the end of this post we&#8217;ll have a fully functioning C++ Qt app.</p>
<p><span id="more-329"></span></p>
<h2>The Original &#8216;Command Line&#8217; Code</h2>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// xml files</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Starting file clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; string fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; d <span class="sy1">=</span> opendir<span class="br0">&#40;</span>storyPath.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>d<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// low memory, no parallelization</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy1">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name <span class="sy1">=</span> dir<span class="sy2">-</span><span class="sy1">&gt;</span>d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location <span class="sy1">=</span> storyPath <span class="sy2">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy2">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;.&quot;</span> <span class="sy3">&amp;&amp;</span> name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;..&quot;</span> <span class="sy3">&amp;&amp;</span> name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ==&gt; buffer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// alternative version of buffer &#8211; we lose the</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// BOM issue, but have to create \r\n</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string fileData2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff <span class="sy2">+</span><span class="sy1">=</span> fileData2 <span class="sy2">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy1">=</span> buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// == remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hl1Start <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span> <span class="sy3">&amp;&amp;</span> hl1End <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy1">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>hl1Start,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>hl1End <span class="sy2">-</span> hl1Start<span class="br0">&#41;</span><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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy2">-</span> hl1Start<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1 exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// == replace all instances with open p then find</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// the next \r\n and add a </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>bodyStart <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span> <span class="sy3">&amp;&amp;</span> bodyEnd <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy1">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>bodyStart,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>bodyEnd <span class="sy2">-</span> bodyStart<span class="br0">&#41;</span><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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> matchingP <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; innerp <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rn, p<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>innerp <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr, p<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>matchingP <span class="sy1">==</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Hanging p&quot;</span> <span class="sy1">&lt;&lt;</span> endl;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter<span class="sy2">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy2">-</span> bodyStart<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// bodyEnd exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// save file</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location <span class="sy2">+</span> <span class="st0">&quot;-debug.xml&quot;</span><span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream<span class="sy4">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location<span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ofstream<span class="sy4">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outfile.<span class="me1">write</span><span class="br0">&#40;</span>fileData.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, fileData.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><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; &nbsp; &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; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// while()</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We perform a couple of distinct steps in this code. First, we open our directory for iteration with:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy1">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">name <span class="sy1">=</span> dir<span class="sy2">-</span><span class="sy1">&gt;</span>d_name;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
</ol>
</div>
<p>And then write the contents of the file into a buffer with:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// BOM issue, but have to create \r\n</span></div>
</li>
<li class="li1">
<div class="de1">string fileData2;</div>
</li>
<li class="li1">
<div class="de1">string buff;</div>
</li>
<li class="li1">
<div class="de1">ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">buff <span class="sy2">+</span><span class="sy1">=</span> fileData2 <span class="sy2">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">fileData <span class="sy1">=</span> buff;</div>
</li>
</ol>
</div>
<p>Not too complicated: We use getline() to only get the raw text of a line, to which we then add a \r\n. We do this because part of our task is to recreate proper tags, and it just so happens that so long as we know where our line breaks are, we can do so reliably. Adding our own line break tags means cross-platform differences will be eliminated, plus our p tag code will run exactly as intended.</p>
<p>The remainder of the code removes extra formatting from headline elements, as well as adds p tags in proper order and sequence. Most of this logic, as it turns out, was the same in Qt, though we did have some significant differences in key locations.</p>
<h2>The New Code</h2>
<p>The new code segment is the result of a fair bit of experimentation. The command line version was in fact easier to create, though only because of the higher availability of resources for performing file opening, string manipulation, and file writing in plain old C++.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanXMLStoryFiles</span><span class="br0">&#40;</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; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting XML File Clean&#8230;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// locals</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> replaceString;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// create buffer for semaphores</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; uint count <span class="sy0">=</span> <span class="kw5">QDir</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath<span class="br0">&#41;</span>.<span class="me1">count</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> t <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>count<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// loop and clean</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// reset on every turn</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// open file data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f<span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>f.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QIODevice</span><span class="sy0">::</span><span class="me2">ReadWrite</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> in<span class="br0">&#40;</span><span class="sy0">&amp;</span>f<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; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">+=</span> in.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>in.<span class="me1">atEnd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><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; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><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; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>hl1Start <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> hl1End <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> fileData.<span class="me1">mid</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span><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; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;br, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;rl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;nl, <span class="st0">&quot;&quot;</span><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; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span>, replaceString<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; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove p tags and extra spaces</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><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; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>bodyStart <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> bodyEnd <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> fileData.<span class="me1">mid</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span><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; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, this<span class="sy0">-</span>&gt;openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; innerp <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>rn, p<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>innerp <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>doublebr, p<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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>matchingP <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>Hanging P Found And Fixed<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span>, replaceString<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; &nbsp; <span class="br0">&#125;</span> <span class="co1">// innner p</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// write file</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;-new.xml&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> outData<span class="br0">&#40;</span>outPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outData.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QFile</span><span class="sy0">::</span><span class="me2">WriteOnly</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> outFile<span class="br0">&#40;</span><span class="sy0">&amp;</span>outData<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outFile &lt;&lt; fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &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; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>XML File Clean Complete.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> this<span class="sy0">-</span>&gt;statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Some key points are as follows:</p>
<p>The method used to iterate through a directory:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>&#8230;feels a bit strange to me, almost as if I&#8217;m missing something. Specifically, the while() statement checks for an empty string if no further files are found. This just seems&#8230;wrong to me, but I could be mistaken. For the record, examples given in Qt help documentation had a flaw of never returning the <em>last</em> element of a directory. For example, if we had four items, only three would be iterated through. The do { } while() was the only way I found to hit all files.</p>
<p>As similar as the core logic is, here&#8217;s where things take a pretty radical departure from the command line version.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// reset on every turn</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// open file data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f<span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>f.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QIODevice</span><span class="sy0">::</span><span class="me2">ReadWrite</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> in<span class="br0">&#40;</span><span class="sy0">&amp;</span>f<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; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">+=</span> in.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>in.<span class="me1">atEnd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><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; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In this code we&#8217;re using the handy QTextStream on an address of a QFile object to read each line of text, to which we add the \r\n to, just like the command line version.</p>
<p>We also save a chunk of time here by using REGEX enabled replace method to remove unwanted tags from the headline text:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;br, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;rl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;nl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>As you may recall in the old code we used a more complex:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The last part, the section where we add our properly closed p tags, is largely untouched, save for using <strong>indexOf() </strong>instead of <strong>find()</strong>, as well as using <strong>mid()</strong> to build our temporary string for editing.</p>
<p>The last step was to write the fixed file back to the file system. In the first version we used the rather succinct <strong>ofstream</strong> to do the job, The new version used a more complex series of command as:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;-new.xml&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> outData<span class="br0">&#40;</span>outPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outData.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QFile</span><span class="sy0">::</span><span class="me2">WriteOnly</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> outFile<span class="br0">&#40;</span><span class="sy0">&amp;</span>outData<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outFile &lt;&lt; fileData;</div>
</li>
</ol>
</div>
<p>Of course we may have a more simplistic way of doing this, but I didn&#8217;t find one.</p>
<h2>Closing Thoughts</h2>
<p>The end result of our project is a slick little Qt desktop app that removed the burden of command line operation for its use. However, as nice as this may be for the end-user, as a developer what I was most curious to see was if Qt would stand up to the challenge of being user friendly, powerful, and at the same time, a joy to work with.</p>
<p>Simple answer: It was. Qt is simply brilliant&#8211;I&#8217;m sold, hooked, and thoroughly excited to learn and do more with this library. It&#8217;s all the power and functionality of C++, but wrapped into a cross platform, easy to use deployment platform with powerful tools and solid documentation.</p>
<p>Though of course this is somewhat relative when it comes to porting command line app to a GUI. Our command line app weighed in at 223 lines, Qt: 368. While it was very easy to find examples of file operation for vanilla C++ on the web, it was markedly more difficult for Qt. In fact, as hinted at in the text I&#8217;m still quite unsure of the &#8220;properness&#8221; of this code. It works well enough, but am I missing something?</p>
<p>Do I really need to used a  <strong>QTextStream</strong> to write data, or should I have used the more low-level write() function inherited from <strong>QIODevice</strong>? This question reminds me of the difference in PHP between using:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$content</span> <span class="sy0">=</span> <span class="st0">&quot;Sample&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$res</span> <span class="sy0">=</span> file_put_contents<span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>verses using:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$content</span> <span class="sy0">=</span> <span class="st0">&quot;Sample&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$handle</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="st0">&quot;somefile.txt&quot;</span><span class="sy0">,</span> <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$res</span> <span class="sy0">=</span> <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re1">$handle</span><span class="sy0">,</span> <span class="re1">$content</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>In short, one simple step vs. a few more obtuse ones. It&#8217;s by no means wrong, but I can&#8217;t help but wonder&#8230;</p>
<p>Of course it should also be said that this program could use more error and sanity checks if it was to ever be released an a commercial app, but in this case, it&#8217;s just for pedagogical purposes.</p>
<h2>Complete Application Source Download</h2>
<p>Being a Qt app you should be able to run this code (build) on any platform Qt supports.<br />
<a href="http://www.formboss.net/blog/wp-content/uploads/2010/06/cleaner.zip">Download cleaner.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 3</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:27:41 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[Porting Code]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=242</guid>
		<description><![CDATA[In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version. The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app. [...]]]></description>
			<content:encoded><![CDATA[<p>In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version.</p>
<p>The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app.</p>
<p>We&#8217;re already getting a valid directory entry from part 2, so the first step in this part is to figure out how we iterate and query files from our base folder.</p>
<p><span id="more-242"></span></p>
<p>As setup for this task, in the first app (the command line one) we defined a few globals:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// path data</span></div>
</li>
<li class="li1">
<div class="de1">string basePath <span class="sy0">=</span> argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">string imagePath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">string storyPath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>We&#8217;ll keep that basic structure, but of course implement them as member private variables. It should be noted that in the new version the &#8216;base&#8217; directory value comes from our Worker constructor with:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">Worker <span class="sy0">*</span>wk <span class="sy0">=</span> <span class="kw3">new</span> Worker<span class="br0">&#40;</span>processPathQLineEdit<span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>In the worker constructor we then:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// create path items</span></div>
</li>
<li class="li1">
<div class="de1">basePath <span class="sy0">=</span> path;</div>
</li>
<li class="li1">
<div class="de1">imagePath <span class="sy0">=</span> path <span class="sy0">+=</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">xmlPath <span class="sy0">+=</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>Same thing as the original version really, though one thing I had to check on is if using / will be a problem for Windows. <a title="QDir" href="http://doc.qt.nokia.com/4.6/qdir.html" target="_blank"><em>*Turns out the answer is no.*</em></a></p>
<p>With the setup tasks done notice that in the GUI we have two buttons: The first allows us to select the base folder, the second kicks off the Process Images task. Notice how we do this: in cleaner.enc__cppqt our clicked() SIGNAL of the <em>processButton </em>button is assigned to the processAction slot, which in turn, after creating our Worker instance object, calls cleanImages(). And so we&#8217;re getting an images directory via the GUI&#8211;so far so good!</p>
<p>This brings us to the next big question question: how do we open and iterate over directories?</p>
<h2>Iterator Over Directories</h2>
<p>As you may recall the first task of our program is to remove all files with a _bw_ in the name from the /images sub-folder. It looks like we have: <strong>QDirIterator</strong> and <strong>QDir</strong> to help us perform this duty, with the possibly of others as well. The former seems to be for general access, the latter for iterating&#8211;we want to iterate.</p>
<h3>Basic QDirIterator Implementation</h3>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;./&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Pretty strait forward really. Iterator over the directory, making sure to skip the path items.</p>
<p>This takes care of the iteration, now we need to find and remove files that have the _bw_.</p>
<p>In the old code we used:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;found <span class="sy0">=</span> name.<span class="me1">rfind</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>found <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;path <span class="sy0">=</span> imagePath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;location <span class="sy0">=</span> imagePath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> &lt;&lt; location &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> t <span class="sy0">=</span> <span class="kw3">remove</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I should step back to mention the first step was to get the file name. In the first attempt we relied on a <strong>struct</strong> returned by <strong>dirent</strong> to store file info for checking, now we have a nice simple fileName() method to call. I&#8217;m not going to lie, the Qt way feels much cleaner than the command line version. <strong>dirent </strong>was tricky to work with at first without having a debugger, this is no longer an issue in Qt. With that out of the way, what of finding the text &#8220;_bw_&#8221;?</p>
<p>I suspected, and was proven right, that QString would have some type of find function. Sure enough:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Beautiful! I can&#8217;t help but show my gratitude over such an elegant and natural thing. Without any documentation look up I was able to basically guess and implement my search function in one line. Yes std::string had the same thing with .find(), but this was a nice treat regardless.</p>
<p>Right, so now how do we delete files?</p>
<p>In the first version we had to use a separate variable (location) and a member function .c_str() to pass to the delete(char*) call. This is fine, but a touch verbose. It would be nice to encapsulate this a bit more.</p>
<h3>Delete File Implementation</h3>
<p>It turns out that we can use the same remove() call, though it wants a char*, we&#8217;ve got a QString. As was the goal anyway, we want to use native solutions for cross-platform consistency. I did some digging and found QFile. QFile has a member function for removing files: <strong>.remove()</strong>. Even better though, QDirIterator has a member function <strong>filePath()</strong> to return the full path to the file (not just file name). Of course I may have missed similar functionality in the first go (such as using QDir), but now we save ourselves the hassle of rebuilding the file path from scratch. The final code is:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</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; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&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; &nbsp; <span class="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Sure it&#8217;s about the same length as the original command line code, if not a bit longer, but it feels more intuitive&#8211;almost like OO PHP coding. I do not however, like the idea of creating a new QFile for each item to remove, but I&#8217;m learning&#8211;I&#8217;m sure we&#8217;ll find a better way in the next few posts.</p>
<h3>Final Method Implementation</h3>
<p>For the sake of completeness, here&#8217;s the final cleanImages() function:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</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;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&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="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Up next, <a href="porting-to-the-qt-c-framework-part-4">rewriting the cleanXMLStoryFiles() function</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Posix Threads In C++</title>
		<link>http://www.formboss.net/blog/2010/05/202/</link>
		<comments>http://www.formboss.net/blog/2010/05/202/#comments</comments>
		<pubDate>Tue, 04 May 2010 04:14:52 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=202</guid>
		<description><![CDATA[It&#8217;s sometimes hard to find a good example of working with threads in C++. Thus, in the course of implementing a very simple working example I decided it wouldn&#8217;t hurt to post what I came up with. The following code will spawn 2 threads (for a total of three program threads), and calculate 40 iterations [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s sometimes hard to find a good example of working with threads in C++. Thus, in the course of implementing a <strong>very simple</strong> working example I decided it wouldn&#8217;t hurt to post what I came up with.</p>
<p><span id="more-202"></span></p>
<p>The following code will spawn 2 threads (for a total of three program threads), and calculate 40 iterations of the fibonacci_number function. You can make it spawn more threads via <em>threads</em>, as well as change the number of iterations via the <em>iterations &lt; 40 </em>condition.</p>
<p>I also have some test code at the top of our <em>threadfunc</em> method for variable passing. Any time you start working with threads you need to be aware of the pitfalls that come with data access, and this is something I very much look forward to learning more about.</p>
<p><span style="color: #808080;"><em>Please note the code was run on Linux, specifically Ubuntu 10.04. You&#8217;ll need the g++ compiler and other dev libs via individual packages (e.g. libc6-dev) or </em></span><em><span style="color: #888888;"><strong>&lt;sudo aptitude install build-essential&gt;</strong>.<br />
</span></em></p>
<p><span style="color: #808080;"><em>Also, as the in-code comment below states, you need to include the  Posix Threads library in the <strong>Linker  Properties</strong> of the project  properties area when using <strong>NetBeans</strong>, I&#8217;m not sure about other IDE&#8217;s.</em></span></p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;unistd.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;pthread.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;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;string&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// We need to include POSIX threads in the linker properties (project settings)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> fibonacci_number<span class="br0">&#40;</span><span class="kw4">int</span> num<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="kw1">switch</span><span class="br0">&#40;</span>num<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">case</span> <span class="nu0">0</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">case</span> <span class="nu0">1</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">default</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> fibonacci_number<span class="br0">&#40;</span>num<span class="nu0">-2</span><span class="br0">&#41;</span> <span class="sy0">+</span> fibonacci_number<span class="br0">&#40;</span>num<span class="nu0">-1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1"><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">void</span><span class="sy0">*</span> parallel_threadfunc<span class="br0">&#40;</span><span class="kw4">void</span> <span class="sy0">*</span>arg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;sleep<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Thread called&#8230;&quot;</span> &lt;&lt; arg &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// we cannot get the direct value of our variable, I have to create a</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// new pointer and cast the *arg to that (an int pointer), then dereference it.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> <span class="sy0">*</span> l;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;l <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw4">int</span><span class="sy0">*</span><span class="br0">&#41;</span>arg;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Value Passed&#8230;&quot;</span> &lt;&lt; <span class="sy0">*</span>l &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// loop</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> iteration <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>iteration &lt; <span class="nu0">40</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> value <span class="sy0">=</span> fibonacci_number<span class="br0">&#40;</span>iteration<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;iteration<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Itteration#&#8230;&quot;</span> &lt;&lt; iteration &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&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="co1">// exit</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_exit<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><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="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> threads <span class="sy0">=</span> <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> x<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#123;</span><span class="nu0">0</span>,<span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span>,<span class="nu0">5</span>,<span class="nu0">6</span>,<span class="nu0">7</span>,<span class="nu0">8</span>,<span class="nu0">9</span>,<span class="nu0">10</span><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="co1">// thread attributes</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_attr_t attr;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_attr_init<span class="br0">&#40;</span><span class="sy0">&amp;</span>attr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_attr_setdetachstate<span class="br0">&#40;</span><span class="sy0">&amp;</span>attr, PTHREAD_CREATE_DETACHED<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_t t<span class="br0">&#91;</span>threads<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">for</span> <span class="br0">&#40;</span>i <span class="sy0">=</span> <span class="nu0">0</span>; i &lt; threads; <span class="sy0">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_create<span class="br0">&#40;</span><span class="sy0">&amp;</span>t<span class="br0">&#91;</span>i<span class="br0">&#93;</span>, <span class="sy0">&amp;</span>attr, parallel_threadfunc, <span class="br0">&#40;</span><span class="kw4">void</span><span class="sy0">*</span><span class="br0">&#41;</span><span class="sy0">&amp;</span>x<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&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="kw3">cout</span> &lt;&lt; x &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> n;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Enter a number to quite the program:&quot;</span> &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cin</span> &gt;&gt; n;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw2">EXIT_SUCCESS</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/202/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

