Blame src/xutf8/utf8Input.c

Packit Service 9ac617
/* "$Id: $"
Packit Service 9ac617
 *
Packit Service 9ac617
 * Author: Jean-Marc Lienher ( http://oksid.ch )
Packit Service 9ac617
 * Copyright 2000-2003 by O'ksi'D.
Packit Service 9ac617
 *
Packit Service 9ac617
 * This library is free software. Distribution and use rights are outlined in
Packit Service 9ac617
 * the file "COPYING" which should have been included with this file.  If this
Packit Service 9ac617
 * file is missing or damaged, see the license at:
Packit Service 9ac617
 *
Packit Service 9ac617
 *     http://www.fltk.org/COPYING.php
Packit Service 9ac617
 *
Packit Service 9ac617
 * Please report all bugs and problems on the following page:
Packit Service 9ac617
 *
Packit Service 9ac617
 *     http://www.fltk.org/str.php
Packit Service 9ac617
 */
Packit Service 9ac617
Packit Service 9ac617
#if !defined(WIN32) && !defined(__APPLE__)
Packit Service 9ac617
Packit Service 9ac617
#include <config.h>
Packit Service 9ac617
#include "../Xutf8.h"
Packit Service 9ac617
#include <X11/X.h>
Packit Service 9ac617
#include <X11/Xlib.h>
Packit Service 9ac617
#include <X11/Xutil.h>
Packit Service 9ac617
#include <string.h>
Packit Service 9ac617
#include <stdlib.h>
Packit Service 9ac617
Packit Service 9ac617
#ifdef HAVE_LIBC_ICONV
Packit Service 9ac617
#include <iconv.h>
Packit Service 9ac617
#endif
Packit Service 9ac617
/*
Packit Service 9ac617
  I haven't found much doc on the web about EUC encodings, so I've used
Packit Service 9ac617
  GNU libiconv source code as a reference.
Packit Service 9ac617
  http://clisp.cons.org/~haible/packages-libiconv.html
Packit Service 9ac617
*/
Packit Service 9ac617
Packit Service 9ac617
#define RET_ILSEQ -1
Packit Service 9ac617
#define RET_TOOFEW(x) (-10 - x)
Packit Service 9ac617
#define RET_TOOSMALL -2
Packit Service 9ac617
#define conv_t void*
Packit Service 9ac617
#define ucs4_t unsigned int
Packit Service 9ac617
typedef struct {
Packit Service 9ac617
  unsigned short indx;
Packit Service 9ac617
  unsigned short used;
Packit Service 9ac617
} Summary16;
Packit Service 9ac617
Packit Service 9ac617
#ifndef X_HAVE_UTF8_STRING
Packit Service 9ac617
#define NEED_TOWC /* indicates what part of these include files is needed here (avoid compilation warnings) */
Packit Service 9ac617
#include "lcUniConv/big5.h"
Packit Service 9ac617
#include "lcUniConv/gb2312.h"
Packit Service 9ac617
#include "lcUniConv/cp936ext.h"
Packit Service 9ac617
#include "lcUniConv/jisx0201.h"
Packit Service 9ac617
#include "lcUniConv/jisx0208.h"
Packit Service 9ac617
#include "lcUniConv/jisx0212.h"
Packit Service 9ac617
#include "lcUniConv/ksc5601.h"
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertEucTwToUtf8(char* buffer_return, int len) {
Packit Service 9ac617
  /* FIXME */
Packit Service 9ac617
#ifdef HAVE_LIBC_ICONV
Packit Service 9ac617
  iconv_t cd;
Packit Service 9ac617
  int cdl;
Packit Service 9ac617
#else
Packit Service 9ac617
  int i = 0;
Packit Service 9ac617
#endif
Packit Service 9ac617
  int l = 0;
Packit Service 9ac617
  char *buf; /* , *b; */
Packit Service 9ac617
Packit Service 9ac617
  if (len < 1) return 0;
Packit Service 9ac617
  /*b = */ buf = (char*) malloc((unsigned)len);
Packit Service 9ac617
  memcpy(buf, buffer_return, (unsigned) len);
Packit Service 9ac617
Packit Service 9ac617
#ifdef HAVE_LIBC_ICONV
Packit Service 9ac617
  l = cdl = len;
Packit Service 9ac617
  cd = iconv_open("EUC-TW", "UTF-8");
Packit Service 9ac617
  iconv(cd, &b, &len, &buffer_return, &cdl;;
Packit Service 9ac617
  iconv_close(cd);
Packit Service 9ac617
  l -= cdl;	
Packit Service 9ac617
#else
Packit Service 9ac617
  while (i < len) {
Packit Service 9ac617
    unsigned int ucs;
Packit Service 9ac617
    unsigned char c; 
Packit Service 9ac617
    c = (unsigned char) buf[i];
Packit Service 9ac617
    if (c < 0x80) {
Packit Service 9ac617
      ucs = c;	
Packit Service 9ac617
      i++;
Packit Service 9ac617
    } else if (c >= 0xa1 && c < 0xff && len - i > 1 ) {
Packit Service 9ac617
Packit Service 9ac617
#if 0 
Packit Service 9ac617
      unsigned char b[2];
Packit Service 9ac617
      b[0] = (unsigned char) c - 0x80;
Packit Service 9ac617
      b[1] = (unsigned char) buf[i + 1] - 0x80;
Packit Service 9ac617
#endif
Packit Service 9ac617
      ucs = ' '; i += 2;
Packit Service 9ac617
    } else if (c == 0x8e &&  len - i > 3) {
Packit Service 9ac617
      unsigned char c1 =  buf[i + 1];
Packit Service 9ac617
      unsigned char c2 =  buf[i + 2];
Packit Service 9ac617
      unsigned char c3 =  buf[i + 3];
Packit Service 9ac617
#if 0
Packit Service 9ac617
      unsigned char b[2];
Packit Service 9ac617
      b[0] = (unsigned char)  buf[i + 2] - 0x80;
Packit Service 9ac617
      b[1] = (unsigned char)  buf[i + 3] - 0x80;
Packit Service 9ac617
#endif
Packit Service 9ac617
      if (c1 >= 0xa1 && c1 <= 0xb0) {
Packit Service 9ac617
	if (c2 >= 0xa1 && c2 < 0xff && c3 >= 0xa1 && c3 < 0xff) {
Packit Service 9ac617
	  ucs = ' '; i += 4;
Packit Service 9ac617
	} else {
Packit Service 9ac617
	  ucs = '?'; i++;
Packit Service 9ac617
	}
Packit Service 9ac617
      } else {
Packit Service 9ac617
	ucs = '?'; i++;
Packit Service 9ac617
      }
Packit Service 9ac617
    } else {
Packit Service 9ac617
      ucs = '?';
Packit Service 9ac617
      i++;
Packit Service 9ac617
    }
Packit Service 9ac617
    l += XConvertUcsToUtf8(ucs, buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
#endif
Packit Service 9ac617
  free(buf);
Packit Service 9ac617
  return l;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertEucKrToUtf8(char* buffer_return, int len) {
Packit Service 9ac617
  int i = 0, l = 0;
Packit Service 9ac617
  char *buf;
Packit Service 9ac617
Packit Service 9ac617
  if (len < 1) return 0;
Packit Service 9ac617
Packit Service 9ac617
  buf = (char*) malloc((unsigned)len);
Packit Service 9ac617
  memcpy(buf, buffer_return, (unsigned)len);
Packit Service 9ac617
Packit Service 9ac617
  while (i < len) {
Packit Service 9ac617
    unsigned int ucs;
Packit Service 9ac617
    unsigned char c, c1;
Packit Service 9ac617
    c = (unsigned char) buf[i];
Packit Service 9ac617
    if (c < 0x80) {
Packit Service 9ac617
      ucs = c;	
Packit Service 9ac617
      i++;
Packit Service 9ac617
    } else if (c >= 0xA1 && c < 0xFF && len - i > 1) {
Packit Service 9ac617
      c1 = (unsigned char) buf[i + 1];
Packit Service 9ac617
      if (c1 >= 0xa1 && c1 < 0xff) {
Packit Service 9ac617
	unsigned char b[2];
Packit Service 9ac617
	b[0] = c - 0x80;
Packit Service 9ac617
	b[1] = c1 - 0x80;
Packit Service 9ac617
	if (ksc5601_mbtowc(NULL, &ucs, b, 2) < 1) {
Packit Service 9ac617
	  ucs = '?';
Packit Service 9ac617
	}
Packit Service 9ac617
      } else {
Packit Service 9ac617
	ucs = '?';
Packit Service 9ac617
      }
Packit Service 9ac617
      i += 2;
Packit Service 9ac617
    } else {
Packit Service 9ac617
      ucs = '?';
Packit Service 9ac617
      i++;
Packit Service 9ac617
    }
Packit Service 9ac617
    l += XConvertUcsToUtf8(ucs, buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  free(buf);
Packit Service 9ac617
  return l;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertBig5ToUtf8(char* buffer_return, int len) {
Packit Service 9ac617
  int i = 0, l = 0;
Packit Service 9ac617
  char *buf;
Packit Service 9ac617
Packit Service 9ac617
  if (len < 1) return 0;
Packit Service 9ac617
  buf = (char*) malloc((unsigned)len);
Packit Service 9ac617
  memcpy(buf, buffer_return, (unsigned)len);
Packit Service 9ac617
Packit Service 9ac617
  if (len == 1) {
Packit Service 9ac617
    l += XConvertUcsToUtf8((unsigned int)buf[i], buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  while (i + 1 < len) {
Packit Service 9ac617
    unsigned int ucs;
Packit Service 9ac617
    unsigned char b[2];
Packit Service 9ac617
    b[0] = (unsigned char) buf[i];
Packit Service 9ac617
    b[1] = (unsigned char) buf[i + 1];
Packit Service 9ac617
    if (big5_mbtowc(NULL, &ucs, b, 2) == 2) {
Packit Service 9ac617
      i += 2;
Packit Service 9ac617
    } else {
Packit Service 9ac617
      ucs = '?';
Packit Service 9ac617
      i++;
Packit Service 9ac617
    }
Packit Service 9ac617
    l += XConvertUcsToUtf8(ucs, buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  free(buf);
Packit Service 9ac617
  return l;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertCp936extToUtf8(char* buffer_return, int len)
Packit Service 9ac617
{
Packit Service 9ac617
  int i = 0, l = 0;
Packit Service 9ac617
  char *buf;
Packit Service 9ac617
Packit Service 9ac617
  if (len < 1) return 0;
Packit Service 9ac617
  buf = (char*) malloc((unsigned)len);
Packit Service 9ac617
  memcpy(buf, buffer_return, (unsigned)len);
Packit Service 9ac617
Packit Service 9ac617
  if (len == 1) {
Packit Service 9ac617
	  l += XConvertUcsToUtf8((unsigned int)buf[i], buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  while (i + 1 < len) {
Packit Service 9ac617
	  unsigned int ucs;
Packit Service 9ac617
	  unsigned char b[2];
Packit Service 9ac617
	  b[0] = (unsigned char) buf[i];
Packit Service 9ac617
	  b[1] = (unsigned char) buf[i + 1];
Packit Service 9ac617
	  if (cp936ext_mbtowc(NULL, &ucs, b, 2) == 2) {
Packit Service 9ac617
		  i += 2;
Packit Service 9ac617
	  } else {
Packit Service 9ac617
	      if ( b[0] < 0x80) {
Packit Service 9ac617
		    ucs = b[0];
Packit Service 9ac617
		}else{
Packit Service 9ac617
			      ucs = '?';
Packit Service 9ac617
		  }
Packit Service 9ac617
			  i++;
Packit Service 9ac617
		  }
Packit Service 9ac617
	  l += XConvertUcsToUtf8(ucs, buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  if(i + 1 == len) { 
Packit Service 9ac617
      l += XConvertUcsToUtf8((unsigned int)buf[i], buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  free(buf);
Packit Service 9ac617
  return l;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertGb2312ToUtf8(char* buffer_return, int len) {
Packit Service 9ac617
  int i = 0, l = 0;
Packit Service 9ac617
  char *buf;
Packit Service 9ac617
Packit Service 9ac617
  if (len < 1) return 0;
Packit Service 9ac617
  buf = (char*) malloc((unsigned)len);
Packit Service 9ac617
  memcpy(buf, buffer_return, (unsigned)len);
Packit Service 9ac617
Packit Service 9ac617
  if (len == 1) {
Packit Service 9ac617
    l += XConvertUcsToUtf8((unsigned int)buf[i], buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  while (i + 1 < len) {
Packit Service 9ac617
    unsigned int ucs;
Packit Service 9ac617
    unsigned char b[2];
Packit Service 9ac617
    b[0] = (unsigned char) buf[i];
Packit Service 9ac617
    b[1] = (unsigned char) buf[i + 1];
Packit Service 9ac617
    if ( b[0] < 0x80 ) {
Packit Service 9ac617
      ucs = b[0];
Packit Service 9ac617
      i++;
Packit Service 9ac617
    } else if (gb2312_mbtowc(NULL, &ucs, b, 2) == 2) {
Packit Service 9ac617
      i += 2;
Packit Service 9ac617
    } else {
Packit Service 9ac617
      ucs = '?';
Packit Service 9ac617
      i++;
Packit Service 9ac617
    }
Packit Service 9ac617
    l += XConvertUcsToUtf8(ucs, buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  if (i + 1 == len) {
Packit Service 9ac617
    l += XConvertUcsToUtf8((unsigned int)buf[i], buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  free(buf);
Packit Service 9ac617
  return l;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertEucCnToUtf8(char* buffer_return, int len) {
Packit Service 9ac617
  int i = 0, l = 0;
Packit Service 9ac617
  char *buf;
Packit Service 9ac617
Packit Service 9ac617
  if (len < 1) return 0;
Packit Service 9ac617
  buf = (char*) malloc((unsigned)len);
Packit Service 9ac617
  memcpy(buf, buffer_return, (unsigned)len);
Packit Service 9ac617
Packit Service 9ac617
  while (i < len) {
Packit Service 9ac617
    unsigned int ucs;
Packit Service 9ac617
    unsigned char c, c1;
Packit Service 9ac617
    c = (unsigned char) buf[i];
Packit Service 9ac617
    if (c < 0x80) {
Packit Service 9ac617
      ucs = c;	
Packit Service 9ac617
      i++;
Packit Service 9ac617
    } else if (c >= 0xA1 && c < 0xFF && len - i > 1) {
Packit Service 9ac617
      c1 = (unsigned char) buf[i + 1];
Packit Service 9ac617
      if (c1 >= 0xa1 && c1 < 0xff) {	
Packit Service 9ac617
	unsigned char b[2];
Packit Service 9ac617
	b[0] = (unsigned char) c;
Packit Service 9ac617
	b[1] = (unsigned char) c1;
Packit Service 9ac617
	if (gb2312_mbtowc(NULL, &ucs, b, 2) < 1) {
Packit Service 9ac617
	  ucs = '?';
Packit Service 9ac617
	}	
Packit Service 9ac617
      } else {
Packit Service 9ac617
	ucs = '?';
Packit Service 9ac617
      }
Packit Service 9ac617
      i += 2;
Packit Service 9ac617
    } else {
Packit Service 9ac617
      ucs = '?';
Packit Service 9ac617
      i++;
Packit Service 9ac617
    }
Packit Service 9ac617
    l += XConvertUcsToUtf8(ucs, buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  free(buf);
Packit Service 9ac617
  return l;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertEucJpToUtf8(char* buffer_return, int len) {
Packit Service 9ac617
  int i = 0, l = 0;
Packit Service 9ac617
  char *buf;
Packit Service 9ac617
Packit Service 9ac617
  if (len < 1) return 0;
Packit Service 9ac617
  buf = (char*) malloc((unsigned)len);
Packit Service 9ac617
  memcpy(buf, buffer_return, (unsigned)len);
Packit Service 9ac617
Packit Service 9ac617
  while (i < len) {
Packit Service 9ac617
    unsigned int ucs;
Packit Service 9ac617
    unsigned char c, c1;
Packit Service 9ac617
    c = (unsigned char) buf[i];
Packit Service 9ac617
    if (c < 0x80) {
Packit Service 9ac617
      ucs = c;	
Packit Service 9ac617
      i++;
Packit Service 9ac617
    } else if (c >= 0xA1 && c < 0xFF && len - i > 1) {
Packit Service 9ac617
      c1 = (unsigned char) buf[i + 1];		
Packit Service 9ac617
      if (c < 0xF5 && c1 >= 0xa1) {
Packit Service 9ac617
	unsigned char b[2];
Packit Service 9ac617
	b[0] = c - 0x80;
Packit Service 9ac617
	b[1] = c1 - 0x80;
Packit Service 9ac617
	if (jisx0208_mbtowc(NULL, &ucs, b, 2) < 1) { 
Packit Service 9ac617
	  ucs = '?';
Packit Service 9ac617
	}
Packit Service 9ac617
      } else if (c1 >= 0xA1 && c1 < 0xFF) {
Packit Service 9ac617
	ucs = 0xE000 + 94 * (c - 0xF5) + (c1 - 0xA1);
Packit Service 9ac617
      } else {
Packit Service 9ac617
	ucs = '?';
Packit Service 9ac617
      }
Packit Service 9ac617
      i += 2;
Packit Service 9ac617
    } else if (c == 0x8E && len - i > 1) {
Packit Service 9ac617
      c1 = (unsigned char) buf[i + 1];		
Packit Service 9ac617
      if (c1 >= 0xa1 && c1 <= 0xe0) {
Packit Service 9ac617
	if (jisx0201_mbtowc(NULL, &ucs, &c1, 1) != 1) {
Packit Service 9ac617
	  ucs = '?';
Packit Service 9ac617
	}
Packit Service 9ac617
      } else {
Packit Service 9ac617
	ucs = '?';
Packit Service 9ac617
      }
Packit Service 9ac617
      i += 2;
Packit Service 9ac617
    } else if (c == 0x8F && len - i > 2) {
Packit Service 9ac617
      c = (unsigned char) buf[i + 1];		
Packit Service 9ac617
      c1 = (unsigned char) buf[i + 2];	
Packit Service 9ac617
      if (c >= 0xa1 && c < 0xff) {
Packit Service 9ac617
	if (c < 0xf5 && c1 >= 0xa1 && c1 < 0xff) {
Packit Service 9ac617
	  unsigned char b[2];
Packit Service 9ac617
	  b[0] = c - 0x80;
Packit Service 9ac617
	  b[1] = c1 - 0x80;
Packit Service 9ac617
	  if (jisx0212_mbtowc(NULL, &ucs, b, 2) < 1) {
Packit Service 9ac617
	    ucs = '?';
Packit Service 9ac617
	  }
Packit Service 9ac617
	} else {
Packit Service 9ac617
	  ucs = '?';
Packit Service 9ac617
	}
Packit Service 9ac617
      } else {
Packit Service 9ac617
	if (c1 >= 0xa1 && c1 < 0xff) {
Packit Service 9ac617
	  ucs = 0xe3ac + 94 * (c - 0xF5) + (c1 - 0xA1);
Packit Service 9ac617
	} else {
Packit Service 9ac617
	  ucs = '?';
Packit Service 9ac617
	}
Packit Service 9ac617
      }
Packit Service 9ac617
      i += 3;
Packit Service 9ac617
    } else {
Packit Service 9ac617
      ucs = '?';
Packit Service 9ac617
      i++;
Packit Service 9ac617
    }
Packit Service 9ac617
    l += XConvertUcsToUtf8(ucs, buffer_return + l);
Packit Service 9ac617
  }
Packit Service 9ac617
  free(buf);
Packit Service 9ac617
  return l;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
static int
Packit Service 9ac617
XConvertEucToUtf8(const char*	locale,
Packit Service 9ac617
		  char*		buffer_return, 
Packit Service 9ac617
		  int		len, 
Packit Service 9ac617
		  int		bytes_buffer) {
Packit Service 9ac617
Packit Service 9ac617
  /* if (!locale) { */
Packit Service 9ac617
  /* if (!locale || strstr(locale, "UTF") || strstr(locale, "utf")) { */
Packit Service 9ac617
  if (!locale || strstr(locale, "UTF") || strstr(locale, "utf")) {
Packit Service 9ac617
    return len;
Packit Service 9ac617
  }
Packit Service 9ac617
Packit Service 9ac617
  if (strstr(locale, "ja")) {	
Packit Service 9ac617
    return XConvertEucJpToUtf8(buffer_return, len);
Packit Service 9ac617
  } else if (strstr(locale, "Big5") || strstr(locale, "big5")) { /* BIG5 */
Packit Service 9ac617
    return XConvertBig5ToUtf8(buffer_return, len);
Packit Service 9ac617
  } else if (strstr(locale, "GBK") || strstr(locale, "gbk")) {
Packit Service 9ac617
    return XConvertCp936extToUtf8(buffer_return, len);
Packit Service 9ac617
  } else if (strstr(locale, "zh") || strstr(locale, "chinese-")) {
Packit Service 9ac617
    if (strstr(locale, "TW") || strstr(locale, "chinese-t")) {
Packit Service 9ac617
      if (strstr(locale, "EUC") || strstr(locale, "euc") || strstr(locale, "chinese-t")) {
Packit Service 9ac617
	return XConvertEucTwToUtf8(buffer_return, len);
Packit Service 9ac617
      }
Packit Service 9ac617
      return XConvertBig5ToUtf8(buffer_return, len);
Packit Service 9ac617
    }
Packit Service 9ac617
    if (strstr(locale, "EUC") || strstr(locale, "euc")) {
Packit Service 9ac617
      return XConvertEucCnToUtf8(buffer_return, len);
Packit Service 9ac617
    }
Packit Service 9ac617
    return XConvertGb2312ToUtf8(buffer_return, len);
Packit Service 9ac617
  } else if (strstr(locale, "ko")) { 
Packit Service 9ac617
    return XConvertEucKrToUtf8(buffer_return, len);
Packit Service 9ac617
  }
Packit Service 9ac617
  return len;
Packit Service 9ac617
}
Packit Service 9ac617
Packit Service 9ac617
int
Packit Service 9ac617
XUtf8LookupString(XIC                 ic,
Packit Service 9ac617
		  XKeyPressedEvent*   event,
Packit Service 9ac617
		  char*               buffer_return,
Packit Service 9ac617
		  int                 bytes_buffer,
Packit Service 9ac617
		  KeySym*             keysym,
Packit Service 9ac617
		  Status*             status_return) {
Packit Service 9ac617
Packit Service 9ac617
  long ucs = -1;
Packit Service 9ac617
  int len;
Packit Service 9ac617
  len = XmbLookupString(ic, event, buffer_return, bytes_buffer / 5,
Packit Service 9ac617
		        keysym, status_return);
Packit Service 9ac617
  if (*status_return == XBufferOverflow) {
Packit Service 9ac617
    return len * 5;
Packit Service 9ac617
  }
Packit Service 9ac617
  if (*keysym > 0 && *keysym < 0x100 && len == 1) {
Packit Service 9ac617
    if (*keysym < 0x80) {
Packit Service 9ac617
      ucs = (unsigned char)buffer_return[0];
Packit Service 9ac617
    } else {
Packit Service 9ac617
      ucs = (long)*keysym;
Packit Service 9ac617
    }
Packit Service 9ac617
  } else  if (((*keysym >= 0x100 && *keysym <= 0xf000) ||
Packit Service 9ac617
	      (*keysym & 0xff000000U) == 0x01000000))
Packit Service 9ac617
  {
Packit Service 9ac617
    ucs = XKeysymToUcs(*keysym);
Packit Service 9ac617
  } else {
Packit Service 9ac617
    ucs = -2;
Packit Service 9ac617
  }
Packit Service 9ac617
Packit Service 9ac617
  if (ucs > 0) {
Packit Service 9ac617
    len = XConvertUcsToUtf8((unsigned)ucs, (char *)buffer_return);
Packit Service 9ac617
  } else if (len > 0) {
Packit Service 9ac617
    XIM im;
Packit Service 9ac617
    if (!ic) return 0;
Packit Service 9ac617
    im = XIMOfIC(ic);
Packit Service 9ac617
    if (!im) return 0;
Packit Service 9ac617
    len = XConvertEucToUtf8(XLocaleOfIM(im), buffer_return, len, bytes_buffer);	
Packit Service 9ac617
  }
Packit Service 9ac617
  return len;
Packit Service 9ac617
}
Packit Service 9ac617
#endif /* X11 has utf-8 */
Packit Service 9ac617
Packit Service 9ac617
#endif /* X11 only */
Packit Service 9ac617
Packit Service 9ac617
/*
Packit Service 9ac617
 * End of "$Id$".
Packit Service 9ac617
 */