diff options
Diffstat (limited to 'src/IEEEIO.cc')
-rw-r--r-- | src/IEEEIO.cc | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/IEEEIO.cc b/src/IEEEIO.cc index a71e381..c36751e 100644 --- a/src/IEEEIO.cc +++ b/src/IEEEIO.cc @@ -5,7 +5,7 @@ #ifdef WIN32 // Are we Microsoft VC++ 5.0 or 6.0? -#if defined(_MSC_VER) && ( (_MSC_VER == 1100) || (_MSC_VER == 1200) ) // yes we are +#if defined(_MSC_VER) && ( (_MSC_VER == 1100) || (_MSC_VER == 1200) || (_MSC_VER == 1300)) // yes we are #include <fcntl.h> #ifdef O_RDONLY #undef O_RDONLY @@ -1374,19 +1374,44 @@ Long8 f_ieee_open (char *file,char *accessname,int flen,int alen){ return 0; } +/* + Fortran passes strings without 0-bytes. + C requires a 0-byte at the end of a string. + We may not modify the passed string, because it + might reside in a read only text segment, thus + we need a local copy to append a 0-byte. + Performance is not an issue here, because file access + is much slower than this little memory shifting anyway. + */ + Long8 f_ieee_openr(char *filename,int namelen){ - filename[namelen]='\0'; - return (Long8)(new IEEEIO(filename,IObase::Read)); + +char*fn = new char[namelen+1]; + strncpy(fn, filename, namelen); + fn[namelen]='\0'; +Long8 ID = (Long8)(new IEEEIO(filename,IObase::Read)); + delete fn; + return ID; } Long8 f_ieee_openw(char *filename,int namelen){ - filename[namelen]='\0'; - return (Long8)(new IEEEIO(filename,IObase::Write)); + +char*fn = new char[namelen+1]; + strncpy(fn, filename, namelen); + fn[namelen]='\0'; +Long8 ID = (Long8)(new IEEEIO(filename,IObase::Write)); + delete fn; + return ID; } Long8 f_ieee_opena(char *filename,int namelen){ - filename[namelen]='\0'; - return (Long8)(new IEEEIO(filename,IObase::Append)); + +char*fn = new char[namelen+1]; + strncpy(fn, filename, namelen); + fn[namelen]='\0'; +Long8 ID = (Long8)(new IEEEIO(filename,IObase::Append)); + delete fn; + return ID; } void ieee_bufon(Long8 *fileID,int bufsize){ |