diff options
-rw-r--r-- | winsup/mingw/ChangeLog | 7 | ||||
-rw-r--r-- | winsup/mingw/mingwex/Makefile.in | 8 | ||||
-rwxr-xr-x | winsup/mingw/mingwex/wctrans.c | 60 | ||||
-rwxr-xr-x | winsup/mingw/mingwex/wctype.c | 60 |
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; +} |