xref: /petsc/src/sys/ftn-custom/zsys.c (revision fbf9dbe564678ed6eff1806adbc4c4f01b9743f4)
1 
2 #include <petsc/private/fortranimpl.h>
3 
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5   #define chkmemfortran_            CHKMEMFORTRAN
6   #define petscoffsetfortran_       PETSCOFFSETFORTRAN
7   #define petscobjectstateincrease_ PETSCOBJECTSTATEINCREASE
8 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
9   #define petscoffsetfortran_       petscoffsetfortran
10   #define chkmemfortran_            chkmemfortran
11   #define flush__                   flush_
12   #define petscobjectstateincrease_ petscobjectstateincrease
13 #endif
14 
15 PETSC_EXTERN void petscobjectstateincrease_(PetscObject *obj, PetscErrorCode *ierr)
16 {
17   *ierr = PetscObjectStateIncrease(*obj);
18 }
19 
20 #if defined(PETSC_MISSING_FORTRAN_FLUSH_)
21 void flush__(int unit) { }
22 #endif
23 
24 PETSC_EXTERN void petscoffsetfortran_(PetscScalar *x, PetscScalar *y, size_t *shift, PetscErrorCode *ierr)
25 {
26   *ierr  = PETSC_SUCCESS;
27   *shift = y - x;
28 }
29 
30 /* ---------------------------------------------------------------------------------*/
31 /*
32         This version does not do a malloc
33 */
34 static char FIXCHARSTRING[1024];
35 
36 #define FIXCHARNOMALLOC(a, n, b) \
37   { \
38     if (a == PETSC_NULL_CHARACTER_Fortran) { \
39       b = a = 0; \
40     } else { \
41       while ((n > 0) && (a[n - 1] == ' ')) n--; \
42       if (a[n] != 0) { \
43         b     = FIXCHARSTRING; \
44         *ierr = PetscStrncpy(b, a, n + 1); \
45         if (*ierr) return; \
46       } else b = a; \
47     } \
48   }
49 
50 PETSC_EXTERN void chkmemfortran_(int *line, char *file, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
51 {
52   char *c1;
53 
54   FIXCHARNOMALLOC(file, len, c1);
55   *ierr = PetscMallocValidate(*line, "Userfunction", c1);
56 }
57