aboutsummaryrefslogtreecommitdiff
path: root/src/IEEEIO.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/IEEEIO.cc')
-rw-r--r--src/IEEEIO.cc39
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){