changes for approval, part three (solaris)

Phil Edwards pedwards@disaster.jaj.com
Sat Oct 21 20:23:00 GMT 2000


And these are patches needed to build under Solaris 8, which is currently
bundled in with the Sol 7 configuration.  N.B.:  These assume that the
previous patches have already been applied, as far as line numbers go.

Rationale for the non-obvious stuff:

1)  The system headers also define a __mbstate_t type.  No matter how
    the include paths are re-arranged, or what workaround cheats we hack
    in os_defines, their definition and libio's WILL collide.  And the
    funny part is that it's nobody's "fault," since they are just as much
    implementors as we are, and can use the reserved-to-the-implementation
    names just as we can.

    I have renamed __mbstate_t to __gnu_mbstate_t everywhere that I can
    find it.  Ulrich, Benjamin, will this cause breakage on glibc-based
    systems?  (I expect it will.)  We can add a typedef/#define in Linux's
    os_defines to restore the current behavior.  And maybe newlib as well?

2)  A whole bunch of stuff in iofwide.c is needed when wchar is on.
    I have added that file to LIBIO_WSRCS based on the logic in acinclude.m4,
    and also left it in LIBIO_XTRASRCS.  On systems where both are needed,
    the duplicate entry shouldn't cause make(1) any confusion.



2000-10-21  Phil Edwards  <pme@sources.redhat.com>

	* configure.in:  Check for gconv.h.
	* libio/wfileops.c:  Wrap gconv.h in HAVE_GCONV_H.

	* config/c_io_libio_codecvt.c:  Change __mbstate_t to __gnu_mbstate_t.
	* libio/_G_config.h:  And here.
	* libio/iofwide.c:  And here.
	* libio/libio.h:  And here.

	* config/os/solaris/solaris2.7/bits/ctype_noninline.h:  Remove
	  exception specification to match declaration.
	* config/os/solaris/solaris2.7/bits/os_defines.h:  Add the typedefs
	  and definitions necessary to build with glibc/libio.
	* include/bits/locale_facets.tcc:  Include bits/std_clocale.h.

	* libio/Makefile.am (LIBIO_WSRCS):  Add iofwide.c (needed when
	  wide characters are in use).  Leave entry in LIBIO_XTRASRCS for now.



Index: configure.in
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/configure.in,v
retrieving revision 1.24
diff -u -3 -r1.24 configure.in
--- configure.in	2000/10/21 19:40:17	1.24
+++ configure.in	2000/10/22 02:57:50
@@ -134,6 +135,7 @@
   GLIBCPP_CHECK_CTYPE
 
   AC_FUNC_MMAP
+  AC_CHECK_HEADERS(gconv.h)
 fi
 
 AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes)
Index: config/c_io_libio_codecvt.c
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/config/c_io_libio_codecvt.c,v
retrieving revision 1.1
diff -u -3 -r1.1 c_io_libio_codecvt.c
--- c_io_libio_codecvt.c	2000/08/09 07:31:26	1.1
+++ c_io_libio_codecvt.c	2000/10/22 02:57:50
@@ -30,17 +30,17 @@
 
 /* Prototypes of libio's codecvt functions.  */
 static enum __codecvt_result 
