xref: /petsc/src/sys/utils/ftn-custom/zsortsof.c (revision 4d3610e326ff6ba11b121cb0a8ecfba2b4024273)
1*4d3610e3SJacob Faibussowitsch #include <petsc/private/fortranimpl.h>
2*4d3610e3SJacob Faibussowitsch #include <petscsys.h>
3*4d3610e3SJacob Faibussowitsch 
4*4d3610e3SJacob Faibussowitsch #if defined(PETSC_HAVE_FORTRAN_CAPS)
5*4d3610e3SJacob Faibussowitsch #define petsctimsort_          PETSCTIMSORT
6*4d3610e3SJacob Faibussowitsch #define petsctimsortwitharray_ PETSCTIMSORTWITHARRAY
7*4d3610e3SJacob Faibussowitsch #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
8*4d3610e3SJacob Faibussowitsch #define petsctimsort_          petsctimsort
9*4d3610e3SJacob Faibussowitsch #define petsctimsortwitharray_ petsctimsortwitharray
10*4d3610e3SJacob Faibussowitsch #endif
11*4d3610e3SJacob Faibussowitsch 
12*4d3610e3SJacob Faibussowitsch struct fc_c {
13*4d3610e3SJacob Faibussowitsch   void (*fcmp)(const void *a, const void *b, void *c, int *res);
14*4d3610e3SJacob Faibussowitsch   void *fctx;
15*4d3610e3SJacob Faibussowitsch } fc_c;
16*4d3610e3SJacob Faibussowitsch 
17*4d3610e3SJacob Faibussowitsch int cmp_via_fortran(const void *a, const void *b, void *ctx)
18*4d3610e3SJacob Faibussowitsch {
19*4d3610e3SJacob Faibussowitsch   int result;
20*4d3610e3SJacob Faibussowitsch   struct fc_c *fc = (struct fc_c *)ctx;
21*4d3610e3SJacob Faibussowitsch   fc->fcmp(a, b, fc->fctx, &result);
22*4d3610e3SJacob Faibussowitsch   return result;
23*4d3610e3SJacob Faibussowitsch }
24*4d3610e3SJacob Faibussowitsch 
25*4d3610e3SJacob Faibussowitsch PETSC_EXTERN void petsctimsort_(PetscInt *n, void *arr, size_t *size, void (*cmp)(const void *, const void *, void *, int *), void *ctx, PetscErrorCode *ierr)
26*4d3610e3SJacob Faibussowitsch {
27*4d3610e3SJacob Faibussowitsch   struct fc_c fc = {cmp, ctx};
28*4d3610e3SJacob Faibussowitsch   *ierr = PetscTimSort(*n,arr,*size,cmp_via_fortran,&fc);
29*4d3610e3SJacob Faibussowitsch }
30*4d3610e3SJacob Faibussowitsch 
31*4d3610e3SJacob Faibussowitsch PETSC_EXTERN void petsctimsortwitharray_(PetscInt *n, void *arr, size_t *asize, void *barr, size_t *bsize, void (*cmp)(const void *, const void *, void *, int *), void *ctx, PetscErrorCode *ierr)
32*4d3610e3SJacob Faibussowitsch {
33*4d3610e3SJacob Faibussowitsch   struct fc_c fc = {cmp, ctx};
34*4d3610e3SJacob Faibussowitsch   *ierr = PetscTimSortWithArray(*n,arr,*asize,barr,*bsize,cmp_via_fortran,&fc);
35*4d3610e3SJacob Faibussowitsch }
36