Author: sebor
Date: Wed Apr 9 15:24:29 2008
New Revision: 646568
URL: http://svn.apache.org/viewvc?rev=646568&view=rev
Log:
2008-04-09 Martin Sebor <[EMAIL PROTECTED]>
STDCXX-849
* src/file.cpp [_RWSTD_EDG_ECCP] (stderr, stdin, stdout): Undefined
macros #defined to __rw_stderr, __rw_stdin, and __rw_stdout in our
<stdio.h> to prevent self-initialization to 0 and defined them as
appropriate for Linux and Solaris instead.
Modified:
stdcxx/trunk/src/file.cpp
Modified: stdcxx/trunk/src/file.cpp
URL:
http://svn.apache.org/viewvc/stdcxx/trunk/src/file.cpp?rev=646568&r1=646567&r2=646568&view=diff
==============================================================================
--- stdcxx/trunk/src/file.cpp (original)
+++ stdcxx/trunk/src/file.cpp Wed Apr 9 15:24:29 2008
@@ -22,7 +22,7 @@
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
- * Copyright 2002-2005, 2007 Rogue Wave Software, Inc.
+ * Copyright 2002-2008 Rogue Wave Software, Inc.
*
**************************************************************************/
@@ -112,11 +112,6 @@
#endif
-FILE* __rw_stderr = stderr;
-FILE* __rw_stdin = stdin;
-FILE* __rw_stdout = stdout;
-
-
static const int __rw_io_modes [] = {
/* 0 */ -1,
/* 1 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY,
@@ -572,5 +567,63 @@
return 0;
}
+
+#ifdef _RWSTD_EDG_ECCP
+
+ // undefine macros that expand to __rw_stderr et al
+ // before initializing the globals to their values
+# undef stderr
+# undef stdin
+# undef stdout
+
+extern "C" {
+
+# ifdef _RWSTD_OS_LINUX
+
+// Linux glibc defines stdin, stdout, and stderr as global objects
+// of type _IO_FILE but we fake the type using FILEs (it doesn't
+// matter since the type isn't mangled into object names)
+extern FILE *stdin;
+extern FILE *stdout;
+extern FILE *stderr;
+
+# elif defined (_RWSTD_OS_SUNOS)
+
+// define a type that's as big as SunOS __FILE
+typedef struct _RW_Sun_FILE {
+
+# if 8 == _RWSTD_LONG_SIZE
+
+ int fill [4]; // 16 bytes
+
+# else // if (ILP32)
+
+ long fill [16]; // 128 bytes
+
+# endif // LP64/ILP32
+
+} __FILE;
+
+
+// Solaris file array
+extern struct __FILE __iob [FOPEN_MAX];
+
+# define stderr (FILE*)(__iob + 0)
+# define stdin (FILE*)(__iob + 1)
+# define stdout (FILE*)(__iob + 2)
+
+# elif defined (_RWSTD_OS_WINDOWS)
+# error "need stderr, stdin, and stdout"
+# elsr
+# error "need stderr, stdin, and stdout"
+# endif
+
+} // extern "C"
+
+#endif // vanilla EDG eccp
+
+FILE* __rw_stderr = stderr;
+FILE* __rw_stdin = stdin;
+FILE* __rw_stdout = stdout;
} // namespace __rw