PetscPrintf/ifort 9.1

Leif Strand leif at geodynamics.org
Wed Aug 29 15:24:07 CDT 2007


Barry Smith wrote:
> On Wed, 29 Aug 2007, Leif Strand wrote:
>> (consider "\\n")

>    Actually this is not a problem, as was pointed out before the C compiler 
> replaces the \n with a single charactor (ASCII 10) so my simple search and 
> replace will never see the STRING "\n" when the Fortran compiler is gfortran
> so nothing will be done twice.

Again, consider "\\n".  With PetscFixSlashN(), you are trying to meet 
the expectations of C programmers.  So, let's say I write the C-ish 
quasi-Fortran code, 'call PetscPrintf("\\no")'.  As a C programmer, I 
might expect this to print:

\no

[Of course, if I had plenty of coffee this morning, I would know I was 
calling 'PetscPrintf' from Fortran, and therefore, I would not know what 
to expect in this case, but we've already covered that.]

Intel's ifort will leave "\\n" as "\\n", so PetscFixSlashN() will see 
"\\n" at runtime.  As of right now, PetscFixSlashN() code doesn't handle 
"\\" correctly, so it will munge it so that it becomes {'\\', '\n', 'o'} 
and will PETSc print

\
o

which is not what I intended.

If you beef-up PetscFixSlashN() so that it handles escaped-backslashes 
("\\"), you've "fixed" the 'ifort' case, but G95 is still broken.  G95 
will translate "\\no" to "\no" itself, at compile-time.  So 
PetscFixSlashN() will see "\no" at runtime, and behave as if I had 
written "\no" in my code:

[LF]
o

At runtime, you have no way of knowing whether the user's Fortran 
compiler did "\x" translation at compile-time, so you would need a 
'configure.py' test to check this -- and even then, PETSc would screw up 
in non-trivial cases (what if the string was generated?).

Better to do nothing than to have a half-baked implementation which 
satisfies users' faulty expectations.

--Leif




More information about the petsc-users mailing list