1 #include <petsc/private/ftnimpl.h> 2 #include <petscviewer.h> 3 4 #if defined(PETSC_HAVE_FORTRAN_CAPS) 5 #define petscviewerasciiprintf_ PETSCVIEWERASCIIPRINTF 6 #define petscviewerasciisynchronizedprintf_ PETSCVIEWERASCIISYNCHRONIZEDPRINTF 7 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 8 #define petscviewerasciiprintf_ petscviewerasciiprintf 9 #define petscviewerasciisynchronizedprintf_ petscviewerasciisynchronizedprintf 10 #endif 11 12 static PetscErrorCode PetscFixSlashN(const char *in, char **out) 13 { 14 PetscInt i; 15 size_t len; 16 17 PetscFunctionBegin; 18 PetscCall(PetscStrallocpy(in, out)); 19 PetscCall(PetscStrlen(*out, &len)); 20 for (i = 0; i < (int)len - 1; i++) { 21 if ((*out)[i] == '\\' && (*out)[i + 1] == 'n') { 22 (*out)[i] = ' '; 23 (*out)[i + 1] = '\n'; 24 } 25 } 26 PetscFunctionReturn(PETSC_SUCCESS); 27 } 28 29 PETSC_EXTERN void petscviewerasciiprintf_(PetscViewer *viewer, char *str, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len1) 30 { 31 char *c1, *tmp; 32 PetscViewer v; 33 34 PetscPatchDefaultViewers_Fortran(viewer, v); 35 FIXCHAR(str, len1, c1); 36 *ierr = PetscFixSlashN(c1, &tmp); 37 if (*ierr) return; 38 FREECHAR(str, c1); 39 *ierr = PetscViewerASCIIPrintf(v, "%s", tmp); 40 if (*ierr) return; 41 *ierr = PetscFree(tmp); 42 } 43 44 PETSC_EXTERN void petscviewerasciisynchronizedprintf_(PetscViewer *viewer, char *str, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len1) 45 { 46 char *c1, *tmp; 47 PetscViewer v; 48 49 PetscPatchDefaultViewers_Fortran(viewer, v); 50 FIXCHAR(str, len1, c1); 51 *ierr = PetscFixSlashN(c1, &tmp); 52 if (*ierr) return; 53 FREECHAR(str, c1); 54 *ierr = PetscViewerASCIISynchronizedPrintf(v, "%s", tmp); 55 if (*ierr) return; 56 *ierr = PetscFree(tmp); 57 } 58