<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="bbPress/1.0.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>LeafLabs Garden &#187; Topic: Possible &#34;hesitation&#34; bug revealed using strcmp()</title>
		<link>http://forums.leaflabs.com/topic.php?id=209</link>
		<description>A place to share, learn, and grow...</description>
		<language>en-US</language>
		<pubDate>Fri, 22 Jan 2016 00:19:16 +0000</pubDate>
		<generator>http://bbpress.org/?v=1.0.2</generator>
		<textInput>
			<title><![CDATA[Search]]></title>
			<description><![CDATA[Search all topics from these forums.]]></description>
			<name>q</name>
			<link>http://forums.leaflabs.com/search.php</link>
		</textInput>
		<atom:link href="http://forums.leaflabs.com/rss.php?topic=209" rel="self" type="application/rss+xml" />

		<item>
			<title>gbulmer on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=4#post-2431</link>
			<pubDate>Thu, 11 Nov 2010 20:03:16 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">2431@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;mbolivar - &#38;lt;&#38;gt;If you have an implementation you'd like included in libmaple, I'm sure we'd be grateful. &#38;lt;/&#38;gt;&#60;/p&#62;
&#60;p&#62;I found the book we used for Shell sort. It was dark red, and not green, which slowed me down a lot :-)&#60;/p&#62;
&#60;p&#62;It was &#34;Handbook of Algorithms and Data Structures in Pascal and C&#34; by G H Gonnet, ISBN 0-201-14218-X Copyright 1984. My copy has a note before the preface to say the code is available on 9 track tape, 1600bpi, for US$95. So not a good candidate for Maplelib.&#60;/p&#62;
&#60;p&#62;Th=at book has been superceeded by the &#60;a href=&#34;http://www.amazon.com/Handbook-Algorithms-Data-Structures-Pascal/dp/0201416077&#34;&#62;1991 edition&#60;/a&#62;&#60;/p&#62;
&#60;p&#62;For the 1991 book there is a web site &#60;a href=&#34;http://www.dcc.uchile.cl/~rbaeza/handbook/hbook.html&#34; rel=&#34;nofollow&#34;&#62;http://www.dcc.uchile.cl/~rbaeza/handbook/hbook.html&#60;/a&#62;&#60;br /&#62;
with the source code.&#60;br /&#62;
So the Shell sort is at &#60;a href=&#34;http://www.dcc.uchile.cl/~rbaeza/handbook/algs/4/414.sort.c.html&#34; rel=&#34;nofollow&#34;&#62;http://www.dcc.uchile.cl/~rbaeza/handbook/algs/4/414.sort.c.html&#60;/a&#62;&#60;br /&#62;
I think we futzed with the step values, maybe from Knuth.&#60;/p&#62;
&#60;p&#62;Anyway, I have't found the license on that code, but it may be a suitable starting place for maplelib.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>poslathian on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1638</link>
			<pubDate>Tue, 05 Oct 2010 13:16:16 +0000</pubDate>
			<dc:creator>poslathian</dc:creator>
			<guid isPermaLink="false">1638@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;yup you want that other paren ;)
&#60;/p&#62;</description>
		</item>
		<item>
			<title>StephenFromNYC on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1636</link>
			<pubDate>Tue, 05 Oct 2010 13:06:50 +0000</pubDate>
			<dc:creator>StephenFromNYC</dc:creator>
			<guid isPermaLink="false">1636@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Hello,&#60;/p&#62;
