xref: /petsc/src/sys/ftn-custom/zsys.c (revision bf34bf4242d05e27d41e6f1f6ce946c2f9515e6e)
1ae4341f3SSatish Balay 
2ae4341f3SSatish Balay #include "zpetsc.h"
3ae4341f3SSatish Balay #include "petscsys.h"
4ae4341f3SSatish Balay 
5ae4341f3SSatish Balay #ifdef PETSC_HAVE_FORTRAN_CAPS
6ae4341f3SSatish Balay #define chkmemfortran_             CHKMEMFORTRAN
7ae4341f3SSatish Balay #define petscoffsetfortran_        PETSCOFFSETFORTRAN
8ae4341f3SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
9ae4341f3SSatish Balay #define petscoffsetfortran_        petscoffsetfortran
10ae4341f3SSatish Balay #define chkmemfortran_             chkmemfortran
11*bf34bf42SBarry Smith #define flush__                     flush_
12ae4341f3SSatish Balay #endif
13ae4341f3SSatish Balay 
14ae4341f3SSatish Balay EXTERN_C_BEGIN
15ae4341f3SSatish Balay 
16*bf34bf42SBarry Smith #if defined(PETSC_MISSING_FORTRAN_FLUSH_)
17*bf34bf42SBarry Smith void flush__(int unit)
18*bf34bf42SBarry Smith {
19*bf34bf42SBarry Smith }
20*bf34bf42SBarry Smith #endif
21*bf34bf42SBarry Smith 
22*bf34bf42SBarry Smith 
23c74decddSSatish Balay void PETSC_STDCALL petscoffsetfortran_(PetscScalar *x,PetscScalar *y,size_t *shift,PetscErrorCode *ierr)
24ae4341f3SSatish Balay {
25ae4341f3SSatish Balay   *ierr = 0;
26ae4341f3SSatish Balay   *shift = y - x;
27ae4341f3SSatish Balay }
28ae4341f3SSatish Balay 
29ae4341f3SSatish Balay /* ---------------------------------------------------------------------------------*/
30ae4341f3SSatish Balay /*
31ae4341f3SSatish Balay         This version does not do a malloc
32ae4341f3SSatish Balay */
33ae4341f3SSatish Balay static char FIXCHARSTRING[1024];
34ae4341f3SSatish Balay #if defined(PETSC_USES_CPTOFCD)
35ae4341f3SSatish Balay #include <fortran.h>
36ae4341f3SSatish Balay 
37ae4341f3SSatish Balay #define CHAR _fcd
38ae4341f3SSatish Balay #define FIXCHARNOMALLOC(a,n,b) \
39ae4341f3SSatish Balay { \
40ae4341f3SSatish Balay   b = _fcdtocp(a); \
41ae4341f3SSatish Balay   n = _fcdlen (a); \
42ae4341f3SSatish Balay   if (b == PETSC_NULL_CHARACTER_Fortran) { \
43ae4341f3SSatish Balay       b = 0; \
44ae4341f3SSatish Balay   } else {  \
45ae4341f3SSatish Balay     while((n > 0) && (b[n-1] == ' ')) n--; \
46ae4341f3SSatish Balay     b = FIXCHARSTRING; \
47ae4341f3SSatish Balay     *ierr = PetscStrncpy(b,_fcdtocp(a),n); \
48ae4341f3SSatish Balay     if (*ierr) return; \
49ae4341f3SSatish Balay     b[n] = 0; \
50ae4341f3SSatish Balay   } \
51ae4341f3SSatish Balay }
52ae4341f3SSatish Balay 
53ae4341f3SSatish Balay #else
54ae4341f3SSatish Balay 
55ae4341f3SSatish Balay #define CHAR char*
56ae4341f3SSatish Balay #define FIXCHARNOMALLOC(a,n,b) \
57ae4341f3SSatish Balay {\
58ae4341f3SSatish Balay   if (a == PETSC_NULL_CHARACTER_Fortran) { \
59ae4341f3SSatish Balay     b = a = 0; \
60ae4341f3SSatish Balay   } else { \
61ae4341f3SSatish Balay     while((n > 0) && (a[n-1] == ' ')) n--; \
62ae4341f3SSatish Balay     if (a[n] != 0) { \
63ae4341f3SSatish Balay       b = FIXCHARSTRING; \
64ae4341f3SSatish Balay       *ierr = PetscStrncpy(b,a,n); \
65ae4341f3SSatish Balay       if (*ierr) return; \
66ae4341f3SSatish Balay       b[n] = 0; \
67ae4341f3SSatish Balay     } else b = a;\
68ae4341f3SSatish Balay   } \
69ae4341f3SSatish Balay }
70ae4341f3SSatish Balay 
71ae4341f3SSatish Balay #endif
72ae4341f3SSatish Balay 
73ae4341f3SSatish Balay void PETSC_STDCALL chkmemfortran_(int *line,CHAR file PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
74ae4341f3SSatish Balay {
75ae4341f3SSatish Balay   char *c1;
76ae4341f3SSatish Balay 
77ae4341f3SSatish Balay   FIXCHARNOMALLOC(file,len,c1);
78ae4341f3SSatish Balay   *ierr = PetscMallocValidate(*line,"Userfunction",c1," ");
79ae4341f3SSatish Balay }
80ae4341f3SSatish Balay 
81ae4341f3SSatish Balay 
82ae4341f3SSatish Balay EXTERN_C_END
83ae4341f3SSatish Balay 
84ae4341f3SSatish Balay 
85