| compare_vecs | copy_vec | merge_sort | merge_sort_recurse |
Ordertype compare_vecs(int *a, int *b, int n);
void copy_vec(int *a, int *b, int n);
void merge_sort(void *a[], /* array to sort */ int n, /* size of array */ Ordertype (*comp_proc) (void *, void *));This is a general-purpose sorting routine. You give it an array of pointers to sort, the size of the array, and a comparison function.
Here is an example of how to use it.
{
Term args[MAX_ACM_ARGS];
int n;
< set n and put the n terms you wish to sort into args[] >
merge_sort((void **) args, n, (Ordertype (*)(void*,void*)) term_compare_ncv);
< args[] is now ordered by term_compare_ncv() >
}
void merge_sort_recurse(void *a[], /* array to sort */ void *w[], /* work array */ int start, /* index of first element */ int end, /* index of last element */ Ordertype (*comp_proc) (void *, void *));This is the recursive part of a general-purpose merge sort. You won't ordinarily call this (use merge_sort instead). Use this only if you manage allocation of the work array.
Here is an example of how to use it.
{
Term args[MAX_ACM_ARGS], work[MAX_ACM_ARGS];
int n;
< put the n terms you wish to sort into args[] >
merge_sort_recurse((void **) args, (void **) work, 0, n-1,
(Ordertype (*)(void*,void*)) term_compare_ncv);
< args[] is now ordered by term_compare_ncv() >
}
/* basic order relations */
typedef enum { NOT_COMPARABLE,
SAME_AS,
LESS_THAN,
GREATER_THAN,
LESS_THAN_OR_SAME_AS,
GREATER_THAN_OR_SAME_AS,
NOT_LESS_THAN,
NOT_GREATER_THAN
} Ordertype;