This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch/mingw32] Don't depend on MS runtime for classic ctype table.\


On Microsoft Winsows Vista and with some MS Visual Studio-supplied libs,
libstc++ fails with undefinied reference to symbol _ctype.  Although a
_ctype[] table is exported from the msvcrt.dll runtime libs that shipped
with NT4, Windows 2000, and XP it is not documented, and newer versions
of msvcr*.dll do not export it directly.

So we provide a local copy, based on ctype_base::mask definitions.
The table values have been verified by experimentation.

OK,  once lockdown ends?

2007-06-25  Danny Smith  <dannysmith@users,sourceforge.net>

	* config/os/mingw32/ctype_noninline.h: Provide a local
_S_classic_table. 

Index: config/os/mingw32/ctype_noninline.h
===================================================================
--- config/os/mingw32/ctype_noninline.h	(revision 126014)
+++ config/os/mingw32/ctype_noninline.h	(working copy)
@@ -38,13 +38,181 @@
   
 // Information as gleaned from /mingw32/include/ctype.h.
 
-  // This should be in mingw's ctype.h but isn't in older versions
-  // Static classic C-locale table.  _ctype[0] is EOF
-  extern "C"  unsigned short  __declspec(dllimport) _ctype[];
-
   const ctype_base::mask*
   ctype<char>::classic_table() throw()
-  { return _ctype + 1; }  
+  {
+    /* Although a _ctype[] table is exported from the msvcrt.dll
+       that shipped with NT, it is not documented, and some versions
+       of msvcr*.dll do not export it directly.
+       So we provide a local copy.  */
+
+    static const ctype_base::mask _S_classic_table[256] = 
+    {
+      cntrl /* null */,
+      cntrl /* ^A */,
+      cntrl /* ^B */,
+      cntrl /* ^C */,
+      cntrl /* ^D */,
+      cntrl /* ^E */,
+      cntrl /* ^F */,
+      cntrl /* ^G */,
+      cntrl /* ^H */,
+      ctype_base::mask(space | cntrl) /* tab */,
+      ctype_base::mask(space | cntrl) /* LF */,
+      ctype_base::mask(space | cntrl) /* ^K */,
+      ctype_base::mask(space | cntrl) /* FF */,
+      ctype_base::mask(space | cntrl) /* ^M */,
+      cntrl /* ^N */,
+      cntrl /* ^O */,
+      cntrl /* ^P */,
+      cntrl /* ^Q */,
+      cntrl /* ^R */,
+      cntrl /* ^S */,
+      cntrl /* ^T */,
+      cntrl /* ^U */,
+      cntrl /* ^V */,
+      cntrl /* ^W */,
+      cntrl /* ^X */,
+      cntrl /* ^Y */,
+      cntrl /* ^Z */,
+      cntrl /* esc */,
+      cntrl /* ^\ */,
+      cntrl /* ^] */,
+      cntrl /* ^^ */,
+      cntrl /* ^_ */,
+      ctype_base::mask (space | _BLANK) /*  */,
+      punct /* ! */,
+      punct /* " */,
+      punct /* # */,
+      punct /* $ */,
+      punct /* % */,
+      punct /* & */,
+      punct /* ' */,
+      punct /* ( */,
+      punct /* ) */,
+      punct /* * */,
+      punct /* + */,
+      punct /* , */,
+      punct /* - */,
+      punct /* . */,
+      punct /* / */,
+      ctype_base::mask (digit | xdigit) /* 0 */,
+      ctype_base::mask (digit | xdigit) /* 1 */,
+      ctype_base::mask (digit | xdigit) /* 2 */,
+      ctype_base::mask (digit | xdigit) /* 3 */,
+      ctype_base::mask (digit | xdigit) /* 4 */,
+      ctype_base::mask (digit | xdigit) /* 5 */,
+      ctype_base::mask (digit | xdigit) /* 6 */,
+      ctype_base::mask (digit | xdigit) /* 7 */,
+      ctype_base::mask (digit | xdigit) /* 8 */,
+      ctype_base::mask (digit | xdigit) /* 9 */,
+      punct /* : */,
+      punct /* ; */,
+      punct /* < */,
+      punct /* = */,
+      punct /* > */,
+      punct /* ? */,
+      punct /* ! */,
+      ctype_base::mask (upper | xdigit) /* A */,
+      ctype_base::mask (upper | xdigit) /* B */,
+      ctype_base::mask (upper | xdigit) /* C */,
+      ctype_base::mask (upper | xdigit) /* D */,
+      ctype_base::mask (upper | xdigit) /* E */,
+      ctype_base::mask (upper | xdigit) /* F */,
+      upper /* G */,
+      upper /* H */,
+      upper /* I */,
+      upper /* J */,
+      upper /* K */,
+      upper /* L */,
+      upper /* M */,
+      upper /* N */,
+      upper /* O */,
+      upper /* P */,
+      upper /* Q */,
+      upper /* R */,
+      upper /* S */,
+      upper /* T */,
+      upper /* U */,
+      upper /* V */,
+      upper /* W */,
+      upper /* X */,
+      upper /* Y */,
+      upper /* Z */,
+      punct /* [ */,
+      punct /* \ */,
+      punct /* ] */,
+      punct /* ^ */,
+      punct /* _ */,
+      punct /* ` */,
+      ctype_base::mask (lower | xdigit) /* a */,
+      ctype_base::mask (lower | xdigit) /* b */,
+      ctype_base::mask (lower | xdigit) /* c */,
+      ctype_base::mask (lower | xdigit) /* d */,
+      ctype_base::mask (lower | xdigit) /* e */,
+      ctype_base::mask (lower | xdigit) /* f */,
+      lower /* g */,
+      lower /* h */,
+      lower /* i */,
+      lower /* j */,
+      lower /* k */,
+      lower /* l */,
+      lower /* m */,
+      lower /* n */,
+      lower /* o */,
+      lower /* p */,
+      lower /* q */,
+      lower /* r */,
+      lower /* s */,
+      lower /* t */,
+      lower /* u */,
+      lower /* v */,
+      lower /* w */,
+      lower /* x */,
+      lower /* y */,
+      lower /* x */,
+      punct /* { */,
+      punct /* | */,
+      punct /* } */,
+      punct /* ~ */,
+      cntrl /* del (0x7f)*/,
+      /* everything else is 0 */
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0), 
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0), 
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0), 
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0), 
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0), 
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0),
+      ctype_base::mask (0),  ctype_base::mask (0),  ctype_base::mask
(0),  ctype_base::mask (0)
+    };
+    return _S_classic_table;
+  }
+
 
   ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
 		     size_t __refs) 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]