This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[Patch/mingw32] Don't depend on MS runtime for classic ctype table.\
- From: Danny Smith <dannysmith at clear dot net dot nz>
- To: GCC-patches <gcc-patches at gcc dot gnu dot org>, libstdc++ at gcc dot gnu dot org
- Date: Tue, 26 Jun 2007 21:35:46 +1200
- Subject: [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)