| Bill Allombert on Thu, 17 Nov 2016 14:56:21 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Windows gp64 writebin creates unreadable file for \p174 |
On Fri, Nov 04, 2016 at 03:55:39PM +0100, Bill Allombert wrote: > The issue is that fread is doing some CR/LF conversion. > We should use fopen(,"rb"). > The attached patch seems to fix this bug. > Maybe there is a better place to set the b flag. I did another patch which avoid to break readstr. Cheers, Bill.
commit 1f4f0c64ecccef331858bd1b9bde33839de3b400
Author: Bill Allombert <Bill.Allombert@math.u-bordeaux1.fr>
Date: Mon Nov 7 17:36:47 2016 +0100
writebin, file_is_binary: use fopen mode "b" for windows support
diff --git a/src/language/es.c b/src/language/es.c
index 0a28371..7a1d509 100644
--- a/src/language/es.c
+++ b/src/language/es.c
@@ -20,6 +20,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
#include "../systems/mingw/pwinver.h"
#include <windows.h>
#include <process.h> /* for getpid */
+#include <fcntl.h>
+#include <io.h> /* for setmode */
#include "../systems/mingw/mingw.h"
#endif
#ifdef __EMSCRIPTEN__
@@ -4405,13 +4407,17 @@ int
file_is_binary(FILE *f)
{
int c = fgetc(f); ungetc(c,f);
- return (c != EOF && isprint(c) == 0 && isspace(c) == 0);
+ int r = (c != EOF && isprint(c) == 0 && isspace(c) == 0);
+#ifdef _WIN32
+ if (r) { setmode(fileno(f), _O_BINARY); rewind(f); }
+#endif
+ return r;
}
void
writebin(const char *name, GEN x)
{
- FILE *f = fopen(name,"r");
+ FILE *f = fopen(name,"rb");
pari_sp av = avma;
GEN V;
int already = f? 1: 0;
@@ -4421,7 +4427,7 @@ writebin(const char *name, GEN x)
fclose(f);
if (!ok) pari_err_FILE("binary output file",name);
}
- f = fopen(name,"a");
+ f = fopen(name,"ab");
if (!f) pari_err_FILE("binary output file",name);
if (!already) write_magic(f);