&#60;p&#62;I like both perry's software version and postlathian's hardware method.  Both are useful, depending on the application (eg. physical access to the button).&#60;/p&#62;
&#60;p&#62;Perry, I think you are missing a close parenthesis after &#34;available()&#34;.&#60;/p&#62;
&#60;p&#62;Is this the correct code?&#60;/p&#62;
&#60;p&#62;&#60;code&#62;&#60;br /&#62;
setup() {&#60;br /&#62;
    while(!SerialUSB.available())&#60;br /&#62;
        ;&#60;br /&#62;
    SerialUSB.println(&#34;Hello!&#34;);&#60;br /&#62;
}&#60;br /&#62;
&#60;/code&#62;&#60;/p&#62;
&#60;p&#62;Thanks!&#60;/p&#62;
&#60;p&#62;Stephen from NYC
&#60;/p&#62;</description>
		</item>
		<item>
			<title>poslathian on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1634</link>
			<pubDate>Tue, 05 Oct 2010 12:58:30 +0000</pubDate>
			<dc:creator>poslathian</dc:creator>
			<guid isPermaLink="false">1634@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;I often do:&#60;/p&#62;
&#60;p&#62;setup() {&#60;br /&#62;
    pinMode(38,INPUT); // BUT button&#60;br /&#62;
    while(!digitalRead(38));&#60;/p&#62;
&#60;p&#62;    // tap button to start (starts on DOWN)&#60;br /&#62;
}
&#60;/p&#62;</description>
		</item>
		<item>
			<title>perry on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1630</link>
			<pubDate>Tue, 05 Oct 2010 12:13:42 +0000</pubDate>
			<dc:creator>perry</dc:creator>
			<guid isPermaLink="false">1630@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;here's what i do to make sure i din;t miss anything coming out of the serialusb:&#60;/p&#62;
&#60;pre&#62;&#60;code&#62;setup() {
    while(!SerialUSB.available()
        ;
    SerialUSB.println(&#38;quot;Hello!&#38;quot;);
}&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;this will make the maple wait until a key is pressed in the serial monitor and then start spewing stuff out.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>poslathian on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1629</link>
			<pubDate>Tue, 05 Oct 2010 11:58:25 +0000</pubDate>
			<dc:creator>poslathian</dc:creator>
			<guid isPermaLink="false">1629@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;about auto-reset:&#60;br /&#62;
   Hmm. We could add auto-reset on terminal open as selectable feature. I agree with you that it has its uses. Right now, *most* (and in the IDE this is enforced) terminals will only send data when DTR is high. Thus, by forcing DTR low and then sending data, you are doing something beyond the normal bounds of operation. We poll these bytes for 1EAF, if found we reset. This code is strictly part of the libmaple SerialUSB driver, so any nonstandard USB stack would not have this included. Since well behaving terminals should set DTR when writing, this magic number check is not really a performance hit nor easy to do by accident. DTR toggling does nothing by itself (no reset). getDTR(),getRTS() are already in libmaple!&#60;/p&#62;
&#60;p&#62;SerialUSB fix:&#60;br /&#62;
   Nope, not a DTR based fix. this is a hardware fix. Im leave it to everyone to guess what the change is going to be, but we arnt ready to announce hardware changes in Rev6 just yet. How will this affect current users? Not at all, the new hardware will be a separate board in the drop down menu. However, if you wish to use the new scheme, we *might* (if requested) offer very low cost adapter boards (0 profit) that will add the new hardware to old maples via the JTAG port, perhaps ugly - but it will make everything behave equivalently. The change should not affect the library at all, so all sketches etc remain unchanged. We have tried many many permutations of driving the USB to maintain correct operation across the various operating systems, and we think this is a low cost high value fix that makes neat new features possible to boot.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>gbulmer on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1626</link>
			<pubDate>Tue, 05 Oct 2010 11:37:59 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">1626@http://forums.leaflabs.com/</guid>
			<description>&#60;blockquote&#62;&#60;p&#62;1) Auto-reset on terminal open:&#60;br /&#62;
One thought for reset control is to directly use DTR/RTS to control the reset, so that opening a terminal program will engage the autoreset. I think this is clearly the wrong thing.
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;I agree with you for general terminal program.&#60;br /&#62;
The issue was/is when reoppening the IDE's serial monitor on the Arduino, it auto-resets.&#60;br /&#62;
That is a very nice behaviour for new users, who can try their programs out very easily without losing any of their print output.&#60;br /&#62;
If that is implemented, I would like it to be an option that I can switch off.&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;Surely you want to decouple opening a terminal window from program flow unless you program this in explicitly (via getDTR(), getRTS()). &#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;A completly agree. That's what I want, and I think is the most general purpose. One can press the rest button if one needs a Reset. I don't want opening a connection to the Maple to reset it. We had a horrible job to defeat that on older Arduino's when my chum Mark wrote a ICSP using the Arduino.&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;So, currently, the auto-reset works via pulling down DTR and then sending along some magic numbers (0x1EAF). &#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;That sounds okay. I think I could (at a push) defeat that on a Mac, if I really needed to (using DTrace). BUt I assume it's an option with some of the terminal emulators.&#60;/p&#62;
&#60;p&#62;Does puling down DTR stop the user program, or is it still running?&#60;br /&#62;
Is the reset only done when the magic number comes along too?&#60;br /&#62;
If the user program is a different kind of USB device, I assume none of this happens?&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;2) SerialUSB voodoo:&#60;br /&#62;
Ugh, such voodoo. I dont want to get anyones hopes of of full fixes in 0.0.7, its a very hard problem (but have cleaned up a lot of related bugs in 0.0.7). However, we had the pleasure of talking it over a lot recently - and with a lot of users and developers of other products at maker faire - and have finally settled on a long term fix. Its a hardware fix, and a feature add, and were psyched.
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;Is it more than using DTR for out-of-band signaling? What other issues am I missing?&#60;/p&#62;
&#60;p&#62;So will this be practical for us to implement on existing boards?&#60;br /&#62;
When will the change get rolled into Maple boards?
&#60;/p&#62;</description>
		</item>
		<item>
			<title>poslathian on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1606</link>
			<pubDate>Tue, 05 Oct 2010 08:52:45 +0000</pubDate>
			<dc:creator>poslathian</dc:creator>
			<guid isPermaLink="false">1606@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;In no particular order, here are some quick comments to the topics covered on this thread:&#60;/p&#62;
