61 lines
1.3 KiB
C
61 lines
1.3 KiB
C
|
/*
|
||
|
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;
|
||
|
}
|
||
|
}
|