aboutsummaryrefslogtreecommitdiff
path: root/libX11/modules
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2012-06-08 14:29:46 +0200
committermarha <marha@users.sourceforge.net>2012-06-08 14:50:37 +0200
commit72ec0e3bb2d7fc6b77b2a75873792f781679da6a (patch)
tree0a736ab9a8c26276929ab077dc661e3625b54884 /libX11/modules
parent5e865910f0ce672295bd60460631339be5e311a0 (diff)
parent990bc3f015a4f8fce2eb918375defcd44980a845 (diff)
downloadvcxsrv-72ec0e3bb2d7fc6b77b2a75873792f781679da6a.tar.gz
vcxsrv-72ec0e3bb2d7fc6b77b2a75873792f781679da6a.tar.bz2
vcxsrv-72ec0e3bb2d7fc6b77b2a75873792f781679da6a.zip
Merge remote-tracking branch 'origin/released'
Conflicts: fontconfig/.gitignore libX11/src/ConvSel.c libX11/src/CrGlCur.c libX11/src/CrWindow.c libX11/src/GetDflt.c libX11/src/Window.c libX11/src/xlibi18n/XimProto.h libX11/src/xlibi18n/lcDynamic.c libxcb/src/.gitignore libxcb/src/xcb_ext.c libxcb/src/xcb_xid.c mesalib/src/glsl/.gitignore mesalib/src/glsl/glcpp/.gitignore mesalib/src/mapi/glapi/gen/glX_API.xml mesalib/src/mapi/glapi/glapi_getproc.c mesalib/src/mesa/main/.gitignore mesalib/src/mesa/main/syncobj.c mesalib/src/mesa/program/.gitignore xkbcomp/listing.c xkbcomp/xkbpath.c xorg-server/.gitignore xorg-server/Xext/xvmain.c xorg-server/dix/dispatch.c xorg-server/hw/xwin/glx/winpriv.h xorg-server/hw/xwin/winprefsyacc.y xorg-server/hw/xwin/winscrinit.c xorg-server/xkeyboard-config/rules/bin/ml1_s.sh xorg-server/xkeyboard-config/rules/bin/ml1v1_s.sh xorg-server/xkeyboard-config/rules/bin/ml1v_s.sh xorg-server/xkeyboard-config/rules/bin/ml_s.sh xorg-server/xkeyboard-config/rules/bin/mlv_s.sh xorg-server/xkeyboard-config/rules/compat/.gitignore
Diffstat (limited to 'libX11/modules')
-rw-r--r--libX11/modules/Makefile.am2
-rw-r--r--libX11/modules/im/Makefile.am2
-rw-r--r--libX11/modules/im/ximcp/imDispch.c208
-rw-r--r--libX11/modules/im/ximcp/imImSw.c110
-rw-r--r--libX11/modules/im/ximcp/imLcPrs.c1370
-rw-r--r--libX11/modules/im/ximcp/imLcSIc.c108
-rw-r--r--libX11/modules/im/ximcp/imThaiFlt.c2842
-rw-r--r--libX11/modules/im/ximcp/imThaiIm.c470
-rw-r--r--libX11/modules/lc/Makefile.am2
-rw-r--r--libX11/modules/lc/Utf8/lcUTF8Load.c140
-rw-r--r--libX11/modules/lc/xlocale/lcEuc.c3074
-rw-r--r--libX11/modules/lc/xlocale/lcSjis.c3224
-rw-r--r--libX11/modules/om/Makefile.am2
-rw-r--r--libX11/modules/om/generic/omDefault.c898
-rw-r--r--libX11/modules/om/generic/omImText.c180
-rw-r--r--libX11/modules/om/generic/omText.c740
-rw-r--r--libX11/modules/om/generic/omTextEsc.c600
-rw-r--r--libX11/modules/om/generic/omTextExt.c270
-rw-r--r--libX11/modules/om/generic/omTextPer.c404
-rw-r--r--libX11/modules/om/generic/omXChar.c954
20 files changed, 7800 insertions, 7800 deletions
diff --git a/libX11/modules/Makefile.am b/libX11/modules/Makefile.am
index 76e33839c..1ef0dfbd7 100644
--- a/libX11/modules/Makefile.am
+++ b/libX11/modules/Makefile.am
@@ -1 +1 @@
-SUBDIRS=im lc om
+SUBDIRS=im lc om
diff --git a/libX11/modules/im/Makefile.am b/libX11/modules/im/Makefile.am
index 0974cf615..330a6dd6d 100644
--- a/libX11/modules/im/Makefile.am
+++ b/libX11/modules/im/Makefile.am
@@ -1 +1 @@
-SUBDIRS=ximcp
+SUBDIRS=ximcp
diff --git a/libX11/modules/im/ximcp/imDispch.c b/libX11/modules/im/ximcp/imDispch.c
index f9b4bdb77..3d67909ee 100644
--- a/libX11/modules/im/ximcp/imDispch.c
+++ b/libX11/modules/im/ximcp/imDispch.c
@@ -1,104 +1,104 @@
-/******************************************************************
-
- Copyright 1993, 1994 by FUJITSU LIMITED
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear
-in supporting documentation, and that the name of FUJITSU LIMITED
-not be used in advertising or publicity pertaining to distribution
-of the software without specific, written prior permission.
-FUJITSU LIMITED makes no representations about the suitability of
-this software for any purpose.
-It is provided "as is" without express or implied warranty.
-
-FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
-USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
- Author: Takashi Fujiwara FUJITSU LIMITED
- fujiwara@a80.tech.yk.fujitsu.co.jp
-
-******************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <X11/Xlib.h>
-#include "Xlibint.h"
-#include "Xutil.h"
-#include "Xlcint.h"
-#include "Ximint.h"
-
-
-Public Bool
-_XimRegProtoIntrCallback(
- Xim im,
- CARD16 major_code,
- CARD16 minor_code,
- Bool (*proc)(
- Xim, INT16, XPointer, XPointer
- ),
-
- XPointer call_data)
-{
- XimProtoIntrRec *rec;
-
- if (!(rec = (XimProtoIntrRec *)Xmalloc(sizeof(XimProtoIntrRec))))
- return False;
- rec->func = proc;
- rec->major_code = major_code;
- rec->minor_code = minor_code;
- rec->call_data = call_data;
- rec->next = im->private.proto.intrproto;
- im->private.proto.intrproto = rec;
- return True;
-}
-
-Public void
-_XimFreeProtoIntrCallback(Xim im)
-{
- register XimProtoIntrRec *rec, *next;
-
- for (rec = im->private.proto.intrproto; rec;) {
- next = rec->next;
- Xfree(rec);
- rec = next;
- }
- im->private.proto.intrproto = NULL;
- return;
-}
-
-Private Bool
-_XimTransportIntr(
- Xim im,
- INT16 len,
- XPointer data,
- XPointer call_data)
-{
- Xim call_im = (Xim)call_data;
- XimProtoIntrRec *rec = call_im->private.proto.intrproto;
- CARD8 major_opcode = *((CARD8 *)data);
- CARD8 minor_opcode = *((CARD8 *)data + 1);
-
- for (; rec; rec = rec->next) {
- if ((major_opcode == (CARD8)rec->major_code)
- && (minor_opcode == (CARD8)rec->minor_code))
- if ((*rec->func)(call_im, len, data, rec->call_data))
- return True;
- }
- return False;
-}
-
-Public Bool
-_XimDispatchInit(Xim im)
-{
- if (_XimRegisterDispatcher(im, _XimTransportIntr, (XPointer)im))
- return True;
- return False;
-}
+/******************************************************************
+
+ Copyright 1993, 1994 by FUJITSU LIMITED
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the name of FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+ Author: Takashi Fujiwara FUJITSU LIMITED
+ fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlib.h>
+#include "Xlibint.h"
+#include "Xutil.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+
+Public Bool
+_XimRegProtoIntrCallback(
+ Xim im,
+ CARD16 major_code,
+ CARD16 minor_code,
+ Bool (*proc)(
+ Xim, INT16, XPointer, XPointer
+ ),
+
+ XPointer call_data)
+{
+ XimProtoIntrRec *rec;
+
+ if (!(rec = (XimProtoIntrRec *)Xmalloc(sizeof(XimProtoIntrRec))))
+ return False;
+ rec->func = proc;
+ rec->major_code = major_code;
+ rec->minor_code = minor_code;
+ rec->call_data = call_data;
+ rec->next = im->private.proto.intrproto;
+ im->private.proto.intrproto = rec;
+ return True;
+}
+
+Public void
+_XimFreeProtoIntrCallback(Xim im)
+{
+ register XimProtoIntrRec *rec, *next;
+
+ for (rec = im->private.proto.intrproto; rec;) {
+ next = rec->next;
+ Xfree(rec);
+ rec = next;
+ }
+ im->private.proto.intrproto = NULL;
+ return;
+}
+
+Private Bool
+_XimTransportIntr(
+ Xim im,
+ INT16 len,
+ XPointer data,
+ XPointer call_data)
+{
+ Xim call_im = (Xim)call_data;
+ XimProtoIntrRec *rec = call_im->private.proto.intrproto;
+ CARD8 major_opcode = *((CARD8 *)data);
+ CARD8 minor_opcode = *((CARD8 *)data + 1);
+
+ for (; rec; rec = rec->next) {
+ if ((major_opcode == (CARD8)rec->major_code)
+ && (minor_opcode == (CARD8)rec->minor_code))
+ if ((*rec->func)(call_im, len, data, rec->call_data))
+ return True;
+ }
+ return False;
+}
+
+Public Bool
+_XimDispatchInit(Xim im)
+{
+ if (_XimRegisterDispatcher(im, _XimTransportIntr, (XPointer)im))
+ return True;
+ return False;
+}
diff --git a/libX11/modules/im/ximcp/imImSw.c b/libX11/modules/im/ximcp/imImSw.c
index acad4b8af..dfa6d6699 100644
--- a/libX11/modules/im/ximcp/imImSw.c
+++ b/libX11/modules/im/ximcp/imImSw.c
@@ -1,55 +1,55 @@
-/******************************************************************
-
- Copyright 1992, 1993 by FUJITSU LIMITED
- Copyright 1993 by Digital Equipment Corporation
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of FUJITSU LIMITED and
-Digital Equipment Corporation not be used in advertising or publicity
-pertaining to distribution of the software without specific, written
-prior permission. FUJITSU LIMITED and Digital Equipment Corporation
-makes no representations about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-
-FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
-WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR
-ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
-
- Author: Takashi Fujiwara FUJITSU LIMITED
- fujiwara@a80.tech.yk.fujitsu.co.jp
- Modifier: Franky Ling Digital Equipment Corporation
- frankyling@hgrd01.enet.dec.com
-
-******************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "Xlcint.h"
-#include "Ximint.h"
-#include "XimImSw.h"
-
-Private Bool
-_XimCheckIfDefault(
- Xim im)
-{
- return(True);
-}
-
-XimImsportSW _XimImSportRec[] = {
- { _XimCheckIfLocalProcessing, _XimLocalOpenIM, _XimLocalIMFree },
- { _XimCheckIfThaiProcessing, _XimThaiOpenIM, _XimThaiIMFree },
- { _XimCheckIfDefault, _XimProtoOpenIM, _XimProtoIMFree },
- { NULL, NULL, NULL },
-};
+/******************************************************************
+
+ Copyright 1992, 1993 by FUJITSU LIMITED
+ Copyright 1993 by Digital Equipment Corporation
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission. FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR
+ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+ Author: Takashi Fujiwara FUJITSU LIMITED
+ fujiwara@a80.tech.yk.fujitsu.co.jp
+ Modifier: Franky Ling Digital Equipment Corporation
+ frankyling@hgrd01.enet.dec.com
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimImSw.h"
+
+Private Bool
+_XimCheckIfDefault(
+ Xim im)
+{
+ return(True);
+}
+
+XimImsportSW _XimImSportRec[] = {
+ { _XimCheckIfLocalProcessing, _XimLocalOpenIM, _XimLocalIMFree },
+ { _XimCheckIfThaiProcessing, _XimThaiOpenIM, _XimThaiIMFree },
+ { _XimCheckIfDefault, _XimProtoOpenIM, _XimProtoIMFree },
+ { NULL, NULL, NULL },
+};
diff --git a/libX11/modules/im/ximcp/imLcPrs.c b/libX11/modules/im/ximcp/imLcPrs.c
index f5d6f8cd1..4e54385b5 100644
--- a/libX11/modules/im/ximcp/imLcPrs.c
+++ b/libX11/modules/im/ximcp/imLcPrs.c
@@ -1,685 +1,685 @@
-/******************************************************************
-
- Copyright 1992 by Oki Technosystems Laboratory, Inc.
- Copyright 1992 by Fuji Xerox Co., Ltd.
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear
-in supporting documentation, and that the name of Oki Technosystems
-Laboratory and Fuji Xerox not be used in advertising or publicity
-pertaining to distribution of the software without specific, written
-prior permission.
-Oki Technosystems Laboratory and Fuji Xerox make no representations
-about the suitability of this software for any purpose. It is provided
-"as is" without express or implied warranty.
-
-OKI TECHNOSYSTEMS LABORATORY AND FUJI XEROX DISCLAIM ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OKI TECHNOSYSTEMS
-LABORATORY AND FUJI XEROX BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
-OR PERFORMANCE OF THIS SOFTWARE.
-
- Author: Yasuhiro Kawai Oki Technosystems Laboratory
- Author: Kazunori Nishihara Fuji Xerox
-
-******************************************************************/
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <X11/Xlib.h>
-#include <X11/Xmd.h>
-#include <X11/Xos.h>
-#include "Xlibint.h"
-#include "Xlcint.h"
-#include "Ximint.h"
-#include <sys/stat.h>
-#include <stdio.h>
-
-#define XLC_BUFSIZE 256
-
-extern int _Xmbstowcs(
- wchar_t *wstr,
- char *str,
- int len
-);
-
-extern int _Xmbstoutf8(
- char *ustr,
- const char *str,
- int len
-);
-
-/*
- * Parsing File Format:
- *
- * FILE ::= { [PRODUCTION] [COMMENT] "\n"}
- * PRODUCTION ::= LHS ":" RHS [ COMMENT ]
- * COMMENT ::= "#" {<any character except null or newline>}
- * LHS ::= EVENT { EVENT }
- * EVENT ::= [MODIFIER_LIST] "<" keysym ">"
- * MODIFIER_LIST ::= ("!" {MODIFIER} ) | "None"
- * MODIFIER ::= ["~"] modifier_name
- * RHS ::= ( STRING | keysym | STRING keysym )
- * STRING ::= '"' { CHAR } '"'
- * CHAR ::= GRAPHIC_CHAR | ESCAPED_CHAR
- * GRAPHIC_CHAR ::= locale (codeset) dependent code
- * ESCAPED_CHAR ::= ('\\' | '\"' | OCTAL | HEX )
- * OCTAL ::= '\' OCTAL_CHAR [OCTAL_CHAR [OCTAL_CHAR]]
- * OCTAL_CHAR ::= (0|1|2|3|4|5|6|7)
- * HEX ::= '\' (x|X) HEX_CHAR [HEX_CHAR]]
- * HEX_CHAR ::= (0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|a|b|c|d|e|f)
- *
- */
-
-static int
-nextch(
- FILE *fp,
- int *lastch)
-{
- int c;
-
- if (*lastch != 0) {
- c = *lastch;
- *lastch = 0;
- } else {
- c = getc(fp);
- if (c == '\\') {
- c = getc(fp);
- if (c == '\n') {
- c = getc(fp);
- } else {
- ungetc(c, fp);
- c = '\\';
- }
- }
- }
- return(c);
-}
-
-static void
-putbackch(
- int c,
- int *lastch)
-{
- *lastch = c;
-}
-
-#define ENDOFFILE 0
-#define ENDOFLINE 1
-#define COLON 2
-#define LESS 3
-#define GREATER 4
-#define EXCLAM 5
-#define TILDE 6
-#define STRING 7
-#define KEY 8
-#define ERROR 9
-
-#ifndef isalnum
-#define isalnum(c) \
- (('0' <= (c) && (c) <= '9') || \
- ('A' <= (c) && (c) <= 'Z') || \
- ('a' <= (c) && (c) <= 'z'))
-#endif
-
-static int
-nexttoken(
- FILE *fp,
- char *tokenbuf,
- int *lastch)
-{
- int c;
- int token;
- char *p;
- int i, j;
-
- while ((c = nextch(fp, lastch)) == ' ' || c == '\t') {
- }
- switch (c) {
- case EOF:
- token = ENDOFFILE;
- break;
- case '\n':
- token = ENDOFLINE;
- break;
- case '<':
- token = LESS;
- break;
- case '>':
- token = GREATER;
- break;
- case ':':
- token = COLON;
- break;
- case '!':
- token = EXCLAM;
- break;
- case '~':
- token = TILDE;
- break;
- case '"':
- p = tokenbuf;
- while ((c = nextch(fp, lastch)) != '"') {
- if (c == '\n' || c == EOF) {
- putbackch(c, lastch);
- token = ERROR;
- goto string_error;
- } else if (c == '\\') {
- c = nextch(fp, lastch);
- switch (c) {
- case '\\':
- case '"':
- *p++ = c;
- break;
- case 'n':
- *p++ = '\n';
- break;
- case 'r':
- *p++ = '\r';
- break;
- case 't':
- *p++ = '\t';
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- i = c - '0';
- c = nextch(fp, lastch);
- for (j = 0; j < 2 && c >= '0' && c <= '7'; j++) {
- i <<= 3;
- i += c - '0';
- c = nextch(fp, lastch);
- }
- putbackch(c, lastch);
- *p++ = (char)i;
- break;
- case 'X':
- case 'x':
- i = 0;
- for (j = 0; j < 2; j++) {
- c = nextch(fp, lastch);
- i <<= 4;
- if (c >= '0' && c <= '9') {
- i += c - '0';
- } else if (c >= 'A' && c <= 'F') {
- i += c - 'A' + 10;
- } else if (c >= 'a' && c <= 'f') {
- i += c - 'a' + 10;
- } else {
- putbackch(c, lastch);
- i >>= 4;
- break;
- }
- }
- if (j == 0) {
- token = ERROR;
- goto string_error;
- }
- *p++ = (char)i;
- break;
- case EOF:
- putbackch(c, lastch);
- token = ERROR;
- goto string_error;
- default:
- *p++ = c;
- break;
- }
- } else {
- *p++ = c;
- }
- }
- *p = '\0';
- token = STRING;
- break;
- case '#':
- while ((c = nextch(fp, lastch)) != '\n' && c != EOF) {
- }
- if (c == '\n') {
- token = ENDOFLINE;
- } else {
- token = ENDOFFILE;
- }
- break;
- default:
- if (isalnum(c) || c == '_' || c == '-') {
- p = tokenbuf;
- *p++ = c;
- c = nextch(fp, lastch);
- while (isalnum(c) || c == '_' || c == '-') {
- *p++ = c;
- c = nextch(fp, lastch);
- }
- *p = '\0';
- putbackch(c, lastch);
- token = KEY;
- } else {
- token = ERROR;
- }
- break;
- }
-string_error:
- return(token);
-}
-
-static long
-modmask(
- char *name)
-{
- struct _modtbl {
- const char name[6];
- long mask;
- };
-
- static const struct _modtbl tbl[] = {
- { "Ctrl", ControlMask },
- { "Lock", LockMask },
- { "Caps", LockMask },
- { "Shift", ShiftMask },
- { "Alt", Mod1Mask },
- { "Meta", Mod1Mask }};
-
- int i, num_entries = sizeof (tbl) / sizeof (tbl[0]);
-
- for (i = 0; i < num_entries; i++)
- if (!strcmp (name, tbl[i].name))
- return tbl[i].mask;
-
- return 0;
-}
-
-static char*
-TransFileName(Xim im, char *name)
-{
- char *home = NULL, *lcCompose = NULL;
- char dir[XLC_BUFSIZE];
- char *i = name, *ret, *j;
- int l = 0;
-
- while (*i) {
- if (*i == '%') {
- i++;
- switch (*i) {
- case '%':
- l++;
- break;
- case 'H':
- home = getenv("HOME");
- if (home)
- l += strlen(home);
- break;
- case 'L':
- if (lcCompose == NULL)
- lcCompose = _XlcFileName(im->core.lcd, COMPOSE_FILE);
- if (lcCompose)
- l += strlen(lcCompose);
- break;
- case 'S':
- xlocaledir(dir, XLC_BUFSIZE);
- l += strlen(dir);
- break;
- }
- } else {
- l++;
- }
- i++;
- }
-
- j = ret = Xmalloc(l+1);
- if (ret == NULL)
- return ret;
- i = name;
- while (*i) {
- if (*i == '%') {
- i++;
- switch (*i) {
- case '%':
- *j++ = '%';
- break;
- case 'H':
- if (home) {
- strcpy(j, home);
- j += strlen(home);
- }
- break;
- case 'L':
- if (lcCompose) {
- strcpy(j, lcCompose);
- j += strlen(lcCompose);
- }
- break;
- case 'S':
- strcpy(j, dir);
- j += strlen(dir);
- break;
- }
- i++;
- } else {
- *j++ = *i++;
- }
- }
- *j = '\0';
- Xfree(lcCompose);
- return ret;
-}
-
-#ifndef MB_LEN_MAX
-#define MB_LEN_MAX 6
-#endif
-
-static int
-get_mb_string (Xim im, char *buf, KeySym ks)
-{
- XPointer from, to;
- int from_len, to_len, len;
- XPointer args[1];
- XlcCharSet charset;
- char local_buf[MB_LEN_MAX];
- unsigned int ucs;
- ucs = KeySymToUcs4(ks);
-
- from = (XPointer) &ucs;
- to = (XPointer) local_buf;
- from_len = 1;
- to_len = MB_LEN_MAX;
- args[0] = (XPointer) &charset;
- if (_XlcConvert(im->private.local.ucstoc_conv,
- &from, &from_len, &to, &to_len, args, 1 ) != 0) {
- return 0;
- }
-
- from = (XPointer) local_buf;
- to = (XPointer) buf;
- from_len = MB_LEN_MAX - to_len;
- to_len = MB_LEN_MAX + 1;
- args[0] = (XPointer) charset;
- if (_XlcConvert(im->private.local.cstomb_conv,
- &from, &from_len, &to, &to_len, args, 1 ) != 0) {
- return 0;
- }
- len = MB_LEN_MAX + 1 - to_len;
- buf[len] = '\0';
- return len;
-}
-
-#define AllMask (ShiftMask | LockMask | ControlMask | Mod1Mask)
-#define LOCAL_WC_BUFSIZE 128
-#define LOCAL_UTF8_BUFSIZE 256
-#define SEQUENCE_MAX 10
-
-static int
-parseline(
- FILE *fp,
- Xim im,
- char* tokenbuf)
-{
- int token;
- DTModifier modifier_mask;
- DTModifier modifier;
- DTModifier tmp;
- KeySym keysym = NoSymbol;
- DTIndex *top = &im->private.local.top;
- DefTreeBase *b = &im->private.local.base;
- DTIndex t;
- DefTree *p = NULL;
- Bool exclam, tilde;
- KeySym rhs_keysym = 0;
- char *rhs_string_mb;
- int l;
- int lastch = 0;
- char local_mb_buf[MB_LEN_MAX+1];
- wchar_t local_wc_buf[LOCAL_WC_BUFSIZE], *rhs_string_wc;
- char local_utf8_buf[LOCAL_UTF8_BUFSIZE], *rhs_string_utf8;
-
- struct DefBuffer {
- DTModifier modifier_mask;
- DTModifier modifier;
- KeySym keysym;
- };
-
- struct DefBuffer buf[SEQUENCE_MAX];
- int i, n;
-
- do {
- token = nexttoken(fp, tokenbuf, &lastch);
- } while (token == ENDOFLINE);
-
- if (token == ENDOFFILE) {
- return(-1);
- }
-
- n = 0;
- do {
- if ((token == KEY) && (strcmp("include", tokenbuf) == 0)) {
- char *filename;
- FILE *infp;
- token = nexttoken(fp, tokenbuf, &lastch);
- if (token != KEY && token != STRING)
- goto error;
- if ((filename = TransFileName(im, tokenbuf)) == NULL)
- goto error;
- infp = _XFopenFile(filename, "r");
- Xfree(filename);
- if (infp == NULL)
- goto error;
- _XimParseStringFile(infp, im);
- fclose(infp);
- return (0);
- } else if ((token == KEY) && (strcmp("None", tokenbuf) == 0)) {
- modifier = 0;
- modifier_mask = AllMask;
- token = nexttoken(fp, tokenbuf, &lastch);
- } else {
- modifier_mask = modifier = 0;
- exclam = False;
- if (token == EXCLAM) {
- exclam = True;
- token = nexttoken(fp, tokenbuf, &lastch);
- }
- while (token == TILDE || token == KEY) {
- tilde = False;
- if (token == TILDE) {
- tilde = True;
- token = nexttoken(fp, tokenbuf, &lastch);
- if (token != KEY)
- goto error;
- }
- tmp = modmask(tokenbuf);
- if (!tmp) {
- goto error;
- }
- modifier_mask |= tmp;
- if (tilde) {
- modifier &= ~tmp;
- } else {
- modifier |= tmp;
- }
- token = nexttoken(fp, tokenbuf, &lastch);
- }
- if (exclam) {
- modifier_mask = AllMask;
- }
- }
-
- if (token != LESS) {
- goto error;
- }
-
- token = nexttoken(fp, tokenbuf, &lastch);
- if (token != KEY) {
- goto error;
- }
-
- token = nexttoken(fp, tokenbuf, &lastch);
- if (token != GREATER) {
- goto error;
- }
-
- keysym = XStringToKeysym(tokenbuf);
- if (keysym == NoSymbol) {
- goto error;
- }
-
- buf[n].keysym = keysym;
- buf[n].modifier = modifier;
- buf[n].modifier_mask = modifier_mask;
- n++;
- if( n >= SEQUENCE_MAX )
- goto error;
- token = nexttoken(fp, tokenbuf, &lastch);
- } while (token != COLON);
-
- token = nexttoken(fp, tokenbuf, &lastch);
- if (token == STRING) {
- l = strlen(tokenbuf) + 1;
- while (b->mbused + l > b->mbsize) {
- b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024;
- if (! (b->mb = Xrealloc (b->mb, b->mbsize)) )
- goto error;
- }
- rhs_string_mb = &b->mb[b->mbused];
- b->mbused += l;
- strcpy(rhs_string_mb, tokenbuf);
- token = nexttoken(fp, tokenbuf, &lastch);
- if (token == KEY) {
- rhs_keysym = XStringToKeysym(tokenbuf);
- if (rhs_keysym == NoSymbol) {
- goto error;
- }
- token = nexttoken(fp, tokenbuf, &lastch);
- }
- if (token != ENDOFLINE && token != ENDOFFILE) {
- goto error;
- }
- } else if (token == KEY) {
- rhs_keysym = XStringToKeysym(tokenbuf);
- if (rhs_keysym == NoSymbol) {
- goto error;
- }
- token = nexttoken(fp, tokenbuf, &lastch);
- if (token != ENDOFLINE && token != ENDOFFILE) {
- goto error;
- }
-
- l = get_mb_string(im, local_mb_buf, rhs_keysym);
- while (b->mbused + l + 1 > b->mbsize) {
- b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024;
- if (! (b->mb = Xrealloc (b->mb, b->mbsize)) )
- goto error;
- }
- rhs_string_mb = &b->mb[b->mbused];
- b->mbused += l + 1;
- memcpy(rhs_string_mb, local_mb_buf, l);
- rhs_string_mb[l] = '\0';
- } else {
- goto error;
- }
-
- l = _Xmbstowcs(local_wc_buf, rhs_string_mb, LOCAL_WC_BUFSIZE - 1);
- if (l == LOCAL_WC_BUFSIZE - 1) {
- local_wc_buf[l] = (wchar_t)'\0';
- }
- while (b->wcused + l + 1 > b->wcsize) {
- b->wcsize = b->wcsize ? b->wcsize * 1.5 : 512;
- if (! (b->wc = Xrealloc (b->wc, sizeof(wchar_t) * b->wcsize)) )
- goto error;
- }
- rhs_string_wc = &b->wc[b->wcused];
- b->wcused += l + 1;
- memcpy((char *)rhs_string_wc, (char *)local_wc_buf, (l + 1) * sizeof(wchar_t) );
-
- l = _Xmbstoutf8(local_utf8_buf, rhs_string_mb, LOCAL_UTF8_BUFSIZE - 1);
- if (l == LOCAL_UTF8_BUFSIZE - 1) {
- local_utf8_buf[l] = '\0';
- }
- while (b->utf8used + l + 1 > b->utf8size) {
- b->utf8size = b->utf8size ? b->utf8size * 1.5 : 1024;
- if (! (b->utf8 = Xrealloc (b->utf8, b->utf8size)) )
- goto error;
- }
- rhs_string_utf8 = &b->utf8[b->utf8used];
- b->utf8used += l + 1;
- memcpy(rhs_string_utf8, local_utf8_buf, l + 1);
-
- for (i = 0; i < n; i++) {
- for (t = *top; t; t = b->tree[t].next) {
- if (buf[i].keysym == b->tree[t].keysym &&
- buf[i].modifier == b->tree[t].modifier &&
- buf[i].modifier_mask == b->tree[t].modifier_mask) {
- break;
- }
- }
- if (t) {
- p = &b->tree[t];
- top = &p->succession;
- } else {
- while (b->treeused >= b->treesize) {
- DefTree *old = b->tree;
- int oldsize = b->treesize;
- b->treesize = b->treesize ? b->treesize * 1.5 : 256;
- if (! (b->tree = Xrealloc (b->tree, sizeof(DefTree) * b->treesize)) )
- goto error;
- if (top >= (DTIndex *) old && top < (DTIndex *) &old[oldsize])
- top = (DTIndex *) (((char *) top) + (((char *)b->tree)-(char *)old));
- }
- p = &b->tree[b->treeused];
- p->keysym = buf[i].keysym;
- p->modifier = buf[i].modifier;
- p->modifier_mask = buf[i].modifier_mask;
- p->succession = 0;
- p->next = *top;
- p->mb = 0;
- p->wc = 0;
- p->utf8 = 0;
- p->ks = NoSymbol;
- *top = b->treeused;
- top = &p->succession;
- b->treeused++;
- }
- }
-
- /* old entries no longer freed... */
- p->mb = rhs_string_mb - b->mb;
- p->wc = rhs_string_wc - b->wc;
- p->utf8 = rhs_string_utf8 - b->utf8;
- p->ks = rhs_keysym;
- return(n);
-error:
- while (token != ENDOFLINE && token != ENDOFFILE) {
- token = nexttoken(fp, tokenbuf, &lastch);
- }
- return(0);
-}
-
-void
-_XimParseStringFile(
- FILE *fp,
- Xim im)
-{
- char tb[8192];
- char* tbp;
- struct stat st;
-
- if (fstat (fileno (fp), &st) != -1) {
- unsigned long size = (unsigned long) st.st_size;
- if (size <= sizeof tb) tbp = tb;
- else tbp = malloc (size);
-
- if (tbp != NULL) {
- while (parseline(fp, im, tbp) >= 0) {}
- if (tbp != tb) free (tbp);
- }
- }
-}
+/******************************************************************
+
+ Copyright 1992 by Oki Technosystems Laboratory, Inc.
+ Copyright 1992 by Fuji Xerox Co., Ltd.
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the name of Oki Technosystems
+Laboratory and Fuji Xerox not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.
+Oki Technosystems Laboratory and Fuji Xerox make no representations
+about the suitability of this software for any purpose. It is provided
+"as is" without express or implied warranty.
+
+OKI TECHNOSYSTEMS LABORATORY AND FUJI XEROX DISCLAIM ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OKI TECHNOSYSTEMS
+LABORATORY AND FUJI XEROX BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THIS SOFTWARE.
+
+ Author: Yasuhiro Kawai Oki Technosystems Laboratory
+ Author: Kazunori Nishihara Fuji Xerox
+
+******************************************************************/
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include <sys/stat.h>
+#include <stdio.h>
+
+#define XLC_BUFSIZE 256
+
+extern int _Xmbstowcs(
+ wchar_t *wstr,
+ char *str,
+ int len
+);
+
+extern int _Xmbstoutf8(
+ char *ustr,
+ const char *str,
+ int len
+);
+
+/*
+ * Parsing File Format:
+ *
+ * FILE ::= { [PRODUCTION] [COMMENT] "\n"}
+ * PRODUCTION ::= LHS ":" RHS [ COMMENT ]
+ * COMMENT ::= "#" {<any character except null or newline>}
+ * LHS ::= EVENT { EVENT }
+ * EVENT ::= [MODIFIER_LIST] "<" keysym ">"
+ * MODIFIER_LIST ::= ("!" {MODIFIER} ) | "None"
+ * MODIFIER ::= ["~"] modifier_name
+ * RHS ::= ( STRING | keysym | STRING keysym )
+ * STRING ::= '"' { CHAR } '"'
+ * CHAR ::= GRAPHIC_CHAR | ESCAPED_CHAR
+ * GRAPHIC_CHAR ::= locale (codeset) dependent code
+ * ESCAPED_CHAR ::= ('\\' | '\"' | OCTAL | HEX )
+ * OCTAL ::= '\' OCTAL_CHAR [OCTAL_CHAR [OCTAL_CHAR]]
+ * OCTAL_CHAR ::= (0|1|2|3|4|5|6|7)
+ * HEX ::= '\' (x|X) HEX_CHAR [HEX_CHAR]]
+ * HEX_CHAR ::= (0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|a|b|c|d|e|f)
+ *
+ */
+
+static int
+nextch(
+ FILE *fp,
+ int *lastch)
+{
+ int c;
+
+ if (*lastch != 0) {
+ c = *lastch;
+ *lastch = 0;
+ } else {
+ c = getc(fp);
+ if (c == '\\') {
+ c = getc(fp);
+ if (c == '\n') {
+ c = getc(fp);
+ } else {
+ ungetc(c, fp);
+ c = '\\';
+ }
+ }
+ }
+ return(c);
+}
+
+static void
+putbackch(
+ int c,
+ int *lastch)
+{
+ *lastch = c;
+}
+
+#define ENDOFFILE 0
+#define ENDOFLINE 1
+#define COLON 2
+#define LESS 3
+#define GREATER 4
+#define EXCLAM 5
+#define TILDE 6
+#define STRING 7
+#define KEY 8
+#define ERROR 9
+
+#ifndef isalnum
+#define isalnum(c) \
+ (('0' <= (c) && (c) <= '9') || \
+ ('A' <= (c) && (c) <= 'Z') || \
+ ('a' <= (c) && (c) <= 'z'))
+#endif
+
+static int
+nexttoken(
+ FILE *fp,
+ char *tokenbuf,
+ int *lastch)
+{
+ int c;
+ int token;
+ char *p;
+ int i, j;
+
+ while ((c = nextch(fp, lastch)) == ' ' || c == '\t') {
+ }
+ switch (c) {
+ case EOF:
+ token = ENDOFFILE;
+ break;
+ case '\n':
+ token = ENDOFLINE;
+ break;
+ case '<':
+ token = LESS;
+ break;
+ case '>':
+ token = GREATER;
+ break;
+ case ':':
+ token = COLON;
+ break;
+ case '!':
+ token = EXCLAM;
+ break;
+ case '~':
+ token = TILDE;
+ break;
+ case '"':
+ p = tokenbuf;
+ while ((c = nextch(fp, lastch)) != '"') {
+ if (c == '\n' || c == EOF) {
+ putbackch(c, lastch);
+ token = ERROR;
+ goto string_error;
+ } else if (c == '\\') {
+ c = nextch(fp, lastch);
+ switch (c) {
+ case '\\':
+ case '"':
+ *p++ = c;
+ break;
+ case 'n':
+ *p++ = '\n';
+ break;
+ case 'r':
+ *p++ = '\r';
+ break;
+ case 't':
+ *p++ = '\t';
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ i = c - '0';
+ c = nextch(fp, lastch);
+ for (j = 0; j < 2 && c >= '0' && c <= '7'; j++) {
+ i <<= 3;
+ i += c - '0';
+ c = nextch(fp, lastch);
+ }
+ putbackch(c, lastch);
+ *p++ = (char)i;
+ break;
+ case 'X':
+ case 'x':
+ i = 0;
+ for (j = 0; j < 2; j++) {
+ c = nextch(fp, lastch);
+ i <<= 4;
+ if (c >= '0' && c <= '9') {
+ i += c - '0';
+ } else if (c >= 'A' && c <= 'F') {
+ i += c - 'A' + 10;
+ } else if (c >= 'a' && c <= 'f') {
+ i += c - 'a' + 10;
+ } else {
+ putbackch(c, lastch);
+ i >>= 4;
+ break;
+ }
+ }
+ if (j == 0) {
+ token = ERROR;
+ goto string_error;
+ }
+ *p++ = (char)i;
+ break;
+ case EOF:
+ putbackch(c, lastch);
+ token = ERROR;
+ goto string_error;
+ default:
+ *p++ = c;
+ break;
+ }
+ } else {
+ *p++ = c;
+ }
+ }
+ *p = '\0';
+ token = STRING;
+ break;
+ case '#':
+ while ((c = nextch(fp, lastch)) != '\n' && c != EOF) {
+ }
+ if (c == '\n') {
+ token = ENDOFLINE;
+ } else {
+ token = ENDOFFILE;
+ }
+ break;
+ default:
+ if (isalnum(c) || c == '_' || c == '-') {
+ p = tokenbuf;
+ *p++ = c;
+ c = nextch(fp, lastch);
+ while (isalnum(c) || c == '_' || c == '-') {
+ *p++ = c;
+ c = nextch(fp, lastch);
+ }
+ *p = '\0';
+ putbackch(c, lastch);
+ token = KEY;
+ } else {
+ token = ERROR;
+ }
+ break;
+ }
+string_error:
+ return(token);
+}
+
+static long
+modmask(
+ char *name)
+{
+ struct _modtbl {
+ const char name[6];
+ long mask;
+ };
+
+ static const struct _modtbl tbl[] = {
+ { "Ctrl", ControlMask },
+ { "Lock", LockMask },
+ { "Caps", LockMask },
+ { "Shift", ShiftMask },
+ { "Alt", Mod1Mask },
+ { "Meta", Mod1Mask }};
+
+ int i, num_entries = sizeof (tbl) / sizeof (tbl[0]);
+
+ for (i = 0; i < num_entries; i++)
+ if (!strcmp (name, tbl[i].name))
+ return tbl[i].mask;
+
+ return 0;
+}
+
+static char*
+TransFileName(Xim im, char *name)
+{
+ char *home = NULL, *lcCompose = NULL;
+ char dir[XLC_BUFSIZE];
+ char *i = name, *ret, *j;
+ int l = 0;
+
+ while (*i) {
+ if (*i == '%') {
+ i++;
+ switch (*i) {
+ case '%':
+ l++;
+ break;
+ case 'H':
+ home = getenv("HOME");
+ if (home)
+ l += strlen(home);
+ break;
+ case 'L':
+ if (lcCompose == NULL)
+ lcCompose = _XlcFileName(im->core.lcd, COMPOSE_FILE);
+ if (lcCompose)
+ l += strlen(lcCompose);
+ break;
+ case 'S':
+ xlocaledir(dir, XLC_BUFSIZE);
+ l += strlen(dir);
+ break;
+ }
+ } else {
+ l++;
+ }
+ i++;
+ }
+
+ j = ret = Xmalloc(l+1);
+ if (ret == NULL)
+ return ret;
+ i = name;
+ while (*i) {
+ if (*i == '%') {
+ i++;
+ switch (*i) {
+ case '%':
+ *j++ = '%';
+ break;
+ case 'H':
+ if (home) {
+ strcpy(j, home);
+ j += strlen(home);
+ }
+ break;
+ case 'L':
+ if (lcCompose) {
+ strcpy(j, lcCompose);
+ j += strlen(lcCompose);
+ }
+ break;
+ case 'S':
+ strcpy(j, dir);
+ j += strlen(dir);
+ break;
+ }
+ i++;
+ } else {
+ *j++ = *i++;
+ }
+ }
+ *j = '\0';
+ Xfree(lcCompose);
+ return ret;
+}
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 6
+#endif
+
+static int
+get_mb_string (Xim im, char *buf, KeySym ks)
+{
+ XPointer from, to;
+ int from_len, to_len, len;
+ XPointer args[1];
+ XlcCharSet charset;
+ char local_buf[MB_LEN_MAX];
+ unsigned int ucs;
+ ucs = KeySymToUcs4(ks);
+
+ from = (XPointer) &ucs;
+ to = (XPointer) local_buf;
+ from_len = 1;
+ to_len = MB_LEN_MAX;
+ args[0] = (XPointer) &charset;
+ if (_XlcConvert(im->private.local.ucstoc_conv,
+ &from, &from_len, &to, &to_len, args, 1 ) != 0) {
+ return 0;
+ }
+
+ from = (XPointer) local_buf;
+ to = (XPointer) buf;
+ from_len = MB_LEN_MAX - to_len;
+ to_len = MB_LEN_MAX + 1;
+ args[0] = (XPointer) charset;
+ if (_XlcConvert(im->private.local.cstomb_conv,
+ &from, &from_len, &to, &to_len, args, 1 ) != 0) {
+ return 0;
+ }
+ len = MB_LEN_MAX + 1 - to_len;
+ buf[len] = '\0';
+ return len;
+}
+
+#define AllMask (ShiftMask | LockMask | ControlMask | Mod1Mask)
+#define LOCAL_WC_BUFSIZE 128
+#define LOCAL_UTF8_BUFSIZE 256
+#define SEQUENCE_MAX 10
+
+static int
+parseline(
+ FILE *fp,
+ Xim im,
+ char* tokenbuf)
+{
+ int token;
+ DTModifier modifier_mask;
+ DTModifier modifier;
+ DTModifier tmp;
+ KeySym keysym = NoSymbol;
+ DTIndex *top = &im->private.local.top;
+ DefTreeBase *b = &im->private.local.base;
+ DTIndex t;
+ DefTree *p = NULL;
+ Bool exclam, tilde;
+ KeySym rhs_keysym = 0;
+ char *rhs_string_mb;
+ int l;
+ int lastch = 0;
+ char local_mb_buf[MB_LEN_MAX+1];
+ wchar_t local_wc_buf[LOCAL_WC_BUFSIZE], *rhs_string_wc;
+ char local_utf8_buf[LOCAL_UTF8_BUFSIZE], *rhs_string_utf8;
+
+ struct DefBuffer {
+ DTModifier modifier_mask;
+ DTModifier modifier;
+ KeySym keysym;
+ };
+
+ struct DefBuffer buf[SEQUENCE_MAX];
+ int i, n;
+
+ do {
+ token = nexttoken(fp, tokenbuf, &lastch);
+ } while (token == ENDOFLINE);
+
+ if (token == ENDOFFILE) {
+ return(-1);
+ }
+
+ n = 0;
+ do {
+ if ((token == KEY) && (strcmp("include", tokenbuf) == 0)) {
+ char *filename;
+ FILE *infp;
+ token = nexttoken(fp, tokenbuf, &lastch);
+ if (token != KEY && token != STRING)
+ goto error;
+ if ((filename = TransFileName(im, tokenbuf)) == NULL)
+ goto error;
+ infp = _XFopenFile(filename, "r");
+ Xfree(filename);
+ if (infp == NULL)
+ goto error;
+ _XimParseStringFile(infp, im);
+ fclose(infp);
+ return (0);
+ } else if ((token == KEY) && (strcmp("None", tokenbuf) == 0)) {
+ modifier = 0;
+ modifier_mask = AllMask;
+ token = nexttoken(fp, tokenbuf, &lastch);
+ } else {
+ modifier_mask = modifier = 0;
+ exclam = False;
+ if (token == EXCLAM) {
+ exclam = True;
+ token = nexttoken(fp, tokenbuf, &lastch);
+ }
+ while (token == TILDE || token == KEY) {
+ tilde = False;
+ if (token == TILDE) {
+ tilde = True;
+ token = nexttoken(fp, tokenbuf, &lastch);
+ if (token != KEY)
+ goto error;
+ }
+ tmp = modmask(tokenbuf);
+ if (!tmp) {
+ goto error;
+ }
+ modifier_mask |= tmp;
+ if (tilde) {
+ modifier &= ~tmp;
+ } else {
+ modifier |= tmp;
+ }
+ token = nexttoken(fp, tokenbuf, &lastch);
+ }
+ if (exclam) {
+ modifier_mask = AllMask;
+ }
+ }
+
+ if (token != LESS) {
+ goto error;
+ }
+
+ token = nexttoken(fp, tokenbuf, &lastch);
+ if (token != KEY) {
+ goto error;
+ }
+
+ token = nexttoken(fp, tokenbuf, &lastch);
+ if (token != GREATER) {
+ goto error;
+ }
+
+ keysym = XStringToKeysym(tokenbuf);
+ if (keysym == NoSymbol) {
+ goto error;
+ }
+
+ buf[n].keysym = keysym;
+ buf[n].modifier = modifier;
+ buf[n].modifier_mask = modifier_mask;
+ n++;
+ if( n >= SEQUENCE_MAX )
+ goto error;
+ token = nexttoken(fp, tokenbuf, &lastch);
+ } while (token != COLON);
+
+ token = nexttoken(fp, tokenbuf, &lastch);
+ if (token == STRING) {
+ l = strlen(tokenbuf) + 1;
+ while (b->mbused + l > b->mbsize) {
+ b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024;
+ if (! (b->mb = Xrealloc (b->mb, b->mbsize)) )
+ goto error;
+ }
+ rhs_string_mb = &b->mb[b->mbused];
+ b->mbused += l;
+ strcpy(rhs_string_mb, tokenbuf);
+ token = nexttoken(fp, tokenbuf, &lastch);
+ if (token == KEY) {
+ rhs_keysym = XStringToKeysym(tokenbuf);
+ if (rhs_keysym == NoSymbol) {
+ goto error;
+ }
+ token = nexttoken(fp, tokenbuf, &lastch);
+ }
+ if (token != ENDOFLINE && token != ENDOFFILE) {
+ goto error;
+ }
+ } else if (token == KEY) {
+ rhs_keysym = XStringToKeysym(tokenbuf);
+ if (rhs_keysym == NoSymbol) {
+ goto error;
+ }
+ token = nexttoken(fp, tokenbuf, &lastch);
+ if (token != ENDOFLINE && token != ENDOFFILE) {
+ goto error;
+ }
+
+ l = get_mb_string(im, local_mb_buf, rhs_keysym);
+ while (b->mbused + l + 1 > b->mbsize) {
+ b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024;
+ if (! (b->mb = Xrealloc (b->mb, b->mbsize)) )
+ goto error;
+ }
+ rhs_string_mb = &b->mb[b->mbused];
+ b->mbused += l + 1;
+ memcpy(rhs_string_mb, local_mb_buf, l);
+ rhs_string_mb[l] = '\0';
+ } else {
+ goto error;
+ }
+
+ l = _Xmbstowcs(local_wc_buf, rhs_string_mb, LOCAL_WC_BUFSIZE - 1);
+ if (l == LOCAL_WC_BUFSIZE - 1) {
+ local_wc_buf[l] = (wchar_t)'\0';
+ }
+ while (b->wcused + l + 1 > b->wcsize) {
+ b->wcsize = b->wcsize ? b->wcsize * 1.5 : 512;
+ if (! (b->wc = Xrealloc (b->wc, sizeof(wchar_t) * b->wcsize)) )
+ goto error;
+ }
+ rhs_string_wc = &b->wc[b->wcused];
+ b->wcused += l + 1;
+ memcpy((char *)rhs_string_wc, (char *)local_wc_buf, (l + 1) * sizeof(wchar_t) );
+
+ l = _Xmbstoutf8(local_utf8_buf, rhs_string_mb, LOCAL_UTF8_BUFSIZE - 1);
+ if (l == LOCAL_UTF8_BUFSIZE - 1) {
+ local_utf8_buf[l] = '\0';
+ }
+ while (b->utf8used + l + 1 > b->utf8size) {
+ b->utf8size = b->utf8size ? b->utf8size * 1.5 : 1024;
+ if (! (b->utf8 = Xrealloc (b->utf8, b->utf8size)) )
+ goto error;
+ }
+ rhs_string_utf8 = &b->utf8[b->utf8used];
+ b->utf8used += l + 1;
+ memcpy(rhs_string_utf8, local_utf8_buf, l + 1);
+
+ for (i = 0; i < n; i++) {
+ for (t = *top; t; t = b->tree[t].next) {
+ if (buf[i].keysym == b->tree[t].keysym &&
+ buf[i].modifier == b->tree[t].modifier &&
+ buf[i].modifier_mask == b->tree[t].modifier_mask) {
+ break;
+ }
+ }
+ if (t) {
+ p = &b->tree[t];
+ top = &p->succession;
+ } else {
+ while (b->treeused >= b->treesize) {
+ DefTree *old = b->tree;
+ int oldsize = b->treesize;
+ b->treesize = b->treesize ? b->treesize * 1.5 : 256;
+ if (! (b->tree = Xrealloc (b->tree, sizeof(DefTree) * b->treesize)) )
+ goto error;
+ if (top >= (DTIndex *) old && top < (DTIndex *) &old[oldsize])
+ top = (DTIndex *) (((char *) top) + (((char *)b->tree)-(char *)old));
+ }
+ p = &b->tree[b->treeused];
+ p->keysym = buf[i].keysym;
+ p->modifier = buf[i].modifier;
+ p->modifier_mask = buf[i].modifier_mask;
+ p->succession = 0;
+ p->next = *top;
+ p->mb = 0;
+ p->wc = 0;
+ p->utf8 = 0;
+ p->ks = NoSymbol;
+ *top = b->treeused;
+ top = &p->succession;
+ b->treeused++;
+ }
+ }
+
+ /* old entries no longer freed... */
+ p->mb = rhs_string_mb - b->mb;
+ p->wc = rhs_string_wc - b->wc;
+ p->utf8 = rhs_string_utf8 - b->utf8;
+ p->ks = rhs_keysym;
+ return(n);
+error:
+ while (token != ENDOFLINE && token != ENDOFFILE) {
+ token = nexttoken(fp, tokenbuf, &lastch);
+ }
+ return(0);
+}
+
+void
+_XimParseStringFile(
+ FILE *fp,
+ Xim im)
+{
+ char tb[8192];
+ char* tbp;
+ struct stat st;
+
+ if (fstat (fileno (fp), &st) != -1) {
+ unsigned long size = (unsigned long) st.st_size;
+ if (size <= sizeof tb) tbp = tb;
+ else tbp = malloc (size);
+
+ if (tbp != NULL) {
+ while (parseline(fp, im, tbp) >= 0) {}
+ if (tbp != tb) free (tbp);
+ }
+ }
+}
diff --git a/libX11/modules/im/ximcp/imLcSIc.c b/libX11/modules/im/ximcp/imLcSIc.c
index 095919309..3fce5fdc7 100644
--- a/libX11/modules/im/ximcp/imLcSIc.c
+++ b/libX11/modules/im/ximcp/imLcSIc.c
@@ -1,54 +1,54 @@
-/******************************************************************
-
- Copyright 1990, 1991, 1992, 1993, 1994 by FUJITSU LIMITED
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear
-in supporting documentation, and that the name of FUJITSU LIMITED
-not be used in advertising or publicity pertaining to distribution
-of the software without specific, written prior permission.
-FUJITSU LIMITED makes no representations about the suitability of
-this software for any purpose.
-It is provided "as is" without express or implied warranty.
-
-FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
-USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
- Author: Takashi Fujiwara FUJITSU LIMITED
- fujiwara@a80.tech.yk.fujitsu.co.jp
-
-******************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <stdio.h>
-#include <X11/Xlib.h>
-#include <X11/Xmd.h>
-#include <X11/Xutil.h>
-#include "Xlibint.h"
-#include "Xlcint.h"
-#include "Ximint.h"
-
-Public char *
-_XimLocalSetICValues(XIC xic, XIMArg *values)
-{
- XimDefICValues ic_values;
- Xic ic = (Xic)xic;
- char *name;
-
- _XimGetCurrentICValues(ic, &ic_values);
- name = _XimSetICValueData(ic, (XPointer)&ic_values,
- ic->private.local.ic_resources,
- ic->private.local.ic_num_resources,
- values, XIM_SETICVALUES, True);
- _XimSetCurrentICValues(ic, &ic_values);
- return(name);
-}
+/******************************************************************
+
+ Copyright 1990, 1991, 1992, 1993, 1994 by FUJITSU LIMITED
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the name of FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+ Author: Takashi Fujiwara FUJITSU LIMITED
+ fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xutil.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Public char *
+_XimLocalSetICValues(XIC xic, XIMArg *values)
+{
+ XimDefICValues ic_values;
+ Xic ic = (Xic)xic;
+ char *name;
+
+ _XimGetCurrentICValues(ic, &ic_values);
+ name = _XimSetICValueData(ic, (XPointer)&ic_values,
+ ic->private.local.ic_resources,
+ ic->private.local.ic_num_resources,
+ values, XIM_SETICVALUES, True);
+ _XimSetCurrentICValues(ic, &ic_values);
+ return(name);
+}
diff --git a/libX11/modules/im/ximcp/imThaiFlt.c b/libX11/modules/im/ximcp/imThaiFlt.c
index d22b13038..12e3de265 100644
--- a/libX11/modules/im/ximcp/imThaiFlt.c
+++ b/libX11/modules/im/ximcp/imThaiFlt.c
@@ -1,1421 +1,1421 @@
-/***********************************************************
-
-Copyright 1993, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1993 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
-**++
-** FACILITY:
-**
-** Xlib
-**
-** ABSTRACT:
-**
-** Thai specific functions.
-** Handles character classifications, composibility checking,
-** Input sequence check and other Thai specific requirements
-** according to WTT specification and DEC extensions.
-**
-** MODIFICATION HISTORY:
-**
-**/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <stdio.h>
-#include <X11/Xlib.h>
-#include <X11/Xmd.h>
-#include <X11/keysym.h>
-#include <X11/Xutil.h>
-#include "Xlibint.h"
-#include "Xlcint.h"
-#include "Ximint.h"
-#include "XimThai.h"
-#include "XlcPubI.h"
-
-
-#define SPACE 32
-
-/* character classification table */
-#define TACTIS_CHARS 256
-Private
-char const tactis_chtype[TACTIS_CHARS] = {
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 0 - 7 */
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 8 - 15 */
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 16 - 23 */
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 24 - 31 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 32 - 39 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 40 - 47 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 48 - 55 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 56 - 63 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 64 - 71 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 72 - 79 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 80 - 87 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 88 - 95 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 96 - 103 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 104 - 111 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 112 - 119 */
- NON, NON, NON, NON, NON, NON, NON, CTRL, /* 120 - 127 */
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 128 - 135 */
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 136 - 143 */
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 144 - 151 */
- CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 152 - 159 */
- NON, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 160 - 167 */
- CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 168 - 175 */
- CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 176 - 183 */
- CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 184 - 191 */
- CONS, CONS, CONS, CONS, FV3, CONS, FV3, CONS, /* 192 - 199 */
- CONS, CONS, CONS, CONS, CONS, CONS, CONS, NON, /* 200 - 207 */
- FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3, /* 208 - 215 */
- BV1, BV2, BD, NON, NON, NON, NON, NON, /* 216 - 223 */
- LV, LV, LV, LV, LV, FV2, NON, AD2, /* 224 - 231 */
- TONE, TONE, TONE, TONE, AD1, AD1, AD3, NON, /* 232 - 239 */
- NON, NON, NON, NON, NON, NON, NON, NON, /* 240 - 247 */
- NON, NON, NON, NON, NON, NON, NON, CTRL /* 248 - 255 */
-};
-
-/* Composibility checking tables */
-#define NC 0 /* NOT COMPOSIBLE - following char displays in next cell */
-#define CP 1 /* COMPOSIBLE - following char is displayed in the same cell
- as leading char, also implies ACCEPT */
-#define XC 3 /* Non-display */
-#define AC 4 /* ACCEPT - display the following char in the next cell */
-#define RJ 5 /* REJECT - discard that following char, ignore it */
-
-#define CH_CLASSES 17 /* 17 classes of chars */
-
-Private
-char const write_rules_lookup[CH_CLASSES][CH_CLASSES] = {
- /* Table 0: writing/outputing rules */
- /* row: leading char, column: following char */
-/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
- {XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*CTRL*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*NON*/
- ,{XC, NC, NC, NC, NC, NC, NC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*LV*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV1*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV2*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV3*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, CP, NC, NC, NC, NC, NC}/*BV1*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, NC, NC, NC, NC, NC}/*BV2*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*BD*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*TONE*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD1*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD2*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD3*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, CP, NC, NC, NC, NC, NC}/*AV1*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, NC, NC, NC, NC, NC}/*AV2*/
- ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, CP, NC, NC, NC, NC}/*AV3*/
-};
-
-Private
-char const wtt_isc1_lookup[CH_CLASSES][CH_CLASSES] = {
- /* Table 1: WTT default input sequence check rules */
- /* row: leading char, column: following char */
-/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
- {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
- ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV3*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*TONE*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
-};
-
-Private
-char const wtt_isc2_lookup[CH_CLASSES][CH_CLASSES] = {
- /* Table 2: WTT strict input sequence check rules */
- /* row: leading char, column: following char */
-/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
- {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
- ,{XC, AC, AC, AC, AC, RJ, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
- ,{XC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
- ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
- ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
- ,{XC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV3*/
- ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*TONE*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD1*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD2*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
- ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
-};
-
-Private
-char const thaicat_isc_lookup[CH_CLASSES][CH_CLASSES] = {
- /* Table 3: Thaicat input sequence check rules */
- /* row: leading char, column: following char */
-/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
- {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
- ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ} /*FV3*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
- ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, RJ, RJ, RJ, RJ, RJ, CP, CP, CP}/*TONE*/
- ,{XC, AC, AC, AC, AC, AC, AC, CP, RJ, RJ, RJ, RJ, RJ, RJ, CP, RJ, RJ}/*AD1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, CP}/*AD2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
- ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
-};
-
-
-/* returns classification of a char */
-Private int
-THAI_chtype (unsigned char ch)
-{
- return tactis_chtype[ch];
-}
-
-#ifdef UNUSED
-/* returns the display level */
-Private int
-THAI_chlevel (unsigned char ch)
-{
- int chlevel;
-
- switch (tactis_chtype[ch])
- {
- case CTRL:
- chlevel = NON;
- break;
- case BV1:
- case BV2:
- case BD:
- chlevel = BELOW;
- break;
- case TONE:
- case AD1:
- case AD2:
- chlevel = TOP;
- break;
- case AV1:
- case AV2:
- case AV3:
- case AD3:
- chlevel = ABOVE;
- break;
- case NON:
- case CONS:
- case LV:
- case FV1:
- case FV2:
- case FV3:
- default: /* if tactis_chtype is invalid */
- chlevel = BASE;
- break;
- }
- return chlevel;
-}
-
-
-/* return True if char is non-spacing */
-Private Bool
-THAI_isdead (unsigned char ch)
-{
- return ((tactis_chtype[ch] == CTRL) || (tactis_chtype[ch] == BV1) ||
- (tactis_chtype[ch] == BV2) || (tactis_chtype[ch] == BD) ||
- (tactis_chtype[ch] == TONE) || (tactis_chtype[ch] == AD1) ||
- (tactis_chtype[ch] == AD2) || (tactis_chtype[ch] == AD3) ||
- (tactis_chtype[ch] == AV1) || (tactis_chtype[ch] == AV2) ||
- (tactis_chtype[ch] == AV3));
-}
-
-
-/* return True if char is consonant */
-Private Bool
-THAI_iscons (unsigned char ch)
-{
- return (tactis_chtype[ch] == CONS);
-}
-
-
-/* return True if char is vowel */
-Private Bool
-THAI_isvowel (unsigned char ch)
-{
- return ((tactis_chtype[ch] == LV) || (tactis_chtype[ch] == FV1) ||
- (tactis_chtype[ch] == FV2) || (tactis_chtype[ch] == FV3) ||
- (tactis_chtype[ch] == BV1) || (tactis_chtype[ch] == BV2) ||
- (tactis_chtype[ch] == AV1) || (tactis_chtype[ch] == AV2) ||
- (tactis_chtype[ch] == AV3));
-}
-
-
-/* return True if char is tonemark */
-Private Bool
-THAI_istone (unsigned char ch)
-{
- return (tactis_chtype[ch] == TONE);
-}
-#endif
-
-Private Bool
-THAI_iscomposible (
- unsigned char follow_ch,
- unsigned char lead_ch)
-{/* "Can follow_ch be put in the same display cell as lead_ch?" */
-
- return (write_rules_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)]
- == CP);
-}
-
-Private Bool
-THAI_isaccepted (
- unsigned char follow_ch,
- unsigned char lead_ch,
- unsigned char mode)
-{
- Bool iskeyvalid; /* means "Can follow_ch be keyed in after lead_ch?" */
-
- switch (mode)
- {
- case WTT_ISC1:
- iskeyvalid =
- (wtt_isc1_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
- break;
- case WTT_ISC2:
- iskeyvalid =
- (wtt_isc2_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
- break;
- case THAICAT_ISC:
- iskeyvalid =
- (thaicat_isc_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
- break;
- default:
- iskeyvalid = True;
- break;
- }
-
- return iskeyvalid;
-}
-
-#ifdef UNUSED
-Private void
-THAI_apply_write_rules(
- unsigned char *instr,
- unsigned char *outstr,
- unsigned char insert_ch,
- int *num_insert_ch)
-{
-/*
-Input parameters:
- instr - input string
- insert_ch specify what char to be added when invalid composition is found
-Output parameters:
- outstr - output string after input string has been applied the rules
- num_insert_ch - number of insert_ch added to outstr.
-*/
- unsigned char *lead_ch = NULL, *follow_ch = NULL, *out_ch = NULL;
-
- *num_insert_ch = 0;
- lead_ch = follow_ch = instr;
- out_ch = outstr;
- if ((*lead_ch == '\0') || !(THAI_find_chtype(instr,DEAD)))
- { /* Empty string or can't find any non-spacing char*/
- strcpy((char *)outstr, (char *)instr);
- } else { /* String of length >= 1, keep looking */
- follow_ch++;
- if (THAI_isdead(*lead_ch)) { /* is first char non-spacing? */
- *out_ch++ = SPACE;
- (*num_insert_ch)++;
- }
- *out_ch++ = *lead_ch;
- while (*follow_ch != '\0') /* more char in string to check */
- {
- if (THAI_isdead(*follow_ch) &&
- !THAI_iscomposible(*follow_ch,*lead_ch))
- {
- *out_ch++ = SPACE;
- (*num_insert_ch)++;
- }
- *out_ch++ = *follow_ch;
- lead_ch = follow_ch;
- follow_ch++;
- }
- *out_ch = '\0';
- }
-}
-
-Private int
-THAI_find_chtype (
- unsigned char *instr,
- int chtype)
-{
-/*
-Input parameters:
- instr - input string
- chtype - type of character to look for
-Output parameters:
- function returns first position of character with matched chtype
- function returns -1 if it does not find.
-*/
- int i = 0, position = -1;
-
- switch (chtype)
- {
- case DEAD:
- for (i = 0; *instr != '\0' && THAI_isdead(*instr); i++, instr++)
- ;
- if (*instr != '\0') position = i;
- break;
- default:
- break;
- }
- return position;
-}
-
-
-Private int
-THAI_apply_scm(
- unsigned char *instr,
- unsigned char *outstr,
- unsigned char spec_ch,
- int num_sp,
- unsigned char insert_ch)
-{
- unsigned char *scan, *outch;
- int i, dead_count, found_count;
- Bool isconsecutive;
-
- scan = instr;
- outch = outstr;
- dead_count = found_count = 0;
- isconsecutive = False;
- while (*scan != '\0') {
- if (THAI_isdead(*scan))
- dead_count++; /* count number of non-spacing char */
- if (*scan == spec_ch)
- if (!isconsecutive)
- found_count++; /* count number consecutive spec char found */
- *outch++ = *scan++;
- if (found_count == num_sp) {
- for (i = 0; i < dead_count; i++)
- *outch++ = insert_ch;
- dead_count = found_count = 0;
- }
- }
- /* what to return? */
- return 0; /* probably not right but better than returning garbage */
-}
-
-
-/* The following functions are copied from XKeyBind.c */
-
-Private void ComputeMaskFromKeytrans();
-Private int IsCancelComposeKey(KeySym *symbol, XKeyEvent *event);
-Private void SetLed(Display *dpy, int num, int state);
-Private CARD8 FindKeyCode();
-
-
-/* The following functions are specific to this module */
-
-Private int XThaiTranslateKey();
-Private int XThaiTranslateKeySym();
-
-
-Private KeySym HexIMNormalKey(
- XicThaiPart *thai_part,
- KeySym symbol,
- XKeyEvent *event);
-Private KeySym HexIMFirstComposeKey(
- XicThaiPart *thai_part,
- KeySym symbol,
- XKeyEvent *event);
-Private KeySym HexIMSecondComposeKey(
- XicThaiPart *thai_part,
- KeySym symbol
- XKeyEvent *event);
-Private KeySym HexIMComposeSequence(KeySym ks1, KeySym ks2);
-Private void InitIscMode(Xic ic);
-Private Bool ThaiComposeConvert(
- Display *dpy,
- KeySym insym,
- KeySym *outsym, KeySym *lower, KeySym *upper);
-#endif
-
-/*
- * Definitions
- */
-
-#define BellVolume 0
-
-#define ucs2tis(wc) \
- (unsigned char) ( \
- (0<=(wc)&&(wc)<=0x7F) ? \
- (wc) : \
- ((0x0E01<=(wc)&&(wc)<=0x0E5F) ? ((wc)-0x0E00+0xA0) : 0))
-/* "c" is an unsigned char */
-#define tis2ucs(c) \
- ( \
- ((c)<=0x7F) ? \
- (wchar_t)(c) : \
- ((0x0A1<=(c)) ? ((wchar_t)(c)-0xA0+0x0E00) : 0))
-
-/*
- * Macros to save and recall last input character in XIC
- */
-#define IC_SavePreviousChar(ic,ch) \
- ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = (char) (ch))
-#define IC_ClearPreviousChar(ic) \
- ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = 0)
-#define IC_GetPreviousChar(ic) \
- (IC_RealGetPreviousChar(ic,1))
-#define IC_GetContextChar(ic) \
- (IC_RealGetPreviousChar(ic,2))
-#define IC_DeletePreviousChar(ic) \
- (IC_RealDeletePreviousChar(ic))
-
-Private unsigned char
-IC_RealGetPreviousChar(Xic ic, unsigned short pos)
-{
- XICCallback* cb = &ic->core.string_conversion_callback;
- DefTreeBase *b = &ic->private.local.base;
-
- if (cb && cb->callback) {
- XIMStringConversionCallbackStruct screc;
- unsigned char c;
-
- /* Use a safe value of position = 0 and stretch the range to desired
- * place, as XIM protocol is unclear here whether it could be negative
- */
- screc.position = 0;
- screc.direction = XIMBackwardChar;
- screc.operation = XIMStringConversionRetrieval;
- screc.factor = pos;
- screc.text = 0;
-
- (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc);
- if (!screc.text)
- return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
- if ((screc.text->feedback &&
- *screc.text->feedback == XIMStringConversionLeftEdge) ||
- screc.text->length < 1)
- {
- c = 0;
- } else {
- Xim im;
- XlcConv conv;
- int from_left;
- int to_left;
- char *from_buf;
- char *to_buf;
-
- im = (Xim) XIMOfIC((XIC)ic);
- if (screc.text->encoding_is_wchar) {
- conv = _XlcOpenConverter(im->core.lcd, XlcNWideChar,
- im->core.lcd, XlcNCharSet);
- from_buf = (char *) screc.text->string.wcs;
- from_left = screc.text->length * sizeof(wchar_t);
- } else {
- conv = _XlcOpenConverter(im->core.lcd, XlcNMultiByte,
- im->core.lcd, XlcNCharSet);
- from_buf = screc.text->string.mbs;
- from_left = screc.text->length;
- }
- to_buf = (char *)&c;
- to_left = 1;
-
- _XlcResetConverter(conv);
- if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
- (XPointer *)&to_buf, &to_left, NULL, 0) < 0)
- {
- c = (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
- }
- _XlcCloseConverter(conv);
-
- XFree(screc.text->string.mbs);
- }
- XFree(screc.text);
- return c;
- } else {
- return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
- }
-}
-
-Private unsigned char
-IC_RealDeletePreviousChar(Xic ic)
-{
- XICCallback* cb = &ic->core.string_conversion_callback;
-
- if (cb && cb->callback) {
- XIMStringConversionCallbackStruct screc;
- unsigned char c;
-
- screc.position = 0;
- screc.direction = XIMBackwardChar;
- screc.operation = XIMStringConversionSubstitution;
- screc.factor = 1;
- screc.text = 0;
-
- (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc);
- if (!screc.text) { return 0; }
- if ((screc.text->feedback &&
- *screc.text->feedback == XIMStringConversionLeftEdge) ||
- screc.text->length < 1)
- {
- c = 0;
- } else {
- if (screc.text->encoding_is_wchar) {
- c = ucs2tis(screc.text->string.wcs[0]);
- XFree(screc.text->string.wcs);
- } else {
- c = screc.text->string.mbs[0];
- XFree(screc.text->string.mbs);
- }
- }
- XFree(screc.text);
- return c;
- } else {
- return 0;
- }
-}
-/*
- * Input sequence check mode in XIC
- */
-#define IC_IscMode(ic) ((ic)->private.local.thai.input_mode)
-
-/*
- * Max. size of string handled by the two String Lookup functions.
- */
-#define STR_LKUP_BUF_SIZE 256
-
-/*
- * Size of buffer to contain previous locale name.
- */
-#define SAV_LOCALE_NAME_SIZE 256
-
-/*
- * Size of buffer to contain the IM modifier.
- */
-#define MAXTHAIIMMODLEN 20
-
-#define AllMods (ShiftMask|LockMask|ControlMask| \
- Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)
-
-
-#define IsISOControlKey(ks) ((ks) >= XK_2 && (ks) <= XK_8)
-
-#define IsValidControlKey(ks) (((((ks)>=XK_A && (ks)<=XK_asciitilde) || \
- (ks)==XK_space || (ks)==XK_Delete) && \
- ((ks)!=0)))
-
-#define COMPOSE_LED 2
-
-#ifdef UNUSED
-typedef KeySym (*StateProc)(
- XicThaiPart *thai_part,
- KeySym symbol,
- XKeyEvent *event);
-
-
-/*
- * macros to classify XKeyEvent state field
- */
-
-#define IsShift(state) (((state) & ShiftMask) != 0)
-#define IsLock(state) (((state) & LockMask) != 0)
-#define IsControl(state) (((state) & ControlMask) != 0)
-#define IsMod1(state) (((state) & Mod1Mask) != 0)
-#define IsMod2(state) (((state) & Mod2Mask) != 0)
-#define IsMod3(state) (((state) & Mod3Mask) != 0)
-#define IsMod4(state) (((state) & Mod4Mask) != 0)
-#define IsMod5(state) (((state) & Mod5Mask) != 0)
-
-/*
- * key starts Thai compose sequence (Hex input method) if :
- */
-
-#define IsComposeKey(ks, event) \
- (( ks==XK_Alt_L && \
- IsControl((event)->state) && \
- !IsShift((event)->state)) \
- ? True : False)
-
-
-/*
- * State handler to implement the Thai hex input method.
- */
-
-Private int const nstate_handlers = 3;
-Private StateProc state_handler[] = {
- HexIMNormalKey,
- HexIMFirstComposeKey,
- HexIMSecondComposeKey
-};
-
-
-/*
- * Table for 'Thai Compose' character input.
- * The current implementation uses latin-1 keysyms.
- */
-struct _XMapThaiKey {
- KeySym from;
- KeySym to;
-};
-
-Private struct _XMapThaiKey const ThaiComposeTable[] = {
- { /* 0xa4 */ XK_currency, /* 0xa5 */ XK_yen },
- { /* 0xa2 */ XK_cent, /* 0xa3 */ XK_sterling },
- { /* 0xe6 */ XK_ae, /* 0xef */ XK_idiaeresis },
- { /* 0xd3 */ XK_Oacute, /* 0xee */ XK_icircumflex },
- { /* 0xb9 */ XK_onesuperior, /* 0xfa */ XK_uacute },
- { /* 0xd2 */ XK_Ograve, /* 0xe5 */ XK_aring },
- { /* 0xbc */ XK_onequarter, /* 0xfb */ XK_ucircumflex },
- { XK_VoidSymbol, XK_VoidSymbol }
-};
-
-struct _XKeytrans {
- struct _XKeytrans *next;/* next on list */
- char *string; /* string to return when the time comes */
- int len; /* length of string (since NULL is legit)*/
- KeySym key; /* keysym rebound */
- unsigned int state; /* modifier state */
- KeySym *modifiers; /* modifier keysyms you want */
- int mlen; /* length of modifier list */
-};
-
-
-/* Convert keysym to 'Thai Compose' keysym */
-/* The current implementation use latin-1 keysyms */
-Private Bool
-ThaiComposeConvert(
- Display *dpy,
- KeySym insym,
- KeySym *outsym, KeySym *lower, KeySym *upper)
-{
- struct _XMapThaiKey const *table_entry = ThaiComposeTable;
-
- while (table_entry->from != XK_VoidSymbol) {
- if (table_entry->from == insym) {
- *outsym = table_entry->to;
- *lower = *outsym;
- *upper = *outsym;
- return True;
- }
- table_entry++;
- }
- return False;
-}
-
-Private int
-XThaiTranslateKey(
- register Display *dpy,
- KeyCode keycode,
- register unsigned int modifiers,
- unsigned int *modifiers_return,
- KeySym *keysym_return,
- KeySym *lsym_return,
- KeySym *usym_return)
-{
- int per;
- register KeySym *syms;
- KeySym sym = 0, lsym = 0, usym = 0;
-
- if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
- return 0;
- *modifiers_return = (ShiftMask|LockMask) | dpy->mode_switch;
- if (((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode))
- {
- *keysym_return = NoSymbol;
- return 1;
- }
- per = dpy->keysyms_per_keycode;
- syms = &dpy->keysyms[(keycode - dpy->min_keycode) * per];
- while ((per > 2) && (syms[per - 1] == NoSymbol))
- per--;
- if ((per > 2) && (modifiers & dpy->mode_switch)) {
- syms += 2;
- per -= 2;
- }
- if (!(modifiers & ShiftMask) &&
- (!(modifiers & LockMask) || (dpy->lock_meaning == NoSymbol))) {
- if ((per == 1) || (syms[1] == NoSymbol))
- XConvertCase(syms[0], keysym_return, &usym);
- else {
- XConvertCase(syms[0], &lsym, &usym);
- *keysym_return = syms[0];
- }
- } else if (!(modifiers & LockMask) ||
- (dpy->lock_meaning != XK_Caps_Lock)) {
- if ((per == 1) || ((usym = syms[1]) == NoSymbol))
- XConvertCase(syms[0], &lsym, &usym);
- *keysym_return = usym;
- } else {
- if ((per == 1) || ((sym = syms[1]) == NoSymbol))
- sym = syms[0];
- XConvertCase(sym, &lsym, &usym);
- if (!(modifiers & ShiftMask) && (sym != syms[0]) &&
- ((sym != usym) || (lsym == usym)))
- XConvertCase(syms[0], &lsym, &usym);
- *keysym_return = usym;
- }
- /*
- * ThaiCat keyboard support :
- * When the Shift and Thai keys are hold for some keys a 'Thai Compose'
- * character code is generated which is different from column 3 and
- * 4 of the keymap.
- * Since we don't know whether ThaiCat keyboard or WTT keyboard is
- * in use, the same mapping is done for all Thai input.
- * We just arbitary choose to use column 3 keysyms as the indices of
- * this mapping.
- * When the control key is also hold, this mapping has no effect.
- */
- if ((modifiers & Mod1Mask) &&
- (modifiers & ShiftMask) &&
- !(modifiers & ControlMask)) {
- if (ThaiComposeConvert(dpy, syms[0], &sym, &lsym, &usym))
- *keysym_return = sym;
- }
-
- if (*keysym_return == XK_VoidSymbol)
- *keysym_return = NoSymbol;
- *lsym_return = lsym;
- *usym_return = usym;
- return 1;
-}
-
-/*
- * XThaiTranslateKeySym
- *
- * Translate KeySym to TACTIS code output.
- * The current implementation uses ISO latin-1 keysym.
- * Should be changed to TACTIS keysyms when they are defined by the
- * standard.
- */
-Private int
-XThaiTranslateKeySym(
- Display *dpy,
- register KeySym symbol,
- register KeySym lsym,
- register KeySym usym,
- unsigned int modifiers,
- unsigned char *buffer,
- int nbytes)
-{
- KeySym ckey = 0;
- register struct _XKeytrans *p;
- int length;
- unsigned long hiBytes;
- register unsigned char c;
-
- /*
- * initialize length = 1 ;
- */
- length = 1;
-
- if (!symbol)
- return 0;
- /* see if symbol rebound, if so, return that string. */
- for (p = dpy->key_bindings; p; p = p->next) {
- if (((modifiers & AllMods) == p->state) && (symbol == p->key)) {
- length = p->len;
- if (length > nbytes) length = nbytes;
- memcpy (buffer, p->string, length);
- return length;
- }
- }
- /* try to convert to TACTIS, handling control */
- hiBytes = symbol >> 8;
- if (!(nbytes &&
- ((hiBytes == 0) ||
- ((hiBytes == 0xFF) &&
- (((symbol >= XK_BackSpace) && (symbol <= XK_Clear)) ||
- (symbol == XK_Return) ||
- (symbol == XK_Escape) ||
- (symbol == XK_KP_Space) ||
- (symbol == XK_KP_Tab) ||
- (symbol == XK_KP_Enter) ||
- ((symbol >= XK_KP_Multiply) && (symbol <= XK_KP_9)) ||
- (symbol == XK_KP_Equal) ||
- (symbol == XK_Scroll_Lock) ||
-#ifdef DXK_PRIVATE /* DEC private keysyms */
- (symbol == DXK_Remove) ||
-#endif
- (symbol == NoSymbol) ||
- (symbol == XK_Delete))))))
- return 0;
-
- /* if X keysym, convert to ascii by grabbing low 7 bits */
- if (symbol == XK_KP_Space)
- c = XK_space & 0x7F; /* patch encoding botch */
-/* not for Thai
- else if (symbol == XK_hyphen)
- c = XK_minus & 0xFF; */ /* map to equiv character */
- else if (hiBytes == 0xFF)
- c = symbol & 0x7F;
- else
- c = symbol & 0xFF;
- /* only apply Control key if it makes sense, else ignore it */
- if (modifiers & ControlMask) {
- if (!(IsKeypadKey(lsym) || lsym==XK_Return || lsym==XK_Tab)) {
- if (IsISOControlKey(lsym)) ckey = lsym;
- else if (IsISOControlKey(usym)) ckey = usym;
- else if (lsym == XK_question) ckey = lsym;
- else if (usym == XK_question) ckey = usym;
- else if (IsValidControlKey(lsym)) ckey = lsym;
- else if (IsValidControlKey(usym)) ckey = usym;
- else length = 0;
-
- if (length != 0) {
- if (ckey == XK_2) c = '\000';
- else if (ckey >= XK_3 && ckey <= XK_7)
- c = (char)(ckey-('3'-'\033'));
- else if (ckey == XK_8) c = '\177';
- else if (ckey == XK_Delete) c = '\030';
- else if (ckey == XK_question) c = '\037';
- else if (ckey == XK_quoteleft) c = '\036'; /* KLee 1/24/91 */
- else c = (char)(ckey & 0x1f);
- }
- }
- }
- /*
- * ThaiCat has a key that generates two TACTIS codes D1 & E9.
- * It is represented by the latin-1 keysym XK_thorn (0xfe).
- * If c is XK_thorn, this key is pressed and it is converted to
- * 0xd1 0xe9.
- */
- if (c == XK_thorn) {
- buffer[0] = 0xd1;
- buffer[1] = 0xe9;
- buffer[2] = '\0';
- return 2;
- }
- else {
- /* Normal case */
- buffer[0] = c;
- buffer[1] = '\0';
- return 1;
- }
-}
-
-/*
- * given a KeySym, returns the first keycode containing it, if any.
- */
-Private CARD8
-FindKeyCode(
- register Display *dpy,
- register KeySym code)
-{
-
- register KeySym *kmax = dpy->keysyms +
- (dpy->max_keycode - dpy->min_keycode + 1) * dpy->keysyms_per_keycode;
- register KeySym *k = dpy->keysyms;
- while (k < kmax) {
- if (*k == code)
- return (((k - dpy->keysyms) / dpy->keysyms_per_keycode) +
- dpy->min_keycode);
- k += 1;
- }
- return 0;
-}
-
-/*
- * given a list of modifiers, computes the mask necessary for later matching.
- * This routine must lookup the key in the Keymap and then search to see
- * what modifier it is bound to, if any. Sets the AnyModifier bit if it
- * can't map some keysym to a modifier.
- */
-Private void
-ComputeMaskFromKeytrans(
- Display *dpy,
- register struct _XKeytrans *p)
-{
- register int i;
- register CARD8 code;
- register XModifierKeymap *m = dpy->modifiermap;
-
- p->state = AnyModifier;
- for (i = 0; i < p->mlen; i++) {
- /* if not found, then not on current keyboard */
- if ((code = FindKeyCode(dpy, p->modifiers[i])) == 0)
- return;
- /* code is now the keycode for the modifier you want */
- {
- register int j = m->max_keypermod<<3;
-
- while ((--j >= 0) && (code != m->modifiermap[j]))
- ;
- if (j < 0)
- return;
- p->state |= (1<<(j/m->max_keypermod));
- }
- }
- p->state &= AllMods;
-}
-
-/************************************************************************
- *
- *
- * Compose handling routines - compose handlers 0,1,2
- *
- *
- ************************************************************************/
-
-#define NORMAL_KEY_STATE 0
-#define FIRST_COMPOSE_KEY_STATE 1
-#define SECOND_COMPOSE_KEY_STATE 2
-
-Private
-KeySym HexIMNormalKey(
- XicThaiPart *thai_part,
- KeySym symbol,
- XKeyEvent *event)
-{
- if (IsComposeKey (symbol, event)) /* start compose sequence */
- {
- SetLed (event->display,COMPOSE_LED, LedModeOn);
- thai_part->comp_state = FIRST_COMPOSE_KEY_STATE;
- return NoSymbol;
- }
- return symbol;
-}
-
-
-Private
-KeySym HexIMFirstComposeKey(
- XicThaiPart *thai_part,
- KeySym symbol,
- XKeyEvent *event)
-{
- if (IsModifierKey (symbol)) return symbol; /* ignore shift etc. */
- if (IsCancelComposeKey (&symbol, event)) /* cancel sequence */
- {
- SetLed (event->display,COMPOSE_LED, LedModeOff);
- thai_part->comp_state = NORMAL_KEY_STATE;
- return symbol;
- }
- if (IsComposeKey (symbol, event)) /* restart sequence ?? */
- {
- return NoSymbol; /* no state change necessary */
- }
-
- thai_part->keysym = symbol; /* save key pressed */
- thai_part->comp_state = SECOND_COMPOSE_KEY_STATE;
- return NoSymbol;
-}
-
-Private
-KeySym HexIMSecondComposeKey(
- XicThaiPart *thai_part,
- KeySym symbol,
- XKeyEvent *event)
-{
- if (IsModifierKey (symbol)) return symbol; /* ignore shift etc. */
- if (IsComposeKey (symbol, event)) /* restart sequence ? */
- {
- thai_part->comp_state =FIRST_COMPOSE_KEY_STATE;
- return NoSymbol;
- }
- SetLed (event->display,COMPOSE_LED, LedModeOff);
- if (IsCancelComposeKey (&symbol, event)) /* cancel sequence ? */
- {
- thai_part->comp_state = NORMAL_KEY_STATE;
- return symbol;
- }
-
- if ((symbol = HexIMComposeSequence (thai_part->keysym, symbol))
- ==NoSymbol)
- { /* invalid compose sequence */
- XBell(event->display, BellVolume);
- }
- thai_part->comp_state = NORMAL_KEY_STATE; /* reset to normal state */
- return symbol;
-}
-
-
-/*
- * Interprets two keysyms entered as hex digits and return the Thai keysym
- * correspond to the TACTIS code formed.
- * The current implementation of this routine returns ISO Latin Keysyms.
- */
-
-Private
-KeySym HexIMComposeSequence(KeySym ks1, KeySym ks2)
-{
-int hi_digit;
-int lo_digit;
-int tactis_code;
-
- if ((ks1 >= XK_0) && (ks1 <= XK_9))
- hi_digit = ks1 - XK_0;
- else if ((ks1 >= XK_A) && (ks1 <= XK_F))
- hi_digit = ks1 - XK_A + 10;
- else if ((ks1 >= XK_a) && (ks1 <= XK_f))
- hi_digit = ks1 - XK_a + 10;
- else /* out of range */
- return NoSymbol;
-
- if ((ks2 >= XK_0) && (ks2 <= XK_9))
- lo_digit = ks2 - XK_0;
- else if ((ks2 >= XK_A) && (ks2 <= XK_F))
- lo_digit = ks2 - XK_A + 10;
- else if ((ks2 >= XK_a) && (ks2 <= XK_f))
- lo_digit = ks2 - XK_a + 10;
- else /* out of range */
- return NoSymbol;
-
- tactis_code = hi_digit * 0x10 + lo_digit ;
-
- return (KeySym)tactis_code;
-
-}
-
-/*
- * routine determines
- * 1) whether key event should cancel a compose sequence
- * 2) whether cancelling key event should be processed or ignored
- */
-
-Private
-int IsCancelComposeKey(
- KeySym *symbol,
- XKeyEvent *event)
-{
- if (*symbol==XK_Delete && !IsControl(event->state) &&
- !IsMod1(event->state)) {
- *symbol=NoSymbol; /* cancel compose sequence, and ignore key */
- return True;
- }
- if (IsComposeKey(*symbol, event)) return False;
- return (
- IsControl (event->state) ||
- IsMod1(event->state) ||
- IsKeypadKey (*symbol) ||
- IsFunctionKey (*symbol) ||
- IsMiscFunctionKey (*symbol) ||
-#ifdef DXK_PRIVATE /* DEC private keysyms */
- *symbol == DXK_Remove ||
-#endif
- IsPFKey (*symbol) ||
- IsCursorKey (*symbol) ||
- (*symbol >= XK_Tab && *symbol < XK_Multi_key)
- ? True : False); /* cancel compose sequence and pass */
- /* cancelling key through */
-}
-
-
-/*
- * set specified keyboard LED on or off
- */
-
-Private
-void SetLed(
- Display *dpy,
- int num,
- int state)
-{
- XKeyboardControl led_control;
-
- led_control.led_mode = state;
- led_control.led = num;
- XChangeKeyboardControl (dpy, KBLed | KBLedMode, &led_control);
-}
-#endif
-
-/*
- * Initialize ISC mode from im modifier
- */
-Private void InitIscMode(Xic ic)
-{
- Xim im;
- char *im_modifier_name;
-
- /* If already defined, just return */
-
- if (IC_IscMode(ic)) return;
-
- /* Get IM modifier */
-
- im = (Xim) XIMOfIC((XIC)ic);
- im_modifier_name = im->core.im_name;
-
- /* Match with predefined value, default is Basic Check */
-
- if (!strncmp(im_modifier_name,"BasicCheck",MAXTHAIIMMODLEN+1))
- IC_IscMode(ic) = WTT_ISC1;
- else if (!strncmp(im_modifier_name,"Strict",MAXTHAIIMMODLEN+1))
- IC_IscMode(ic) = WTT_ISC2;
- else if (!strncmp(im_modifier_name,"Thaicat",MAXTHAIIMMODLEN+1))
- IC_IscMode(ic) = THAICAT_ISC;
- else if (!strncmp(im_modifier_name,"Passthrough",MAXTHAIIMMODLEN+1))
- IC_IscMode(ic) = NOISC;
- else
- IC_IscMode(ic) = WTT_ISC1;
-
- return;
-}
-
-/*
- * Helper functions for _XimThaiFilter()
- */
-Private Bool
-ThaiFltAcceptInput(Xic ic, unsigned char new_char, KeySym symbol)
-{
- DefTreeBase *b = &ic->private.local.base;
- b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
- b->wc[b->tree[ic->private.local.composed].wc+1] = '\0';
-
- if ((new_char <= 0x1f) || (new_char == 0x7f))
- b->tree[ic->private.local.composed].keysym = symbol;
- else
- b->tree[ic->private.local.composed].keysym = NoSymbol;
-
- return True;
-}
-
-Private Bool
-ThaiFltReorderInput(Xic ic, unsigned char previous_char, unsigned char new_char)
-{
- DefTreeBase *b = &ic->private.local.base;
- if (!IC_DeletePreviousChar(ic)) return False;
- b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
- b->wc[b->tree[ic->private.local.composed].wc+1] = tis2ucs(previous_char);
- b->wc[b->tree[ic->private.local.composed].wc+2] = '\0';
-
- b->tree[ic->private.local.composed].keysym = NoSymbol;
-
- return True;
-}
-
-Private Bool
-ThaiFltReplaceInput(Xic ic, unsigned char new_char, KeySym symbol)
-{
- DefTreeBase *b = &ic->private.local.base;
- if (!IC_DeletePreviousChar(ic)) return False;
- b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
- b->wc[b->tree[ic->private.local.composed].wc+1] = '\0';
-
- if ((new_char <= 0x1f) || (new_char == 0x7f))
- b->tree[ic->private.local.composed].keysym = symbol;
- else
- b->tree[ic->private.local.composed].keysym = NoSymbol;
-
- return True;
-}
-
-Private unsigned
-NumLockMask(Display *d)
-{
- int i;
- XModifierKeymap *map;
- KeyCode numlock_keycode = XKeysymToKeycode (d, XK_Num_Lock);
- if (numlock_keycode == NoSymbol)
- return 0;
-
- map = XGetModifierMapping (d);
- if (!map)
- return 0;
-
- for (i = 0; i < 8; i++) {
- if (map->modifiermap[map->max_keypermod * i] == numlock_keycode) {
- XFreeModifiermap(map);
- return 1 << i;
- }
- }
- XFreeModifiermap(map);
- return 0;
-}
-
-/*
- * Filter function for TACTIS
- */
-Bool
-_XimThaiFilter(Display *d, Window w, XEvent *ev, XPointer client_data)
-{
- Xic ic = (Xic)client_data;
- KeySym symbol;
- int isc_mode; /* Thai Input Sequence Check mode */
- unsigned char previous_char; /* Last inputted Thai char */
- unsigned char new_char;
-#ifdef UNUSED
- unsigned int modifiers;
- KeySym lsym,usym;
- int state;
- XicThaiPart *thai_part;
- char buf[10];
-#endif
- wchar_t wbuf[10];
- Bool isReject;
- DefTreeBase *b = &ic->private.local.base;
-
- if ((ev->type != KeyPress)
- || (ev->xkey.keycode == 0))
- return False;
-
- if (!IC_IscMode(ic)) InitIscMode(ic);
-
- XwcLookupString((XIC)ic, &ev->xkey, wbuf, sizeof(wbuf) / sizeof(wbuf[0]),
- &symbol, NULL);
-
- if ((ev->xkey.state & (AllMods & ~(ShiftMask|LockMask|NumLockMask(d)))) ||
- ((symbol >> 8 == 0xFF) &&
- ((XK_BackSpace <= symbol && symbol <= XK_Clear) ||
- (symbol == XK_Return) ||
- (symbol == XK_Pause) ||
- (symbol == XK_Scroll_Lock) ||
- (symbol == XK_Sys_Req) ||
- (symbol == XK_Escape) ||
- (symbol == XK_Delete) ||
- IsCursorKey(symbol) ||
- IsKeypadKey(symbol) ||
- IsMiscFunctionKey(symbol) ||
- IsFunctionKey(symbol))))
- {
- IC_ClearPreviousChar(ic);
- return False;
- }
- if (((symbol >> 8 == 0xFF) &&
- IsModifierKey(symbol)) ||
-#ifdef XK_XKB_KEYS
- ((symbol >> 8 == 0xFE) &&
- (XK_ISO_Lock <= symbol && symbol <= XK_ISO_Last_Group_Lock)) ||
-#endif
- (symbol == NoSymbol))
- {
- return False;
- }
-#ifdef UNUSED
- if (! XThaiTranslateKey(ev->xkey.display, ev->xkey.keycode, ev->xkey.state,
- &modifiers, &symbol, &lsym, &usym))
- return False;
-
- /*
- * Hex input method processing
- */
-
- thai_part = &ic->private.local.thai;
- state = thai_part->comp_state;
- if (state >= 0 && state < nstate_handlers) /* call handler for state */
- {
- symbol = (* state_handler[state])(thai_part, symbol, (XKeyEvent *)ev);
- }
-
- /*
- * Translate KeySym into mb.
- */
- count = XThaiTranslateKeySym(ev->xkey.display, symbol, lsym,
- usym, ev->xkey.state, buf, 10);
-
- if (!symbol && !count)
- return True;
-
- /* Return symbol if cannot convert to character */
- if (!count)
- return False;
-#endif
-
- /*
- * Thai Input sequence check
- */
- isc_mode = IC_IscMode(ic);
- if (!(previous_char = IC_GetPreviousChar(ic))) previous_char = ' ';
- new_char = ucs2tis(wbuf[0]);
- isReject = True;
- if (THAI_isaccepted(new_char, previous_char, isc_mode)) {
- ThaiFltAcceptInput(ic, new_char, symbol);
- isReject = False;
- } else {
- unsigned char context_char;
-
- context_char = IC_GetContextChar(ic);
- if (context_char) {
- if (THAI_iscomposible(new_char, context_char)) {
- if (THAI_iscomposible(previous_char, new_char)) {
- isReject = !ThaiFltReorderInput(ic, previous_char, new_char);
- } else if (THAI_iscomposible(previous_char, context_char)) {
- isReject = !ThaiFltReplaceInput(ic, new_char, symbol);
- } else if (THAI_chtype(previous_char) == FV1
- && THAI_chtype(new_char) == TONE) {
- isReject = !ThaiFltReorderInput(ic, previous_char, new_char);
- }
- } else if (THAI_isaccepted(new_char, context_char, isc_mode)) {
- isReject = !ThaiFltReplaceInput(ic, new_char, symbol);
- }
- }
- }
- if (isReject) {
- /* reject character */
- XBell(ev->xkey.display, BellVolume);
- return True;
- }
-
- _Xlcwcstombs(ic->core.im->core.lcd, &b->mb[b->tree[ic->private.local.composed].mb],
- &b->wc[b->tree[ic->private.local.composed].wc], 10);
-
- _Xlcmbstoutf8(ic->core.im->core.lcd, &b->utf8[b->tree[ic->private.local.composed].utf8],
- &b->mb[b->tree[ic->private.local.composed].mb], 10);
-
- /* Remember the last character inputted
- * (as fallback in case StringConversionCallback is not provided)
- */
- IC_SavePreviousChar(ic, new_char);
-
- ev->xkey.keycode = 0;
- XPutBackEvent(d, ev);
- return True;
-}
+/***********************************************************
+
+Copyright 1993, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1993 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+**++
+** FACILITY:
+**
+** Xlib
+**
+** ABSTRACT:
+**
+** Thai specific functions.
+** Handles character classifications, composibility checking,
+** Input sequence check and other Thai specific requirements
+** according to WTT specification and DEC extensions.
+**
+** MODIFICATION HISTORY:
+**
+**/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimThai.h"
+#include "XlcPubI.h"
+
+
+#define SPACE 32
+
+/* character classification table */
+#define TACTIS_CHARS 256
+Private
+char const tactis_chtype[TACTIS_CHARS] = {
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 0 - 7 */
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 8 - 15 */
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 16 - 23 */
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 24 - 31 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 32 - 39 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 40 - 47 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 48 - 55 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 56 - 63 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 64 - 71 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 72 - 79 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 80 - 87 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 88 - 95 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 96 - 103 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 104 - 111 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 112 - 119 */
+ NON, NON, NON, NON, NON, NON, NON, CTRL, /* 120 - 127 */
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 128 - 135 */
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 136 - 143 */
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 144 - 151 */
+ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 152 - 159 */
+ NON, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 160 - 167 */
+ CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 168 - 175 */
+ CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 176 - 183 */
+ CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS, /* 184 - 191 */
+ CONS, CONS, CONS, CONS, FV3, CONS, FV3, CONS, /* 192 - 199 */
+ CONS, CONS, CONS, CONS, CONS, CONS, CONS, NON, /* 200 - 207 */
+ FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3, /* 208 - 215 */
+ BV1, BV2, BD, NON, NON, NON, NON, NON, /* 216 - 223 */
+ LV, LV, LV, LV, LV, FV2, NON, AD2, /* 224 - 231 */
+ TONE, TONE, TONE, TONE, AD1, AD1, AD3, NON, /* 232 - 239 */
+ NON, NON, NON, NON, NON, NON, NON, NON, /* 240 - 247 */
+ NON, NON, NON, NON, NON, NON, NON, CTRL /* 248 - 255 */
+};
+
+/* Composibility checking tables */
+#define NC 0 /* NOT COMPOSIBLE - following char displays in next cell */
+#define CP 1 /* COMPOSIBLE - following char is displayed in the same cell
+ as leading char, also implies ACCEPT */
+#define XC 3 /* Non-display */
+#define AC 4 /* ACCEPT - display the following char in the next cell */
+#define RJ 5 /* REJECT - discard that following char, ignore it */
+
+#define CH_CLASSES 17 /* 17 classes of chars */
+
+Private
+char const write_rules_lookup[CH_CLASSES][CH_CLASSES] = {
+ /* Table 0: writing/outputing rules */
+ /* row: leading char, column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+ {XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*CTRL*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*NON*/
+ ,{XC, NC, NC, NC, NC, NC, NC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*LV*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV1*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV2*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV3*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, CP, NC, NC, NC, NC, NC}/*BV1*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, NC, NC, NC, NC, NC}/*BV2*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*BD*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*TONE*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD1*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD2*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD3*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, CP, NC, NC, NC, NC, NC}/*AV1*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, NC, NC, NC, NC, NC}/*AV2*/
+ ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, CP, NC, NC, NC, NC}/*AV3*/
+};
+
+Private
+char const wtt_isc1_lookup[CH_CLASSES][CH_CLASSES] = {
+ /* Table 1: WTT default input sequence check rules */
+ /* row: leading char, column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+ {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
+ ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV3*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*TONE*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
+};
+
+Private
+char const wtt_isc2_lookup[CH_CLASSES][CH_CLASSES] = {
+ /* Table 2: WTT strict input sequence check rules */
+ /* row: leading char, column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+ {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
+ ,{XC, AC, AC, AC, AC, RJ, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+ ,{XC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
+ ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
+ ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
+ ,{XC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV3*/
+ ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*TONE*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD1*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD2*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
+ ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
+};
+
+Private
+char const thaicat_isc_lookup[CH_CLASSES][CH_CLASSES] = {
+ /* Table 3: Thaicat input sequence check rules */
+ /* row: leading char, column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+ {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
+ ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ} /*FV3*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
+ ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, RJ, RJ, RJ, RJ, RJ, CP, CP, CP}/*TONE*/
+ ,{XC, AC, AC, AC, AC, AC, AC, CP, RJ, RJ, RJ, RJ, RJ, RJ, CP, RJ, RJ}/*AD1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, CP}/*AD2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
+ ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
+};
+
+
+/* returns classification of a char */
+Private int
+THAI_chtype (unsigned char ch)
+{
+ return tactis_chtype[ch];
+}
+
+#ifdef UNUSED
+/* returns the display level */
+Private int
+THAI_chlevel (unsigned char ch)
+{
+ int chlevel;
+
+ switch (tactis_chtype[ch])
+ {
+ case CTRL:
+ chlevel = NON;
+ break;
+ case BV1:
+ case BV2:
+ case BD:
+ chlevel = BELOW;
+ break;
+ case TONE:
+ case AD1:
+ case AD2:
+ chlevel = TOP;
+ break;
+ case AV1:
+ case AV2:
+ case AV3:
+ case AD3:
+ chlevel = ABOVE;
+ break;
+ case NON:
+ case CONS:
+ case LV:
+ case FV1:
+ case FV2:
+ case FV3:
+ default: /* if tactis_chtype is invalid */
+ chlevel = BASE;
+ break;
+ }
+ return chlevel;
+}
+
+
+/* return True if char is non-spacing */
+Private Bool
+THAI_isdead (unsigned char ch)
+{
+ return ((tactis_chtype[ch] == CTRL) || (tactis_chtype[ch] == BV1) ||
+ (tactis_chtype[ch] == BV2) || (tactis_chtype[ch] == BD) ||
+ (tactis_chtype[ch] == TONE) || (tactis_chtype[ch] == AD1) ||
+ (tactis_chtype[ch] == AD2) || (tactis_chtype[ch] == AD3) ||
+ (tactis_chtype[ch] == AV1) || (tactis_chtype[ch] == AV2) ||
+ (tactis_chtype[ch] == AV3));
+}
+
+
+/* return True if char is consonant */
+Private Bool
+THAI_iscons (unsigned char ch)
+{
+ return (tactis_chtype[ch] == CONS);
+}
+
+
+/* return True if char is vowel */
+Private Bool
+THAI_isvowel (unsigned char ch)
+{
+ return ((tactis_chtype[ch] == LV) || (tactis_chtype[ch] == FV1) ||
+ (tactis_chtype[ch] == FV2) || (tactis_chtype[ch] == FV3) ||
+ (tactis_chtype[ch] == BV1) || (tactis_chtype[ch] == BV2) ||
+ (tactis_chtype[ch] == AV1) || (tactis_chtype[ch] == AV2) ||
+ (tactis_chtype[ch] == AV3));
+}
+
+
+/* return True if char is tonemark */
+Private Bool
+THAI_istone (unsigned char ch)
+{
+ return (tactis_chtype[ch] == TONE);
+}
+#endif
+
+Private Bool
+THAI_iscomposible (
+ unsigned char follow_ch,
+ unsigned char lead_ch)
+{/* "Can follow_ch be put in the same display cell as lead_ch?" */
+
+ return (write_rules_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)]
+ == CP);
+}
+
+Private Bool
+THAI_isaccepted (
+ unsigned char follow_ch,
+ unsigned char lead_ch,
+ unsigned char mode)
+{
+ Bool iskeyvalid; /* means "Can follow_ch be keyed in after lead_ch?" */
+
+ switch (mode)
+ {
+ case WTT_ISC1:
+ iskeyvalid =
+ (wtt_isc1_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
+ break;
+ case WTT_ISC2:
+ iskeyvalid =
+ (wtt_isc2_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
+ break;
+ case THAICAT_ISC:
+ iskeyvalid =
+ (thaicat_isc_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
+ break;
+ default:
+ iskeyvalid = True;
+ break;
+ }
+
+ return iskeyvalid;
+}
+
+#ifdef UNUSED
+Private void
+THAI_apply_write_rules(
+ unsigned char *instr,
+ unsigned char *outstr,
+ unsigned char insert_ch,
+ int *num_insert_ch)
+{
+/*
+Input parameters:
+ instr - input string
+ insert_ch specify what char to be added when invalid composition is found
+Output parameters:
+ outstr - output string after input string has been applied the rules
+ num_insert_ch - number of insert_ch added to outstr.
+*/
+ unsigned char *lead_ch = NULL, *follow_ch = NULL, *out_ch = NULL;
+
+ *num_insert_ch = 0;
+ lead_ch = follow_ch = instr;
+ out_ch = outstr;
+ if ((*lead_ch == '\0') || !(THAI_find_chtype(instr,DEAD)))
+ { /* Empty string or can't find any non-spacing char*/
+ strcpy((char *)outstr, (char *)instr);
+ } else { /* String of length >= 1, keep looking */
+ follow_ch++;
+ if (THAI_isdead(*lead_ch)) { /* is first char non-spacing? */
+ *out_ch++ = SPACE;
+ (*num_insert_ch)++;
+ }
+ *out_ch++ = *lead_ch;
+ while (*follow_ch != '\0') /* more char in string to check */
+ {
+ if (THAI_isdead(*follow_ch) &&
+ !THAI_iscomposible(*follow_ch,*lead_ch))
+ {
+ *out_ch++ = SPACE;
+ (*num_insert_ch)++;
+ }
+ *out_ch++ = *follow_ch;
+ lead_ch = follow_ch;
+ follow_ch++;
+ }
+ *out_ch = '\0';
+ }
+}
+
+Private int
+THAI_find_chtype (
+ unsigned char *instr,
+ int chtype)
+{
+/*
+Input parameters:
+ instr - input string
+ chtype - type of character to look for
+Output parameters:
+ function returns first position of character with matched chtype
+ function returns -1 if it does not find.
+*/
+ int i = 0, position = -1;
+
+ switch (chtype)
+ {
+ case DEAD:
+ for (i = 0; *instr != '\0' && THAI_isdead(*instr); i++, instr++)
+ ;
+ if (*instr != '\0') position = i;
+ break;
+ default:
+ break;
+ }
+ return position;
+}
+
+
+Private int
+THAI_apply_scm(
+ unsigned char *instr,
+ unsigned char *outstr,
+ unsigned char spec_ch,
+ int num_sp,
+ unsigned char insert_ch)
+{
+ unsigned char *scan, *outch;
+ int i, dead_count, found_count;
+ Bool isconsecutive;
+
+ scan = instr;
+ outch = outstr;
+ dead_count = found_count = 0;
+ isconsecutive = False;
+ while (*scan != '\0') {
+ if (THAI_isdead(*scan))
+ dead_count++; /* count number of non-spacing char */
+ if (*scan == spec_ch)
+ if (!isconsecutive)
+ found_count++; /* count number consecutive spec char found */
+ *outch++ = *scan++;
+ if (found_count == num_sp) {
+ for (i = 0; i < dead_count; i++)
+ *outch++ = insert_ch;
+ dead_count = found_count = 0;
+ }
+ }
+ /* what to return? */
+ return 0; /* probably not right but better than returning garbage */
+}
+
+
+/* The following functions are copied from XKeyBind.c */
+
+Private void ComputeMaskFromKeytrans();
+Private int IsCancelComposeKey(KeySym *symbol, XKeyEvent *event);
+Private void SetLed(Display *dpy, int num, int state);
+Private CARD8 FindKeyCode();
+
+
+/* The following functions are specific to this module */
+
+Private int XThaiTranslateKey();
+Private int XThaiTranslateKeySym();
+
+
+Private KeySym HexIMNormalKey(
+ XicThaiPart *thai_part,
+ KeySym symbol,
+ XKeyEvent *event);
+Private KeySym HexIMFirstComposeKey(
+ XicThaiPart *thai_part,
+ KeySym symbol,
+ XKeyEvent *event);
+Private KeySym HexIMSecondComposeKey(
+ XicThaiPart *thai_part,
+ KeySym symbol
+ XKeyEvent *event);
+Private KeySym HexIMComposeSequence(KeySym ks1, KeySym ks2);
+Private void InitIscMode(Xic ic);
+Private Bool ThaiComposeConvert(
+ Display *dpy,
+ KeySym insym,
+ KeySym *outsym, KeySym *lower, KeySym *upper);
+#endif
+
+/*
+ * Definitions
+ */
+
+#define BellVolume 0
+
+#define ucs2tis(wc) \
+ (unsigned char) ( \
+ (0<=(wc)&&(wc)<=0x7F) ? \
+ (wc) : \
+ ((0x0E01<=(wc)&&(wc)<=0x0E5F) ? ((wc)-0x0E00+0xA0) : 0))
+/* "c" is an unsigned char */
+#define tis2ucs(c) \
+ ( \
+ ((c)<=0x7F) ? \
+ (wchar_t)(c) : \
+ ((0x0A1<=(c)) ? ((wchar_t)(c)-0xA0+0x0E00) : 0))
+
+/*
+ * Macros to save and recall last input character in XIC
+ */
+#define IC_SavePreviousChar(ic,ch) \
+ ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = (char) (ch))
+#define IC_ClearPreviousChar(ic) \
+ ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = 0)
+#define IC_GetPreviousChar(ic) \
+ (IC_RealGetPreviousChar(ic,1))
+#define IC_GetContextChar(ic) \
+ (IC_RealGetPreviousChar(ic,2))
+#define IC_DeletePreviousChar(ic) \
+ (IC_RealDeletePreviousChar(ic))
+
+Private unsigned char
+IC_RealGetPreviousChar(Xic ic, unsigned short pos)
+{
+ XICCallback* cb = &ic->core.string_conversion_callback;
+ DefTreeBase *b = &ic->private.local.base;
+
+ if (cb && cb->callback) {
+ XIMStringConversionCallbackStruct screc;
+ unsigned char c;
+
+ /* Use a safe value of position = 0 and stretch the range to desired
+ * place, as XIM protocol is unclear here whether it could be negative
+ */
+ screc.position = 0;
+ screc.direction = XIMBackwardChar;
+ screc.operation = XIMStringConversionRetrieval;
+ screc.factor = pos;
+ screc.text = 0;
+
+ (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc);
+ if (!screc.text)
+ return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
+ if ((screc.text->feedback &&
+ *screc.text->feedback == XIMStringConversionLeftEdge) ||
+ screc.text->length < 1)
+ {
+ c = 0;
+ } else {
+ Xim im;
+ XlcConv conv;
+ int from_left;
+ int to_left;
+ char *from_buf;
+ char *to_buf;
+
+ im = (Xim) XIMOfIC((XIC)ic);
+ if (screc.text->encoding_is_wchar) {
+ conv = _XlcOpenConverter(im->core.lcd, XlcNWideChar,
+ im->core.lcd, XlcNCharSet);
+ from_buf = (char *) screc.text->string.wcs;
+ from_left = screc.text->length * sizeof(wchar_t);
+ } else {
+ conv = _XlcOpenConverter(im->core.lcd, XlcNMultiByte,
+ im->core.lcd, XlcNCharSet);
+ from_buf = screc.text->string.mbs;
+ from_left = screc.text->length;
+ }
+ to_buf = (char *)&c;
+ to_left = 1;
+
+ _XlcResetConverter(conv);
+ if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
+ (XPointer *)&to_buf, &to_left, NULL, 0) < 0)
+ {
+ c = (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
+ }
+ _XlcCloseConverter(conv);
+
+ XFree(screc.text->string.mbs);
+ }
+ XFree(screc.text);
+ return c;
+ } else {
+ return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
+ }
+}
+
+Private unsigned char
+IC_RealDeletePreviousChar(Xic ic)
+{
+ XICCallback* cb = &ic->core.string_conversion_callback;
+
+ if (cb && cb->callback) {
+ XIMStringConversionCallbackStruct screc;
+ unsigned char c;
+
+ screc.position = 0;
+ screc.direction = XIMBackwardChar;
+ screc.operation = XIMStringConversionSubstitution;
+ screc.factor = 1;
+ screc.text = 0;
+
+ (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc);
+ if (!screc.text) { return 0; }
+ if ((screc.text->feedback &&
+ *screc.text->feedback == XIMStringConversionLeftEdge) ||
+ screc.text->length < 1)
+ {
+ c = 0;
+ } else {
+ if (screc.text->encoding_is_wchar) {
+ c = ucs2tis(screc.text->string.wcs[0]);
+ XFree(screc.text->string.wcs);
+ } else {
+ c = screc.text->string.mbs[0];
+ XFree(screc.text->string.mbs);
+ }
+ }
+ XFree(screc.text);
+ return c;
+ } else {
+ return 0;
+ }
+}
+/*
+ * Input sequence check mode in XIC
+ */
+#define IC_IscMode(ic) ((ic)->private.local.thai.input_mode)
+
+/*
+ * Max. size of string handled by the two String Lookup functions.
+ */
+#define STR_LKUP_BUF_SIZE 256
+
+/*
+ * Size of buffer to contain previous locale name.
+ */
+#define SAV_LOCALE_NAME_SIZE 256
+
+/*
+ * Size of buffer to contain the IM modifier.
+ */
+#define MAXTHAIIMMODLEN 20
+
+#define AllMods (ShiftMask|LockMask|ControlMask| \
+ Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)
+
+
+#define IsISOControlKey(ks) ((ks) >= XK_2 && (ks) <= XK_8)
+
+#define IsValidControlKey(ks) (((((ks)>=XK_A && (ks)<=XK_asciitilde) || \
+ (ks)==XK_space || (ks)==XK_Delete) && \
+ ((ks)!=0)))
+
+#define COMPOSE_LED 2
+
+#ifdef UNUSED
+typedef KeySym (*StateProc)(
+ XicThaiPart *thai_part,
+ KeySym symbol,
+ XKeyEvent *event);
+
+
+/*
+ * macros to classify XKeyEvent state field
+ */
+
+#define IsShift(state) (((state) & ShiftMask) != 0)
+#define IsLock(state) (((state) & LockMask) != 0)
+#define IsControl(state) (((state) & ControlMask) != 0)
+#define IsMod1(state) (((state) & Mod1Mask) != 0)
+#define IsMod2(state) (((state) & Mod2Mask) != 0)
+#define IsMod3(state) (((state) & Mod3Mask) != 0)
+#define IsMod4(state) (((state) & Mod4Mask) != 0)
+#define IsMod5(state) (((state) & Mod5Mask) != 0)
+
+/*
+ * key starts Thai compose sequence (Hex input method) if :
+ */
+
+#define IsComposeKey(ks, event) \
+ (( ks==XK_Alt_L && \
+ IsControl((event)->state) && \
+ !IsShift((event)->state)) \
+ ? True : False)
+
+
+/*
+ * State handler to implement the Thai hex input method.
+ */
+
+Private int const nstate_handlers = 3;
+Private StateProc state_handler[] = {
+ HexIMNormalKey,
+ HexIMFirstComposeKey,
+ HexIMSecondComposeKey
+};
+
+
+/*
+ * Table for 'Thai Compose' character input.
+ * The current implementation uses latin-1 keysyms.
+ */
+struct _XMapThaiKey {
+ KeySym from;
+ KeySym to;
+};
+
+Private struct _XMapThaiKey const ThaiComposeTable[] = {
+ { /* 0xa4 */ XK_currency, /* 0xa5 */ XK_yen },
+ { /* 0xa2 */ XK_cent, /* 0xa3 */ XK_sterling },
+ { /* 0xe6 */ XK_ae, /* 0xef */ XK_idiaeresis },
+ { /* 0xd3 */ XK_Oacute, /* 0xee */ XK_icircumflex },
+ { /* 0xb9 */ XK_onesuperior, /* 0xfa */ XK_uacute },
+ { /* 0xd2 */ XK_Ograve, /* 0xe5 */ XK_aring },
+ { /* 0xbc */ XK_onequarter, /* 0xfb */ XK_ucircumflex },
+ { XK_VoidSymbol, XK_VoidSymbol }
+};
+
+struct _XKeytrans {
+ struct _XKeytrans *next;/* next on list */
+ char *string; /* string to return when the time comes */
+ int len; /* length of string (since NULL is legit)*/
+ KeySym key; /* keysym rebound */
+ unsigned int state; /* modifier state */
+ KeySym *modifiers; /* modifier keysyms you want */
+ int mlen; /* length of modifier list */
+};
+
+
+/* Convert keysym to 'Thai Compose' keysym */
+/* The current implementation use latin-1 keysyms */
+Private Bool
+ThaiComposeConvert(
+ Display *dpy,
+ KeySym insym,
+ KeySym *outsym, KeySym *lower, KeySym *upper)
+{
+ struct _XMapThaiKey const *table_entry = ThaiComposeTable;
+
+ while (table_entry->from != XK_VoidSymbol) {
+ if (table_entry->from == insym) {
+ *outsym = table_entry->to;
+ *lower = *outsym;
+ *upper = *outsym;
+ return True;
+ }
+ table_entry++;
+ }
+ return False;
+}
+
+Private int
+XThaiTranslateKey(
+ register Display *dpy,
+ KeyCode keycode,
+ register unsigned int modifiers,
+ unsigned int *modifiers_return,
+ KeySym *keysym_return,
+ KeySym *lsym_return,
+ KeySym *usym_return)
+{
+ int per;
+ register KeySym *syms;
+ KeySym sym = 0, lsym = 0, usym = 0;
+
+ if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
+ return 0;
+ *modifiers_return = (ShiftMask|LockMask) | dpy->mode_switch;
+ if (((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode))
+ {
+ *keysym_return = NoSymbol;
+ return 1;
+ }
+ per = dpy->keysyms_per_keycode;
+ syms = &dpy->keysyms[(keycode - dpy->min_keycode) * per];
+ while ((per > 2) && (syms[per - 1] == NoSymbol))
+ per--;
+ if ((per > 2) && (modifiers & dpy->mode_switch)) {
+ syms += 2;
+ per -= 2;
+ }
+ if (!(modifiers & ShiftMask) &&
+ (!(modifiers & LockMask) || (dpy->lock_meaning == NoSymbol))) {
+ if ((per == 1) || (syms[1] == NoSymbol))
+ XConvertCase(syms[0], keysym_return, &usym);
+ else {
+ XConvertCase(syms[0], &lsym, &usym);
+ *keysym_return = syms[0];
+ }
+ } else if (!(modifiers & LockMask) ||
+ (dpy->lock_meaning != XK_Caps_Lock)) {
+ if ((per == 1) || ((usym = syms[1]) == NoSymbol))
+ XConvertCase(syms[0], &lsym, &usym);
+ *keysym_return = usym;
+ } else {
+ if ((per == 1) || ((sym = syms[1]) == NoSymbol))
+ sym = syms[0];
+ XConvertCase(sym, &lsym, &usym);
+ if (!(modifiers & ShiftMask) && (sym != syms[0]) &&
+ ((sym != usym) || (lsym == usym)))
+ XConvertCase(syms[0], &lsym, &usym);
+ *keysym_return = usym;
+ }
+ /*
+ * ThaiCat keyboard support :
+ * When the Shift and Thai keys are hold for some keys a 'Thai Compose'
+ * character code is generated which is different from column 3 and
+ * 4 of the keymap.
+ * Since we don't know whether ThaiCat keyboard or WTT keyboard is
+ * in use, the same mapping is done for all Thai input.
+ * We just arbitary choose to use column 3 keysyms as the indices of
+ * this mapping.
+ * When the control key is also hold, this mapping has no effect.
+ */
+ if ((modifiers & Mod1Mask) &&
+ (modifiers & ShiftMask) &&
+ !(modifiers & ControlMask)) {
+ if (ThaiComposeConvert(dpy, syms[0], &sym, &lsym, &usym))
+ *keysym_return = sym;
+ }
+
+ if (*keysym_return == XK_VoidSymbol)
+ *keysym_return = NoSymbol;
+ *lsym_return = lsym;
+ *usym_return = usym;
+ return 1;
+}
+
+/*
+ * XThaiTranslateKeySym
+ *
+ * Translate KeySym to TACTIS code output.
+ * The current implementation uses ISO latin-1 keysym.
+ * Should be changed to TACTIS keysyms when they are defined by the
+ * standard.
+ */
+Private int
+XThaiTranslateKeySym(
+ Display *dpy,
+ register KeySym symbol,
+ register KeySym lsym,
+ register KeySym usym,
+ unsigned int modifiers,
+ unsigned char *buffer,
+ int nbytes)
+{
+ KeySym ckey = 0;
+ register struct _XKeytrans *p;
+ int length;
+ unsigned long hiBytes;
+ register unsigned char c;
+
+ /*
+ * initialize length = 1 ;
+ */
+ length = 1;
+
+ if (!symbol)
+ return 0;
+ /* see if symbol rebound, if so, return that string. */
+ for (p = dpy->key_bindings; p; p = p->next) {
+ if (((modifiers & AllMods) == p->state) && (symbol == p->key)) {
+ length = p->len;
+ if (length > nbytes) length = nbytes;
+ memcpy (buffer, p->string, length);
+ return length;
+ }
+ }
+ /* try to convert to TACTIS, handling control */
+ hiBytes = symbol >> 8;
+ if (!(nbytes &&
+ ((hiBytes == 0) ||
+ ((hiBytes == 0xFF) &&
+ (((symbol >= XK_BackSpace) && (symbol <= XK_Clear)) ||
+ (symbol == XK_Return) ||
+ (symbol == XK_Escape) ||
+ (symbol == XK_KP_Space) ||
+ (symbol == XK_KP_Tab) ||
+ (symbol == XK_KP_Enter) ||
+ ((symbol >= XK_KP_Multiply) && (symbol <= XK_KP_9)) ||
+ (symbol == XK_KP_Equal) ||
+ (symbol == XK_Scroll_Lock) ||
+#ifdef DXK_PRIVATE /* DEC private keysyms */
+ (symbol == DXK_Remove) ||
+#endif
+ (symbol == NoSymbol) ||
+ (symbol == XK_Delete))))))
+ return 0;
+
+ /* if X keysym, convert to ascii by grabbing low 7 bits */
+ if (symbol == XK_KP_Space)
+ c = XK_space & 0x7F; /* patch encoding botch */
+/* not for Thai
+ else if (symbol == XK_hyphen)
+ c = XK_minus & 0xFF; */ /* map to equiv character */
+ else if (hiBytes == 0xFF)
+ c = symbol & 0x7F;
+ else
+ c = symbol & 0xFF;
+ /* only apply Control key if it makes sense, else ignore it */
+ if (modifiers & ControlMask) {
+ if (!(IsKeypadKey(lsym) || lsym==XK_Return || lsym==XK_Tab)) {
+ if (IsISOControlKey(lsym)) ckey = lsym;
+ else if (IsISOControlKey(usym)) ckey = usym;
+ else if (lsym == XK_question) ckey = lsym;
+ else if (usym == XK_question) ckey = usym;
+ else if (IsValidControlKey(lsym)) ckey = lsym;
+ else if (IsValidControlKey(usym)) ckey = usym;
+ else length = 0;
+
+ if (length != 0) {
+ if (ckey == XK_2) c = '\000';
+ else if (ckey >= XK_3 && ckey <= XK_7)
+ c = (char)(ckey-('3'-'\033'));
+ else if (ckey == XK_8) c = '\177';
+ else if (ckey == XK_Delete) c = '\030';
+ else if (ckey == XK_question) c = '\037';
+ else if (ckey == XK_quoteleft) c = '\036'; /* KLee 1/24/91 */
+ else c = (char)(ckey & 0x1f);
+ }
+ }
+ }
+ /*
+ * ThaiCat has a key that generates two TACTIS codes D1 & E9.
+ * It is represented by the latin-1 keysym XK_thorn (0xfe).
+ * If c is XK_thorn, this key is pressed and it is converted to
+ * 0xd1 0xe9.
+ */
+ if (c == XK_thorn) {
+ buffer[0] = 0xd1;
+ buffer[1] = 0xe9;
+ buffer[2] = '\0';
+ return 2;
+ }
+ else {
+ /* Normal case */
+ buffer[0] = c;
+ buffer[1] = '\0';
+ return 1;
+ }
+}
+
+/*
+ * given a KeySym, returns the first keycode containing it, if any.
+ */
+Private CARD8
+FindKeyCode(
+ register Display *dpy,
+ register KeySym code)
+{
+
+ register KeySym *kmax = dpy->keysyms +
+ (dpy->max_keycode - dpy->min_keycode + 1) * dpy->keysyms_per_keycode;
+ register KeySym *k = dpy->keysyms;
+ while (k < kmax) {
+ if (*k == code)
+ return (((k - dpy->keysyms) / dpy->keysyms_per_keycode) +
+ dpy->min_keycode);
+ k += 1;
+ }
+ return 0;
+}
+
+/*
+ * given a list of modifiers, computes the mask necessary for later matching.
+ * This routine must lookup the key in the Keymap and then search to see
+ * what modifier it is bound to, if any. Sets the AnyModifier bit if it
+ * can't map some keysym to a modifier.
+ */
+Private void
+ComputeMaskFromKeytrans(
+ Display *dpy,
+ register struct _XKeytrans *p)
+{
+ register int i;
+ register CARD8 code;
+ register XModifierKeymap *m = dpy->modifiermap;
+
+ p->state = AnyModifier;
+ for (i = 0; i < p->mlen; i++) {
+ /* if not found, then not on current keyboard */
+ if ((code = FindKeyCode(dpy, p->modifiers[i])) == 0)
+ return;
+ /* code is now the keycode for the modifier you want */
+ {
+ register int j = m->max_keypermod<<3;
+
+ while ((--j >= 0) && (code != m->modifiermap[j]))
+ ;
+ if (j < 0)
+ return;
+ p->state |= (1<<(j/m->max_keypermod));
+ }
+ }
+ p->state &= AllMods;
+}
+
+/************************************************************************
+ *
+ *
+ * Compose handling routines - compose handlers 0,1,2
+ *
+ *
+ ************************************************************************/
+
+#define NORMAL_KEY_STATE 0
+#define FIRST_COMPOSE_KEY_STATE 1
+#define SECOND_COMPOSE_KEY_STATE 2
+
+Private
+KeySym HexIMNormalKey(
+ XicThaiPart *thai_part,
+ KeySym symbol,
+ XKeyEvent *event)
+{
+ if (IsComposeKey (symbol, event)) /* start compose sequence */
+ {
+ SetLed (event->display,COMPOSE_LED, LedModeOn);
+ thai_part->comp_state = FIRST_COMPOSE_KEY_STATE;
+ return NoSymbol;
+ }
+ return symbol;
+}
+
+
+Private
+KeySym HexIMFirstComposeKey(
+ XicThaiPart *thai_part,
+ KeySym symbol,
+ XKeyEvent *event)
+{
+ if (IsModifierKey (symbol)) return symbol; /* ignore shift etc. */
+ if (IsCancelComposeKey (&symbol, event)) /* cancel sequence */
+ {
+ SetLed (event->display,COMPOSE_LED, LedModeOff);
+ thai_part->comp_state = NORMAL_KEY_STATE;
+ return symbol;
+ }
+ if (IsComposeKey (symbol, event)) /* restart sequence ?? */
+ {
+ return NoSymbol; /* no state change necessary */
+ }
+
+ thai_part->keysym = symbol; /* save key pressed */
+ thai_part->comp_state = SECOND_COMPOSE_KEY_STATE;
+ return NoSymbol;
+}
+
+Private
+KeySym HexIMSecondComposeKey(
+ XicThaiPart *thai_part,
+ KeySym symbol,
+ XKeyEvent *event)
+{
+ if (IsModifierKey (symbol)) return symbol; /* ignore shift etc. */
+ if (IsComposeKey (symbol, event)) /* restart sequence ? */
+ {
+ thai_part->comp_state =FIRST_COMPOSE_KEY_STATE;
+ return NoSymbol;
+ }
+ SetLed (event->display,COMPOSE_LED, LedModeOff);
+ if (IsCancelComposeKey (&symbol, event)) /* cancel sequence ? */
+ {
+ thai_part->comp_state = NORMAL_KEY_STATE;
+ return symbol;
+ }
+
+ if ((symbol = HexIMComposeSequence (thai_part->keysym, symbol))
+ ==NoSymbol)
+ { /* invalid compose sequence */
+ XBell(event->display, BellVolume);
+ }
+ thai_part->comp_state = NORMAL_KEY_STATE; /* reset to normal state */
+ return symbol;
+}
+
+
+/*
+ * Interprets two keysyms entered as hex digits and return the Thai keysym
+ * correspond to the TACTIS code formed.
+ * The current implementation of this routine returns ISO Latin Keysyms.
+ */
+
+Private
+KeySym HexIMComposeSequence(KeySym ks1, KeySym ks2)
+{
+int hi_digit;
+int lo_digit;
+int tactis_code;
+
+ if ((ks1 >= XK_0) && (ks1 <= XK_9))
+ hi_digit = ks1 - XK_0;
+ else if ((ks1 >= XK_A) && (ks1 <= XK_F))
+ hi_digit = ks1 - XK_A + 10;
+ else if ((ks1 >= XK_a) && (ks1 <= XK_f))
+ hi_digit = ks1 - XK_a + 10;
+ else /* out of range */
+ return NoSymbol;
+
+ if ((ks2 >= XK_0) && (ks2 <= XK_9))
+ lo_digit = ks2 - XK_0;
+ else if ((ks2 >= XK_A) && (ks2 <= XK_F))
+ lo_digit = ks2 - XK_A + 10;
+ else if ((ks2 >= XK_a) && (ks2 <= XK_f))
+ lo_digit = ks2 - XK_a + 10;
+ else /* out of range */
+ return NoSymbol;
+
+ tactis_code = hi_digit * 0x10 + lo_digit ;
+
+ return (KeySym)tactis_code;
+
+}
+
+/*
+ * routine determines
+ * 1) whether key event should cancel a compose sequence
+ * 2) whether cancelling key event should be processed or ignored
+ */
+
+Private
+int IsCancelComposeKey(
+ KeySym *symbol,
+ XKeyEvent *event)
+{
+ if (*symbol==XK_Delete && !IsControl(event->state) &&
+ !IsMod1(event->state)) {
+ *symbol=NoSymbol; /* cancel compose sequence, and ignore key */
+ return True;
+ }
+ if (IsComposeKey(*symbol, event)) return False;
+ return (
+ IsControl (event->state) ||
+ IsMod1(event->state) ||
+ IsKeypadKey (*symbol) ||
+ IsFunctionKey (*symbol) ||
+ IsMiscFunctionKey (*symbol) ||
+#ifdef DXK_PRIVATE /* DEC private keysyms */
+ *symbol == DXK_Remove ||
+#endif
+ IsPFKey (*symbol) ||
+ IsCursorKey (*symbol) ||
+ (*symbol >= XK_Tab && *symbol < XK_Multi_key)
+ ? True : False); /* cancel compose sequence and pass */
+ /* cancelling key through */
+}
+
+
+/*
+ * set specified keyboard LED on or off
+ */
+
+Private
+void SetLed(
+ Display *dpy,
+ int num,
+ int state)
+{
+ XKeyboardControl led_control;
+
+ led_control.led_mode = state;
+ led_control.led = num;
+ XChangeKeyboardControl (dpy, KBLed | KBLedMode, &led_control);
+}
+#endif
+
+/*
+ * Initialize ISC mode from im modifier
+ */
+Private void InitIscMode(Xic ic)
+{
+ Xim im;
+ char *im_modifier_name;
+
+ /* If already defined, just return */
+
+ if (IC_IscMode(ic)) return;
+
+ /* Get IM modifier */
+
+ im = (Xim) XIMOfIC((XIC)ic);
+ im_modifier_name = im->core.im_name;
+
+ /* Match with predefined value, default is Basic Check */
+
+ if (!strncmp(im_modifier_name,"BasicCheck",MAXTHAIIMMODLEN+1))
+ IC_IscMode(ic) = WTT_ISC1;
+ else if (!strncmp(im_modifier_name,"Strict",MAXTHAIIMMODLEN+1))
+ IC_IscMode(ic) = WTT_ISC2;
+ else if (!strncmp(im_modifier_name,"Thaicat",MAXTHAIIMMODLEN+1))
+ IC_IscMode(ic) = THAICAT_ISC;
+ else if (!strncmp(im_modifier_name,"Passthrough",MAXTHAIIMMODLEN+1))
+ IC_IscMode(ic) = NOISC;
+ else
+ IC_IscMode(ic) = WTT_ISC1;
+
+ return;
+}
+
+/*
+ * Helper functions for _XimThaiFilter()
+ */
+Private Bool
+ThaiFltAcceptInput(Xic ic, unsigned char new_char, KeySym symbol)
+{
+ DefTreeBase *b = &ic->private.local.base;
+ b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
+ b->wc[b->tree[ic->private.local.composed].wc+1] = '\0';
+
+ if ((new_char <= 0x1f) || (new_char == 0x7f))
+ b->tree[ic->private.local.composed].keysym = symbol;
+ else
+ b->tree[ic->private.local.composed].keysym = NoSymbol;
+
+ return True;
+}
+
+Private Bool
+ThaiFltReorderInput(Xic ic, unsigned char previous_char, unsigned char new_char)
+{
+ DefTreeBase *b = &ic->private.local.base;
+ if (!IC_DeletePreviousChar(ic)) return False;
+ b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
+ b->wc[b->tree[ic->private.local.composed].wc+1] = tis2ucs(previous_char);
+ b->wc[b->tree[ic->private.local.composed].wc+2] = '\0';
+
+ b->tree[ic->private.local.composed].keysym = NoSymbol;
+
+ return True;
+}
+
+Private Bool
+ThaiFltReplaceInput(Xic ic, unsigned char new_char, KeySym symbol)
+{
+ DefTreeBase *b = &ic->private.local.base;
+ if (!IC_DeletePreviousChar(ic)) return False;
+ b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
+ b->wc[b->tree[ic->private.local.composed].wc+1] = '\0';
+
+ if ((new_char <= 0x1f) || (new_char == 0x7f))
+ b->tree[ic->private.local.composed].keysym = symbol;
+ else
+ b->tree[ic->private.local.composed].keysym = NoSymbol;
+
+ return True;
+}
+
+Private unsigned
+NumLockMask(Display *d)
+{
+ int i;
+ XModifierKeymap *map;
+ KeyCode numlock_keycode = XKeysymToKeycode (d, XK_Num_Lock);
+ if (numlock_keycode == NoSymbol)
+ return 0;
+
+ map = XGetModifierMapping (d);
+ if (!map)
+ return 0;
+
+ for (i = 0; i < 8; i++) {
+ if (map->modifiermap[map->max_keypermod * i] == numlock_keycode) {
+ XFreeModifiermap(map);
+ return 1 << i;
+ }
+ }
+ XFreeModifiermap(map);
+ return 0;
+}
+
+/*
+ * Filter function for TACTIS
+ */
+Bool
+_XimThaiFilter(Display *d, Window w, XEvent *ev, XPointer client_data)
+{
+ Xic ic = (Xic)client_data;
+ KeySym symbol;
+ int isc_mode; /* Thai Input Sequence Check mode */
+ unsigned char previous_char; /* Last inputted Thai char */
+ unsigned char new_char;
+#ifdef UNUSED
+ unsigned int modifiers;
+ KeySym lsym,usym;
+ int state;
+ XicThaiPart *thai_part;
+ char buf[10];
+#endif
+ wchar_t wbuf[10];
+ Bool isReject;
+ DefTreeBase *b = &ic->private.local.base;
+
+ if ((ev->type != KeyPress)
+ || (ev->xkey.keycode == 0))
+ return False;
+
+ if (!IC_IscMode(ic)) InitIscMode(ic);
+
+ XwcLookupString((XIC)ic, &ev->xkey, wbuf, sizeof(wbuf) / sizeof(wbuf[0]),
+ &symbol, NULL);
+
+ if ((ev->xkey.state & (AllMods & ~(ShiftMask|LockMask|NumLockMask(d)))) ||
+ ((symbol >> 8 == 0xFF) &&
+ ((XK_BackSpace <= symbol && symbol <= XK_Clear) ||
+ (symbol == XK_Return) ||
+ (symbol == XK_Pause) ||
+ (symbol == XK_Scroll_Lock) ||
+ (symbol == XK_Sys_Req) ||
+ (symbol == XK_Escape) ||
+ (symbol == XK_Delete) ||
+ IsCursorKey(symbol) ||
+ IsKeypadKey(symbol) ||
+ IsMiscFunctionKey(symbol) ||
+ IsFunctionKey(symbol))))
+ {
+ IC_ClearPreviousChar(ic);
+ return False;
+ }
+ if (((symbol >> 8 == 0xFF) &&
+ IsModifierKey(symbol)) ||
+#ifdef XK_XKB_KEYS
+ ((symbol >> 8 == 0xFE) &&
+ (XK_ISO_Lock <= symbol && symbol <= XK_ISO_Last_Group_Lock)) ||
+#endif
+ (symbol == NoSymbol))
+ {
+ return False;
+ }
+#ifdef UNUSED
+ if (! XThaiTranslateKey(ev->xkey.display, ev->xkey.keycode, ev->xkey.state,
+ &modifiers, &symbol, &lsym, &usym))
+ return False;
+
+ /*
+ * Hex input method processing
+ */
+
+ thai_part = &ic->private.local.thai;
+ state = thai_part->comp_state;
+ if (state >= 0 && state < nstate_handlers) /* call handler for state */
+ {
+ symbol = (* state_handler[state])(thai_part, symbol, (XKeyEvent *)ev);
+ }
+
+ /*
+ * Translate KeySym into mb.
+ */
+ count = XThaiTranslateKeySym(ev->xkey.display, symbol, lsym,
+ usym, ev->xkey.state, buf, 10);
+
+ if (!symbol && !count)
+ return True;
+
+ /* Return symbol if cannot convert to character */
+ if (!count)
+ return False;
+#endif
+
+ /*
+ * Thai Input sequence check
+ */
+ isc_mode = IC_IscMode(ic);
+ if (!(previous_char = IC_GetPreviousChar(ic))) previous_char = ' ';
+ new_char = ucs2tis(wbuf[0]);
+ isReject = True;
+ if (THAI_isaccepted(new_char, previous_char, isc_mode)) {
+ ThaiFltAcceptInput(ic, new_char, symbol);
+ isReject = False;
+ } else {
+ unsigned char context_char;
+
+ context_char = IC_GetContextChar(ic);
+ if (context_char) {
+ if (THAI_iscomposible(new_char, context_char)) {
+ if (THAI_iscomposible(previous_char, new_char)) {
+ isReject = !ThaiFltReorderInput(ic, previous_char, new_char);
+ } else if (THAI_iscomposible(previous_char, context_char)) {
+ isReject = !ThaiFltReplaceInput(ic, new_char, symbol);
+ } else if (THAI_chtype(previous_char) == FV1
+ && THAI_chtype(new_char) == TONE) {
+ isReject = !ThaiFltReorderInput(ic, previous_char, new_char);
+ }
+ } else if (THAI_isaccepted(new_char, context_char, isc_mode)) {
+ isReject = !ThaiFltReplaceInput(ic, new_char, symbol);
+ }
+ }
+ }
+ if (isReject) {
+ /* reject character */
+ XBell(ev->xkey.display, BellVolume);
+ return True;
+ }
+
+ _Xlcwcstombs(ic->core.im->core.lcd, &b->mb[b->tree[ic->private.local.composed].mb],
+ &b->wc[b->tree[ic->private.local.composed].wc], 10);
+
+ _Xlcmbstoutf8(ic->core.im->core.lcd, &b->utf8[b->tree[ic->private.local.composed].utf8],
+ &b->mb[b->tree[ic->private.local.composed].mb], 10);
+
+ /* Remember the last character inputted
+ * (as fallback in case StringConversionCallback is not provided)
+ */
+ IC_SavePreviousChar(ic, new_char);
+
+ ev->xkey.keycode = 0;
+ XPutBackEvent(d, ev);
+ return True;
+}
diff --git a/libX11/modules/im/ximcp/imThaiIm.c b/libX11/modules/im/ximcp/imThaiIm.c
index 767b52c2a..45c690bbc 100644
--- a/libX11/modules/im/ximcp/imThaiIm.c
+++ b/libX11/modules/im/ximcp/imThaiIm.c
@@ -1,235 +1,235 @@
-/******************************************************************
-
- Copyright 1992, 1993, 1994 by FUJITSU LIMITED
- Copyright 1993 by Digital Equipment Corporation
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of FUJITSU LIMITED and
-Digital Equipment Corporation not be used in advertising or publicity
-pertaining to distribution of the software without specific, written
-prior permission. FUJITSU LIMITED and Digital Equipment Corporation
-makes no representations about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-
-FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
-WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR
-ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
-
- Author: Takashi Fujiwara FUJITSU LIMITED
- fujiwara@a80.tech.yk.fujitsu.co.jp
- Modifier: Franky Ling Digital Equipment Corporation
- frankyling@hgrd01.enet.dec.com
-
-******************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <stdio.h>
-#include <X11/Xlib.h>
-#include <X11/Xmd.h>
-#include <X11/Xatom.h>
-#include <X11/Xos.h>
-#include "Xlibint.h"
-#include "Xlcint.h"
-#include "XlcPublic.h"
-#include "XlcPubI.h"
-#include "Ximint.h"
-
-Private XIMMethodsRec Xim_im_thai_methods = {
- _XimThaiCloseIM, /* close */
- _XimLocalSetIMValues, /* set_values */
- _XimLocalGetIMValues, /* get_values */
- _XimThaiCreateIC, /* create_ic */
- _XimLcctstombs, /* ctstombs */
- _XimLcctstowcs, /* ctstowcs */
- _XimLcctstoutf8 /* ctstoutf8 */
-};
-
-#define THAI_LANGUAGE_NAME "th"
-
-Bool
-_XimCheckIfThaiProcessing(Xim im)
-{
- char *language;
-
- _XGetLCValues(im->core.lcd, XlcNLanguage, &language, NULL);
- if(strcmp(language, THAI_LANGUAGE_NAME) == 0 &&
- (strcmp(im->core.im_name, "") == 0 ||
- strcmp(im->core.im_name, "BasicCheck") == 0 ||
- strcmp(im->core.im_name, "Strict") == 0 ||
- strcmp(im->core.im_name, "Thaicat") == 0 ||
- strcmp(im->core.im_name, "Passthrough") == 0))
- {
- return(True);
- }
- return(False);
-}
-
-Public Bool
-_XimThaiOpenIM(Xim im)
-{
- XLCd lcd = im->core.lcd;
- XlcConv conv;
- XimDefIMValues im_values;
- XimLocalPrivateRec* private = &im->private.local;
-
- _XimInitialResourceInfo();
- if(_XimSetIMResourceList(&im->core.im_resources,
- &im->core.im_num_resources) == False) {
- goto Open_Error;
- }
- if(_XimSetICResourceList(&im->core.ic_resources,
- &im->core.ic_num_resources) == False) {
- goto Open_Error;
- }
-
- _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
-
- _XimGetCurrentIMValues(im, &im_values);
- if(_XimSetLocalIMDefaults(im, (XPointer)&im_values,
- im->core.im_resources, im->core.im_num_resources) == False) {
- goto Open_Error;
- }
- _XimSetCurrentIMValues(im, &im_values);
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte)))
- goto Open_Error;
- private->ctom_conv = conv;
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar)))
- goto Open_Error;
- private->ctow_conv = conv;
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNUtf8String)))
- goto Open_Error;
- private->ctoutf8_conv = conv;
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte)))
- goto Open_Error;
- private->cstomb_conv = conv;
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNWideChar)))
- goto Open_Error;
- private->cstowc_conv = conv;
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNUtf8String)))
- goto Open_Error;
- private->cstoutf8_conv = conv;
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNUcsChar, lcd, XlcNChar)))
- goto Open_Error;
- private->ucstoc_conv = conv;
-
- if (!(conv = _XlcOpenConverter(lcd, XlcNUcsChar, lcd, XlcNUtf8String)))
- goto Open_Error;
- private->ucstoutf8_conv = conv;
-
- im->methods = &Xim_im_thai_methods;
- private->current_ic = (XIC)NULL;
-
- return(True);
-
-Open_Error :
- _XimThaiIMFree(im);
- return(False);
-}
-
-Public void
-_XimThaiIMFree(Xim im)
-{
- if(im->core.im_resources) {
- Xfree(im->core.im_resources);
- im->core.im_resources = NULL;
- }
- if(im->core.ic_resources) {
- Xfree(im->core.ic_resources);
- im->core.ic_resources = NULL;
- }
- if(im->core.im_values_list) {
- Xfree(im->core.im_values_list);
- im->core.im_values_list = NULL;
- }
- if(im->core.ic_values_list) {
- Xfree(im->core.ic_values_list);
- im->core.ic_values_list = NULL;
- }
- if(im->core.styles) {
- Xfree(im->core.styles);
- im->core.styles = NULL;
- }
- if(im->core.res_name) {
- Xfree(im->core.res_name);
- im->core.res_name = NULL;
- }
- if(im->core.res_class) {
- Xfree(im->core.res_class);
- im->core.res_class = NULL;
- }
- if(im->core.im_name) {
- Xfree(im->core.im_name);
- im->core.im_name = NULL;
- }
- if (im->private.local.ctom_conv) {
- _XlcCloseConverter(im->private.local.ctom_conv);
- im->private.local.ctom_conv = NULL;
- }
- if (im->private.local.ctow_conv) {
- _XlcCloseConverter(im->private.local.ctow_conv);
- im->private.local.ctow_conv = NULL;
- }
- if (im->private.local.ctoutf8_conv) {
- _XlcCloseConverter(im->private.local.ctoutf8_conv);
- im->private.local.ctoutf8_conv = NULL;
- }
- if (im->private.local.cstomb_conv) {
- _XlcCloseConverter(im->private.local.cstomb_conv);
- im->private.local.cstomb_conv = NULL;
- }
- if (im->private.local.cstowc_conv) {
- _XlcCloseConverter(im->private.local.cstowc_conv);
- im->private.local.cstowc_conv = NULL;
- }
- if (im->private.local.cstoutf8_conv) {
- _XlcCloseConverter(im->private.local.cstoutf8_conv);
- im->private.local.cstoutf8_conv = NULL;
- }
- if (im->private.local.ucstoc_conv) {
- _XlcCloseConverter(im->private.local.ucstoc_conv);
- im->private.local.ucstoc_conv = NULL;
- }
- if (im->private.local.ucstoutf8_conv) {
- _XlcCloseConverter(im->private.local.ucstoutf8_conv);
- im->private.local.ucstoutf8_conv = NULL;
- }
- return;
-}
-
-Public Status
-_XimThaiCloseIM(XIM xim)
-{
- Xim im = (Xim)xim;
- XIC ic;
- XIC next;
-
- ic = im->core.ic_chain;
- im->core.ic_chain = NULL;
- while (ic) {
- (*ic->methods->destroy) (ic);
- next = ic->core.next;
- Xfree ((char *) ic);
- ic = next;
- }
- _XimThaiIMFree(im);
- return(True);
-}
+/******************************************************************
+
+ Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+ Copyright 1993 by Digital Equipment Corporation
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission. FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR
+ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+ Author: Takashi Fujiwara FUJITSU LIMITED
+ fujiwara@a80.tech.yk.fujitsu.co.jp
+ Modifier: Franky Ling Digital Equipment Corporation
+ frankyling@hgrd01.enet.dec.com
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcPublic.h"
+#include "XlcPubI.h"
+#include "Ximint.h"
+
+Private XIMMethodsRec Xim_im_thai_methods = {
+ _XimThaiCloseIM, /* close */
+ _XimLocalSetIMValues, /* set_values */
+ _XimLocalGetIMValues, /* get_values */
+ _XimThaiCreateIC, /* create_ic */
+ _XimLcctstombs, /* ctstombs */
+ _XimLcctstowcs, /* ctstowcs */
+ _XimLcctstoutf8 /* ctstoutf8 */
+};
+
+#define THAI_LANGUAGE_NAME "th"
+
+Bool
+_XimCheckIfThaiProcessing(Xim im)
+{
+ char *language;
+
+ _XGetLCValues(im->core.lcd, XlcNLanguage, &language, NULL);
+ if(strcmp(language, THAI_LANGUAGE_NAME) == 0 &&
+ (strcmp(im->core.im_name, "") == 0 ||
+ strcmp(im->core.im_name, "BasicCheck") == 0 ||
+ strcmp(im->core.im_name, "Strict") == 0 ||
+ strcmp(im->core.im_name, "Thaicat") == 0 ||
+ strcmp(im->core.im_name, "Passthrough") == 0))
+ {
+ return(True);
+ }
+ return(False);
+}
+
+Public Bool
+_XimThaiOpenIM(Xim im)
+{
+ XLCd lcd = im->core.lcd;
+ XlcConv conv;
+ XimDefIMValues im_values;
+ XimLocalPrivateRec* private = &im->private.local;
+
+ _XimInitialResourceInfo();
+ if(_XimSetIMResourceList(&im->core.im_resources,
+ &im->core.im_num_resources) == False) {
+ goto Open_Error;
+ }
+ if(_XimSetICResourceList(&im->core.ic_resources,
+ &im->core.ic_num_resources) == False) {
+ goto Open_Error;
+ }
+
+ _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
+
+ _XimGetCurrentIMValues(im, &im_values);
+ if(_XimSetLocalIMDefaults(im, (XPointer)&im_values,
+ im->core.im_resources, im->core.im_num_resources) == False) {
+ goto Open_Error;
+ }
+ _XimSetCurrentIMValues(im, &im_values);
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte)))
+ goto Open_Error;
+ private->ctom_conv = conv;
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar)))
+ goto Open_Error;
+ private->ctow_conv = conv;
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNUtf8String)))
+ goto Open_Error;
+ private->ctoutf8_conv = conv;
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte)))
+ goto Open_Error;
+ private->cstomb_conv = conv;
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNWideChar)))
+ goto Open_Error;
+ private->cstowc_conv = conv;
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNUtf8String)))
+ goto Open_Error;
+ private->cstoutf8_conv = conv;
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNUcsChar, lcd, XlcNChar)))
+ goto Open_Error;
+ private->ucstoc_conv = conv;
+
+ if (!(conv = _XlcOpenConverter(lcd, XlcNUcsChar, lcd, XlcNUtf8String)))
+ goto Open_Error;
+ private->ucstoutf8_conv = conv;
+
+ im->methods = &Xim_im_thai_methods;
+ private->current_ic = (XIC)NULL;
+
+ return(True);
+
+Open_Error :
+ _XimThaiIMFree(im);
+ return(False);
+}
+
+Public void
+_XimThaiIMFree(Xim im)
+{
+ if(im->core.im_resources) {
+ Xfree(im->core.im_resources);
+ im->core.im_resources = NULL;
+ }
+ if(im->core.ic_resources) {
+ Xfree(im->core.ic_resources);
+ im->core.ic_resources = NULL;
+ }
+ if(im->core.im_values_list) {
+ Xfree(im->core.im_values_list);
+ im->core.im_values_list = NULL;
+ }
+ if(im->core.ic_values_list) {
+ Xfree(im->core.ic_values_list);
+ im->core.ic_values_list = NULL;
+ }
+ if(im->core.styles) {
+ Xfree(im->core.styles);
+ im->core.styles = NULL;
+ }
+ if(im->core.res_name) {
+ Xfree(im->core.res_name);
+ im->core.res_name = NULL;
+ }
+ if(im->core.res_class) {
+ Xfree(im->core.res_class);
+ im->core.res_class = NULL;
+ }
+ if(im->core.im_name) {
+ Xfree(im->core.im_name);
+ im->core.im_name = NULL;
+ }
+ if (im->private.local.ctom_conv) {
+ _XlcCloseConverter(im->private.local.ctom_conv);
+ im->private.local.ctom_conv = NULL;
+ }
+ if (im->private.local.ctow_conv) {
+ _XlcCloseConverter(im->private.local.ctow_conv);
+ im->private.local.ctow_conv = NULL;
+ }
+ if (im->private.local.ctoutf8_conv) {
+ _XlcCloseConverter(im->private.local.ctoutf8_conv);
+ im->private.local.ctoutf8_conv = NULL;
+ }
+ if (im->private.local.cstomb_conv) {
+ _XlcCloseConverter(im->private.local.cstomb_conv);
+ im->private.local.cstomb_conv = NULL;
+ }
+ if (im->private.local.cstowc_conv) {
+ _XlcCloseConverter(im->private.local.cstowc_conv);
+ im->private.local.cstowc_conv = NULL;
+ }
+ if (im->private.local.cstoutf8_conv) {
+ _XlcCloseConverter(im->private.local.cstoutf8_conv);
+ im->private.local.cstoutf8_conv = NULL;
+ }
+ if (im->private.local.ucstoc_conv) {
+ _XlcCloseConverter(im->private.local.ucstoc_conv);
+ im->private.local.ucstoc_conv = NULL;
+ }
+ if (im->private.local.ucstoutf8_conv) {
+ _XlcCloseConverter(im->private.local.ucstoutf8_conv);
+ im->private.local.ucstoutf8_conv = NULL;
+ }
+ return;
+}
+
+Public Status
+_XimThaiCloseIM(XIM xim)
+{
+ Xim im = (Xim)xim;
+ XIC ic;
+ XIC next;
+
+ ic = im->core.ic_chain;
+ im->core.ic_chain = NULL;
+ while (ic) {
+ (*ic->methods->destroy) (ic);
+ next = ic->core.next;
+ Xfree ((char *) ic);
+ ic = next;
+ }
+ _XimThaiIMFree(im);
+ return(True);
+}
diff --git a/libX11/modules/lc/Makefile.am b/libX11/modules/lc/Makefile.am
index 3cad2d61c..82bd06017 100644
--- a/libX11/modules/lc/Makefile.am
+++ b/libX11/modules/lc/Makefile.am
@@ -1 +1 @@
-SUBDIRS=Utf8 def gen xlocale
+SUBDIRS=Utf8 def gen xlocale
diff --git a/libX11/modules/lc/Utf8/lcUTF8Load.c b/libX11/modules/lc/Utf8/lcUTF8Load.c
index 82ea3b54d..c1eec3749 100644
--- a/libX11/modules/lc/Utf8/lcUTF8Load.c
+++ b/libX11/modules/lc/Utf8/lcUTF8Load.c
@@ -1,70 +1,70 @@
-/******************************************************************
-
- Copyright 1993 by SunSoft, Inc.
- Copyright 1999-2000 by Bruno Haible
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear
-in supporting documentation, and that the names of SunSoft, Inc. and
-Bruno Haible not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission. SunSoft, Inc. and Bruno Haible make no representations
-about the suitability of this software for any purpose. It is
-provided "as is" without express or implied warranty.
-
-SunSoft Inc. AND Bruno Haible DISCLAIM ALL WARRANTIES WITH REGARD
-TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS, IN NO EVENT SHALL SunSoft, Inc. OR Bruno Haible BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-******************************************************************/
-
-/*
- * This file contains the UTF-8 locale loader.
- * Supports: all locales with codeset UTF-8.
- * Platforms: all systems.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <stdio.h>
-#include "Xlibint.h"
-#include "XlcPubI.h"
-#include "XlcGeneric.h"
-
-XLCd
-_XlcUtf8Loader(
- const char *name)
-{
- XLCd lcd;
-
- lcd = _XlcCreateLC(name, _XlcGenericMethods);
- if (lcd == (XLCd) NULL)
- return lcd;
-
- /* The official IANA name for UTF-8 is "UTF-8" in upper case with a dash. */
- if (!XLC_PUBLIC_PART(lcd)->codeset) {
- _XlcDestroyLC(lcd);
- return (XLCd) NULL;
- }
- else if (!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "UTF-8")) {
- _XlcAddUtf8LocaleConverters(lcd);
- }
- else if (!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "GB18030")) {
- _XlcAddGB18030LocaleConverters(lcd);
- }
- else {
- _XlcDestroyLC(lcd);
- return (XLCd) NULL;
- }
-
- _XlcAddUtf8Converters(lcd);
-
- return lcd;
-}
+/******************************************************************
+
+ Copyright 1993 by SunSoft, Inc.
+ Copyright 1999-2000 by Bruno Haible
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the names of SunSoft, Inc. and
+Bruno Haible not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission. SunSoft, Inc. and Bruno Haible make no representations
+about the suitability of this software for any purpose. It is
+provided "as is" without express or implied warranty.
+
+SunSoft Inc. AND Bruno Haible DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL SunSoft, Inc. OR Bruno Haible BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+ * This file contains the UTF-8 locale loader.
+ * Supports: all locales with codeset UTF-8.
+ * Platforms: all systems.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include "XlcGeneric.h"
+
+XLCd
+_XlcUtf8Loader(
+ const char *name)
+{
+ XLCd lcd;
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+ if (lcd == (XLCd) NULL)
+ return lcd;
+
+ /* The official IANA name for UTF-8 is "UTF-8" in upper case with a dash. */
+ if (!XLC_PUBLIC_PART(lcd)->codeset) {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+ else if (!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "UTF-8")) {
+ _XlcAddUtf8LocaleConverters(lcd);
+ }
+ else if (!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "GB18030")) {
+ _XlcAddGB18030LocaleConverters(lcd);
+ }
+ else {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
diff --git a/libX11/modules/lc/xlocale/lcEuc.c b/libX11/modules/lc/xlocale/lcEuc.c
index 442e3090f..b39050578 100644
--- a/libX11/modules/lc/xlocale/lcEuc.c
+++ b/libX11/modules/lc/xlocale/lcEuc.c
@@ -1,1537 +1,1537 @@
-/******************************************************************
-
- Copyright 1992, 1993 by FUJITSU LIMITED
- Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
-
-Permission to use, copy, modify, distribute and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear
-in supporting documentation, and that the name of FUJITSU LIMITED and
-Fujitsu Open Systems Solutions, Inc. not be used in advertising or
-publicity pertaining to distribution of the software without specific,
-written prior permission.
-FUJITSU LIMITED and Fujitsu Open Systems Solutions, Inc. makes no
-representations about the suitability of this software for any purpose.
-It is provided "as is" without express or implied warranty.
-
-FUJITSU LIMITED AND FUJITSU OPEN SYSTEMS SOLUTIONS, INC. DISCLAIMS ALL
-WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU OPEN SYSTEMS
-SOLUTIONS, INC. AND FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT
-OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
-USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-OF THIS SOFTWARE.
-
- Authors: Shigeru Yamada (yamada@ossi.com)
- Jeffrey Bloomfield (jeffb@ossi.com)
- Yoshiyuki Segawa (segawa@ossi.com)
-
-*****************************************************************/
-
-/*
- * An EUC locale.
- * Supports: all locales with codeset eucJP, eucKR, eucCN, eucTW.
- * How: Provides converters for euc*.
- * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
- */
-
-#ifdef X_LOCALE
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XlcGeneric.h"
-
-#include <ctype.h>
-#ifdef WIN32
-#define isascii __isascii
-#endif
-
-#define CS0 codesets[0] /* Codeset 0 - 7-bit ASCII */
-#define CS1 codesets[1] /* Codeset 1 - Kanji */
-#define CS2 codesets[2] /* Codeset 2 - Half-Kana */
-#define CS3 codesets[3] /* Codeset 3 - User defined */
-
-#define SS2 0x8e /* Single-shift char: CS2 */
-#define SS3 0x8f /* Single-shift char: CS3 */
-
-#define ASCII_CODESET 0
-#define KANJI_CODESET 1
-#define KANA_CODESET 2
-#define USERDEF_CODESET 3
-#define MAX_CODESETS
-
-#define GR 0x80 /* begins right-side (non-ascii) region */
-#define GL 0x7f /* ends left-side (ascii) region */
-
-#define isleftside(c) (((c) & GR) ? 0 : 1)
-#define isrightside(c) (!isleftside(c))
-
-#define BIT8OFF(c) ((c) & GL)
-#define BIT8ON(c) ((c) | GR)
-
-typedef unsigned char Uchar;
-typedef unsigned long Ulong;
-typedef unsigned int Uint;
-
-static CodeSet GetCodeSetFromCharSet (XLCd lcd, XlcCharSet charset);
-static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
-
-#define BADCHAR(min_ch, c) (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
- BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
- BIT8OFF(c) != 0x1b)
-
-/*
- * Notes:
- * 1. Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
- * forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
- * 2. Using direct converters (e.g. mbstowcs()) decreases conversion
- * times by 20-40% (depends on specific converter used).
- */
-
-static int
-euc_mbstowcs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
-
- Uchar ch;
- int chr_len = 0;
- int sshift = False;
- int shift_mult = 0;
- Uint chrcode;
-
- Uint wc_encode = 0;
- Uint wc_tmp = 0;
-
- int cs0flg = False;
- int cs1flg = False;
- int length = 0;
- int unconv_num = 0;
-
- Bool new_char;
-
- const char *inbufptr = *from;
- wchar_t *outbufptr = (wchar_t *) *to;
-
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
- int codeset_num = XLC_GENERIC(lcd, codeset_num);
- Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
-
- for (new_char = True; *from_left > 0 && *to_left > 0;) {
-
- ch = *inbufptr++;
-
- if (isleftside(ch)) { /* CS0 */
- if (ASCII_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- if( cs0flg == True) {
- new_char = True;
- cs0flg = False;
- }
- length = CS0->length;
- *outbufptr++ = (wchar_t)ch;
- (*from_left)--;
- (*to_left)--;
- continue;
- }
- else if (ch == SS2) { /* CS2 */
- if (KANA_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- if (sshift == True || cs1flg == True) {
- cs1flg = False;
- unconv_num++;
- continue;
- }
- length = CS2->length;
- wc_encode = CS2->wc_encoding;
- chrcode = 0;
- sshift = True;
- cs0flg = True;
- (*from_left)--;
- continue;
- }
- else if (ch == SS3) { /* CS3 */
- if (USERDEF_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- if (sshift == True || cs1flg == True) {
- cs1flg = False;
- unconv_num++;
- continue;
- }
- length = CS3->length;
- if (*from_left < 1 )
- unconv_num++;
- wc_encode = CS3->wc_encoding;
- chrcode = 0;
- sshift = True;
- cs0flg = True;
- (*from_left)--;
- continue;
-
- } else { /* CS1 */
- if (KANJI_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- if (sshift == False) {
- length = CS1->length;
- if (*from_left < 1)
- unconv_num++;
- wc_encode = CS1->wc_encoding;
- }
- chrcode = BIT8OFF(ch);
- cs0flg = True;
- cs1flg = True;
- (*from_left)--;
- }
-
- if (new_char) { /* begin new character */
- chr_len = length;
- shift_mult = length - 1;
- new_char = False;
- }
-
- chrcode <<= (wc_shift * shift_mult);
- shift_mult--;
- wc_tmp |= chrcode;
-
- if (--chr_len == 0) {
- wc_tmp |= wc_encode;
- *outbufptr++ = wc_tmp;
- (*to_left)--;
-
- new_char = True;
- sshift = False;
- cs0flg = False;
- cs1flg = False;
- wc_tmp = (Uint)0;
- }
-
- } /* end for */
-
- *to = (XPointer)outbufptr;
-
- if (cs0flg == True || cs1flg == True) /* error check on last char */
- unconv_num++;
-
- return unconv_num;
-}
-
-
-static int
-euc_wcstombs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- const wchar_t *inbufptr = (const wchar_t *) *from;
- XPointer outbufptr = *to;
- wchar_t wch;
- int length;
- Uchar tmp;
- int unconv_num = 0;
-
- XLCd lcd = (XLCd)conv->state;
- CodeSet codeset;
- Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
-
- for (; *from_left > 0 && *to_left > 0; (*from_left)-- ) {
-
- wch = *inbufptr++;
-
- if (!(codeset = wc_codeset(lcd, wch))) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
-
- length = codeset->length;
- wch ^= (wchar_t)codeset->wc_encoding;
-
- if (codeset->parse_info) { /* put out SS2 or SS3 */
- if (*to_left < length + 1) {
- unconv_num++;
- break;
- }
- *outbufptr++ = *codeset->parse_info->encoding;
- (*to_left)--;
- } else {
- if (*to_left < length) {
- unconv_num++;
- break;
- }
- }
-
- do {
- length--;
- tmp = (wch>>(wchar_t)(length * wc_shift));
-
- if (codeset->side == XlcGR)
- tmp = BIT8ON(tmp);
-
- *outbufptr++ = (Uchar)tmp;
- (*to_left)--;
- } while (length);
- }
-
- *to = (XPointer)outbufptr;
-
- return unconv_num;
-}
-
-
-static int
-euc_mbtocs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
- XlcCharSet charset;
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
- int codeset_num = XLC_GENERIC(lcd, codeset_num);
- int length;
- int unconv_num = 0;
- int min_ch = 0;
- const char *src = *from;
- char *dst = *to;
-
- if (isleftside(*src)) { /* 7-bit (CS0) */
- if (ASCII_CODESET >= codeset_num)
- return -1;
- charset = *CS0->charset_list;
- }
- else if ((Uchar)*src == SS2) { /* half-kana (CS2) */
- if (KANA_CODESET >= codeset_num)
- return -1;
- charset = *CS2->charset_list;
- src++;
- (*from_left)--;
- }
- else if ((Uchar)*src == SS3) { /* user-def */
- if (USERDEF_CODESET >= codeset_num)
- return -1;
- charset = *CS3->charset_list;
- src++;
- (*from_left)--;
- }
- else { /* Kanji (CS1) */
- if (KANJI_CODESET >= codeset_num)
- return -1;
- charset = *CS1->charset_list;
- }
-
- if(*from_left < charset->char_size || *to_left < charset->char_size)
- return -1;
-
- min_ch = 0x20;
- if (charset->set_size == 94)
- if (charset->char_size > 1 || charset->side == XlcGR)
- min_ch = 0x21;
-
- length = charset->char_size;
- do {
- if(BADCHAR(min_ch, *src)) {
- unconv_num++;
- src++;
- break;
- }
- switch (charset->side) {
- case XlcGL:
- *dst++ = BIT8OFF(*src++);
- break;
- case XlcGR:
- *dst++ = BIT8ON(*src++);
- break;
- default:
- *dst++ = *src++;
- break;
- }
- } while (--length);
-
- *to = dst;
- *from = (XPointer) src;
- *from_left -= charset->char_size;
- *to_left -= charset->char_size - length;
-
- if (num_args > 0)
- *((XlcCharSet *) args[0]) = charset;
-
- return unconv_num;
-}
-
-
-static int
-euc_mbstocs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- const char *tmp_from;
- char *tmp_to;
- int tmp_from_left, tmp_to_left;
- XlcCharSet charset, tmp_charset;
- XPointer tmp_args[1];
- int unconv_num = 0, ret;
-
-/* Determine the charset of the segment and convert one characater: */
-
- tmp_args[0] = (XPointer) &charset; /* charset from euc_mbtocs() */
- while
- ((ret = euc_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
- unconv_num += ret;
- if ( ret < 0 )
- return ret;
-
- tmp_from = *from;
- tmp_from_left = *from_left;
- tmp_to_left = *to_left;
- tmp_to = *to;
-
-/* Convert remainder of the segment: */
-
- tmp_args[0] = (XPointer) &tmp_charset;
- while( (ret = euc_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
- (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
-
- if (ret > 0) {
- unconv_num += ret;
- continue;
- }
-
- if (tmp_charset != charset) /* quit on end of segment */
- break;
-
- *from = (XPointer) tmp_from;
- *from_left = tmp_from_left;
- *to = (XPointer) tmp_to;
- *to_left = tmp_to_left;
- }
-
- if (num_args > 0)
- *((XlcCharSet *) args[0]) = charset;
-
- return unconv_num;
-}
-
-
-static int
-euc_wcstocs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
- const wchar_t *wcptr = (const wchar_t *) *from;
- char *bufptr = (char *) *to;
- wchar_t wch;
- char *tmpptr;
- int length;
- CodeSet codeset;
- Ulong wc_encoding;
- int wcstr_len = *from_left, buf_len = *to_left;
-
- if (!(codeset = wc_codeset(lcd, *wcptr)))
- return -1;
-
- wc_encoding = codeset->wc_encoding;
-
- if (wcstr_len < buf_len / codeset->length)
- buf_len = wcstr_len * codeset->length;
-
- for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
- wch = *wcptr;
-
- if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
- break;
-
- length = codeset->length;
-
- buf_len -= length;
- bufptr += length;
- tmpptr = bufptr - 1;
-
- while (length--) {
- *tmpptr-- = codeset->length == 1 && codeset->side == XlcGR ?
- BIT8ON(wch) : BIT8OFF(wch);
- wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
- }
- }
-
- if (num_args > 0)
- *((XlcCharSet *) args[0]) = *codeset->charset_list;
-
- *from_left -= wcptr - (wchar_t *) *from;
- *from = (XPointer) wcptr;
-
- *to_left -= bufptr - *to;
- *to = bufptr;
-
- return 0;
-}
-
-
-static int
-euc_cstombs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
- const char *csptr = *from;
- char *bufptr = *to;
- int csstr_len = *from_left;
- int buf_len = *to_left;
- int length;
- CodeSet codeset;
- int cvt_length;
-
- if (num_args < 1)
- return -1;
-
- if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
- return -1;
-
- cvt_length = 0;
- csstr_len /= codeset->length;
- buf_len /= codeset->length;
-
- if (codeset->parse_info)
- csstr_len *= 2;
-
- if (csstr_len < buf_len)
- buf_len = csstr_len;
-
- cvt_length += buf_len * codeset->length;
-
- if (bufptr) {
- while (buf_len--) {
- if (codeset->parse_info) /* put out SS2 or SS3 */
- *bufptr++ = *codeset->parse_info->encoding;
-
- length = codeset->length;
- while (length--)
- *bufptr++ = codeset->side == XlcGR ?
- BIT8ON(*csptr++) : BIT8OFF(*csptr++);
- }
- }
-
- *from_left -= csptr - *from;
- *from = (XPointer) csptr;
- if (bufptr)
- *to += cvt_length;
- *to_left -= cvt_length;
-
- return 0;
-}
-
-
-static int
-euc_cstowcs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
- const char *csptr = *from;
- wchar_t *bufptr = (wchar_t *) *to;
- wchar_t *toptr = (wchar_t *) *to;
- int csstr_len = *from_left;
- int buf_len = *to_left;
- wchar_t wch;
- int length;
- Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
- CodeSet codeset;
-
- if (num_args < 1)
- return -1;
-
- if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
- return -1;
-
- csstr_len /= codeset->length;
- if (csstr_len < buf_len)
- buf_len = csstr_len;
- *to_left -= buf_len;
-
- if (bufptr) {
-
- toptr += buf_len;
- *to = (XPointer) toptr;
-
- while (buf_len--) {
-
- wch = (wchar_t) BIT8OFF(*csptr);
- csptr++;
-
- length = codeset->length - 1;
- while (length--) {
- wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
- csptr++;
- }
- *bufptr++ = wch | codeset->wc_encoding;
- }
- }
- *from_left -= csptr - *from;
- *from = (XPointer) csptr;
-
- return 0;
-}
-
-
-static CodeSet
-wc_codeset(
- XLCd lcd,
- wchar_t wch)
-{
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
- int end = XLC_GENERIC(lcd, codeset_num);
- Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
-
- for (; --end >= 0; codesets++)
- if ( widech == (*codesets)->wc_encoding )
- return *codesets;
-
- return NULL;
-}
-
-
-static CodeSet
-GetCodeSetFromCharSet(
- XLCd lcd,
- XlcCharSet charset)
-{
- CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
- XlcCharSet *charset_list;
- int codeset_num, num_charsets;
-
- codeset_num = XLC_GENERIC(lcd, codeset_num);
-
- for ( ; codeset_num-- > 0; codeset++) {
- num_charsets = (*codeset)->num_charsets;
- charset_list = (*codeset)->charset_list;
-
- for ( ; num_charsets-- > 0; charset_list++)
- if (*charset_list == charset)
- return *codeset;
- }
-
- return (CodeSet) NULL;
-}
-
-
-static XlcConv
-create_conv(
- XLCd lcd,
- XlcConvMethods methods)
-{
- XlcConv conv;
-
- conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
- if (conv == NULL)
- return (XlcConv) NULL;
-
- conv->methods = methods;
- conv->state = (XPointer) lcd;
- return conv;
-}
-
-
-/*
- * Stripped down Direct CT converters for EUC
- *
- */
-
-typedef struct _CTDataRec {
- int side;
- int length;
- char *name;
- Ulong wc_encoding;
- char sshift;
- char *ct_encoding;
- int ct_encoding_len;
- int set_size;
- Uchar min_ch;
- Uchar ct_type;
-} CTDataRec, *CTData;
-
-typedef struct _StateRec {
- CTData GL_charset;
- CTData GR_charset;
- CTData charset;
-} StateRec, *State;
-
-#define CT_STD 0
-#define CT_NSTD 1
-#define CT_DIR 2
-#define CT_EXT0 3
-#define CT_EXT1 4
-#define CT_EXT2 5
-#define CT_VER 6
-
-static CTDataRec ctdata[] =
-{
- { XlcGL, 1, "ISO8859-1:GL", 0, 0, "\033(B" , 3, 0, 0, CT_STD },
- { XlcGR, 1, "ISO8859-1:GR", 0, 0, "\033-A" , 3, 0, 0, CT_STD },
- { XlcGL, 1, "JISX0201.1976-0:GL", 0, 0, "\033(J" , 3, 0, 0, CT_STD },
- { XlcGR, 1, "JISX0201.1976-0:GR", 0, 0, "\033)I" , 3, 0, 0, CT_STD },
- { XlcGL, 2, "JISX0208.1983-0:GL", 0, 0, "\033$(B" , 4, 0, 0, CT_STD },
- { XlcGR, 2, "JISX0208.1983-0:GR", 0, 0, "\033$)B" , 4, 0, 0, CT_STD },
- { XlcGL, 2, "JISX0212.1990-0:GL", 0, 0, "\033$(D" , 4, 0, 0, CT_STD },
- { XlcGR, 2, "JISX0212.1990-0:GR", 0, 0, "\033$)D" , 4, 0, 0, CT_STD },
- { XlcUnknown, 0, "Ignore-Ext-Status?", 0, 0, "\033#" , 2, 0, 0, CT_VER },
- { XlcUnknown, 0, "NonStd-?-OctetChar", 0, 0, "\033%/0" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 1, "NonStd-1-OctetChar", 0, 0, "\033%/1" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 2, "NonStd-2-OctetChar", 0, 0, "\033%/2" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 3, "NonStd-3-OctetChar", 0, 0, "\033%/3" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 4, "NonStd-4-OctetChar", 0, 0, "\033%/4" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 0, "Extension-2" , 0, 0, "\033%/" , 3, 0, 0, CT_EXT2 },
- { XlcUnknown, 0, "Extension-0" , 0, 0, "\033" , 1, 0, 0, CT_EXT0 },
- { XlcUnknown, 0, "Begin-L-to-R-Text", 0, 0, "\2331]" , 3, 0, 0, CT_DIR },
- { XlcUnknown, 0, "Begin-R-to-L-Text", 0, 0, "\2332]" , 3, 0, 0, CT_DIR },
- { XlcUnknown, 0, "End-Of-String", 0, 0, "\233]" , 2, 0, 0, CT_DIR },
- { XlcUnknown, 0, "Extension-1" , 0, 0, "\233" , 1, 0, 0, CT_EXT1 },
-};
-
-/* Note on above table: euc_ctstombs() and euc_ctstowcs() parser depends on
- * certain table entries occuring in decreasing string length--
- * 1. CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
- * 2. CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
- */
-
-static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
-static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
-
-#define Ascii 0
-#define Kanji 1
-#define Kana 2
-#define Userdef 3
-
-/*
- * initCTptr(): Set ctdptr[] to point at ctdata[], indexed by codeset_num.
- */
-static void
-initCTptr(
- XLCd lcd)
-{
- int num_codesets = XLC_GENERIC(lcd, codeset_num);
- int num_charsets;
- int i, j;
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
- CodeSet codeset;
- XlcCharSet charset;
- CTData ctdp = ctdata;
-
- ctdptr[Ascii] = &ctdata[0]; /* failsafe */
-
- for (i = 0; i < num_codesets; i++) {
-
- codeset = codesets[i];
- num_charsets = codeset->num_charsets;
-
- for (j = 0; j < num_charsets; j++) {
-
- charset = codeset->charset_list[j];
-
- for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
-
- if (! strcmp(ctdp->name, charset->name)) {
-
- ctdptr[codeset->cs_num] = ctdp;
-
- ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
-
- ctdptr[codeset->cs_num]->set_size =
- charset->set_size;
-
- ctdptr[codeset->cs_num]->min_ch =
- charset->set_size == 94 &&
- (ctdptr[codeset->cs_num]->length > 1 ||
- ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
-
- if (codeset->parse_info) {
- ctdptr[codeset->cs_num]->sshift =
- *codeset->parse_info->encoding;
- }
-
- break;
- }
- }
- }
-}
-
-
-#define SKIP_I(str) while (*(str) >= 0x20 && *(str) <= 0x2f) (str)++;
-#define SKIP_P(str) while (*(str) >= 0x30 && *(str) <= 0x3f) (str)++;
-
-static int
-euc_ctstowcs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
- Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
- const char *inbufptr = *from;
- const char *inbuf_base;
- wchar_t *outbufptr = (wchar_t *) *to;
- wchar_t *outbuf_base = outbufptr;
- int clen, length;
- int unconv_num = 0;
- unsigned int ct_seglen = 0;
- Uchar ct_type = 0;
- int shift_mult;
- wchar_t wc_tmp;
- wchar_t wch;
- Ulong wc_encoding;
- CTData ctdp = ctdata;
- CTData GL_ctdp = ctdp; /* GL ctdp save */
- CTData GR_ctdp = ctdp; /* GR ctdp save */
- Bool save_outbuf = True;
- /* If outbufptr is NULL, doen't save output, but just counts
- a length to hold the output */
- if (outbufptr == NULL) save_outbuf = False;
-
- for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
- {
- ct_type = CT_STD;
- /* change GL/GR charset */
- if(ctdp->side == XlcGR && isleftside(*inbufptr)){
- /* select GL side */
- ctdp = GL_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
- /* select GR side */
- ctdp = GR_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }
- if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
- for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
-
- if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
- {
- inbufptr += ctdp->ct_encoding_len;
- (*from_left) -= ctdp->ct_encoding_len;
- if (ctdp->length) {
- length = ctdp->length;
- if( *from_left < length ) {
- *to = (XPointer)outbufptr;
- *to_left -= outbufptr - outbuf_base;
- return( unconv_num + *from_left );
- }
- }
- ct_type = ctdp->ct_type;
- if(ctdp->side == XlcGL){
- GL_ctdp = ctdp; /* save GL ctdp */
- }else{
- GR_ctdp = ctdp; /* save GR ctdp */
- }
- break;
- }
- }
- if (ctdp > ctd_endp) /* failed to match CT sequence */
- unconv_num++;
- }
-
-/* The following code insures that non-standard encodings, direction, extension,
- * and version strings are ignored; subject to change in future.
- */
- switch (ct_type) {
- case CT_STD:
- break;
- case CT_EXT2:
- inbufptr++;
- (*from_left)--;
- case CT_NSTD:
- ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
- inbufptr += ct_seglen;
- (*from_left) -= ct_seglen;
- continue;
- case CT_EXT0:
- inbuf_base = inbufptr;
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- *(from_left) -= ct_seglen;
- continue;
- case CT_EXT1:
- inbuf_base = inbufptr;
- SKIP_P(inbufptr);
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- *(from_left) -= ct_seglen;
- continue;
- case CT_DIR:
- continue;
- case CT_VER:
- inbufptr += 2;
- *(from_left) -= 2;
- continue;
- }
-
- wc_encoding = (ctdp == ctdptr[Kana] && isleftside(*inbufptr)) ?
- ctdptr[Ascii]->wc_encoding: ctdp->wc_encoding;
-
- shift_mult = length - 1;
- wch = (wchar_t)0;
- clen = length;
-
- do {
- wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
- wch |= wc_tmp;
- shift_mult--;
- } while (--clen);
-
- if (save_outbuf == True)
- *outbufptr++ = wch | wc_encoding;
- if (--*to_left == 0 && *from_left != length) {
- *to = (XPointer)outbufptr;
- unconv_num = *from_left;
- return unconv_num;
- }
- }
-
- *to = (XPointer)outbufptr;
-
- return unconv_num;
-
-}
-
-
-#define byte1 (length == codeset->length - 1)
-#define byte2 (byte1 == 0)
-#define kanji (codeset->cs_num == 1)
-#define kana (codeset->cs_num == 2)
-#define userdef (codeset->cs_num == 3)
-
-static int
-euc_wcstocts(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- int ct_len = *to_left;
- const wchar_t *inbufptr = (const wchar_t *) *from;
- char *ctptr = *to;
- XPointer ct_base = ctptr;
- wchar_t wch;
- int length;
- int unconv_num = 0;
- Uchar tmp;
- Uchar t1 = 0;
- int num_conv;
-
- StateRec ct_state;
- XLCd lcd = (XLCd)conv->state;
- CTData charset;
- CodeSet codeset;
- Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
-
-/* Initial State: */
- ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
- ct_state.GR_charset = NULL;
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (; *from_left > 0 ; (*from_left)-- ) {
-
- wch = *inbufptr++;
-
- if (!(codeset = wc_codeset(lcd, wch))) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
-
- charset = ctdptr[codeset->cs_num];
-
- length = codeset->length;
- wch ^= (wchar_t)codeset->wc_encoding;
-
- if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
- (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
-
- ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
-
- if (ct_len < 0) {
- unconv_num++;
- break;
- }
-
- if (ctptr) {
- strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
- ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
- }
- }
-
- if (charset->side == XlcGR) {
- ct_state.GR_charset = charset;
- ct_state.GL_charset = NULL;
- } else if (charset->side == XlcGL) {
- ct_state.GL_charset = charset;
- ct_state.GR_charset = NULL;
- }
-
- do {
-
- length--;
- tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
-
- if (kana) {
- if (BADCHAR(charset->min_ch, (char)tmp)) {
- unconv_num++;
- break;
- }
- *ctptr++ = (char)BIT8ON(tmp);
- }
-
- else if (byte1 && (kanji || userdef))
- t1 = tmp;
-
- else if (byte2 && (kanji || userdef)) {
- if (BADCHAR(charset->min_ch, (char)t1) ||
- BADCHAR(charset->min_ch, (char)tmp)) {
- unconv_num++;
- break;
- }
- if (charset->side == XlcGR) {
- *ctptr++ = (char)BIT8ON(t1);
- *ctptr++ = (char)BIT8ON(tmp);
- } else {
- *ctptr++ = (char)BIT8OFF(t1);
- *ctptr++ = (char)BIT8OFF(tmp);
- }
- }
-
- else {
- if (BADCHAR(charset->min_ch, (char)tmp)) {
- unconv_num++;
- break;
- }
- *ctptr++ = (char)tmp;
- }
-
-
- } while (length);
-
- } /* end for */
-
- *to = (XPointer)ctptr;
-
- if ((num_conv = (int)(ctptr - ct_base)) > 0)
- (*to_left) -= num_conv;
-
- return unconv_num;
-}
-#undef byte1
-#undef byte2
-#undef kana
-#undef kanji
-#undef userdef
-
-
-#define byte1 (ctdp->length == clen)
-#define kana (ctdp == ctdptr[Kana] && isrightside(*inbufptr))
-/* #define kanji (ctdp == ctdptr[Kanji]) */
-#define kanji (strstr(ctdp->name, "JISX0208"))
-#define userdef (ctdp == ctdptr[Userdef])
-
-static int
-euc_ctstombs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- char *inbufptr = *from;
- XPointer outbufptr = *to;
- const char *inbuf_base;
- XPointer outbuf_base = outbufptr;
- int clen, length;
- int unconv_num = 0;
- unsigned int ct_seglen = 0;
- Uchar ct_type = 0;
- CTData ctdp = &ctdata[0]; /* default */
- CTData GL_ctdp = ctdp; /* GL ctdp save */
- CTData GR_ctdp = ctdp; /* GR ctdp save */
- Bool save_outbuf = True;
- /* If outbufptr is NULL, doen't save output, but just counts
- a length to hold the output */
- if (outbufptr == NULL) save_outbuf = False;
-
- for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
- {
- ct_type = CT_STD;
- /* change GL/GR charset */
- if(ctdp->side == XlcGR && isleftside(*inbufptr)){
- /* select GL side */
- ctdp = GL_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
- /* select GR side */
- ctdp = GR_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }
- if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
-
- for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
-
- if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
- {
- inbufptr += ctdp->ct_encoding_len;
- (*from_left) -= ctdp->ct_encoding_len;
- if (ctdp->length) {
- length = ctdp->length;
- if( *from_left < length ) {
- *to = (XPointer)outbufptr;
- *to_left -= outbufptr - outbuf_base;
- return( unconv_num + *from_left );
- }
- }
- ct_type = ctdp->ct_type;
- if(ctdp->side == XlcGL){
- GL_ctdp = ctdp; /* save GL ctdp */
- }else{
- GR_ctdp = ctdp; /* save GR ctdp */
- }
- break;
- }
- }
- if (ctdp > ctd_endp) /* failed to match CT sequence */
- unconv_num++;
- }
-
-/* The following code insures that non-standard encodings, direction, extension,
- * and version strings are ignored; subject to change in future.
- */
- switch (ct_type) {
- case CT_STD:
- break;
- case CT_EXT2:
- inbufptr++;
- (*from_left)--;
- case CT_NSTD:
- ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
- inbufptr += ct_seglen;
- (*from_left) -= ct_seglen;
- continue;
- case CT_EXT0:
- inbuf_base = inbufptr;
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- *(from_left) -= ct_seglen;
- continue;
- case CT_EXT1:
- inbuf_base = inbufptr;
- SKIP_P(inbufptr);
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- *(from_left) -= ct_seglen;
- continue;
- case CT_DIR:
- continue;
- case CT_VER:
- inbufptr += 2;
- *(from_left) -= 2;
- continue;
- }
-
- clen = length;
- do {
-
- if (byte1) {
- if (kanji) {
- /* FIXME: assignment of read-only location */
- *inbufptr = BIT8ON(*inbufptr);
- *(inbufptr+1) = BIT8ON(*(inbufptr+1));
- }
- else if (kana || userdef) {
- if (save_outbuf == True) {
- *outbufptr++ = ctdp->sshift;
- }
- (*to_left)--;
- }
- }
- if (save_outbuf == True) {
- *outbufptr++ = *inbufptr;
- }
- (*to_left)--;
- inbufptr++;
-
- if (*to_left == 0 && *from_left != length) {
- *to = (XPointer)outbufptr;
- unconv_num = *from_left;
- return unconv_num;
- }
- } while (--clen);
- }
-
- *to = outbufptr;
-
- return unconv_num;
-
-}
-#undef byte1
-#undef kana
-#undef kanji
-#undef userdef
-
-
-static int
-euc_mbstocts(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- int ct_len = *to_left;
- int cs_num;
- int clen, length = 0;
- int unconv_num = 0;
- int num_conv;
- const char *inbufptr = *from;
- char *ctptr = *to;
- XPointer ct_base = ctptr;
-
- StateRec ct_state;
- CTData charset;
- XLCd lcd = (XLCd) conv->state;
- int codeset_num = XLC_GENERIC(lcd, codeset_num);
-
-/* Initial State: */
- ct_state.GL_charset = NULL;
- ct_state.GR_charset = NULL;
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (;*from_left > 0; (*from_left) -= length) {
-
- if (isleftside(*inbufptr)) { /* 7-bit (CS0) */
- if (ASCII_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Ascii;
- charset = ctdptr[Ascii];
- }
- else if ((Uchar)*inbufptr == SS2) { /* Kana */
- if (KANA_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Kana;
- charset = ctdptr[Kana];
- inbufptr++;
- (*from_left)--;
- }
- else if ((Uchar)*inbufptr == SS3) { /* Userdef */
- if (USERDEF_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Userdef;
- charset = ctdptr[Userdef];
- inbufptr++;
- (*from_left)--;
- }
- else {
- if (KANJI_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Kanji;
- charset = ctdptr[Kanji];
- }
-
- length = charset->length;
-
- if (BADCHAR(charset->min_ch, *inbufptr))
- continue;
-
- if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
- (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
-
- ct_len -= ctdptr[cs_num]->ct_encoding_len;
- if (ct_len < 0) {
- unconv_num++;
- break;
- }
-
- if (ctptr) {
- strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
- ctptr += ctdptr[cs_num]->ct_encoding_len;
- }
- }
-
- if (charset->side == XlcGR) {
- ct_state.GR_charset = charset;
- ct_state.GL_charset = NULL;
- } else if (charset->side == XlcGL) {
- ct_state.GL_charset = charset;
- ct_state.GR_charset = NULL;
- }
-
- clen = length;
-
- do {
- *ctptr++ = charset == ct_state.GR_charset ?
- BIT8ON(*inbufptr++) : BIT8OFF(*inbufptr++);
- } while (--clen);
- }
-
- *to = (XPointer)ctptr;
-
- if ((num_conv = (int)(ctptr - ct_base)) > 0)
- (*to_left) -= num_conv;
- return unconv_num;
-
-}
-
-
-static void
-close_converter(
- XlcConv conv)
-{
- Xfree((char *) conv);
-}
-
-enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
- CTSTOWCS, CTSTOMBS, WCSTOCTS, MBSTOCTS };
-
-static XlcConvMethodsRec conv_methods[] = {
- {close_converter, euc_mbstocs, NULL },
- {close_converter, euc_wcstocs, NULL },
- {close_converter, euc_mbtocs, NULL },
- {close_converter, euc_cstombs, NULL },
- {close_converter, euc_cstowcs, NULL },
- {close_converter, euc_mbstowcs, NULL },
- {close_converter, euc_wcstombs, NULL },
- {close_converter, euc_ctstowcs, NULL },
- {close_converter, euc_ctstombs, NULL },
- {close_converter, euc_wcstocts, NULL },
- {close_converter, euc_mbstocts, NULL },
-};
-
-
-static XlcConv
-open_mbstocs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBSTOCS]);
-}
-
-static XlcConv
-open_wcstocs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[WCSTOCS]);
-}
-
-static XlcConv
-open_mbtocs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBTOCS]);
-}
-
-static XlcConv
-open_cstombs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CSTOMBS]);
-}
-
-static XlcConv
-open_cstowcs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CSTOWCS]);
-}
-
-static XlcConv
-open_mbstowcs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
-}
-
-static XlcConv
-open_wcstombs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
-}
-
-static XlcConv
-open_ctstowcs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
-}
-
-static XlcConv
-open_ctstombs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
-}
-
-static XlcConv
-open_wcstocts(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
-}
-
-static XlcConv
-open_mbstocts(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
-}
-
-XLCd
-_XlcEucLoader(
- const char *name)
-{
- XLCd lcd;
-
- lcd = _XlcCreateLC(name, _XlcGenericMethods);
- if (lcd == NULL)
- return lcd;
-
- if (!XLC_PUBLIC_PART(lcd)->codeset ||
- (_XlcNCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "euc", 3))) {
- _XlcDestroyLC(lcd);
- return (XLCd) NULL;
- }
-
- initCTptr(lcd);
-
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
- _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
- _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
-
-#ifndef FORCE_INDIRECT_CONVERTER
- _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
- _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
-#endif
-
- _XlcAddUtf8Converters(lcd);
-
- return lcd;
-}
-
-#else
-typedef int dummy;
-#endif /* X_LOCALE */
+/******************************************************************
+
+ Copyright 1992, 1993 by FUJITSU LIMITED
+ Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+
+Permission to use, copy, modify, distribute and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the name of FUJITSU LIMITED and
+Fujitsu Open Systems Solutions, Inc. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+FUJITSU LIMITED and Fujitsu Open Systems Solutions, Inc. makes no
+representations about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED AND FUJITSU OPEN SYSTEMS SOLUTIONS, INC. DISCLAIMS ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU OPEN SYSTEMS
+SOLUTIONS, INC. AND FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT
+OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+ Authors: Shigeru Yamada (yamada@ossi.com)
+ Jeffrey Bloomfield (jeffb@ossi.com)
+ Yoshiyuki Segawa (segawa@ossi.com)
+
+*****************************************************************/
+
+/*
+ * An EUC locale.
+ * Supports: all locales with codeset eucJP, eucKR, eucCN, eucTW.
+ * How: Provides converters for euc*.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+#include <ctype.h>
+#ifdef WIN32
+#define isascii __isascii
+#endif
+
+#define CS0 codesets[0] /* Codeset 0 - 7-bit ASCII */
+#define CS1 codesets[1] /* Codeset 1 - Kanji */
+#define CS2 codesets[2] /* Codeset 2 - Half-Kana */
+#define CS3 codesets[3] /* Codeset 3 - User defined */
+
+#define SS2 0x8e /* Single-shift char: CS2 */
+#define SS3 0x8f /* Single-shift char: CS3 */
+
+#define ASCII_CODESET 0
+#define KANJI_CODESET 1
+#define KANA_CODESET 2
+#define USERDEF_CODESET 3
+#define MAX_CODESETS
+
+#define GR 0x80 /* begins right-side (non-ascii) region */
+#define GL 0x7f /* ends left-side (ascii) region */
+
+#define isleftside(c) (((c) & GR) ? 0 : 1)
+#define isrightside(c) (!isleftside(c))
+
+#define BIT8OFF(c) ((c) & GL)
+#define BIT8ON(c) ((c) | GR)
+
+typedef unsigned char Uchar;
+typedef unsigned long Ulong;
+typedef unsigned int Uint;
+
+static CodeSet GetCodeSetFromCharSet (XLCd lcd, XlcCharSet charset);
+static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
+
+#define BADCHAR(min_ch, c) (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
+ BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
+ BIT8OFF(c) != 0x1b)
+
+/*
+ * Notes:
+ * 1. Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
+ * forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
+ * 2. Using direct converters (e.g. mbstowcs()) decreases conversion
+ * times by 20-40% (depends on specific converter used).
+ */
+
+static int
+euc_mbstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+
+ Uchar ch;
+ int chr_len = 0;
+ int sshift = False;
+ int shift_mult = 0;
+ Uint chrcode;
+
+ Uint wc_encode = 0;
+ Uint wc_tmp = 0;
+
+ int cs0flg = False;
+ int cs1flg = False;
+ int length = 0;
+ int unconv_num = 0;
+
+ Bool new_char;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *) *to;
+
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ for (new_char = True; *from_left > 0 && *to_left > 0;) {
+
+ ch = *inbufptr++;
+
+ if (isleftside(ch)) { /* CS0 */
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if( cs0flg == True) {
+ new_char = True;
+ cs0flg = False;
+ }
+ length = CS0->length;
+ *outbufptr++ = (wchar_t)ch;
+ (*from_left)--;
+ (*to_left)--;
+ continue;
+ }
+ else if (ch == SS2) { /* CS2 */
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (sshift == True || cs1flg == True) {
+ cs1flg = False;
+ unconv_num++;
+ continue;
+ }
+ length = CS2->length;
+ wc_encode = CS2->wc_encoding;
+ chrcode = 0;
+ sshift = True;
+ cs0flg = True;
+ (*from_left)--;
+ continue;
+ }
+ else if (ch == SS3) { /* CS3 */
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (sshift == True || cs1flg == True) {
+ cs1flg = False;
+ unconv_num++;
+ continue;
+ }
+ length = CS3->length;
+ if (*from_left < 1 )
+ unconv_num++;
+ wc_encode = CS3->wc_encoding;
+ chrcode = 0;
+ sshift = True;
+ cs0flg = True;
+ (*from_left)--;
+ continue;
+
+ } else { /* CS1 */
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (sshift == False) {
+ length = CS1->length;
+ if (*from_left < 1)
+ unconv_num++;
+ wc_encode = CS1->wc_encoding;
+ }
+ chrcode = BIT8OFF(ch);
+ cs0flg = True;
+ cs1flg = True;
+ (*from_left)--;
+ }
+
+ if (new_char) { /* begin new character */
+ chr_len = length;
+ shift_mult = length - 1;
+ new_char = False;
+ }
+
+ chrcode <<= (wc_shift * shift_mult);
+ shift_mult--;
+ wc_tmp |= chrcode;
+
+ if (--chr_len == 0) {
+ wc_tmp |= wc_encode;
+ *outbufptr++ = wc_tmp;
+ (*to_left)--;
+
+ new_char = True;
+ sshift = False;
+ cs0flg = False;
+ cs1flg = False;
+ wc_tmp = (Uint)0;
+ }
+
+ } /* end for */
+
+ *to = (XPointer)outbufptr;
+
+ if (cs0flg == True || cs1flg == True) /* error check on last char */
+ unconv_num++;
+
+ return unconv_num;
+}
+
+
+static int
+euc_wcstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ XPointer outbufptr = *to;
+ wchar_t wch;
+ int length;
+ Uchar tmp;
+ int unconv_num = 0;
+
+ XLCd lcd = (XLCd)conv->state;
+ CodeSet codeset;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ for (; *from_left > 0 && *to_left > 0; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ if (codeset->parse_info) { /* put out SS2 or SS3 */
+ if (*to_left < length + 1) {
+ unconv_num++;
+ break;
+ }
+ *outbufptr++ = *codeset->parse_info->encoding;
+ (*to_left)--;
+ } else {
+ if (*to_left < length) {
+ unconv_num++;
+ break;
+ }
+ }
+
+ do {
+ length--;
+ tmp = (wch>>(wchar_t)(length * wc_shift));
+
+ if (codeset->side == XlcGR)
+ tmp = BIT8ON(tmp);
+
+ *outbufptr++ = (Uchar)tmp;
+ (*to_left)--;
+ } while (length);
+ }
+
+ *to = (XPointer)outbufptr;
+
+ return unconv_num;
+}
+
+
+static int
+euc_mbtocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ XlcCharSet charset;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ int length;
+ int unconv_num = 0;
+ int min_ch = 0;
+ const char *src = *from;
+ char *dst = *to;
+
+ if (isleftside(*src)) { /* 7-bit (CS0) */
+ if (ASCII_CODESET >= codeset_num)
+ return -1;
+ charset = *CS0->charset_list;
+ }
+ else if ((Uchar)*src == SS2) { /* half-kana (CS2) */
+ if (KANA_CODESET >= codeset_num)
+ return -1;
+ charset = *CS2->charset_list;
+ src++;
+ (*from_left)--;
+ }
+ else if ((Uchar)*src == SS3) { /* user-def */
+ if (USERDEF_CODESET >= codeset_num)
+ return -1;
+ charset = *CS3->charset_list;
+ src++;
+ (*from_left)--;
+ }
+ else { /* Kanji (CS1) */
+ if (KANJI_CODESET >= codeset_num)
+ return -1;
+ charset = *CS1->charset_list;
+ }
+
+ if(*from_left < charset->char_size || *to_left < charset->char_size)
+ return -1;
+
+ min_ch = 0x20;
+ if (charset->set_size == 94)
+ if (charset->char_size > 1 || charset->side == XlcGR)
+ min_ch = 0x21;
+
+ length = charset->char_size;
+ do {
+ if(BADCHAR(min_ch, *src)) {
+ unconv_num++;
+ src++;
+ break;
+ }
+ switch (charset->side) {
+ case XlcGL:
+ *dst++ = BIT8OFF(*src++);
+ break;
+ case XlcGR:
+ *dst++ = BIT8ON(*src++);
+ break;
+ default:
+ *dst++ = *src++;
+ break;
+ }
+ } while (--length);
+
+ *to = dst;
+ *from = (XPointer) src;
+ *from_left -= charset->char_size;
+ *to_left -= charset->char_size - length;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+
+static int
+euc_mbstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *tmp_from;
+ char *tmp_to;
+ int tmp_from_left, tmp_to_left;
+ XlcCharSet charset, tmp_charset;
+ XPointer tmp_args[1];
+ int unconv_num = 0, ret;
+
+/* Determine the charset of the segment and convert one characater: */
+
+ tmp_args[0] = (XPointer) &charset; /* charset from euc_mbtocs() */
+ while
+ ((ret = euc_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
+ unconv_num += ret;
+ if ( ret < 0 )
+ return ret;
+
+ tmp_from = *from;
+ tmp_from_left = *from_left;
+ tmp_to_left = *to_left;
+ tmp_to = *to;
+
+/* Convert remainder of the segment: */
+
+ tmp_args[0] = (XPointer) &tmp_charset;
+ while( (ret = euc_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
+ (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
+
+ if (ret > 0) {
+ unconv_num += ret;
+ continue;
+ }
+
+ if (tmp_charset != charset) /* quit on end of segment */
+ break;
+
+ *from = (XPointer) tmp_from;
+ *from_left = tmp_from_left;
+ *to = (XPointer) tmp_to;
+ *to_left = tmp_to_left;
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+
+static int
+euc_wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ const wchar_t *wcptr = (const wchar_t *) *from;
+ char *bufptr = (char *) *to;
+ wchar_t wch;
+ char *tmpptr;
+ int length;
+ CodeSet codeset;
+ Ulong wc_encoding;
+ int wcstr_len = *from_left, buf_len = *to_left;
+
+ if (!(codeset = wc_codeset(lcd, *wcptr)))
+ return -1;
+
+ wc_encoding = codeset->wc_encoding;
+
+ if (wcstr_len < buf_len / codeset->length)
+ buf_len = wcstr_len * codeset->length;
+
+ for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+ wch = *wcptr;
+
+ if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+ break;
+
+ length = codeset->length;
+
+ buf_len -= length;
+ bufptr += length;
+ tmpptr = bufptr - 1;
+
+ while (length--) {
+ *tmpptr-- = codeset->length == 1 && codeset->side == XlcGR ?
+ BIT8ON(wch) : BIT8OFF(wch);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+ *from_left -= wcptr - (wchar_t *) *from;
+ *from = (XPointer) wcptr;
+
+ *to_left -= bufptr - *to;
+ *to = bufptr;
+
+ return 0;
+}
+
+
+static int
+euc_cstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ const char *csptr = *from;
+ char *bufptr = *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ int length;
+ CodeSet codeset;
+ int cvt_length;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ cvt_length = 0;
+ csstr_len /= codeset->length;
+ buf_len /= codeset->length;
+
+ if (codeset->parse_info)
+ csstr_len *= 2;
+
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ cvt_length += buf_len * codeset->length;
+
+ if (bufptr) {
+ while (buf_len--) {
+ if (codeset->parse_info) /* put out SS2 or SS3 */
+ *bufptr++ = *codeset->parse_info->encoding;
+
+ length = codeset->length;
+ while (length--)
+ *bufptr++ = codeset->side == XlcGR ?
+ BIT8ON(*csptr++) : BIT8OFF(*csptr++);
+ }
+ }
+
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+ if (bufptr)
+ *to += cvt_length;
+ *to_left -= cvt_length;
+
+ return 0;
+}
+
+
+static int
+euc_cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ const char *csptr = *from;
+ wchar_t *bufptr = (wchar_t *) *to;
+ wchar_t *toptr = (wchar_t *) *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ wchar_t wch;
+ int length;
+ Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+ CodeSet codeset;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ csstr_len /= codeset->length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+ *to_left -= buf_len;
+
+ if (bufptr) {
+
+ toptr += buf_len;
+ *to = (XPointer) toptr;
+
+ while (buf_len--) {
+
+ wch = (wchar_t) BIT8OFF(*csptr);
+ csptr++;
+
+ length = codeset->length - 1;
+ while (length--) {
+ wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
+ csptr++;
+ }
+ *bufptr++ = wch | codeset->wc_encoding;
+ }
+ }
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+
+ return 0;
+}
+
+
+static CodeSet
+wc_codeset(
+ XLCd lcd,
+ wchar_t wch)
+{
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int end = XLC_GENERIC(lcd, codeset_num);
+ Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
+
+ for (; --end >= 0; codesets++)
+ if ( widech == (*codesets)->wc_encoding )
+ return *codesets;
+
+ return NULL;
+}
+
+
+static CodeSet
+GetCodeSetFromCharSet(
+ XLCd lcd,
+ XlcCharSet charset)
+{
+ CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+ XlcCharSet *charset_list;
+ int codeset_num, num_charsets;
+
+ codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ for ( ; codeset_num-- > 0; codeset++) {
+ num_charsets = (*codeset)->num_charsets;
+ charset_list = (*codeset)->charset_list;
+
+ for ( ; num_charsets-- > 0; charset_list++)
+ if (*charset_list == charset)
+ return *codeset;
+ }
+
+ return (CodeSet) NULL;
+}
+
+
+static XlcConv
+create_conv(
+ XLCd lcd,
+ XlcConvMethods methods)
+{
+ XlcConv conv;
+
+ conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+ if (conv == NULL)
+ return (XlcConv) NULL;
+
+ conv->methods = methods;
+ conv->state = (XPointer) lcd;
+ return conv;
+}
+
+
+/*
+ * Stripped down Direct CT converters for EUC
+ *
+ */
+
+typedef struct _CTDataRec {
+ int side;
+ int length;
+ char *name;
+ Ulong wc_encoding;
+ char sshift;
+ char *ct_encoding;
+ int ct_encoding_len;
+ int set_size;
+ Uchar min_ch;
+ Uchar ct_type;
+} CTDataRec, *CTData;
+
+typedef struct _StateRec {
+ CTData GL_charset;
+ CTData GR_charset;
+ CTData charset;
+} StateRec, *State;
+
+#define CT_STD 0
+#define CT_NSTD 1
+#define CT_DIR 2
+#define CT_EXT0 3
+#define CT_EXT1 4
+#define CT_EXT2 5
+#define CT_VER 6
+
+static CTDataRec ctdata[] =
+{
+ { XlcGL, 1, "ISO8859-1:GL", 0, 0, "\033(B" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "ISO8859-1:GR", 0, 0, "\033-A" , 3, 0, 0, CT_STD },
+ { XlcGL, 1, "JISX0201.1976-0:GL", 0, 0, "\033(J" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "JISX0201.1976-0:GR", 0, 0, "\033)I" , 3, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0208.1983-0:GL", 0, 0, "\033$(B" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0208.1983-0:GR", 0, 0, "\033$)B" , 4, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0212.1990-0:GL", 0, 0, "\033$(D" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0212.1990-0:GR", 0, 0, "\033$)D" , 4, 0, 0, CT_STD },
+ { XlcUnknown, 0, "Ignore-Ext-Status?", 0, 0, "\033#" , 2, 0, 0, CT_VER },
+ { XlcUnknown, 0, "NonStd-?-OctetChar", 0, 0, "\033%/0" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 1, "NonStd-1-OctetChar", 0, 0, "\033%/1" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 2, "NonStd-2-OctetChar", 0, 0, "\033%/2" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 3, "NonStd-3-OctetChar", 0, 0, "\033%/3" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 4, "NonStd-4-OctetChar", 0, 0, "\033%/4" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 0, "Extension-2" , 0, 0, "\033%/" , 3, 0, 0, CT_EXT2 },
+ { XlcUnknown, 0, "Extension-0" , 0, 0, "\033" , 1, 0, 0, CT_EXT0 },
+ { XlcUnknown, 0, "Begin-L-to-R-Text", 0, 0, "\2331]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Begin-R-to-L-Text", 0, 0, "\2332]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "End-Of-String", 0, 0, "\233]" , 2, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Extension-1" , 0, 0, "\233" , 1, 0, 0, CT_EXT1 },
+};
+
+/* Note on above table: euc_ctstombs() and euc_ctstowcs() parser depends on
+ * certain table entries occuring in decreasing string length--
+ * 1. CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
+ * 2. CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
+ */
+
+static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
+static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
+
+#define Ascii 0
+#define Kanji 1
+#define Kana 2
+#define Userdef 3
+
+/*
+ * initCTptr(): Set ctdptr[] to point at ctdata[], indexed by codeset_num.
+ */
+static void
+initCTptr(
+ XLCd lcd)
+{
+ int num_codesets = XLC_GENERIC(lcd, codeset_num);
+ int num_charsets;
+ int i, j;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ CodeSet codeset;
+ XlcCharSet charset;
+ CTData ctdp = ctdata;
+
+ ctdptr[Ascii] = &ctdata[0]; /* failsafe */
+
+ for (i = 0; i < num_codesets; i++) {
+
+ codeset = codesets[i];
+ num_charsets = codeset->num_charsets;
+
+ for (j = 0; j < num_charsets; j++) {
+
+ charset = codeset->charset_list[j];
+
+ for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
+
+ if (! strcmp(ctdp->name, charset->name)) {
+
+ ctdptr[codeset->cs_num] = ctdp;
+
+ ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
+
+ ctdptr[codeset->cs_num]->set_size =
+ charset->set_size;
+
+ ctdptr[codeset->cs_num]->min_ch =
+ charset->set_size == 94 &&
+ (ctdptr[codeset->cs_num]->length > 1 ||
+ ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
+
+ if (codeset->parse_info) {
+ ctdptr[codeset->cs_num]->sshift =
+ *codeset->parse_info->encoding;
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+
+#define SKIP_I(str) while (*(str) >= 0x20 && *(str) <= 0x2f) (str)++;
+#define SKIP_P(str) while (*(str) >= 0x30 && *(str) <= 0x3f) (str)++;
+
+static int
+euc_ctstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+ const char *inbufptr = *from;
+ const char *inbuf_base;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ wchar_t *outbuf_base = outbufptr;
+ int clen, length;
+ int unconv_num = 0;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type = 0;
+ int shift_mult;
+ wchar_t wc_tmp;
+ wchar_t wch;
+ Ulong wc_encoding;
+ CTData ctdp = ctdata;
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+ Bool save_outbuf = True;
+ /* If outbufptr is NULL, doen't save output, but just counts
+ a length to hold the output */
+ if (outbufptr == NULL) save_outbuf = False;
+
+ for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if (ctdp->length) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ *(from_left) -= 2;
+ continue;
+ }
+
+ wc_encoding = (ctdp == ctdptr[Kana] && isleftside(*inbufptr)) ?
+ ctdptr[Ascii]->wc_encoding: ctdp->wc_encoding;
+
+ shift_mult = length - 1;
+ wch = (wchar_t)0;
+ clen = length;
+
+ do {
+ wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
+ wch |= wc_tmp;
+ shift_mult--;
+ } while (--clen);
+
+ if (save_outbuf == True)
+ *outbufptr++ = wch | wc_encoding;
+ if (--*to_left == 0 && *from_left != length) {
+ *to = (XPointer)outbufptr;
+ unconv_num = *from_left;
+ return unconv_num;
+ }
+ }
+
+ *to = (XPointer)outbufptr;
+
+ return unconv_num;
+
+}
+
+
+#define byte1 (length == codeset->length - 1)
+#define byte2 (byte1 == 0)
+#define kanji (codeset->cs_num == 1)
+#define kana (codeset->cs_num == 2)
+#define userdef (codeset->cs_num == 3)
+
+static int
+euc_wcstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+ wchar_t wch;
+ int length;
+ int unconv_num = 0;
+ Uchar tmp;
+ Uchar t1 = 0;
+ int num_conv;
+
+ StateRec ct_state;
+ XLCd lcd = (XLCd)conv->state;
+ CTData charset;
+ CodeSet codeset;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+/* Initial State: */
+ ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (; *from_left > 0 ; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ charset = ctdptr[codeset->cs_num];
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
+
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
+ ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
+ }
+ }
+
+ if (charset->side == XlcGR) {
+ ct_state.GR_charset = charset;
+ ct_state.GL_charset = NULL;
+ } else if (charset->side == XlcGL) {
+ ct_state.GL_charset = charset;
+ ct_state.GR_charset = NULL;
+ }
+
+ do {
+
+ length--;
+ tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+ if (kana) {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)BIT8ON(tmp);
+ }
+
+ else if (byte1 && (kanji || userdef))
+ t1 = tmp;
+
+ else if (byte2 && (kanji || userdef)) {
+ if (BADCHAR(charset->min_ch, (char)t1) ||
+ BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ if (charset->side == XlcGR) {
+ *ctptr++ = (char)BIT8ON(t1);
+ *ctptr++ = (char)BIT8ON(tmp);
+ } else {
+ *ctptr++ = (char)BIT8OFF(t1);
+ *ctptr++ = (char)BIT8OFF(tmp);
+ }
+ }
+
+ else {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)tmp;
+ }
+
+
+ } while (length);
+
+ } /* end for */
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+#undef byte1
+#undef byte2
+#undef kana
+#undef kanji
+#undef userdef
+
+
+#define byte1 (ctdp->length == clen)
+#define kana (ctdp == ctdptr[Kana] && isrightside(*inbufptr))
+/* #define kanji (ctdp == ctdptr[Kanji]) */
+#define kanji (strstr(ctdp->name, "JISX0208"))
+#define userdef (ctdp == ctdptr[Userdef])
+
+static int
+euc_ctstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ char *inbufptr = *from;
+ XPointer outbufptr = *to;
+ const char *inbuf_base;
+ XPointer outbuf_base = outbufptr;
+ int clen, length;
+ int unconv_num = 0;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type = 0;
+ CTData ctdp = &ctdata[0]; /* default */
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+ Bool save_outbuf = True;
+ /* If outbufptr is NULL, doen't save output, but just counts
+ a length to hold the output */
+ if (outbufptr == NULL) save_outbuf = False;
+
+ for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if (ctdp->length) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ *(from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ *(from_left) -= 2;
+ continue;
+ }
+
+ clen = length;
+ do {
+
+ if (byte1) {
+ if (kanji) {
+ /* FIXME: assignment of read-only location */
+ *inbufptr = BIT8ON(*inbufptr);
+ *(inbufptr+1) = BIT8ON(*(inbufptr+1));
+ }
+ else if (kana || userdef) {
+ if (save_outbuf == True) {
+ *outbufptr++ = ctdp->sshift;
+ }
+ (*to_left)--;
+ }
+ }
+ if (save_outbuf == True) {
+ *outbufptr++ = *inbufptr;
+ }
+ (*to_left)--;
+ inbufptr++;
+
+ if (*to_left == 0 && *from_left != length) {
+ *to = (XPointer)outbufptr;
+ unconv_num = *from_left;
+ return unconv_num;
+ }
+ } while (--clen);
+ }
+
+ *to = outbufptr;
+
+ return unconv_num;
+
+}
+#undef byte1
+#undef kana
+#undef kanji
+#undef userdef
+
+
+static int
+euc_mbstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ int cs_num;
+ int clen, length = 0;
+ int unconv_num = 0;
+ int num_conv;
+ const char *inbufptr = *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+
+ StateRec ct_state;
+ CTData charset;
+ XLCd lcd = (XLCd) conv->state;
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+/* Initial State: */
+ ct_state.GL_charset = NULL;
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (;*from_left > 0; (*from_left) -= length) {
+
+ if (isleftside(*inbufptr)) { /* 7-bit (CS0) */
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Ascii;
+ charset = ctdptr[Ascii];
+ }
+ else if ((Uchar)*inbufptr == SS2) { /* Kana */
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kana;
+ charset = ctdptr[Kana];
+ inbufptr++;
+ (*from_left)--;
+ }
+ else if ((Uchar)*inbufptr == SS3) { /* Userdef */
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Userdef;
+ charset = ctdptr[Userdef];
+ inbufptr++;
+ (*from_left)--;
+ }
+ else {
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kanji;
+ charset = ctdptr[Kanji];
+ }
+
+ length = charset->length;
+
+ if (BADCHAR(charset->min_ch, *inbufptr))
+ continue;
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[cs_num]->ct_encoding_len;
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
+ ctptr += ctdptr[cs_num]->ct_encoding_len;
+ }
+ }
+
+ if (charset->side == XlcGR) {
+ ct_state.GR_charset = charset;
+ ct_state.GL_charset = NULL;
+ } else if (charset->side == XlcGL) {
+ ct_state.GL_charset = charset;
+ ct_state.GR_charset = NULL;
+ }
+
+ clen = length;
+
+ do {
+ *ctptr++ = charset == ct_state.GR_charset ?
+ BIT8ON(*inbufptr++) : BIT8OFF(*inbufptr++);
+ } while (--clen);
+ }
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+ return unconv_num;
+
+}
+
+
+static void
+close_converter(
+ XlcConv conv)
+{
+ Xfree((char *) conv);
+}
+
+enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
+ CTSTOWCS, CTSTOMBS, WCSTOCTS, MBSTOCTS };
+
+static XlcConvMethodsRec conv_methods[] = {
+ {close_converter, euc_mbstocs, NULL },
+ {close_converter, euc_wcstocs, NULL },
+ {close_converter, euc_mbtocs, NULL },
+ {close_converter, euc_cstombs, NULL },
+ {close_converter, euc_cstowcs, NULL },
+ {close_converter, euc_mbstowcs, NULL },
+ {close_converter, euc_wcstombs, NULL },
+ {close_converter, euc_ctstowcs, NULL },
+ {close_converter, euc_ctstombs, NULL },
+ {close_converter, euc_wcstocts, NULL },
+ {close_converter, euc_mbstocts, NULL },
+};
+
+
+static XlcConv
+open_mbstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCS]);
+}
+
+static XlcConv
+open_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCS]);
+}
+
+static XlcConv
+open_mbtocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBTOCS]);
+}
+
+static XlcConv
+open_cstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOMBS]);
+}
+
+static XlcConv
+open_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOWCS]);
+}
+
+static XlcConv
+open_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
+}
+
+static XlcConv
+open_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
+}
+
+static XlcConv
+open_ctstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
+}
+
+static XlcConv
+open_ctstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
+}
+
+static XlcConv
+open_wcstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
+}
+
+static XlcConv
+open_mbstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
+}
+
+XLCd
+_XlcEucLoader(
+ const char *name)
+{
+ XLCd lcd;
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+ if (lcd == NULL)
+ return lcd;
+
+ if (!XLC_PUBLIC_PART(lcd)->codeset ||
+ (_XlcNCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "euc", 3))) {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+
+ initCTptr(lcd);
+
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+
+#ifndef FORCE_INDIRECT_CONVERTER
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+#endif
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/libX11/modules/lc/xlocale/lcSjis.c b/libX11/modules/lc/xlocale/lcSjis.c
index 74dd033ec..a7a9bbc4f 100644
--- a/libX11/modules/lc/xlocale/lcSjis.c
+++ b/libX11/modules/lc/xlocale/lcSjis.c
@@ -1,1612 +1,1612 @@
-/****************************************************************
-
- Copyright 1992, 1993 by FUJITSU LIMITED
- Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
- Copyright 1994 by Sony Corporation
-
-Permission to use, copy, modify, distribute and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear
-in supporting documentation, and that the name of FUJITSU LIMITED,
-Fujitsu Open Systems Solutions, Inc. and Sony Corporation not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-FUJITSU LIMITED, Fujitsu Open Systems Solutions, Inc. and
-Sony Corporation make no representations about the suitability of
-this software for any purpose. It is provided "as is" without
-express or implied warranty.
-
-FUJITSU LIMITED, FUJITSU OPEN SYSTEMS SOLUTIONS, INC. AND SONY
-CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
-IN NO EVENT SHALL FUJITSU OPEN SYSTEMS SOLUTIONS, INC., FUJITSU LIMITED
-AND SONY CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
-OR PERFORMANCE OF THIS SOFTWARE.
-
- Authors: Jeffrey Bloomfield (jeffb@ossi.com)
- Shigeru Yamada (yamada@ossi.com)
- Yoshiyuki Segawa (segawa@ossi.com)
- Modifier:Makoto Wakamatsu Sony Corporation
- makoto@sm.sony.co.jp
-
-*****************************************************************/
-
-/*
- * A Japanese SJIS locale.
- * Supports: all locales with codeset SJIS.
- * How: Provides converters for SJIS.
- * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
- */
-
-#ifdef X_LOCALE
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XlcGeneric.h"
-
-#include <ctype.h>
-#ifdef WIN32
-#define isascii __isascii
-#endif
-
-#define CS0 codesets[0] /* Codeset 0 - 7-bit ASCII */
-#define CS1 codesets[1] /* Codeset 1 - Kanji */
-#define CS2 codesets[2] /* Codeset 2 - Half-Kana */
-#define CS3 codesets[3] /* Codeset 3 - User defined */
-
-#define ascii (codeset->cs_num == 0)
-#define kanji (codeset->cs_num == 1)
-#define kana (codeset->cs_num == 2)
-#define userdef (codeset->cs_num == 3)
-
-#define ASCII_CODESET 0
-#define KANJI_CODESET 1
-#define KANA_CODESET 2
-#define USERDEF_CODESET 3
-#define MAX_CODESETS 4
-
-#define GR 0x80 /* begins right-side (non-ascii) region */
-#define GL 0x7f /* ends left-side (ascii) region */
-
-#define isleftside(c) (((c) & GR) ? 0 : 1)
-#define isrightside(c) (!isleftside(c))
-
-typedef unsigned char Uchar;
-typedef unsigned long Ulong;
-typedef unsigned int Uint;
-
-/* Acceptable range for 2nd byte of SJIS multibyte char */
-#define VALID_MULTIBYTE(c) \
- ((0x40<=((Uchar)c) && ((Uchar)c)<=0x7e) \
- || (0x80<=((Uchar)c) && ((Uchar)c)<=0xfc))
-
-#ifndef iskanji
-#define iskanji(c) ((0x81<=((Uchar)c) && ((Uchar)c)<=0x9f) \
- || (0xe0<=((Uchar)c) && ((Uchar)c)<=0xef))
-#endif /* !iskanji */
-
-#ifndef iskana
-#define iskana(c) (0xa1<=((Uchar)c) && ((Uchar)c)<=0xdf)
-#endif /* !iskana */
-
-#define isuserdef(c) (0xf0<=((Uchar)c) && ((Uchar)c)<=0xfc)
-
-#define BIT8OFF(c) ((c) & GL)
-#define BIT8ON(c) ((c) | GR)
-
-
-static void jis_to_sjis (Uchar *p1, Uchar *p2);
-static void sjis_to_jis (Uchar *p1, Uchar *p2);
-static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
-
-
-/*
- * Notes:
- * 1. 16-bit widechar format is limited to 14 data bits. Since the 2nd byte
- * of SJIS multibyte chars are in the ranges of 0x40 - 7E and 0x80 - 0xFC,
- * SJIS cannot map directly into 16 bit widechar format within the confines
- * of a single codeset. Therefore, for SJIS widechar conversion, SJIS Kanji
- * is mapped into the JIS codeset. (The algorithms used in jis_to_sjis()
- * and sjis_to_jis() are from Ken Lunde (lunde@mv.us.adobe.com) and are in
- * the public domain.)
- * 2. Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
- * forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
- * 3. Using direct converters (e.g. mbstowcs()) decreases conversion
- * times by 20-40% (depends on specific converter used).
- */
-
-
-static int
-sjis_mbstowcs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
-
- XLCd lcd = (XLCd)conv->state;
-
- int chr_len = 0;
- int shift_mult = 0;
- Uint chrcode = 0;
-
- Uchar ch, ch2;
- Uint wc_encode = 0;
- Uint wc_tmp = 0;
-
- Bool new_char;
-
- int firstbyte;
- int length = 0;
- int num_conv;
- int unconv_num = 0;
-
- const char *inbufptr = *from;
- wchar_t *outbufptr = (wchar_t *) *to;
- wchar_t *outbuf_base = outbufptr;
-
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
- int codeset_num = XLC_GENERIC(lcd, codeset_num);
- Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (new_char = True, firstbyte = True; *from_left > 0; (*from_left)--) {
-
- ch = *inbufptr++;
-
- if (firstbyte) {
- if (ASCII_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- if (isascii(ch)) {
- length = CS0->length;
- *outbufptr++ = (wchar_t)ch;
- continue;
- }
- else if (iskanji(ch)) {
- if (KANJI_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- firstbyte = False;
- length = CS1->length;
- if (*from_left < length || *to_left < length)
- return -1;
- wc_encode = CS1->wc_encoding;
- ch2 = *inbufptr;
- sjis_to_jis(&ch, &ch2);
- chrcode = ch;
- }
- else if (iskana(ch)) {
- if (KANA_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- length = CS2->length;
- wc_encode = CS2->wc_encoding;
- chrcode = BIT8OFF(ch);
- }
- else if (isuserdef(ch)) {
- if (USERDEF_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- firstbyte = False;
- length = CS3->length;
- if (*from_left < length || *to_left < length)
- return -1;
- wc_encode = CS3->wc_encoding;
- ch2 = *inbufptr;
- sjis_to_jis(&ch, &ch2);
- chrcode = ch;
- }
- else /* unknown */ {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- } else { /* 2nd byte of multibyte char */
- if (!VALID_MULTIBYTE((Uchar) *(inbufptr-1))) {
- unconv_num++;
- firstbyte = True;
- }
- chrcode = ch2;
- }
-
- if (new_char) {
- chr_len = length;
- shift_mult = length - 1;
- new_char = False;
- }
-
- chrcode <<= (wc_shift * shift_mult);
- shift_mult--;
- wc_tmp |= chrcode;
- if (--chr_len == 0) {
- wc_tmp |= wc_encode;
- *outbufptr++ = wc_tmp;
-
- firstbyte = True;
- new_char = True;
- wc_tmp = (Uint)0;
- }
-
- } /* end for */
-
- *to = (XPointer)outbufptr;
-
- if ((num_conv = outbufptr - outbuf_base) > 0)
- (*to_left) -= num_conv;
-
- return unconv_num;
-}
-
-
-#define byte1 (length == codeset->length - 1)
-#define byte2 (byte1 == 0)
-
-static int
-sjis_wcstombs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- const wchar_t *inbufptr = (const wchar_t *) *from;
- XPointer outbufptr = *to;
- XPointer outbuf_base = outbufptr;
- wchar_t wch;
- int length;
- Uchar tmp;
- Uchar t1, t2;
- int num_conv;
- int unconv_num = 0;
-
- XLCd lcd = (XLCd)conv->state;
- CodeSet codeset;
- Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (; *from_left > 0 ; (*from_left)-- ) {
-
- wch = *inbufptr++;
-
- if (!(codeset = wc_codeset(lcd, wch))) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
-
- length = codeset->length;
- wch ^= (wchar_t)codeset->wc_encoding;
-
- do {
- length--;
- tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
-
- if (kana)
- tmp = BIT8ON(tmp);
-
- else if (byte1 && (kanji || userdef)) {
- t1 = BIT8OFF(tmp);
- continue;
- }
-
- else if (byte2 && (kanji || userdef)) {
- t2 = BIT8OFF(tmp);
- jis_to_sjis(&t1, &t2);
- *outbufptr++ = (char)t1;
- tmp = t2;
- }
-
- *outbufptr++ = (char)tmp;
- } while (length);
-
- } /* end for */
-
- *to = (XPointer)outbufptr;
-
- if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
- (*to_left) -= num_conv;
-
- return unconv_num;
-}
-#undef byte1
-#undef byte2
-
-/*
- * sjis<->jis conversion for widechar kanji (See Note at top of file)
- */
-static void
-sjis_to_jis(
- Uchar *p1,
- Uchar *p2)
-{
- Uchar c1 = *p1;
- Uchar c2 = *p2;
- Uchar adjust = c2 < 0x9f;
- Uchar rowOffset = c1 < 0xa0 ? 0x70 : 0xb0;
- Uchar cellOffset = adjust ? (0x1f + (c2 > 0x7f)) : 0x7e;
-
- *p1 = ((c1 - rowOffset) << 1) - adjust;
- *p2 -= cellOffset;
-}
-
-static void
-jis_to_sjis(
- Uchar *p1,
- Uchar *p2)
-{
- Uchar c1 = *p1;
- Uchar c2 = *p2;
- Uchar rowOffset = c1 < 0x5f ? 0x70 : 0xb0;
- Uchar cellOffset = c1 % 2 ? 0x1f + (c2 > 0x5f) : 0x7e;
-
- *p1 = ((Uchar)(c1 + 1) >> 1) + rowOffset;
- *p2 = c2 + cellOffset;
-}
-
-static CodeSet
-wc_codeset(
- XLCd lcd,
- wchar_t wch)
-{
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
-#if !defined(__sony_news) || defined(SVR4)
- int end = XLC_GENERIC(lcd, codeset_num);
- Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
-
- for (; --end >= 0; codesets++)
- if ( widech == (*codesets)->wc_encoding )
- return *codesets;
-
- return NULL;
-#else
- if( iskanji(wch >> 8) )
- return( codesets[1] );
- if( iskana(wch & 0xff) )
- return( codesets[2] );
- return( codesets[0] );
-#endif
-}
-
-
-static int
-sjis_mbtocs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
- XlcCharSet charset = NULL;
- int char_size = 0;
- int unconv_num = 0;
- const char *src = *from;
- char *dst = *to;
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
- int codeset_num = XLC_GENERIC(lcd, codeset_num);
-
- if (iskanji(*src)) {
- if (KANJI_CODESET >= codeset_num)
- return -1;
- charset = *CS1->charset_list;
- char_size = charset->char_size;
-
- if (*from_left >= char_size && *to_left >= char_size) {
- *dst++ = *src++;
- *dst++ = *src++;
- if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
- unconv_num++;
- sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
- } else
- return -1;
- }
- else if (isuserdef(*src)) {
- if (USERDEF_CODESET >= codeset_num)
- return -1;
- charset = *CS3->charset_list;
- char_size = charset->char_size;
-
- if (*from_left >= char_size && *to_left >= char_size) {
- *dst++ = *src++;
- *dst++ = *src++;
- if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
- unconv_num++;
- sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
- } else
- return -1;
- }
- else if (isascii(*src)) {
- if (ASCII_CODESET >= codeset_num)
- return -1;
- charset = *CS0->charset_list;
- char_size = charset->char_size;
-
- if (*from_left >= char_size && *to_left >= char_size)
- *dst++ = *src++;
- else
- return -1;
- }
- else if (iskana(*src)) {
- if (KANA_CODESET >= codeset_num)
- return -1;
- charset = *CS2->charset_list;
- char_size = charset->char_size;
-
- if (*from_left >= char_size && *to_left >= char_size)
- *dst++ = *src++;
- else
- return -1;
- }
- else /* unknown */
- return -1;
-
- *from_left -= char_size;
- *to_left -= char_size;
-
- *to = (XPointer) dst;
- *from = (XPointer) src;
-
- if (num_args > 0)
- *((XlcCharSet *) args[0]) = charset;
-
- return unconv_num;
-}
-
-
-static int
-sjis_mbstocs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- const char *tmp_from;
- char *tmp_to;
- int tmp_from_left, tmp_to_left;
- XlcCharSet charset, tmp_charset;
- XPointer tmp_args[1];
- int unconv_num = 0, ret;
-
-/* Determine the charset of the segment and convert one character: */
-
- tmp_args[0] = (XPointer) &charset; /* charset from sjis_mbtocs() */
- while
- ((ret = sjis_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
- unconv_num += ret;
- if ( ret < 0 )
- return ret;
-
- tmp_from = *from;
- tmp_from_left = *from_left;
- tmp_to_left = *to_left;
- tmp_to = *to;
-
-/* Convert remainder of the segment: */
-
- tmp_args[0] = (XPointer) &tmp_charset;
- while( (ret = sjis_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
- (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
-
- if (ret > 0) {
- unconv_num += ret;
- continue;
- }
-
- if (tmp_charset != charset) /* quit on end of segment */
- break;
-
- *from = (XPointer) tmp_from;
- *from_left = tmp_from_left;
- *to = (XPointer) tmp_to;
- *to_left = tmp_to_left;
- }
-
- if (num_args > 0)
- *((XlcCharSet *) args[0]) = charset;
-
- return unconv_num;
-}
-
-static int
-sjis_wcstocs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd) conv->state;
- const wchar_t *wcptr = *((const wchar_t **)from);
- char *bufptr = *((char **) to);
- wchar_t wch;
- char *tmpptr;
- int length;
- CodeSet codeset;
- Ulong wc_encoding;
- int buf_len = *to_left;
- int wcstr_len = *from_left;
-
- if (!(codeset = wc_codeset(lcd, *wcptr)))
- return -1;
-
- if (wcstr_len < buf_len / codeset->length)
- buf_len = wcstr_len * codeset->length;
-
-#if !defined(__sony_news) || defined(SVR4)
- wc_encoding = codeset->wc_encoding;
-
- for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
- wch = *wcptr;
-
- if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
- break;
-
- length = codeset->length;
-
- buf_len -= length;
- bufptr += length;
- tmpptr = bufptr - 1;
-
- while (length--) {
- *tmpptr-- = kana ? BIT8ON(wch) : BIT8OFF(wch);
- wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
- }
- }
-#else
- length = codeset->length;
- for( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len-- ) {
- wch = *wcptr;
- if( codeset != wc_codeset( lcd, wch ) )
- break;
-
- buf_len -= length;
- if( length == 2 ) {
- unsigned short code;
-
- code = sjis2jis( wch & 0xffff );
- *bufptr++ = code >> 8;
- *bufptr++ = code & 0xff;
- }
- else
- *bufptr++ = wch & 0xff;
- }
-#endif
-
- if (num_args > 0)
- *((XlcCharSet *) args[0]) = *codeset->charset_list;
-
- *from_left -= wcptr - (wchar_t *) *from;
- *from = (XPointer) wcptr;
-
- *to_left -= bufptr - *to;
- *to = bufptr;
-
- return 0;
-}
-
-static CodeSet
-GetCodeSetFromCharSet(
- XLCd lcd,
- XlcCharSet charset)
-{
- CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
- XlcCharSet *charset_list;
- int codeset_num, num_charsets;
-
- codeset_num = XLC_GENERIC(lcd, codeset_num);
-
- for ( ; codeset_num-- > 0; codeset++) {
- num_charsets = (*codeset)->num_charsets;
- charset_list = (*codeset)->charset_list;
-
- for ( ; num_charsets-- > 0; charset_list++)
- if (*charset_list == charset)
- return *codeset;
- }
-
- return (CodeSet) NULL;
-}
-
-
-static int
-sjis_cstombs(
- XlcConv conv,
- char **from,
- int *from_left,
- char **to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd) conv->state;
- const char *csptr = *from;
- char *bufptr = *to;
- int csstr_len = *from_left;
- int buf_len = *to_left;
- int length;
- CodeSet codeset;
- int cvt_length = 0;
-
- if (num_args < 1)
- return -1;
-
- if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
- return -1;
-
- csstr_len /= codeset->length;
- buf_len /= codeset->length;
- if (csstr_len < buf_len)
- buf_len = csstr_len;
-
- cvt_length += buf_len * codeset->length;
-
- if (bufptr) {
- while (buf_len--) {
- length = codeset->length;
- while (length--)
- *bufptr++ = codeset->length == 1 && codeset->side == XlcGR ?
- BIT8ON(*csptr++) : BIT8OFF(*csptr++);
-
- if (codeset->length == 2)
- jis_to_sjis((Uchar *)(bufptr-2), (Uchar *)(bufptr-1));
- }
- }
-
- *from_left -= csptr - *from;
- *from = (XPointer) csptr;
-
- if (bufptr)
- *to += cvt_length;
- *to_left -= cvt_length;
-
-
- return 0;
-}
-
-static int
-sjis_cstowcs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd) conv->state;
- const char *csptr = (const char *) *from;
- wchar_t *bufptr = (wchar_t *) *to;
- wchar_t *toptr = (wchar_t *) *to;
- int csstr_len = *from_left;
- int buf_len = *to_left;
- wchar_t wch;
- int length;
- Ulong wc_shift_bits = (int)XLC_GENERIC(lcd, wc_shift_bits);
- CodeSet codeset;
-
- if (num_args < 1)
- return -1;
-
- if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
- return -1;
-
- csstr_len /= codeset->length;
- if (csstr_len < buf_len)
- buf_len = csstr_len;
-
- *to_left -= buf_len;
-
- if (bufptr) {
-
- toptr += buf_len;
- *to = (XPointer) toptr;
-
- while (buf_len--) {
- wch = (wchar_t) BIT8OFF(*csptr);
- csptr++;
-
- length = codeset->length - 1;
- while (length--) {
- wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
- csptr++;
- }
- *bufptr++ = wch | codeset->wc_encoding;
- }
- }
-
- *from_left -= csptr - *from;
- *from = (XPointer) csptr;
-
- return 0;
-}
-
-
-/*
- * Stripped down Direct CT converters for SJIS
- *
- */
-
-#define BADCHAR(min_ch, c) (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
- BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
- BIT8OFF(c) != 0x1b)
-
-typedef struct _CTDataRec {
- int side;
- int length;
- char *name;
- Ulong wc_encoding;
- char *ct_encoding;
- int ct_encoding_len;
- int set_size;
- Uchar min_ch;
- Uchar ct_type;
-} CTDataRec, *CTData;
-
-typedef struct _StateRec {
- CTData GL_charset;
- CTData GR_charset;
- CTData charset;
-} StateRec, *State;
-
-#define CT_STD 0
-#define CT_NSTD 1
-#define CT_DIR 2
-#define CT_EXT0 3
-#define CT_EXT1 4
-#define CT_EXT2 5
-#define CT_VER 6
-
-static CTDataRec ctdata[] =
-{
- { XlcGL, 1, "ISO8859-1:GL", 0, "\033(B" , 3, 0, 0, CT_STD },
- { XlcGR, 1, "ISO8859-1:GR", 0, "\033-A" , 3, 0, 0, CT_STD },
- { XlcGL, 1, "JISX0201.1976-0:GL", 0, "\033(J" , 3, 0, 0, CT_STD },
- { XlcGR, 1, "JISX0201.1976-0:GR", 0, "\033)I" , 3, 0, 0, CT_STD },
- { XlcGL, 2, "JISX0208.1983-0:GL", 0, "\033$(B" , 4, 0, 0, CT_STD },
- { XlcGR, 2, "JISX0208.1983-0:GR", 0, "\033$)B" , 4, 0, 0, CT_STD },
- { XlcGL, 2, "JISX0212.1990-0:GL", 0, "\033$(D" , 4, 0, 0, CT_STD },
- { XlcGR, 2, "JISX0212.1990-0:GR", 0, "\033$)D" , 4, 0, 0, CT_STD },
- { XlcUnknown, 0, "Ignore-Ext-Status?", 0, "\033#" , 2, 0, 0, CT_VER },
- { XlcUnknown, 0, "NonStd-?-OctetChar", 0, "\033%/0" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 1, "NonStd-1-OctetChar", 0, "\033%/1" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 2, "NonStd-2-OctetChar", 0, "\033%/2" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 3, "NonStd-3-OctetChar", 0, "\033%/3" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 4, "NonStd-4-OctetChar", 0, "\033%/4" , 4, 0, 0, CT_NSTD },
- { XlcUnknown, 0, "Extension-2" , 0, "\033%/" , 3, 0, 0, CT_EXT2 },
- { XlcUnknown, 0, "Extension-0" , 0, "\033" , 1, 0, 0, CT_EXT0 },
- { XlcUnknown, 0, "Begin-L-to-R-Text", 0, "\2331]" , 3, 0, 0, CT_DIR },
- { XlcUnknown, 0, "Begin-R-to-L-Text", 0, "\2332]" , 3, 0, 0, CT_DIR },
- { XlcUnknown, 0, "End-Of-String", 0, "\233]" , 2, 0, 0, CT_DIR },
- { XlcUnknown, 0, "Extension-1" , 0, "\233" , 1, 0, 0, CT_EXT1 },
-};
-
-/* Note on above table: sjis_ctstombs() and sjis_ctstowcs() parser depends on
- * certain table entries occuring in decreasing string length--
- * 1. CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
- * 2. CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
- */
-
-static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
-static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
-
-#define Ascii 0
-#define Kanji 1
-#define Kana 2
-#define Userdef 3
-
-/*
- * initCTptr(): Set ctptr[] to point at ctdata[], indexed by codeset_num.
- */
-static void
-initCTptr(
- XLCd lcd)
-{
- int num_codesets = XLC_GENERIC(lcd, codeset_num);
- int num_charsets;
- int i, j;
- CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
- CodeSet codeset;
- XlcCharSet charset;
- CTData ctdp = ctdata;
-
- ctdptr[Ascii] = &ctdata[0]; /* failsafe */
-
- for (i = 0; i < num_codesets; i++) {
-
- codeset = codesets[i];
- num_charsets = codeset->num_charsets;
-
- for (j = 0; j < num_charsets; j++) {
-
- charset = codeset->charset_list[j];
-
- for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
-
- if (! strcmp(ctdp->name, charset->name)) {
-
- ctdptr[codeset->cs_num] = ctdp;
-
- ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
-
- ctdptr[codeset->cs_num]->set_size =
- charset->set_size;
-
- ctdptr[codeset->cs_num]->min_ch =
- charset->set_size == 94 &&
- (ctdptr[codeset->cs_num]->length > 1 ||
- ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
-
- break;
- }
- }
- }
-}
-
-
-static int
-sjis_mbstocts(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- int ct_len = *to_left;
- int cs_num;
- int clen;
- int unconv_num = 0;
- int num_conv;
- const char *inbufptr = *from;
- char *ctptr = *to;
- XPointer ct_base = ctptr;
-
- StateRec ct_state;
- CTData charset = NULL;
- XLCd lcd = (XLCd) conv->state;
- int codeset_num = XLC_GENERIC(lcd, codeset_num);
-
-/* Initial State: */
-
- ct_state.GL_charset = ctdptr[Ascii];
- ct_state.GR_charset = NULL;
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (;*from_left > 0; (*from_left) -= charset->length) {
-
- if (iskanji(*inbufptr)) {
- if (KANJI_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Kanji;
- charset = ctdptr[Kanji];
- if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
- unconv_num++;
- }
- else if (isuserdef(*inbufptr)) {
- if (USERDEF_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Userdef;
- charset = ctdptr[Userdef];
- if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
- unconv_num++;
- }
- else if (isascii(*inbufptr)) {
- if (ASCII_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Ascii;
- charset = ctdptr[Ascii];
- }
- else if (iskana(*inbufptr)) {
- if (KANA_CODESET >= codeset_num) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
- cs_num = Kana;
- charset = ctdptr[Kana];
- }
- else { /* unknown */
- unconv_num++;
- (*from_left)--;
- continue;
- }
-
- if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
- (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
-
- ct_len -= ctdptr[cs_num]->ct_encoding_len;
- if (ct_len < 0) {
- unconv_num++;
- break;
- }
-
- if (ctptr) {
- strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
- ctptr += ctdptr[cs_num]->ct_encoding_len;
- }
- }
-
- clen = charset->length;
- do {
- *ctptr++ = *inbufptr++;
- } while (--clen);
-
- if (charset->length >= 2) {
- sjis_to_jis((Uchar *)(ctptr-2), (Uchar *)(ctptr-1));
- if (BADCHAR(charset->min_ch, *(ctptr-2)) ||
- BADCHAR(charset->min_ch, *(ctptr-1))) {
- unconv_num++;
- continue;
- }
- }
- else
- if (BADCHAR(charset->min_ch, *(ctptr-1))) {
- unconv_num++;
- continue;
- }
-
- if (charset->side == XlcGR)
- ct_state.GR_charset = charset;
- else if (charset->side == XlcGL)
- ct_state.GL_charset = charset;
-
- if (charset->side == XlcGR) {
- clen = charset->length;
- do {
- (*(Uchar *)(ctptr-clen)) = BIT8ON(*(Uchar *)(ctptr-clen));
- } while (--clen);
- }
- }
-
- *to = (XPointer)ctptr;
-
- if ((num_conv = (int)(ctptr - ct_base)) > 0)
- (*to_left) -= num_conv;
-
- return unconv_num;
-
-}
-
-
-#define byte1 (length == codeset->length - 1)
-#define byte2 (byte1 == 0)
-
-static int
-sjis_wcstocts(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- int ct_len = *to_left;
- const wchar_t *inbufptr = (const wchar_t *) *from;
- char *ctptr = *to;
- XPointer ct_base = ctptr;
- wchar_t wch;
- int length;
- Uchar tmp;
- Uchar t1 = 0;
- int num_conv;
-
- StateRec ct_state;
- XLCd lcd = (XLCd)conv->state;
- CTData charset;
- CodeSet codeset;
- int unconv_num = 0;
- Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
-
-/* Initial State: */
- ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
- ct_state.GR_charset = NULL;
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (; *from_left > 0 ; (*from_left)-- ) {
-
- wch = *inbufptr++;
-
- if (!(codeset = wc_codeset(lcd, wch))) {
- unconv_num++;
- (*from_left)--;
- continue;
- }
-
- charset = ctdptr[codeset->cs_num];
-
- length = codeset->length;
- wch ^= (wchar_t)codeset->wc_encoding;
-
- if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
- (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
-
- ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
- if (ct_len < 0) {
- unconv_num++;
- break;
- }
-
- if (ctptr) {
- strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
- ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
- }
-
- }
-
- if (charset->side == XlcGR)
- ct_state.GR_charset = charset;
- else if (charset->side == XlcGL)
- ct_state.GL_charset = charset;
-
- do {
- length--;
- tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
-
- if (kana) {
- if (BADCHAR(charset->min_ch, (char)tmp)) {
- unconv_num++;
- break;
- }
- *ctptr++ = (char)BIT8ON(tmp);
- }
-
- else if (byte1 && (kanji || userdef)) {
- t1 = tmp;
- }
-
- else if (byte2 && (kanji || userdef)) {
- if (BADCHAR(charset->min_ch, (char)t1) ||
- BADCHAR(charset->min_ch, (char)tmp)) {
- unconv_num++;
- break;
- }
-
- *ctptr++ = (char)BIT8OFF(t1);
- *ctptr++ = (char)BIT8OFF(tmp);
- }
-
- else {
- if (BADCHAR(charset->min_ch, (char)tmp)) {
- unconv_num++;
- break;
- }
- *ctptr++ = (char)tmp;
- }
- } while (length);
-
- } /* end for */
-
- *to = (XPointer)ctptr;
-
- if ((num_conv = (int)(ctptr - ct_base)) > 0)
- (*to_left) -= num_conv;
-
- return unconv_num;
-}
-#undef byte1
-#undef byte2
-
-#define SKIP_I(str) while (*(str) >= 0x20 && *(str) <= 0x2f) (str)++;
-#define SKIP_P(str) while (*(str) >= 0x30 && *(str) <= 0x3f) (str)++;
-
-static int
-sjis_ctstombs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- const char *inbufptr = *from;
- XPointer outbufptr = *to;
- const char *inbuf_base;
- XPointer outbuf_base = outbufptr;
- int clen, length;
- int unconv_num = 0;
- int num_conv;
- unsigned int ct_seglen = 0;
- Uchar ct_type;
- CTData ctdp = ctdata; /* default */
- CTData GL_ctdp = ctdp; /* GL ctdp save */
- CTData GR_ctdp = ctdp; /* GR ctdp save */
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (length = ctdata[Ascii].length; *from_left > 0 ; (*from_left) -= length)
- {
- ct_type = CT_STD;
- /* change GL/GR charset */
- if(ctdp->side == XlcGR && isleftside(*inbufptr)){
- /* select GL side */
- ctdp = GL_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
- /* select GR side */
- ctdp = GR_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }
- if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
-
- for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
-
- if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
- {
- inbufptr += ctdp->ct_encoding_len;
- (*from_left) -= ctdp->ct_encoding_len;
- if( ctdp->length ) {
- length = ctdp->length;
- if( *from_left < length ) {
- *to = (XPointer)outbufptr;
- *to_left -= outbufptr - outbuf_base;
- return( unconv_num + *from_left );
- }
- }
- ct_type = ctdp->ct_type;
- if(ctdp->side == XlcGL){
- GL_ctdp = ctdp; /* save GL ctdp */
- }else{
- GR_ctdp = ctdp; /* save GR ctdp */
- }
- break;
- }
- }
- if (ctdp > ctd_endp) /* failed to match CT sequence */
- unconv_num++;
- }
-
-/* The following code insures that non-standard encodings, direction, extension,
- * and version strings are ignored; subject to change in future.
- */
- switch (ct_type) {
- case CT_STD:
- break;
- case CT_EXT2:
- inbufptr++;
- (*from_left)--;
- case CT_NSTD:
- ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
- inbufptr += ct_seglen;
- (*from_left) -= ct_seglen;
- continue;
- case CT_EXT0:
- inbuf_base = inbufptr;
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- (*from_left) -= ct_seglen;
- continue;
- case CT_EXT1:
- inbuf_base = inbufptr;
- SKIP_P(inbufptr);
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- (*from_left) -= ct_seglen;
- continue;
- case CT_DIR:
- continue;
- case CT_VER:
- inbufptr += 2;
- (*from_left) -= 2;
- continue;
- }
-
- if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
- clen = length;
- } else {
- clen = 1;
- *from_left += length - clen;
- }
- do {
- Uchar mask = (length == 2) ? GL : -1;
- *outbufptr++ = *inbufptr++ & mask;
- } while (--clen);
-
- if (length >= 2)
- jis_to_sjis((Uchar *)(outbufptr-2), (Uchar *)(outbufptr-1));
- }
-
- *to = (XPointer)outbufptr;
-
- if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
- (*to_left) -= num_conv;
-
- return unconv_num;
-}
-
-
-static int
-sjis_ctstowcs(
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XLCd lcd = (XLCd)conv->state;
- Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
- const char *inbufptr = *from;
- const char *inbuf_base;
- wchar_t *outbufptr = (wchar_t *) *to;
- wchar_t *outbuf_base = outbufptr;
- int clen, length;
- int num_conv;
- int unconv_num = 0;
- unsigned int ct_seglen = 0;
- Uchar ct_type = 0;
- int shift_mult;
- wchar_t wc_tmp;
- wchar_t wch;
- Ulong wc_encoding;
- CTData ctdp = ctdata;
- CTData GL_ctdp = ctdp; /* GL ctdp save */
- CTData GR_ctdp = ctdp; /* GR ctdp save */
-
- if (*from_left > *to_left)
- *from_left = *to_left;
-
- for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length )
- {
- ct_type = CT_STD;
- /* change GL/GR charset */
- if(ctdp->side == XlcGR && isleftside(*inbufptr)){
- /* select GL side */
- ctdp = GL_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
- /* select GR side */
- ctdp = GR_ctdp;
- length = ctdp->length;
- ct_type = ctdp->ct_type;
- }
- if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
- for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
-
- if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
- {
- inbufptr += ctdp->ct_encoding_len;
- (*from_left) -= ctdp->ct_encoding_len;
- if( ctdp->length ) {
- length = ctdp->length;
- if( *from_left < length ) {
- *to = (XPointer)outbufptr;
- *to_left -= outbufptr - outbuf_base;
- return( unconv_num + *from_left );
- }
- }
- ct_type = ctdp->ct_type;
- if(ctdp->side == XlcGL){
- GL_ctdp = ctdp; /* save GL ctdp */
- }else{
- GR_ctdp = ctdp; /* save GR ctdp */
- }
- break;
- }
- }
- if (ctdp > ctd_endp) /* failed to match CT sequence */
- unconv_num++;
- }
-
-/* The following block of code insures that non-standard encodings, direction,
- * extension, and version strings are ignored; subject to change in future.
- */
- switch (ct_type) {
- case CT_STD:
- break;
- case CT_EXT2:
- inbufptr++;
- (*from_left)--;
- case CT_NSTD:
- ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
- inbufptr += ct_seglen;
- (*from_left) -= ct_seglen;
- continue;
- case CT_EXT0:
- inbuf_base = inbufptr;
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- (*from_left) -= ct_seglen;
- continue;
- case CT_EXT1:
- inbuf_base = inbufptr;
- SKIP_P(inbufptr);
- SKIP_I(inbufptr);
- inbufptr++;
- ct_seglen = (unsigned)(inbufptr - inbuf_base);
- (*from_left) -= ct_seglen;
- continue;
- case CT_DIR:
- continue;
- case CT_VER:
- inbufptr += 2;
- (*from_left) -= 2;
- continue;
- }
-#if !defined(__sony_news) || defined(SVR4)
- if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
- clen = length;
- wc_encoding = ctdp->wc_encoding;
- } else {
- clen = 1;
- *from_left += length - clen;
- wc_encoding = ctdptr[Ascii]->wc_encoding;
- }
- shift_mult = clen - 1;
- wch = (wchar_t)0;
-
- do {
- wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
- wch |= wc_tmp;
- shift_mult--;
- } while (--clen);
- *outbufptr++ = wch | wc_encoding;
-#else
- if( length == 1 )
- *outbufptr++ = (unsigned char)*inbufptr++;
- else if( length == 2 ) {
- unsigned short code;
- code = (*inbufptr << 8) | *(inbufptr+1);
- *outbufptr++ = jis2sjis( code );
- inbufptr += 2;
- }
-#endif
- }
- *to = (XPointer)outbufptr;
-
- if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
- (*to_left) -= num_conv ;
-
- return unconv_num;
-
-}
-#undef BADCHAR
-
-static void
-close_converter(
- XlcConv conv)
-{
- Xfree((char *) conv);
-}
-
-
-static XlcConv
-create_conv(
- XLCd lcd,
- XlcConvMethods methods)
-{
- XlcConv conv;
-
- conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
- if (conv == NULL)
- return (XlcConv) NULL;
-
- conv->methods = methods;
- conv->state = (XPointer) lcd;
- return conv;
-}
-
-
-enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
- WCSTOCTS, MBSTOCTS, CTSTOMBS, CTSTOWCS };
-
-static XlcConvMethodsRec conv_methods[] = {
- {close_converter, sjis_mbstocs, NULL },
- {close_converter, sjis_wcstocs, NULL },
- {close_converter, sjis_mbtocs, NULL },
- {close_converter, sjis_cstombs, NULL },
- {close_converter, sjis_cstowcs, NULL },
- {close_converter, sjis_mbstowcs, NULL },
- {close_converter, sjis_wcstombs, NULL },
- {close_converter, sjis_wcstocts, NULL },
- {close_converter, sjis_mbstocts, NULL },
- {close_converter, sjis_ctstombs, NULL },
- {close_converter, sjis_ctstowcs, NULL },
-};
-
-
-static XlcConv
-open_mbstocs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBSTOCS]);
-}
-
-static XlcConv
-open_wcstocs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[WCSTOCS]);
-}
-
-static XlcConv
-open_mbtocs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBTOCS]);
-}
-
-static XlcConv
-open_cstombs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CSTOMBS]);
-}
-
-static XlcConv
-open_cstowcs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CSTOWCS]);
-}
-
-static XlcConv
-open_mbstowcs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
-}
-
-static XlcConv
-open_wcstombs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
-}
-
-static XlcConv
-open_wcstocts(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
-}
-
-static XlcConv
-open_mbstocts(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
-}
-
-static XlcConv
-open_ctstombs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
-}
-
-static XlcConv
-open_ctstowcs(
- XLCd from_lcd,
- const char *from_type,
- XLCd to_lcd,
- const char *to_type)
-{
- return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
-}
-
-XLCd
-_XlcSjisLoader(
- const char *name)
-{
- XLCd lcd;
-
- lcd = _XlcCreateLC(name, _XlcGenericMethods);
- if (lcd == NULL)
- return lcd;
-
- if (!XLC_PUBLIC_PART(lcd)->codeset ||
- (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "SJIS"))) {
- _XlcDestroyLC(lcd);
- return (XLCd) NULL;
- }
-
- initCTptr(lcd);
-
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
- _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
- _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
-
-#ifndef FORCE_INDIRECT_CONVERTER
- _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
- _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
- _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
-#endif
-
- _XlcAddUtf8Converters(lcd);
-
- return lcd;
-}
-
-#else
-typedef int dummy;
-#endif /* X_LOCALE */
+/****************************************************************
+
+ Copyright 1992, 1993 by FUJITSU LIMITED
+ Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+ Copyright 1994 by Sony Corporation
+
+Permission to use, copy, modify, distribute and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear
+in supporting documentation, and that the name of FUJITSU LIMITED,
+Fujitsu Open Systems Solutions, Inc. and Sony Corporation not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+FUJITSU LIMITED, Fujitsu Open Systems Solutions, Inc. and
+Sony Corporation make no representations about the suitability of
+this software for any purpose. It is provided "as is" without
+express or implied warranty.
+
+FUJITSU LIMITED, FUJITSU OPEN SYSTEMS SOLUTIONS, INC. AND SONY
+CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL FUJITSU OPEN SYSTEMS SOLUTIONS, INC., FUJITSU LIMITED
+AND SONY CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THIS SOFTWARE.
+
+ Authors: Jeffrey Bloomfield (jeffb@ossi.com)
+ Shigeru Yamada (yamada@ossi.com)
+ Yoshiyuki Segawa (segawa@ossi.com)
+ Modifier:Makoto Wakamatsu Sony Corporation
+ makoto@sm.sony.co.jp
+
+*****************************************************************/
+
+/*
+ * A Japanese SJIS locale.
+ * Supports: all locales with codeset SJIS.
+ * How: Provides converters for SJIS.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+#include <ctype.h>
+#ifdef WIN32
+#define isascii __isascii
+#endif
+
+#define CS0 codesets[0] /* Codeset 0 - 7-bit ASCII */
+#define CS1 codesets[1] /* Codeset 1 - Kanji */
+#define CS2 codesets[2] /* Codeset 2 - Half-Kana */
+#define CS3 codesets[3] /* Codeset 3 - User defined */
+
+#define ascii (codeset->cs_num == 0)
+#define kanji (codeset->cs_num == 1)
+#define kana (codeset->cs_num == 2)
+#define userdef (codeset->cs_num == 3)
+
+#define ASCII_CODESET 0
+#define KANJI_CODESET 1
+#define KANA_CODESET 2
+#define USERDEF_CODESET 3
+#define MAX_CODESETS 4
+
+#define GR 0x80 /* begins right-side (non-ascii) region */
+#define GL 0x7f /* ends left-side (ascii) region */
+
+#define isleftside(c) (((c) & GR) ? 0 : 1)
+#define isrightside(c) (!isleftside(c))
+
+typedef unsigned char Uchar;
+typedef unsigned long Ulong;
+typedef unsigned int Uint;
+
+/* Acceptable range for 2nd byte of SJIS multibyte char */
+#define VALID_MULTIBYTE(c) \
+ ((0x40<=((Uchar)c) && ((Uchar)c)<=0x7e) \
+ || (0x80<=((Uchar)c) && ((Uchar)c)<=0xfc))
+
+#ifndef iskanji
+#define iskanji(c) ((0x81<=((Uchar)c) && ((Uchar)c)<=0x9f) \
+ || (0xe0<=((Uchar)c) && ((Uchar)c)<=0xef))
+#endif /* !iskanji */
+
+#ifndef iskana
+#define iskana(c) (0xa1<=((Uchar)c) && ((Uchar)c)<=0xdf)
+#endif /* !iskana */
+
+#define isuserdef(c) (0xf0<=((Uchar)c) && ((Uchar)c)<=0xfc)
+
+#define BIT8OFF(c) ((c) & GL)
+#define BIT8ON(c) ((c) | GR)
+
+
+static void jis_to_sjis (Uchar *p1, Uchar *p2);
+static void sjis_to_jis (Uchar *p1, Uchar *p2);
+static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
+
+
+/*
+ * Notes:
+ * 1. 16-bit widechar format is limited to 14 data bits. Since the 2nd byte
+ * of SJIS multibyte chars are in the ranges of 0x40 - 7E and 0x80 - 0xFC,
+ * SJIS cannot map directly into 16 bit widechar format within the confines
+ * of a single codeset. Therefore, for SJIS widechar conversion, SJIS Kanji
+ * is mapped into the JIS codeset. (The algorithms used in jis_to_sjis()
+ * and sjis_to_jis() are from Ken Lunde (lunde@mv.us.adobe.com) and are in
+ * the public domain.)
+ * 2. Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
+ * forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
+ * 3. Using direct converters (e.g. mbstowcs()) decreases conversion
+ * times by 20-40% (depends on specific converter used).
+ */
+
+
+static int
+sjis_mbstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+
+ XLCd lcd = (XLCd)conv->state;
+
+ int chr_len = 0;
+ int shift_mult = 0;
+ Uint chrcode = 0;
+
+ Uchar ch, ch2;
+ Uint wc_encode = 0;
+ Uint wc_tmp = 0;
+
+ Bool new_char;
+
+ int firstbyte;
+ int length = 0;
+ int num_conv;
+ int unconv_num = 0;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ wchar_t *outbuf_base = outbufptr;
+
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (new_char = True, firstbyte = True; *from_left > 0; (*from_left)--) {
+
+ ch = *inbufptr++;
+
+ if (firstbyte) {
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ if (isascii(ch)) {
+ length = CS0->length;
+ *outbufptr++ = (wchar_t)ch;
+ continue;
+ }
+ else if (iskanji(ch)) {
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ firstbyte = False;
+ length = CS1->length;
+ if (*from_left < length || *to_left < length)
+ return -1;
+ wc_encode = CS1->wc_encoding;
+ ch2 = *inbufptr;
+ sjis_to_jis(&ch, &ch2);
+ chrcode = ch;
+ }
+ else if (iskana(ch)) {
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ length = CS2->length;
+ wc_encode = CS2->wc_encoding;
+ chrcode = BIT8OFF(ch);
+ }
+ else if (isuserdef(ch)) {
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ firstbyte = False;
+ length = CS3->length;
+ if (*from_left < length || *to_left < length)
+ return -1;
+ wc_encode = CS3->wc_encoding;
+ ch2 = *inbufptr;
+ sjis_to_jis(&ch, &ch2);
+ chrcode = ch;
+ }
+ else /* unknown */ {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ } else { /* 2nd byte of multibyte char */
+ if (!VALID_MULTIBYTE((Uchar) *(inbufptr-1))) {
+ unconv_num++;
+ firstbyte = True;
+ }
+ chrcode = ch2;
+ }
+
+ if (new_char) {
+ chr_len = length;
+ shift_mult = length - 1;
+ new_char = False;
+ }
+
+ chrcode <<= (wc_shift * shift_mult);
+ shift_mult--;
+ wc_tmp |= chrcode;
+ if (--chr_len == 0) {
+ wc_tmp |= wc_encode;
+ *outbufptr++ = wc_tmp;
+
+ firstbyte = True;
+ new_char = True;
+ wc_tmp = (Uint)0;
+ }
+
+ } /* end for */
+
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = outbufptr - outbuf_base) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+
+
+#define byte1 (length == codeset->length - 1)
+#define byte2 (byte1 == 0)
+
+static int
+sjis_wcstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ XPointer outbufptr = *to;
+ XPointer outbuf_base = outbufptr;
+ wchar_t wch;
+ int length;
+ Uchar tmp;
+ Uchar t1, t2;
+ int num_conv;
+ int unconv_num = 0;
+
+ XLCd lcd = (XLCd)conv->state;
+ CodeSet codeset;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (; *from_left > 0 ; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ do {
+ length--;
+ tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+ if (kana)
+ tmp = BIT8ON(tmp);
+
+ else if (byte1 && (kanji || userdef)) {
+ t1 = BIT8OFF(tmp);
+ continue;
+ }
+
+ else if (byte2 && (kanji || userdef)) {
+ t2 = BIT8OFF(tmp);
+ jis_to_sjis(&t1, &t2);
+ *outbufptr++ = (char)t1;
+ tmp = t2;
+ }
+
+ *outbufptr++ = (char)tmp;
+ } while (length);
+
+ } /* end for */
+
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+#undef byte1
+#undef byte2
+
+/*
+ * sjis<->jis conversion for widechar kanji (See Note at top of file)
+ */
+static void
+sjis_to_jis(
+ Uchar *p1,
+ Uchar *p2)
+{
+ Uchar c1 = *p1;
+ Uchar c2 = *p2;
+ Uchar adjust = c2 < 0x9f;
+ Uchar rowOffset = c1 < 0xa0 ? 0x70 : 0xb0;
+ Uchar cellOffset = adjust ? (0x1f + (c2 > 0x7f)) : 0x7e;
+
+ *p1 = ((c1 - rowOffset) << 1) - adjust;
+ *p2 -= cellOffset;
+}
+
+static void
+jis_to_sjis(
+ Uchar *p1,
+ Uchar *p2)
+{
+ Uchar c1 = *p1;
+ Uchar c2 = *p2;
+ Uchar rowOffset = c1 < 0x5f ? 0x70 : 0xb0;
+ Uchar cellOffset = c1 % 2 ? 0x1f + (c2 > 0x5f) : 0x7e;
+
+ *p1 = ((Uchar)(c1 + 1) >> 1) + rowOffset;
+ *p2 = c2 + cellOffset;
+}
+
+static CodeSet
+wc_codeset(
+ XLCd lcd,
+ wchar_t wch)
+{
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+#if !defined(__sony_news) || defined(SVR4)
+ int end = XLC_GENERIC(lcd, codeset_num);
+ Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
+
+ for (; --end >= 0; codesets++)
+ if ( widech == (*codesets)->wc_encoding )
+ return *codesets;
+
+ return NULL;
+#else
+ if( iskanji(wch >> 8) )
+ return( codesets[1] );
+ if( iskana(wch & 0xff) )
+ return( codesets[2] );
+ return( codesets[0] );
+#endif
+}
+
+
+static int
+sjis_mbtocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ XlcCharSet charset = NULL;
+ int char_size = 0;
+ int unconv_num = 0;
+ const char *src = *from;
+ char *dst = *to;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ if (iskanji(*src)) {
+ if (KANJI_CODESET >= codeset_num)
+ return -1;
+ charset = *CS1->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size) {
+ *dst++ = *src++;
+ *dst++ = *src++;
+ if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
+ unconv_num++;
+ sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
+ } else
+ return -1;
+ }
+ else if (isuserdef(*src)) {
+ if (USERDEF_CODESET >= codeset_num)
+ return -1;
+ charset = *CS3->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size) {
+ *dst++ = *src++;
+ *dst++ = *src++;
+ if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
+ unconv_num++;
+ sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
+ } else
+ return -1;
+ }
+ else if (isascii(*src)) {
+ if (ASCII_CODESET >= codeset_num)
+ return -1;
+ charset = *CS0->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size)
+ *dst++ = *src++;
+ else
+ return -1;
+ }
+ else if (iskana(*src)) {
+ if (KANA_CODESET >= codeset_num)
+ return -1;
+ charset = *CS2->charset_list;
+ char_size = charset->char_size;
+
+ if (*from_left >= char_size && *to_left >= char_size)
+ *dst++ = *src++;
+ else
+ return -1;
+ }
+ else /* unknown */
+ return -1;
+
+ *from_left -= char_size;
+ *to_left -= char_size;
+
+ *to = (XPointer) dst;
+ *from = (XPointer) src;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+
+static int
+sjis_mbstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *tmp_from;
+ char *tmp_to;
+ int tmp_from_left, tmp_to_left;
+ XlcCharSet charset, tmp_charset;
+ XPointer tmp_args[1];
+ int unconv_num = 0, ret;
+
+/* Determine the charset of the segment and convert one character: */
+
+ tmp_args[0] = (XPointer) &charset; /* charset from sjis_mbtocs() */
+ while
+ ((ret = sjis_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
+ unconv_num += ret;
+ if ( ret < 0 )
+ return ret;
+
+ tmp_from = *from;
+ tmp_from_left = *from_left;
+ tmp_to_left = *to_left;
+ tmp_to = *to;
+
+/* Convert remainder of the segment: */
+
+ tmp_args[0] = (XPointer) &tmp_charset;
+ while( (ret = sjis_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
+ (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
+
+ if (ret > 0) {
+ unconv_num += ret;
+ continue;
+ }
+
+ if (tmp_charset != charset) /* quit on end of segment */
+ break;
+
+ *from = (XPointer) tmp_from;
+ *from_left = tmp_from_left;
+ *to = (XPointer) tmp_to;
+ *to_left = tmp_to_left;
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+static int
+sjis_wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd) conv->state;
+ const wchar_t *wcptr = *((const wchar_t **)from);
+ char *bufptr = *((char **) to);
+ wchar_t wch;
+ char *tmpptr;
+ int length;
+ CodeSet codeset;
+ Ulong wc_encoding;
+ int buf_len = *to_left;
+ int wcstr_len = *from_left;
+
+ if (!(codeset = wc_codeset(lcd, *wcptr)))
+ return -1;
+
+ if (wcstr_len < buf_len / codeset->length)
+ buf_len = wcstr_len * codeset->length;
+
+#if !defined(__sony_news) || defined(SVR4)
+ wc_encoding = codeset->wc_encoding;
+
+ for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+ wch = *wcptr;
+
+ if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+ break;
+
+ length = codeset->length;
+
+ buf_len -= length;
+ bufptr += length;
+ tmpptr = bufptr - 1;
+
+ while (length--) {
+ *tmpptr-- = kana ? BIT8ON(wch) : BIT8OFF(wch);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ }
+#else
+ length = codeset->length;
+ for( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len-- ) {
+ wch = *wcptr;
+ if( codeset != wc_codeset( lcd, wch ) )
+ break;
+
+ buf_len -= length;
+ if( length == 2 ) {
+ unsigned short code;
+
+ code = sjis2jis( wch & 0xffff );
+ *bufptr++ = code >> 8;
+ *bufptr++ = code & 0xff;
+ }
+ else
+ *bufptr++ = wch & 0xff;
+ }
+#endif
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+ *from_left -= wcptr - (wchar_t *) *from;
+ *from = (XPointer) wcptr;
+
+ *to_left -= bufptr - *to;
+ *to = bufptr;
+
+ return 0;
+}
+
+static CodeSet
+GetCodeSetFromCharSet(
+ XLCd lcd,
+ XlcCharSet charset)
+{
+ CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+ XlcCharSet *charset_list;
+ int codeset_num, num_charsets;
+
+ codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ for ( ; codeset_num-- > 0; codeset++) {
+ num_charsets = (*codeset)->num_charsets;
+ charset_list = (*codeset)->charset_list;
+
+ for ( ; num_charsets-- > 0; charset_list++)
+ if (*charset_list == charset)
+ return *codeset;
+ }
+
+ return (CodeSet) NULL;
+}
+
+
+static int
+sjis_cstombs(
+ XlcConv conv,
+ char **from,
+ int *from_left,
+ char **to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd) conv->state;
+ const char *csptr = *from;
+ char *bufptr = *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ int length;
+ CodeSet codeset;
+ int cvt_length = 0;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ csstr_len /= codeset->length;
+ buf_len /= codeset->length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ cvt_length += buf_len * codeset->length;
+
+ if (bufptr) {
+ while (buf_len--) {
+ length = codeset->length;
+ while (length--)
+ *bufptr++ = codeset->length == 1 && codeset->side == XlcGR ?
+ BIT8ON(*csptr++) : BIT8OFF(*csptr++);
+
+ if (codeset->length == 2)
+ jis_to_sjis((Uchar *)(bufptr-2), (Uchar *)(bufptr-1));
+ }
+ }
+
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+
+ if (bufptr)
+ *to += cvt_length;
+ *to_left -= cvt_length;
+
+
+ return 0;
+}
+
+static int
+sjis_cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd) conv->state;
+ const char *csptr = (const char *) *from;
+ wchar_t *bufptr = (wchar_t *) *to;
+ wchar_t *toptr = (wchar_t *) *to;
+ int csstr_len = *from_left;
+ int buf_len = *to_left;
+ wchar_t wch;
+ int length;
+ Ulong wc_shift_bits = (int)XLC_GENERIC(lcd, wc_shift_bits);
+ CodeSet codeset;
+
+ if (num_args < 1)
+ return -1;
+
+ if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+ return -1;
+
+ csstr_len /= codeset->length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ *to_left -= buf_len;
+
+ if (bufptr) {
+
+ toptr += buf_len;
+ *to = (XPointer) toptr;
+
+ while (buf_len--) {
+ wch = (wchar_t) BIT8OFF(*csptr);
+ csptr++;
+
+ length = codeset->length - 1;
+ while (length--) {
+ wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
+ csptr++;
+ }
+ *bufptr++ = wch | codeset->wc_encoding;
+ }
+ }
+
+ *from_left -= csptr - *from;
+ *from = (XPointer) csptr;
+
+ return 0;
+}
+
+
+/*
+ * Stripped down Direct CT converters for SJIS
+ *
+ */
+
+#define BADCHAR(min_ch, c) (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
+ BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
+ BIT8OFF(c) != 0x1b)
+
+typedef struct _CTDataRec {
+ int side;
+ int length;
+ char *name;
+ Ulong wc_encoding;
+ char *ct_encoding;
+ int ct_encoding_len;
+ int set_size;
+ Uchar min_ch;
+ Uchar ct_type;
+} CTDataRec, *CTData;
+
+typedef struct _StateRec {
+ CTData GL_charset;
+ CTData GR_charset;
+ CTData charset;
+} StateRec, *State;
+
+#define CT_STD 0
+#define CT_NSTD 1
+#define CT_DIR 2
+#define CT_EXT0 3
+#define CT_EXT1 4
+#define CT_EXT2 5
+#define CT_VER 6
+
+static CTDataRec ctdata[] =
+{
+ { XlcGL, 1, "ISO8859-1:GL", 0, "\033(B" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "ISO8859-1:GR", 0, "\033-A" , 3, 0, 0, CT_STD },
+ { XlcGL, 1, "JISX0201.1976-0:GL", 0, "\033(J" , 3, 0, 0, CT_STD },
+ { XlcGR, 1, "JISX0201.1976-0:GR", 0, "\033)I" , 3, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0208.1983-0:GL", 0, "\033$(B" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0208.1983-0:GR", 0, "\033$)B" , 4, 0, 0, CT_STD },
+ { XlcGL, 2, "JISX0212.1990-0:GL", 0, "\033$(D" , 4, 0, 0, CT_STD },
+ { XlcGR, 2, "JISX0212.1990-0:GR", 0, "\033$)D" , 4, 0, 0, CT_STD },
+ { XlcUnknown, 0, "Ignore-Ext-Status?", 0, "\033#" , 2, 0, 0, CT_VER },
+ { XlcUnknown, 0, "NonStd-?-OctetChar", 0, "\033%/0" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 1, "NonStd-1-OctetChar", 0, "\033%/1" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 2, "NonStd-2-OctetChar", 0, "\033%/2" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 3, "NonStd-3-OctetChar", 0, "\033%/3" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 4, "NonStd-4-OctetChar", 0, "\033%/4" , 4, 0, 0, CT_NSTD },
+ { XlcUnknown, 0, "Extension-2" , 0, "\033%/" , 3, 0, 0, CT_EXT2 },
+ { XlcUnknown, 0, "Extension-0" , 0, "\033" , 1, 0, 0, CT_EXT0 },
+ { XlcUnknown, 0, "Begin-L-to-R-Text", 0, "\2331]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Begin-R-to-L-Text", 0, "\2332]" , 3, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "End-Of-String", 0, "\233]" , 2, 0, 0, CT_DIR },
+ { XlcUnknown, 0, "Extension-1" , 0, "\233" , 1, 0, 0, CT_EXT1 },
+};
+
+/* Note on above table: sjis_ctstombs() and sjis_ctstowcs() parser depends on
+ * certain table entries occuring in decreasing string length--
+ * 1. CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
+ * 2. CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
+ */
+
+static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
+static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
+
+#define Ascii 0
+#define Kanji 1
+#define Kana 2
+#define Userdef 3
+
+/*
+ * initCTptr(): Set ctptr[] to point at ctdata[], indexed by codeset_num.
+ */
+static void
+initCTptr(
+ XLCd lcd)
+{
+ int num_codesets = XLC_GENERIC(lcd, codeset_num);
+ int num_charsets;
+ int i, j;
+ CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+ CodeSet codeset;
+ XlcCharSet charset;
+ CTData ctdp = ctdata;
+
+ ctdptr[Ascii] = &ctdata[0]; /* failsafe */
+
+ for (i = 0; i < num_codesets; i++) {
+
+ codeset = codesets[i];
+ num_charsets = codeset->num_charsets;
+
+ for (j = 0; j < num_charsets; j++) {
+
+ charset = codeset->charset_list[j];
+
+ for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
+
+ if (! strcmp(ctdp->name, charset->name)) {
+
+ ctdptr[codeset->cs_num] = ctdp;
+
+ ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
+
+ ctdptr[codeset->cs_num]->set_size =
+ charset->set_size;
+
+ ctdptr[codeset->cs_num]->min_ch =
+ charset->set_size == 94 &&
+ (ctdptr[codeset->cs_num]->length > 1 ||
+ ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
+
+ break;
+ }
+ }
+ }
+}
+
+
+static int
+sjis_mbstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ int cs_num;
+ int clen;
+ int unconv_num = 0;
+ int num_conv;
+ const char *inbufptr = *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+
+ StateRec ct_state;
+ CTData charset = NULL;
+ XLCd lcd = (XLCd) conv->state;
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+/* Initial State: */
+
+ ct_state.GL_charset = ctdptr[Ascii];
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (;*from_left > 0; (*from_left) -= charset->length) {
+
+ if (iskanji(*inbufptr)) {
+ if (KANJI_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kanji;
+ charset = ctdptr[Kanji];
+ if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
+ unconv_num++;
+ }
+ else if (isuserdef(*inbufptr)) {
+ if (USERDEF_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Userdef;
+ charset = ctdptr[Userdef];
+ if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
+ unconv_num++;
+ }
+ else if (isascii(*inbufptr)) {
+ if (ASCII_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Ascii;
+ charset = ctdptr[Ascii];
+ }
+ else if (iskana(*inbufptr)) {
+ if (KANA_CODESET >= codeset_num) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+ cs_num = Kana;
+ charset = ctdptr[Kana];
+ }
+ else { /* unknown */
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[cs_num]->ct_encoding_len;
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
+ ctptr += ctdptr[cs_num]->ct_encoding_len;
+ }
+ }
+
+ clen = charset->length;
+ do {
+ *ctptr++ = *inbufptr++;
+ } while (--clen);
+
+ if (charset->length >= 2) {
+ sjis_to_jis((Uchar *)(ctptr-2), (Uchar *)(ctptr-1));
+ if (BADCHAR(charset->min_ch, *(ctptr-2)) ||
+ BADCHAR(charset->min_ch, *(ctptr-1))) {
+ unconv_num++;
+ continue;
+ }
+ }
+ else
+ if (BADCHAR(charset->min_ch, *(ctptr-1))) {
+ unconv_num++;
+ continue;
+ }
+
+ if (charset->side == XlcGR)
+ ct_state.GR_charset = charset;
+ else if (charset->side == XlcGL)
+ ct_state.GL_charset = charset;
+
+ if (charset->side == XlcGR) {
+ clen = charset->length;
+ do {
+ (*(Uchar *)(ctptr-clen)) = BIT8ON(*(Uchar *)(ctptr-clen));
+ } while (--clen);
+ }
+ }
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+
+}
+
+
+#define byte1 (length == codeset->length - 1)
+#define byte2 (byte1 == 0)
+
+static int
+sjis_wcstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ct_len = *to_left;
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *ctptr = *to;
+ XPointer ct_base = ctptr;
+ wchar_t wch;
+ int length;
+ Uchar tmp;
+ Uchar t1 = 0;
+ int num_conv;
+
+ StateRec ct_state;
+ XLCd lcd = (XLCd)conv->state;
+ CTData charset;
+ CodeSet codeset;
+ int unconv_num = 0;
+ Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+/* Initial State: */
+ ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
+ ct_state.GR_charset = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (; *from_left > 0 ; (*from_left)-- ) {
+
+ wch = *inbufptr++;
+
+ if (!(codeset = wc_codeset(lcd, wch))) {
+ unconv_num++;
+ (*from_left)--;
+ continue;
+ }
+
+ charset = ctdptr[codeset->cs_num];
+
+ length = codeset->length;
+ wch ^= (wchar_t)codeset->wc_encoding;
+
+ if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+ (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+ ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
+ if (ct_len < 0) {
+ unconv_num++;
+ break;
+ }
+
+ if (ctptr) {
+ strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
+ ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
+ }
+
+ }
+
+ if (charset->side == XlcGR)
+ ct_state.GR_charset = charset;
+ else if (charset->side == XlcGL)
+ ct_state.GL_charset = charset;
+
+ do {
+ length--;
+ tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+ if (kana) {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)BIT8ON(tmp);
+ }
+
+ else if (byte1 && (kanji || userdef)) {
+ t1 = tmp;
+ }
+
+ else if (byte2 && (kanji || userdef)) {
+ if (BADCHAR(charset->min_ch, (char)t1) ||
+ BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+
+ *ctptr++ = (char)BIT8OFF(t1);
+ *ctptr++ = (char)BIT8OFF(tmp);
+ }
+
+ else {
+ if (BADCHAR(charset->min_ch, (char)tmp)) {
+ unconv_num++;
+ break;
+ }
+ *ctptr++ = (char)tmp;
+ }
+ } while (length);
+
+ } /* end for */
+
+ *to = (XPointer)ctptr;
+
+ if ((num_conv = (int)(ctptr - ct_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+#undef byte1
+#undef byte2
+
+#define SKIP_I(str) while (*(str) >= 0x20 && *(str) <= 0x2f) (str)++;
+#define SKIP_P(str) while (*(str) >= 0x30 && *(str) <= 0x3f) (str)++;
+
+static int
+sjis_ctstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *inbufptr = *from;
+ XPointer outbufptr = *to;
+ const char *inbuf_base;
+ XPointer outbuf_base = outbufptr;
+ int clen, length;
+ int unconv_num = 0;
+ int num_conv;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type;
+ CTData ctdp = ctdata; /* default */
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (length = ctdata[Ascii].length; *from_left > 0 ; (*from_left) -= length)
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if( ctdp->length ) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ (*from_left) -= 2;
+ continue;
+ }
+
+ if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
+ clen = length;
+ } else {
+ clen = 1;
+ *from_left += length - clen;
+ }
+ do {
+ Uchar mask = (length == 2) ? GL : -1;
+ *outbufptr++ = *inbufptr++ & mask;
+ } while (--clen);
+
+ if (length >= 2)
+ jis_to_sjis((Uchar *)(outbufptr-2), (Uchar *)(outbufptr-1));
+ }
+
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+ (*to_left) -= num_conv;
+
+ return unconv_num;
+}
+
+
+static int
+sjis_ctstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = (XLCd)conv->state;
+ Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+ const char *inbufptr = *from;
+ const char *inbuf_base;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ wchar_t *outbuf_base = outbufptr;
+ int clen, length;
+ int num_conv;
+ int unconv_num = 0;
+ unsigned int ct_seglen = 0;
+ Uchar ct_type = 0;
+ int shift_mult;
+ wchar_t wc_tmp;
+ wchar_t wch;
+ Ulong wc_encoding;
+ CTData ctdp = ctdata;
+ CTData GL_ctdp = ctdp; /* GL ctdp save */
+ CTData GR_ctdp = ctdp; /* GR ctdp save */
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length )
+ {
+ ct_type = CT_STD;
+ /* change GL/GR charset */
+ if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+ /* select GL side */
+ ctdp = GL_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+ /* select GR side */
+ ctdp = GR_ctdp;
+ length = ctdp->length;
+ ct_type = ctdp->ct_type;
+ }
+ if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+ for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+ if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+ {
+ inbufptr += ctdp->ct_encoding_len;
+ (*from_left) -= ctdp->ct_encoding_len;
+ if( ctdp->length ) {
+ length = ctdp->length;
+ if( *from_left < length ) {
+ *to = (XPointer)outbufptr;
+ *to_left -= outbufptr - outbuf_base;
+ return( unconv_num + *from_left );
+ }
+ }
+ ct_type = ctdp->ct_type;
+ if(ctdp->side == XlcGL){
+ GL_ctdp = ctdp; /* save GL ctdp */
+ }else{
+ GR_ctdp = ctdp; /* save GR ctdp */
+ }
+ break;
+ }
+ }
+ if (ctdp > ctd_endp) /* failed to match CT sequence */
+ unconv_num++;
+ }
+
+/* The following block of code insures that non-standard encodings, direction,
+ * extension, and version strings are ignored; subject to change in future.
+ */
+ switch (ct_type) {
+ case CT_STD:
+ break;
+ case CT_EXT2:
+ inbufptr++;
+ (*from_left)--;
+ case CT_NSTD:
+ ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+ inbufptr += ct_seglen;
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT0:
+ inbuf_base = inbufptr;
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_EXT1:
+ inbuf_base = inbufptr;
+ SKIP_P(inbufptr);
+ SKIP_I(inbufptr);
+ inbufptr++;
+ ct_seglen = (unsigned)(inbufptr - inbuf_base);
+ (*from_left) -= ct_seglen;
+ continue;
+ case CT_DIR:
+ continue;
+ case CT_VER:
+ inbufptr += 2;
+ (*from_left) -= 2;
+ continue;
+ }
+#if !defined(__sony_news) || defined(SVR4)
+ if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
+ clen = length;
+ wc_encoding = ctdp->wc_encoding;
+ } else {
+ clen = 1;
+ *from_left += length - clen;
+ wc_encoding = ctdptr[Ascii]->wc_encoding;
+ }
+ shift_mult = clen - 1;
+ wch = (wchar_t)0;
+
+ do {
+ wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
+ wch |= wc_tmp;
+ shift_mult--;
+ } while (--clen);
+ *outbufptr++ = wch | wc_encoding;
+#else
+ if( length == 1 )
+ *outbufptr++ = (unsigned char)*inbufptr++;
+ else if( length == 2 ) {
+ unsigned short code;
+ code = (*inbufptr << 8) | *(inbufptr+1);
+ *outbufptr++ = jis2sjis( code );
+ inbufptr += 2;
+ }
+#endif
+ }
+ *to = (XPointer)outbufptr;
+
+ if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+ (*to_left) -= num_conv ;
+
+ return unconv_num;
+
+}
+#undef BADCHAR
+
+static void
+close_converter(
+ XlcConv conv)
+{
+ Xfree((char *) conv);
+}
+
+
+static XlcConv
+create_conv(
+ XLCd lcd,
+ XlcConvMethods methods)
+{
+ XlcConv conv;
+
+ conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+ if (conv == NULL)
+ return (XlcConv) NULL;
+
+ conv->methods = methods;
+ conv->state = (XPointer) lcd;
+ return conv;
+}
+
+
+enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
+ WCSTOCTS, MBSTOCTS, CTSTOMBS, CTSTOWCS };
+
+static XlcConvMethodsRec conv_methods[] = {
+ {close_converter, sjis_mbstocs, NULL },
+ {close_converter, sjis_wcstocs, NULL },
+ {close_converter, sjis_mbtocs, NULL },
+ {close_converter, sjis_cstombs, NULL },
+ {close_converter, sjis_cstowcs, NULL },
+ {close_converter, sjis_mbstowcs, NULL },
+ {close_converter, sjis_wcstombs, NULL },
+ {close_converter, sjis_wcstocts, NULL },
+ {close_converter, sjis_mbstocts, NULL },
+ {close_converter, sjis_ctstombs, NULL },
+ {close_converter, sjis_ctstowcs, NULL },
+};
+
+
+static XlcConv
+open_mbstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCS]);
+}
+
+static XlcConv
+open_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCS]);
+}
+
+static XlcConv
+open_mbtocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBTOCS]);
+}
+
+static XlcConv
+open_cstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOMBS]);
+}
+
+static XlcConv
+open_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CSTOWCS]);
+}
+
+static XlcConv
+open_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
+}
+
+static XlcConv
+open_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
+}
+
+static XlcConv
+open_wcstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
+}
+
+static XlcConv
+open_mbstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
+}
+
+static XlcConv
+open_ctstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
+}
+
+static XlcConv
+open_ctstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
+}
+
+XLCd
+_XlcSjisLoader(
+ const char *name)
+{
+ XLCd lcd;
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+ if (lcd == NULL)
+ return lcd;
+
+ if (!XLC_PUBLIC_PART(lcd)->codeset ||
+ (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "SJIS"))) {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+
+ initCTptr(lcd);
+
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+
+#ifndef FORCE_INDIRECT_CONVERTER
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+#endif
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/libX11/modules/om/Makefile.am b/libX11/modules/om/Makefile.am
index 24f4c06a2..cb22f5a42 100644
--- a/libX11/modules/om/Makefile.am
+++ b/libX11/modules/om/Makefile.am
@@ -1 +1 @@
-SUBDIRS=generic
+SUBDIRS=generic
diff --git a/libX11/modules/om/generic/omDefault.c b/libX11/modules/om/generic/omDefault.c
index 322690fa0..3f867ba65 100644
--- a/libX11/modules/om/generic/omDefault.c
+++ b/libX11/modules/om/generic/omDefault.c
@@ -1,449 +1,449 @@
-/*
- * Copyright 1992, 1993 by TOSHIBA Corp.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of TOSHIBA not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. TOSHIBA make no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author: Katsuhisa Yano TOSHIBA Corp.
- * mopi@osa.ilab.toshiba.co.jp
- */
-/*
- * (c) Copyright 1995 FUJITSU LIMITED
- * This is source code modified by FUJITSU LIMITED under the Joint
- * Development Agreement for the CDE/Motif PST.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XomGeneric.h"
-#include <X11/Xos.h>
-#include <X11/Xatom.h>
-#include <stdio.h>
-
-#define DefineLocalBuf char local_buf[BUFSIZ]
-#define AllocLocalBuf(length) (length > BUFSIZ ? (char *)Xmalloc(length) : local_buf)
-#define FreeLocalBuf(ptr) if (ptr != local_buf) Xfree(ptr)
-
-static Bool
-wcs_to_mbs(
- XOC oc,
- char *to,
- _Xconst wchar_t *from,
- int length)
-{
- XlcConv conv;
- int to_left, ret;
-
- conv = _XomInitConverter(oc, XOMWideChar);
- if (conv == NULL)
- return False;
-
- to_left = length;
- ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to,
- &to_left, NULL, 0);
- if (ret != 0 || length > 0)
- return False;
-
- return True;
-}
-
-static Bool
-utf8_to_mbs(
- XOC oc,
- char *to,
- _Xconst char *from,
- int length)
-{
- XlcConv conv;
- int to_left, ret;
-
- conv = _XomInitConverter(oc, XOMUtf8String);
- if (conv == NULL)
- return False;
-
- to_left = length;
- ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to,
- &to_left, NULL, 0);
- if (ret != 0 || length > 0)
- return False;
-
- return True;
-}
-
-int
-_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length)
-{
- return XTextWidth(*oc->core.font_info.font_struct_list, text, length);
-}
-
-int
-_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- int ret;
-
- if (buf == NULL)
- return 0;
-
- if (wcs_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultTextEscapement(oc, buf, length);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-int
-_Xutf8DefaultTextEscapement(XOC oc, _Xconst char *text, int length)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- int ret;
-
- if (buf == NULL)
- return 0;
-
- if (utf8_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultTextEscapement(oc, buf, length);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-int
-_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *overall_ink, XRectangle *overall_logical)
-{
- int direction, logical_ascent, logical_descent;
- XCharStruct overall;
-
- XTextExtents(*oc->core.font_info.font_struct_list, text, length, &direction,
- &logical_ascent, &logical_descent, &overall);
-
- if (overall_ink) {
- overall_ink->x = overall.lbearing;
- overall_ink->y = -(overall.ascent);
- overall_ink->width = overall.rbearing - overall.lbearing;
- overall_ink->height = overall.ascent + overall.descent;
- }
-
- if (overall_logical) {
- overall_logical->x = 0;
- overall_logical->y = -(logical_ascent);
- overall_logical->width = overall.width;
- overall_logical->height = logical_ascent + logical_descent;
- }
-
- return overall.width;
-}
-
-int
-_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length,
- XRectangle *overall_ink, XRectangle *overall_logical)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- int ret;
-
- if (buf == NULL)
- return 0;
-
- if (wcs_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-int
-_Xutf8DefaultTextExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *overall_ink, XRectangle *overall_logical)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- int ret;
-
- if (buf == NULL)
- return 0;
-
- if (utf8_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-Status
-_XmbDefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *ink_buf, XRectangle *logical_buf,
- int buf_size, int *num_chars,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- XFontStruct *font = *oc->core.font_info.font_struct_list;
- XCharStruct *def, *cs, overall;
- Bool first = True;
-
- if (buf_size < length)
- return 0;
-
- bzero((char *) &overall, sizeof(XCharStruct));
- *num_chars = 0;
-
- CI_GET_DEFAULT_INFO_1D(font, def)
-
- while (length-- > 0) {
- CI_GET_CHAR_INFO_1D(font, *text, def, cs)
- text++;
- if (cs == NULL)
- continue;
-
- ink_buf->x = overall.width + cs->lbearing;
- ink_buf->y = -(cs->ascent);
- ink_buf->width = cs->rbearing - cs->lbearing;
- ink_buf->height = cs->ascent + cs->descent;
- ink_buf++;
-
- logical_buf->x = overall.width;
- logical_buf->y = -(font->ascent);
- logical_buf->width = cs->width;
- logical_buf->height = font->ascent + font->descent;
- logical_buf++;
-
- if (first) {
- overall = *cs;
- first = False;
- } else {
- overall.ascent = max(overall.ascent, cs->ascent);
- overall.descent = max(overall.descent, cs->descent);
- overall.lbearing = min(overall.lbearing, overall.width +
- cs->lbearing);
- overall.rbearing = max(overall.rbearing, overall.width +
- cs->rbearing);
- overall.width += cs->width;
- }
-
- (*num_chars)++;
- }
-
- if (overall_ink) {
- overall_ink->x = overall.lbearing;
- overall_ink->y = -(overall.ascent);
- overall_ink->width = overall.rbearing - overall.lbearing;
- overall_ink->height = overall.ascent + overall.descent;
- }
-
- if (overall_logical) {
- overall_logical->x = 0;
- overall_logical->y = -(font->ascent);
- overall_logical->width = overall.width;
- overall_logical->height = font->ascent + font->descent;
- }
-
- return 1;
-}
-
-Status
-_XwcDefaultTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
- XRectangle *ink_buf, XRectangle *logical_buf,
- int buf_size, int *num_chars,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- Status ret;
-
- if (buf == NULL)
- return 0;
-
- if (wcs_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf,
- buf_size, num_chars, overall_ink,
- overall_logical);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-Status
-_Xutf8DefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *ink_buf, XRectangle *logical_buf,
- int buf_size, int *num_chars,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- Status ret;
-
- if (buf == NULL)
- return 0;
-
- if (utf8_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf,
- buf_size, num_chars, overall_ink,
- overall_logical);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-int
-_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
- _Xconst char *text, int length)
-{
- XFontStruct *font = *oc->core.font_info.font_struct_list;
-
- XSetFont(dpy, gc, font->fid);
- XDrawString(dpy, d, gc, x, y, text, length);
-
- return XTextWidth(font, text, length);
-}
-
-int
-_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
- _Xconst wchar_t *text, int length)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- int ret;
-
- if (buf == NULL)
- return 0;
-
- if (wcs_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-int
-_Xutf8DefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
- _Xconst char *text, int length)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
- int ret;
-
- if (buf == NULL)
- return 0;
-
- if (utf8_to_mbs(oc, buf, text, length) == False) {
- ret = 0;
- goto err;
- }
-
- ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length);
-
-err:
- FreeLocalBuf(buf);
-
- return ret;
-}
-
-void
-_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
- int y, _Xconst char *text, int length)
-{
- XSetFont(dpy, gc, (*oc->core.font_info.font_struct_list)->fid);
- XDrawImageString(dpy, d, gc, x, y, text, length);
-}
-
-void
-_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
- int y, _Xconst wchar_t *text, int length)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
-
- if (buf == NULL)
- return;
-
- if (wcs_to_mbs(oc, buf, text, length) == False)
- goto err;
-
- _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length);
-
-err:
- FreeLocalBuf(buf);
-}
-
-void
-_Xutf8DefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
- int y, _Xconst char *text, int length)
-{
- DefineLocalBuf;
- char *buf = AllocLocalBuf(length);
-
- if (buf == NULL)
- return;
-
- if (utf8_to_mbs(oc, buf, text, length) == False)
- goto err;
-
- _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length);
-
-err:
- FreeLocalBuf(buf);
-}
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * (c) Copyright 1995 FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <X11/Xos.h>
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+#define DefineLocalBuf char local_buf[BUFSIZ]
+#define AllocLocalBuf(length) (length > BUFSIZ ? (char *)Xmalloc(length) : local_buf)
+#define FreeLocalBuf(ptr) if (ptr != local_buf) Xfree(ptr)
+
+static Bool
+wcs_to_mbs(
+ XOC oc,
+ char *to,
+ _Xconst wchar_t *from,
+ int length)
+{
+ XlcConv conv;
+ int to_left, ret;
+
+ conv = _XomInitConverter(oc, XOMWideChar);
+ if (conv == NULL)
+ return False;
+
+ to_left = length;
+ ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to,
+ &to_left, NULL, 0);
+ if (ret != 0 || length > 0)
+ return False;
+
+ return True;
+}
+
+static Bool
+utf8_to_mbs(
+ XOC oc,
+ char *to,
+ _Xconst char *from,
+ int length)
+{
+ XlcConv conv;
+ int to_left, ret;
+
+ conv = _XomInitConverter(oc, XOMUtf8String);
+ if (conv == NULL)
+ return False;
+
+ to_left = length;
+ ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to,
+ &to_left, NULL, 0);
+ if (ret != 0 || length > 0)
+ return False;
+
+ return True;
+}
+
+int
+_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+ return XTextWidth(*oc->core.font_info.font_struct_list, text, length);
+}
+
+int
+_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ int ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (wcs_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultTextEscapement(oc, buf, length);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+int
+_Xutf8DefaultTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ int ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (utf8_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultTextEscapement(oc, buf, length);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+int
+_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *overall_ink, XRectangle *overall_logical)
+{
+ int direction, logical_ascent, logical_descent;
+ XCharStruct overall;
+
+ XTextExtents(*oc->core.font_info.font_struct_list, text, length, &direction,
+ &logical_ascent, &logical_descent, &overall);
+
+ if (overall_ink) {
+ overall_ink->x = overall.lbearing;
+ overall_ink->y = -(overall.ascent);
+ overall_ink->width = overall.rbearing - overall.lbearing;
+ overall_ink->height = overall.ascent + overall.descent;
+ }
+
+ if (overall_logical) {
+ overall_logical->x = 0;
+ overall_logical->y = -(logical_ascent);
+ overall_logical->width = overall.width;
+ overall_logical->height = logical_ascent + logical_descent;
+ }
+
+ return overall.width;
+}
+
+int
+_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length,
+ XRectangle *overall_ink, XRectangle *overall_logical)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ int ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (wcs_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+int
+_Xutf8DefaultTextExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *overall_ink, XRectangle *overall_logical)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ int ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (utf8_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+Status
+_XmbDefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *ink_buf, XRectangle *logical_buf,
+ int buf_size, int *num_chars,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ XFontStruct *font = *oc->core.font_info.font_struct_list;
+ XCharStruct *def, *cs, overall;
+ Bool first = True;
+
+ if (buf_size < length)
+ return 0;
+
+ bzero((char *) &overall, sizeof(XCharStruct));
+ *num_chars = 0;
+
+ CI_GET_DEFAULT_INFO_1D(font, def)
+
+ while (length-- > 0) {
+ CI_GET_CHAR_INFO_1D(font, *text, def, cs)
+ text++;
+ if (cs == NULL)
+ continue;
+
+ ink_buf->x = overall.width + cs->lbearing;
+ ink_buf->y = -(cs->ascent);
+ ink_buf->width = cs->rbearing - cs->lbearing;
+ ink_buf->height = cs->ascent + cs->descent;
+ ink_buf++;
+
+ logical_buf->x = overall.width;
+ logical_buf->y = -(font->ascent);
+ logical_buf->width = cs->width;
+ logical_buf->height = font->ascent + font->descent;
+ logical_buf++;
+
+ if (first) {
+ overall = *cs;
+ first = False;
+ } else {
+ overall.ascent = max(overall.ascent, cs->ascent);
+ overall.descent = max(overall.descent, cs->descent);
+ overall.lbearing = min(overall.lbearing, overall.width +
+ cs->lbearing);
+ overall.rbearing = max(overall.rbearing, overall.width +
+ cs->rbearing);
+ overall.width += cs->width;
+ }
+
+ (*num_chars)++;
+ }
+
+ if (overall_ink) {
+ overall_ink->x = overall.lbearing;
+ overall_ink->y = -(overall.ascent);
+ overall_ink->width = overall.rbearing - overall.lbearing;
+ overall_ink->height = overall.ascent + overall.descent;
+ }
+
+ if (overall_logical) {
+ overall_logical->x = 0;
+ overall_logical->y = -(font->ascent);
+ overall_logical->width = overall.width;
+ overall_logical->height = font->ascent + font->descent;
+ }
+
+ return 1;
+}
+
+Status
+_XwcDefaultTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
+ XRectangle *ink_buf, XRectangle *logical_buf,
+ int buf_size, int *num_chars,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ Status ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (wcs_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf,
+ buf_size, num_chars, overall_ink,
+ overall_logical);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+Status
+_Xutf8DefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *ink_buf, XRectangle *logical_buf,
+ int buf_size, int *num_chars,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ Status ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (utf8_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf,
+ buf_size, num_chars, overall_ink,
+ overall_logical);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+int
+_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+ _Xconst char *text, int length)
+{
+ XFontStruct *font = *oc->core.font_info.font_struct_list;
+
+ XSetFont(dpy, gc, font->fid);
+ XDrawString(dpy, d, gc, x, y, text, length);
+
+ return XTextWidth(font, text, length);
+}
+
+int
+_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+ _Xconst wchar_t *text, int length)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ int ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (wcs_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+int
+_Xutf8DefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+ _Xconst char *text, int length)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+ int ret;
+
+ if (buf == NULL)
+ return 0;
+
+ if (utf8_to_mbs(oc, buf, text, length) == False) {
+ ret = 0;
+ goto err;
+ }
+
+ ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+ FreeLocalBuf(buf);
+
+ return ret;
+}
+
+void
+_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+ int y, _Xconst char *text, int length)
+{
+ XSetFont(dpy, gc, (*oc->core.font_info.font_struct_list)->fid);
+ XDrawImageString(dpy, d, gc, x, y, text, length);
+}
+
+void
+_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+ int y, _Xconst wchar_t *text, int length)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+
+ if (buf == NULL)
+ return;
+
+ if (wcs_to_mbs(oc, buf, text, length) == False)
+ goto err;
+
+ _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+ FreeLocalBuf(buf);
+}
+
+void
+_Xutf8DefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+ int y, _Xconst char *text, int length)
+{
+ DefineLocalBuf;
+ char *buf = AllocLocalBuf(length);
+
+ if (buf == NULL)
+ return;
+
+ if (utf8_to_mbs(oc, buf, text, length) == False)
+ goto err;
+
+ _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+ FreeLocalBuf(buf);
+}
diff --git a/libX11/modules/om/generic/omImText.c b/libX11/modules/om/generic/omImText.c
index 1bc08bc25..68086ff76 100644
--- a/libX11/modules/om/generic/omImText.c
+++ b/libX11/modules/om/generic/omImText.c
@@ -1,90 +1,90 @@
-/*
- * Copyright 1992, 1993 by TOSHIBA Corp.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of TOSHIBA not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. TOSHIBA make no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author: Katsuhisa Yano TOSHIBA Corp.
- * mopi@osa.ilab.toshiba.co.jp
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XomGeneric.h"
-
-#if 0
-extern int _XomGenericTextExtents(), _XomGenericDrawString();
-#endif
-
-#define GET_VALUE_MASK (GCFunction | GCForeground | GCBackground | GCFillStyle)
-#define SET_VALUE_MASK (GCFunction | GCForeground | GCFillStyle)
-
-static void
-_XomGenericDrawImageString(
- Display *dpy,
- Drawable d,
- XOC oc,
- GC gc,
- int x, int y,
- XOMTextType type,
- XPointer text,
- int length)
-{
- XGCValues values;
- XRectangle extent;
-
- XGetGCValues(dpy, gc, GET_VALUE_MASK, &values);
-
- XSetFunction(dpy, gc, GXcopy);
- XSetForeground(dpy, gc, values.background);
- XSetFillStyle(dpy, gc, FillSolid);
-
- _XomGenericTextExtents(oc, type, text, length, 0, &extent);
- XFillRectangle(dpy, d, gc, x + extent.x, y + extent.y, extent.width,
- extent.height);
-
- XChangeGC(dpy, gc, SET_VALUE_MASK, &values);
-
- _XomGenericDrawString(dpy, d, oc, gc, x, y, type, text, length);
-}
-
-void
-_XmbGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
- int y, _Xconst char *text, int length)
-{
- _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMMultiByte,
- (XPointer) text, length);
-}
-
-void
-_XwcGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
- int y, _Xconst wchar_t *text, int length)
-{
- _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMWideChar,
- (XPointer) text, length);
-}
-
-void
-_Xutf8GenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
- int y, _Xconst char *text, int length)
-{
- _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMUtf8String,
- (XPointer) text, length);
-}
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+
+#if 0
+extern int _XomGenericTextExtents(), _XomGenericDrawString();
+#endif
+
+#define GET_VALUE_MASK (GCFunction | GCForeground | GCBackground | GCFillStyle)
+#define SET_VALUE_MASK (GCFunction | GCForeground | GCFillStyle)
+
+static void
+_XomGenericDrawImageString(
+ Display *dpy,
+ Drawable d,
+ XOC oc,
+ GC gc,
+ int x, int y,
+ XOMTextType type,
+ XPointer text,
+ int length)
+{
+ XGCValues values;
+ XRectangle extent;
+
+ XGetGCValues(dpy, gc, GET_VALUE_MASK, &values);
+
+ XSetFunction(dpy, gc, GXcopy);
+ XSetForeground(dpy, gc, values.background);
+ XSetFillStyle(dpy, gc, FillSolid);
+
+ _XomGenericTextExtents(oc, type, text, length, 0, &extent);
+ XFillRectangle(dpy, d, gc, x + extent.x, y + extent.y, extent.width,
+ extent.height);
+
+ XChangeGC(dpy, gc, SET_VALUE_MASK, &values);
+
+ _XomGenericDrawString(dpy, d, oc, gc, x, y, type, text, length);
+}
+
+void
+_XmbGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+ int y, _Xconst char *text, int length)
+{
+ _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMMultiByte,
+ (XPointer) text, length);
+}
+
+void
+_XwcGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+ int y, _Xconst wchar_t *text, int length)
+{
+ _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMWideChar,
+ (XPointer) text, length);
+}
+
+void
+_Xutf8GenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+ int y, _Xconst char *text, int length)
+{
+ _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMUtf8String,
+ (XPointer) text, length);
+}
diff --git a/libX11/modules/om/generic/omText.c b/libX11/modules/om/generic/omText.c
index bfceca96e..fd957d491 100644
--- a/libX11/modules/om/generic/omText.c
+++ b/libX11/modules/om/generic/omText.c
@@ -1,370 +1,370 @@
-/*
- * Copyright 1992, 1993 by TOSHIBA Corp.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of TOSHIBA not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. TOSHIBA make no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author: Katsuhisa Yano TOSHIBA Corp.
- * mopi@osa.ilab.toshiba.co.jp
- */
-/*
- * Copyright 1995 by FUJITSU LIMITED
- * This is source code modified by FUJITSU LIMITED under the Joint
- * Development Agreement for the CDE/Motif PST.
- */
-/*
- * Modifiers: Jeff Walls, Paul Anderson (HEWLETT-PACKARD)
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XomGeneric.h"
-#include <stdio.h>
-
-/* For VW/UDC */
-
-static int
-is_rotate(
- XOC oc,
- XFontStruct *font)
-{
- XOCGenericPart *gen = XOC_GENERIC(oc);
- FontSet font_set;
- VRotate vrotate;
- int font_set_count;
- int vrotate_num;
-
- font_set = gen->font_set;
- font_set_count = gen->font_set_num;
- for( ; font_set_count-- ; font_set++) {
- if((font_set->vrotate_num > 0) && (font_set->vrotate)) {
- vrotate = font_set->vrotate;
- vrotate_num = font_set->vrotate_num;
- for( ; vrotate_num-- ; vrotate++)
- if(vrotate->font == font)
- return True;
- }
- }
- return False;
-}
-
-static int
-is_codemap(
- XOC oc,
- XFontStruct *font)
-{
- XOCGenericPart *gen = XOC_GENERIC(oc);
- FontSet font_set;
- FontData vmap;
- int font_set_count;
- int vmap_num;
-
- font_set = gen->font_set;
- font_set_count = gen->font_set_num;
- for( ; font_set_count-- ; font_set++) {
- if(font_set->vmap_num > 0) {
- vmap = font_set->vmap;
- vmap_num = font_set->vmap_num;
- for( ; vmap_num-- ; vmap++)
- if(vmap->font == font)
- return True;
- }
- }
- return False;
-}
-
-static int
-draw_vertical(
- Display *dpy,
- Drawable d,
- XOC oc,
- GC gc,
- XFontStruct *font,
- Bool is_xchar2b,
- int x, int y,
- XPointer text,
- int length)
-{
- XChar2b *buf2b;
- char *buf;
- int wx = 0, wy = 0;
- int direction = 0;
- int font_ascent_return = 0, font_descent_return = 0;
- int i;
- XCharStruct overall;
-
- wy = y;
- if (is_xchar2b) {
- for(i = 0, buf2b = (XChar2b *) text ; i < length ; i++, buf2b++) {
- if(is_rotate(oc, font) == True) {
- XTextExtents16(font, buf2b, 1,
- &direction, &font_ascent_return,
- &font_descent_return, &overall);
- wx = x - (int)((overall.rbearing - overall.lbearing) >> 1) -
- (int) overall.lbearing;
- wy += overall.ascent;
- XDrawString16(dpy, d, gc, wx, wy, buf2b, 1);
- wy += overall.descent;
- } else {
- wx = x - (int)((font->max_bounds.rbearing -
- font->min_bounds.lbearing) >> 1) -
- (int) font->min_bounds.lbearing;
- wy += font->max_bounds.ascent;
- XDrawString16(dpy, d, gc, wx, wy, buf2b, 1);
- wy += font->max_bounds.descent;
- }
- }
- } else {
- for(i = 0, buf = (char *)text ; i < length && *buf ; i++, buf++) {
- if(is_rotate(oc, font) == True) {
- XTextExtents(font, buf, 1,
- &direction, &font_ascent_return,
- &font_descent_return, &overall);
- wx = x - (int)((overall.rbearing - overall.lbearing) >> 1) -
- (int) overall.lbearing;
- wy += overall.ascent;
- XDrawString(dpy, d, gc, wx, wy, buf, 1);
- wy += overall.descent;
- } else {
- wx = x - (int)((font->max_bounds.rbearing -
- font->min_bounds.lbearing) >> 1) -
- (int) font->min_bounds.lbearing;
- wy += font->max_bounds.ascent;
- XDrawString(dpy, d, gc, wx, wy, buf, 1);
- wy += font->max_bounds.descent;
- }
- }
- }
- return wy;
-}
-
-#define VMAP 0
-#define VROTATE 1
-#define FONTSCOPE 2
-
-static int
-DrawStringWithFontSet(
- Display *dpy,
- Drawable d,
- XOC oc,
- FontSet fs,
- GC gc,
- int x, int y,
- XPointer text,
- int length)
-{
- XFontStruct *font;
- Bool is_xchar2b;
- unsigned char *ptr;
- int ptr_len, char_len = 0;
- FontData fd;
- int ret = 0;
-
- ptr = (unsigned char *)text;
- is_xchar2b = fs->is_xchar2b;
-
- while (length > 0) {
- fd = _XomGetFontDataFromFontSet(fs,
- ptr,length,&ptr_len,is_xchar2b,FONTSCOPE);
- if(ptr_len <= 0)
- break;
-
- /* First, see if the "Best Match" font for the FontSet was set.
- * If it was, use that font. If it was not set, then use the
- * font defined by font_set->font_data[0] (which is what
- * _XomGetFontDataFromFontSet() always seems to return for
- * non-VW text). Note that given the new algorithm in
- * parse_fontname() and parse_fontdata(), fs->font will
- * *always* contain good data. We should probably remove
- * the check for "fd->font", but we won't :-) -- jjw/pma (HP)
- */
- if((font = fs->font) == (XFontStruct *) NULL){
-
- if(fd == (FontData) NULL ||
- (font = fd->font) == (XFontStruct *) NULL)
- break;
- }
-
- switch(oc->core.orientation) {
- case XOMOrientation_LTR_TTB:
- case XOMOrientation_RTL_TTB:
- XSetFont(dpy, gc, font->fid);
-
- if (is_xchar2b) {
- char_len = ptr_len / sizeof(XChar2b);
- XDrawString16(dpy, d, gc, x, y, (XChar2b *)ptr, char_len);
- x += XTextWidth16(font, (XChar2b *)ptr, char_len);
- } else {
- char_len = ptr_len;
- XDrawString(dpy, d, gc, x, y, (char *)ptr, char_len);
- x += XTextWidth(font, (char *)ptr, char_len);
- }
- break;
- case XOMOrientation_TTB_RTL:
- case XOMOrientation_TTB_LTR:
- if(fs->font == font) {
- fd = _XomGetFontDataFromFontSet(fs,
- ptr,length,&ptr_len,is_xchar2b,VMAP);
- if(ptr_len <= 0)
- break;
- if(fd == (FontData) NULL ||
- (font = fd->font) == (XFontStruct *) NULL)
- break;
-
- if(is_codemap(oc, fd->font) == False) {
- fd = _XomGetFontDataFromFontSet(fs,
- ptr,length,&ptr_len,is_xchar2b,VROTATE);
- if(ptr_len <= 0)
- break;
- if(fd == (FontData) NULL ||
- (font = fd->font) == (XFontStruct *) NULL)
- break;
- }
- }
-
- if(is_xchar2b)
- char_len = ptr_len / sizeof(XChar2b);
- else
- char_len = ptr_len;
- XSetFont(dpy, gc, font->fid);
- y = draw_vertical(dpy, d, oc, gc, font, is_xchar2b, x, y,
- (char *)ptr, char_len);
- break;
-
- case XOMOrientation_Context:
- /* never used? */
- break;
- }
-
- if(char_len <= 0)
- break;
-
- length -= char_len;
- ptr += ptr_len;
- }
-
- switch(oc->core.orientation) {
- case XOMOrientation_LTR_TTB:
- case XOMOrientation_RTL_TTB:
- ret = x;
- break;
- case XOMOrientation_TTB_RTL:
- case XOMOrientation_TTB_LTR:
- ret = y;
- break;
- case XOMOrientation_Context:
- /* not used? */
- break;
- }
- return ret;
-}
-
-/* For VW/UDC */
-
-int
-_XomGenericDrawString(
- Display *dpy,
- Drawable d,
- XOC oc,
- GC gc,
- int x, int y,
- XOMTextType type,
- XPointer text,
- int length)
-{
- XlcConv conv;
- XFontStruct *font;
- Bool is_xchar2b;
-/* VW/UDC */
- XPointer args[3];
- FontSet fs;
-/* VW/UDC */
- XChar2b xchar2b_buf[BUFSIZ], *buf;
- int start_x = x;
- int start_y = y;
- int left = 0, buf_len = 0;
- int next = 0;
-
- conv = _XomInitConverter(oc, type);
- if (conv == NULL)
- return -1;
-
- args[0] = (XPointer) &font;
- args[1] = (XPointer) &is_xchar2b;
- args[2] = (XPointer) &fs;
-
- while (length > 0) {
- buf = xchar2b_buf;
- left = buf_len = BUFSIZ;
-
- if (_XomConvert(oc, conv, (XPointer *) &text, &length,
- (XPointer *) &buf, &left, args, 3) < 0)
- break;
- buf_len -= left;
-
-/* For VW/UDC */
- next = DrawStringWithFontSet(dpy, d, oc, fs, gc, x, y,
- (XPointer)xchar2b_buf, buf_len);
-
- switch(oc->core.orientation) {
- case XOMOrientation_LTR_TTB:
- case XOMOrientation_RTL_TTB:
- x = next;
- break;
- case XOMOrientation_TTB_RTL:
- case XOMOrientation_TTB_LTR:
- y = next;
- break;
- case XOMOrientation_Context:
- /* not used */
- break;
- }
-/* For VW/UDC */
- }
-
- x -= start_x;
- y -= start_y;
-
- return x;
-}
-
-int
-_XmbGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
- _Xconst char *text, int length)
-{
- return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMMultiByte,
- (XPointer) text, length);
-}
-
-int
-_XwcGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
- _Xconst wchar_t *text, int length)
-{
- return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMWideChar,
- (XPointer) text, length);
-}
-
-int
-_Xutf8GenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
- _Xconst char *text, int length)
-{
- return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMUtf8String,
- (XPointer) text, length);
-}
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ */
+/*
+ * Modifiers: Jeff Walls, Paul Anderson (HEWLETT-PACKARD)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+/* For VW/UDC */
+
+static int
+is_rotate(
+ XOC oc,
+ XFontStruct *font)
+{
+ XOCGenericPart *gen = XOC_GENERIC(oc);
+ FontSet font_set;
+ VRotate vrotate;
+ int font_set_count;
+ int vrotate_num;
+
+ font_set = gen->font_set;
+ font_set_count = gen->font_set_num;
+ for( ; font_set_count-- ; font_set++) {
+ if((font_set->vrotate_num > 0) && (font_set->vrotate)) {
+ vrotate = font_set->vrotate;
+ vrotate_num = font_set->vrotate_num;
+ for( ; vrotate_num-- ; vrotate++)
+ if(vrotate->font == font)
+ return True;
+ }
+ }
+ return False;
+}
+
+static int
+is_codemap(
+ XOC oc,
+ XFontStruct *font)
+{
+ XOCGenericPart *gen = XOC_GENERIC(oc);
+ FontSet font_set;
+ FontData vmap;
+ int font_set_count;
+ int vmap_num;
+
+ font_set = gen->font_set;
+ font_set_count = gen->font_set_num;
+ for( ; font_set_count-- ; font_set++) {
+ if(font_set->vmap_num > 0) {
+ vmap = font_set->vmap;
+ vmap_num = font_set->vmap_num;
+ for( ; vmap_num-- ; vmap++)
+ if(vmap->font == font)
+ return True;
+ }
+ }
+ return False;
+}
+
+static int
+draw_vertical(
+ Display *dpy,
+ Drawable d,
+ XOC oc,
+ GC gc,
+ XFontStruct *font,
+ Bool is_xchar2b,
+ int x, int y,
+ XPointer text,
+ int length)
+{
+ XChar2b *buf2b;
+ char *buf;
+ int wx = 0, wy = 0;
+ int direction = 0;
+ int font_ascent_return = 0, font_descent_return = 0;
+ int i;
+ XCharStruct overall;
+
+ wy = y;
+ if (is_xchar2b) {
+ for(i = 0, buf2b = (XChar2b *) text ; i < length ; i++, buf2b++) {
+ if(is_rotate(oc, font) == True) {
+ XTextExtents16(font, buf2b, 1,
+ &direction, &font_ascent_return,
+ &font_descent_return, &overall);
+ wx = x - (int)((overall.rbearing - overall.lbearing) >> 1) -
+ (int) overall.lbearing;
+ wy += overall.ascent;
+ XDrawString16(dpy, d, gc, wx, wy, buf2b, 1);
+ wy += overall.descent;
+ } else {
+ wx = x - (int)((font->max_bounds.rbearing -
+ font->min_bounds.lbearing) >> 1) -
+ (int) font->min_bounds.lbearing;
+ wy += font->max_bounds.ascent;
+ XDrawString16(dpy, d, gc, wx, wy, buf2b, 1);
+ wy += font->max_bounds.descent;
+ }
+ }
+ } else {
+ for(i = 0, buf = (char *)text ; i < length && *buf ; i++, buf++) {
+ if(is_rotate(oc, font) == True) {
+ XTextExtents(font, buf, 1,
+ &direction, &font_ascent_return,
+ &font_descent_return, &overall);
+ wx = x - (int)((overall.rbearing - overall.lbearing) >> 1) -
+ (int) overall.lbearing;
+ wy += overall.ascent;
+ XDrawString(dpy, d, gc, wx, wy, buf, 1);
+ wy += overall.descent;
+ } else {
+ wx = x - (int)((font->max_bounds.rbearing -
+ font->min_bounds.lbearing) >> 1) -
+ (int) font->min_bounds.lbearing;
+ wy += font->max_bounds.ascent;
+ XDrawString(dpy, d, gc, wx, wy, buf, 1);
+ wy += font->max_bounds.descent;
+ }
+ }
+ }
+ return wy;
+}
+
+#define VMAP 0
+#define VROTATE 1
+#define FONTSCOPE 2
+
+static int
+DrawStringWithFontSet(
+ Display *dpy,
+ Drawable d,
+ XOC oc,
+ FontSet fs,
+ GC gc,
+ int x, int y,
+ XPointer text,
+ int length)
+{
+ XFontStruct *font;
+ Bool is_xchar2b;
+ unsigned char *ptr;
+ int ptr_len, char_len = 0;
+ FontData fd;
+ int ret = 0;
+
+ ptr = (unsigned char *)text;
+ is_xchar2b = fs->is_xchar2b;
+
+ while (length > 0) {
+ fd = _XomGetFontDataFromFontSet(fs,
+ ptr,length,&ptr_len,is_xchar2b,FONTSCOPE);
+ if(ptr_len <= 0)
+ break;
+
+ /* First, see if the "Best Match" font for the FontSet was set.
+ * If it was, use that font. If it was not set, then use the
+ * font defined by font_set->font_data[0] (which is what
+ * _XomGetFontDataFromFontSet() always seems to return for
+ * non-VW text). Note that given the new algorithm in
+ * parse_fontname() and parse_fontdata(), fs->font will
+ * *always* contain good data. We should probably remove
+ * the check for "fd->font", but we won't :-) -- jjw/pma (HP)
+ */
+ if((font = fs->font) == (XFontStruct *) NULL){
+
+ if(fd == (FontData) NULL ||
+ (font = fd->font) == (XFontStruct *) NULL)
+ break;
+ }
+
+ switch(oc->core.orientation) {
+ case XOMOrientation_LTR_TTB:
+ case XOMOrientation_RTL_TTB:
+ XSetFont(dpy, gc, font->fid);
+
+ if (is_xchar2b) {
+ char_len = ptr_len / sizeof(XChar2b);
+ XDrawString16(dpy, d, gc, x, y, (XChar2b *)ptr, char_len);
+ x += XTextWidth16(font, (XChar2b *)ptr, char_len);
+ } else {
+ char_len = ptr_len;
+ XDrawString(dpy, d, gc, x, y, (char *)ptr, char_len);
+ x += XTextWidth(font, (char *)ptr, char_len);
+ }
+ break;
+ case XOMOrientation_TTB_RTL:
+ case XOMOrientation_TTB_LTR:
+ if(fs->font == font) {
+ fd = _XomGetFontDataFromFontSet(fs,
+ ptr,length,&ptr_len,is_xchar2b,VMAP);
+ if(ptr_len <= 0)
+ break;
+ if(fd == (FontData) NULL ||
+ (font = fd->font) == (XFontStruct *) NULL)
+ break;
+
+ if(is_codemap(oc, fd->font) == False) {
+ fd = _XomGetFontDataFromFontSet(fs,
+ ptr,length,&ptr_len,is_xchar2b,VROTATE);
+ if(ptr_len <= 0)
+ break;
+ if(fd == (FontData) NULL ||
+ (font = fd->font) == (XFontStruct *) NULL)
+ break;
+ }
+ }
+
+ if(is_xchar2b)
+ char_len = ptr_len / sizeof(XChar2b);
+ else
+ char_len = ptr_len;
+ XSetFont(dpy, gc, font->fid);
+ y = draw_vertical(dpy, d, oc, gc, font, is_xchar2b, x, y,
+ (char *)ptr, char_len);
+ break;
+
+ case XOMOrientation_Context:
+ /* never used? */
+ break;
+ }
+
+ if(char_len <= 0)
+ break;
+
+ length -= char_len;
+ ptr += ptr_len;
+ }
+
+ switch(oc->core.orientation) {
+ case XOMOrientation_LTR_TTB:
+ case XOMOrientation_RTL_TTB:
+ ret = x;
+ break;
+ case XOMOrientation_TTB_RTL:
+ case XOMOrientation_TTB_LTR:
+ ret = y;
+ break;
+ case XOMOrientation_Context:
+ /* not used? */
+ break;
+ }
+ return ret;
+}
+
+/* For VW/UDC */
+
+int
+_XomGenericDrawString(
+ Display *dpy,
+ Drawable d,
+ XOC oc,
+ GC gc,
+ int x, int y,
+ XOMTextType type,
+ XPointer text,
+ int length)
+{
+ XlcConv conv;
+ XFontStruct *font;
+ Bool is_xchar2b;
+/* VW/UDC */
+ XPointer args[3];
+ FontSet fs;
+/* VW/UDC */
+ XChar2b xchar2b_buf[BUFSIZ], *buf;
+ int start_x = x;
+ int start_y = y;
+ int left = 0, buf_len = 0;
+ int next = 0;
+
+ conv = _XomInitConverter(oc, type);
+ if (conv == NULL)
+ return -1;
+
+ args[0] = (XPointer) &font;
+ args[1] = (XPointer) &is_xchar2b;
+ args[2] = (XPointer) &fs;
+
+ while (length > 0) {
+ buf = xchar2b_buf;
+ left = buf_len = BUFSIZ;
+
+ if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+ (XPointer *) &buf, &left, args, 3) < 0)
+ break;
+ buf_len -= left;
+
+/* For VW/UDC */
+ next = DrawStringWithFontSet(dpy, d, oc, fs, gc, x, y,
+ (XPointer)xchar2b_buf, buf_len);
+
+ switch(oc->core.orientation) {
+ case XOMOrientation_LTR_TTB:
+ case XOMOrientation_RTL_TTB:
+ x = next;
+ break;
+ case XOMOrientation_TTB_RTL:
+ case XOMOrientation_TTB_LTR:
+ y = next;
+ break;
+ case XOMOrientation_Context:
+ /* not used */
+ break;
+ }
+/* For VW/UDC */
+ }
+
+ x -= start_x;
+ y -= start_y;
+
+ return x;
+}
+
+int
+_XmbGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+ _Xconst char *text, int length)
+{
+ return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMMultiByte,
+ (XPointer) text, length);
+}
+
+int
+_XwcGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+ _Xconst wchar_t *text, int length)
+{
+ return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMWideChar,
+ (XPointer) text, length);
+}
+
+int
+_Xutf8GenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+ _Xconst char *text, int length)
+{
+ return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMUtf8String,
+ (XPointer) text, length);
+}
diff --git a/libX11/modules/om/generic/omTextEsc.c b/libX11/modules/om/generic/omTextEsc.c
index df1fb10c0..cb444f441 100644
--- a/libX11/modules/om/generic/omTextEsc.c
+++ b/libX11/modules/om/generic/omTextEsc.c
@@ -1,300 +1,300 @@
-/*
- * Copyright 1992, 1993 by TOSHIBA Corp.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of TOSHIBA not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. TOSHIBA make no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author: Katsuhisa Yano TOSHIBA Corp.
- * mopi@osa.ilab.toshiba.co.jp
- */
-/*
- * Copyright 1995 by FUJITSU LIMITED
- * This is source code modified by FUJITSU LIMITED under the Joint
- * Development Agreement for the CDE/Motif PST.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XomGeneric.h"
-#include <stdio.h>
-
-/* For VW/UDC start */
-
-#define VMAP 0
-#define VROTATE 1
-#define FONTSCOPE 2
-
-static int
-is_rotate(
- XOC oc,
- XFontStruct *font)
-{
- XOCGenericPart *gen = XOC_GENERIC(oc);
- FontSet font_set;
- VRotate vrotate;
- int font_set_count;
- int vrotate_num;
-
- font_set = gen->font_set;
- font_set_count = gen->font_set_num;
- for( ; font_set_count-- ; font_set++) {
- if((font_set->vrotate_num > 0) && (font_set->vrotate != NULL)) {
- vrotate = font_set->vrotate;
- vrotate_num = font_set->vrotate_num;
- for( ; vrotate_num-- ; vrotate++)
- if(vrotate->font == font)
- return True;
- }
- }
- return False;
-}
-
-static int
-is_codemap(
- XOC oc,
- XFontStruct *font)
-{
- XOCGenericPart *gen = XOC_GENERIC(oc);
- FontSet font_set;
- FontData vmap;
- int font_set_count;
- int vmap_num;
-
- font_set = gen->font_set;
- font_set_count = gen->font_set_num;
- for( ; font_set_count-- ; font_set++) {
- if(font_set->vmap_num > 0) {
- vmap = font_set->vmap;
- vmap_num = font_set->vmap_num;
- for( ; vmap_num-- ; vmap++)
- if(vmap->font == font)
- return True;
- }
- }
- return False;
-}
-
-static int
-escapement_vertical(
- XOC oc,
- XFontStruct *font,
- Bool is_xchar2b,
- XPointer text,
- int length)
-{
- XChar2b *buf2b;
- char *buf;
- int escapement = 0, i;
-
- if(is_xchar2b) {
- for(i = 0, buf2b = (XChar2b *) text ; i < length ; i++, buf2b++) {
- if(is_rotate(oc, font) == True) {
- escapement += _XTextHeight16(font, buf2b, 1);
- } else {
- escapement += (int) (font->max_bounds.ascent +
- font->max_bounds.descent);
- }
- }
- } else {
- for(i = 0, buf = (char *)text ; i < length && *buf ; i++, buf++) {
- if(is_rotate(oc, font) == True) {
- escapement += _XTextHeight(font, buf, 1);
- } else {
- escapement += (int) (font->max_bounds.ascent +
- font->max_bounds.descent);
- }
- }
- }
- return escapement;
-}
-
-
-static int
-TextWidthWithFontSet(
- FontSet font_set,
- XOC oc,
- XPointer text,
- int length)
-{
- FontData fd;
- XFontStruct *font;
- unsigned char *ptr = (unsigned char *)text;
- Bool is_xchar2b;
- int ptr_len = length;
- int escapement = 0, char_len = 0;
-
- if(font_set == (FontSet) NULL)
- return escapement;
-
- is_xchar2b = font_set->is_xchar2b;
-
- while(length > 0) {
- fd = _XomGetFontDataFromFontSet(font_set, ptr, length, &ptr_len,
- is_xchar2b, FONTSCOPE);
- if(ptr_len <= 0)
- break;
-
- /*
- * First, see if the "Best Match" font for the FontSet was set.
- * If it was, use that font. If it was not set, then use the
- * font defined by font_set->font_data[0] (which is what
- * _XomGetFontDataFromFontSet() always seems to return for
- * non-VW text). Note that given the new algorithm in
- * parse_fontname() and parse_fontdata(), fs->font will
- * *always* contain good data. We should probably remove
- * the check for "fd->font", but we won't :-) -- jjw/pma (HP)
- *
- * Above comment and way this is done propagated from omText.c
- * Note that fd->font is junk so using the result of the
- * above call /needs/ to be ignored.
- *
- * Owen Taylor <otaylor@redhat.com> 12 Jul 2000
- *
- */
-
- if(fd == (FontData) NULL ||
- (font = font_set->font) == (XFontStruct *) NULL) {
-
- if((font = fd->font) == (XFontStruct *) NULL)
- break;
- }
-
- switch(oc->core.orientation) {
- case XOMOrientation_LTR_TTB:
- case XOMOrientation_RTL_TTB:
- if (is_xchar2b) {
- char_len = ptr_len / sizeof(XChar2b);
- escapement += XTextWidth16(font, (XChar2b *)ptr, char_len);
- } else {
- char_len = ptr_len;
- escapement += XTextWidth(font, (char *)ptr, char_len);
- }
- break;
-
- case XOMOrientation_TTB_LTR:
- case XOMOrientation_TTB_RTL:
- if(font_set->font == font) {
- fd = _XomGetFontDataFromFontSet(font_set, ptr, length, &ptr_len,
- is_xchar2b, VMAP);
- if(ptr_len <= 0)
- break;
- if(fd == (FontData) NULL ||
- (font = fd->font) == (XFontStruct *) NULL)
- break;
-
- if(is_codemap(oc, fd->font) == False) {
- fd = _XomGetFontDataFromFontSet(font_set, ptr, length,
- &ptr_len, is_xchar2b,
- VROTATE);
- if(ptr_len <= 0)
- break;
- if(fd == (FontData) NULL ||
- (font = fd->font) == (XFontStruct *) NULL)
- break;
- }
- }
-
- if(is_xchar2b)
- char_len = ptr_len / sizeof(XChar2b);
- else
- char_len = ptr_len;
- escapement += escapement_vertical(oc, font, is_xchar2b,
- (XPointer) ptr, char_len);
- break;
-
- case XOMOrientation_Context:
- /* not used? */
- break;
- }
-
- if(char_len <= 0)
- break;
-
- length -= char_len;
- ptr += ptr_len;
- }
-
- return escapement;
-}
-
-/* For VW/UDC end */
-
-static int
-_XomGenericTextEscapement(
- XOC oc,
- XOMTextType type,
- XPointer text,
- int length)
-{
- XlcConv conv;
- XFontStruct *font;
- Bool is_xchar2b;
-/* VW/UDC */
- XPointer args[3];
- FontSet font_set;
-/* VW/UDC */
- XChar2b xchar2b_buf[BUFSIZ], *buf;
- int escapement = 0;
- int buf_len = 0, left = 0;
-
- conv = _XomInitConverter(oc, type);
- if (conv == NULL)
- return escapement;
-
- args[0] = (XPointer) &font;
- args[1] = (XPointer) &is_xchar2b;
- args[2] = (XPointer) &font_set;
-
- while (length > 0) {
- buf = xchar2b_buf;
- left = buf_len = BUFSIZ;
-
- if (_XomConvert(oc, conv, (XPointer *) &text, &length,
- (XPointer *) &buf, &left, args, 3) < 0)
- break;
- buf_len -= left;
-
-/* VW/UDC */
- escapement += TextWidthWithFontSet(font_set, oc,
- (XPointer) xchar2b_buf, buf_len);
-/* VW/UDC */
- }
-
- return escapement;
-}
-
-int
-_XmbGenericTextEscapement(XOC oc, _Xconst char *text, int length)
-{
- return _XomGenericTextEscapement(oc, XOMMultiByte, (XPointer) text, length);
-}
-
-int
-_XwcGenericTextEscapement(XOC oc, _Xconst wchar_t *text, int length)
-{
- return _XomGenericTextEscapement(oc, XOMWideChar, (XPointer) text, length);
-}
-
-int
-_Xutf8GenericTextEscapement(XOC oc, _Xconst char *text, int length)
-{
- return _XomGenericTextEscapement(oc, XOMUtf8String, (XPointer) text,
- length);
-}
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+/* For VW/UDC start */
+
+#define VMAP 0
+#define VROTATE 1
+#define FONTSCOPE 2
+
+static int
+is_rotate(
+ XOC oc,
+ XFontStruct *font)
+{
+ XOCGenericPart *gen = XOC_GENERIC(oc);
+ FontSet font_set;
+ VRotate vrotate;
+ int font_set_count;
+ int vrotate_num;
+
+ font_set = gen->font_set;
+ font_set_count = gen->font_set_num;
+ for( ; font_set_count-- ; font_set++) {
+ if((font_set->vrotate_num > 0) && (font_set->vrotate != NULL)) {
+ vrotate = font_set->vrotate;
+ vrotate_num = font_set->vrotate_num;
+ for( ; vrotate_num-- ; vrotate++)
+ if(vrotate->font == font)
+ return True;
+ }
+ }
+ return False;
+}
+
+static int
+is_codemap(
+ XOC oc,
+ XFontStruct *font)
+{
+ XOCGenericPart *gen = XOC_GENERIC(oc);
+ FontSet font_set;
+ FontData vmap;
+ int font_set_count;
+ int vmap_num;
+
+ font_set = gen->font_set;
+ font_set_count = gen->font_set_num;
+ for( ; font_set_count-- ; font_set++) {
+ if(font_set->vmap_num > 0) {
+ vmap = font_set->vmap;
+ vmap_num = font_set->vmap_num;
+ for( ; vmap_num-- ; vmap++)
+ if(vmap->font == font)
+ return True;
+ }
+ }
+ return False;
+}
+
+static int
+escapement_vertical(
+ XOC oc,
+ XFontStruct *font,
+ Bool is_xchar2b,
+ XPointer text,
+ int length)
+{
+ XChar2b *buf2b;
+ char *buf;
+ int escapement = 0, i;
+
+ if(is_xchar2b) {
+ for(i = 0, buf2b = (XChar2b *) text ; i < length ; i++, buf2b++) {
+ if(is_rotate(oc, font) == True) {
+ escapement += _XTextHeight16(font, buf2b, 1);
+ } else {
+ escapement += (int) (font->max_bounds.ascent +
+ font->max_bounds.descent);
+ }
+ }
+ } else {
+ for(i = 0, buf = (char *)text ; i < length && *buf ; i++, buf++) {
+ if(is_rotate(oc, font) == True) {
+ escapement += _XTextHeight(font, buf, 1);
+ } else {
+ escapement += (int) (font->max_bounds.ascent +
+ font->max_bounds.descent);
+ }
+ }
+ }
+ return escapement;
+}
+
+
+static int
+TextWidthWithFontSet(
+ FontSet font_set,
+ XOC oc,
+ XPointer text,
+ int length)
+{
+ FontData fd;
+ XFontStruct *font;
+ unsigned char *ptr = (unsigned char *)text;
+ Bool is_xchar2b;
+ int ptr_len = length;
+ int escapement = 0, char_len = 0;
+
+ if(font_set == (FontSet) NULL)
+ return escapement;
+
+ is_xchar2b = font_set->is_xchar2b;
+
+ while(length > 0) {
+ fd = _XomGetFontDataFromFontSet(font_set, ptr, length, &ptr_len,
+ is_xchar2b, FONTSCOPE);
+ if(ptr_len <= 0)
+ break;
+
+ /*
+ * First, see if the "Best Match" font for the FontSet was set.
+ * If it was, use that font. If it was not set, then use the
+ * font defined by font_set->font_data[0] (which is what
+ * _XomGetFontDataFromFontSet() always seems to return for
+ * non-VW text). Note that given the new algorithm in
+ * parse_fontname() and parse_fontdata(), fs->font will
+ * *always* contain good data. We should probably remove
+ * the check for "fd->font", but we won't :-) -- jjw/pma (HP)
+ *
+ * Above comment and way this is done propagated from omText.c
+ * Note that fd->font is junk so using the result of the
+ * above call /needs/ to be ignored.
+ *
+ * Owen Taylor <otaylor@redhat.com> 12 Jul 2000
+ *
+ */
+
+ if(fd == (FontData) NULL ||
+ (font = font_set->font) == (XFontStruct *) NULL) {
+
+ if((font = fd->font) == (XFontStruct *) NULL)
+ break;
+ }
+
+ switch(oc->core.orientation) {
+ case XOMOrientation_LTR_TTB:
+ case XOMOrientation_RTL_TTB:
+ if (is_xchar2b) {
+ char_len = ptr_len / sizeof(XChar2b);
+ escapement += XTextWidth16(font, (XChar2b *)ptr, char_len);
+ } else {
+ char_len = ptr_len;
+ escapement += XTextWidth(font, (char *)ptr, char_len);
+ }
+ break;
+
+ case XOMOrientation_TTB_LTR:
+ case XOMOrientation_TTB_RTL:
+ if(font_set->font == font) {
+ fd = _XomGetFontDataFromFontSet(font_set, ptr, length, &ptr_len,
+ is_xchar2b, VMAP);
+ if(ptr_len <= 0)
+ break;
+ if(fd == (FontData) NULL ||
+ (font = fd->font) == (XFontStruct *) NULL)
+ break;
+
+ if(is_codemap(oc, fd->font) == False) {
+ fd = _XomGetFontDataFromFontSet(font_set, ptr, length,
+ &ptr_len, is_xchar2b,
+ VROTATE);
+ if(ptr_len <= 0)
+ break;
+ if(fd == (FontData) NULL ||
+ (font = fd->font) == (XFontStruct *) NULL)
+ break;
+ }
+ }
+
+ if(is_xchar2b)
+ char_len = ptr_len / sizeof(XChar2b);
+ else
+ char_len = ptr_len;
+ escapement += escapement_vertical(oc, font, is_xchar2b,
+ (XPointer) ptr, char_len);
+ break;
+
+ case XOMOrientation_Context:
+ /* not used? */
+ break;
+ }
+
+ if(char_len <= 0)
+ break;
+
+ length -= char_len;
+ ptr += ptr_len;
+ }
+
+ return escapement;
+}
+
+/* For VW/UDC end */
+
+static int
+_XomGenericTextEscapement(
+ XOC oc,
+ XOMTextType type,
+ XPointer text,
+ int length)
+{
+ XlcConv conv;
+ XFontStruct *font;
+ Bool is_xchar2b;
+/* VW/UDC */
+ XPointer args[3];
+ FontSet font_set;
+/* VW/UDC */
+ XChar2b xchar2b_buf[BUFSIZ], *buf;
+ int escapement = 0;
+ int buf_len = 0, left = 0;
+
+ conv = _XomInitConverter(oc, type);
+ if (conv == NULL)
+ return escapement;
+
+ args[0] = (XPointer) &font;
+ args[1] = (XPointer) &is_xchar2b;
+ args[2] = (XPointer) &font_set;
+
+ while (length > 0) {
+ buf = xchar2b_buf;
+ left = buf_len = BUFSIZ;
+
+ if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+ (XPointer *) &buf, &left, args, 3) < 0)
+ break;
+ buf_len -= left;
+
+/* VW/UDC */
+ escapement += TextWidthWithFontSet(font_set, oc,
+ (XPointer) xchar2b_buf, buf_len);
+/* VW/UDC */
+ }
+
+ return escapement;
+}
+
+int
+_XmbGenericTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+ return _XomGenericTextEscapement(oc, XOMMultiByte, (XPointer) text, length);
+}
+
+int
+_XwcGenericTextEscapement(XOC oc, _Xconst wchar_t *text, int length)
+{
+ return _XomGenericTextEscapement(oc, XOMWideChar, (XPointer) text, length);
+}
+
+int
+_Xutf8GenericTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+ return _XomGenericTextEscapement(oc, XOMUtf8String, (XPointer) text,
+ length);
+}
diff --git a/libX11/modules/om/generic/omTextExt.c b/libX11/modules/om/generic/omTextExt.c
index baeadf6b0..22f99d8f5 100644
--- a/libX11/modules/om/generic/omTextExt.c
+++ b/libX11/modules/om/generic/omTextExt.c
@@ -1,135 +1,135 @@
-/*
- * Copyright 1992, 1993 by TOSHIBA Corp.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of TOSHIBA not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. TOSHIBA make no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author: Katsuhisa Yano TOSHIBA Corp.
- * mopi@osa.ilab.toshiba.co.jp
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XomGeneric.h"
-#include <stdio.h>
-
-int
-_XomGenericTextExtents(
- XOC oc,
- XOMTextType type,
- XPointer text,
- int length,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- XlcConv conv;
- XFontStruct *font;
- Bool is_xchar2b;
- XPointer args[2];
- XChar2b xchar2b_buf[BUFSIZ], *buf;
- int direction, logical_ascent, logical_descent, tmp_ascent, tmp_descent;
- XCharStruct overall, tmp_overall;
- int buf_len, left;
- Bool first = True;
-
- conv = _XomInitConverter(oc, type);
- if (conv == NULL)
- return 0;
-
- bzero((char *) &overall, sizeof(XCharStruct));
- logical_ascent = logical_descent = 0;
-
- args[0] = (XPointer) &font;
- args[1] = (XPointer) &is_xchar2b;
-
- while (length > 0) {
- buf = xchar2b_buf;
- left = buf_len = BUFSIZ;
-
- if (_XomConvert(oc, conv, (XPointer *) &text, &length,
- (XPointer *) &buf, &left, args, 2) < 0)
- break;
- buf_len -= left;
-
- if (is_xchar2b)
- XTextExtents16(font, xchar2b_buf, buf_len, &direction,
- &tmp_ascent, &tmp_descent, &tmp_overall);
- else
- XTextExtents(font, (char *) xchar2b_buf, buf_len, &direction,
- &tmp_ascent, &tmp_descent, &tmp_overall);
-
- if (first) { /* initialize overall */
- overall = tmp_overall;
- logical_ascent = tmp_ascent;
- logical_descent = tmp_descent;
- first = False;
- } else {
- overall.lbearing = min(overall.lbearing,
- overall.width + tmp_overall.lbearing);
- overall.rbearing = max(overall.rbearing,
- overall.width + tmp_overall.rbearing);
- overall.ascent = max(overall.ascent, tmp_overall.ascent);
- overall.descent = max(overall.descent, tmp_overall.descent);
- overall.width += tmp_overall.width;
- logical_ascent = max(logical_ascent, tmp_ascent);
- logical_descent = max(logical_descent, tmp_descent);
- }
- }
-
- if (overall_ink) {
- overall_ink->x = overall.lbearing;
- overall_ink->y = -(overall.ascent);
- overall_ink->width = overall.rbearing - overall.lbearing;
- overall_ink->height = overall.ascent + overall.descent;
- }
-
- if (overall_logical) {
- overall_logical->x = 0;
- overall_logical->y = -(logical_ascent);
- overall_logical->width = overall.width;
- overall_logical->height = logical_ascent + logical_descent;
- }
-
- return overall.width;
-}
-
-int
-_XmbGenericTextExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *overall_ink, XRectangle *overall_logical)
-{
- return _XomGenericTextExtents(oc, XOMMultiByte, (XPointer) text, length,
- overall_ink, overall_logical);
-}
-
-int
-_XwcGenericTextExtents(XOC oc, _Xconst wchar_t *text, int length,
- XRectangle *overall_ink, XRectangle *overall_logical)
-{
- return _XomGenericTextExtents(oc, XOMWideChar, (XPointer) text, length,
- overall_ink, overall_logical);
-}
-
-int
-_Xutf8GenericTextExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *overall_ink, XRectangle *overall_logical)
-{
- return _XomGenericTextExtents(oc, XOMUtf8String, (XPointer) text, length,
- overall_ink, overall_logical);
-}
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+int
+_XomGenericTextExtents(
+ XOC oc,
+ XOMTextType type,
+ XPointer text,
+ int length,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ XlcConv conv;
+ XFontStruct *font;
+ Bool is_xchar2b;
+ XPointer args[2];
+ XChar2b xchar2b_buf[BUFSIZ], *buf;
+ int direction, logical_ascent, logical_descent, tmp_ascent, tmp_descent;
+ XCharStruct overall, tmp_overall;
+ int buf_len, left;
+ Bool first = True;
+
+ conv = _XomInitConverter(oc, type);
+ if (conv == NULL)
+ return 0;
+
+ bzero((char *) &overall, sizeof(XCharStruct));
+ logical_ascent = logical_descent = 0;
+
+ args[0] = (XPointer) &font;
+ args[1] = (XPointer) &is_xchar2b;
+
+ while (length > 0) {
+ buf = xchar2b_buf;
+ left = buf_len = BUFSIZ;
+
+ if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+ (XPointer *) &buf, &left, args, 2) < 0)
+ break;
+ buf_len -= left;
+
+ if (is_xchar2b)
+ XTextExtents16(font, xchar2b_buf, buf_len, &direction,
+ &tmp_ascent, &tmp_descent, &tmp_overall);
+ else
+ XTextExtents(font, (char *) xchar2b_buf, buf_len, &direction,
+ &tmp_ascent, &tmp_descent, &tmp_overall);
+
+ if (first) { /* initialize overall */
+ overall = tmp_overall;
+ logical_ascent = tmp_ascent;
+ logical_descent = tmp_descent;
+ first = False;
+ } else {
+ overall.lbearing = min(overall.lbearing,
+ overall.width + tmp_overall.lbearing);
+ overall.rbearing = max(overall.rbearing,
+ overall.width + tmp_overall.rbearing);
+ overall.ascent = max(overall.ascent, tmp_overall.ascent);
+ overall.descent = max(overall.descent, tmp_overall.descent);
+ overall.width += tmp_overall.width;
+ logical_ascent = max(logical_ascent, tmp_ascent);
+ logical_descent = max(logical_descent, tmp_descent);
+ }
+ }
+
+ if (overall_ink) {
+ overall_ink->x = overall.lbearing;
+ overall_ink->y = -(overall.ascent);
+ overall_ink->width = overall.rbearing - overall.lbearing;
+ overall_ink->height = overall.ascent + overall.descent;
+ }
+
+ if (overall_logical) {
+ overall_logical->x = 0;
+ overall_logical->y = -(logical_ascent);
+ overall_logical->width = overall.width;
+ overall_logical->height = logical_ascent + logical_descent;
+ }
+
+ return overall.width;
+}
+
+int
+_XmbGenericTextExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *overall_ink, XRectangle *overall_logical)
+{
+ return _XomGenericTextExtents(oc, XOMMultiByte, (XPointer) text, length,
+ overall_ink, overall_logical);
+}
+
+int
+_XwcGenericTextExtents(XOC oc, _Xconst wchar_t *text, int length,
+ XRectangle *overall_ink, XRectangle *overall_logical)
+{
+ return _XomGenericTextExtents(oc, XOMWideChar, (XPointer) text, length,
+ overall_ink, overall_logical);
+}
+
+int
+_Xutf8GenericTextExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *overall_ink, XRectangle *overall_logical)
+{
+ return _XomGenericTextExtents(oc, XOMUtf8String, (XPointer) text, length,
+ overall_ink, overall_logical);
+}
diff --git a/libX11/modules/om/generic/omTextPer.c b/libX11/modules/om/generic/omTextPer.c
index ae08fe6a4..c66848aa2 100644
--- a/libX11/modules/om/generic/omTextPer.c
+++ b/libX11/modules/om/generic/omTextPer.c
@@ -1,202 +1,202 @@
-/*
- * Copyright 1992, 1993 by TOSHIBA Corp.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of TOSHIBA not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. TOSHIBA make no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author: Katsuhisa Yano TOSHIBA Corp.
- * mopi@osa.ilab.toshiba.co.jp
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XomGeneric.h"
-#include <stdio.h>
-
-static Status
-_XomGenericTextPerCharExtents(
- XOC oc,
- XOMTextType type,
- XPointer text,
- int length,
- XRectangle *ink_buf,
- XRectangle *logical_buf,
- int buf_size,
- int *num_chars,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- XlcConv conv;
- XFontStruct *font;
- Bool is_xchar2b;
- XPointer args[2];
- XChar2b xchar2b_buf[BUFSIZ], *xchar2b_ptr;
- char *xchar_ptr = NULL;
- XCharStruct *def, *cs, overall;
- int buf_len, left, require_num;
- int logical_ascent, logical_descent;
- Bool first = True;
-
- conv = _XomInitConverter(oc, type);
- if (conv == NULL)
- return 0;
-
- bzero((char *) &overall, sizeof(XCharStruct));
- logical_ascent = logical_descent = require_num = *num_chars = 0;
-
- args[0] = (XPointer) &font;
- args[1] = (XPointer) &is_xchar2b;
-
- while (length > 0) {
- xchar2b_ptr = xchar2b_buf;
- left = buf_len = BUFSIZ;
-
- if (_XomConvert(oc, conv, (XPointer *) &text, &length,
- (XPointer *) &xchar2b_ptr, &left, args, 2) < 0)
- break;
- buf_len -= left;
-
- if (require_num) {
- require_num += buf_len;
- continue;
- }
- if (buf_size < buf_len) {
- require_num = *num_chars + buf_len;
- continue;
- }
- buf_size -= buf_len;
-
- if (first) {
- logical_ascent = font->ascent;
- logical_descent = font->descent;
- } else {
- logical_ascent = max(logical_ascent, font->ascent);
- logical_descent = max(logical_descent, font->descent);
- }
-
- if (is_xchar2b) {
- CI_GET_DEFAULT_INFO_2D(font, def)
- xchar2b_ptr = xchar2b_buf;
- } else {
- CI_GET_DEFAULT_INFO_1D(font, def)
- xchar_ptr = (char *) xchar2b_buf;
- }
-
- while (buf_len-- > 0) {
- if (is_xchar2b) {
- CI_GET_CHAR_INFO_2D(font, xchar2b_ptr->byte1,
- xchar2b_ptr->byte2, def, cs)
- xchar2b_ptr++;
- } else {
- CI_GET_CHAR_INFO_1D(font, *xchar_ptr, def, cs)
- xchar_ptr++;
- }
- if (cs == NULL)
- continue;
-
- ink_buf->x = overall.width + cs->lbearing;
- ink_buf->y = -(cs->ascent);
- ink_buf->width = cs->rbearing - cs->lbearing;
- ink_buf->height = cs->ascent + cs->descent;
- ink_buf++;
-
- logical_buf->x = overall.width;
- logical_buf->y = -(font->ascent);
- logical_buf->width = cs->width;
- logical_buf->height = font->ascent + font->descent;
- logical_buf++;
-
- if (first) {
- overall = *cs;
- first = False;
- } else {
- overall.ascent = max(overall.ascent, cs->ascent);
- overall.descent = max(overall.descent, cs->descent);
- overall.lbearing = min(overall.lbearing,
- overall.width + cs->lbearing);
- overall.rbearing = max(overall.rbearing,
- overall.width + cs->rbearing);
- overall.width += cs->width;
- }
-
- (*num_chars)++;
- }
- }
-
- if (require_num) {
- *num_chars = require_num;
- return 0;
- } else {
- if (overall_ink) {
- overall_ink->x = overall.lbearing;
- overall_ink->y = -(overall.ascent);
- overall_ink->width = overall.rbearing - overall.lbearing;
- overall_ink->height = overall.ascent + overall.descent;
- }
-
- if (overall_logical) {
- overall_logical->x = 0;
- overall_logical->y = -(logical_ascent);
- overall_logical->width = overall.width;
- overall_logical->height = logical_ascent + logical_descent;
- }
- }
-
- return 1;
-}
-
-Status
-_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *ink_buf, XRectangle *logical_buf,
- int buf_size, int *num_chars,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- return _XomGenericTextPerCharExtents(oc, XOMMultiByte, (XPointer) text,
- length, ink_buf, logical_buf, buf_size,
- num_chars, overall_ink,
- overall_logical);
-}
-
-Status
-_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
- XRectangle *ink_buf, XRectangle *logical_buf,
- int buf_size, int *num_chars,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- return _XomGenericTextPerCharExtents(oc, XOMWideChar, (XPointer) text,
- length, ink_buf, logical_buf, buf_size,
- num_chars, overall_ink,
- overall_logical);
-}
-
-Status
-_Xutf8GenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
- XRectangle *ink_buf, XRectangle *logical_buf,
- int buf_size, int *num_chars,
- XRectangle *overall_ink,
- XRectangle *overall_logical)
-{
- return _XomGenericTextPerCharExtents(oc, XOMUtf8String, (XPointer) text,
- length, ink_buf, logical_buf, buf_size,
- num_chars, overall_ink,
- overall_logical);
-}
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+static Status
+_XomGenericTextPerCharExtents(
+ XOC oc,
+ XOMTextType type,
+ XPointer text,
+ int length,
+ XRectangle *ink_buf,
+ XRectangle *logical_buf,
+ int buf_size,
+ int *num_chars,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ XlcConv conv;
+ XFontStruct *font;
+ Bool is_xchar2b;
+ XPointer args[2];
+ XChar2b xchar2b_buf[BUFSIZ], *xchar2b_ptr;
+ char *xchar_ptr = NULL;
+ XCharStruct *def, *cs, overall;
+ int buf_len, left, require_num;
+ int logical_ascent, logical_descent;
+ Bool first = True;
+
+ conv = _XomInitConverter(oc, type);
+ if (conv == NULL)
+ return 0;
+
+ bzero((char *) &overall, sizeof(XCharStruct));
+ logical_ascent = logical_descent = require_num = *num_chars = 0;
+
+ args[0] = (XPointer) &font;
+ args[1] = (XPointer) &is_xchar2b;
+
+ while (length > 0) {
+ xchar2b_ptr = xchar2b_buf;
+ left = buf_len = BUFSIZ;
+
+ if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+ (XPointer *) &xchar2b_ptr, &left, args, 2) < 0)
+ break;
+ buf_len -= left;
+
+ if (require_num) {
+ require_num += buf_len;
+ continue;
+ }
+ if (buf_size < buf_len) {
+ require_num = *num_chars + buf_len;
+ continue;
+ }
+ buf_size -= buf_len;
+
+ if (first) {
+ logical_ascent = font->ascent;
+ logical_descent = font->descent;
+ } else {
+ logical_ascent = max(logical_ascent, font->ascent);
+ logical_descent = max(logical_descent, font->descent);
+ }
+
+ if (is_xchar2b) {
+ CI_GET_DEFAULT_INFO_2D(font, def)
+ xchar2b_ptr = xchar2b_buf;
+ } else {
+ CI_GET_DEFAULT_INFO_1D(font, def)
+ xchar_ptr = (char *) xchar2b_buf;
+ }
+
+ while (buf_len-- > 0) {
+ if (is_xchar2b) {
+ CI_GET_CHAR_INFO_2D(font, xchar2b_ptr->byte1,
+ xchar2b_ptr->byte2, def, cs)
+ xchar2b_ptr++;
+ } else {
+ CI_GET_CHAR_INFO_1D(font, *xchar_ptr, def, cs)
+ xchar_ptr++;
+ }
+ if (cs == NULL)
+ continue;
+
+ ink_buf->x = overall.width + cs->lbearing;
+ ink_buf->y = -(cs->ascent);
+ ink_buf->width = cs->rbearing - cs->lbearing;
+ ink_buf->height = cs->ascent + cs->descent;
+ ink_buf++;
+
+ logical_buf->x = overall.width;
+ logical_buf->y = -(font->ascent);
+ logical_buf->width = cs->width;
+ logical_buf->height = font->ascent + font->descent;
+ logical_buf++;
+
+ if (first) {
+ overall = *cs;
+ first = False;
+ } else {
+ overall.ascent = max(overall.ascent, cs->ascent);
+ overall.descent = max(overall.descent, cs->descent);
+ overall.lbearing = min(overall.lbearing,
+ overall.width + cs->lbearing);
+ overall.rbearing = max(overall.rbearing,
+ overall.width + cs->rbearing);
+ overall.width += cs->width;
+ }
+
+ (*num_chars)++;
+ }
+ }
+
+ if (require_num) {
+ *num_chars = require_num;
+ return 0;
+ } else {
+ if (overall_ink) {
+ overall_ink->x = overall.lbearing;
+ overall_ink->y = -(overall.ascent);
+ overall_ink->width = overall.rbearing - overall.lbearing;
+ overall_ink->height = overall.ascent + overall.descent;
+ }
+
+ if (overall_logical) {
+ overall_logical->x = 0;
+ overall_logical->y = -(logical_ascent);
+ overall_logical->width = overall.width;
+ overall_logical->height = logical_ascent + logical_descent;
+ }
+ }
+
+ return 1;
+}
+
+Status
+_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *ink_buf, XRectangle *logical_buf,
+ int buf_size, int *num_chars,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ return _XomGenericTextPerCharExtents(oc, XOMMultiByte, (XPointer) text,
+ length, ink_buf, logical_buf, buf_size,
+ num_chars, overall_ink,
+ overall_logical);
+}
+
+Status
+_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
+ XRectangle *ink_buf, XRectangle *logical_buf,
+ int buf_size, int *num_chars,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ return _XomGenericTextPerCharExtents(oc, XOMWideChar, (XPointer) text,
+ length, ink_buf, logical_buf, buf_size,
+ num_chars, overall_ink,
+ overall_logical);
+}
+
+Status
+_Xutf8GenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+ XRectangle *ink_buf, XRectangle *logical_buf,
+ int buf_size, int *num_chars,
+ XRectangle *overall_ink,
+ XRectangle *overall_logical)
+{
+ return _XomGenericTextPerCharExtents(oc, XOMUtf8String, (XPointer) text,
+ length, ink_buf, logical_buf, buf_size,
+ num_chars, overall_ink,
+ overall_logical);
+}
diff --git a/libX11/modules/om/generic/omXChar.c b/libX11/modules/om/generic/omXChar.c
index ff517d5e5..61c8c0b89 100644
--- a/libX11/modules/om/generic/omXChar.c
+++ b/libX11/modules/om/generic/omXChar.c
@@ -1,477 +1,477 @@
-/*
- * Copyright 1992, 1993 by TOSHIBA Corp.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of TOSHIBA not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. TOSHIBA make no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author: Katsuhisa Yano TOSHIBA Corp.
- * mopi@osa.ilab.toshiba.co.jp
- */
-/*
- * Copyright 1995 by FUJITSU LIMITED
- * This is source code modified by FUJITSU LIMITED under the Joint
- * Development Agreement for the CDE/Motif PST.
- *
- * Modifier: Takanori Tateno FUJITSU LIMITED
- *
- */
-/*
- * Modifiers: Jeff Walls, Paul Anderson (HEWLETT-PACKARD)
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include "XlcPublic.h"
-#include "XomGeneric.h"
-#include <stdio.h>
-
-/* for VW/UDC start */
-static Bool
-ismatch_scopes(
- FontData fontdata,
- unsigned long *value,
- Bool is_shift)
-{
- register int scopes_num = fontdata->scopes_num;
- FontScope scopes = fontdata->scopes;
- if (!scopes_num)
- return False;
-
- if(fontdata->font == NULL)
- return False;
-
- for(;scopes_num--;scopes++)
- if ((scopes->start <= (*value & 0x7f7f)) &&
- ((scopes->end) >= (*value & 0x7f7f))){
- if(is_shift == True) {
- if(scopes->shift){
- if(scopes->shift_direction == '+'){
- *value += scopes->shift ;
- } else if( scopes->shift_direction == '-'){
- *value -= scopes->shift ;
- }
- }
- }
- return True;
- }
-
- return False;
-}
-
-static int
-check_vertical_fonttype(
- char *name)
-{
- char *ptr;
- int type = 0;
-
- if(name == (char *)NULL || (int) strlen(name) <= 0)
- return False;
-
- /* Obtains the pointer of CHARSET_ENCODING_FIELD. */
- if((ptr = strchr(name, '-')) == (char *) NULL)
- return False;
- ptr++;
-
- /* Obtains the pointer of vertical_map font type. */
- if((ptr = strchr(ptr, '.')) == (char *) NULL)
- return False;
- ptr++;
-
- switch(*ptr) {
- case '1':
- type = 1; break;
- case '2':
- type = 2; break;
- case '3':
- type = 3; break;
- }
- return type;
-}
-
-/*
-*/
-#define VMAP 0
-#define VROTATE 1
-#define FONTSCOPE 2
-
-FontData
-_XomGetFontDataFromFontSet(
- FontSet fs,
- unsigned char *str,
- int len,
- int *len_ret,
- int is2b,
- int type) /* VMAP , VROTATE , else */
-{
- unsigned long value;
- int num,i,hit,csize;
- FontData fontdata;
- unsigned char *c;
- int vfont_type;
-
- c = str;
- hit = -1;
- if(type == VMAP){
- fontdata = fs->vmap;
- num = fs->vmap_num;
- } else if(type == VROTATE){
- fontdata = (FontData)fs->vrotate;
- num = fs->vrotate_num;
- } else {
- if(fs->font_data_count <= 0 || fs->font_data == (FontData)NULL) {
- fontdata = fs->substitute;
- num = fs->substitute_num;
- }else {
- fontdata = fs->font_data;
- num = fs->font_data_count;
- }
- /* CDExc20229 fix */
- if(fontdata == NULL || num == 0){
- return(NULL);
- }
- }
-
-
- if(is2b){
- csize = 2;
- } else {
- csize = 1;
- }
-
- for(;len;len--){
- if(is2b){
- value = (((unsigned long)*c) << 8)|(unsigned long)*(c + 1);
- } else {
- value = (unsigned long)*c;
- }
-
- /* ### NOTE: This routine DOES NOT WORK!
- * ### We can work around the problem in the calling routine,
- * ### but we really need to understand this better. As it
- * ### stands, the algorithm ALWAYS returns "fontdata[0]"
- * ### for non-VW text! This is clearly wrong. In fact,
- * ### given the new parse_font[name|data]() algorithms,
- * ### we may not even need this routine to do anything
- * ### for non-VW text (since font_set->font always contains
- * ### the best font for this fontset). -- jjw/pma (HP)
- */
- for (i=0;i<num;i++) {
- if(type == VROTATE) {
- if(fontdata[i].font) {
- /* If the num_cr equal zero, all character is rotated. */
- if(fontdata[i].scopes_num == 0) {
- break;
- } else {
- /* The vertical rotate glyph is not have code shift. */
- if (ismatch_scopes(&(fontdata[i]),&value,False)) {
- break;
- }
- }
- }
- } else if(type == VMAP) {
- if(fontdata[i].font) {
- vfont_type = check_vertical_fonttype(fontdata[i].name);
- if(vfont_type == 0 || vfont_type == 1) {
- break;
- } else if(vfont_type == 2 || vfont_type == 3) {
- if(fontdata[i].scopes_num <= 0)
- break;
-
- if (ismatch_scopes(&(fontdata[i]),&value,True)) {
- break;
- }
- }
- }
- } else { /* FONTSCOPE */
- if(fontdata[i].font) {
- if(fontdata[i].scopes_num <= 0)
- break;
- if (ismatch_scopes(&(fontdata[i]),&value,True)){
- break;
- }
- }
- }
- }
- if((hit != -1) && (i != hit)){
- break;
- }
- if(i == num){
- if( type == VROTATE || type == VMAP){
- /* Change 1996.01.23 start */
- if(fs->font_data_count <= 0 ||
- fs->font_data == (FontData)NULL)
- fontdata = fs->substitute;
- else
- fontdata = fs->font_data;
- /* Change 1996.01.23 end */
- }
- hit = 0;
- c += csize;
- break;
- }
- if( hit == -1 ) hit = i;
- if(is2b){
- *c = (unsigned char)(value >> 8);
- *(c + 1) = (unsigned char)(value);
- } else {
- *c = (unsigned char)value;
- }
- c += csize;
- }
- *len_ret = (c - str);
- return(&(fontdata[hit]));
-}
-/* for VW/UDC end */
-
-static FontSet
-_XomGetFontSetFromCharSet(
- XOC oc,
- XlcCharSet charset)
-{
- register FontSet font_set = XOC_GENERIC(oc)->font_set;
- register int num = XOC_GENERIC(oc)->font_set_num;
- XlcCharSet *charset_list;
- int charset_count;
-
- for ( ; num-- > 0; font_set++) {
- charset_count = font_set->charset_count;
- charset_list = font_set->charset_list;
- for ( ; charset_count-- > 0; charset_list++)
- if (*charset_list == charset)
- return font_set;
- }
-
- return (FontSet) NULL;
-}
-
-#ifdef MUSTCOPY
-static void
-cs_to_xchar2b(
- register char *from,
- register XChar2b *to,
- register length)
-{
- while (length-- > 0) {
- to->byte1 = *from++;
- to->byte2 = *from++;
- to++;
- }
-}
-
-static void
-cs_to_xchar2b_gl(
- register char *from,
- register XChar2b *to,
- register length)
-{
- while (length-- > 0) {
- to->byte1 = *from++ & 0x7f;
- to->byte2 = *from++ & 0x7f;
- to++;
- }
-}
-
-static void
-cs_to_xchar2b_gr(
- register char *from,
- register XChar2b *to,
- register length)
-{
- while (length-- > 0) {
- to->byte1 = *from++ | 0x80;
- to->byte2 = *from++ | 0x80;
- to++;
- }
-}
-#endif
-
-static void
-shift_to_gl(
- register char *text,
- register int length)
-{
- while (length-- > 0)
- *text++ &= 0x7f;
-}
-
-static void
-shift_to_gr(
- register char *text,
- register int length)
-{
- while (length-- > 0)
- *text++ |= 0x80;
-}
-
-static Bool
-load_font(
- XOC oc,
- FontSet font_set)
-{
- font_set->font = XLoadQueryFont(oc->core.om->core.display,
- oc->core.font_info.font_name_list[font_set->id]);
- if (font_set->font == NULL)
- return False;
-
- oc->core.font_info.font_struct_list[font_set->id] = font_set->font;
- XFreeFontInfo(NULL, font_set->info, 1);
- font_set->info = NULL;
-
- if (font_set->font->min_byte1 || font_set->font->max_byte1)
- font_set->is_xchar2b = True;
- else
- font_set->is_xchar2b = False;
-
- return True;
-}
-
-int
-_XomConvert(
- XOC oc,
- XlcConv conv,
- XPointer *from,
- int *from_left,
- XPointer *to,
- int *to_left,
- XPointer *args,
- int num_args)
-{
- XPointer cs, lc_args[1];
- XlcCharSet charset;
- int length, cs_left, ret;
- FontSet font_set;
-#ifdef MUSTCOPY
- XChar2b *xchar2b;
- char *buf, buf_local[BUFSIZ];
-#endif
-
- cs = *to;
- cs_left = *to_left;
- lc_args[0] = (XPointer) &charset;
-
- ret = _XlcConvert(conv, from, from_left, &cs, &cs_left, lc_args, 1);
- if (ret < 0)
- return -1;
-
- font_set = _XomGetFontSetFromCharSet(oc, charset);
- if (font_set == NULL)
- return -1;
-
- if (font_set->font == NULL && load_font(oc, font_set) == False)
- return -1;
-
- length = *to_left - cs_left;
-
-#ifdef MUSTCOPY
- if (font_set->is_xchar2b) {
- buf = (length > BUFSIZ) ? Xmalloc(length) : buf_local;
- if (buf == NULL)
- return -1;
- memcpy(buf, (char *) *to, length);
-
- xchar2b = (XChar2b *) *to;
- length >>= 1;
-
- if (font_set->side == charset->side)
- cs_to_xchar2b(buf, xchar2b, length);
- else if (font_set->side == XlcGL)
- cs_to_xchar2b_gl(buf, xchar2b, length);
- else if (font_set->side == XlcGR)
- cs_to_xchar2b_gr(buf, xchar2b, length);
- else
- cs_to_xchar2b(buf, xchar2b, length);
-
- if (buf != buf_local)
- Xfree(buf);
-
- *to = (XPointer) (xchar2b + length);
- *to_left -= length;
- } else
-#endif
- {
- if (font_set->side != charset->side) {
- if (font_set->side == XlcGL)
- shift_to_gl(*to, length);
- else if (font_set->side == XlcGR)
- shift_to_gr(*to, length);
- }
-
- if (font_set->is_xchar2b)
- length >>= 1;
- *to = cs;
- *to_left -= length;
- }
-
- *((XFontStruct **) args[0]) = font_set->font;
- *((Bool *) args[1]) = font_set->is_xchar2b;
- if(num_args >= 3){
- *((FontSet *) args[2]) = font_set;
- }
-
- return ret;
-}
-
-XlcConv
-_XomInitConverter(
- XOC oc,
- XOMTextType type)
-{
- XOCGenericPart *gen = XOC_GENERIC(oc);
- XlcConv *convp;
- const char *conv_type;
- XlcConv conv;
- XLCd lcd;
-
- switch (type) {
- case XOMWideChar:
- convp = &gen->wcs_to_cs;
- conv_type = XlcNWideChar;
- break;
- case XOMMultiByte:
- convp = &gen->mbs_to_cs;
- conv_type = XlcNMultiByte;
- break;
- case XOMUtf8String:
- convp = &gen->utf8_to_cs;
- conv_type = XlcNUtf8String;
- break;
- default:
- return (XlcConv) NULL;
- }
-
- conv = *convp;
- if (conv) {
- _XlcResetConverter(conv);
- return conv;
- }
-
- lcd = oc->core.om->core.lcd;
-
- conv = _XlcOpenConverter(lcd, conv_type, lcd, XlcNFontCharSet);
- if (conv == (XlcConv) NULL) {
- conv = _XlcOpenConverter(lcd, conv_type, lcd, XlcNCharSet);
- if (conv == (XlcConv) NULL)
- return (XlcConv) NULL;
- }
-
- *convp = conv;
- return conv;
-}
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Author: Katsuhisa Yano TOSHIBA Corp.
+ * mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno FUJITSU LIMITED
+ *
+ */
+/*
+ * Modifiers: Jeff Walls, Paul Anderson (HEWLETT-PACKARD)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPublic.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+/* for VW/UDC start */
+static Bool
+ismatch_scopes(
+ FontData fontdata,
+ unsigned long *value,
+ Bool is_shift)
+{
+ register int scopes_num = fontdata->scopes_num;
+ FontScope scopes = fontdata->scopes;
+ if (!scopes_num)
+ return False;
+
+ if(fontdata->font == NULL)
+ return False;
+
+ for(;scopes_num--;scopes++)
+ if ((scopes->start <= (*value & 0x7f7f)) &&
+ ((scopes->end) >= (*value & 0x7f7f))){
+ if(is_shift == True) {
+ if(scopes->shift){
+ if(scopes->shift_direction == '+'){
+ *value += scopes->shift ;
+ } else if( scopes->shift_direction == '-'){
+ *value -= scopes->shift ;
+ }
+ }
+ }
+ return True;
+ }
+
+ return False;
+}
+
+static int
+check_vertical_fonttype(
+ char *name)
+{
+ char *ptr;
+ int type = 0;
+
+ if(name == (char *)NULL || (int) strlen(name) <= 0)
+ return False;
+
+ /* Obtains the pointer of CHARSET_ENCODING_FIELD. */
+ if((ptr = strchr(name, '-')) == (char *) NULL)
+ return False;
+ ptr++;
+
+ /* Obtains the pointer of vertical_map font type. */
+ if((ptr = strchr(ptr, '.')) == (char *) NULL)
+ return False;
+ ptr++;
+
+ switch(*ptr) {
+ case '1':
+ type = 1; break;
+ case '2':
+ type = 2; break;
+ case '3':
+ type = 3; break;
+ }
+ return type;
+}
+
+/*
+*/
+#define VMAP 0
+#define VROTATE 1
+#define FONTSCOPE 2
+
+FontData
+_XomGetFontDataFromFontSet(
+ FontSet fs,
+ unsigned char *str,
+ int len,
+ int *len_ret,
+ int is2b,
+ int type) /* VMAP , VROTATE , else */
+{
+ unsigned long value;
+ int num,i,hit,csize;
+ FontData fontdata;
+ unsigned char *c;
+ int vfont_type;
+
+ c = str;
+ hit = -1;
+ if(type == VMAP){
+ fontdata = fs->vmap;
+ num = fs->vmap_num;
+ } else if(type == VROTATE){
+ fontdata = (FontData)fs->vrotate;
+ num = fs->vrotate_num;
+ } else {
+ if(fs->font_data_count <= 0 || fs->font_data == (FontData)NULL) {
+ fontdata = fs->substitute;
+ num = fs->substitute_num;
+ }else {
+ fontdata = fs->font_data;
+ num = fs->font_data_count;
+ }
+ /* CDExc20229 fix */
+ if(fontdata == NULL || num == 0){
+ return(NULL);
+ }
+ }
+
+
+ if(is2b){
+ csize = 2;
+ } else {
+ csize = 1;
+ }
+
+ for(;len;len--){
+ if(is2b){
+ value = (((unsigned long)*c) << 8)|(unsigned long)*(c + 1);
+ } else {
+ value = (unsigned long)*c;
+ }
+
+ /* ### NOTE: This routine DOES NOT WORK!
+ * ### We can work around the problem in the calling routine,
+ * ### but we really need to understand this better. As it
+ * ### stands, the algorithm ALWAYS returns "fontdata[0]"
+ * ### for non-VW text! This is clearly wrong. In fact,
+ * ### given the new parse_font[name|data]() algorithms,
+ * ### we may not even need this routine to do anything
+ * ### for non-VW text (since font_set->font always contains
+ * ### the best font for this fontset). -- jjw/pma (HP)
+ */
+ for (i=0;i<num;i++) {
+ if(type == VROTATE) {
+ if(fontdata[i].font) {
+ /* If the num_cr equal zero, all character is rotated. */
+ if(fontdata[i].scopes_num == 0) {
+ break;
+ } else {
+ /* The vertical rotate glyph is not have code shift. */
+ if (ismatch_scopes(&(fontdata[i]),&value,False)) {
+ break;
+ }
+ }
+ }
+ } else if(type == VMAP) {
+ if(fontdata[i].font) {
+ vfont_type = check_vertical_fonttype(fontdata[i].name);
+ if(vfont_type == 0 || vfont_type == 1) {
+ break;
+ } else if(vfont_type == 2 || vfont_type == 3) {
+ if(fontdata[i].scopes_num <= 0)
+ break;
+
+ if (ismatch_scopes(&(fontdata[i]),&value,True)) {
+ break;
+ }
+ }
+ }
+ } else { /* FONTSCOPE */
+ if(fontdata[i].font) {
+ if(fontdata[i].scopes_num <= 0)
+ break;
+ if (ismatch_scopes(&(fontdata[i]),&value,True)){
+ break;
+ }
+ }
+ }
+ }
+ if((hit != -1) && (i != hit)){
+ break;
+ }
+ if(i == num){
+ if( type == VROTATE || type == VMAP){
+ /* Change 1996.01.23 start */
+ if(fs->font_data_count <= 0 ||
+ fs->font_data == (FontData)NULL)
+ fontdata = fs->substitute;
+ else
+ fontdata = fs->font_data;
+ /* Change 1996.01.23 end */
+ }
+ hit = 0;
+ c += csize;
+ break;
+ }
+ if( hit == -1 ) hit = i;
+ if(is2b){
+ *c = (unsigned char)(value >> 8);
+ *(c + 1) = (unsigned char)(value);
+ } else {
+ *c = (unsigned char)value;
+ }
+ c += csize;
+ }
+ *len_ret = (c - str);
+ return(&(fontdata[hit]));
+}
+/* for VW/UDC end */
+
+static FontSet
+_XomGetFontSetFromCharSet(
+ XOC oc,
+ XlcCharSet charset)
+{
+ register FontSet font_set = XOC_GENERIC(oc)->font_set;
+ register int num = XOC_GENERIC(oc)->font_set_num;
+ XlcCharSet *charset_list;
+ int charset_count;
+
+ for ( ; num-- > 0; font_set++) {
+ charset_count = font_set->charset_count;
+ charset_list = font_set->charset_list;
+ for ( ; charset_count-- > 0; charset_list++)
+ if (*charset_list == charset)
+ return font_set;
+ }
+
+ return (FontSet) NULL;
+}
+
+#ifdef MUSTCOPY
+static void
+cs_to_xchar2b(
+ register char *from,
+ register XChar2b *to,
+ register length)
+{
+ while (length-- > 0) {
+ to->byte1 = *from++;
+ to->byte2 = *from++;
+ to++;
+ }
+}
+
+static void
+cs_to_xchar2b_gl(
+ register char *from,
+ register XChar2b *to,
+ register length)
+{
+ while (length-- > 0) {
+ to->byte1 = *from++ & 0x7f;
+ to->byte2 = *from++ & 0x7f;
+ to++;
+ }
+}
+
+static void
+cs_to_xchar2b_gr(
+ register char *from,
+ register XChar2b *to,
+ register length)
+{
+ while (length-- > 0) {
+ to->byte1 = *from++ | 0x80;
+ to->byte2 = *from++ | 0x80;
+ to++;
+ }
+}
+#endif
+
+static void
+shift_to_gl(
+ register char *text,
+ register int length)
+{
+ while (length-- > 0)
+ *text++ &= 0x7f;
+}
+
+static void
+shift_to_gr(
+ register char *text,
+ register int length)
+{
+ while (length-- > 0)
+ *text++ |= 0x80;
+}
+
+static Bool
+load_font(
+ XOC oc,
+ FontSet font_set)
+{
+ font_set->font = XLoadQueryFont(oc->core.om->core.display,
+ oc->core.font_info.font_name_list[font_set->id]);
+ if (font_set->font == NULL)
+ return False;
+
+ oc->core.font_info.font_struct_list[font_set->id] = font_set->font;
+ XFreeFontInfo(NULL, font_set->info, 1);
+ font_set->info = NULL;
+
+ if (font_set->font->min_byte1 || font_set->font->max_byte1)
+ font_set->is_xchar2b = True;
+ else
+ font_set->is_xchar2b = False;
+
+ return True;
+}
+
+int
+_XomConvert(
+ XOC oc,
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer cs, lc_args[1];
+ XlcCharSet charset;
+ int length, cs_left, ret;
+ FontSet font_set;
+#ifdef MUSTCOPY
+ XChar2b *xchar2b;
+ char *buf, buf_local[BUFSIZ];
+#endif
+
+ cs = *to;
+ cs_left = *to_left;
+ lc_args[0] = (XPointer) &charset;
+
+ ret = _XlcConvert(conv, from, from_left, &cs, &cs_left, lc_args, 1);
+ if (ret < 0)
+ return -1;
+
+ font_set = _XomGetFontSetFromCharSet(oc, charset);
+ if (font_set == NULL)
+ return -1;
+
+ if (font_set->font == NULL && load_font(oc, font_set) == False)
+ return -1;
+
+ length = *to_left - cs_left;
+
+#ifdef MUSTCOPY
+ if (font_set->is_xchar2b) {
+ buf = (length > BUFSIZ) ? Xmalloc(length) : buf_local;
+ if (buf == NULL)
+ return -1;
+ memcpy(buf, (char *) *to, length);
+
+ xchar2b = (XChar2b *) *to;
+ length >>= 1;
+
+ if (font_set->side == charset->side)
+ cs_to_xchar2b(buf, xchar2b, length);
+ else if (font_set->side == XlcGL)
+ cs_to_xchar2b_gl(buf, xchar2b, length);
+ else if (font_set->side == XlcGR)
+ cs_to_xchar2b_gr(buf, xchar2b, length);
+ else
+ cs_to_xchar2b(buf, xchar2b, length);
+
+ if (buf != buf_local)
+ Xfree(buf);
+
+ *to = (XPointer) (xchar2b + length);
+ *to_left -= length;
+ } else
+#endif
+ {
+ if (font_set->side != charset->side) {
+ if (font_set->side == XlcGL)
+ shift_to_gl(*to, length);
+ else if (font_set->side == XlcGR)
+ shift_to_gr(*to, length);
+ }
+
+ if (font_set->is_xchar2b)
+ length >>= 1;
+ *to = cs;
+ *to_left -= length;
+ }
+
+ *((XFontStruct **) args[0]) = font_set->font;
+ *((Bool *) args[1]) = font_set->is_xchar2b;
+ if(num_args >= 3){
+ *((FontSet *) args[2]) = font_set;
+ }
+
+ return ret;
+}
+
+XlcConv
+_XomInitConverter(
+ XOC oc,
+ XOMTextType type)
+{
+ XOCGenericPart *gen = XOC_GENERIC(oc);
+ XlcConv *convp;
+ const char *conv_type;
+ XlcConv conv;
+ XLCd lcd;
+
+ switch (type) {
+ case XOMWideChar:
+ convp = &gen->wcs_to_cs;
+ conv_type = XlcNWideChar;
+ break;
+ case XOMMultiByte:
+ convp = &gen->mbs_to_cs;
+ conv_type = XlcNMultiByte;
+ break;
+ case XOMUtf8String:
+ convp = &gen->utf8_to_cs;
+ conv_type = XlcNUtf8String;
+ break;
+ default:
+ return (XlcConv) NULL;
+ }
+
+ conv = *convp;
+ if (conv) {
+ _XlcResetConverter(conv);
+ return conv;
+ }
+
+ lcd = oc->core.om->core.lcd;
+
+ conv = _XlcOpenConverter(lcd, conv_type, lcd, XlcNFontCharSet);
+ if (conv == (XlcConv) NULL) {
+ conv = _XlcOpenConverter(lcd, conv_type, lcd, XlcNCharSet);
+ if (conv == (XlcConv) NULL)
+ return (XlcConv) NULL;
+ }
+
+ *convp = conv;
+ return conv;
+}