21#if !defined(WIN32) && !defined(__APPLE__) 
   33XConvertUtf8ToUcs(
const unsigned char     *buf,
 
   49                       && (buf[1] & 0xC0) == 0x80
 
   50                       && (buf[2] & 0xC0) == 0x80
 
   51                       && (buf[3] & 0xC0) == 0x80
 
   52                       && (buf[4] & 0xC0) == 0x80) {
 
   54              *ucs =  ((buf[0] & ~0xF8) << 24) +
 
   55                      ((buf[1] & ~0x80) << 18) +
 
   56                      ((buf[2] & ~0x80) << 12) +
 
   57                      ((buf[3] & ~0x80) << 6) +
 
   59              if (*ucs > 0x001FFFFF && *ucs < 0x01000000) 
return 5;
 
   62                     && (buf[1] & 0xC0) == 0x80
 
   63                     && (buf[2] & 0xC0) == 0x80
 
   64                     && (buf[3] & 0xC0) == 0x80) {
 
   66            *ucs =  ((buf[0] & ~0xF0) << 18) +
 
   67                    ((buf[1] & ~0x80) << 12) +
 
   68                    ((buf[2] & ~0x80) << 6) +
 
   70            if (*ucs > 0x0000FFFF) 
return 4;
 
   73                   && (buf[1] & 0xC0) == 0x80 
 
   74                   && (buf[2] & 0xC0) == 0x80) {
 
   76          *ucs =  ((buf[0] & ~0xE0) << 12) +
 
   77                  ((buf[1] & ~0x80) << 6) +
 
   79          if (*ucs > 0x000007FF) 
return 3;
 
   81      } 
else if (len > 1 && (buf[1] & 0xC0) == 0x80) {
 
   83        *ucs = ((buf[0] & ~0xC0) << 6) +
 
   85        if (*ucs > 0x0000007F) 
return 2;
 
   94  *ucs = (
unsigned int) 
'?'; 
 
  103XConvertUcsToUtf8(
unsigned int  ucs, 
 
  106  if (ucs < 0x000080) {
 
  109  } 
else if (ucs < 0x000800) {
 
  110    buf[0] = 0xC0 | (ucs >> 6);
 
  111    buf[1] = 0x80 | (ucs & 0x3F);
 
  113  } 
else if (ucs < 0x010000) { 
 
  114    buf[0] = 0xE0 | (ucs >> 12);
 
  115    buf[1] = 0x80 | ((ucs >> 6) & 0x3F);
 
  116    buf[2] = 0x80 | (ucs & 0x3F);
 
  118  } 
else if (ucs < 0x00200000) {
 
  119    buf[0] = 0xF0 | (ucs >> 18);
 
  120    buf[1] = 0x80 | ((ucs >> 12) & 0x3F);
 
  121    buf[2] = 0x80 | ((ucs >> 6) & 0x3F);
 
  122    buf[3] = 0x80 | (ucs & 0x3F);
 
  124  } 
else if (ucs < 0x01000000) {
 
  125    buf[0] = 0xF8 | (ucs >> 24);
 
  126    buf[1] = 0x80 | ((ucs >> 18) & 0x3F);
 
  127    buf[2] = 0x80 | ((ucs >> 12) & 0x3F);
 
  128    buf[3] = 0x80 | ((ucs >> 6) & 0x3F);
 
  129    buf[4] = 0x80 | (ucs & 0x3F);
 
  141XUtf8CharByteLen(
const unsigned char     *buf,
 
  144  return XConvertUtf8ToUcs(buf, len, &ucs);
 
  151XCountUtf8Char(
const unsigned char      *buf, 
 
  157    int cl = XUtf8CharByteLen(buf + i, len - i);
 
  169XFastConvertUtf8ToUcs(
const unsigned char     *buf,
 
  184            } 
else if (len > 4) {
 
  186              *ucs =  ((buf[0] & ~0xF8) << 24) +
 
  187                      ((buf[1] & ~0x80) << 18) +
 
  188                      ((buf[2] & ~0x80) << 12) +
 
  189                      ((buf[3] & ~0x80) << 6) +
 
  193          } 
else if (len > 3) {
 
  195            *ucs =  ((buf[0] & ~0xF0) << 18) +
 
  196                    ((buf[1] & ~0x80) << 12) +
 
  197                    ((buf[2] & ~0x80) << 6) +
 
  201        } 
else if (len > 2) {
 
  203          *ucs =  ((buf[0] & ~0xE0) << 12) +
 
  204                  ((buf[1] & ~0x80) << 6) +
 
  208      } 
else if (len > 1) {
 
  210        *ucs = ((buf[0] & ~0xC0) << 6) +
 
  215  } 
else if (len > 0) {
 
  221  *ucs = (
unsigned int) 
'?';