summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Smith <dannysmith@users.sourceforge.net>2005-02-25 01:43:43 +0000
committerDanny Smith <dannysmith@users.sourceforge.net>2005-02-25 01:43:43 +0000
commit7e9439a0eb2bd5494694dd750a3034c6a32babca (patch)
tree6ba17457bf398e7f7170c83ee5c98861f233d8fc
parent2598f908ca5317ae743f875ca1351185909ab3a6 (diff)
downloadcygnal-7e9439a0eb2bd5494694dd750a3034c6a32babca.tar.gz
cygnal-7e9439a0eb2bd5494694dd750a3034c6a32babca.tar.bz2
cygnal-7e9439a0eb2bd5494694dd750a3034c6a32babca.zip
* mingwex/wctype.c: New file.
* mingwex/wctrans.c: New file. * mingwex/Makefile.in (DISTFILES): Add wctype.c, wctrans.c. * mingwex/Makefile.in (Q8_OBJS): Add wctype.o, wctrans.o.
-rw-r--r--winsup/mingw/ChangeLog7
-rw-r--r--winsup/mingw/mingwex/Makefile.in8
-rwxr-xr-xwinsup/mingw/mingwex/wctrans.c60
-rwxr-xr-xwinsup/mingw/mingwex/wctype.c60
4 files changed, 131 insertions, 4 deletions
diff --git a/winsup/mingw/ChangeLog b/winsup/mingw/ChangeLog
index f8b87f969..8948eeb6c 100644
--- a/winsup/mingw/ChangeLog
+++ b/winsup/mingw/ChangeLog
@@ -1,3 +1,10 @@
+2005-02-25 Danny Smith <dannysmith@users.sourceforge.net>
+
+ * mingwex/wctype.c: New file.
+ * mingwex/wctrans.c: New file.
+ * mingwex/Makefile.in (DISTFILES): Add wctype.c, wctrans.c.
+ * mingwex/Makefile.in (Q8_OBJS): Add wctype.o, wctrans.o.
+
2005-02-11 Danny Smith <dannysmith@users.sourceforge.net>
* include/tchar.h (_tstat64, _tstati64): Add Unicode/ANSI mappings.
diff --git a/winsup/mingw/mingwex/Makefile.in b/winsup/mingw/mingwex/Makefile.in
index 7dc0087f5..5cfde769d 100644
--- a/winsup/mingw/mingwex/Makefile.in
+++ b/winsup/mingw/mingwex/Makefile.in
@@ -33,9 +33,8 @@ DISTFILES = Makefile.in configure configure.in \
ldtoa.c lltoa.c lltow.c mbsinit.c mingw-aligned-malloc.c \
mingw-fseek.c sitest.c strtof.c strtoimax.c strtold.c strtoumax.c \
testwmem.c tst-aligned-malloc.c ulltoa.c ulltow.c wcstof.c \
- wcstoimax.c wcstold.c wcstoumax.c wdirent.c wmemchr.c wmemcmp.c \
- wmemcpy.c wmemmove.c wmemset.c wtoll.c
-
+ wcstoimax.c wcstold.c wcstoumax.c wctrans.c wctype.c \
+ wdirent.c wmemchr.c wmemcmp.c wmemcpy.c wmemmove.c wmemset.c wtoll.c
MATH_DISTFILES = \
acosf.c acosl.c asinf.c asinl.c atan2f.c atan2l.c \
atanf.c atanl.c cbrt.c cbrtf.c cbrtl.c ceilf.S ceill.S \
@@ -114,7 +113,8 @@ LIBMINGWEX_A = libmingwex.a
Q8_OBJS = \
fwide.o imaxabs.o imaxdiv.o mbsinit.o \
strtoimax.o strtoumax.o wcstoimax.o wcstoumax.o \
- wmemchr.o wmemcmp.o wmemcpy.o wmemmove.o wmemset.o
+ wmemchr.o wmemcmp.o wmemcpy.o wmemmove.o wmemset.o \
+ wctrans.o wctype.o
STDLIB_OBJS = \
strtold.o wcstold.o
STDLIB_STUB_OBJS = \
diff --git a/winsup/mingw/mingwex/wctrans.c b/winsup/mingw/mingwex/wctrans.c
new file mode 100755
index 000000000..e129af471
--- /dev/null
+++ b/winsup/mingw/mingwex/wctrans.c
@@ -0,0 +1,60 @@
+/*
+ wctrans.c
+ 7.25.3.2 Extensible wide-character case mapping functions
+
+ Contributed by: Danny Smith <dannysmith@usesr.sourcefoge.net>
+ 2005-02-24
+
+ This source code is placed in the PUBLIC DOMAIN. It is modified
+ from the Q8 package created by Doug Gwyn <gwyn@arl.mil>
+
+ */
+
+#include <string.h>
+#include <wctype.h>
+
+/*
+ This differs from the MS implementation of wctrans which
+ returns 0 for tolower and 1 for toupper. According to
+ C99, a 0 return value indicates invalid input.
+
+ These two function go in the same translation unit so that we
+ can ensure that
+ towctrans(wc, wctrans("tolower")) == towlower(wc)
+ towctrans(wc, wctrans("toupper")) == towupper(wc)
+ It also ensures that
+ towctrans(wc, wctrans("")) == wc
+ which is not required by standard.
+*/
+
+static const struct {
+ const char *name;
+ wctrans_t val; } tmap[] = {
+ {"tolower", _LOWER},
+ {"toupper", _UPPER}
+ };
+
+#define NTMAP (sizeof tmap / sizeof tmap[0])
+
+wctrans_t
+wctrans (const char* property)
+{
+ int i;
+ for ( i = 0; i < NTMAP; ++i )
+ if (strcmp (property, tmap[i].name) == 0)
+ return tmap[i].val;
+ return 0;
+}
+
+wint_t towctrans (wint_t wc, wctrans_t desc)
+{
+ switch (desc)
+ {
+ case _LOWER:
+ return towlower (wc);
+ case _UPPER:
+ return towupper (wc);
+ default:
+ return wc;
+ }
+}
diff --git a/winsup/mingw/mingwex/wctype.c b/winsup/mingw/mingwex/wctype.c
new file mode 100755
index 000000000..197fde5f7
--- /dev/null
+++ b/winsup/mingw/mingwex/wctype.c
@@ -0,0 +1,60 @@
+/*
+ wctype.c
+ 7.25.2.2.2 The wctype function
+
+ Contributed by: Danny Smith <dannysmith@usesr.sourcefoge.net>
+ 2005-02-24
+
+ This source code is placed in the PUBLIC DOMAIN. It is modified
+ from the Q8 package created by Doug Gwyn <gwyn@arl.mil>
+
+ The wctype function constructs a value with type wctype_t that
+ describes a class of wide characters identified by the string
+ argument property.
+
+ In particular, we map the property strings so that:
+
+ iswctype(wc, wctype("alnum")) == iswalnum(wc)
+ iswctype(wc, wctype("alpha")) == iswalpha(wc)
+ iswctype(wc, wctype("cntrl")) == iswcntrl(wc)
+ iswctype(wc, wctype("digit")) == iswdigit(wc)
+ iswctype(wc, wctype("graph")) == iswgraph(wc)
+ iswctype(wc, wctype("lower")) == iswlower(wc)
+ iswctype(wc, wctype("print")) == iswprint(wc)
+ iswctype(wc, wctype("punct")) == iswpunct(wc)
+ iswctype(wc, wctype("space")) == iswspace(wc)
+ iswctype(wc, wctype("upper")) == iswupper(wc)
+ iswctype(wc, wctype("xdigit")) == iswxdigit(wc)
+
+*/
+
+#include <string.h>
+#include <wctype.h>
+
+/* Using the bit-OR'd ctype character classification flags as return
+ values achieves compatibility with MS iswctype(). */
+static const struct {
+ const char *name;
+ wctype_t flags;} cmap[] = {
+ {"alnum", _ALPHA|_DIGIT},
+ {"alpha", _ALPHA},
+ {"cntrl", _CONTROL},
+ {"digit", _DIGIT},
+ {"graph", _PUNCT|_ALPHA|_DIGIT},
+ {"lower", _LOWER},
+ {"print", _BLANK|_PUNCT|_ALPHA|_DIGIT},
+ {"punct", _PUNCT},
+ {"space", _SPACE},
+ {"upper", _UPPER},
+ {"xdigit", _HEX}
+ };
+
+#define NCMAP (sizeof cmap / sizeof cmap[0])
+wctype_t wctype (const char *property)
+{
+ int i;
+ for (i = 0; i < NCMAP; ++i)
+ if (strcmp (property, cmap[i].name) == 0)
+ return cmap[i].flags;
+ return 0;
+}