-do_out(struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_out(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
        const wchar_t *from_start, const wchar_t *from_end,
        const wchar_t **from_stop, char *to_start, char *to_end, 
        char **to_stop);
 
 static enum __codecvt_result 
-do_unshift(struct _IO_codecvt *codecvt, __mbstate_t *statep, char *to_start, 
+do_unshift(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep, char *to_start, 
 	   char *to_end, char **to_stop);
 
 static enum __codecvt_result 
-do_in(struct _IO_codecvt *codecvt, __mbstate_t *statep, 
+do_in(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep, 
       const char *from_start, const char *from_end, const char **from_stop, 
       wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop);
 
@@ -48,7 +48,7 @@
 do_encoding(struct _IO_codecvt *codecvt);
 
 static int 
-do_length(struct _IO_codecvt *codecvt, __mbstate_t *statep, 
+do_length(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep, 
 	  const char *from_start, const char *from_end, _IO_size_t max);
 
 static int 
@@ -72,7 +72,7 @@
 };
 
 static enum __codecvt_result
-do_out(struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_out(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
        const wchar_t *from_start, const wchar_t *from_end,
        const wchar_t **from_stop, char *to_start, char *to_end,
        char **to_stop)
@@ -97,7 +97,7 @@
 
 
 static enum __codecvt_result
-do_unshift(struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_unshift(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
 	   char *to_start, char *to_end, char **to_stop)
 {
   *to_stop = to_start;
@@ -106,7 +106,7 @@
 
 
 static enum __codecvt_result
-do_in(struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_in(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
       const char *from_start, const char *from_end, const char **from_stop,
       wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop)
 {
@@ -140,7 +140,7 @@
 
 
 static int
-do_length(struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_length(struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
 	  const char *from_start, const char *from_end, _IO_size_t max)
 { return from_end - from_start; }
 
Index: config/os/solaris/solaris2.7/bits/ctype_noninline.h
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h,v
retrieving revision 1.1
diff -u -3 -r1.1 ctype_noninline.h
--- ctype_noninline.h	2000/10/07 18:39:06	1.1
+++ ctype_noninline.h	2000/10/22 02:57:50
@@ -34,7 +34,7 @@
 // Information as gleaned from /usr/include/ctype.h
   
   ctype<char>::ctype(const mask* __table = 0, bool __del = false, 
-	size_t __refs = 0) throw()
+	size_t __refs = 0)
     : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del), 
       _M_toupper(__trans_upper), _M_tolower(__trans_lower),
       _M_ctable(__ctype_mask), _M_table(__table == 0 ? _M_ctable: __table) 
Index: config/os/solaris/solaris2.7/bits/os_defines.h
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/config/os/solaris/solaris2.7/bits/os_defines.h,v
retrieving revision 1.2
diff -u -3 -r1.2 os_defines.h
--- os_defines.h	2000/10/09 03:35:36	1.2
+++ os_defines.h	2000/10/22 02:57:50
@@ -28,9 +28,41 @@
 // the GNU General Public License.
 
 
-#ifndef __P
-#  define __P(p) p
-#  define __PMT(p) p
-#endif
+#ifndef _GLIBCPP_OS_DEFINES
+#  define _GLIBCPP_OS_DEFINES
+
+// Need these to get sane definitions, esp. of 64-bit types and typedefs.
+#define _XOPEN_SOURCE        500
+#define _LARGEFILE64_SOURCE  1
+
+// These are typedefs which libio assumes are already in place (because
+// they really are, under Linux).
+// HACK HACK HACK LOOK AT THE HAIR GROW
+#define __off_t     off_t
+#define __off64_t   off64_t
+#define __ssize_t   ssize_t
+
+#undef __P
+// This chunk here is pulled verbatim out of a fairly-recent Linux
+// system's sys/cdefs.h.
+/* GCC can always grok prototypes.  For C++ programs we add throw()
+   to help it optimize the function calls.  But this works only with
+   gcc 2.8.x and egcs.  */
+# if defined __cplusplus && (__GNUC__ >= 3 || __GNUC_MINOR__ >= 8)
+#  define __THROW   throw ()
+# else
+#  define __THROW
+# endif
+# define __P(args)  args __THROW
+/* This macro will be used for functions which might take C++ callback
+   functions.  */
+# define __PMT(args)    args
+# define __DOTS     , ...
+// End chunk from sys/cdefs.h.
 
+
+//#define _MBSTATET_H
+
+
+#endif
 
Index: include/bits/locale_facets.tcc
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/include/bits/locale_facets.tcc,v
retrieving revision 1.2
diff -u -3 -r1.2 locale_facets.tcc
--- locale_facets.tcc	2000/10/18 23:26:22	1.2
+++ locale_facets.tcc	2000/10/22 02:57:50
@@ -33,6 +33,7 @@
 #define _CPP_BITS_LOCFACETS_TCC 1
 
 #include <bits/std_cerrno.h>
+#include <bits/std_clocale.h>   // For localeconv
 #include <bits/std_cstdlib.h>   // For strof, strtold
 #include <bits/std_limits.h>    // For numeric_limits
 #include <bits/std_memory.h>    // For auto_ptr
Index: libio/Makefile.am
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/libio/Makefile.am,v
retrieving revision 1.15
diff -u -3 -r1.15 Makefile.am
--- Makefile.am	2000/10/12 11:45:22	1.15
+++ Makefile.am	2000/10/22 02:57:50
@@ -51,7 +51,7 @@
 
 if GLIBCPP_NEED_WLIBIO
 LIBIO_WSRCS = \
-	wfiledoalloc.c wfileops.c wgenops.c
+	wfiledoalloc.c wfileops.c wgenops.c iofwide.c
 else
 LIBIO_WSRCS =
 endif
Index: libio/_G_config.h
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/libio/_G_config.h,v
retrieving revision 1.8
diff -u -3 -r1.8 _G_config.h
--- _G_config.h	2000/10/10 23:50:38	1.8
+++ _G_config.h	2000/10/22 02:57:50
@@ -35,15 +37,15 @@
 
 /* For use as part of glibc (native) or as part of libstdc++ (maybe
    not glibc) */
-#ifndef __mbstate_t_defined
-# define __mbstate_t_defined	1
-# ifdef _GLIBCPP_USE_WCHAR_T
+#ifndef __gnu_mbstate_t_defined
+# define __gnu_mbstate_t_defined	1
+/*# ifdef _GLIBCPP_USE_WCHAR_T*/
 typedef struct
 {
   int count;
   wint_t value;
-}__mbstate_t;
-# endif
+}__gnu_mbstate_t;
+/*# endif*/
 #endif
 #undef __need_mbstate_t
 
@@ -54,13 +56,13 @@
 typedef struct
 {
   __off_t __pos;
-  __mbstate_t __state;
+  __gnu_mbstate_t __state;
 } _G_fpos_t;
 
 typedef struct
 {
   __off64_t __pos;
-  __mbstate_t __state;
+  __gnu_mbstate_t __state;
 } _G_fpos64_t;
 #else
 typedef __off_t _G_fpos_t;
Index: libio/iofwide.c
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/libio/iofwide.c,v
retrieving revision 1.6
diff -u -3 -r1.6 iofwide.c
--- iofwide.c	2000/08/29 07:57:10	1.6
+++ iofwide.c	2000/10/22 02:57:50
@@ -41,22 +41,22 @@
 
 /* Prototypes of libio's codecvt functions.  */
 static enum __codecvt_result do_out (struct _IO_codecvt *codecvt,
-				     __mbstate_t *statep,
+				     __gnu_mbstate_t *statep,
 				     const wchar_t *from_start,
 				     const wchar_t *from_end,
 				     const wchar_t **from_stop, char *to_start,
 				     char *to_end, char **to_stop);
 static enum __codecvt_result do_unshift (struct _IO_codecvt *codecvt,
-					 __mbstate_t *statep, char *to_start,
+					 __gnu_mbstate_t *statep, char *to_start,
 					 char *to_end, char **to_stop);
 static enum __codecvt_result do_in (struct _IO_codecvt *codecvt,
-				    __mbstate_t *statep,
+				    __gnu_mbstate_t *statep,
 				    const char *from_start,
 				    const char *from_end,
 				    const char **from_stop, wchar_t *to_start,
 				    wchar_t *to_end, wchar_t **to_stop);
 static int do_encoding (struct _IO_codecvt *codecvt);
-static int do_length (struct _IO_codecvt *codecvt, __mbstate_t *statep,
+static int do_length (struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
 		      const char *from_start,
 		      const char *from_end, _IO_size_t max);
 static int do_max_length (struct _IO_codecvt *codecvt);
@@ -116,8 +116,8 @@
 	struct gconv_fcts fcts;
 
 	/* Clear the state.  We start all over again.  */
-	memset (&fp->_wide_data->_IO_state, '\0', sizeof (__mbstate_t));
-	memset (&fp->_wide_data->_IO_last_state, '\0', sizeof (__mbstate_t));
+	memset (&fp->_wide_data->_IO_state, '\0', sizeof (__gnu_mbstate_t));
+	memset (&fp->_wide_data->_IO_last_state, '\0', sizeof (__gnu_mbstate_t));
 
 	__wcsmbs_clone_conv (&fcts);
 
@@ -188,7 +188,7 @@
 
 
 static enum __codecvt_result
-do_out (struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_out (struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
 	const wchar_t *from_start, const wchar_t *from_end,
 	const wchar_t **from_stop, char *to_start, char *to_end,
 	char **to_stop)
@@ -257,7 +257,7 @@
 
 
 static enum __codecvt_result
-do_unshift (struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_unshift (struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
 	    char *to_start, char *to_end, char **to_stop)
 {
   enum __codecvt_result result;
@@ -318,7 +318,7 @@
 
 
 static enum __codecvt_result
-do_in (struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_in (struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
        const char *from_start, const char *from_end, const char **from_stop,
        wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop)
 {
@@ -416,7 +416,7 @@
 
 
 static int
-do_length (struct _IO_codecvt *codecvt, __mbstate_t *statep,
+do_length (struct _IO_codecvt *codecvt, __gnu_mbstate_t *statep,
 	   const char *from_start, const char *from_end, _IO_size_t max)
 {
   int result;
Index: libio/libio.h
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/libio/libio.h,v
retrieving revision 1.8
diff -u -3 -r1.8 libio.h
--- libio.h	2000/10/18 23:29:30	1.8
+++ libio.h	2000/10/22 02:57:50
@@ -206,22 +206,22 @@
 {
   void (*__codecvt_destr) (struct _IO_codecvt *);
   enum __codecvt_result (*__codecvt_do_out) (struct _IO_codecvt *,
-					     __mbstate_t *,
+					     __gnu_mbstate_t *,
 					     const wchar_t *,
 					     const wchar_t *,
 					     const wchar_t **, char *,
 					     char *, char **);
   enum __codecvt_result (*__codecvt_do_unshift) (struct _IO_codecvt *,
-						 __mbstate_t *, char *,
+						 __gnu_mbstate_t *, char *,
 						 char *, char **);
   enum __codecvt_result (*__codecvt_do_in) (struct _IO_codecvt *,
-					    __mbstate_t *,
+					    __gnu_mbstate_t *,
 					    const char *, const char *,
 					    const char **, wchar_t *,
 					    wchar_t *, wchar_t **);
   int (*__codecvt_do_encoding) (struct _IO_codecvt *);
   int (*__codecvt_do_always_noconv) (struct _IO_codecvt *);
-  int (*__codecvt_do_length) (struct _IO_codecvt *, __mbstate_t *,
+  int (*__codecvt_do_length) (struct _IO_codecvt *, __gnu_mbstate_t *,
 			      const char *, const char *, _IO_size_t);
   int (*__codecvt_do_max_length) (struct _IO_codecvt *);
 
@@ -247,8 +247,8 @@
   wchar_t *_IO_save_end;	/* Pointer to end of non-current get area. */
 
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-  __mbstate_t _IO_state;
-  __mbstate_t _IO_last_state;
+  __gnu_mbstate_t _IO_state;
+  __gnu_mbstate_t _IO_last_state;
 #endif
   struct _IO_codecvt _codecvt;
 
Index: libio/wfileops.c
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/libio/wfileops.c,v
retrieving revision 1.3
diff -u -3 -r1.3 wfileops.c
--- wfileops.c	2000/08/15 07:33:00	1.3
+++ wfileops.c	2000/10/22 02:57:50
@@ -28,7 +28,9 @@
 #include <assert.h>
 #include <libioP.h>
 #include <wchar.h>
-#include <gconv.h>
+#ifdef HAVE_GCONV_H
+#  include <gconv.h>
+#endif
 #include <stdlib.h>
 #include <string.h>





More information about the Libstdc++ mailing list