#include <assert.h>
// setlocale appears to be broken :-(
#define LATIN1_UC "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ__"
#define LATIN1_lc "àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿß"
int latin1_islower(unsigned int cc)
{
char c = cc;
return (islower(c) || (strchr(LATIN1_lc, cc) != NULL));
}
int latin1_isupper(unsigned int cc)
{
char c = cc;
return (isupper(c) || (strchr(LATIN1_UC, cc) != NULL));
}
int latin1_toupper(unsigned int cc)
{
char c = cc;
char *s = strchr(LATIN1_lc, cc);
if (s != NULL) {
c = LATIN1_UC[s-LATIN1_lc];
assert(c != '_'); // LC chars with no UC equiv
return(c);
}
return (toupper(c));
}
int latin1_tolower(unsigned int cc)
{
char c = cc;
char *s = strchr(LATIN1_UC, cc);
if ((c != '_') && (s != NULL)) {
c = LATIN1_lc[s-LATIN1_UC];
return(c);
}
return (tolower(c));
}
int latin1_isalpha(unsigned int cc)
{
char c = cc;
return (isalpha(c) || (strchr(LATIN1_UC, cc) && (cc != '_'))
|| strchr(LATIN1_lc, cc));
}