aboutsummaryrefslogtreecommitdiff
path: root/src/backend/lib/lispsort.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/lib/lispsort.c')
-rw-r--r--src/backend/lib/lispsort.c56
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);
+}