Rockbox.org home
release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Rockbox mail archive

Subject: Re: how is strnatcmp aka "Interpret numbers while sorting" supposed to sort?

Re: how is strnatcmp aka "Interpret numbers while sorting" supposed to sort?

From: Bryan VanDyke <bryan.vandyke_at_gmail.com>
Date: Thu, 19 Mar 2009 11:31:09 -0400

Thomas Martitz wrote:
> Bryan VanDyke wrote:
>> Thomas Martitz wrote:
>>
>>> Bryan VanDyke wrote:
>>>
>>>> Thomas Martitz wrote:
>>>>
>>>>
>>>>> Linus Nielsen Feltzing wrote:
>>>>>
>>>>>> Mike Holden wrote:
>>>>>>
>>>>>>> Maybe leading zeros should only be stripped if another digit follows
>>>>>>> them?
>>>>>>>
>>>>>>> I use names like 00RockFaves.m3u, 00ClassicRock.m3u for playlists
>>>>>>> that I
>>>>>>> have created (as opposed to original artist albums), and the leading
>>>>>>> zerozero is deliberately there to sort them at the top.
>>>>>>>
>>>>>> That's an interesting observation. I believe leading zeroes are
>>>>>> treated like whitespace in the current code, but in this case I think
>>>>>> that the final zero should be kept.
>>>>>>
>>>>>> Linus
>>>>>>
>>>>> That's not trivial, and adds complexity. You basically need to
>>>>> look at
>>>>> the current, the next, and one more for this, instead of just the
>>>>> current char.
>>>>>
>>>>>
>>>> Actually it not that bad.
>>>>
>>>> Pseudo code:
>>>>
>>>> get current
>>>> get next
>>>> while (current != null && next != null && current == '0' && next is a
>>>> number)
>>>> {
>>>> current = next
>>>> next = get next
>>>> }
>>>>
>>>>
>>>>
>>> Now imagine this for every char in a string, and for every string in a
>>> file list (with some 100 files). It's three-times (or even more) more
>>> complexity than just.
>>> while (is_zero(a))
>>> a = next;
>>>
>>> We're on embedded, and thus slow systems. Your would surely work well on
>>> a desktop app, but for mp3-players we need fast and small code. The gain
>>> has to justify the code, and I don't think it does it in this example.
>>>
>>>
>>
>> What about something like this. Taking in consideration the isspace
>> function/comparison was removed? And isdigit is supposed to give nonzero
>> on nodigit values.
>>
>> /* skip over leading zeros */
>> while ('0' == ca && nat_isdigit(ca_next) )
>> {
>> ca = to_int(a[++ai]);
>> ca_next = to_int(a[ai+1]);
>> }
>>
>>
>>
> I've found a simpler solution for this. Trying the code raises the
> following problem:
>
> 00 < 0b < 01 < 1

That look right. Zero is a valid number. A leading zero before a zero is
still zero.

00 -> 0
0b -> 0b
01 -> 1
1 -> 1

01 == 1
strcmp -> 01 < 1

right?

>
> Zeros before except the final zeros are ignored, and the final zero
> before characters is not ignored. But the leading zeros of numbers are
> (so that 01 is 1). Obviously 0 sorts before 1.
>
Received on 2009-03-19


Page was last modified "Jan 10 2012" The Rockbox Crew
aaa