diff options
Diffstat (limited to 'src/backend/lib/lispsort.c')
-rw-r--r-- | src/backend/lib/lispsort.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/backend/lib/lispsort.c b/src/backend/lib/lispsort.c new file mode 100644 index 00000000000..0cf49bf0c0b --- /dev/null +++ b/src/backend/lib/lispsort.c @@ -0,0 +1,56 @@ +/*------------------------------------------------------------------------- + * + * lispsort.c-- + * + * Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/lib/Attic/lispsort.c,v 1.1.1.1 1996/07/09 06:21:29 scrappy Exp $ + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" +#include "nodes/pg_list.h" +#include "nodes/primnodes.h" +#include "nodes/plannodes.h" +#include "nodes/relation.h" +#include "lib/lispsort.h" +#include "utils/palloc.h" +#include "lib/qsort.h" + +/* +** lisp_qsort: Takes a lisp list as input, copies it into an array of lisp +** nodes which it sorts via qsort() with the comparison function +** as passed into lisp_qsort(), and returns a new list with +** the nodes sorted. The old list is *not* freed or modified (?) +*/ +List *lisp_qsort(List *the_list, /* the list to be sorted */ + int (*compare)()) /* function to compare two nodes */ +{ + int i; + size_t num; + List **nodearray; + List *tmp, *output; + + /* find size of list */ + num = length(the_list); + if (num < 2) + return(copyObject(the_list)); + + /* copy elements of the list into an array */ + nodearray = (List **) palloc(num * sizeof(List *)); + + for (tmp = the_list, i = 0; tmp != NIL; tmp = lnext(tmp), i++) + nodearray[i] = copyObject(lfirst(tmp)); + + /* sort the array */ + pg_qsort(nodearray, num, sizeof(List *), compare); + + /* lcons together the array elements */ + output = NIL; + for (i = num - 1; i >= 0; i--) + output = lcons(nodearray[i], output); + + return(output); +} |