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