#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));
}