summaryrefslogtreecommitdiff
path: root/lib/mpsort.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-01-20 10:55:18 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-01-20 10:55:18 +0000
commit70e9163c9c18e995515598085cb824e554eb7ae7 (patch)
treea42dc8b2a6c031354bf31472de888bfc8a060132 /lib/mpsort.c
parentcbf5993c43f49281173f185863577d86bfac6eae (diff)
downloadcoreutils-tarball-70e9163c9c18e995515598085cb824e554eb7ae7.tar.gz
Diffstat (limited to 'lib/mpsort.c')
-rw-r--r--lib/mpsort.c111
1 files changed, 55 insertions, 56 deletions
diff --git a/lib/mpsort.c b/lib/mpsort.c
index d6b1e0e..eba13e2 100644
--- a/lib/mpsort.c
+++ b/lib/mpsort.c
@@ -1,20 +1,19 @@
/* Sort a vector of pointers to data.
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007, 2009-2016 Free Software Foundation, Inc.
- This program is free software; you can redistribute it and/or modify
+ This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
@@ -29,15 +28,15 @@
typedef int (*comparison_function) (void const *, void const *);
static void mpsort_with_tmp (void const **restrict, size_t,
- void const **restrict, comparison_function);
+ void const **restrict, comparison_function);
/* Sort a vector BASE containing N pointers, placing the sorted array
into TMP. Compare pointers with CMP. N must be at least 2. */
static void
mpsort_into_tmp (void const **restrict base, size_t n,
- void const **restrict tmp,
- comparison_function cmp)
+ void const **restrict tmp,
+ comparison_function cmp)
{
size_t n1 = n / 2;
size_t n2 = n - n1;
@@ -57,23 +56,23 @@ mpsort_into_tmp (void const **restrict base, size_t n,
for (;;)
if (cmp (ba, bb) <= 0)
{
- *tmp++ = ba;
- a++;
- if (a == alim)
- {
- a = b;
- alim = blim;
- break;
- }
- ba = base[a];
+ *tmp++ = ba;
+ a++;
+ if (a == alim)
+ {
+ a = b;
+ alim = blim;
+ break;
+ }
+ ba = base[a];
}
else
{
- *tmp++ = bb;
- b++;
- if (b == blim)
- break;
- bb = base[b];
+ *tmp++ = bb;
+ b++;
+ if (b == blim)
+ break;
+ bb = base[b];
}
memcpy (tmp, base + a, (alim - a) * sizeof *base);
@@ -85,21 +84,21 @@ mpsort_into_tmp (void const **restrict base, size_t n,
static void
mpsort_with_tmp (void const **restrict base, size_t n,
- void const **restrict tmp,
- comparison_function cmp)
+ void const **restrict tmp,
+ comparison_function cmp)
{
if (n <= 2)
{
if (n == 2)
- {
- void const *p0 = base[0];
- void const *p1 = base[1];
- if (! (cmp (p0, p1) <= 0))
- {
- base[0] = p1;
- base[1] = p0;
- }
- }
+ {
+ void const *p0 = base[0];
+ void const *p1 = base[1];
+ if (! (cmp (p0, p1) <= 0))
+ {
+ base[0] = p1;
+ base[1] = p0;
+ }
+ }
}
else
{
@@ -116,33 +115,33 @@ mpsort_with_tmp (void const **restrict base, size_t n,
mpsort_with_tmp (base + n1, n2, tmp, cmp);
if (n1 < 2)
- tmp[0] = base[0];
+ tmp[0] = base[0];
else
- mpsort_into_tmp (base, n1, tmp, cmp);
+ mpsort_into_tmp (base, n1, tmp, cmp);
tt = tmp[t];
bb = base[b];
for (i = 0; ; )
- if (cmp (tt, bb) <= 0)
- {
- base[i++] = tt;
- t++;
- if (t == tlim)
- break;
- tt = tmp[t];
- }
- else
- {
- base[i++] = bb;
- b++;
- if (b == blim)
- {
- memcpy (base + i, tmp + t, (tlim - t) * sizeof *base);
- break;
- }
- bb = base[b];
- }
+ if (cmp (tt, bb) <= 0)
+ {
+ base[i++] = tt;
+ t++;
+ if (t == tlim)
+ break;
+ tt = tmp[t];
+ }
+ else
+ {
+ base[i++] = bb;
+ b++;
+ if (b == blim)
+ {
+ memcpy (base + i, tmp + t, (tlim - t) * sizeof *base);
+ break;
+ }
+ bb = base[b];
+ }
}
}