&#60;p&#62;1) Auto-reset on terminal open:&#60;br /&#62;
    One thought for reset control is to directly use DTR/RTS to control the reset, so that opening a terminal program will engage the autoreset. I think this is clearly the wrong thing. Surely you want to decouple opening a terminal window from program flow unless you program this in explicitly (via getDTR(), getRTS()). So, currently, the auto-reset works via pulling down DTR and then sending along some magic numbers (0x1EAF). &#60;/p&#62;
&#60;p&#62;2) SerialUSB voodoo:&#60;br /&#62;
    Ugh, such voodoo. I dont want to get anyones hopes of of full fixes in 0.0.7, its a very hard problem (but have cleaned up a lot of related bugs in 0.0.7). However, we had the pleasure of talking it over a lot recently - and with a lot of users and developers of other products at maker faire - and have finally settled on a long term fix. Its a hardware fix, and a feature add, and were psyched. In the meantime if SerialUSB is really killing you, (and I hate to do this) please use the UART's with an FTDI for now - but with confidence that this problem will not plague this platform forever ;)&#60;/p&#62;
&#60;p&#62;3) The RAM/Flash contention. This IS a bootloader issue, the best we can do is a push changes into the bootloader git and if users want to use the serial-bootloader to upgrade then go for it! The issue is a throwback from before a permanent-bootloader mode didnt exist. What would happen is that botched code would get into flash, and everytime you restarted it would jump to bad flash code and crash. Meanwhile, bad ram code can be cleared with a power cycle, so everything was designed to heavily favor ram whenever there was a contention. Of course, with permanent bootloader this problem goes away, so we can do the &#34;right thing&#34; now. &#60;/p&#62;
&#60;p&#62;I have nothing to say about sorting algs ;) (although incidentally, I wrote a really bad merge sort the other day for my THX note synth)
&#60;/p&#62;</description>
		</item>
		<item>
			<title>snigelen on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1601</link>
			<pubDate>Tue, 05 Oct 2010 02:18:49 +0000</pubDate>
			<dc:creator>snigelen</dc:creator>
			<guid isPermaLink="false">1601@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Interesting discussion you have. Just a small comment on this&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
