aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/mingw/ChangeLog15
-rw-r--r--winsup/mingw/Makefile.in6
-rw-r--r--winsup/mingw/binmode.c5
-rw-r--r--winsup/mingw/crt1.c17
-rw-r--r--winsup/mingw/samples/fmode/jamfile2
-rw-r--r--winsup/mingw/samples/fmode/test2.c37
-rw-r--r--winsup/mingw/txtmode.c7
7 files changed, 82 insertions, 7 deletions
diff --git a/winsup/mingw/ChangeLog b/winsup/mingw/ChangeLog
index 9808a1f..33f053b 100644
--- a/winsup/mingw/ChangeLog
+++ b/winsup/mingw/ChangeLog
@@ -1,3 +1,18 @@
+2002-10-19 Danny Smith <dannysmith@users.sourceforge.net>
+
+ * Makefile.in (CRT0S): Add txtmode.o binmode.o.
+ (MINGW_OBJS): Add txtmode.o.
+ (SRCDIST_FILES): Add txtmode.c binmode.c.
+ crt1.c: Don't include fcntrl.h, stdlib.h.
+ (_fmode): Declare, without dllimport attribute.
+ (__p__fmode): Declare access function for dll's _fmode.
+ (_mingw32_init_fmode): Sync dll _fmode with staticly linked
+ _fmode for app.
+ * txtmode.c: New file.
+ * binmode.c: New file.
+ * samples/fmode/test2.c: New file.
+ * samples/fmode/jamfile: Add test2.exe target.
+
2002-10-11 Danny Smith <dannysmith@users.sourceforge.net>
* include/stdint.h (INT64_C, UINT64_C ): Append suffix to let
diff --git a/winsup/mingw/Makefile.in b/winsup/mingw/Makefile.in
index 332fb17..f2e5d25 100644
--- a/winsup/mingw/Makefile.in
+++ b/winsup/mingw/Makefile.in
@@ -148,9 +148,9 @@ FLAGS_TO_PASS:=\
TARFILEEXT="$(TARFILEEXT)"
CRT0S = crt1.o dllcrt1.o crt2.o dllcrt2.o CRT_noglob.o crtmt.o crtst.o \
- CRT_fp8.o CRT_fp10.o
+ CRT_fp8.o CRT_fp10.o txtmode.o binmode.o
MINGW_OBJS = CRTglob.o CRTfmode.o CRTinit.o dllmain.o gccmain.o \
- main.o crtst.o mthr_stub.o CRT_fp10.o
+ main.o crtst.o mthr_stub.o CRT_fp10.o txtmode.o
MOLD_OBJS = ctype_old.o string_old.o
LIBS = libcrtdll.a libmsvcrt.a libmsvcrt20.a libmsvcrt40.a libmingw32.a \
@@ -164,7 +164,7 @@ crt1.c crtdll.def crtmt.c crtst.c ctype_old.c dllcrt1.c dllmain.c \
gccmain.c init.c install-sh jamfile main.c mkinstalldirs moldname-crtdll.def \
moldname-msvcrt.def moldname.def moldname.def.in msvcrt.def msvcrt20.def \
msvcrt40.def mthr.c mthr_init.c mthr_stub.c readme.txt string_old.c \
-CRT_fp8.c CRT_fp10.c test_headers.c
+CRT_fp8.c CRT_fp10.c test_headers.c txtmode.c binmode.c
all_dlls_host = @all_dlls_host@
install_dlls_host = @install_dlls_host@
diff --git a/winsup/mingw/binmode.c b/winsup/mingw/binmode.c
new file mode 100644
index 0000000..1cc3ded
--- /dev/null
+++ b/winsup/mingw/binmode.c
@@ -0,0 +1,5 @@
+#include <fcntl.h>
+
+/* Set default file mode to binary */
+
+int _fmode = _O_BINARY;
diff --git a/winsup/mingw/crt1.c b/winsup/mingw/crt1.c
index 07aa9c5..40c8d46 100644
--- a/winsup/mingw/crt1.c
+++ b/winsup/mingw/crt1.c
@@ -26,10 +26,8 @@
*
*/
-#include <stdlib.h>
#include <stdio.h>
#include <io.h>
-#include <fcntl.h>
#include <process.h>
#include <float.h>
#include <windows.h>
@@ -55,6 +53,12 @@ extern int main (int, char **, char **);
__MINGW_IMPORT void __set_app_type(int);
#endif /* __MSVCRT__ */
+/* Global _fmode for this .exe, not the one in msvcrt.dll,
+ The default is set in txtmode.o in libmingw32.a */
+#undef _fmode
+extern int _fmode;
+extern int* __p__fmode(void); /* To access the dll _fmode */
+
/*
* Setup the default file handles to have the _CRT_fmode mode, as well as
* any new files created by the user.
@@ -89,6 +93,10 @@ _mingw32_init_fmode ()
_setmode (_fileno (stderr), _CRT_fmode);
}
}
+
+ /* Now sync the dll _fmode to the one for this .exe. */
+ *__p__fmode() = _fmode;
+
}
/* This function will be called when a trap occurs. Thanks to Jacob
@@ -180,8 +188,9 @@ __mingw_CRTStartup ()
_mingw32_init_mainargs ();
/*
- * Sets the default file mode for stdin, stdout and stderr, as well
- * as files later opened by the user, to _CRT_fmode.
+ * Sets the default file mode.
+ * If _CRT_fmode is set, also set mode for stdin, stdout
+ * and stderr, as well
* NOTE: DLLs don't do this because that would be rude!
*/
_mingw32_init_fmode ();
diff --git a/winsup/mingw/samples/fmode/jamfile b/winsup/mingw/samples/fmode/jamfile
index 33455ec..5b7a1cb 100644
--- a/winsup/mingw/samples/fmode/jamfile
+++ b/winsup/mingw/samples/fmode/jamfile
@@ -1,5 +1,7 @@
Main test.exe : test.c ;
+Main test2.exe : test2.c ;
+
Main all.exe : all.c ;
diff --git a/winsup/mingw/samples/fmode/test2.c b/winsup/mingw/samples/fmode/test2.c
new file mode 100644
index 0000000..b7d6b18
--- /dev/null
+++ b/winsup/mingw/samples/fmode/test2.c
@@ -0,0 +1,37 @@
+/*
+ * A sample program demonstrating how to use fmode to change the default
+ * file opening mode to binary. Compare this file, which sets _fmode
+ * at file level to test.c, which sets the dll variable directly within
+ * main.
+ * NOTE: Does not change stdin, stdout or stderr.
+ *
+ * THIS CODE IS IN THE PUBLIC DOMAIN.
+ *
+ * Colin Peters <colin@fu.is.saga-u.ac.jp>
+ * Danny Smith <dannysmith@users.sourceforge.net>
+ */
+
+#include <stdio.h>
+#include <stdlib.h> /* _fmode */
+#include <fcntl.h> /* _O_BINARY */
+
+#undef _fmode
+int _fmode = _O_BINARY;
+
+main ()
+{
+
+ char* sz = "This is line one.\nThis is line two.\n";
+ FILE* fp;
+
+ printf (sz);
+
+ /* Note how this fopen does NOT indicate "wb" to open the file in
+ * binary mode. */
+ fp = fopen ("test2.out", "w");
+
+ fprintf (fp, sz);
+
+ fclose (fp);
+}
+
diff --git a/winsup/mingw/txtmode.c b/winsup/mingw/txtmode.c
new file mode 100644
index 0000000..0771746
--- /dev/null
+++ b/winsup/mingw/txtmode.c
@@ -0,0 +1,7 @@
+#include <fcntl.h>
+
+/* Set default file mode to text */
+
+/* Is this correct? Default value of _fmode in msvcrt.dll is 0. */
+
+int _fmode = _O_TEXT;