#include <petsc/private/ftnimpl.h>

#if defined(PETSC_HAVE_FORTRAN_CAPS)
  #define petscfopen_  PETSCFOPEN
  #define petscfclose_ PETSCFCLOSE
#elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
  #define petscfopen_  petscfopen
  #define petscfclose_ petscfclose
#endif

#if defined(__cplusplus)
extern "C" {
#endif

PETSC_EXTERN void petscfopen_(MPI_Comm *comm, char *fname, char *fmode, FILE **file, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len1, PETSC_FORTRAN_CHARLEN_T len2)
{
  char *c1, *c2;

  FIXCHAR(fname, len1, c1);
  FIXCHAR(fmode, len2, c2);
  *ierr = PetscFOpen(MPI_Comm_f2c(*(MPI_Fint *)&*comm), c1, c2, file);
  if (*ierr) return;
  FREECHAR(fname, c1);
  FREECHAR(fmode, c2);
}

PETSC_EXTERN void petscfclose_(MPI_Comm *comm, FILE **file, PetscErrorCode *ierr)
{
  *ierr = PetscFClose(MPI_Comm_f2c(*(MPI_Fint *)&*comm), *file);
}

#if defined(__cplusplus)
}
#endif