&#60;code&#62;inc &#38;lt;- round(inc / 2.2)&#60;/code&#62;&#60;/p&#62;
&#60;p&#62;The last line in particular is a definite deal-breaker on embedded hardware.&#60;/p&#62;
&#60;/blockquote&#62;
&#60;p&#62;With integer arithmetic you can do the same thing as (I think)&#60;br /&#62;
&#60;code&#62;inc &#38;lt;- (10*inc+5)/22&#60;/code&#62;
&#60;/p&#62;</description>
		</item>
		<item>
			<title>gbulmer on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1594</link>
			<pubDate>Mon, 04 Oct 2010 18:15:40 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">1594@http://forums.leaflabs.com/</guid>
			<description>&#60;blockquote&#62;&#60;p&#62;oh, and just a clarification on what i meant when i said&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;GCC does attempt to do tail call elimination, but that won't help here, since quicksort is not tail-recursive -- the presence of two recursive calls (on the left and right subarrays after the partition step) dooms us to needing the stack.&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;by &#34;won't help&#34;, i meant that the stack size is asymptotically still logarithmic in the input length, since the first recursive call can't be eliminated. optimizing out the recursive call which _is_ in tail position will of course pare down the constant factors.&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;Agreed; in the worst case, flattening the tail call to an iterative solution makes no difference to the stack size. &#60;/p&#62;
&#60;p&#62;I am on thin ice here but, my vague recollection was that quicksort could choose which partition to recurse on, and which to iterate on. In many cases, the partitions are uneven, so recursing on the smaller partition, is a good strategy to reduce stack space requirements.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>gbulmer on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1591</link>
			<pubDate>Mon, 04 Oct 2010 17:23:13 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">1591@http://forums.leaflabs.com/</guid>
			<description>&#60;blockquote&#62;&#60;p&#62;If you have an implementation you'd like included in libmaple, I'm sure we'd be grateful.
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;That was several jobs ago ...&#60;br /&#62;
The battery backed &#34;non-volatile&#34; memory on my old IBM AT clone, gave up years ago, losing all the hard disk parameters, and rendering it useless :-(&#60;br /&#62;
The 5 1/4&#34; floppy 'backups&#34; are just as useless (that was my only machine with a 5 1/4&#34; disk drive).&#60;/p&#62;
&#60;p&#62;But, I think I might have the book that I copied from, somewhere :-)&#60;br /&#62;
(I remember it had a dark-ish green cover)&#60;/p&#62;
&#60;p&#62;Paper, the only information back-up civilisation needs ;-)
&#60;/p&#62;</description>
		</item>
		<item>
			<title>mbolivar on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1573</link>
			<pubDate>Mon, 04 Oct 2010 09:29:39 +0000</pubDate>
			<dc:creator>mbolivar</dc:creator>
			<guid isPermaLink="false">1573@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;gbulmer: one last thing.&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
