1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                  Common Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*            http://www.opensource.org/licenses/cpl1.0.txt             *
11*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23/*
24 *  strsort - sort an array pointers using fn
25 *
26 *	fn follows strcmp(3) conventions
27 *
28 *   David Korn
29 *   AT&T Bell Laboratories
30 *
31 *  derived from Bourne Shell
32 */
33
34#include <ast.h>
35
36void
37strsort(char** argv, int n, int(*fn)(const char*, const char*))
38{
39	register int 	i;
40	register int 	j;
41	register int 	m;
42	register char**	ap;
43	char*		s;
44	int 		k;
45
46	for (j = 1; j <= n; j *= 2);
47	for (m = 2 * j - 1; m /= 2;)
48		for (j = 0, k = n - m; j < k; j++)
49			for (i = j; i >= 0; i -= m)
50			{
51				ap = &argv[i];
52				if ((*fn)(ap[m], ap[0]) >= 0) break;
53				s = ap[m];
54				ap[m] = ap[0];
55				ap[0] = s;
56			}
57}
58