I think you'll find Shell sort is slightly better than insertion sort &#60;a href=&#34;http://en.wikipedia.org/wiki/Shell_sort&#34; rel=&#34;nofollow&#34;&#62;http://en.wikipedia.org/wiki/Shell_sort&#60;/a&#62;  under most conditions. In experiments we did (in the 80's) on sorting 3D polygons within a rendering engine, it often beat quicksort. (I've tended to use it, and always been pleased with its performance. It seemed overkill for this problem.)
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;This is fascinating.  If you have an implementation you'd like included in libmaple, I'm sure we'd be grateful.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>mbolivar on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1572</link>
			<pubDate>Mon, 04 Oct 2010 09:11:24 +0000</pubDate>
			<dc:creator>mbolivar</dc:creator>
			<guid isPermaLink="false">1572@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;oh, and just a clarification on what i meant when i said&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
GCC does attempt to do tail call elimination, but that won't help here, since quicksort is not tail-recursive -- the presence of two recursive calls (on the left and right subarrays after the partition step) dooms us to needing the stack.
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;by &#34;won't help&#34;, i meant that the stack size is asymptotically still logarithmic in the input length, since the first recursive call can't be eliminated.  optimizing out the recursive call which _is_ in tail position will of course pare down the constant factors.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>mbolivar on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1571</link>
			<pubDate>Mon, 04 Oct 2010 09:06:21 +0000</pubDate>
			<dc:creator>mbolivar</dc:creator>
			<guid isPermaLink="false">1571@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;[a previous post deleted as it was a copy of yours]&#60;/p&#62;
&#60;p&#62;gbulmer:&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
I had a look, and it does the TCO by hand:&#60;/p&#62;
&#60;p&#62;if ((r = pd - pc) &#38;gt; es) {&#60;br /&#62;
		/* Iterate rather than recurse to save stack space */&#60;br /&#62;
		a = pn - r;&#60;br /&#62;
		n = r / es;&#60;br /&#62;
		goto loop;&#60;br /&#62;
	}
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;I'm looking at it too; it's a cool implementation.&#60;/p&#62;
&#60;p&#62;As I'm sure you've seen, it switches to insertion sort at the leaves (n &#38;lt; 7) and when the array appears to be almost sorted (swap_cnt == 0).&#60;/p&#62;
&#60;p&#62;From what I've just read about shell sort, it is equivalent to insertion sort when the array is small, so there's no difference at the leaves.  And of course insertion sort performs well on almost-sorted data, so the motivation for its use there is clear, but I found it curious that they wouldn't use shell sort in that case, given that the array could still potentially be large and that shell sort is considered better (unless there is some property I'm missing). &#60;/p&#62;
&#60;p&#62;Here's some speculation as to why insertion might have been chosen, though:&#60;/p&#62;
&#60;p&#62;The Wikipedia shell sort has this to say about implementation:&#60;br /&#62;
&#60;a href=&#34;http://en.wikipedia.org/wiki/Shell_sort#Shell_sort_algorithm_in_pseudocode&#34; rel=&#34;nofollow&#34;&#62;http://en.wikipedia.org/wiki/Shell_sort#Shell_sort_algorithm_in_pseudocode&#60;/a&#62;&#60;/p&#62;
&#60;pre&#62;
inc &#38;lt;- round(n/2)
while inc &#38;gt; 0 do:
    for i = inc .. n − 1 do:
        temp &#38;lt;- a[i]
        j &#38;lt;- i
        while j &#38;gt;= inc and a[j − inc] &#38;gt; temp do:
            a[j] &#38;lt;- a[j − inc]
            j &#38;lt;- j − inc
        a[j] &#38;lt;- temp
    inc &#38;lt;- round(inc / 2.2)
&#60;/pre&#62;
&#60;p&#62;The last line in particular is a definite deal-breaker on embedded hardware.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>mbolivar on "Possible &#34;hesitation&#34; bug revealed using strcmp()"</title>
			<link>http://forums.leaflabs.com/topic.php?id=209&amp;page=3#post-1569</link>
			<pubDate>Mon, 04 Oct 2010 08:54:37 +0000</pubDate>
			<dc:creator>mbolivar</dc:creator>
			<guid isPermaLink="false">1569@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;so as i'm sure you've seen, newlib qsort switches to insertion sort at the leaves (n &#38;lt; 7) and (i think) when the the array appears to be almost sorted (as determined by swap_cnt); however, in reading about shell sort, it seems that it's equivalent to insertion at small inputs, so no difference there.&#60;/p&#62;
&#60;p&#62;there is a hand-coded TCO on lines 213-221, which i'll include inline since it's short:&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
	if ((r = pb - pa) &#38;gt; es)&#60;br /&#62;
		qsort(a, r / es, es, cmp);&#60;br /&#62;
	if ((r = pd - pc) &#38;gt; es) {&#60;br /&#62;
		/* Iterate rather than recurse to save stack space */&#60;br /&#62;
		a = pn - r;&#60;br /&#62;
		n = r / es;&#60;br /&#62;
		goto loop;&#60;br /&#62;
	}
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;so the second recursive call (which is of course in tail position) is manually optimized, as you suspected.
&#60;/p&#62;</description>
		</item>

	</channel>
</rss>
