diff options
author | marha <marha@users.sourceforge.net> | 2011-04-27 15:56:59 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2011-04-27 15:56:59 +0000 |
commit | 100633b3e7619842f345cb7603b0db6b5761dd11 (patch) | |
tree | 3c3af754c7e801c07263269837d6a05072ff834c /libX11/modules | |
parent | 205a4bdae76f287126db9f45a4f0ba631e3efca1 (diff) | |
parent | 96d6df5da9cddedf4931bf8e17f96e242467c661 (diff) | |
download | vcxsrv-100633b3e7619842f345cb7603b0db6b5761dd11.tar.gz vcxsrv-100633b3e7619842f345cb7603b0db6b5761dd11.tar.bz2 vcxsrv-100633b3e7619842f345cb7603b0db6b5761dd11.zip |
svn merge ^/branches/released .
Diffstat (limited to 'libX11/modules')
-rw-r--r-- | libX11/modules/im/ximcp/imDefIc.c | 3 | ||||
-rw-r--r-- | libX11/modules/im/ximcp/imInt.c | 529 | ||||
-rw-r--r-- | libX11/modules/im/ximcp/imLcIc.c | 3 | ||||
-rw-r--r-- | libX11/modules/im/ximcp/imRm.c | 6405 | ||||
-rw-r--r-- | libX11/modules/im/ximcp/imRmAttr.c | 15 | ||||
-rw-r--r-- | libX11/modules/im/ximcp/imThaiIc.c | 455 | ||||
-rw-r--r-- | libX11/modules/im/ximcp/imTrX.c | 1037 | ||||
-rw-r--r-- | libX11/modules/im/ximcp/imTrans.c | 7 | ||||
-rw-r--r-- | libX11/modules/lc/gen/lcGenConv.c | 6297 | ||||
-rw-r--r-- | libX11/modules/lc/xlocale/lcJis.c | 1889 | ||||
-rw-r--r-- | libX11/modules/om/generic/omGeneric.c | 59 |
11 files changed, 8323 insertions, 8376 deletions
diff --git a/libX11/modules/im/ximcp/imDefIc.c b/libX11/modules/im/ximcp/imDefIc.c index 27e04e11c..cd3ed5854 100644 --- a/libX11/modules/im/ximcp/imDefIc.c +++ b/libX11/modules/im/ximcp/imDefIc.c @@ -1425,10 +1425,9 @@ _XimProtoCreateIC( if (!(_XimGetInputStyle(arg, &input_style)))
return (XIC)NULL;
- if ((ic = (Xic)Xmalloc(sizeof(XicRec))) == (Xic)NULL)
+ if ((ic = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL)
return (XIC)NULL;
- bzero((char *)ic, sizeof(XicRec));
ic->methods = &ic_methods;
ic->core.im = (XIM)im;
ic->core.input_style = input_style;
diff --git a/libX11/modules/im/ximcp/imInt.c b/libX11/modules/im/ximcp/imInt.c index b19809237..f4ce9cea0 100644 --- a/libX11/modules/im/ximcp/imInt.c +++ b/libX11/modules/im/ximcp/imInt.c @@ -1,266 +1,263 @@ -/****************************************************************** - - Copyright 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 <X11/Xatom.h> -#include <X11/Xlib.h> -#include <X11/Xmd.h> -#include "Xlibint.h" -#include "Xlcint.h" -#include "Ximint.h" -#include "XimImSw.h" - -Private Xim *_XimCurrentIMlist = (Xim *)NULL; -Private int _XimCurrentIMcount = 0; - -Private Bool -_XimSetIMStructureList( - Xim im) -{ - register int i; - Xim *xim; - - if(!(_XimCurrentIMlist)) { - if(!(_XimCurrentIMlist = (Xim *)Xmalloc(sizeof(Xim)))) - return False; - _XimCurrentIMlist[0] = im; - _XimCurrentIMcount = 1; - } - else { - for(i = 0; i < _XimCurrentIMcount; i++) { - if(!( _XimCurrentIMlist[i])) { - _XimCurrentIMlist[i] = im; - break; - } - } - if(i >= _XimCurrentIMcount) { - if(!(xim = (Xim *)Xrealloc(_XimCurrentIMlist, - ((i + 1) * sizeof(Xim))))) - return False; - _XimCurrentIMlist = xim; - _XimCurrentIMlist[_XimCurrentIMcount] = im; - _XimCurrentIMcount++; - } - } - return True; -} - -Public void -_XimDestroyIMStructureList(Xim im) -{ - register int i; - - for(i = 0; i < _XimCurrentIMcount; i++) { - if(_XimCurrentIMlist[i] == im) { - _XimCurrentIMlist[i] = NULL; - break; - } - } - return; -} - -Public void -_XimServerDestroy(Xim im_2_destroy) -{ - register int i; - Xim im; - XIC ic; - - for(i = 0; i < _XimCurrentIMcount; i++) { - if(!(im = _XimCurrentIMlist[i])) - continue; - /* - * Only continue if this im is the one to be destroyed. - */ - if (im != im_2_destroy) - continue; - - if (im->core.destroy_callback.callback) - (*im->core.destroy_callback.callback)((XIM)im, - im->core.destroy_callback.client_data, NULL); - for (ic = im->core.ic_chain; ic; ic = ic->core.next) { - if (ic->core.destroy_callback.callback) { - (*ic->core.destroy_callback.callback)(ic, - ic->core.destroy_callback.client_data, NULL); - } - } - _XimResetIMInstantiateCallback( im ); - (void)im->methods->close((XIM)im); - Xfree(im); - _XimCurrentIMlist[i] = NULL; - return; - } -} - -#ifdef XIM_CONNECTABLE -Public void -_XimServerReconectableDestroy(void) -{ - register int i; - Xim im; - XIC ic; - - for(i = 0; i < _XimCurrentIMcount; i++) { - if(!(im = _XimCurrentIMlist[i])) - continue; - - if (im->core.destroy_callback.callback) - (*im->core.destroy_callback.callback)(im, - im->core.destroy_callback.client_data, NULL); - for (ic = im->core.ic_chain; ic; ic = ic->core.next) { - if (ic->core.destroy_callback.callback) { - (*ic->core.destroy_callback.callback)(ic, - ic->core.destroy_callback.client_data, NULL); - } - } - _XimResetIMInstantiateCallback( im ); - (void)im->methods->close((XIM)im); - } - return; -} -#endif /* XIM_CONNECTABLE */ - -Private const char * -_XimStrstr( - register const char *src, - register const char *dest) -{ - int len; - - len = strlen(dest); - while((src = strchr(src, *dest))) { - if(!strncmp(src, dest, len)) - return src; - src++; - } - return NULL; -} - -Private char * -_XimMakeImName( - XLCd lcd) -{ - const char* begin = NULL; - const char* end = NULL; - char* ret = NULL; - const char* ximmodifier = XIMMODIFIER; - - if(lcd->core->modifiers != NULL && *lcd->core->modifiers != '\0') { - begin = _XimStrstr(lcd->core->modifiers, ximmodifier); - if (begin != NULL) { - end = begin += strlen(ximmodifier); - while (*end && *end != '@') - end++; - } - } - ret = Xmalloc(end - begin + 1); - if (ret != NULL) { - if (begin != NULL && end != NULL) { - (void)strncpy(ret, begin, end - begin); - ret[end - begin] = '\0'; - } else { - ret[0] = '\0'; - } - } - - return ret; -} - -Public XIM -_XimOpenIM( - XLCd lcd, - Display *dpy, - XrmDatabase rdb, - char *res_name, - char *res_class) -{ - Xim im; - register int i; - - if (!(im = (Xim)Xmalloc(sizeof(XimRec)))) - return (XIM)NULL; - bzero(im, sizeof(XimRec)); - - im->core.lcd = lcd; - im->core.ic_chain = (XIC)NULL; - im->core.display = dpy; - im->core.rdb = rdb; - im->core.res_name = NULL; - im->core.res_class = NULL; - if((res_name != NULL) && (*res_name != '\0')){ - if(!(im->core.res_name = (char *)Xmalloc(strlen(res_name)+1))) - goto Error1; - strcpy(im->core.res_name,res_name); - } - if((res_class != NULL) && (*res_class != '\0')){ - if(!(im->core.res_class = (char *)Xmalloc(strlen(res_class)+1))) - goto Error2; - strcpy(im->core.res_class,res_class); - } - if(!(im->core.im_name = _XimMakeImName(lcd))) - goto Error3; - - for(i= 0; ; i++) { - if(_XimImSportRec[i].checkprocessing(im)) { - if(!(_XimImSportRec[i].im_open(im))) - goto Error4; - if(!_XimSetIMStructureList(im)) - goto Error4; - return (XIM)im; - } - } - -Error4 : - _XimImSportRec[i].im_free(im); - Xfree(im); - return NULL; -Error3 : - if(im->core.im_name) - Xfree(im->core.im_name); -Error2: - if(im->core.res_class) - Xfree(im->core.res_class); -Error1: - if(im->core.res_name) - Xfree(im->core.res_name); - Xfree(im); - return NULL; -} - -Public Bool -_XInitIM(XLCd lcd) -{ - if(lcd == (XLCd)NULL) - return False; - lcd->methods->open_im = _XimOpenIM; - lcd->methods->register_callback = _XimRegisterIMInstantiateCallback; - lcd->methods->unregister_callback = _XimUnRegisterIMInstantiateCallback; - return True; -} +/******************************************************************
+
+ Copyright 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 <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimImSw.h"
+
+Private Xim *_XimCurrentIMlist = (Xim *)NULL;
+Private int _XimCurrentIMcount = 0;
+
+Private Bool
+_XimSetIMStructureList(
+ Xim im)
+{
+ register int i;
+ Xim *xim;
+
+ if(!(_XimCurrentIMlist)) {
+ if(!(_XimCurrentIMlist = (Xim *)Xmalloc(sizeof(Xim))))
+ return False;
+ _XimCurrentIMlist[0] = im;
+ _XimCurrentIMcount = 1;
+ }
+ else {
+ for(i = 0; i < _XimCurrentIMcount; i++) {
+ if(!( _XimCurrentIMlist[i])) {
+ _XimCurrentIMlist[i] = im;
+ break;
+ }
+ }
+ if(i >= _XimCurrentIMcount) {
+ if(!(xim = (Xim *)Xrealloc(_XimCurrentIMlist,
+ ((i + 1) * sizeof(Xim)))))
+ return False;
+ _XimCurrentIMlist = xim;
+ _XimCurrentIMlist[_XimCurrentIMcount] = im;
+ _XimCurrentIMcount++;
+ }
+ }
+ return True;
+}
+
+Public void
+_XimDestroyIMStructureList(Xim im)
+{
+ register int i;
+
+ for(i = 0; i < _XimCurrentIMcount; i++) {
+ if(_XimCurrentIMlist[i] == im) {
+ _XimCurrentIMlist[i] = NULL;
+ break;
+ }
+ }
+ return;
+}
+
+Public void
+_XimServerDestroy(Xim im_2_destroy)
+{
+ register int i;
+ Xim im;
+ XIC ic;
+
+ for(i = 0; i < _XimCurrentIMcount; i++) {
+ if(!(im = _XimCurrentIMlist[i]))
+ continue;
+ /*
+ * Only continue if this im is the one to be destroyed.
+ */
+ if (im != im_2_destroy)
+ continue;
+
+ if (im->core.destroy_callback.callback)
+ (*im->core.destroy_callback.callback)((XIM)im,
+ im->core.destroy_callback.client_data, NULL);
+ for (ic = im->core.ic_chain; ic; ic = ic->core.next) {
+ if (ic->core.destroy_callback.callback) {
+ (*ic->core.destroy_callback.callback)(ic,
+ ic->core.destroy_callback.client_data, NULL);
+ }
+ }
+ _XimResetIMInstantiateCallback( im );
+ (void)im->methods->close((XIM)im);
+ Xfree(im);
+ _XimCurrentIMlist[i] = NULL;
+ return;
+ }
+}
+
+#ifdef XIM_CONNECTABLE
+Public void
+_XimServerReconectableDestroy(void)
+{
+ register int i;
+ Xim im;
+ XIC ic;
+
+ for(i = 0; i < _XimCurrentIMcount; i++) {
+ if(!(im = _XimCurrentIMlist[i]))
+ continue;
+
+ if (im->core.destroy_callback.callback)
+ (*im->core.destroy_callback.callback)(im,
+ im->core.destroy_callback.client_data, NULL);
+ for (ic = im->core.ic_chain; ic; ic = ic->core.next) {
+ if (ic->core.destroy_callback.callback) {
+ (*ic->core.destroy_callback.callback)(ic,
+ ic->core.destroy_callback.client_data, NULL);
+ }
+ }
+ _XimResetIMInstantiateCallback( im );
+ (void)im->methods->close((XIM)im);
+ }
+ return;
+}
+#endif /* XIM_CONNECTABLE */
+
+Private const char *
+_XimStrstr(
+ register const char *src,
+ register const char *dest)
+{
+ int len;
+
+ len = strlen(dest);
+ while((src = strchr(src, *dest))) {
+ if(!strncmp(src, dest, len))
+ return src;
+ src++;
+ }
+ return NULL;
+}
+
+Private char *
+_XimMakeImName(
+ XLCd lcd)
+{
+ const char* begin = NULL;
+ const char* end = NULL;
+ char* ret = NULL;
+ const char* ximmodifier = XIMMODIFIER;
+
+ if(lcd->core->modifiers != NULL && *lcd->core->modifiers != '\0') {
+ begin = _XimStrstr(lcd->core->modifiers, ximmodifier);
+ if (begin != NULL) {
+ end = begin += strlen(ximmodifier);
+ while (*end && *end != '@')
+ end++;
+ }
+ }
+ ret = Xmalloc(end - begin + 1);
+ if (ret != NULL) {
+ if (begin != NULL && end != NULL) {
+ (void)strncpy(ret, begin, end - begin);
+ ret[end - begin] = '\0';
+ } else {
+ ret[0] = '\0';
+ }
+ }
+
+ return ret;
+}
+
+Public XIM
+_XimOpenIM(
+ XLCd lcd,
+ Display *dpy,
+ XrmDatabase rdb,
+ char *res_name,
+ char *res_class)
+{
+ Xim im;
+ register int i;
+
+ if (!(im = Xcalloc(1, sizeof(XimRec))))
+ return (XIM)NULL;
+
+ im->core.lcd = lcd;
+ im->core.ic_chain = (XIC)NULL;
+ im->core.display = dpy;
+ im->core.rdb = rdb;
+ im->core.res_name = NULL;
+ im->core.res_class = NULL;
+ if((res_name != NULL) && (*res_name != '\0')){
+ if(!(im->core.res_name = strdup(res_name)))
+ goto Error1;
+ }
+ if((res_class != NULL) && (*res_class != '\0')){
+ if(!(im->core.res_class = strdup(res_class)))
+ goto Error2;
+ }
+ if(!(im->core.im_name = _XimMakeImName(lcd)))
+ goto Error3;
+
+ for(i= 0; ; i++) {
+ if(_XimImSportRec[i].checkprocessing(im)) {
+ if(!(_XimImSportRec[i].im_open(im)))
+ goto Error4;
+ if(!_XimSetIMStructureList(im))
+ goto Error4;
+ return (XIM)im;
+ }
+ }
+
+Error4 :
+ _XimImSportRec[i].im_free(im);
+ Xfree(im);
+ return NULL;
+Error3 :
+ if(im->core.im_name)
+ Xfree(im->core.im_name);
+Error2:
+ if(im->core.res_class)
+ Xfree(im->core.res_class);
+Error1:
+ if(im->core.res_name)
+ Xfree(im->core.res_name);
+ Xfree(im);
+ return NULL;
+}
+
+Public Bool
+_XInitIM(XLCd lcd)
+{
+ if(lcd == (XLCd)NULL)
+ return False;
+ lcd->methods->open_im = _XimOpenIM;
+ lcd->methods->register_callback = _XimRegisterIMInstantiateCallback;
+ lcd->methods->unregister_callback = _XimUnRegisterIMInstantiateCallback;
+ return True;
+}
diff --git a/libX11/modules/im/ximcp/imLcIc.c b/libX11/modules/im/ximcp/imLcIc.c index 04de3c1bd..5cdd7d59d 100644 --- a/libX11/modules/im/ximcp/imLcIc.c +++ b/libX11/modules/im/ximcp/imLcIc.c @@ -143,10 +143,9 @@ _XimLocalCreateIC( unsigned int num;
int len;
- if((ic = (Xic)Xmalloc(sizeof(XicRec))) == (Xic)NULL) {
+ if((ic = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL) {
return ((XIC)NULL);
}
- bzero((char *)ic, sizeof(XicRec));
ic->methods = &Local_ic_methods;
ic->core.im = im;
diff --git a/libX11/modules/im/ximcp/imRm.c b/libX11/modules/im/ximcp/imRm.c index 3d09b8136..a20c23787 100644 --- a/libX11/modules/im/ximcp/imRm.c +++ b/libX11/modules/im/ximcp/imRm.c @@ -1,3209 +1,3196 @@ -/****************************************************************** - - Copyright 1990, 1991, 1992,1993, 1994 by FUJITSU LIMITED - 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 -and Sony Corporation not be used in advertising or publicity -pertaining to distribution of the software without specific, -written prior permission. FUJITSU LIMITED 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 AND SONY CORPORATION DISCLAIM ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 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. - - Author: Takashi Fujiwara FUJITSU LIMITED - fujiwara@a80.tech.yk.fujitsu.co.jp - Modifier: Makoto Wakamatsu Sony Corporation - makoto@sm.sony.co.jp - -******************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <stdio.h> -#include <X11/Xlib.h> -#include "Xlibint.h" -#include "Xlcint.h" -#include "Ximint.h" -#include "Xresource.h" - -#define GET_NAME(x) name_table + x.name_offset - -typedef struct _XimValueOffsetInfo { - unsigned short name_offset; - XrmQuark quark; - unsigned int offset; - Bool (*defaults)( - struct _XimValueOffsetInfo *, XPointer, XPointer, unsigned long - ); - Bool (*encode)( - struct _XimValueOffsetInfo *, XPointer, XPointer - ); - Bool (*decode)( - struct _XimValueOffsetInfo *, XPointer, XPointer - ); -} XimValueOffsetInfoRec, *XimValueOffsetInfo; - -#ifdef XIM_CONNECTABLE -Private Bool -_XimCheckBool(str) - char *str; -{ - if(!strcmp(str, "True") || !strcmp(str, "true") || - !strcmp(str, "Yes") || !strcmp(str, "yes") || - !strcmp(str, "ON") || !strcmp(str, "on")) - return True; - return False; -} - -Public void -_XimSetProtoResource(im) - Xim im; -{ - char res_name_buf[256]; - char* res_name; - char res_class_buf[256]; - char* res_class; - char* str_type; - XrmValue value; - XIMStyle preedit_style = 0; - XIMStyle status_style = 0; - XIMStyles* imstyles; - char* dotximdot = ".xim."; - char* ximdot = "xim."; - char* dotXimdot = ".Xim."; - char* Ximdot = "Xim."; - - if (!im->core.rdb) - return; - - if (strlen (im->core.res_name) < 200) res_name = res_name_buf; - else res_name = Xmalloc (strlen (im->core.res_name) + 50); - if (strlen (im->core.res_class) < 200) res_class = res_class_buf; - else res_class = Xmalloc (strlen (im->core.res_class) + 50); - /* pretend malloc always works */ - - (void) sprintf (res_name, "%s%s%s", - im->core.res_name != NULL ? im->core.res_name : "*", - im->core.res_name != NULL ? dotximdot : ximdot, - "useAuth"); - (void) sprintf (res_class, "%s%s%s", - im->core.res_class != NULL ? im->core.res_class : "*", - im->core.res_class != NULL ? dotXimdot : Ximdot, - "UseAuth"); - bzero(&value, sizeof(XrmValue)); - if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { - if(_XimCheckBool(value.addr)) { - MARK_USE_AUTHORIZATION_FUNC(im); - } - } - - (void) sprintf (res_name, "%s%s%s", - im->core.res_name != NULL ? im->core.res_name : "*", - im->core.res_name != NULL ? dotximdot : ximdot, - "delaybinding"); - (void) sprintf (res_class, "%s%s%s", - im->core.res_class != NULL ? im->core.res_class : "*", - im->core.res_class != NULL ? dotXimdot : Ximdot, - "Delaybinding"); - bzero(&value, sizeof(XrmValue)); - if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { - if(_XimCheckBool(value.addr)) { - MARK_DELAYBINDABLE(im); - } - } - - (void) sprintf (res_name, "%s%s%s", - im->core.res_name != NULL ? im->core.res_name : "*", - im->core.res_name != NULL ? dotximdot : ximdot, - "reconnect"); - (void) sprintf (res_class, "%s%s%s", - im->core.res_class != NULL ? im->core.res_class : "*", - im->core.res_class != NULL ? dotXimdot : Ximdot, - "Reconnect"); - bzero(&value, sizeof(XrmValue)); - if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { - if(_XimCheckBool(value.addr)) { - MARK_RECONNECTABLE(im); - } - } - - if(!IS_CONNECTABLE(im)) { - if (res_name != res_name_buf) Xfree (res_name); - if (res_class != res_class_buf) Xfree (res_class); - return; - } - - (void) sprintf (res_name, "%s%s%s", - im->core.res_name != NULL ? im->core.res_name : "*", - im->core.res_name != NULL ? dotximdot : ximdot, - "preeditDefaultStyle"); - (void) sprintf (res_class, "%s%s%s", - im->core.res_class != NULL ? im->core.res_class : "*", - im->core.res_class != NULL ? dotXimdot : Ximdot, - "PreeditDefaultStyle"); - if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { - if(!strcmp(value.addr, "XIMPreeditArea")) - preedit_style = XIMPreeditArea; - else if(!strcmp(value.addr, "XIMPreeditCallbacks")) - preedit_style = XIMPreeditCallbacks; - else if(!strcmp(value.addr, "XIMPreeditPosition")) - preedit_style = XIMPreeditPosition; - else if(!strcmp(value.addr, "XIMPreeditNothing")) - preedit_style = XIMPreeditNothing; - else if(!strcmp(value.addr, "XIMPreeditNone")) - preedit_style = XIMPreeditNone; - } - if(!preedit_style) - preedit_style = XIMPreeditNothing; - - (void) sprintf (res_name, "%s%s%s", - im->core.res_name != NULL ? im->core.res_name : "*", - im->core.res_name != NULL ? dotximdot : ximdot, - "statusDefaultStyle"); - (void) sprintf (res_class, "%s%s%s", - im->core.res_class != NULL ? im->core.res_class : "*", - im->core.res_class != NULL ? dotXimdot : Ximdot, - "StatusDefaultStyle"); - if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { - if(!strcmp(value.addr, "XIMStatusArea")) - status_style = XIMStatusArea; - else if(!strcmp(value.addr, "XIMStatusCallbacks")) - status_style = XIMStatusCallbacks; - else if(!strcmp(value.addr, "XIMStatusNothing")) - status_style = XIMStatusNothing; - else if(!strcmp(value.addr, "XIMStatusNone")) - status_style = XIMStatusNone; - } - if(!status_style) - status_style = XIMStatusNothing; - - if(!(imstyles = (XIMStyles *)Xmalloc(sizeof(XIMStyles) + sizeof(XIMStyle)))){ - if (res_name != res_name_buf) Xfree (res_name); - if (res_class != res_class_buf) Xfree (res_class); - return; - } - imstyles->count_styles = 1; - imstyles->supported_styles = - (XIMStyle *)((char *)imstyles + sizeof(XIMStyles)); - imstyles->supported_styles[0] = preedit_style | status_style; - im->private.proto.default_styles = imstyles; - if (res_name != res_name_buf) Xfree (res_name); - if (res_class != res_class_buf) Xfree (res_class); -} -#endif /* XIM_CONNECTABLE */ - -static const char name_table[] = - /* 0 */ XNQueryInputStyle"\0" - /* 16 */ XNClientWindow"\0" - /* 29 */ XNInputStyle"\0" - /* 40 */ XNFocusWindow"\0" - /* 52 */ XNResourceName"\0" - /* 65 */ XNResourceClass"\0" - /* 79 */ XNGeometryCallback"\0" - /* 96 */ XNDestroyCallback"\0" - /* 112 */ XNFilterEvents"\0" - /* 125 */ XNPreeditStartCallback"\0" - /* 146 */ XNPreeditDoneCallback"\0" - /* 166 */ XNPreeditDrawCallback"\0" - /* 186 */ XNPreeditCaretCallback"\0" - /* 207 */ XNPreeditStateNotifyCallback"\0" - /* 234 */ XNPreeditAttributes"\0" - /* 252 */ XNStatusStartCallback"\0" - /* 272 */ XNStatusDoneCallback"\0" - /* 291 */ XNStatusDrawCallback"\0" - /* 310 */ XNStatusAttributes"\0" - /* 327 */ XNArea"\0" - /* 332 */ XNAreaNeeded"\0" - /* 343 */ XNSpotLocation"\0" - /* 356 */ XNColormap"\0" - /* 365 */ XNStdColormap"\0" - /* 377 */ XNForeground"\0" - /* 388 */ XNBackground"\0" - /* 399 */ XNBackgroundPixmap"\0" - /* 416 */ XNFontSet"\0" - /* 424 */ XNLineSpace"\0" - /* 434 */ XNCursor"\0" - /* 441 */ XNQueryIMValuesList"\0" - /* 459 */ XNQueryICValuesList"\0" - /* 477 */ XNVisiblePosition"\0" - /* 493 */ XNStringConversionCallback"\0" - /* 518 */ XNStringConversion"\0" - /* 535 */ XNResetState"\0" - /* 546 */ XNHotKey"\0" - /* 553 */ XNHotKeyState"\0" - /* 565 */ XNPreeditState -; - -#define OFFSET_XNQUERYINPUTSTYLE 0 -#define OFFSET_XNCLIENTWINDOW 16 -#define OFFSET_XNINPUTSTYLE 29 -#define OFFSET_XNFOCUSWINDOW 40 -#define OFFSET_XNRESOURCENAME 52 -#define OFFSET_XNRESOURCECLASS 65 -#define OFFSET_XNGEOMETRYCALLBACK 79 -#define OFFSET_XNDESTROYCALLBACK 96 -#define OFFSET_XNFILTEREVENTS 112 -#define OFFSET_XNPREEDITSTARTCALLBACK 125 -#define OFFSET_XNPREEDITDONECALLBACK 146 -#define OFFSET_XNPREEDITDRAWCALLBACK 166 -#define OFFSET_XNPREEDITCARETCALLBACK 186 -#define OFFSET_XNPREEDITSTATENOTIFYCALLBACK 207 -#define OFFSET_XNPREEDITATTRIBUTES 234 -#define OFFSET_XNSTATUSSTARTCALLBACK 252 -#define OFFSET_XNSTATUSDONECALLBACK 272 -#define OFFSET_XNSTATUSDRAWCALLBACK 291 -#define OFFSET_XNSTATUSATTRIBUTES 310 -#define OFFSET_XNAREA 327 -#define OFFSET_XNAREANEEDED 332 -#define OFFSET_XNSPOTLOCATION 343 -#define OFFSET_XNCOLORMAP 356 -#define OFFSET_XNSTDCOLORMAP 365 -#define OFFSET_XNFOREGROUND 377 -#define OFFSET_XNBACKGROUND 388 -#define OFFSET_XNBACKGROUNDPIXMAP 399 -#define OFFSET_XNFONTSET 416 -#define OFFSET_XNLINESPACE 424 -#define OFFSET_XNCURSOR 434 -#define OFFSET_XNQUERYIMVALUESLIST 441 -#define OFFSET_XNQUERYICVALUESLIST 459 -#define OFFSET_XNVISIBLEPOSITION 477 -#define OFFSET_XNSTRINGCONVERSIONCALLBACK 493 -#define OFFSET_XNSTRINGCONVERSION 518 -#define OFFSET_XNRESETSTATE 535 -#define OFFSET_XNHOTKEY 546 -#define OFFSET_XNHOTKEYSTATE 553 -#define OFFSET_XNPREEDITSTATE 565 - -/* offsets into name_table */ -static const unsigned short supported_local_im_values_list[] = { - OFFSET_XNQUERYINPUTSTYLE, - OFFSET_XNRESOURCENAME, - OFFSET_XNRESOURCECLASS, - OFFSET_XNDESTROYCALLBACK, - OFFSET_XNQUERYIMVALUESLIST, - OFFSET_XNQUERYICVALUESLIST, - OFFSET_XNVISIBLEPOSITION -}; - -/* offsets into name_table */ -static const unsigned short supported_local_ic_values_list[] = { - OFFSET_XNINPUTSTYLE, - OFFSET_XNCLIENTWINDOW, - OFFSET_XNFOCUSWINDOW, - OFFSET_XNRESOURCENAME, - OFFSET_XNRESOURCECLASS, - OFFSET_XNGEOMETRYCALLBACK, - OFFSET_XNFILTEREVENTS, - OFFSET_XNDESTROYCALLBACK, - OFFSET_XNSTRINGCONVERSIONCALLBACK, - OFFSET_XNSTRINGCONVERSIONCALLBACK, - OFFSET_XNRESETSTATE, - OFFSET_XNHOTKEY, - OFFSET_XNHOTKEYSTATE, - OFFSET_XNPREEDITATTRIBUTES, - OFFSET_XNSTATUSATTRIBUTES, - OFFSET_XNAREA, - OFFSET_XNAREANEEDED, - OFFSET_XNSPOTLOCATION, - OFFSET_XNCOLORMAP, - OFFSET_XNSTDCOLORMAP, - OFFSET_XNFOREGROUND, - OFFSET_XNBACKGROUND, - OFFSET_XNBACKGROUNDPIXMAP, - OFFSET_XNFONTSET, - OFFSET_XNLINESPACE, - OFFSET_XNCURSOR, - OFFSET_XNPREEDITSTARTCALLBACK, - OFFSET_XNPREEDITDONECALLBACK, - OFFSET_XNPREEDITDRAWCALLBACK, - OFFSET_XNPREEDITCARETCALLBACK, - OFFSET_XNSTATUSSTARTCALLBACK, - OFFSET_XNSTATUSDONECALLBACK, - OFFSET_XNSTATUSDRAWCALLBACK, - OFFSET_XNPREEDITSTATE, - OFFSET_XNPREEDITSTATENOTIFYCALLBACK -}; - -static XIMStyle const supported_local_styles[] = { - XIMPreeditNone | XIMStatusNone, - XIMPreeditNothing | XIMStatusNothing, - 0 /* dummy */ -}; - -Private Bool -_XimDefaultStyles( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, /* unused */ - unsigned long mode) /* unused */ -{ - XIMStyles *styles; - XIMStyles **out; - register int i; - unsigned int n; - int len; - XPointer tmp; - - n = XIMNumber(supported_local_styles) - 1; - len = sizeof(XIMStyles) + sizeof(XIMStyle) * n; - if(!(tmp = (XPointer)Xmalloc(len))) { - return False; - } - bzero(tmp, len); - - styles = (XIMStyles *)tmp; - if (n > 0) { - styles->count_styles = (unsigned short)n; - styles->supported_styles = - (XIMStyle *)((char *)tmp + sizeof(XIMStyles)); - for(i = 0; i < n; i++) { - styles->supported_styles[i] = supported_local_styles[i]; - } - } - - out = (XIMStyles **)((char *)top + info->offset); - *out = styles; - return True; -} - -Private Bool -_XimDefaultIMValues( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, /* unused */ - unsigned long mode) /* unused */ -{ - XIMValuesList *values_list; - XIMValuesList **out; - register int i; - unsigned int n; - int len; - XPointer tmp; - - n = XIMNumber(supported_local_im_values_list); - len = sizeof(XIMValuesList) + sizeof(char **) * n; - if(!(tmp = (XPointer)Xmalloc(len))) { - return False; - } - bzero(tmp, len); - - values_list = (XIMValuesList *)tmp; - if (n > 0) { - values_list->count_values = (unsigned short)n; - values_list->supported_values - = (char **)((char *)tmp + sizeof(XIMValuesList)); - for(i = 0; i < n; i++) { - values_list->supported_values[i] = - (char *)name_table + supported_local_im_values_list[i]; - } - } - - out = (XIMValuesList **)((char *)top + info->offset); - *out = values_list; - return True; -} - -Private Bool -_XimDefaultICValues( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, /* unused */ - unsigned long mode) /* unused */ -{ - XIMValuesList *values_list; - XIMValuesList **out; - register int i; - unsigned int n; - int len; - XPointer tmp; - - n = XIMNumber(supported_local_ic_values_list); - len = sizeof(XIMValuesList) + sizeof(char **) * n; - if(!(tmp = (XPointer)Xmalloc(len))) { - return False; - } - bzero(tmp, len); - - values_list = (XIMValuesList *)tmp; - if (n > 0) { - values_list->count_values = (unsigned short)n; - values_list->supported_values - = (char **)((char *)tmp + sizeof(XIMValuesList)); - for(i = 0; i < n; i++) { - values_list->supported_values[i] = - (char *)name_table + supported_local_ic_values_list[i]; - } - } - - out = (XIMValuesList **)((char *)top + info->offset); - *out = values_list; - return True; -} - -Private Bool -_XimDefaultVisiblePos( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, /* unused */ - unsigned long mode) /* unused */ -{ - Bool *out; - - out = (Bool *)((char *)top + info->offset); - *out = False; - return True; -} - -Private Bool -_XimDefaultFocusWindow( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Window *out; - - if(ic->core.client_window == (Window)NULL) { - return True; - } - - out = (Window *)((char *)top + info->offset); - *out = ic->core.client_window; - return True; -} - -Private Bool -_XimDefaultResName( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Xim im = (Xim)ic->core.im; - char **out; - - if(im->core.res_name == (char *)NULL) { - return True; - } - - out = (char **)((char *)top + info->offset); - *out = im->core.res_name; - return True; -} - -Private Bool -_XimDefaultResClass( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Xim im = (Xim)ic->core.im; - char **out; - - if(im->core.res_class == (char *)NULL) { - return True; - } - - out = (char **)((char *)top + info->offset); - *out = im->core.res_class; - return True; -} - -Private Bool -_XimDefaultDestroyCB( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Xim im = (Xim)ic->core.im; - XIMCallback *out; - - out = (XIMCallback *)((char *)top + info->offset); - *out = im->core.destroy_callback; - return True; -} - -Private Bool -_XimDefaultResetState( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - XIMResetState *out; - - out = (XIMResetState *)((char *)top + info->offset); - *out = XIMInitialState; - return True; -} - -Private Bool -_XimDefaultHotKeyState( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - XIMHotKeyState *out; - - out = (XIMHotKeyState *)((char *)top + info->offset); - *out = XIMHotKeyStateOFF; - return True; -} - -Private Bool -_XimDefaultArea( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Xim im = (Xim)ic->core.im; - Window root_return; - int x_return, y_return; - unsigned int width_return, height_return; - unsigned int border_width_return; - unsigned int depth_return; - XRectangle area; - XRectangle *out; - - if(ic->core.focus_window == (Window)NULL) { - return True; - } - if(XGetGeometry(im->core.display, (Drawable)ic->core.focus_window, - &root_return, &x_return, &y_return, &width_return, - &height_return, &border_width_return, &depth_return) - == (Status)Success) { - return True; - } - area.x = 0; - area.y = 0; - area.width = width_return; - area.height = height_return; - - out = (XRectangle *)((char *)top + info->offset); - *out = area; - return True; -} - -Private Bool -_XimDefaultColormap( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Xim im = (Xim)ic->core.im; - XWindowAttributes win_attr; - Colormap *out; - - if(ic->core.client_window == (Window)NULL) { - return True; - } - if(XGetWindowAttributes(im->core.display, ic->core.client_window, - &win_attr) == (Status)Success) { - return True; - } - - out = (Colormap *)((char *)top + info->offset); - *out = win_attr.colormap; - return True; -} - -Private Bool -_XimDefaultStdColormap( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Atom *out; - - out = (Atom *)((char *)top + info->offset); - *out = (Atom)0; - return True; -} - -Private Bool -_XimDefaultFg( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Xim im = (Xim)ic->core.im; - unsigned long fg; - unsigned long *out; - - fg = WhitePixel(im->core.display, DefaultScreen(im->core.display)); - out = (unsigned long *)((char *)top + info->offset); - *out = fg; - return True; -} - -Private Bool -_XimDefaultBg( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - Xim im = (Xim)ic->core.im; - unsigned long bg; - unsigned long *out; - - bg = BlackPixel(im->core.display, DefaultScreen(im->core.display)); - out = (unsigned long *)((char *)top + info->offset); - *out = bg; - return True; -} - -Private Bool -_XimDefaultBgPixmap( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Pixmap *out; - - out = (Pixmap *)((char *)top + info->offset); - *out = (Pixmap)0; - return True; -} - -Private Bool -_XimDefaultFontSet( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - XFontSet *out; - - out = (XFontSet *)((char *)top + info->offset); - *out = 0; - return True; -} - -Private Bool -_XimDefaultLineSpace( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Xic ic = (Xic)parm; - XFontSet fontset; - XFontSetExtents *fset_extents; - int line_space = 0; - int *out; - - if(mode & XIM_PREEDIT_ATTR) { - fontset = ic->core.preedit_attr.fontset; - } else if(mode & XIM_STATUS_ATTR) { - fontset = ic->core.status_attr.fontset; - } else { - return True; - } - if (fontset) { - fset_extents = XExtentsOfFontSet(fontset); - line_space = fset_extents->max_logical_extent.height; - } - out = (int *)((char *)top + info->offset); - *out = line_space; - return True; -} - -Private Bool -_XimDefaultCursor( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - Cursor *out; - - out = (Cursor *)((char *)top + info->offset); - *out = (Cursor)0; - return True; -} - -Private Bool -_XimDefaultPreeditState( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - XIMPreeditState *out; - - out = (XIMPreeditState *)((char *)top + info->offset); - *out = XIMPreeditDisable; - return True; -} - -Private Bool -_XimDefaultNest( - XimValueOffsetInfo info, - XPointer top, - XPointer parm, - unsigned long mode) -{ - return True; -} - -Private Bool -_XimEncodeCallback( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMCallback *out; - - out = (XIMCallback *)((char *)top + info->offset); - *out = *((XIMCallback *)val); - return True; -} - -Private Bool -_XimEncodeString( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - int len; - char *string; - char **out; - - if(val == (XPointer)NULL) { - return False; - } - len = strlen((char *)val); - if(!(string = (char *)Xmalloc(len + 1))) { - return False; - } - (void)strcpy(string, (char *)val); - string[len] = '\0'; - - out = (char **)((char *)top + info->offset); - if(*out) { - Xfree(*out); - } - *out = string; - return True; -} - -Private Bool -_XimEncodeStyle( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMStyle *out; - - out = (XIMStyle *)((char *)top + info->offset); - *out = (XIMStyle)val; - return True; -} - -Private Bool -_XimEncodeWindow( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Window *out; - - out = (Window *)((char *)top + info->offset); - *out = (Window)val; - return True; -} - -Private Bool -_XimEncodeStringConv( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - /* - * Not yet - */ - return True; -} - -Private Bool -_XimEncodeResetState( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMResetState *out; - - out = (XIMResetState *)((char *)top + info->offset); - *out = (XIMResetState)val; - return True; -} - -Private Bool -_XimEncodeHotKey( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMHotKeyTriggers *hotkey = (XIMHotKeyTriggers *)val; - XIMHotKeyTriggers **out; - XIMHotKeyTriggers *key_list; - XIMHotKeyTrigger *key; - XPointer tmp; - int num; - int len; - register int i; - - if(hotkey == (XIMHotKeyTriggers *)NULL) { - return True; - } - - if((num = hotkey->num_hot_key) == 0) { - return True; - } - - len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num; - if(!(tmp = (XPointer)Xmalloc(len))) { - return False; - } - - key_list = (XIMHotKeyTriggers *)tmp; - key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers)); - - for(i = 0; i < num; i++) { - key[i] = hotkey->key[i]; - } - - key_list->num_hot_key = num; - key_list->key = key; - - out = (XIMHotKeyTriggers **)((char *)top + info->offset); - *out = key_list; - return True; -} - -Private Bool -_XimEncodeHotKetState( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMHotKeyState *out; - - out = (XIMHotKeyState *)((char *)top + info->offset); - *out = (XIMHotKeyState)val; - return True; -} - -Private Bool -_XimEncodeRectangle( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XRectangle *out; - - out = (XRectangle *)((char *)top + info->offset); - *out = *((XRectangle *)val); - return True; -} - -Private Bool -_XimEncodeSpot( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XPoint *out; - - out = (XPoint *)((char *)top + info->offset); - *out = *((XPoint *)val); - return True; -} - -Private Bool -_XimEncodeColormap( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Colormap *out; - - out = (Colormap *)((char *)top + info->offset); - *out = (Colormap)val; - return True; -} - -Private Bool -_XimEncodeStdColormap( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Atom *out; - - out = (Atom *)((char *)top + info->offset); - *out = (Atom)val; - return True; -} - -Private Bool -_XimEncodeLong( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - unsigned long *out; - - out = (unsigned long *)((char *)top + info->offset); - *out = (unsigned long)val; - return True; -} - -Private Bool -_XimEncodeBgPixmap( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Pixmap *out; - - out = (Pixmap *)((char *)top + info->offset); - *out = (Pixmap)val; - return True; -} - -Private Bool -_XimEncodeFontSet( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XFontSet *out; - - out = (XFontSet *)((char *)top + info->offset); - *out = (XFontSet)val; - return True; -} - -Private Bool -_XimEncodeLineSpace( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - int *out; - - out = (int *)((char *)top + info->offset); - *out = (long)val; - return True; -} - -Private Bool -_XimEncodeCursor( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Cursor *out; - - out = (Cursor *)((char *)top + info->offset); - *out = (Cursor)val; - return True; -} - -Private Bool -_XimEncodePreeditState( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMPreeditState *out; - - out = (XIMPreeditState *)((char *)top + info->offset); - *out = (XIMPreeditState)val; - return True; -} - -Private Bool -_XimEncodeNest( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - return True; -} - -Private Bool -_XimDecodeStyles( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMStyles *styles; - XIMStyles *out; - register int i; - unsigned int num; - int len; - XPointer tmp; - - if(val == (XPointer)NULL) { - return False; - } - - styles = *((XIMStyles **)((char *)top + info->offset)); - num = styles->count_styles; - - len = sizeof(XIMStyles) + sizeof(XIMStyle) * num; - if(!(tmp = (XPointer)Xmalloc(len))) { - return False; - } - bzero(tmp, len); - - out = (XIMStyles *)tmp; - if(num >0) { - out->count_styles = (unsigned short)num; - out->supported_styles = (XIMStyle *)((char *)tmp + sizeof(XIMStyles)); - - for(i = 0; i < num; i++) { - out->supported_styles[i] = styles->supported_styles[i]; - } - } - *((XIMStyles **)val) = out; - return True; -} - -Private Bool -_XimDecodeValues( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMValuesList *values_list; - XIMValuesList *out; - register int i; - unsigned int num; - int len; - XPointer tmp; - - if(val == (XPointer)NULL) { - return False; - } - - values_list = *((XIMValuesList **)((char *)top + info->offset)); - num = values_list->count_values; - - len = sizeof(XIMValuesList) + sizeof(char **) * num; - if(!(tmp = (char *)Xmalloc(len))) { - return False; - } - bzero(tmp, len); - - out = (XIMValuesList *)tmp; - if(num) { - out->count_values = (unsigned short)num; - out->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList)); - - for(i = 0; i < num; i++) { - out->supported_values[i] = values_list->supported_values[i]; - } - } - *((XIMValuesList **)val) = out; - return True; -} - -Private Bool -_XimDecodeCallback( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMCallback *in; - XIMCallback *callback; - - in = (XIMCallback *)((char *)top + info->offset); - if(!(callback = (XIMCallback *)Xmalloc(sizeof(XIMCallback)))) { - return False; - } - callback->client_data = in->client_data; - callback->callback = in->callback; - - *((XIMCallback **)val) = callback; - return True; -} - -Private Bool -_XimDecodeString( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - int len = 0; - char *in; - char *string; - - in = *((char **)((char *)top + info->offset)); - if(in != (char *)NULL) { - len = strlen(in); - } - if(!(string = (char *)Xmalloc(len + 1))) { - return False; - } - if(in != (char *)NULL) { - (void)strcpy(string, in); - } - string[len] = '\0'; - *((char **)val) = string; - return True; -} - -Private Bool -_XimDecodeBool( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Bool *in; - - in = (Bool *)((char *)top + info->offset); - *((Bool *)val) = *in; - return True; -} - -Private Bool -_XimDecodeStyle( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMStyle *in; - - in = (XIMStyle *)((char *)top + info->offset); - *((XIMStyle *)val) = *in; - return True; -} - -Private Bool -_XimDecodeWindow( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Window *in; - - in = (Window *)((char *)top + info->offset); - *((Window *)val) = *in; - return True; -} - -Private Bool -_XimDecodeStringConv( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - /* - * Not yet - */ - return True; -} - -Private Bool -_XimDecodeResetState( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMResetState *in; - - in = (XIMResetState *)((char *)top + info->offset); - *((XIMResetState *)val) = *in; - return True; -} - -Private Bool -_XimDecodeHotKey( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMHotKeyTriggers *in; - XIMHotKeyTriggers *hotkey; - XIMHotKeyTrigger *key; - XPointer tmp; - int num; - int len; - register int i; - - in = *((XIMHotKeyTriggers **)((char *)top + info->offset)); - num = in->num_hot_key; - len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num; - if(!(tmp = (XPointer)Xmalloc(len))) { - return False; - } - - hotkey = (XIMHotKeyTriggers *)tmp; - key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers)); - - for(i = 0; i < num; i++) { - key[i] = in->key[i]; - } - hotkey->num_hot_key = num; - hotkey->key = key; - - *((XIMHotKeyTriggers **)val) = hotkey; - return True; -} - -Private Bool -_XimDecodeHotKetState( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMHotKeyState *in; - - in = (XIMHotKeyState *)((char *)top + info->offset); - *((XIMHotKeyState *)val) = *in; - return True; -} - -Private Bool -_XimDecodeRectangle( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XRectangle *in; - XRectangle *rect; - - in = (XRectangle *)((char *)top + info->offset); - if(!(rect = (XRectangle *)Xmalloc(sizeof(XRectangle)))) { - return False; - } - *rect = *in; - *((XRectangle **)val) = rect; - return True; -} - -Private Bool -_XimDecodeSpot( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XPoint *in; - XPoint *spot; - - in = (XPoint *)((char *)top + info->offset); - if(!(spot = (XPoint *)Xmalloc(sizeof(XPoint)))) { - return False; - } - *spot = *in; - *((XPoint **)val) = spot; - return True; -} - -Private Bool -_XimDecodeColormap( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Colormap *in; - - in = (Colormap *)((char *)top + info->offset); - *((Colormap *)val) = *in; - return True; -} - -Private Bool -_XimDecodeStdColormap( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Atom *in; - - in = (Atom *)((char *)top + info->offset); - *((Atom *)val) = *in; - return True; -} - -Private Bool -_XimDecodeLong( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - unsigned long *in; - - in = (unsigned long *)((char *)top + info->offset); - *((unsigned long *)val) = *in; - return True; -} - -Private Bool -_XimDecodeBgPixmap( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Pixmap *in; - - in = (Pixmap *)((char *)top + info->offset); - *((Pixmap *)val) = *in; - return True; -} - -Private Bool -_XimDecodeFontSet( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XFontSet *in; - - in = (XFontSet *)((char *)top + info->offset); - *((XFontSet *)val) = *in; - return True; -} - -Private Bool -_XimDecodeLineSpace( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - int *in; - - in = (int *)((char *)top + info->offset); - *((int *)val) = *in; - return True; -} - -Private Bool -_XimDecodeCursor( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - Cursor *in; - - in = (Cursor *)((char *)top + info->offset); - *((Cursor *)val) = *in; - return True; -} - -Private Bool -_XimDecodePreeditState( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - XIMPreeditState *in; - - in = (XIMPreeditState *)((char *)top + info->offset); - *((XIMPreeditState *)val) = *in; - return True; -} - -Private Bool -_XimDecodeNest( - XimValueOffsetInfo info, - XPointer top, - XPointer val) -{ - return True; -} - -static XIMResource im_resources[] = { - {XNQueryInputStyle, 0, XimType_XIMStyles, 0, 0, 0}, - {XNDestroyCallback, 0, 0, 0, 0, 0}, - {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, - {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, - {XNQueryIMValuesList, 0, 0, 0, 0, 0}, - {XNQueryICValuesList, 0, 0, 0, 0, 0}, - {XNVisiblePosition, 0, 0, 0, 0, 0} -}; - -static XIMResource im_inner_resources[] = { - {XNDestroyCallback, 0, 0, 0, 0, 0}, - {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, - {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, - {XNQueryIMValuesList, 0, 0, 0, 0, 0}, - {XNQueryICValuesList, 0, 0, 0, 0, 0}, - {XNVisiblePosition, 0, 0, 0, 0, 0} -}; - -static XIMResource ic_resources[] = { - {XNInputStyle, 0, XimType_CARD32, 0, 0, 0}, - {XNClientWindow, 0, XimType_Window, 0, 0, 0}, - {XNFocusWindow, 0, XimType_Window, 0, 0, 0}, - {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, - {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, - {XNGeometryCallback, 0, 0, 0, 0, 0}, - {XNFilterEvents, 0, XimType_CARD32, 0, 0, 0}, - {XNDestroyCallback, 0, 0, 0, 0, 0}, - {XNStringConversionCallback, 0, 0, 0, 0, 0}, - {XNStringConversion, 0, XimType_XIMStringConversion,0, 0, 0}, - {XNResetState, 0, 0, 0, 0, 0}, - {XNHotKey, 0, XimType_XIMHotKeyTriggers,0, 0, 0}, - {XNHotKeyState, 0, XimType_XIMHotKeyState, 0, 0, 0}, - {XNPreeditAttributes, 0, XimType_NEST, 0, 0, 0}, - {XNStatusAttributes, 0, XimType_NEST, 0, 0, 0}, - {XNArea, 0, XimType_XRectangle, 0, 0, 0}, - {XNAreaNeeded, 0, XimType_XRectangle, 0, 0, 0}, - {XNSpotLocation, 0, XimType_XPoint, 0, 0, 0}, - {XNColormap, 0, XimType_CARD32, 0, 0, 0}, - {XNStdColormap, 0, XimType_CARD32, 0, 0, 0}, - {XNForeground, 0, XimType_CARD32, 0, 0, 0}, - {XNBackground, 0, XimType_CARD32, 0, 0, 0}, - {XNBackgroundPixmap, 0, XimType_CARD32, 0, 0, 0}, - {XNFontSet, 0, XimType_XFontSet, 0, 0, 0}, - {XNLineSpace, 0, XimType_CARD32, 0, 0, 0}, - {XNCursor, 0, XimType_CARD32, 0, 0, 0}, - {XNPreeditStartCallback, 0, 0, 0, 0, 0}, - {XNPreeditDoneCallback, 0, 0, 0, 0, 0}, - {XNPreeditDrawCallback, 0, 0, 0, 0, 0}, - {XNPreeditCaretCallback, 0, 0, 0, 0, 0}, - {XNStatusStartCallback, 0, 0, 0, 0, 0}, - {XNStatusDoneCallback, 0, 0, 0, 0, 0}, - {XNStatusDrawCallback, 0, 0, 0, 0, 0}, - {XNPreeditState, 0, 0, 0, 0, 0}, - {XNPreeditStateNotifyCallback, 0, 0, 0, 0, 0}, -}; - -static XIMResource ic_inner_resources[] = { - {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, - {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, - {XNGeometryCallback, 0, 0, 0, 0, 0}, - {XNDestroyCallback, 0, 0, 0, 0, 0}, - {XNStringConversionCallback, 0, 0, 0, 0, 0}, - {XNPreeditStartCallback, 0, 0, 0, 0, 0}, - {XNPreeditDoneCallback, 0, 0, 0, 0, 0}, - {XNPreeditDrawCallback, 0, 0, 0, 0, 0}, - {XNPreeditCaretCallback, 0, 0, 0, 0, 0}, - {XNStatusStartCallback, 0, 0, 0, 0, 0}, - {XNStatusDoneCallback, 0, 0, 0, 0, 0}, - {XNStatusDrawCallback, 0, 0, 0, 0, 0}, - {XNPreeditStateNotifyCallback, 0, 0, 0, 0, 0}, -}; - -static XimValueOffsetInfoRec im_attr_info[] = { - {OFFSET_XNQUERYINPUTSTYLE, 0, - XOffsetOf(XimDefIMValues, styles), - _XimDefaultStyles, NULL, _XimDecodeStyles}, - - {OFFSET_XNDESTROYCALLBACK, 0, - XOffsetOf(XimDefIMValues, destroy_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNRESOURCENAME, 0, - XOffsetOf(XimDefIMValues, res_name), - NULL, _XimEncodeString, _XimDecodeString}, - - {OFFSET_XNRESOURCECLASS, 0, - XOffsetOf(XimDefIMValues, res_class), - NULL, _XimEncodeString, _XimDecodeString}, - - {OFFSET_XNQUERYIMVALUESLIST, 0, - XOffsetOf(XimDefIMValues, im_values_list), - _XimDefaultIMValues, NULL, _XimDecodeValues}, - - {OFFSET_XNQUERYICVALUESLIST, 0, - XOffsetOf(XimDefIMValues, ic_values_list), - _XimDefaultICValues, NULL, _XimDecodeValues}, - - {OFFSET_XNVISIBLEPOSITION, 0, - XOffsetOf(XimDefIMValues, visible_position), - _XimDefaultVisiblePos, NULL, _XimDecodeBool} -}; - -static XimValueOffsetInfoRec ic_attr_info[] = { - {OFFSET_XNINPUTSTYLE, 0, - XOffsetOf(XimDefICValues, input_style), - NULL, _XimEncodeStyle, _XimDecodeStyle}, - - {OFFSET_XNCLIENTWINDOW, 0, - XOffsetOf(XimDefICValues, client_window), - NULL, _XimEncodeWindow, _XimDecodeWindow}, - - {OFFSET_XNFOCUSWINDOW, 0, - XOffsetOf(XimDefICValues, focus_window), - _XimDefaultFocusWindow, _XimEncodeWindow, _XimDecodeWindow}, - - {OFFSET_XNRESOURCENAME, 0, - XOffsetOf(XimDefICValues, res_name), - _XimDefaultResName, _XimEncodeString, _XimDecodeString}, - - {OFFSET_XNRESOURCECLASS, 0, - XOffsetOf(XimDefICValues, res_class), - _XimDefaultResClass, _XimEncodeString, _XimDecodeString}, - - {OFFSET_XNGEOMETRYCALLBACK, 0, - XOffsetOf(XimDefICValues, geometry_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNFILTEREVENTS, 0, - XOffsetOf(XimDefICValues, filter_events), - NULL, NULL, _XimDecodeLong}, - - {OFFSET_XNDESTROYCALLBACK, 0, - XOffsetOf(XimDefICValues, destroy_callback), - _XimDefaultDestroyCB, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNSTRINGCONVERSIONCALLBACK, 0, - XOffsetOf(XimDefICValues, string_conversion_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNSTRINGCONVERSION, 0, - XOffsetOf(XimDefICValues, string_conversion), - NULL, _XimEncodeStringConv, _XimDecodeStringConv}, - - {OFFSET_XNRESETSTATE, 0, - XOffsetOf(XimDefICValues, reset_state), - _XimDefaultResetState, _XimEncodeResetState, _XimDecodeResetState}, - - {OFFSET_XNHOTKEY, 0, - XOffsetOf(XimDefICValues, hotkey), - NULL, _XimEncodeHotKey, _XimDecodeHotKey}, - - {OFFSET_XNHOTKEYSTATE, 0, - XOffsetOf(XimDefICValues, hotkey_state), - _XimDefaultHotKeyState, _XimEncodeHotKetState, _XimDecodeHotKetState}, - - {OFFSET_XNPREEDITATTRIBUTES, 0, - XOffsetOf(XimDefICValues, preedit_attr), - _XimDefaultNest, _XimEncodeNest, _XimDecodeNest}, - - {OFFSET_XNSTATUSATTRIBUTES, 0, - XOffsetOf(XimDefICValues, status_attr), - _XimDefaultNest, _XimEncodeNest, _XimDecodeNest}, -}; - -static XimValueOffsetInfoRec ic_pre_attr_info[] = { - {OFFSET_XNAREA, 0, - XOffsetOf(ICPreeditAttributes, area), - _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle}, - - {OFFSET_XNAREANEEDED, 0, - XOffsetOf(ICPreeditAttributes, area_needed), - NULL, _XimEncodeRectangle, _XimDecodeRectangle}, - - {OFFSET_XNSPOTLOCATION, 0, - XOffsetOf(ICPreeditAttributes, spot_location), - NULL, _XimEncodeSpot, _XimDecodeSpot}, - - {OFFSET_XNCOLORMAP, 0, - XOffsetOf(ICPreeditAttributes, colormap), - _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap}, - - {OFFSET_XNSTDCOLORMAP, 0, - XOffsetOf(ICPreeditAttributes, std_colormap), - _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap}, - - {OFFSET_XNFOREGROUND, 0, - XOffsetOf(ICPreeditAttributes, foreground), - _XimDefaultFg, _XimEncodeLong, _XimDecodeLong}, - - {OFFSET_XNBACKGROUND, 0, - XOffsetOf(ICPreeditAttributes, background), - _XimDefaultBg, _XimEncodeLong, _XimDecodeLong}, - - {OFFSET_XNBACKGROUNDPIXMAP, 0, - XOffsetOf(ICPreeditAttributes, background_pixmap), - _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap}, - - {OFFSET_XNFONTSET, 0, - XOffsetOf(ICPreeditAttributes, fontset), - _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet}, - - {OFFSET_XNLINESPACE, 0, - XOffsetOf(ICPreeditAttributes, line_spacing), - _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace}, - - {OFFSET_XNCURSOR, 0, - XOffsetOf(ICPreeditAttributes, cursor), - _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor}, - - {OFFSET_XNPREEDITSTARTCALLBACK, 0, - XOffsetOf(ICPreeditAttributes, start_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNPREEDITDONECALLBACK, 0, - XOffsetOf(ICPreeditAttributes, done_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNPREEDITDRAWCALLBACK, 0, - XOffsetOf(ICPreeditAttributes, draw_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNPREEDITCARETCALLBACK, 0, - XOffsetOf(ICPreeditAttributes, caret_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNPREEDITSTATE, 0, - XOffsetOf(ICPreeditAttributes, preedit_state), - _XimDefaultPreeditState, _XimEncodePreeditState,_XimDecodePreeditState}, - - {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, 0, - XOffsetOf(ICPreeditAttributes, state_notify_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, -}; - -static XimValueOffsetInfoRec ic_sts_attr_info[] = { - {OFFSET_XNAREA, 0, - XOffsetOf(ICStatusAttributes, area), - _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle}, - - {OFFSET_XNAREANEEDED, 0, - XOffsetOf(ICStatusAttributes, area_needed), - NULL, _XimEncodeRectangle, _XimDecodeRectangle}, - - {OFFSET_XNCOLORMAP, 0, - XOffsetOf(ICStatusAttributes, colormap), - _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap}, - - {OFFSET_XNSTDCOLORMAP, 0, - XOffsetOf(ICStatusAttributes, std_colormap), - _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap}, - - {OFFSET_XNFOREGROUND, 0, - XOffsetOf(ICStatusAttributes, foreground), - _XimDefaultFg, _XimEncodeLong, _XimDecodeLong}, - - {OFFSET_XNBACKGROUND, 0, - XOffsetOf(ICStatusAttributes, background), - _XimDefaultBg, _XimEncodeLong, _XimDecodeLong}, - - {OFFSET_XNBACKGROUNDPIXMAP, 0, - XOffsetOf(ICStatusAttributes, background_pixmap), - _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap}, - - {OFFSET_XNFONTSET, 0, - XOffsetOf(ICStatusAttributes, fontset), - _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet}, - - {OFFSET_XNLINESPACE, 0, - XOffsetOf(ICStatusAttributes, line_spacing), - _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace}, - - {OFFSET_XNCURSOR, 0, - XOffsetOf(ICStatusAttributes, cursor), - _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor}, - - {OFFSET_XNSTATUSSTARTCALLBACK, 0, - XOffsetOf(ICStatusAttributes, start_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNSTATUSDONECALLBACK, 0, - XOffsetOf(ICStatusAttributes, done_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback}, - - {OFFSET_XNSTATUSDRAWCALLBACK, 0, - XOffsetOf(ICStatusAttributes, draw_callback), - NULL, _XimEncodeCallback, _XimDecodeCallback} -}; - -typedef struct _XimIMMode { - unsigned short name_offset; - unsigned short mode; -} XimIMMode; - -static const XimIMMode im_mode[] = { - {OFFSET_XNQUERYINPUTSTYLE, - (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, - {OFFSET_XNDESTROYCALLBACK, - (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, - {OFFSET_XNRESOURCENAME, - (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, - {OFFSET_XNRESOURCECLASS, - (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, - {OFFSET_XNQUERYIMVALUESLIST, - (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, - {OFFSET_XNQUERYICVALUESLIST, - (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, - {OFFSET_XNVISIBLEPOSITION, - (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)} -}; - -typedef struct _XimICMode { - unsigned short name_offset; - unsigned short preedit_callback_mode; - unsigned short preedit_position_mode; - unsigned short preedit_area_mode; - unsigned short preedit_nothing_mode; - unsigned short preedit_none_mode; - unsigned short status_callback_mode; - unsigned short status_area_mode; - unsigned short status_nothing_mode; - unsigned short status_none_mode; -} XimICMode; - -static const XimICMode ic_mode[] = { - {OFFSET_XNINPUTSTYLE, - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), - (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), - (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), - (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), - (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET)}, - {OFFSET_XNCLIENTWINDOW, - (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), - 0, - (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), - (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), - (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNFOCUSWINDOW, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNRESOURCENAME, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNRESOURCECLASS, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNGEOMETRYCALLBACK, - 0, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0, - 0}, - {OFFSET_XNFILTEREVENTS, - XIM_MODE_PRE_GET, - XIM_MODE_PRE_GET, - XIM_MODE_PRE_GET, - XIM_MODE_PRE_GET, - 0, - XIM_MODE_STS_GET, - XIM_MODE_STS_GET, - XIM_MODE_STS_GET, - XIM_MODE_STS_GET}, - {OFFSET_XNDESTROYCALLBACK, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0}, - {OFFSET_XNSTRINGCONVERSIONCALLBACK, - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0}, - {OFFSET_XNSTRINGCONVERSION, - XIM_MODE_PRE_SET, - XIM_MODE_PRE_SET, - XIM_MODE_PRE_SET, - XIM_MODE_PRE_SET, - XIM_MODE_PRE_SET, - 0, - 0, - 0, - 0}, - {OFFSET_XNRESETSTATE, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNHOTKEY, - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNHOTKEYSTATE, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNPREEDITATTRIBUTES, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNSTATUSATTRIBUTES, - 0, - 0, - 0, - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNAREA, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0, - 0}, - {OFFSET_XNAREANEEDED, - 0, - 0, - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - (XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0, - 0}, - {OFFSET_XNSPOTLOCATION, - 0, /*(XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),*/ - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0}, - {OFFSET_XNCOLORMAP, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNSTDCOLORMAP, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNFOREGROUND, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNBACKGROUND, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNBACKGROUNDPIXMAP, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNFONTSET, - 0, - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNLINESPACE, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNCURSOR, - 0, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0}, - {OFFSET_XNPREEDITSTARTCALLBACK, - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNPREEDITDONECALLBACK, - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNPREEDITDRAWCALLBACK, - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNPREEDITCARETCALLBACK, - (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNPREEDITSTATE, - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), - 0, - 0, - 0, - 0, - 0}, - {OFFSET_XNSTATUSSTARTCALLBACK, - 0, - 0, - 0, - 0, - 0, - (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0, - 0, - 0}, - {OFFSET_XNSTATUSDONECALLBACK, - 0, - 0, - 0, - 0, - 0, - (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0, - 0, - 0}, - {OFFSET_XNSTATUSDRAWCALLBACK, - 0, - 0, - 0, - 0, - 0, - (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), - 0, - 0, - 0} -}; - -/* the quarks are separated from im_mode/ic_mode so those arrays - * can be const. - */ -static XrmQuark im_mode_quark[sizeof(im_mode) / sizeof(im_mode[0])]; -static XrmQuark ic_mode_quark[sizeof(ic_mode) / sizeof(ic_mode[0])]; - -Private Bool -_XimSetResourceList( - XIMResourceList *res_list, - unsigned int *list_num, - XIMResourceList resource, - unsigned int num_resource, - unsigned short id) -{ - register int i; - int len; - XIMResourceList res; - - len = sizeof(XIMResource) * num_resource; - if(!(res = (XIMResourceList)Xmalloc(len))) { - return False; - } - bzero((char *)res, len); - - for(i = 0; i < num_resource; i++, id++) { - res[i] = resource[i]; - res[i].id = id; - } - - _XIMCompileResourceList(res, num_resource); - *res_list = res; - *list_num = num_resource; - return True; -} - -Public Bool -_XimSetIMResourceList( - XIMResourceList *res_list, - unsigned int *list_num) -{ - return _XimSetResourceList(res_list, list_num, - im_resources, XIMNumber(im_resources), 100); -} - -Public Bool -_XimSetICResourceList( - XIMResourceList *res_list, - unsigned int *list_num) -{ - return _XimSetResourceList(res_list, list_num, - ic_resources, XIMNumber(ic_resources), 200); -} - -Public Bool -_XimSetInnerIMResourceList( - XIMResourceList *res_list, - unsigned int *list_num) -{ - return _XimSetResourceList(res_list, list_num, - im_inner_resources, XIMNumber(im_inner_resources), 100); -} - -Public Bool -_XimSetInnerICResourceList( - XIMResourceList *res_list, - unsigned int *list_num) -{ - return _XimSetResourceList(res_list, list_num, - ic_inner_resources, XIMNumber(ic_inner_resources), 200); -} - -Private XIMResourceList -_XimGetResourceListRecByMode( - XIMResourceList res_list, - unsigned int list_num, - unsigned short mode) -{ - register int i; - - for(i = 0; i < list_num; i++) { - if (res_list[i].mode & mode) { - return (XIMResourceList)&res_list[i]; - } - } - return (XIMResourceList)NULL; -} - -Public Bool -_XimCheckCreateICValues( - XIMResourceList res_list, - unsigned int list_num) -{ - if (!_XimGetResourceListRecByMode(res_list, list_num, XIM_MODE_IC_CREATE)) { - return True; - } - return False; -} - -Public XIMResourceList -_XimGetResourceListRecByQuark( - XIMResourceList res_list, - unsigned int list_num, - XrmQuark quark) -{ - register int i; - - for(i = 0; i < list_num; i++) { - if (res_list[i].xrm_name == quark) { - return (XIMResourceList)&res_list[i]; - } - } - return (XIMResourceList)NULL; -} - -Public XIMResourceList -_XimGetResourceListRec( - XIMResourceList res_list, - unsigned int list_num, - const char *name) -{ - XrmQuark quark = XrmStringToQuark(name); - - return _XimGetResourceListRecByQuark(res_list, list_num, quark); -} - -Public char * -_XimSetIMValueData( - Xim im, - XPointer top, - XIMArg *values, - XIMResourceList res_list, - unsigned int list_num) -{ - register XIMArg *p; - XIMResourceList res; - int check; - - for(p = values; p->name != NULL; p++) { - if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) { - return p->value; - } - check = _XimCheckIMMode(res, XIM_SETIMVALUES); - if(check == XIM_CHECK_INVALID) { - continue; - } else if (check == XIM_CHECK_ERROR) { - return p->value; - } - - if(!_XimEncodeLocalIMAttr(res, top, p->value)) { - return p->value; - } - } - return NULL; -} - -Public char * -_XimGetIMValueData( - Xim im, - XPointer top, - XIMArg *values, - XIMResourceList res_list, - unsigned int list_num) -{ - register XIMArg *p; - XIMResourceList res; - int check; - - for(p = values; p->name != NULL; p++) { - if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) { - return p->value; - } - check = _XimCheckIMMode(res, XIM_GETIMVALUES); - if(check == XIM_CHECK_INVALID) { - continue; - } else if (check == XIM_CHECK_ERROR) { - return p->value; - } - - if(!_XimDecodeLocalIMAttr(res, top, p->value)) { - return p->value; - } - } - return NULL; -} - -Public void -_XimSetIMMode( - XIMResourceList res_list, - unsigned int list_num) -{ - XIMResourceList res; - unsigned int n = XIMNumber(im_mode); - register int i; - - for(i = 0; i < n; i++) { - if(!(res = _XimGetResourceListRecByQuark(res_list, - list_num, im_mode_quark[i]))) { - continue; - } - res->mode = im_mode[i].mode; - } - return; -} - -Private int -_XimCheckSetIMDefaultsMode( - XIMResourceList res) -{ - if(res->mode & XIM_MODE_IM_DEFAULT) { - return XIM_CHECK_VALID; - } - return XIM_CHECK_INVALID; -} - -Private int -_XimCheckSetIMValuesMode( - XIMResourceList res) -{ - if(res->mode & XIM_MODE_IM_SET) { - return XIM_CHECK_VALID; - } - return XIM_CHECK_INVALID; -} - -Private int - _XimCheckGetIMValuesMode( - XIMResourceList res) -{ - if(res->mode & XIM_MODE_IM_GET) { - return XIM_CHECK_VALID; - } - return XIM_CHECK_INVALID; -} - -Public int - _XimCheckIMMode( - XIMResourceList res, - unsigned long mode) -{ - if(res->mode == 0) { - return XIM_CHECK_INVALID; - } - if(mode & XIM_SETIMDEFAULTS) { - return _XimCheckSetIMDefaultsMode(res); - } else if (mode & XIM_SETIMVALUES) { - return _XimCheckSetIMValuesMode(res); - } else if (mode & XIM_GETIMVALUES) { - return _XimCheckGetIMValuesMode(res); - } else { - return XIM_CHECK_ERROR; - } -} - -Public void -_XimSetICMode(XIMResourceList res_list, unsigned int list_num, XIMStyle style) -{ - XIMResourceList res; - unsigned int n = XIMNumber(ic_mode); - register int i; - unsigned int pre_offset; - unsigned int sts_offset; - - if(style & XIMPreeditArea) { - pre_offset = XOffsetOf(XimICMode, preedit_area_mode); - } else if(style & XIMPreeditCallbacks) { - pre_offset = XOffsetOf(XimICMode, preedit_callback_mode); - } else if(style & XIMPreeditPosition) { - pre_offset = XOffsetOf(XimICMode, preedit_position_mode); - } else if(style & XIMPreeditNothing) { - pre_offset = XOffsetOf(XimICMode, preedit_nothing_mode); - } else { - pre_offset = XOffsetOf(XimICMode, preedit_none_mode); - } - - if(style & XIMStatusArea) { - sts_offset = XOffsetOf(XimICMode, status_area_mode); - } else if(style & XIMStatusCallbacks) { - sts_offset = XOffsetOf(XimICMode, status_callback_mode); - } else if(style & XIMStatusNothing) { - sts_offset = XOffsetOf(XimICMode, status_nothing_mode); - } else { - sts_offset = XOffsetOf(XimICMode, status_none_mode); - } - - for(i = 0; i < n; i++) { - if(!(res = _XimGetResourceListRecByQuark(res_list, - list_num, ic_mode_quark[i]))) { - continue; - } - res->mode = ( (*(unsigned short *)((char *)&ic_mode[i] + pre_offset)) - | (*(unsigned short *)((char *)&ic_mode[i] + sts_offset))); - } - return; -} - -Private int -_XimCheckSetICDefaultsMode( - XIMResourceList res, - unsigned long mode) -{ - if(mode & XIM_PREEDIT_ATTR) { - if(!(res->mode & XIM_MODE_PRE_MASK)) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_PRE_CREATE) { - return XIM_CHECK_ERROR; - } else if (!(res->mode & XIM_MODE_PRE_DEFAULT)) { - return XIM_CHECK_INVALID; - } - - } else if(mode & XIM_STATUS_ATTR) { - if(!(res->mode & XIM_MODE_STS_MASK)) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_STS_CREATE) { - return XIM_CHECK_ERROR; - } - if(!(res->mode & XIM_MODE_STS_DEFAULT)) { - return XIM_CHECK_INVALID; - } - - } else { - if(!res->mode) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_IC_CREATE) { - return XIM_CHECK_ERROR; - } - if(!(res->mode & XIM_MODE_IC_DEFAULT)) { - return XIM_CHECK_INVALID; - } - } - return XIM_CHECK_VALID; -} - -Private int -_XimCheckCreateICMode( - XIMResourceList res, - unsigned long mode) -{ - if(mode & XIM_PREEDIT_ATTR) { - if(!(res->mode & XIM_MODE_PRE_MASK)) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_PRE_CREATE) { - res->mode &= ~XIM_MODE_PRE_CREATE; - } else if(res->mode & XIM_MODE_PRE_ONCE) { - res->mode &= ~XIM_MODE_PRE_ONCE; - } else if(res->mode & XIM_MODE_PRE_DEFAULT) { - res->mode &= ~XIM_MODE_PRE_DEFAULT; - } else if (!(res->mode & XIM_MODE_PRE_SET)) { - return XIM_CHECK_ERROR; - } - - } else if(mode & XIM_STATUS_ATTR) { - if(!(res->mode & XIM_MODE_STS_MASK)) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_STS_CREATE) { - res->mode &= ~XIM_MODE_STS_CREATE; - } else if(res->mode & XIM_MODE_STS_ONCE) { - res->mode &= ~XIM_MODE_STS_ONCE; - } else if(res->mode & XIM_MODE_STS_DEFAULT) { - res->mode &= ~XIM_MODE_STS_DEFAULT; - } else if (!(res->mode & XIM_MODE_STS_SET)) { - return XIM_CHECK_ERROR; - } - - } else { - if(!res->mode) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_IC_CREATE) { - res->mode &= ~XIM_MODE_IC_CREATE; - } else if(res->mode & XIM_MODE_IC_ONCE) { - res->mode &= ~XIM_MODE_IC_ONCE; - } else if(res->mode & XIM_MODE_IC_DEFAULT) { - res->mode &= ~XIM_MODE_IC_DEFAULT; - } else if (!(res->mode & XIM_MODE_IC_SET)) { - return XIM_CHECK_ERROR; - } - } - return XIM_CHECK_VALID; -} - -Private int -_XimCheckSetICValuesMode( - XIMResourceList res, - unsigned long mode) -{ - if(mode & XIM_PREEDIT_ATTR) { - if(!(res->mode & XIM_MODE_PRE_MASK)) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_PRE_ONCE) { - res->mode &= ~XIM_MODE_PRE_ONCE; - } else if(!(res->mode & XIM_MODE_PRE_SET)) { - return XIM_CHECK_ERROR; - } - - } else if(mode & XIM_STATUS_ATTR) { - if(!(res->mode & XIM_MODE_STS_MASK)) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_STS_ONCE) { - res->mode &= ~XIM_MODE_STS_ONCE; - } else if(!(res->mode & XIM_MODE_STS_SET)) { - return XIM_CHECK_ERROR; - } - - } else { - if(!res->mode) { - return XIM_CHECK_INVALID; - } - - if(res->mode & XIM_MODE_IC_ONCE) { - res->mode &= ~XIM_MODE_IC_ONCE; - } else if(!(res->mode & XIM_MODE_IC_SET)) { - return XIM_CHECK_ERROR; - } - } - return XIM_CHECK_VALID; -} - -Private int -_XimCheckGetICValuesMode( - XIMResourceList res, - unsigned long mode) -{ - if(mode & XIM_PREEDIT_ATTR) { - if(!(res->mode & XIM_MODE_PRE_MASK)) { - return XIM_CHECK_INVALID; - } - - if(!(res->mode & XIM_MODE_PRE_GET)) { - return XIM_CHECK_ERROR; - } - - } else if(mode & XIM_STATUS_ATTR) { - if(!(res->mode & XIM_MODE_STS_MASK)) { - return XIM_CHECK_INVALID; - } - - if(!(res->mode & XIM_MODE_STS_GET)) { - return XIM_CHECK_ERROR; - } - - } else { - if(!res->mode) { - return XIM_CHECK_INVALID; - } - - if(!(res->mode & XIM_MODE_IC_GET)) { - return XIM_CHECK_ERROR; - } - } - return XIM_CHECK_VALID; -} - -Public int - _XimCheckICMode( - XIMResourceList res, - unsigned long mode) -{ - if(mode &XIM_SETICDEFAULTS) { - return _XimCheckSetICDefaultsMode(res, mode); - } else if (mode & XIM_CREATEIC) { - return _XimCheckCreateICMode(res, mode); - } else if (mode & XIM_SETICVALUES) { - return _XimCheckSetICValuesMode(res, mode); - } else if (mode & XIM_GETICVALUES) { - return _XimCheckGetICValuesMode(res, mode); - } else { - return XIM_CHECK_ERROR; - } -} - -Public Bool -_XimSetLocalIMDefaults( - Xim im, - XPointer top, - XIMResourceList res_list, - unsigned int list_num) -{ - XimValueOffsetInfo info; - unsigned int num; - register int i; - XIMResourceList res; - int check; - - info = im_attr_info; - num = XIMNumber(im_attr_info); - - for(i = 0; i < num; i++) { - if((res = _XimGetResourceListRecByQuark( res_list, list_num, - info[i].quark)) == (XIMResourceList)NULL) { - return False; - } - - check = _XimCheckIMMode(res, XIM_SETIMDEFAULTS); - if(check == XIM_CHECK_INVALID) { - continue; - } else if (check == XIM_CHECK_ERROR) { - return False; - } - - if(!info[i].defaults) { - continue; - } - if(!(info[i].defaults(&info[i], top, (XPointer)NULL, 0))) { - return False; - } - } - return True; -} - -Public Bool -_XimSetICDefaults( - Xic ic, - XPointer top, - unsigned long mode, - XIMResourceList res_list, - unsigned int list_num) -{ - unsigned int num; - XimValueOffsetInfo info; - register int i; - XIMResourceList res; - int check; - XrmQuark pre_quark; - XrmQuark sts_quark; - - pre_quark = XrmStringToQuark(XNPreeditAttributes); - sts_quark = XrmStringToQuark(XNStatusAttributes); - - if(mode & XIM_PREEDIT_ATTR) { - info = ic_pre_attr_info; - num = XIMNumber(ic_pre_attr_info); - } else if(mode & XIM_STATUS_ATTR) { - info = ic_sts_attr_info; - num = XIMNumber(ic_sts_attr_info); - } else { - info = ic_attr_info; - num = XIMNumber(ic_attr_info); - } - - for(i = 0; i < num; i++) { - if(info[i].quark == pre_quark) { - if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset), - (mode | XIM_PREEDIT_ATTR), res_list, list_num)) { - return False; - } - } else if (info[i].quark == sts_quark) { - if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset), - (mode | XIM_STATUS_ATTR), res_list, list_num)) { - return False; - } - } else { - if(!(res = _XimGetResourceListRecByQuark(res_list, list_num, - info[i].quark))) { - return False; - } - - check = _XimCheckICMode(res, mode); - if (check == XIM_CHECK_INVALID) { - continue; - } else if (check == XIM_CHECK_ERROR) { - return False; - } - - if (!info[i].defaults) { - continue; - } - if (!(info[i].defaults(&info[i], top, (XPointer)ic, mode))) { - return False; - } - } - } - return True; -} - -Private Bool -_XimEncodeAttr( - XimValueOffsetInfo info, - unsigned int num, - XIMResourceList res, - XPointer top, - XPointer val) -{ - register int i; - - for(i = 0; i < num; i++ ) { - if(info[i].quark == res->xrm_name) { - if(!info[i].encode) { - return False; - } - return (*info[i].encode)(&info[i], top, val); - } - } - return False; -} - -Public Bool -_XimEncodeLocalIMAttr( - XIMResourceList res, - XPointer top, - XPointer val) -{ - return _XimEncodeAttr(im_attr_info, XIMNumber(im_attr_info), - res, top, val); -} - -Public Bool -_XimEncodeLocalICAttr( - Xic ic, - XIMResourceList res, - XPointer top, - XIMArg *arg, - unsigned long mode) -{ - unsigned int num; - XimValueOffsetInfo info; - - if(mode & XIM_PREEDIT_ATTR) { - info = ic_pre_attr_info; - num = XIMNumber(ic_pre_attr_info); - } else if(mode & XIM_STATUS_ATTR) { - info = ic_sts_attr_info; - num = XIMNumber(ic_sts_attr_info); - } else { - info = ic_attr_info; - num = XIMNumber(ic_attr_info); - } - - return _XimEncodeAttr(info, num, res, top, arg->value); -} - -Private Bool -_XimEncodeLocalTopValue( - Xic ic, - XIMResourceList res, - XPointer val, - Bool flag) -{ - XIMArg *p = (XIMArg *)val; - - if (res->xrm_name == XrmStringToQuark(XNClientWindow)) { - ic->core.client_window = (Window)p->value; - if (ic->core.focus_window == (Window)0) - ic->core.focus_window = ic->core.client_window; - if (flag) { - _XRegisterFilterByType(ic->core.im->core.display, - ic->core.focus_window, - KeyPress, KeyRelease, _XimLocalFilter, (XPointer)ic); - } - } else if (res->xrm_name == XrmStringToQuark(XNFocusWindow)) { - if (ic->core.client_window) { - if (flag) { - _XUnregisterFilter(ic->core.im->core.display, - ic->core.focus_window, _XimLocalFilter, (XPointer)ic); - } - ic->core.focus_window = (Window)p->value; - if (flag) { - _XRegisterFilterByType(ic->core.im->core.display, - ic->core.focus_window, KeyPress, KeyRelease, - _XimLocalFilter, (XPointer)ic); - } - } else - ic->core.focus_window = (Window)p->value; - } - return True; -} - -Private Bool -_XimEncodeLocalPreeditValue( - Xic ic, - XIMResourceList res, - XPointer val) -{ - XIMArg *p = (XIMArg *)val; - - if (res->xrm_name == XrmStringToQuark(XNStdColormap)) { - XStandardColormap *colormap_ret; - int count; - - if (!(XGetRGBColormaps(ic->core.im->core.display, - ic->core.focus_window, &colormap_ret, - &count, (Atom)p->value))) - return False; - - Xfree(colormap_ret); - } - return True; -} - -Private Bool -_XimEncodeLocalStatusValue( - Xic ic, - XIMResourceList res, - XPointer val) -{ - XIMArg *p = (XIMArg *)val; - - if (res->xrm_name == XrmStringToQuark(XNStdColormap)) { - XStandardColormap *colormap_ret; - int count; - - if (!(XGetRGBColormaps(ic->core.im->core.display, - ic->core.focus_window, &colormap_ret, - &count, (Atom)p->value))) - return False; - - Xfree(colormap_ret); - } - return True; -} - -Public char * -_XimSetICValueData( - Xic ic, - XPointer top, - XIMResourceList res_list, - unsigned int list_num, - XIMArg *values, - unsigned long mode, - Bool flag) -{ - register XIMArg *p; - XIMResourceList res; - char *name; - int check; - XrmQuark pre_quark; - XrmQuark sts_quark; - - pre_quark = XrmStringToQuark(XNPreeditAttributes); - sts_quark = XrmStringToQuark(XNStatusAttributes); - - for(p = values; p->name != NULL; p++) { - if((res = _XimGetResourceListRec(res_list, list_num, - p->name)) == (XIMResourceList)NULL) { - return p->name; - } - if(res->xrm_name == pre_quark) { - if(((name = _XimSetICValueData(ic, - (XPointer)(&((XimDefICValues *)top)->preedit_attr), - res_list, list_num, (XIMArg *)p->value, - (mode | XIM_PREEDIT_ATTR), flag)))) { - return name; - } - } else if(res->xrm_name == sts_quark) { - if(((name = _XimSetICValueData(ic, - (XPointer)(&((XimDefICValues *)top)->status_attr), - res_list, list_num, (XIMArg *)p->value, - (mode | XIM_STATUS_ATTR), flag)))) { - return name; - } - } else { - check = _XimCheckICMode(res, mode); - if(check == XIM_CHECK_INVALID) { - continue; - } else if(check == XIM_CHECK_ERROR) { - return p->name; - } - - if(mode & XIM_PREEDIT_ATTR) { - if (!_XimEncodeLocalPreeditValue(ic, res, (XPointer)p)) - return False; - } else if(mode & XIM_STATUS_ATTR) { - if (!_XimEncodeLocalStatusValue(ic, res, (XPointer)p)) - return False; - } else { - if (!_XimEncodeLocalTopValue(ic, res, (XPointer)p, flag)) - return False; - } - if(_XimEncodeLocalICAttr(ic, res, top, p, mode) == False) { - return p->name; - } - } - } - return NULL; -} - -Private Bool -_XimCheckInputStyle( - XIMStyles *styles, - XIMStyle style) -{ - int num = styles->count_styles; - register int i; - - for(i = 0; i < num; i++) { - if(styles->supported_styles[i] == style) { - return True; - } - } - return False; -} - -Public Bool -_XimCheckLocalInputStyle( - Xic ic, - XPointer top, - XIMArg *values, - XIMStyles *styles, - XIMResourceList res_list, - unsigned int list_num) -{ - XrmQuark quark = XrmStringToQuark(XNInputStyle); - register XIMArg *p; - XIMResourceList res; - - for(p = values; p && p->name != NULL; p++) { - if(quark == XrmStringToQuark(p->name)) { - if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) { - return False; - } - if(!_XimEncodeLocalICAttr(ic, res, top, p, 0)) { - return False; - } - if (_XimCheckInputStyle(styles, - ((XimDefICValues *)top)->input_style)) { - return True; - } - return False; - } - } - return False; -} - -Private Bool -_XimDecodeAttr( - XimValueOffsetInfo info, - unsigned int num, - XIMResourceList res, - XPointer top, - XPointer val) -{ - register int i; - - for(i = 0; i < num; i++ ) { - if(info[i].quark == res->xrm_name) { - if(!info[i].decode) { - return False; - } - return (*info[i].decode)(&info[i], top, val); - } - } - return False; -} - -Public Bool -_XimDecodeLocalIMAttr( - XIMResourceList res, - XPointer top, - XPointer val) -{ - return _XimDecodeAttr(im_attr_info, XIMNumber(im_attr_info), - res, top, val); -} - -Public Bool -_XimDecodeLocalICAttr( - XIMResourceList res, - XPointer top, - XPointer val, - unsigned long mode) -{ - unsigned int num; - XimValueOffsetInfo info; - - if(mode & XIM_PREEDIT_ATTR) { - info = ic_pre_attr_info; - num = XIMNumber(ic_pre_attr_info); - } else if(mode & XIM_STATUS_ATTR) { - info = ic_sts_attr_info; - num = XIMNumber(ic_sts_attr_info); - } else { - info = ic_attr_info; - num = XIMNumber(ic_attr_info); - } - - return _XimDecodeAttr(info, num, res, top, val); -} - -Public char * -_XimGetICValueData(Xic ic, XPointer top, XIMResourceList res_list, - unsigned int list_num, XIMArg *values, unsigned long mode) -{ - register XIMArg *p; - XIMResourceList res; - char *name; - int check; - XrmQuark pre_quark; - XrmQuark sts_quark; - - pre_quark = XrmStringToQuark(XNPreeditAttributes); - sts_quark = XrmStringToQuark(XNStatusAttributes); - - for(p = values; p->name != NULL; p++) { - if((res = _XimGetResourceListRec(res_list, list_num, - p->name)) == (XIMResourceList)NULL) { - return p->name; - } - if(res->xrm_name == pre_quark) { - if((name = _XimGetICValueData(ic, - (XPointer)(&((XimDefICValues *)top)->preedit_attr), - res_list, list_num, (XIMArg *)p->value, - (mode | XIM_PREEDIT_ATTR)))) { - return name; - } - } else if(res->xrm_name == sts_quark) { - if((name = _XimGetICValueData(ic, - (XPointer)(&((XimDefICValues *)top)->status_attr), - res_list, list_num, (XIMArg *)p->value, - (mode | XIM_STATUS_ATTR)))) { - return name; - } - } else { - check = _XimCheckICMode(res, mode); - if(check == XIM_CHECK_INVALID) { - continue; - } else if(check == XIM_CHECK_ERROR) { - return p->name; - } - - if(_XimDecodeLocalICAttr(res, top, p->value, mode) == False) { - return p->name; - } - } - } - return NULL; -} - -Public void -_XimGetCurrentIMValues(Xim im, XimDefIMValues *im_values) -{ - bzero((char *)im_values, sizeof(XimDefIMValues)); - - im_values->styles = im->core.styles; - im_values->im_values_list = im->core.im_values_list; - im_values->ic_values_list = im->core.ic_values_list; - im_values->destroy_callback = im->core.destroy_callback; - im_values->res_name = im->core.res_name; - im_values->res_class = im->core.res_class; - im_values->visible_position = im->core.visible_position; -} - -Public void -_XimSetCurrentIMValues(Xim im, XimDefIMValues *im_values) -{ - im->core.styles = im_values->styles; - im->core.im_values_list = im_values->im_values_list; - im->core.ic_values_list = im_values->ic_values_list; - im->core.destroy_callback = im_values->destroy_callback; - im->core.res_name = im_values->res_name; - im->core.res_class = im_values->res_class; - im->core.visible_position = im_values->visible_position; -} - -Public void -_XimGetCurrentICValues(Xic ic, XimDefICValues *ic_values) -{ - bzero((char *)ic_values, sizeof(XimDefICValues)); - - ic_values->input_style = ic->core.input_style; - ic_values->client_window = ic->core.client_window; - ic_values->focus_window = ic->core.focus_window; - ic_values->filter_events = ic->core.filter_events; - ic_values->geometry_callback = ic->core.geometry_callback; - ic_values->res_name = ic->core.res_name; - ic_values->res_class = ic->core.res_class; - ic_values->destroy_callback = ic->core.destroy_callback; - ic_values->string_conversion_callback - = ic->core.string_conversion_callback; - ic_values->string_conversion = ic->core.string_conversion; - ic_values->reset_state = ic->core.reset_state; - ic_values->hotkey = ic->core.hotkey; - ic_values->hotkey_state = ic->core.hotkey_state; - ic_values->preedit_attr = ic->core.preedit_attr; - ic_values->status_attr = ic->core.status_attr; -} - -Public void -_XimSetCurrentICValues( - Xic ic, - XimDefICValues *ic_values) -{ - ic->core.input_style = ic_values->input_style; - ic->core.client_window = ic_values->client_window; - if (ic_values->focus_window) - ic->core.focus_window = ic_values->focus_window; - ic->core.filter_events = ic_values->filter_events; - ic->core.geometry_callback = ic_values->geometry_callback; - ic->core.res_name = ic_values->res_name; - ic->core.res_class = ic_values->res_class; - ic->core.destroy_callback = ic_values->destroy_callback; - ic->core.string_conversion_callback - = ic_values->string_conversion_callback; - ic->core.string_conversion = ic_values->string_conversion; - ic->core.reset_state = ic_values->reset_state; - ic->core.hotkey = ic_values->hotkey; - ic->core.hotkey_state = ic_values->hotkey_state; - ic->core.preedit_attr = ic_values->preedit_attr; - ic->core.status_attr = ic_values->status_attr; -} - -Private void -_XimInitialIMOffsetInfo(void) -{ - unsigned int n = XIMNumber(im_attr_info); - register int i; - - for(i = 0; i < n; i++) { - im_attr_info[i].quark = XrmStringToQuark(GET_NAME(im_attr_info[i])); - } -} - -Private void -_XimInitialICOffsetInfo(void) -{ - unsigned int n; - register int i; - - n = XIMNumber(ic_attr_info); - for(i = 0; i < n; i++) { - ic_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_attr_info[i])); - } - - n = XIMNumber(ic_pre_attr_info); - for(i = 0; i < n; i++) { - ic_pre_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_pre_attr_info[i])); - } - - n = XIMNumber(ic_sts_attr_info); - for(i = 0; i < n; i++) { - ic_sts_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_sts_attr_info[i])); - } -} - -Private void -_XimInitialIMMode(void) -{ - unsigned int n = XIMNumber(im_mode); - register int i; - - for(i = 0; i < n; i++) { - im_mode_quark[i] = XrmStringToQuark(GET_NAME(im_mode[i])); - } -} - -Private void -_XimInitialICMode(void) -{ - unsigned int n = XIMNumber(ic_mode); - register int i; - - for(i = 0; i < n; i++) { - ic_mode_quark[i] = XrmStringToQuark(GET_NAME(ic_mode[i])); - } -} - -Public void -_XimInitialResourceInfo(void) -{ - static Bool init_flag = False; - - if(init_flag == True) { - return; - } - _XimInitialIMOffsetInfo(); - _XimInitialICOffsetInfo(); - _XimInitialIMMode(); - _XimInitialICMode(); - init_flag = True; -} +/******************************************************************
+
+ Copyright 1990, 1991, 1992,1993, 1994 by FUJITSU LIMITED
+ 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
+and Sony Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission. FUJITSU LIMITED 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 AND SONY CORPORATION DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 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.
+
+ Author: Takashi Fujiwara FUJITSU LIMITED
+ fujiwara@a80.tech.yk.fujitsu.co.jp
+ Modifier: Makoto Wakamatsu Sony Corporation
+ makoto@sm.sony.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "Xresource.h"
+
+#define GET_NAME(x) name_table + x.name_offset
+
+typedef struct _XimValueOffsetInfo {
+ unsigned short name_offset;
+ XrmQuark quark;
+ unsigned int offset;
+ Bool (*defaults)(
+ struct _XimValueOffsetInfo *, XPointer, XPointer, unsigned long
+ );
+ Bool (*encode)(
+ struct _XimValueOffsetInfo *, XPointer, XPointer
+ );
+ Bool (*decode)(
+ struct _XimValueOffsetInfo *, XPointer, XPointer
+ );
+} XimValueOffsetInfoRec, *XimValueOffsetInfo;
+
+#ifdef XIM_CONNECTABLE
+Private Bool
+_XimCheckBool(str)
+ char *str;
+{
+ if(!strcmp(str, "True") || !strcmp(str, "true") ||
+ !strcmp(str, "Yes") || !strcmp(str, "yes") ||
+ !strcmp(str, "ON") || !strcmp(str, "on"))
+ return True;
+ return False;
+}
+
+Public void
+_XimSetProtoResource(im)
+ Xim im;
+{
+ char res_name_buf[256];
+ char* res_name;
+ char res_class_buf[256];
+ char* res_class;
+ char* str_type;
+ XrmValue value;
+ XIMStyle preedit_style = 0;
+ XIMStyle status_style = 0;
+ XIMStyles* imstyles;
+ char* dotximdot = ".xim.";
+ char* ximdot = "xim.";
+ char* dotXimdot = ".Xim.";
+ char* Ximdot = "Xim.";
+
+ if (!im->core.rdb)
+ return;
+
+ if (strlen (im->core.res_name) < 200) res_name = res_name_buf;
+ else res_name = Xmalloc (strlen (im->core.res_name) + 50);
+ if (strlen (im->core.res_class) < 200) res_class = res_class_buf;
+ else res_class = Xmalloc (strlen (im->core.res_class) + 50);
+ /* pretend malloc always works */
+
+ (void) sprintf (res_name, "%s%s%s",
+ im->core.res_name != NULL ? im->core.res_name : "*",
+ im->core.res_name != NULL ? dotximdot : ximdot,
+ "useAuth");
+ (void) sprintf (res_class, "%s%s%s",
+ im->core.res_class != NULL ? im->core.res_class : "*",
+ im->core.res_class != NULL ? dotXimdot : Ximdot,
+ "UseAuth");
+ bzero(&value, sizeof(XrmValue));
+ if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+ if(_XimCheckBool(value.addr)) {
+ MARK_USE_AUTHORIZATION_FUNC(im);
+ }
+ }
+
+ (void) sprintf (res_name, "%s%s%s",
+ im->core.res_name != NULL ? im->core.res_name : "*",
+ im->core.res_name != NULL ? dotximdot : ximdot,
+ "delaybinding");
+ (void) sprintf (res_class, "%s%s%s",
+ im->core.res_class != NULL ? im->core.res_class : "*",
+ im->core.res_class != NULL ? dotXimdot : Ximdot,
+ "Delaybinding");
+ bzero(&value, sizeof(XrmValue));
+ if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+ if(_XimCheckBool(value.addr)) {
+ MARK_DELAYBINDABLE(im);
+ }
+ }
+
+ (void) sprintf (res_name, "%s%s%s",
+ im->core.res_name != NULL ? im->core.res_name : "*",
+ im->core.res_name != NULL ? dotximdot : ximdot,
+ "reconnect");
+ (void) sprintf (res_class, "%s%s%s",
+ im->core.res_class != NULL ? im->core.res_class : "*",
+ im->core.res_class != NULL ? dotXimdot : Ximdot,
+ "Reconnect");
+ bzero(&value, sizeof(XrmValue));
+ if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+ if(_XimCheckBool(value.addr)) {
+ MARK_RECONNECTABLE(im);
+ }
+ }
+
+ if(!IS_CONNECTABLE(im)) {
+ if (res_name != res_name_buf) Xfree (res_name);
+ if (res_class != res_class_buf) Xfree (res_class);
+ return;
+ }
+
+ (void) sprintf (res_name, "%s%s%s",
+ im->core.res_name != NULL ? im->core.res_name : "*",
+ im->core.res_name != NULL ? dotximdot : ximdot,
+ "preeditDefaultStyle");
+ (void) sprintf (res_class, "%s%s%s",
+ im->core.res_class != NULL ? im->core.res_class : "*",
+ im->core.res_class != NULL ? dotXimdot : Ximdot,
+ "PreeditDefaultStyle");
+ if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+ if(!strcmp(value.addr, "XIMPreeditArea"))
+ preedit_style = XIMPreeditArea;
+ else if(!strcmp(value.addr, "XIMPreeditCallbacks"))
+ preedit_style = XIMPreeditCallbacks;
+ else if(!strcmp(value.addr, "XIMPreeditPosition"))
+ preedit_style = XIMPreeditPosition;
+ else if(!strcmp(value.addr, "XIMPreeditNothing"))
+ preedit_style = XIMPreeditNothing;
+ else if(!strcmp(value.addr, "XIMPreeditNone"))
+ preedit_style = XIMPreeditNone;
+ }
+ if(!preedit_style)
+ preedit_style = XIMPreeditNothing;
+
+ (void) sprintf (res_name, "%s%s%s",
+ im->core.res_name != NULL ? im->core.res_name : "*",
+ im->core.res_name != NULL ? dotximdot : ximdot,
+ "statusDefaultStyle");
+ (void) sprintf (res_class, "%s%s%s",
+ im->core.res_class != NULL ? im->core.res_class : "*",
+ im->core.res_class != NULL ? dotXimdot : Ximdot,
+ "StatusDefaultStyle");
+ if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+ if(!strcmp(value.addr, "XIMStatusArea"))
+ status_style = XIMStatusArea;
+ else if(!strcmp(value.addr, "XIMStatusCallbacks"))
+ status_style = XIMStatusCallbacks;
+ else if(!strcmp(value.addr, "XIMStatusNothing"))
+ status_style = XIMStatusNothing;
+ else if(!strcmp(value.addr, "XIMStatusNone"))
+ status_style = XIMStatusNone;
+ }
+ if(!status_style)
+ status_style = XIMStatusNothing;
+
+ if(!(imstyles = (XIMStyles *)Xmalloc(sizeof(XIMStyles) + sizeof(XIMStyle)))){
+ if (res_name != res_name_buf) Xfree (res_name);
+ if (res_class != res_class_buf) Xfree (res_class);
+ return;
+ }
+ imstyles->count_styles = 1;
+ imstyles->supported_styles =
+ (XIMStyle *)((char *)imstyles + sizeof(XIMStyles));
+ imstyles->supported_styles[0] = preedit_style | status_style;
+ im->private.proto.default_styles = imstyles;
+ if (res_name != res_name_buf) Xfree (res_name);
+ if (res_class != res_class_buf) Xfree (res_class);
+}
+#endif /* XIM_CONNECTABLE */
+
+static const char name_table[] =
+ /* 0 */ XNQueryInputStyle"\0"
+ /* 16 */ XNClientWindow"\0"
+ /* 29 */ XNInputStyle"\0"
+ /* 40 */ XNFocusWindow"\0"
+ /* 52 */ XNResourceName"\0"
+ /* 65 */ XNResourceClass"\0"
+ /* 79 */ XNGeometryCallback"\0"
+ /* 96 */ XNDestroyCallback"\0"
+ /* 112 */ XNFilterEvents"\0"
+ /* 125 */ XNPreeditStartCallback"\0"
+ /* 146 */ XNPreeditDoneCallback"\0"
+ /* 166 */ XNPreeditDrawCallback"\0"
+ /* 186 */ XNPreeditCaretCallback"\0"
+ /* 207 */ XNPreeditStateNotifyCallback"\0"
+ /* 234 */ XNPreeditAttributes"\0"
+ /* 252 */ XNStatusStartCallback"\0"
+ /* 272 */ XNStatusDoneCallback"\0"
+ /* 291 */ XNStatusDrawCallback"\0"
+ /* 310 */ XNStatusAttributes"\0"
+ /* 327 */ XNArea"\0"
+ /* 332 */ XNAreaNeeded"\0"
+ /* 343 */ XNSpotLocation"\0"
+ /* 356 */ XNColormap"\0"
+ /* 365 */ XNStdColormap"\0"
+ /* 377 */ XNForeground"\0"
+ /* 388 */ XNBackground"\0"
+ /* 399 */ XNBackgroundPixmap"\0"
+ /* 416 */ XNFontSet"\0"
+ /* 424 */ XNLineSpace"\0"
+ /* 434 */ XNCursor"\0"
+ /* 441 */ XNQueryIMValuesList"\0"
+ /* 459 */ XNQueryICValuesList"\0"
+ /* 477 */ XNVisiblePosition"\0"
+ /* 493 */ XNStringConversionCallback"\0"
+ /* 518 */ XNStringConversion"\0"
+ /* 535 */ XNResetState"\0"
+ /* 546 */ XNHotKey"\0"
+ /* 553 */ XNHotKeyState"\0"
+ /* 565 */ XNPreeditState
+;
+
+#define OFFSET_XNQUERYINPUTSTYLE 0
+#define OFFSET_XNCLIENTWINDOW 16
+#define OFFSET_XNINPUTSTYLE 29
+#define OFFSET_XNFOCUSWINDOW 40
+#define OFFSET_XNRESOURCENAME 52
+#define OFFSET_XNRESOURCECLASS 65
+#define OFFSET_XNGEOMETRYCALLBACK 79
+#define OFFSET_XNDESTROYCALLBACK 96
+#define OFFSET_XNFILTEREVENTS 112
+#define OFFSET_XNPREEDITSTARTCALLBACK 125
+#define OFFSET_XNPREEDITDONECALLBACK 146
+#define OFFSET_XNPREEDITDRAWCALLBACK 166
+#define OFFSET_XNPREEDITCARETCALLBACK 186
+#define OFFSET_XNPREEDITSTATENOTIFYCALLBACK 207
+#define OFFSET_XNPREEDITATTRIBUTES 234
+#define OFFSET_XNSTATUSSTARTCALLBACK 252
+#define OFFSET_XNSTATUSDONECALLBACK 272
+#define OFFSET_XNSTATUSDRAWCALLBACK 291
+#define OFFSET_XNSTATUSATTRIBUTES 310
+#define OFFSET_XNAREA 327
+#define OFFSET_XNAREANEEDED 332
+#define OFFSET_XNSPOTLOCATION 343
+#define OFFSET_XNCOLORMAP 356
+#define OFFSET_XNSTDCOLORMAP 365
+#define OFFSET_XNFOREGROUND 377
+#define OFFSET_XNBACKGROUND 388
+#define OFFSET_XNBACKGROUNDPIXMAP 399
+#define OFFSET_XNFONTSET 416
+#define OFFSET_XNLINESPACE 424
+#define OFFSET_XNCURSOR 434
+#define OFFSET_XNQUERYIMVALUESLIST 441
+#define OFFSET_XNQUERYICVALUESLIST 459
+#define OFFSET_XNVISIBLEPOSITION 477
+#define OFFSET_XNSTRINGCONVERSIONCALLBACK 493
+#define OFFSET_XNSTRINGCONVERSION 518
+#define OFFSET_XNRESETSTATE 535
+#define OFFSET_XNHOTKEY 546
+#define OFFSET_XNHOTKEYSTATE 553
+#define OFFSET_XNPREEDITSTATE 565
+
+/* offsets into name_table */
+static const unsigned short supported_local_im_values_list[] = {
+ OFFSET_XNQUERYINPUTSTYLE,
+ OFFSET_XNRESOURCENAME,
+ OFFSET_XNRESOURCECLASS,
+ OFFSET_XNDESTROYCALLBACK,
+ OFFSET_XNQUERYIMVALUESLIST,
+ OFFSET_XNQUERYICVALUESLIST,
+ OFFSET_XNVISIBLEPOSITION
+};
+
+/* offsets into name_table */
+static const unsigned short supported_local_ic_values_list[] = {
+ OFFSET_XNINPUTSTYLE,
+ OFFSET_XNCLIENTWINDOW,
+ OFFSET_XNFOCUSWINDOW,
+ OFFSET_XNRESOURCENAME,
+ OFFSET_XNRESOURCECLASS,
+ OFFSET_XNGEOMETRYCALLBACK,
+ OFFSET_XNFILTEREVENTS,
+ OFFSET_XNDESTROYCALLBACK,
+ OFFSET_XNSTRINGCONVERSIONCALLBACK,
+ OFFSET_XNSTRINGCONVERSIONCALLBACK,
+ OFFSET_XNRESETSTATE,
+ OFFSET_XNHOTKEY,
+ OFFSET_XNHOTKEYSTATE,
+ OFFSET_XNPREEDITATTRIBUTES,
+ OFFSET_XNSTATUSATTRIBUTES,
+ OFFSET_XNAREA,
+ OFFSET_XNAREANEEDED,
+ OFFSET_XNSPOTLOCATION,
+ OFFSET_XNCOLORMAP,
+ OFFSET_XNSTDCOLORMAP,
+ OFFSET_XNFOREGROUND,
+ OFFSET_XNBACKGROUND,
+ OFFSET_XNBACKGROUNDPIXMAP,
+ OFFSET_XNFONTSET,
+ OFFSET_XNLINESPACE,
+ OFFSET_XNCURSOR,
+ OFFSET_XNPREEDITSTARTCALLBACK,
+ OFFSET_XNPREEDITDONECALLBACK,
+ OFFSET_XNPREEDITDRAWCALLBACK,
+ OFFSET_XNPREEDITCARETCALLBACK,
+ OFFSET_XNSTATUSSTARTCALLBACK,
+ OFFSET_XNSTATUSDONECALLBACK,
+ OFFSET_XNSTATUSDRAWCALLBACK,
+ OFFSET_XNPREEDITSTATE,
+ OFFSET_XNPREEDITSTATENOTIFYCALLBACK
+};
+
+static XIMStyle const supported_local_styles[] = {
+ XIMPreeditNone | XIMStatusNone,
+ XIMPreeditNothing | XIMStatusNothing,
+ 0 /* dummy */
+};
+
+Private Bool
+_XimDefaultStyles(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm, /* unused */
+ unsigned long mode) /* unused */
+{
+ XIMStyles *styles;
+ XIMStyles **out;
+ register int i;
+ unsigned int n;
+ int len;
+ XPointer tmp;
+
+ n = XIMNumber(supported_local_styles) - 1;
+ len = sizeof(XIMStyles) + sizeof(XIMStyle) * n;
+ if(!(tmp = Xcalloc(1, len))) {
+ return False;
+ }
+
+ styles = (XIMStyles *)tmp;
+ if (n > 0) {
+ styles->count_styles = (unsigned short)n;
+ styles->supported_styles =
+ (XIMStyle *)((char *)tmp + sizeof(XIMStyles));
+ for(i = 0; i < n; i++) {
+ styles->supported_styles[i] = supported_local_styles[i];
+ }
+ }
+
+ out = (XIMStyles **)((char *)top + info->offset);
+ *out = styles;
+ return True;
+}
+
+Private Bool
+_XimDefaultIMValues(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm, /* unused */
+ unsigned long mode) /* unused */
+{
+ XIMValuesList *values_list;
+ XIMValuesList **out;
+ register int i;
+ unsigned int n;
+ int len;
+ XPointer tmp;
+
+ n = XIMNumber(supported_local_im_values_list);
+ len = sizeof(XIMValuesList) + sizeof(char **) * n;
+ if(!(tmp = Xcalloc(1, len))) {
+ return False;
+ }
+
+ values_list = (XIMValuesList *)tmp;
+ if (n > 0) {
+ values_list->count_values = (unsigned short)n;
+ values_list->supported_values
+ = (char **)((char *)tmp + sizeof(XIMValuesList));
+ for(i = 0; i < n; i++) {
+ values_list->supported_values[i] =
+ (char *)name_table + supported_local_im_values_list[i];
+ }
+ }
+
+ out = (XIMValuesList **)((char *)top + info->offset);
+ *out = values_list;
+ return True;
+}
+
+Private Bool
+_XimDefaultICValues(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm, /* unused */
+ unsigned long mode) /* unused */
+{
+ XIMValuesList *values_list;
+ XIMValuesList **out;
+ register int i;
+ unsigned int n;
+ int len;
+ XPointer tmp;
+
+ n = XIMNumber(supported_local_ic_values_list);
+ len = sizeof(XIMValuesList) + sizeof(char **) * n;
+ if(!(tmp = Xcalloc(1, len))) {
+ return False;
+ }
+
+ values_list = (XIMValuesList *)tmp;
+ if (n > 0) {
+ values_list->count_values = (unsigned short)n;
+ values_list->supported_values
+ = (char **)((char *)tmp + sizeof(XIMValuesList));
+ for(i = 0; i < n; i++) {
+ values_list->supported_values[i] =
+ (char *)name_table + supported_local_ic_values_list[i];
+ }
+ }
+
+ out = (XIMValuesList **)((char *)top + info->offset);
+ *out = values_list;
+ return True;
+}
+
+Private Bool
+_XimDefaultVisiblePos(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm, /* unused */
+ unsigned long mode) /* unused */
+{
+ Bool *out;
+
+ out = (Bool *)((char *)top + info->offset);
+ *out = False;
+ return True;
+}
+
+Private Bool
+_XimDefaultFocusWindow(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Window *out;
+
+ if(ic->core.client_window == (Window)NULL) {
+ return True;
+ }
+
+ out = (Window *)((char *)top + info->offset);
+ *out = ic->core.client_window;
+ return True;
+}
+
+Private Bool
+_XimDefaultResName(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Xim im = (Xim)ic->core.im;
+ char **out;
+
+ if(im->core.res_name == (char *)NULL) {
+ return True;
+ }
+
+ out = (char **)((char *)top + info->offset);
+ *out = im->core.res_name;
+ return True;
+}
+
+Private Bool
+_XimDefaultResClass(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Xim im = (Xim)ic->core.im;
+ char **out;
+
+ if(im->core.res_class == (char *)NULL) {
+ return True;
+ }
+
+ out = (char **)((char *)top + info->offset);
+ *out = im->core.res_class;
+ return True;
+}
+
+Private Bool
+_XimDefaultDestroyCB(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Xim im = (Xim)ic->core.im;
+ XIMCallback *out;
+
+ out = (XIMCallback *)((char *)top + info->offset);
+ *out = im->core.destroy_callback;
+ return True;
+}
+
+Private Bool
+_XimDefaultResetState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ XIMResetState *out;
+
+ out = (XIMResetState *)((char *)top + info->offset);
+ *out = XIMInitialState;
+ return True;
+}
+
+Private Bool
+_XimDefaultHotKeyState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ XIMHotKeyState *out;
+
+ out = (XIMHotKeyState *)((char *)top + info->offset);
+ *out = XIMHotKeyStateOFF;
+ return True;
+}
+
+Private Bool
+_XimDefaultArea(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Xim im = (Xim)ic->core.im;
+ Window root_return;
+ int x_return, y_return;
+ unsigned int width_return, height_return;
+ unsigned int border_width_return;
+ unsigned int depth_return;
+ XRectangle area;
+ XRectangle *out;
+
+ if(ic->core.focus_window == (Window)NULL) {
+ return True;
+ }
+ if(XGetGeometry(im->core.display, (Drawable)ic->core.focus_window,
+ &root_return, &x_return, &y_return, &width_return,
+ &height_return, &border_width_return, &depth_return)
+ == (Status)Success) {
+ return True;
+ }
+ area.x = 0;
+ area.y = 0;
+ area.width = width_return;
+ area.height = height_return;
+
+ out = (XRectangle *)((char *)top + info->offset);
+ *out = area;
+ return True;
+}
+
+Private Bool
+_XimDefaultColormap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Xim im = (Xim)ic->core.im;
+ XWindowAttributes win_attr;
+ Colormap *out;
+
+ if(ic->core.client_window == (Window)NULL) {
+ return True;
+ }
+ if(XGetWindowAttributes(im->core.display, ic->core.client_window,
+ &win_attr) == (Status)Success) {
+ return True;
+ }
+
+ out = (Colormap *)((char *)top + info->offset);
+ *out = win_attr.colormap;
+ return True;
+}
+
+Private Bool
+_XimDefaultStdColormap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Atom *out;
+
+ out = (Atom *)((char *)top + info->offset);
+ *out = (Atom)0;
+ return True;
+}
+
+Private Bool
+_XimDefaultFg(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Xim im = (Xim)ic->core.im;
+ unsigned long fg;
+ unsigned long *out;
+
+ fg = WhitePixel(im->core.display, DefaultScreen(im->core.display));
+ out = (unsigned long *)((char *)top + info->offset);
+ *out = fg;
+ return True;
+}
+
+Private Bool
+_XimDefaultBg(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ Xim im = (Xim)ic->core.im;
+ unsigned long bg;
+ unsigned long *out;
+
+ bg = BlackPixel(im->core.display, DefaultScreen(im->core.display));
+ out = (unsigned long *)((char *)top + info->offset);
+ *out = bg;
+ return True;
+}
+
+Private Bool
+_XimDefaultBgPixmap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Pixmap *out;
+
+ out = (Pixmap *)((char *)top + info->offset);
+ *out = (Pixmap)0;
+ return True;
+}
+
+Private Bool
+_XimDefaultFontSet(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ XFontSet *out;
+
+ out = (XFontSet *)((char *)top + info->offset);
+ *out = 0;
+ return True;
+}
+
+Private Bool
+_XimDefaultLineSpace(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Xic ic = (Xic)parm;
+ XFontSet fontset;
+ XFontSetExtents *fset_extents;
+ int line_space = 0;
+ int *out;
+
+ if(mode & XIM_PREEDIT_ATTR) {
+ fontset = ic->core.preedit_attr.fontset;
+ } else if(mode & XIM_STATUS_ATTR) {
+ fontset = ic->core.status_attr.fontset;
+ } else {
+ return True;
+ }
+ if (fontset) {
+ fset_extents = XExtentsOfFontSet(fontset);
+ line_space = fset_extents->max_logical_extent.height;
+ }
+ out = (int *)((char *)top + info->offset);
+ *out = line_space;
+ return True;
+}
+
+Private Bool
+_XimDefaultCursor(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ Cursor *out;
+
+ out = (Cursor *)((char *)top + info->offset);
+ *out = (Cursor)0;
+ return True;
+}
+
+Private Bool
+_XimDefaultPreeditState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ XIMPreeditState *out;
+
+ out = (XIMPreeditState *)((char *)top + info->offset);
+ *out = XIMPreeditDisable;
+ return True;
+}
+
+Private Bool
+_XimDefaultNest(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer parm,
+ unsigned long mode)
+{
+ return True;
+}
+
+Private Bool
+_XimEncodeCallback(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMCallback *out;
+
+ out = (XIMCallback *)((char *)top + info->offset);
+ *out = *((XIMCallback *)val);
+ return True;
+}
+
+Private Bool
+_XimEncodeString(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ char *string;
+ char **out;
+
+ if(val == (XPointer)NULL) {
+ return False;
+ }
+ if (!(string = strdup((char *)val))) {
+ return False;
+ }
+
+ out = (char **)((char *)top + info->offset);
+ if(*out) {
+ Xfree(*out);
+ }
+ *out = string;
+ return True;
+}
+
+Private Bool
+_XimEncodeStyle(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMStyle *out;
+
+ out = (XIMStyle *)((char *)top + info->offset);
+ *out = (XIMStyle)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeWindow(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Window *out;
+
+ out = (Window *)((char *)top + info->offset);
+ *out = (Window)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeStringConv(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ /*
+ * Not yet
+ */
+ return True;
+}
+
+Private Bool
+_XimEncodeResetState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMResetState *out;
+
+ out = (XIMResetState *)((char *)top + info->offset);
+ *out = (XIMResetState)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeHotKey(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMHotKeyTriggers *hotkey = (XIMHotKeyTriggers *)val;
+ XIMHotKeyTriggers **out;
+ XIMHotKeyTriggers *key_list;
+ XIMHotKeyTrigger *key;
+ XPointer tmp;
+ int num;
+ int len;
+ register int i;
+
+ if(hotkey == (XIMHotKeyTriggers *)NULL) {
+ return True;
+ }
+
+ if((num = hotkey->num_hot_key) == 0) {
+ return True;
+ }
+
+ len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num;
+ if(!(tmp = (XPointer)Xmalloc(len))) {
+ return False;
+ }
+
+ key_list = (XIMHotKeyTriggers *)tmp;
+ key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers));
+
+ for(i = 0; i < num; i++) {
+ key[i] = hotkey->key[i];
+ }
+
+ key_list->num_hot_key = num;
+ key_list->key = key;
+
+ out = (XIMHotKeyTriggers **)((char *)top + info->offset);
+ *out = key_list;
+ return True;
+}
+
+Private Bool
+_XimEncodeHotKetState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMHotKeyState *out;
+
+ out = (XIMHotKeyState *)((char *)top + info->offset);
+ *out = (XIMHotKeyState)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeRectangle(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XRectangle *out;
+
+ out = (XRectangle *)((char *)top + info->offset);
+ *out = *((XRectangle *)val);
+ return True;
+}
+
+Private Bool
+_XimEncodeSpot(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XPoint *out;
+
+ out = (XPoint *)((char *)top + info->offset);
+ *out = *((XPoint *)val);
+ return True;
+}
+
+Private Bool
+_XimEncodeColormap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Colormap *out;
+
+ out = (Colormap *)((char *)top + info->offset);
+ *out = (Colormap)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeStdColormap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Atom *out;
+
+ out = (Atom *)((char *)top + info->offset);
+ *out = (Atom)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeLong(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ unsigned long *out;
+
+ out = (unsigned long *)((char *)top + info->offset);
+ *out = (unsigned long)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeBgPixmap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Pixmap *out;
+
+ out = (Pixmap *)((char *)top + info->offset);
+ *out = (Pixmap)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeFontSet(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XFontSet *out;
+
+ out = (XFontSet *)((char *)top + info->offset);
+ *out = (XFontSet)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeLineSpace(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ int *out;
+
+ out = (int *)((char *)top + info->offset);
+ *out = (long)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeCursor(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Cursor *out;
+
+ out = (Cursor *)((char *)top + info->offset);
+ *out = (Cursor)val;
+ return True;
+}
+
+Private Bool
+_XimEncodePreeditState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMPreeditState *out;
+
+ out = (XIMPreeditState *)((char *)top + info->offset);
+ *out = (XIMPreeditState)val;
+ return True;
+}
+
+Private Bool
+_XimEncodeNest(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ return True;
+}
+
+Private Bool
+_XimDecodeStyles(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMStyles *styles;
+ XIMStyles *out;
+ register int i;
+ unsigned int num;
+ int len;
+ XPointer tmp;
+
+ if(val == (XPointer)NULL) {
+ return False;
+ }
+
+ styles = *((XIMStyles **)((char *)top + info->offset));
+ num = styles->count_styles;
+
+ len = sizeof(XIMStyles) + sizeof(XIMStyle) * num;
+ if(!(tmp = Xcalloc(1, len))) {
+ return False;
+ }
+
+ out = (XIMStyles *)tmp;
+ if(num >0) {
+ out->count_styles = (unsigned short)num;
+ out->supported_styles = (XIMStyle *)((char *)tmp + sizeof(XIMStyles));
+
+ for(i = 0; i < num; i++) {
+ out->supported_styles[i] = styles->supported_styles[i];
+ }
+ }
+ *((XIMStyles **)val) = out;
+ return True;
+}
+
+Private Bool
+_XimDecodeValues(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMValuesList *values_list;
+ XIMValuesList *out;
+ register int i;
+ unsigned int num;
+ int len;
+ XPointer tmp;
+
+ if(val == (XPointer)NULL) {
+ return False;
+ }
+
+ values_list = *((XIMValuesList **)((char *)top + info->offset));
+ num = values_list->count_values;
+
+ len = sizeof(XIMValuesList) + sizeof(char **) * num;
+ if(!(tmp = Xcalloc(1, len))) {
+ return False;
+ }
+
+ out = (XIMValuesList *)tmp;
+ if(num) {
+ out->count_values = (unsigned short)num;
+ out->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList));
+
+ for(i = 0; i < num; i++) {
+ out->supported_values[i] = values_list->supported_values[i];
+ }
+ }
+ *((XIMValuesList **)val) = out;
+ return True;
+}
+
+Private Bool
+_XimDecodeCallback(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMCallback *in;
+ XIMCallback *callback;
+
+ in = (XIMCallback *)((char *)top + info->offset);
+ if(!(callback = (XIMCallback *)Xmalloc(sizeof(XIMCallback)))) {
+ return False;
+ }
+ callback->client_data = in->client_data;
+ callback->callback = in->callback;
+
+ *((XIMCallback **)val) = callback;
+ return True;
+}
+
+Private Bool
+_XimDecodeString(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ char *in;
+ char *string;
+
+ in = *((char **)((char *)top + info->offset));
+ if (in != NULL) {
+ string = strdup(in);
+ } else {
+ string = Xcalloc(1, 1); /* strdup("") */
+ }
+ if (string == NULL) {
+ return False;
+ }
+ *((char **)val) = string;
+ return True;
+}
+
+Private Bool
+_XimDecodeBool(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Bool *in;
+
+ in = (Bool *)((char *)top + info->offset);
+ *((Bool *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeStyle(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMStyle *in;
+
+ in = (XIMStyle *)((char *)top + info->offset);
+ *((XIMStyle *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeWindow(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Window *in;
+
+ in = (Window *)((char *)top + info->offset);
+ *((Window *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeStringConv(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ /*
+ * Not yet
+ */
+ return True;
+}
+
+Private Bool
+_XimDecodeResetState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMResetState *in;
+
+ in = (XIMResetState *)((char *)top + info->offset);
+ *((XIMResetState *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeHotKey(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMHotKeyTriggers *in;
+ XIMHotKeyTriggers *hotkey;
+ XIMHotKeyTrigger *key;
+ XPointer tmp;
+ int num;
+ int len;
+ register int i;
+
+ in = *((XIMHotKeyTriggers **)((char *)top + info->offset));
+ num = in->num_hot_key;
+ len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num;
+ if(!(tmp = (XPointer)Xmalloc(len))) {
+ return False;
+ }
+
+ hotkey = (XIMHotKeyTriggers *)tmp;
+ key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers));
+
+ for(i = 0; i < num; i++) {
+ key[i] = in->key[i];
+ }
+ hotkey->num_hot_key = num;
+ hotkey->key = key;
+
+ *((XIMHotKeyTriggers **)val) = hotkey;
+ return True;
+}
+
+Private Bool
+_XimDecodeHotKetState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMHotKeyState *in;
+
+ in = (XIMHotKeyState *)((char *)top + info->offset);
+ *((XIMHotKeyState *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeRectangle(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XRectangle *in;
+ XRectangle *rect;
+
+ in = (XRectangle *)((char *)top + info->offset);
+ if(!(rect = (XRectangle *)Xmalloc(sizeof(XRectangle)))) {
+ return False;
+ }
+ *rect = *in;
+ *((XRectangle **)val) = rect;
+ return True;
+}
+
+Private Bool
+_XimDecodeSpot(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XPoint *in;
+ XPoint *spot;
+
+ in = (XPoint *)((char *)top + info->offset);
+ if(!(spot = (XPoint *)Xmalloc(sizeof(XPoint)))) {
+ return False;
+ }
+ *spot = *in;
+ *((XPoint **)val) = spot;
+ return True;
+}
+
+Private Bool
+_XimDecodeColormap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Colormap *in;
+
+ in = (Colormap *)((char *)top + info->offset);
+ *((Colormap *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeStdColormap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Atom *in;
+
+ in = (Atom *)((char *)top + info->offset);
+ *((Atom *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeLong(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ unsigned long *in;
+
+ in = (unsigned long *)((char *)top + info->offset);
+ *((unsigned long *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeBgPixmap(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Pixmap *in;
+
+ in = (Pixmap *)((char *)top + info->offset);
+ *((Pixmap *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeFontSet(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XFontSet *in;
+
+ in = (XFontSet *)((char *)top + info->offset);
+ *((XFontSet *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeLineSpace(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ int *in;
+
+ in = (int *)((char *)top + info->offset);
+ *((int *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeCursor(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ Cursor *in;
+
+ in = (Cursor *)((char *)top + info->offset);
+ *((Cursor *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodePreeditState(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ XIMPreeditState *in;
+
+ in = (XIMPreeditState *)((char *)top + info->offset);
+ *((XIMPreeditState *)val) = *in;
+ return True;
+}
+
+Private Bool
+_XimDecodeNest(
+ XimValueOffsetInfo info,
+ XPointer top,
+ XPointer val)
+{
+ return True;
+}
+
+static XIMResource im_resources[] = {
+ {XNQueryInputStyle, 0, XimType_XIMStyles, 0, 0, 0},
+ {XNDestroyCallback, 0, 0, 0, 0, 0},
+ {XNResourceName, 0, XimType_STRING8, 0, 0, 0},
+ {XNResourceClass, 0, XimType_STRING8, 0, 0, 0},
+ {XNQueryIMValuesList, 0, 0, 0, 0, 0},
+ {XNQueryICValuesList, 0, 0, 0, 0, 0},
+ {XNVisiblePosition, 0, 0, 0, 0, 0}
+};
+
+static XIMResource im_inner_resources[] = {
+ {XNDestroyCallback, 0, 0, 0, 0, 0},
+ {XNResourceName, 0, XimType_STRING8, 0, 0, 0},
+ {XNResourceClass, 0, XimType_STRING8, 0, 0, 0},
+ {XNQueryIMValuesList, 0, 0, 0, 0, 0},
+ {XNQueryICValuesList, 0, 0, 0, 0, 0},
+ {XNVisiblePosition, 0, 0, 0, 0, 0}
+};
+
+static XIMResource ic_resources[] = {
+ {XNInputStyle, 0, XimType_CARD32, 0, 0, 0},
+ {XNClientWindow, 0, XimType_Window, 0, 0, 0},
+ {XNFocusWindow, 0, XimType_Window, 0, 0, 0},
+ {XNResourceName, 0, XimType_STRING8, 0, 0, 0},
+ {XNResourceClass, 0, XimType_STRING8, 0, 0, 0},
+ {XNGeometryCallback, 0, 0, 0, 0, 0},
+ {XNFilterEvents, 0, XimType_CARD32, 0, 0, 0},
+ {XNDestroyCallback, 0, 0, 0, 0, 0},
+ {XNStringConversionCallback, 0, 0, 0, 0, 0},
+ {XNStringConversion, 0, XimType_XIMStringConversion,0, 0, 0},
+ {XNResetState, 0, 0, 0, 0, 0},
+ {XNHotKey, 0, XimType_XIMHotKeyTriggers,0, 0, 0},
+ {XNHotKeyState, 0, XimType_XIMHotKeyState, 0, 0, 0},
+ {XNPreeditAttributes, 0, XimType_NEST, 0, 0, 0},
+ {XNStatusAttributes, 0, XimType_NEST, 0, 0, 0},
+ {XNArea, 0, XimType_XRectangle, 0, 0, 0},
+ {XNAreaNeeded, 0, XimType_XRectangle, 0, 0, 0},
+ {XNSpotLocation, 0, XimType_XPoint, 0, 0, 0},
+ {XNColormap, 0, XimType_CARD32, 0, 0, 0},
+ {XNStdColormap, 0, XimType_CARD32, 0, 0, 0},
+ {XNForeground, 0, XimType_CARD32, 0, 0, 0},
+ {XNBackground, 0, XimType_CARD32, 0, 0, 0},
+ {XNBackgroundPixmap, 0, XimType_CARD32, 0, 0, 0},
+ {XNFontSet, 0, XimType_XFontSet, 0, 0, 0},
+ {XNLineSpace, 0, XimType_CARD32, 0, 0, 0},
+ {XNCursor, 0, XimType_CARD32, 0, 0, 0},
+ {XNPreeditStartCallback, 0, 0, 0, 0, 0},
+ {XNPreeditDoneCallback, 0, 0, 0, 0, 0},
+ {XNPreeditDrawCallback, 0, 0, 0, 0, 0},
+ {XNPreeditCaretCallback, 0, 0, 0, 0, 0},
+ {XNStatusStartCallback, 0, 0, 0, 0, 0},
+ {XNStatusDoneCallback, 0, 0, 0, 0, 0},
+ {XNStatusDrawCallback, 0, 0, 0, 0, 0},
+ {XNPreeditState, 0, 0, 0, 0, 0},
+ {XNPreeditStateNotifyCallback, 0, 0, 0, 0, 0},
+};
+
+static XIMResource ic_inner_resources[] = {
+ {XNResourceName, 0, XimType_STRING8, 0, 0, 0},
+ {XNResourceClass, 0, XimType_STRING8, 0, 0, 0},
+ {XNGeometryCallback, 0, 0, 0, 0, 0},
+ {XNDestroyCallback, 0, 0, 0, 0, 0},
+ {XNStringConversionCallback, 0, 0, 0, 0, 0},
+ {XNPreeditStartCallback, 0, 0, 0, 0, 0},
+ {XNPreeditDoneCallback, 0, 0, 0, 0, 0},
+ {XNPreeditDrawCallback, 0, 0, 0, 0, 0},
+ {XNPreeditCaretCallback, 0, 0, 0, 0, 0},
+ {XNStatusStartCallback, 0, 0, 0, 0, 0},
+ {XNStatusDoneCallback, 0, 0, 0, 0, 0},
+ {XNStatusDrawCallback, 0, 0, 0, 0, 0},
+ {XNPreeditStateNotifyCallback, 0, 0, 0, 0, 0},
+};
+
+static XimValueOffsetInfoRec im_attr_info[] = {
+ {OFFSET_XNQUERYINPUTSTYLE, 0,
+ XOffsetOf(XimDefIMValues, styles),
+ _XimDefaultStyles, NULL, _XimDecodeStyles},
+
+ {OFFSET_XNDESTROYCALLBACK, 0,
+ XOffsetOf(XimDefIMValues, destroy_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNRESOURCENAME, 0,
+ XOffsetOf(XimDefIMValues, res_name),
+ NULL, _XimEncodeString, _XimDecodeString},
+
+ {OFFSET_XNRESOURCECLASS, 0,
+ XOffsetOf(XimDefIMValues, res_class),
+ NULL, _XimEncodeString, _XimDecodeString},
+
+ {OFFSET_XNQUERYIMVALUESLIST, 0,
+ XOffsetOf(XimDefIMValues, im_values_list),
+ _XimDefaultIMValues, NULL, _XimDecodeValues},
+
+ {OFFSET_XNQUERYICVALUESLIST, 0,
+ XOffsetOf(XimDefIMValues, ic_values_list),
+ _XimDefaultICValues, NULL, _XimDecodeValues},
+
+ {OFFSET_XNVISIBLEPOSITION, 0,
+ XOffsetOf(XimDefIMValues, visible_position),
+ _XimDefaultVisiblePos, NULL, _XimDecodeBool}
+};
+
+static XimValueOffsetInfoRec ic_attr_info[] = {
+ {OFFSET_XNINPUTSTYLE, 0,
+ XOffsetOf(XimDefICValues, input_style),
+ NULL, _XimEncodeStyle, _XimDecodeStyle},
+
+ {OFFSET_XNCLIENTWINDOW, 0,
+ XOffsetOf(XimDefICValues, client_window),
+ NULL, _XimEncodeWindow, _XimDecodeWindow},
+
+ {OFFSET_XNFOCUSWINDOW, 0,
+ XOffsetOf(XimDefICValues, focus_window),
+ _XimDefaultFocusWindow, _XimEncodeWindow, _XimDecodeWindow},
+
+ {OFFSET_XNRESOURCENAME, 0,
+ XOffsetOf(XimDefICValues, res_name),
+ _XimDefaultResName, _XimEncodeString, _XimDecodeString},
+
+ {OFFSET_XNRESOURCECLASS, 0,
+ XOffsetOf(XimDefICValues, res_class),
+ _XimDefaultResClass, _XimEncodeString, _XimDecodeString},
+
+ {OFFSET_XNGEOMETRYCALLBACK, 0,
+ XOffsetOf(XimDefICValues, geometry_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNFILTEREVENTS, 0,
+ XOffsetOf(XimDefICValues, filter_events),
+ NULL, NULL, _XimDecodeLong},
+
+ {OFFSET_XNDESTROYCALLBACK, 0,
+ XOffsetOf(XimDefICValues, destroy_callback),
+ _XimDefaultDestroyCB, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNSTRINGCONVERSIONCALLBACK, 0,
+ XOffsetOf(XimDefICValues, string_conversion_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNSTRINGCONVERSION, 0,
+ XOffsetOf(XimDefICValues, string_conversion),
+ NULL, _XimEncodeStringConv, _XimDecodeStringConv},
+
+ {OFFSET_XNRESETSTATE, 0,
+ XOffsetOf(XimDefICValues, reset_state),
+ _XimDefaultResetState, _XimEncodeResetState, _XimDecodeResetState},
+
+ {OFFSET_XNHOTKEY, 0,
+ XOffsetOf(XimDefICValues, hotkey),
+ NULL, _XimEncodeHotKey, _XimDecodeHotKey},
+
+ {OFFSET_XNHOTKEYSTATE, 0,
+ XOffsetOf(XimDefICValues, hotkey_state),
+ _XimDefaultHotKeyState, _XimEncodeHotKetState, _XimDecodeHotKetState},
+
+ {OFFSET_XNPREEDITATTRIBUTES, 0,
+ XOffsetOf(XimDefICValues, preedit_attr),
+ _XimDefaultNest, _XimEncodeNest, _XimDecodeNest},
+
+ {OFFSET_XNSTATUSATTRIBUTES, 0,
+ XOffsetOf(XimDefICValues, status_attr),
+ _XimDefaultNest, _XimEncodeNest, _XimDecodeNest},
+};
+
+static XimValueOffsetInfoRec ic_pre_attr_info[] = {
+ {OFFSET_XNAREA, 0,
+ XOffsetOf(ICPreeditAttributes, area),
+ _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle},
+
+ {OFFSET_XNAREANEEDED, 0,
+ XOffsetOf(ICPreeditAttributes, area_needed),
+ NULL, _XimEncodeRectangle, _XimDecodeRectangle},
+
+ {OFFSET_XNSPOTLOCATION, 0,
+ XOffsetOf(ICPreeditAttributes, spot_location),
+ NULL, _XimEncodeSpot, _XimDecodeSpot},
+
+ {OFFSET_XNCOLORMAP, 0,
+ XOffsetOf(ICPreeditAttributes, colormap),
+ _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap},
+
+ {OFFSET_XNSTDCOLORMAP, 0,
+ XOffsetOf(ICPreeditAttributes, std_colormap),
+ _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap},
+
+ {OFFSET_XNFOREGROUND, 0,
+ XOffsetOf(ICPreeditAttributes, foreground),
+ _XimDefaultFg, _XimEncodeLong, _XimDecodeLong},
+
+ {OFFSET_XNBACKGROUND, 0,
+ XOffsetOf(ICPreeditAttributes, background),
+ _XimDefaultBg, _XimEncodeLong, _XimDecodeLong},
+
+ {OFFSET_XNBACKGROUNDPIXMAP, 0,
+ XOffsetOf(ICPreeditAttributes, background_pixmap),
+ _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap},
+
+ {OFFSET_XNFONTSET, 0,
+ XOffsetOf(ICPreeditAttributes, fontset),
+ _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet},
+
+ {OFFSET_XNLINESPACE, 0,
+ XOffsetOf(ICPreeditAttributes, line_spacing),
+ _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace},
+
+ {OFFSET_XNCURSOR, 0,
+ XOffsetOf(ICPreeditAttributes, cursor),
+ _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor},
+
+ {OFFSET_XNPREEDITSTARTCALLBACK, 0,
+ XOffsetOf(ICPreeditAttributes, start_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNPREEDITDONECALLBACK, 0,
+ XOffsetOf(ICPreeditAttributes, done_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNPREEDITDRAWCALLBACK, 0,
+ XOffsetOf(ICPreeditAttributes, draw_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNPREEDITCARETCALLBACK, 0,
+ XOffsetOf(ICPreeditAttributes, caret_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNPREEDITSTATE, 0,
+ XOffsetOf(ICPreeditAttributes, preedit_state),
+ _XimDefaultPreeditState, _XimEncodePreeditState,_XimDecodePreeditState},
+
+ {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, 0,
+ XOffsetOf(ICPreeditAttributes, state_notify_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+};
+
+static XimValueOffsetInfoRec ic_sts_attr_info[] = {
+ {OFFSET_XNAREA, 0,
+ XOffsetOf(ICStatusAttributes, area),
+ _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle},
+
+ {OFFSET_XNAREANEEDED, 0,
+ XOffsetOf(ICStatusAttributes, area_needed),
+ NULL, _XimEncodeRectangle, _XimDecodeRectangle},
+
+ {OFFSET_XNCOLORMAP, 0,
+ XOffsetOf(ICStatusAttributes, colormap),
+ _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap},
+
+ {OFFSET_XNSTDCOLORMAP, 0,
+ XOffsetOf(ICStatusAttributes, std_colormap),
+ _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap},
+
+ {OFFSET_XNFOREGROUND, 0,
+ XOffsetOf(ICStatusAttributes, foreground),
+ _XimDefaultFg, _XimEncodeLong, _XimDecodeLong},
+
+ {OFFSET_XNBACKGROUND, 0,
+ XOffsetOf(ICStatusAttributes, background),
+ _XimDefaultBg, _XimEncodeLong, _XimDecodeLong},
+
+ {OFFSET_XNBACKGROUNDPIXMAP, 0,
+ XOffsetOf(ICStatusAttributes, background_pixmap),
+ _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap},
+
+ {OFFSET_XNFONTSET, 0,
+ XOffsetOf(ICStatusAttributes, fontset),
+ _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet},
+
+ {OFFSET_XNLINESPACE, 0,
+ XOffsetOf(ICStatusAttributes, line_spacing),
+ _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace},
+
+ {OFFSET_XNCURSOR, 0,
+ XOffsetOf(ICStatusAttributes, cursor),
+ _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor},
+
+ {OFFSET_XNSTATUSSTARTCALLBACK, 0,
+ XOffsetOf(ICStatusAttributes, start_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNSTATUSDONECALLBACK, 0,
+ XOffsetOf(ICStatusAttributes, done_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback},
+
+ {OFFSET_XNSTATUSDRAWCALLBACK, 0,
+ XOffsetOf(ICStatusAttributes, draw_callback),
+ NULL, _XimEncodeCallback, _XimDecodeCallback}
+};
+
+typedef struct _XimIMMode {
+ unsigned short name_offset;
+ unsigned short mode;
+} XimIMMode;
+
+static const XimIMMode im_mode[] = {
+ {OFFSET_XNQUERYINPUTSTYLE,
+ (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)},
+ {OFFSET_XNDESTROYCALLBACK,
+ (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)},
+ {OFFSET_XNRESOURCENAME,
+ (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)},
+ {OFFSET_XNRESOURCECLASS,
+ (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)},
+ {OFFSET_XNQUERYIMVALUESLIST,
+ (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)},
+ {OFFSET_XNQUERYICVALUESLIST,
+ (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)},
+ {OFFSET_XNVISIBLEPOSITION,
+ (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}
+};
+
+typedef struct _XimICMode {
+ unsigned short name_offset;
+ unsigned short preedit_callback_mode;
+ unsigned short preedit_position_mode;
+ unsigned short preedit_area_mode;
+ unsigned short preedit_nothing_mode;
+ unsigned short preedit_none_mode;
+ unsigned short status_callback_mode;
+ unsigned short status_area_mode;
+ unsigned short status_nothing_mode;
+ unsigned short status_none_mode;
+} XimICMode;
+
+static const XimICMode ic_mode[] = {
+ {OFFSET_XNINPUTSTYLE,
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET)},
+ {OFFSET_XNCLIENTWINDOW,
+ (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+ 0,
+ (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNFOCUSWINDOW,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNRESOURCENAME,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNRESOURCECLASS,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNGEOMETRYCALLBACK,
+ 0,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0,
+ 0},
+ {OFFSET_XNFILTEREVENTS,
+ XIM_MODE_PRE_GET,
+ XIM_MODE_PRE_GET,
+ XIM_MODE_PRE_GET,
+ XIM_MODE_PRE_GET,
+ 0,
+ XIM_MODE_STS_GET,
+ XIM_MODE_STS_GET,
+ XIM_MODE_STS_GET,
+ XIM_MODE_STS_GET},
+ {OFFSET_XNDESTROYCALLBACK,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNSTRINGCONVERSIONCALLBACK,
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNSTRINGCONVERSION,
+ XIM_MODE_PRE_SET,
+ XIM_MODE_PRE_SET,
+ XIM_MODE_PRE_SET,
+ XIM_MODE_PRE_SET,
+ XIM_MODE_PRE_SET,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNRESETSTATE,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNHOTKEY,
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNHOTKEYSTATE,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNPREEDITATTRIBUTES,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNSTATUSATTRIBUTES,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNAREA,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0,
+ 0},
+ {OFFSET_XNAREANEEDED,
+ 0,
+ 0,
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ (XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0,
+ 0},
+ {OFFSET_XNSPOTLOCATION,
+ 0, /*(XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),*/
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNCOLORMAP,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNSTDCOLORMAP,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNFOREGROUND,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNBACKGROUND,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNBACKGROUNDPIXMAP,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNFONTSET,
+ 0,
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNLINESPACE,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNCURSOR,
+ 0,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0},
+ {OFFSET_XNPREEDITSTARTCALLBACK,
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNPREEDITDONECALLBACK,
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNPREEDITDRAWCALLBACK,
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNPREEDITCARETCALLBACK,
+ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNPREEDITSTATE,
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNPREEDITSTATENOTIFYCALLBACK,
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNSTATUSSTARTCALLBACK,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNSTATUSDONECALLBACK,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0,
+ 0,
+ 0},
+ {OFFSET_XNSTATUSDRAWCALLBACK,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+ 0,
+ 0,
+ 0}
+};
+
+/* the quarks are separated from im_mode/ic_mode so those arrays
+ * can be const.
+ */
+static XrmQuark im_mode_quark[sizeof(im_mode) / sizeof(im_mode[0])];
+static XrmQuark ic_mode_quark[sizeof(ic_mode) / sizeof(ic_mode[0])];
+
+Private Bool
+_XimSetResourceList(
+ XIMResourceList *res_list,
+ unsigned int *list_num,
+ XIMResourceList resource,
+ unsigned int num_resource,
+ unsigned short id)
+{
+ register int i;
+ int len;
+ XIMResourceList res;
+
+ len = sizeof(XIMResource) * num_resource;
+ if(!(res = Xcalloc(1, len))) {
+ return False;
+ }
+
+ for(i = 0; i < num_resource; i++, id++) {
+ res[i] = resource[i];
+ res[i].id = id;
+ }
+
+ _XIMCompileResourceList(res, num_resource);
+ *res_list = res;
+ *list_num = num_resource;
+ return True;
+}
+
+Public Bool
+_XimSetIMResourceList(
+ XIMResourceList *res_list,
+ unsigned int *list_num)
+{
+ return _XimSetResourceList(res_list, list_num,
+ im_resources, XIMNumber(im_resources), 100);
+}
+
+Public Bool
+_XimSetICResourceList(
+ XIMResourceList *res_list,
+ unsigned int *list_num)
+{
+ return _XimSetResourceList(res_list, list_num,
+ ic_resources, XIMNumber(ic_resources), 200);
+}
+
+Public Bool
+_XimSetInnerIMResourceList(
+ XIMResourceList *res_list,
+ unsigned int *list_num)
+{
+ return _XimSetResourceList(res_list, list_num,
+ im_inner_resources, XIMNumber(im_inner_resources), 100);
+}
+
+Public Bool
+_XimSetInnerICResourceList(
+ XIMResourceList *res_list,
+ unsigned int *list_num)
+{
+ return _XimSetResourceList(res_list, list_num,
+ ic_inner_resources, XIMNumber(ic_inner_resources), 200);
+}
+
+Private XIMResourceList
+_XimGetResourceListRecByMode(
+ XIMResourceList res_list,
+ unsigned int list_num,
+ unsigned short mode)
+{
+ register int i;
+
+ for(i = 0; i < list_num; i++) {
+ if (res_list[i].mode & mode) {
+ return (XIMResourceList)&res_list[i];
+ }
+ }
+ return (XIMResourceList)NULL;
+}
+
+Public Bool
+_XimCheckCreateICValues(
+ XIMResourceList res_list,
+ unsigned int list_num)
+{
+ if (!_XimGetResourceListRecByMode(res_list, list_num, XIM_MODE_IC_CREATE)) {
+ return True;
+ }
+ return False;
+}
+
+Public XIMResourceList
+_XimGetResourceListRecByQuark(
+ XIMResourceList res_list,
+ unsigned int list_num,
+ XrmQuark quark)
+{
+ register int i;
+
+ for(i = 0; i < list_num; i++) {
+ if (res_list[i].xrm_name == quark) {
+ return (XIMResourceList)&res_list[i];
+ }
+ }
+ return (XIMResourceList)NULL;
+}
+
+Public XIMResourceList
+_XimGetResourceListRec(
+ XIMResourceList res_list,
+ unsigned int list_num,
+ const char *name)
+{
+ XrmQuark quark = XrmStringToQuark(name);
+
+ return _XimGetResourceListRecByQuark(res_list, list_num, quark);
+}
+
+Public char *
+_XimSetIMValueData(
+ Xim im,
+ XPointer top,
+ XIMArg *values,
+ XIMResourceList res_list,
+ unsigned int list_num)
+{
+ register XIMArg *p;
+ XIMResourceList res;
+ int check;
+
+ for(p = values; p->name != NULL; p++) {
+ if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) {
+ return p->value;
+ }
+ check = _XimCheckIMMode(res, XIM_SETIMVALUES);
+ if(check == XIM_CHECK_INVALID) {
+ continue;
+ } else if (check == XIM_CHECK_ERROR) {
+ return p->value;
+ }
+
+ if(!_XimEncodeLocalIMAttr(res, top, p->value)) {
+ return p->value;
+ }
+ }
+ return NULL;
+}
+
+Public char *
+_XimGetIMValueData(
+ Xim im,
+ XPointer top,
+ XIMArg *values,
+ XIMResourceList res_list,
+ unsigned int list_num)
+{
+ register XIMArg *p;
+ XIMResourceList res;
+ int check;
+
+ for(p = values; p->name != NULL; p++) {
+ if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) {
+ return p->value;
+ }
+ check = _XimCheckIMMode(res, XIM_GETIMVALUES);
+ if(check == XIM_CHECK_INVALID) {
+ continue;
+ } else if (check == XIM_CHECK_ERROR) {
+ return p->value;
+ }
+
+ if(!_XimDecodeLocalIMAttr(res, top, p->value)) {
+ return p->value;
+ }
+ }
+ return NULL;
+}
+
+Public void
+_XimSetIMMode(
+ XIMResourceList res_list,
+ unsigned int list_num)
+{
+ XIMResourceList res;
+ unsigned int n = XIMNumber(im_mode);
+ register int i;
+
+ for(i = 0; i < n; i++) {
+ if(!(res = _XimGetResourceListRecByQuark(res_list,
+ list_num, im_mode_quark[i]))) {
+ continue;
+ }
+ res->mode = im_mode[i].mode;
+ }
+ return;
+}
+
+Private int
+_XimCheckSetIMDefaultsMode(
+ XIMResourceList res)
+{
+ if(res->mode & XIM_MODE_IM_DEFAULT) {
+ return XIM_CHECK_VALID;
+ }
+ return XIM_CHECK_INVALID;
+}
+
+Private int
+_XimCheckSetIMValuesMode(
+ XIMResourceList res)
+{
+ if(res->mode & XIM_MODE_IM_SET) {
+ return XIM_CHECK_VALID;
+ }
+ return XIM_CHECK_INVALID;
+}
+
+Private int
+ _XimCheckGetIMValuesMode(
+ XIMResourceList res)
+{
+ if(res->mode & XIM_MODE_IM_GET) {
+ return XIM_CHECK_VALID;
+ }
+ return XIM_CHECK_INVALID;
+}
+
+Public int
+ _XimCheckIMMode(
+ XIMResourceList res,
+ unsigned long mode)
+{
+ if(res->mode == 0) {
+ return XIM_CHECK_INVALID;
+ }
+ if(mode & XIM_SETIMDEFAULTS) {
+ return _XimCheckSetIMDefaultsMode(res);
+ } else if (mode & XIM_SETIMVALUES) {
+ return _XimCheckSetIMValuesMode(res);
+ } else if (mode & XIM_GETIMVALUES) {
+ return _XimCheckGetIMValuesMode(res);
+ } else {
+ return XIM_CHECK_ERROR;
+ }
+}
+
+Public void
+_XimSetICMode(XIMResourceList res_list, unsigned int list_num, XIMStyle style)
+{
+ XIMResourceList res;
+ unsigned int n = XIMNumber(ic_mode);
+ register int i;
+ unsigned int pre_offset;
+ unsigned int sts_offset;
+
+ if(style & XIMPreeditArea) {
+ pre_offset = XOffsetOf(XimICMode, preedit_area_mode);
+ } else if(style & XIMPreeditCallbacks) {
+ pre_offset = XOffsetOf(XimICMode, preedit_callback_mode);
+ } else if(style & XIMPreeditPosition) {
+ pre_offset = XOffsetOf(XimICMode, preedit_position_mode);
+ } else if(style & XIMPreeditNothing) {
+ pre_offset = XOffsetOf(XimICMode, preedit_nothing_mode);
+ } else {
+ pre_offset = XOffsetOf(XimICMode, preedit_none_mode);
+ }
+
+ if(style & XIMStatusArea) {
+ sts_offset = XOffsetOf(XimICMode, status_area_mode);
+ } else if(style & XIMStatusCallbacks) {
+ sts_offset = XOffsetOf(XimICMode, status_callback_mode);
+ } else if(style & XIMStatusNothing) {
+ sts_offset = XOffsetOf(XimICMode, status_nothing_mode);
+ } else {
+ sts_offset = XOffsetOf(XimICMode, status_none_mode);
+ }
+
+ for(i = 0; i < n; i++) {
+ if(!(res = _XimGetResourceListRecByQuark(res_list,
+ list_num, ic_mode_quark[i]))) {
+ continue;
+ }
+ res->mode = ( (*(unsigned short *)((char *)&ic_mode[i] + pre_offset))
+ | (*(unsigned short *)((char *)&ic_mode[i] + sts_offset)));
+ }
+ return;
+}
+
+Private int
+_XimCheckSetICDefaultsMode(
+ XIMResourceList res,
+ unsigned long mode)
+{
+ if(mode & XIM_PREEDIT_ATTR) {
+ if(!(res->mode & XIM_MODE_PRE_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_PRE_CREATE) {
+ return XIM_CHECK_ERROR;
+ } else if (!(res->mode & XIM_MODE_PRE_DEFAULT)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ } else if(mode & XIM_STATUS_ATTR) {
+ if(!(res->mode & XIM_MODE_STS_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_STS_CREATE) {
+ return XIM_CHECK_ERROR;
+ }
+ if(!(res->mode & XIM_MODE_STS_DEFAULT)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ } else {
+ if(!res->mode) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_IC_CREATE) {
+ return XIM_CHECK_ERROR;
+ }
+ if(!(res->mode & XIM_MODE_IC_DEFAULT)) {
+ return XIM_CHECK_INVALID;
+ }
+ }
+ return XIM_CHECK_VALID;
+}
+
+Private int
+_XimCheckCreateICMode(
+ XIMResourceList res,
+ unsigned long mode)
+{
+ if(mode & XIM_PREEDIT_ATTR) {
+ if(!(res->mode & XIM_MODE_PRE_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_PRE_CREATE) {
+ res->mode &= ~XIM_MODE_PRE_CREATE;
+ } else if(res->mode & XIM_MODE_PRE_ONCE) {
+ res->mode &= ~XIM_MODE_PRE_ONCE;
+ } else if(res->mode & XIM_MODE_PRE_DEFAULT) {
+ res->mode &= ~XIM_MODE_PRE_DEFAULT;
+ } else if (!(res->mode & XIM_MODE_PRE_SET)) {
+ return XIM_CHECK_ERROR;
+ }
+
+ } else if(mode & XIM_STATUS_ATTR) {
+ if(!(res->mode & XIM_MODE_STS_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_STS_CREATE) {
+ res->mode &= ~XIM_MODE_STS_CREATE;
+ } else if(res->mode & XIM_MODE_STS_ONCE) {
+ res->mode &= ~XIM_MODE_STS_ONCE;
+ } else if(res->mode & XIM_MODE_STS_DEFAULT) {
+ res->mode &= ~XIM_MODE_STS_DEFAULT;
+ } else if (!(res->mode & XIM_MODE_STS_SET)) {
+ return XIM_CHECK_ERROR;
+ }
+
+ } else {
+ if(!res->mode) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_IC_CREATE) {
+ res->mode &= ~XIM_MODE_IC_CREATE;
+ } else if(res->mode & XIM_MODE_IC_ONCE) {
+ res->mode &= ~XIM_MODE_IC_ONCE;
+ } else if(res->mode & XIM_MODE_IC_DEFAULT) {
+ res->mode &= ~XIM_MODE_IC_DEFAULT;
+ } else if (!(res->mode & XIM_MODE_IC_SET)) {
+ return XIM_CHECK_ERROR;
+ }
+ }
+ return XIM_CHECK_VALID;
+}
+
+Private int
+_XimCheckSetICValuesMode(
+ XIMResourceList res,
+ unsigned long mode)
+{
+ if(mode & XIM_PREEDIT_ATTR) {
+ if(!(res->mode & XIM_MODE_PRE_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_PRE_ONCE) {
+ res->mode &= ~XIM_MODE_PRE_ONCE;
+ } else if(!(res->mode & XIM_MODE_PRE_SET)) {
+ return XIM_CHECK_ERROR;
+ }
+
+ } else if(mode & XIM_STATUS_ATTR) {
+ if(!(res->mode & XIM_MODE_STS_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_STS_ONCE) {
+ res->mode &= ~XIM_MODE_STS_ONCE;
+ } else if(!(res->mode & XIM_MODE_STS_SET)) {
+ return XIM_CHECK_ERROR;
+ }
+
+ } else {
+ if(!res->mode) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(res->mode & XIM_MODE_IC_ONCE) {
+ res->mode &= ~XIM_MODE_IC_ONCE;
+ } else if(!(res->mode & XIM_MODE_IC_SET)) {
+ return XIM_CHECK_ERROR;
+ }
+ }
+ return XIM_CHECK_VALID;
+}
+
+Private int
+_XimCheckGetICValuesMode(
+ XIMResourceList res,
+ unsigned long mode)
+{
+ if(mode & XIM_PREEDIT_ATTR) {
+ if(!(res->mode & XIM_MODE_PRE_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(!(res->mode & XIM_MODE_PRE_GET)) {
+ return XIM_CHECK_ERROR;
+ }
+
+ } else if(mode & XIM_STATUS_ATTR) {
+ if(!(res->mode & XIM_MODE_STS_MASK)) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(!(res->mode & XIM_MODE_STS_GET)) {
+ return XIM_CHECK_ERROR;
+ }
+
+ } else {
+ if(!res->mode) {
+ return XIM_CHECK_INVALID;
+ }
+
+ if(!(res->mode & XIM_MODE_IC_GET)) {
+ return XIM_CHECK_ERROR;
+ }
+ }
+ return XIM_CHECK_VALID;
+}
+
+Public int
+ _XimCheckICMode(
+ XIMResourceList res,
+ unsigned long mode)
+{
+ if(mode &XIM_SETICDEFAULTS) {
+ return _XimCheckSetICDefaultsMode(res, mode);
+ } else if (mode & XIM_CREATEIC) {
+ return _XimCheckCreateICMode(res, mode);
+ } else if (mode & XIM_SETICVALUES) {
+ return _XimCheckSetICValuesMode(res, mode);
+ } else if (mode & XIM_GETICVALUES) {
+ return _XimCheckGetICValuesMode(res, mode);
+ } else {
+ return XIM_CHECK_ERROR;
+ }
+}
+
+Public Bool
+_XimSetLocalIMDefaults(
+ Xim im,
+ XPointer top,
+ XIMResourceList res_list,
+ unsigned int list_num)
+{
+ XimValueOffsetInfo info;
+ unsigned int num;
+ register int i;
+ XIMResourceList res;
+ int check;
+
+ info = im_attr_info;
+ num = XIMNumber(im_attr_info);
+
+ for(i = 0; i < num; i++) {
+ if((res = _XimGetResourceListRecByQuark( res_list, list_num,
+ info[i].quark)) == (XIMResourceList)NULL) {
+ return False;
+ }
+
+ check = _XimCheckIMMode(res, XIM_SETIMDEFAULTS);
+ if(check == XIM_CHECK_INVALID) {
+ continue;
+ } else if (check == XIM_CHECK_ERROR) {
+ return False;
+ }
+
+ if(!info[i].defaults) {
+ continue;
+ }
+ if(!(info[i].defaults(&info[i], top, (XPointer)NULL, 0))) {
+ return False;
+ }
+ }
+ return True;
+}
+
+Public Bool
+_XimSetICDefaults(
+ Xic ic,
+ XPointer top,
+ unsigned long mode,
+ XIMResourceList res_list,
+ unsigned int list_num)
+{
+ unsigned int num;
+ XimValueOffsetInfo info;
+ register int i;
+ XIMResourceList res;
+ int check;
+ XrmQuark pre_quark;
+ XrmQuark sts_quark;
+
+ pre_quark = XrmStringToQuark(XNPreeditAttributes);
+ sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+ if(mode & XIM_PREEDIT_ATTR) {
+ info = ic_pre_attr_info;
+ num = XIMNumber(ic_pre_attr_info);
+ } else if(mode & XIM_STATUS_ATTR) {
+ info = ic_sts_attr_info;
+ num = XIMNumber(ic_sts_attr_info);
+ } else {
+ info = ic_attr_info;
+ num = XIMNumber(ic_attr_info);
+ }
+
+ for(i = 0; i < num; i++) {
+ if(info[i].quark == pre_quark) {
+ if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset),
+ (mode | XIM_PREEDIT_ATTR), res_list, list_num)) {
+ return False;
+ }
+ } else if (info[i].quark == sts_quark) {
+ if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset),
+ (mode | XIM_STATUS_ATTR), res_list, list_num)) {
+ return False;
+ }
+ } else {
+ if(!(res = _XimGetResourceListRecByQuark(res_list, list_num,
+ info[i].quark))) {
+ return False;
+ }
+
+ check = _XimCheckICMode(res, mode);
+ if (check == XIM_CHECK_INVALID) {
+ continue;
+ } else if (check == XIM_CHECK_ERROR) {
+ return False;
+ }
+
+ if (!info[i].defaults) {
+ continue;
+ }
+ if (!(info[i].defaults(&info[i], top, (XPointer)ic, mode))) {
+ return False;
+ }
+ }
+ }
+ return True;
+}
+
+Private Bool
+_XimEncodeAttr(
+ XimValueOffsetInfo info,
+ unsigned int num,
+ XIMResourceList res,
+ XPointer top,
+ XPointer val)
+{
+ register int i;
+
+ for(i = 0; i < num; i++ ) {
+ if(info[i].quark == res->xrm_name) {
+ if(!info[i].encode) {
+ return False;
+ }
+ return (*info[i].encode)(&info[i], top, val);
+ }
+ }
+ return False;
+}
+
+Public Bool
+_XimEncodeLocalIMAttr(
+ XIMResourceList res,
+ XPointer top,
+ XPointer val)
+{
+ return _XimEncodeAttr(im_attr_info, XIMNumber(im_attr_info),
+ res, top, val);
+}
+
+Public Bool
+_XimEncodeLocalICAttr(
+ Xic ic,
+ XIMResourceList res,
+ XPointer top,
+ XIMArg *arg,
+ unsigned long mode)
+{
+ unsigned int num;
+ XimValueOffsetInfo info;
+
+ if(mode & XIM_PREEDIT_ATTR) {
+ info = ic_pre_attr_info;
+ num = XIMNumber(ic_pre_attr_info);
+ } else if(mode & XIM_STATUS_ATTR) {
+ info = ic_sts_attr_info;
+ num = XIMNumber(ic_sts_attr_info);
+ } else {
+ info = ic_attr_info;
+ num = XIMNumber(ic_attr_info);
+ }
+
+ return _XimEncodeAttr(info, num, res, top, arg->value);
+}
+
+Private Bool
+_XimEncodeLocalTopValue(
+ Xic ic,
+ XIMResourceList res,
+ XPointer val,
+ Bool flag)
+{
+ XIMArg *p = (XIMArg *)val;
+
+ if (res->xrm_name == XrmStringToQuark(XNClientWindow)) {
+ ic->core.client_window = (Window)p->value;
+ if (ic->core.focus_window == (Window)0)
+ ic->core.focus_window = ic->core.client_window;
+ if (flag) {
+ _XRegisterFilterByType(ic->core.im->core.display,
+ ic->core.focus_window,
+ KeyPress, KeyRelease, _XimLocalFilter, (XPointer)ic);
+ }
+ } else if (res->xrm_name == XrmStringToQuark(XNFocusWindow)) {
+ if (ic->core.client_window) {
+ if (flag) {
+ _XUnregisterFilter(ic->core.im->core.display,
+ ic->core.focus_window, _XimLocalFilter, (XPointer)ic);
+ }
+ ic->core.focus_window = (Window)p->value;
+ if (flag) {
+ _XRegisterFilterByType(ic->core.im->core.display,
+ ic->core.focus_window, KeyPress, KeyRelease,
+ _XimLocalFilter, (XPointer)ic);
+ }
+ } else
+ ic->core.focus_window = (Window)p->value;
+ }
+ return True;
+}
+
+Private Bool
+_XimEncodeLocalPreeditValue(
+ Xic ic,
+ XIMResourceList res,
+ XPointer val)
+{
+ XIMArg *p = (XIMArg *)val;
+
+ if (res->xrm_name == XrmStringToQuark(XNStdColormap)) {
+ XStandardColormap *colormap_ret;
+ int count;
+
+ if (!(XGetRGBColormaps(ic->core.im->core.display,
+ ic->core.focus_window, &colormap_ret,
+ &count, (Atom)p->value)))
+ return False;
+
+ Xfree(colormap_ret);
+ }
+ return True;
+}
+
+Private Bool
+_XimEncodeLocalStatusValue(
+ Xic ic,
+ XIMResourceList res,
+ XPointer val)
+{
+ XIMArg *p = (XIMArg *)val;
+
+ if (res->xrm_name == XrmStringToQuark(XNStdColormap)) {
+ XStandardColormap *colormap_ret;
+ int count;
+
+ if (!(XGetRGBColormaps(ic->core.im->core.display,
+ ic->core.focus_window, &colormap_ret,
+ &count, (Atom)p->value)))
+ return False;
+
+ Xfree(colormap_ret);
+ }
+ return True;
+}
+
+Public char *
+_XimSetICValueData(
+ Xic ic,
+ XPointer top,
+ XIMResourceList res_list,
+ unsigned int list_num,
+ XIMArg *values,
+ unsigned long mode,
+ Bool flag)
+{
+ register XIMArg *p;
+ XIMResourceList res;
+ char *name;
+ int check;
+ XrmQuark pre_quark;
+ XrmQuark sts_quark;
+
+ pre_quark = XrmStringToQuark(XNPreeditAttributes);
+ sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+ for(p = values; p->name != NULL; p++) {
+ if((res = _XimGetResourceListRec(res_list, list_num,
+ p->name)) == (XIMResourceList)NULL) {
+ return p->name;
+ }
+ if(res->xrm_name == pre_quark) {
+ if(((name = _XimSetICValueData(ic,
+ (XPointer)(&((XimDefICValues *)top)->preedit_attr),
+ res_list, list_num, (XIMArg *)p->value,
+ (mode | XIM_PREEDIT_ATTR), flag)))) {
+ return name;
+ }
+ } else if(res->xrm_name == sts_quark) {
+ if(((name = _XimSetICValueData(ic,
+ (XPointer)(&((XimDefICValues *)top)->status_attr),
+ res_list, list_num, (XIMArg *)p->value,
+ (mode | XIM_STATUS_ATTR), flag)))) {
+ return name;
+ }
+ } else {
+ check = _XimCheckICMode(res, mode);
+ if(check == XIM_CHECK_INVALID) {
+ continue;
+ } else if(check == XIM_CHECK_ERROR) {
+ return p->name;
+ }
+
+ if(mode & XIM_PREEDIT_ATTR) {
+ if (!_XimEncodeLocalPreeditValue(ic, res, (XPointer)p))
+ return False;
+ } else if(mode & XIM_STATUS_ATTR) {
+ if (!_XimEncodeLocalStatusValue(ic, res, (XPointer)p))
+ return False;
+ } else {
+ if (!_XimEncodeLocalTopValue(ic, res, (XPointer)p, flag))
+ return False;
+ }
+ if(_XimEncodeLocalICAttr(ic, res, top, p, mode) == False) {
+ return p->name;
+ }
+ }
+ }
+ return NULL;
+}
+
+Private Bool
+_XimCheckInputStyle(
+ XIMStyles *styles,
+ XIMStyle style)
+{
+ int num = styles->count_styles;
+ register int i;
+
+ for(i = 0; i < num; i++) {
+ if(styles->supported_styles[i] == style) {
+ return True;
+ }
+ }
+ return False;
+}
+
+Public Bool
+_XimCheckLocalInputStyle(
+ Xic ic,
+ XPointer top,
+ XIMArg *values,
+ XIMStyles *styles,
+ XIMResourceList res_list,
+ unsigned int list_num)
+{
+ XrmQuark quark = XrmStringToQuark(XNInputStyle);
+ register XIMArg *p;
+ XIMResourceList res;
+
+ for(p = values; p && p->name != NULL; p++) {
+ if(quark == XrmStringToQuark(p->name)) {
+ if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) {
+ return False;
+ }
+ if(!_XimEncodeLocalICAttr(ic, res, top, p, 0)) {
+ return False;
+ }
+ if (_XimCheckInputStyle(styles,
+ ((XimDefICValues *)top)->input_style)) {
+ return True;
+ }
+ return False;
+ }
+ }
+ return False;
+}
+
+Private Bool
+_XimDecodeAttr(
+ XimValueOffsetInfo info,
+ unsigned int num,
+ XIMResourceList res,
+ XPointer top,
+ XPointer val)
+{
+ register int i;
+
+ for(i = 0; i < num; i++ ) {
+ if(info[i].quark == res->xrm_name) {
+ if(!info[i].decode) {
+ return False;
+ }
+ return (*info[i].decode)(&info[i], top, val);
+ }
+ }
+ return False;
+}
+
+Public Bool
+_XimDecodeLocalIMAttr(
+ XIMResourceList res,
+ XPointer top,
+ XPointer val)
+{
+ return _XimDecodeAttr(im_attr_info, XIMNumber(im_attr_info),
+ res, top, val);
+}
+
+Public Bool
+_XimDecodeLocalICAttr(
+ XIMResourceList res,
+ XPointer top,
+ XPointer val,
+ unsigned long mode)
+{
+ unsigned int num;
+ XimValueOffsetInfo info;
+
+ if(mode & XIM_PREEDIT_ATTR) {
+ info = ic_pre_attr_info;
+ num = XIMNumber(ic_pre_attr_info);
+ } else if(mode & XIM_STATUS_ATTR) {
+ info = ic_sts_attr_info;
+ num = XIMNumber(ic_sts_attr_info);
+ } else {
+ info = ic_attr_info;
+ num = XIMNumber(ic_attr_info);
+ }
+
+ return _XimDecodeAttr(info, num, res, top, val);
+}
+
+Public char *
+_XimGetICValueData(Xic ic, XPointer top, XIMResourceList res_list,
+ unsigned int list_num, XIMArg *values, unsigned long mode)
+{
+ register XIMArg *p;
+ XIMResourceList res;
+ char *name;
+ int check;
+ XrmQuark pre_quark;
+ XrmQuark sts_quark;
+
+ pre_quark = XrmStringToQuark(XNPreeditAttributes);
+ sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+ for(p = values; p->name != NULL; p++) {
+ if((res = _XimGetResourceListRec(res_list, list_num,
+ p->name)) == (XIMResourceList)NULL) {
+ return p->name;
+ }
+ if(res->xrm_name == pre_quark) {
+ if((name = _XimGetICValueData(ic,
+ (XPointer)(&((XimDefICValues *)top)->preedit_attr),
+ res_list, list_num, (XIMArg *)p->value,
+ (mode | XIM_PREEDIT_ATTR)))) {
+ return name;
+ }
+ } else if(res->xrm_name == sts_quark) {
+ if((name = _XimGetICValueData(ic,
+ (XPointer)(&((XimDefICValues *)top)->status_attr),
+ res_list, list_num, (XIMArg *)p->value,
+ (mode | XIM_STATUS_ATTR)))) {
+ return name;
+ }
+ } else {
+ check = _XimCheckICMode(res, mode);
+ if(check == XIM_CHECK_INVALID) {
+ continue;
+ } else if(check == XIM_CHECK_ERROR) {
+ return p->name;
+ }
+
+ if(_XimDecodeLocalICAttr(res, top, p->value, mode) == False) {
+ return p->name;
+ }
+ }
+ }
+ return NULL;
+}
+
+Public void
+_XimGetCurrentIMValues(Xim im, XimDefIMValues *im_values)
+{
+ bzero((char *)im_values, sizeof(XimDefIMValues));
+
+ im_values->styles = im->core.styles;
+ im_values->im_values_list = im->core.im_values_list;
+ im_values->ic_values_list = im->core.ic_values_list;
+ im_values->destroy_callback = im->core.destroy_callback;
+ im_values->res_name = im->core.res_name;
+ im_values->res_class = im->core.res_class;
+ im_values->visible_position = im->core.visible_position;
+}
+
+Public void
+_XimSetCurrentIMValues(Xim im, XimDefIMValues *im_values)
+{
+ im->core.styles = im_values->styles;
+ im->core.im_values_list = im_values->im_values_list;
+ im->core.ic_values_list = im_values->ic_values_list;
+ im->core.destroy_callback = im_values->destroy_callback;
+ im->core.res_name = im_values->res_name;
+ im->core.res_class = im_values->res_class;
+ im->core.visible_position = im_values->visible_position;
+}
+
+Public void
+_XimGetCurrentICValues(Xic ic, XimDefICValues *ic_values)
+{
+ bzero((char *)ic_values, sizeof(XimDefICValues));
+
+ ic_values->input_style = ic->core.input_style;
+ ic_values->client_window = ic->core.client_window;
+ ic_values->focus_window = ic->core.focus_window;
+ ic_values->filter_events = ic->core.filter_events;
+ ic_values->geometry_callback = ic->core.geometry_callback;
+ ic_values->res_name = ic->core.res_name;
+ ic_values->res_class = ic->core.res_class;
+ ic_values->destroy_callback = ic->core.destroy_callback;
+ ic_values->string_conversion_callback
+ = ic->core.string_conversion_callback;
+ ic_values->string_conversion = ic->core.string_conversion;
+ ic_values->reset_state = ic->core.reset_state;
+ ic_values->hotkey = ic->core.hotkey;
+ ic_values->hotkey_state = ic->core.hotkey_state;
+ ic_values->preedit_attr = ic->core.preedit_attr;
+ ic_values->status_attr = ic->core.status_attr;
+}
+
+Public void
+_XimSetCurrentICValues(
+ Xic ic,
+ XimDefICValues *ic_values)
+{
+ ic->core.input_style = ic_values->input_style;
+ ic->core.client_window = ic_values->client_window;
+ if (ic_values->focus_window)
+ ic->core.focus_window = ic_values->focus_window;
+ ic->core.filter_events = ic_values->filter_events;
+ ic->core.geometry_callback = ic_values->geometry_callback;
+ ic->core.res_name = ic_values->res_name;
+ ic->core.res_class = ic_values->res_class;
+ ic->core.destroy_callback = ic_values->destroy_callback;
+ ic->core.string_conversion_callback
+ = ic_values->string_conversion_callback;
+ ic->core.string_conversion = ic_values->string_conversion;
+ ic->core.reset_state = ic_values->reset_state;
+ ic->core.hotkey = ic_values->hotkey;
+ ic->core.hotkey_state = ic_values->hotkey_state;
+ ic->core.preedit_attr = ic_values->preedit_attr;
+ ic->core.status_attr = ic_values->status_attr;
+}
+
+Private void
+_XimInitialIMOffsetInfo(void)
+{
+ unsigned int n = XIMNumber(im_attr_info);
+ register int i;
+
+ for(i = 0; i < n; i++) {
+ im_attr_info[i].quark = XrmStringToQuark(GET_NAME(im_attr_info[i]));
+ }
+}
+
+Private void
+_XimInitialICOffsetInfo(void)
+{
+ unsigned int n;
+ register int i;
+
+ n = XIMNumber(ic_attr_info);
+ for(i = 0; i < n; i++) {
+ ic_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_attr_info[i]));
+ }
+
+ n = XIMNumber(ic_pre_attr_info);
+ for(i = 0; i < n; i++) {
+ ic_pre_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_pre_attr_info[i]));
+ }
+
+ n = XIMNumber(ic_sts_attr_info);
+ for(i = 0; i < n; i++) {
+ ic_sts_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_sts_attr_info[i]));
+ }
+}
+
+Private void
+_XimInitialIMMode(void)
+{
+ unsigned int n = XIMNumber(im_mode);
+ register int i;
+
+ for(i = 0; i < n; i++) {
+ im_mode_quark[i] = XrmStringToQuark(GET_NAME(im_mode[i]));
+ }
+}
+
+Private void
+_XimInitialICMode(void)
+{
+ unsigned int n = XIMNumber(ic_mode);
+ register int i;
+
+ for(i = 0; i < n; i++) {
+ ic_mode_quark[i] = XrmStringToQuark(GET_NAME(ic_mode[i]));
+ }
+}
+
+Public void
+_XimInitialResourceInfo(void)
+{
+ static Bool init_flag = False;
+
+ if(init_flag == True) {
+ return;
+ }
+ _XimInitialIMOffsetInfo();
+ _XimInitialICOffsetInfo();
+ _XimInitialIMMode();
+ _XimInitialICMode();
+ init_flag = True;
+}
diff --git a/libX11/modules/im/ximcp/imRmAttr.c b/libX11/modules/im/ximcp/imRmAttr.c index 3183a6005..ac47f3bbe 100644 --- a/libX11/modules/im/ximcp/imRmAttr.c +++ b/libX11/modules/im/ximcp/imRmAttr.c @@ -1408,7 +1408,6 @@ _XimGetAttributeID( {
unsigned int n;
XIMResourceList res;
- int res_len;
char *names;
int names_len;
XPointer tmp;
@@ -1426,18 +1425,15 @@ _XimGetAttributeID( if (!(n = _XimCountNumberOfAttr(buf[0], &buf[1], &names_len)))
return False;
- res_len = sizeof(XIMResource) * n;
- if (!(res = (XIMResourceList)Xmalloc(res_len)))
+ if (!(res = Xcalloc(n, sizeof(XIMResource))))
return False;
- bzero((char *)res, res_len);
values_len = sizeof(XIMValuesList) + (sizeof(char **) * n) + names_len;
- if (!(tmp = (XPointer)Xmalloc(values_len))) {
+ if (!(tmp = Xcalloc(1, values_len))) {
Xfree(res);
return False;
}
- bzero(tmp, values_len);
values_list = (XIMValuesList *)tmp;
values = (char **)((char *)tmp + sizeof(XIMValuesList));
@@ -1475,18 +1471,15 @@ _XimGetAttributeID( if (!(n = _XimCountNumberOfAttr(buf[0], &buf[2], &names_len)))
return False;
- res_len = sizeof(XIMResource) * n;
- if (!(res = (XIMResourceList)Xmalloc(res_len)))
+ if (!(res = Xcalloc(n, sizeof(XIMResource))))
return False;
- bzero((char *)res, res_len);
values_len = sizeof(XIMValuesList) + (sizeof(char **) * n) + names_len;
- if (!(tmp = (XPointer)Xmalloc(values_len))) {
+ if (!(tmp = Xcalloc(1, values_len))) {
Xfree(res);
return False;
}
- bzero(tmp, values_len);
values_list = (XIMValuesList *)tmp;
values = (char **)((char *)tmp + sizeof(XIMValuesList));
diff --git a/libX11/modules/im/ximcp/imThaiIc.c b/libX11/modules/im/ximcp/imThaiIc.c index d1cb22a5e..6b8784387 100644 --- a/libX11/modules/im/ximcp/imThaiIc.c +++ b/libX11/modules/im/ximcp/imThaiIc.c @@ -1,228 +1,227 @@ -/****************************************************************** - - 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 "Xlibint.h" -#include "Xlcint.h" -#include "Ximint.h" - -Private void -_XimThaiUnSetFocus( - XIC xic) -{ - Xic ic = (Xic)xic; - ((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL; - - if (ic->core.focus_window) - _XUnregisterFilter(ic->core.im->core.display, ic->core.focus_window, - _XimThaiFilter, (XPointer)ic); - return; -} - -Private void -_XimThaiDestroyIC( - XIC xic) -{ - Xic ic = (Xic)xic; - DefTreeBase *b = &ic->private.local.base; - - if(((Xim)ic->core.im)->private.local.current_ic == (XIC)ic) { - _XimThaiUnSetFocus(xic); - } - if(ic->private.local.ic_resources) { - Xfree(ic->private.local.ic_resources); - ic->private.local.ic_resources = NULL; - } - - if (b->tree) Xfree (b->tree); - if (b->mb) Xfree (b->mb); - if (b->wc) Xfree (b->wc); - if (b->utf8) Xfree (b->utf8); - b->tree = NULL; - b->mb = NULL; - b->wc = NULL; - b->utf8 = NULL; - return; -} - -Private void -_XimThaiSetFocus( - XIC xic) -{ - Xic ic = (Xic)xic; - XIC current_ic = ((Xim)ic->core.im)->private.local.current_ic; - - if (current_ic == (XIC)ic) - return; - - if (current_ic != (XIC)NULL) { - _XimThaiUnSetFocus(current_ic); - } - ((Xim)ic->core.im)->private.local.current_ic = (XIC)ic; - - if (ic->core.focus_window) - _XRegisterFilterByType(ic->core.im->core.display, ic->core.focus_window, - KeyPress, KeyPress, _XimThaiFilter, (XPointer)ic); - return; -} - -Private void -_XimThaiReset( - XIC xic) -{ - Xic ic = (Xic)xic; - DefTreeBase *b = &ic->private.local.base; - ic->private.local.thai.comp_state = 0; - ic->private.local.thai.keysym = 0; - b->mb[b->tree[ic->private.local.composed].mb] = '\0'; - b->wc[b->tree[ic->private.local.composed].wc] = '\0'; - b->utf8[b->tree[ic->private.local.composed].utf8] = '\0'; -} - -Private char * -_XimThaiMbReset( - XIC xic) -{ - _XimThaiReset(xic); - return (char *)NULL; -} - -Private wchar_t * -_XimThaiWcReset( - XIC xic) -{ - _XimThaiReset(xic); - return (wchar_t *)NULL; -} - -Private XICMethodsRec Thai_ic_methods = { - _XimThaiDestroyIC, /* destroy */ - _XimThaiSetFocus, /* set_focus */ - _XimThaiUnSetFocus, /* unset_focus */ - _XimLocalSetICValues, /* set_values */ - _XimLocalGetICValues, /* get_values */ - _XimThaiMbReset, /* mb_reset */ - _XimThaiWcReset, /* wc_reset */ - _XimThaiMbReset, /* utf8_reset */ - _XimLocalMbLookupString, /* mb_lookup_string */ - _XimLocalWcLookupString, /* wc_lookup_string */ - _XimLocalUtf8LookupString /* utf8_lookup_string */ -}; - -XIC -_XimThaiCreateIC( - XIM im, - XIMArg *values) -{ - Xic ic; - XimDefICValues ic_values; - XIMResourceList res; - unsigned int num; - int len; - DefTree *tree; - - if((ic = (Xic)Xmalloc(sizeof(XicRec))) == (Xic)NULL) { - return ((XIC)NULL); - } - bzero((char *)ic, sizeof(XicRec)); - - ic->methods = &Thai_ic_methods; - ic->core.im = im; - ic->core.filter_events = KeyPressMask; - - if (! (ic->private.local.base.tree = tree = (DefTree *)Xmalloc(sizeof(DefTree)*3)) ) - goto Set_Error; - if (! (ic->private.local.base.mb = (char *)Xmalloc(21)) ) - goto Set_Error; - if (! (ic->private.local.base.wc = (wchar_t*)Xmalloc(sizeof(wchar_t)*21)) ) - goto Set_Error; - if (! (ic->private.local.base.utf8 = (char *)Xmalloc(21)) ) - goto Set_Error; - ic->private.local.context = 1; - tree[1].mb = 1; - tree[1].wc = 1; - tree[1].utf8 = 1; - ic->private.local.composed = 2; - tree[2].mb = 11; - tree[2].wc = 11; - tree[2].utf8 = 11; - - ic->private.local.thai.comp_state = 0; - ic->private.local.thai.keysym = 0; - ic->private.local.thai.input_mode = 0; - - num = im->core.ic_num_resources; - len = sizeof(XIMResource) * num; - if((res = (XIMResourceList)Xmalloc(len)) == (XIMResourceList)NULL) { - goto Set_Error; - } - (void)memcpy((char *)res, (char *)im->core.ic_resources, len); - ic->private.local.ic_resources = res; - ic->private.local.ic_num_resources = num; - - bzero((char *)&ic_values, sizeof(XimDefICValues)); - if(_XimCheckLocalInputStyle(ic, (XPointer)&ic_values, values, - im->core.styles, res, num) == False) { - goto Set_Error; - } - - _XimSetICMode(res, num, ic_values.input_style); - - if(_XimSetICValueData(ic, (XPointer)&ic_values, - ic->private.local.ic_resources, - ic->private.local.ic_num_resources, - values, XIM_CREATEIC, True)) { - goto Set_Error; - } - if(_XimSetICDefaults(ic, (XPointer)&ic_values, - XIM_SETICDEFAULTS, res, num) == False) { - goto Set_Error; - } - ic_values.filter_events = KeyPressMask; - _XimSetCurrentICValues(ic, &ic_values); - - return ((XIC)ic); - -Set_Error : - if (ic->private.local.ic_resources) { - Xfree(ic->private.local.ic_resources); - } - Xfree(ic); - return((XIC)NULL); -} +/******************************************************************
+
+ 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 "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Private void
+_XimThaiUnSetFocus(
+ XIC xic)
+{
+ Xic ic = (Xic)xic;
+ ((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL;
+
+ if (ic->core.focus_window)
+ _XUnregisterFilter(ic->core.im->core.display, ic->core.focus_window,
+ _XimThaiFilter, (XPointer)ic);
+ return;
+}
+
+Private void
+_XimThaiDestroyIC(
+ XIC xic)
+{
+ Xic ic = (Xic)xic;
+ DefTreeBase *b = &ic->private.local.base;
+
+ if(((Xim)ic->core.im)->private.local.current_ic == (XIC)ic) {
+ _XimThaiUnSetFocus(xic);
+ }
+ if(ic->private.local.ic_resources) {
+ Xfree(ic->private.local.ic_resources);
+ ic->private.local.ic_resources = NULL;
+ }
+
+ if (b->tree) Xfree (b->tree);
+ if (b->mb) Xfree (b->mb);
+ if (b->wc) Xfree (b->wc);
+ if (b->utf8) Xfree (b->utf8);
+ b->tree = NULL;
+ b->mb = NULL;
+ b->wc = NULL;
+ b->utf8 = NULL;
+ return;
+}
+
+Private void
+_XimThaiSetFocus(
+ XIC xic)
+{
+ Xic ic = (Xic)xic;
+ XIC current_ic = ((Xim)ic->core.im)->private.local.current_ic;
+
+ if (current_ic == (XIC)ic)
+ return;
+
+ if (current_ic != (XIC)NULL) {
+ _XimThaiUnSetFocus(current_ic);
+ }
+ ((Xim)ic->core.im)->private.local.current_ic = (XIC)ic;
+
+ if (ic->core.focus_window)
+ _XRegisterFilterByType(ic->core.im->core.display, ic->core.focus_window,
+ KeyPress, KeyPress, _XimThaiFilter, (XPointer)ic);
+ return;
+}
+
+Private void
+_XimThaiReset(
+ XIC xic)
+{
+ Xic ic = (Xic)xic;
+ DefTreeBase *b = &ic->private.local.base;
+ ic->private.local.thai.comp_state = 0;
+ ic->private.local.thai.keysym = 0;
+ b->mb[b->tree[ic->private.local.composed].mb] = '\0';
+ b->wc[b->tree[ic->private.local.composed].wc] = '\0';
+ b->utf8[b->tree[ic->private.local.composed].utf8] = '\0';
+}
+
+Private char *
+_XimThaiMbReset(
+ XIC xic)
+{
+ _XimThaiReset(xic);
+ return (char *)NULL;
+}
+
+Private wchar_t *
+_XimThaiWcReset(
+ XIC xic)
+{
+ _XimThaiReset(xic);
+ return (wchar_t *)NULL;
+}
+
+Private XICMethodsRec Thai_ic_methods = {
+ _XimThaiDestroyIC, /* destroy */
+ _XimThaiSetFocus, /* set_focus */
+ _XimThaiUnSetFocus, /* unset_focus */
+ _XimLocalSetICValues, /* set_values */
+ _XimLocalGetICValues, /* get_values */
+ _XimThaiMbReset, /* mb_reset */
+ _XimThaiWcReset, /* wc_reset */
+ _XimThaiMbReset, /* utf8_reset */
+ _XimLocalMbLookupString, /* mb_lookup_string */
+ _XimLocalWcLookupString, /* wc_lookup_string */
+ _XimLocalUtf8LookupString /* utf8_lookup_string */
+};
+
+XIC
+_XimThaiCreateIC(
+ XIM im,
+ XIMArg *values)
+{
+ Xic ic;
+ XimDefICValues ic_values;
+ XIMResourceList res;
+ unsigned int num;
+ int len;
+ DefTree *tree;
+
+ if((ic = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL) {
+ return ((XIC)NULL);
+ }
+
+ ic->methods = &Thai_ic_methods;
+ ic->core.im = im;
+ ic->core.filter_events = KeyPressMask;
+
+ if (! (ic->private.local.base.tree = tree = (DefTree *)Xmalloc(sizeof(DefTree)*3)) )
+ goto Set_Error;
+ if (! (ic->private.local.base.mb = (char *)Xmalloc(21)) )
+ goto Set_Error;
+ if (! (ic->private.local.base.wc = (wchar_t*)Xmalloc(sizeof(wchar_t)*21)) )
+ goto Set_Error;
+ if (! (ic->private.local.base.utf8 = (char *)Xmalloc(21)) )
+ goto Set_Error;
+ ic->private.local.context = 1;
+ tree[1].mb = 1;
+ tree[1].wc = 1;
+ tree[1].utf8 = 1;
+ ic->private.local.composed = 2;
+ tree[2].mb = 11;
+ tree[2].wc = 11;
+ tree[2].utf8 = 11;
+
+ ic->private.local.thai.comp_state = 0;
+ ic->private.local.thai.keysym = 0;
+ ic->private.local.thai.input_mode = 0;
+
+ num = im->core.ic_num_resources;
+ len = sizeof(XIMResource) * num;
+ if((res = (XIMResourceList)Xmalloc(len)) == (XIMResourceList)NULL) {
+ goto Set_Error;
+ }
+ (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
+ ic->private.local.ic_resources = res;
+ ic->private.local.ic_num_resources = num;
+
+ bzero((char *)&ic_values, sizeof(XimDefICValues));
+ if(_XimCheckLocalInputStyle(ic, (XPointer)&ic_values, values,
+ im->core.styles, res, num) == False) {
+ goto Set_Error;
+ }
+
+ _XimSetICMode(res, num, ic_values.input_style);
+
+ if(_XimSetICValueData(ic, (XPointer)&ic_values,
+ ic->private.local.ic_resources,
+ ic->private.local.ic_num_resources,
+ values, XIM_CREATEIC, True)) {
+ goto Set_Error;
+ }
+ if(_XimSetICDefaults(ic, (XPointer)&ic_values,
+ XIM_SETICDEFAULTS, res, num) == False) {
+ goto Set_Error;
+ }
+ ic_values.filter_events = KeyPressMask;
+ _XimSetCurrentICValues(ic, &ic_values);
+
+ return ((XIC)ic);
+
+Set_Error :
+ if (ic->private.local.ic_resources) {
+ Xfree(ic->private.local.ic_resources);
+ }
+ Xfree(ic);
+ return((XIC)NULL);
+}
diff --git a/libX11/modules/im/ximcp/imTrX.c b/libX11/modules/im/ximcp/imTrX.c index edcaf0852..27ef03e21 100644 --- a/libX11/modules/im/ximcp/imTrX.c +++ b/libX11/modules/im/ximcp/imTrX.c @@ -1,519 +1,518 @@ -/* - * Copyright 1992 Oracle and/or its affiliates. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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. - */ -/****************************************************************** - - Copyright 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: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc. - Takashi Fujiwara FUJITSU LIMITED - fujiwara@a80.tech.yk.fujitsu.co.jp - -******************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <string.h> -#include <X11/Xatom.h> -#include "Xlibint.h" -#include "Xlcint.h" -#include "Ximint.h" -#include "XimTrInt.h" -#include "XimTrX.h" - -Private Bool -_XimXRegisterDispatcher( - Xim im, - Bool (*callback)( - Xim, INT16, XPointer, XPointer - ), - XPointer call_data) -{ - XIntrCallbackPtr rec; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - - if (!(rec = (XIntrCallbackPtr)Xmalloc(sizeof(XIntrCallbackRec)))) - return False; - - rec->func = callback; - rec->call_data = call_data; - rec->next = spec->intr_cb; - spec->intr_cb = rec; - return True; -} - -Private void -_XimXFreeIntrCallback( - Xim im) -{ - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - register XIntrCallbackPtr rec, next; - - for (rec = spec->intr_cb; rec;) { - next = rec->next; - Xfree(rec); - rec = next; - } - return; -} - -Private Bool -_XimXCallDispatcher(Xim im, INT16 len, XPointer data) -{ - register XIntrCallbackRec *rec; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - - for (rec = spec->intr_cb; rec; rec = rec->next) { - if ((*rec->func)(im, len, data, rec->call_data)) - return True; - } - return False; -} - -Private Bool -_XimXFilterWaitEvent( - Display *d, - Window w, - XEvent *ev, - XPointer arg) -{ - Xim im = (Xim)arg; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - Bool ret; - - spec->ev = (XPointer)ev; - ret = _XimFilterWaitEvent(im); - - /* - * If ev is a pointer to a stack variable, there could be - * a coredump later on if the pointer is dereferenced. - * Therefore, reset to NULL to force reinitialization in - * _XimXRead(). - * - * Keep in mind _XimXRead may be called again when the stack - * is very different. - */ - spec->ev = (XPointer)NULL; - - return ret; -} - -Private Bool -_CheckConnect( - Display *display, - XEvent *event, - XPointer xim) -{ - Xim im = (Xim)xim; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - - if ((event->type == ClientMessage) - && (event->xclient.message_type == spec->imconnectid)) { - return True; - } - return False; -} - -Private Bool -_XimXConnect(Xim im) -{ - XEvent event; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - CARD32 major_code; - CARD32 minor_code; - - if (!(spec->lib_connect_wid = XCreateSimpleWindow(im->core.display, - DefaultRootWindow(im->core.display), 0, 0, 1, 1, 1, 0, 0))) { - return False; - } - - event.xclient.type = ClientMessage; - event.xclient.display = im->core.display; - event.xclient.window = im->private.proto.im_window; - event.xclient.message_type = spec->imconnectid; - event.xclient.format = 32; - event.xclient.data.l[0] = (CARD32)spec->lib_connect_wid; - event.xclient.data.l[1] = spec->major_code; - event.xclient.data.l[2] = spec->minor_code; - event.xclient.data.l[3] = 0; - event.xclient.data.l[4] = 0; - - if(event.xclient.data.l[1] == 1 || event.xclient.data.l[1] == 2) { - XWindowAttributes atr; - long event_mask; - - XGetWindowAttributes(im->core.display, spec->lib_connect_wid, &atr); - event_mask = atr.your_event_mask | PropertyChangeMask; - XSelectInput(im->core.display, spec->lib_connect_wid, event_mask); - _XRegisterFilterByType(im->core.display, spec->lib_connect_wid, - PropertyNotify, PropertyNotify, - _XimXFilterWaitEvent, (XPointer)im); - } - - XSendEvent(im->core.display, im->private.proto.im_window, - False, NoEventMask, &event); - XFlush(im->core.display); - - for (;;) { - XIfEvent(im->core.display, &event, _CheckConnect, (XPointer)im); - if (event.xclient.type != ClientMessage) { - return False; - } - if (event.xclient.message_type == spec->imconnectid) - break; - } - - spec->ims_connect_wid = (Window)event.xclient.data.l[0]; - major_code = (CARD32)event.xclient.data.l[1]; - minor_code = (CARD32)event.xclient.data.l[2]; - - if (((major_code == 0) && (minor_code <= 2)) || - ((major_code == 1) && (minor_code == 0)) || - ((major_code == 2) && (minor_code <= 1))) { - spec->major_code = major_code; - spec->minor_code = minor_code; - } - if (((major_code == 0) && (minor_code == 2)) || - ((major_code == 2) && (minor_code == 1))) { - spec->BoundarySize = (CARD32)event.xclient.data.l[3]; - } - - /* ClientMessage Event Filter */ - _XRegisterFilterByType(im->core.display, spec->lib_connect_wid, - ClientMessage, ClientMessage, - _XimXFilterWaitEvent, (XPointer)im); - return True; -} - -Private Bool -_XimXShutdown(Xim im) -{ - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - - if (!spec) - return True; - - /* ClientMessage Event Filter */ - _XUnregisterFilter(im->core.display, - ((XSpecRec *)im->private.proto.spec)->lib_connect_wid, - _XimXFilterWaitEvent, (XPointer)im); - XDestroyWindow(im->core.display, - ((XSpecRec *)im->private.proto.spec)->lib_connect_wid); - _XimXFreeIntrCallback(im); - Xfree(spec); - im->private.proto.spec = 0; - return True; -} - -Private char * -_NewAtom( - char *atomName) -{ - static int sequence = 0; - - (void)sprintf(atomName, "_client%d", sequence); - sequence = ((sequence < 20) ? sequence + 1 : 0); - return atomName; -} - -Private Bool -_XimXWrite(Xim im, INT16 len, XPointer data) -{ - Atom atom; - char atomName[16]; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - XEvent event; - CARD8 *p; - CARD32 major_code = spec->major_code; - CARD32 minor_code = spec->minor_code; - int BoundSize; - - bzero(&event,sizeof(XEvent)); - event.xclient.type = ClientMessage; - event.xclient.display = im->core.display; - event.xclient.window = spec->ims_connect_wid; - if(major_code == 1 && minor_code == 0) { - BoundSize = 0; - } else if((major_code == 0 && minor_code == 2) || - (major_code == 2 && minor_code == 1)) { - BoundSize = spec->BoundarySize; - } else if(major_code == 0 && minor_code == 1) { - BoundSize = len; - } else { - BoundSize = XIM_CM_DATA_SIZE; - } - if (len > BoundSize) { - event.xclient.message_type = spec->improtocolid; - atom = XInternAtom(im->core.display, _NewAtom(atomName), False); - XChangeProperty(im->core.display, spec->ims_connect_wid, - atom, XA_STRING, 8, PropModeAppend, - (unsigned char *)data, len); - if(major_code == 0) { - event.xclient.format = 32; - event.xclient.data.l[0] = (long)len; - event.xclient.data.l[1] = (long)atom; - XSendEvent(im->core.display, spec->ims_connect_wid, - False, NoEventMask, &event); - } - } else { - int length; - - event.xclient.format = 8; - for(length = 0 ; length < len ; length += XIM_CM_DATA_SIZE) { - p = (CARD8 *)&event.xclient.data.b[0]; - if((length + XIM_CM_DATA_SIZE) >= len) { - event.xclient.message_type = spec->improtocolid; - bzero(p, XIM_CM_DATA_SIZE); - memcpy((char *)p, (data + length), (len - length)); - } else { - event.xclient.message_type = spec->immoredataid; - memcpy((char *)p, (data + length), XIM_CM_DATA_SIZE); - } - XSendEvent(im->core.display, spec->ims_connect_wid, - False, NoEventMask, &event); - } - } - - return True; -} - -Private Bool -_XimXGetReadData( - Xim im, - char *buf, - int buf_len, - int *ret_len, - XEvent *event) -{ - char *data; - int len; - - char tmp_buf[XIM_CM_DATA_SIZE]; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - unsigned long length; - Atom prop; - int return_code; - Atom type_ret; - int format_ret; - unsigned long nitems; - unsigned long bytes_after_ret; - unsigned char *prop_ret; - - if ((event->type == ClientMessage) && - !((event->xclient.message_type == spec->improtocolid) || - (event->xclient.message_type == spec->immoredataid))) { - /* This event has nothing to do with us, - * FIXME should not have gotten here then... - */ - return False; - } else if ((event->type == ClientMessage) && (event->xclient.format == 8)) { - data = event->xclient.data.b; - if (buf_len >= XIM_CM_DATA_SIZE) { - (void)memcpy(buf, data, XIM_CM_DATA_SIZE); - *ret_len = XIM_CM_DATA_SIZE; - } else { - (void)memcpy(buf, data, buf_len); - len = XIM_CM_DATA_SIZE - buf_len; - (void)memcpy(tmp_buf, &data[buf_len], len); - bzero(data, XIM_CM_DATA_SIZE); - (void)memcpy(data, tmp_buf, len); - XPutBackEvent(im->core.display, event); - *ret_len = buf_len; - } - } else if ((event->type == ClientMessage) - && (event->xclient.format == 32)) { - length = (unsigned long)event->xclient.data.l[0]; - prop = (Atom)event->xclient.data.l[1]; - return_code = XGetWindowProperty(im->core.display, - spec->lib_connect_wid, prop, 0L, - (long)((length + 3)/ 4), True, AnyPropertyType, - &type_ret, &format_ret, &nitems, &bytes_after_ret, &prop_ret); - if (return_code != Success || format_ret == 0 || nitems == 0) { - if (return_code == Success) - XFree(prop_ret); - return False; - } - if (buf_len >= length) { - (void)memcpy(buf, prop_ret, (int)nitems); - *ret_len = (int)nitems; - if (bytes_after_ret > 0) { - XFree(prop_ret); - if (XGetWindowProperty(im->core.display, - spec->lib_connect_wid, prop, 0L, - ((length + bytes_after_ret + 3)/ 4), - True, AnyPropertyType, - &type_ret, &format_ret, &nitems, - &bytes_after_ret, - &prop_ret) == Success) { - XChangeProperty(im->core.display, spec->lib_connect_wid, prop, - XA_STRING, 8, PropModePrepend, &prop_ret[length], - (nitems - length)); - } else { - return False; - } - } - } else { - (void)memcpy(buf, prop_ret, buf_len); - *ret_len = buf_len; - len = nitems - buf_len; - - if (bytes_after_ret > 0) { - XFree(prop_ret); - if (XGetWindowProperty(im->core.display, - spec->lib_connect_wid, prop, 0L, - ((length + bytes_after_ret + 3)/ 4), - True, AnyPropertyType, - &type_ret, &format_ret, &nitems, - &bytes_after_ret, &prop_ret) != Success) { - return False; - } - } - XChangeProperty(im->core.display, spec->lib_connect_wid, prop, - XA_STRING, 8, PropModePrepend, &prop_ret[buf_len], len); - event->xclient.data.l[0] = (long)len; - event->xclient.data.l[1] = (long)prop; - XPutBackEvent(im->core.display, event); - } - XFree(prop_ret); - } else if (event->type == PropertyNotify) { - prop = event->xproperty.atom; - return_code = XGetWindowProperty(im->core.display, - spec->lib_connect_wid, prop, 0L, - 1000000L, True, AnyPropertyType, - &type_ret, &format_ret, &nitems, &bytes_after_ret, &prop_ret); - if (return_code != Success || format_ret == 0 || nitems == 0) { - if (return_code == Success) - XFree(prop_ret); - return False; - } - if (buf_len >= nitems) { - (void)memcpy(buf, prop_ret, (int)nitems); - *ret_len = (int)nitems; - } else { - (void)memcpy(buf, prop_ret, buf_len); - *ret_len = buf_len; - len = nitems - buf_len; - XChangeProperty(im->core.display, spec->lib_connect_wid, prop, - XA_STRING, 8, PropModePrepend, &prop_ret[buf_len], len); - } - XFree(prop_ret); - } - return True; -} - -Private Bool -_CheckCMEvent( - Display *display, - XEvent *event, - XPointer xim) -{ - Xim im = (Xim)xim; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - CARD32 major_code = spec->major_code; - - if ((event->type == ClientMessage) - &&((event->xclient.message_type == spec->improtocolid) || - (event->xclient.message_type == spec->immoredataid))) - return True; - if((major_code == 1 || major_code == 2) && - (event->type == PropertyNotify) && - (event->xproperty.state == PropertyNewValue)) - return True; - return False; -} - -Private Bool -_XimXRead(Xim im, XPointer recv_buf, int buf_len, int *ret_len) -{ - XEvent *ev; - XEvent event; - int len = 0; - XSpecRec *spec = (XSpecRec *)im->private.proto.spec; - XPointer arg = spec->ev; - - if (!arg) { - bzero(&event, sizeof(XEvent)); - ev = &event; - XIfEvent(im->core.display, ev, _CheckCMEvent, (XPointer)im); - } else { - ev = (XEvent *)arg; - spec->ev = (XPointer)NULL; - } - if (!(_XimXGetReadData(im, recv_buf, buf_len, &len, ev))) - return False; - *ret_len = len; - return True; -} - -Private void -_XimXFlush(Xim im) -{ - XFlush(im->core.display); - return; -} - -Public Bool -_XimXConf(Xim im, char *address) -{ - XSpecRec *spec; - - if (!(spec = (XSpecRec *)Xmalloc(sizeof(XSpecRec)))) - return False; - bzero(spec, sizeof(XSpecRec)); - - spec->improtocolid = XInternAtom(im->core.display, _XIM_PROTOCOL, False); - spec->imconnectid = XInternAtom(im->core.display, _XIM_XCONNECT, False); - spec->immoredataid = XInternAtom(im->core.display, _XIM_MOREDATA, False); - spec->major_code = MAJOR_TRANSPORT_VERSION; - spec->minor_code = MINOR_TRANSPORT_VERSION; - - im->private.proto.spec = (XPointer)spec; - im->private.proto.connect = _XimXConnect; - im->private.proto.shutdown = _XimXShutdown; - im->private.proto.write = _XimXWrite; - im->private.proto.read = _XimXRead; - im->private.proto.flush = _XimXFlush; - im->private.proto.register_dispatcher = _XimXRegisterDispatcher; - im->private.proto.call_dispatcher = _XimXCallDispatcher; - - return True; -} +/*
+ * Copyright 1992 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+ */
+/******************************************************************
+
+ Copyright 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: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+ Takashi Fujiwara FUJITSU LIMITED
+ fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <string.h>
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimTrInt.h"
+#include "XimTrX.h"
+
+Private Bool
+_XimXRegisterDispatcher(
+ Xim im,
+ Bool (*callback)(
+ Xim, INT16, XPointer, XPointer
+ ),
+ XPointer call_data)
+{
+ XIntrCallbackPtr rec;
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+
+ if (!(rec = (XIntrCallbackPtr)Xmalloc(sizeof(XIntrCallbackRec))))
+ return False;
+
+ rec->func = callback;
+ rec->call_data = call_data;
+ rec->next = spec->intr_cb;
+ spec->intr_cb = rec;
+ return True;
+}
+
+Private void
+_XimXFreeIntrCallback(
+ Xim im)
+{
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+ register XIntrCallbackPtr rec, next;
+
+ for (rec = spec->intr_cb; rec;) {
+ next = rec->next;
+ Xfree(rec);
+ rec = next;
+ }
+ return;
+}
+
+Private Bool
+_XimXCallDispatcher(Xim im, INT16 len, XPointer data)
+{
+ register XIntrCallbackRec *rec;
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+
+ for (rec = spec->intr_cb; rec; rec = rec->next) {
+ if ((*rec->func)(im, len, data, rec->call_data))
+ return True;
+ }
+ return False;
+}
+
+Private Bool
+_XimXFilterWaitEvent(
+ Display *d,
+ Window w,
+ XEvent *ev,
+ XPointer arg)
+{
+ Xim im = (Xim)arg;
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+ Bool ret;
+
+ spec->ev = (XPointer)ev;
+ ret = _XimFilterWaitEvent(im);
+
+ /*
+ * If ev is a pointer to a stack variable, there could be
+ * a coredump later on if the pointer is dereferenced.
+ * Therefore, reset to NULL to force reinitialization in
+ * _XimXRead().
+ *
+ * Keep in mind _XimXRead may be called again when the stack
+ * is very different.
+ */
+ spec->ev = (XPointer)NULL;
+
+ return ret;
+}
+
+Private Bool
+_CheckConnect(
+ Display *display,
+ XEvent *event,
+ XPointer xim)
+{
+ Xim im = (Xim)xim;
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+
+ if ((event->type == ClientMessage)
+ && (event->xclient.message_type == spec->imconnectid)) {
+ return True;
+ }
+ return False;
+}
+
+Private Bool
+_XimXConnect(Xim im)
+{
+ XEvent event;
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+ CARD32 major_code;
+ CARD32 minor_code;
+
+ if (!(spec->lib_connect_wid = XCreateSimpleWindow(im->core.display,
+ DefaultRootWindow(im->core.display), 0, 0, 1, 1, 1, 0, 0))) {
+ return False;
+ }
+
+ event.xclient.type = ClientMessage;
+ event.xclient.display = im->core.display;
+ event.xclient.window = im->private.proto.im_window;
+ event.xclient.message_type = spec->imconnectid;
+ event.xclient.format = 32;
+ event.xclient.data.l[0] = (CARD32)spec->lib_connect_wid;
+ event.xclient.data.l[1] = spec->major_code;
+ event.xclient.data.l[2] = spec->minor_code;
+ event.xclient.data.l[3] = 0;
+ event.xclient.data.l[4] = 0;
+
+ if(event.xclient.data.l[1] == 1 || event.xclient.data.l[1] == 2) {
+ XWindowAttributes atr;
+ long event_mask;
+
+ XGetWindowAttributes(im->core.display, spec->lib_connect_wid, &atr);
+ event_mask = atr.your_event_mask | PropertyChangeMask;
+ XSelectInput(im->core.display, spec->lib_connect_wid, event_mask);
+ _XRegisterFilterByType(im->core.display, spec->lib_connect_wid,
+ PropertyNotify, PropertyNotify,
+ _XimXFilterWaitEvent, (XPointer)im);
+ }
+
+ XSendEvent(im->core.display, im->private.proto.im_window,
+ False, NoEventMask, &event);
+ XFlush(im->core.display);
+
+ for (;;) {
+ XIfEvent(im->core.display, &event, _CheckConnect, (XPointer)im);
+ if (event.xclient.type != ClientMessage) {
+ return False;
+ }
+ if (event.xclient.message_type == spec->imconnectid)
+ break;
+ }
+
+ spec->ims_connect_wid = (Window)event.xclient.data.l[0];
+ major_code = (CARD32)event.xclient.data.l[1];
+ minor_code = (CARD32)event.xclient.data.l[2];
+
+ if (((major_code == 0) && (minor_code <= 2)) ||
+ ((major_code == 1) && (minor_code == 0)) ||
+ ((major_code == 2) && (minor_code <= 1))) {
+ spec->major_code = major_code;
+ spec->minor_code = minor_code;
+ }
+ if (((major_code == 0) && (minor_code == 2)) ||
+ ((major_code == 2) && (minor_code == 1))) {
+ spec->BoundarySize = (CARD32)event.xclient.data.l[3];
+ }
+
+ /* ClientMessage Event Filter */
+ _XRegisterFilterByType(im->core.display, spec->lib_connect_wid,
+ ClientMessage, ClientMessage,
+ _XimXFilterWaitEvent, (XPointer)im);
+ return True;
+}
+
+Private Bool
+_XimXShutdown(Xim im)
+{
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+
+ if (!spec)
+ return True;
+
+ /* ClientMessage Event Filter */
+ _XUnregisterFilter(im->core.display,
+ ((XSpecRec *)im->private.proto.spec)->lib_connect_wid,
+ _XimXFilterWaitEvent, (XPointer)im);
+ XDestroyWindow(im->core.display,
+ ((XSpecRec *)im->private.proto.spec)->lib_connect_wid);
+ _XimXFreeIntrCallback(im);
+ Xfree(spec);
+ im->private.proto.spec = 0;
+ return True;
+}
+
+Private char *
+_NewAtom(
+ char *atomName)
+{
+ static int sequence = 0;
+
+ (void)sprintf(atomName, "_client%d", sequence);
+ sequence = ((sequence < 20) ? sequence + 1 : 0);
+ return atomName;
+}
+
+Private Bool
+_XimXWrite(Xim im, INT16 len, XPointer data)
+{
+ Atom atom;
+ char atomName[16];
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+ XEvent event;
+ CARD8 *p;
+ CARD32 major_code = spec->major_code;
+ CARD32 minor_code = spec->minor_code;
+ int BoundSize;
+
+ bzero(&event,sizeof(XEvent));
+ event.xclient.type = ClientMessage;
+ event.xclient.display = im->core.display;
+ event.xclient.window = spec->ims_connect_wid;
+ if(major_code == 1 && minor_code == 0) {
+ BoundSize = 0;
+ } else if((major_code == 0 && minor_code == 2) ||
+ (major_code == 2 && minor_code == 1)) {
+ BoundSize = spec->BoundarySize;
+ } else if(major_code == 0 && minor_code == 1) {
+ BoundSize = len;
+ } else {
+ BoundSize = XIM_CM_DATA_SIZE;
+ }
+ if (len > BoundSize) {
+ event.xclient.message_type = spec->improtocolid;
+ atom = XInternAtom(im->core.display, _NewAtom(atomName), False);
+ XChangeProperty(im->core.display, spec->ims_connect_wid,
+ atom, XA_STRING, 8, PropModeAppend,
+ (unsigned char *)data, len);
+ if(major_code == 0) {
+ event.xclient.format = 32;
+ event.xclient.data.l[0] = (long)len;
+ event.xclient.data.l[1] = (long)atom;
+ XSendEvent(im->core.display, spec->ims_connect_wid,
+ False, NoEventMask, &event);
+ }
+ } else {
+ int length;
+
+ event.xclient.format = 8;
+ for(length = 0 ; length < len ; length += XIM_CM_DATA_SIZE) {
+ p = (CARD8 *)&event.xclient.data.b[0];
+ if((length + XIM_CM_DATA_SIZE) >= len) {
+ event.xclient.message_type = spec->improtocolid;
+ bzero(p, XIM_CM_DATA_SIZE);
+ memcpy((char *)p, (data + length), (len - length));
+ } else {
+ event.xclient.message_type = spec->immoredataid;
+ memcpy((char *)p, (data + length), XIM_CM_DATA_SIZE);
+ }
+ XSendEvent(im->core.display, spec->ims_connect_wid,
+ False, NoEventMask, &event);
+ }
+ }
+
+ return True;
+}
+
+Private Bool
+_XimXGetReadData(
+ Xim im,
+ char *buf,
+ int buf_len,
+ int *ret_len,
+ XEvent *event)
+{
+ char *data;
+ int len;
+
+ char tmp_buf[XIM_CM_DATA_SIZE];
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+ unsigned long length;
+ Atom prop;
+ int return_code;
+ Atom type_ret;
+ int format_ret;
+ unsigned long nitems;
+ unsigned long bytes_after_ret;
+ unsigned char *prop_ret;
+
+ if ((event->type == ClientMessage) &&
+ !((event->xclient.message_type == spec->improtocolid) ||
+ (event->xclient.message_type == spec->immoredataid))) {
+ /* This event has nothing to do with us,
+ * FIXME should not have gotten here then...
+ */
+ return False;
+ } else if ((event->type == ClientMessage) && (event->xclient.format == 8)) {
+ data = event->xclient.data.b;
+ if (buf_len >= XIM_CM_DATA_SIZE) {
+ (void)memcpy(buf, data, XIM_CM_DATA_SIZE);
+ *ret_len = XIM_CM_DATA_SIZE;
+ } else {
+ (void)memcpy(buf, data, buf_len);
+ len = XIM_CM_DATA_SIZE - buf_len;
+ (void)memcpy(tmp_buf, &data[buf_len], len);
+ bzero(data, XIM_CM_DATA_SIZE);
+ (void)memcpy(data, tmp_buf, len);
+ XPutBackEvent(im->core.display, event);
+ *ret_len = buf_len;
+ }
+ } else if ((event->type == ClientMessage)
+ && (event->xclient.format == 32)) {
+ length = (unsigned long)event->xclient.data.l[0];
+ prop = (Atom)event->xclient.data.l[1];
+ return_code = XGetWindowProperty(im->core.display,
+ spec->lib_connect_wid, prop, 0L,
+ (long)((length + 3)/ 4), True, AnyPropertyType,
+ &type_ret, &format_ret, &nitems, &bytes_after_ret, &prop_ret);
+ if (return_code != Success || format_ret == 0 || nitems == 0) {
+ if (return_code == Success)
+ XFree(prop_ret);
+ return False;
+ }
+ if (buf_len >= length) {
+ (void)memcpy(buf, prop_ret, (int)nitems);
+ *ret_len = (int)nitems;
+ if (bytes_after_ret > 0) {
+ XFree(prop_ret);
+ if (XGetWindowProperty(im->core.display,
+ spec->lib_connect_wid, prop, 0L,
+ ((length + bytes_after_ret + 3)/ 4),
+ True, AnyPropertyType,
+ &type_ret, &format_ret, &nitems,
+ &bytes_after_ret,
+ &prop_ret) == Success) {
+ XChangeProperty(im->core.display, spec->lib_connect_wid, prop,
+ XA_STRING, 8, PropModePrepend, &prop_ret[length],
+ (nitems - length));
+ } else {
+ return False;
+ }
+ }
+ } else {
+ (void)memcpy(buf, prop_ret, buf_len);
+ *ret_len = buf_len;
+ len = nitems - buf_len;
+
+ if (bytes_after_ret > 0) {
+ XFree(prop_ret);
+ if (XGetWindowProperty(im->core.display,
+ spec->lib_connect_wid, prop, 0L,
+ ((length + bytes_after_ret + 3)/ 4),
+ True, AnyPropertyType,
+ &type_ret, &format_ret, &nitems,
+ &bytes_after_ret, &prop_ret) != Success) {
+ return False;
+ }
+ }
+ XChangeProperty(im->core.display, spec->lib_connect_wid, prop,
+ XA_STRING, 8, PropModePrepend, &prop_ret[buf_len], len);
+ event->xclient.data.l[0] = (long)len;
+ event->xclient.data.l[1] = (long)prop;
+ XPutBackEvent(im->core.display, event);
+ }
+ XFree(prop_ret);
+ } else if (event->type == PropertyNotify) {
+ prop = event->xproperty.atom;
+ return_code = XGetWindowProperty(im->core.display,
+ spec->lib_connect_wid, prop, 0L,
+ 1000000L, True, AnyPropertyType,
+ &type_ret, &format_ret, &nitems, &bytes_after_ret, &prop_ret);
+ if (return_code != Success || format_ret == 0 || nitems == 0) {
+ if (return_code == Success)
+ XFree(prop_ret);
+ return False;
+ }
+ if (buf_len >= nitems) {
+ (void)memcpy(buf, prop_ret, (int)nitems);
+ *ret_len = (int)nitems;
+ } else {
+ (void)memcpy(buf, prop_ret, buf_len);
+ *ret_len = buf_len;
+ len = nitems - buf_len;
+ XChangeProperty(im->core.display, spec->lib_connect_wid, prop,
+ XA_STRING, 8, PropModePrepend, &prop_ret[buf_len], len);
+ }
+ XFree(prop_ret);
+ }
+ return True;
+}
+
+Private Bool
+_CheckCMEvent(
+ Display *display,
+ XEvent *event,
+ XPointer xim)
+{
+ Xim im = (Xim)xim;
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+ CARD32 major_code = spec->major_code;
+
+ if ((event->type == ClientMessage)
+ &&((event->xclient.message_type == spec->improtocolid) ||
+ (event->xclient.message_type == spec->immoredataid)))
+ return True;
+ if((major_code == 1 || major_code == 2) &&
+ (event->type == PropertyNotify) &&
+ (event->xproperty.state == PropertyNewValue))
+ return True;
+ return False;
+}
+
+Private Bool
+_XimXRead(Xim im, XPointer recv_buf, int buf_len, int *ret_len)
+{
+ XEvent *ev;
+ XEvent event;
+ int len = 0;
+ XSpecRec *spec = (XSpecRec *)im->private.proto.spec;
+ XPointer arg = spec->ev;
+
+ if (!arg) {
+ bzero(&event, sizeof(XEvent));
+ ev = &event;
+ XIfEvent(im->core.display, ev, _CheckCMEvent, (XPointer)im);
+ } else {
+ ev = (XEvent *)arg;
+ spec->ev = (XPointer)NULL;
+ }
+ if (!(_XimXGetReadData(im, recv_buf, buf_len, &len, ev)))
+ return False;
+ *ret_len = len;
+ return True;
+}
+
+Private void
+_XimXFlush(Xim im)
+{
+ XFlush(im->core.display);
+ return;
+}
+
+Public Bool
+_XimXConf(Xim im, char *address)
+{
+ XSpecRec *spec;
+
+ if (!(spec = Xcalloc(1, sizeof(XSpecRec))))
+ return False;
+
+ spec->improtocolid = XInternAtom(im->core.display, _XIM_PROTOCOL, False);
+ spec->imconnectid = XInternAtom(im->core.display, _XIM_XCONNECT, False);
+ spec->immoredataid = XInternAtom(im->core.display, _XIM_MOREDATA, False);
+ spec->major_code = MAJOR_TRANSPORT_VERSION;
+ spec->minor_code = MINOR_TRANSPORT_VERSION;
+
+ im->private.proto.spec = (XPointer)spec;
+ im->private.proto.connect = _XimXConnect;
+ im->private.proto.shutdown = _XimXShutdown;
+ im->private.proto.write = _XimXWrite;
+ im->private.proto.read = _XimXRead;
+ im->private.proto.flush = _XimXFlush;
+ im->private.proto.register_dispatcher = _XimXRegisterDispatcher;
+ im->private.proto.call_dispatcher = _XimXCallDispatcher;
+
+ return True;
+}
diff --git a/libX11/modules/im/ximcp/imTrans.c b/libX11/modules/im/ximcp/imTrans.c index d6c5fc6ad..6d3daee67 100644 --- a/libX11/modules/im/ximcp/imTrans.c +++ b/libX11/modules/im/ximcp/imTrans.c @@ -291,17 +291,14 @@ _XimTransConf( char *paddr;
TransSpecRec *spec;
- if (!(paddr = (char *)Xmalloc(strlen(address) + 1)))
+ if (!(paddr = strdup(address)))
return False;
- if (!(spec = (TransSpecRec *) Xmalloc(sizeof(TransSpecRec)))) {
+ if (!(spec = Xcalloc(1, sizeof(TransSpecRec)))) {
Xfree(paddr);
return False;
}
- bzero(spec, sizeof(TransSpecRec));
-
- (void)strcpy(paddr, address);
spec->address = paddr;
im->private.proto.spec = (XPointer)spec;
diff --git a/libX11/modules/lc/gen/lcGenConv.c b/libX11/modules/lc/gen/lcGenConv.c index baac73a39..c222c1f2a 100644 --- a/libX11/modules/lc/gen/lcGenConv.c +++ b/libX11/modules/lc/gen/lcGenConv.c @@ -1,3149 +1,3148 @@ -/* - * 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. - * - * Modifier: Masayoshi Shimamura FUJITSU LIMITED - * - */ -/* - * 2000 - * Modifier: Ivan Pascal The XFree86 Project - */ - -/* - * A generic locale loader for all kinds of ISO-2022 based codesets. - * Supports: all locales. - * How: Provides generic converters for ISO-2022 based codesets. Extensible as - * far as ISO-2022 is extensible: codesets can be given by name in the - * stream. Overall distinction between GL (0x00..0x7f) and GR (0x80..0xff). - * In every chunk between escape sequences, the number of bytes per - * character (char_size) is constant. - * Platforms: all systems. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include "Xlibint.h" -#include "XlcGeneric.h" -#include <stdio.h> - -#if !defined(Lynx_22) && !defined(X_LOCALE) -#define STDCVT -#endif - -typedef struct _CTDataRec { - const char *name; - const char *encoding; /* Compound Text encoding */ -} CTDataRec, *CTData; - -static CTDataRec directionality_data[] = -{ - { "BEGIN_LEFT-TO-RIGHT_TEXT", "\2331]" }, - { "BEGIN_RIGHT-TO-LEFT_TEXT", "\2332]" }, - { "END_OF_STRING", "\233]" }, -}; - -typedef struct _StateRec { - XLCd lcd; - /* CT state */ - XlcCharSet charset; /* charset of current state */ - XlcCharSet GL_charset; /* charset of initial state in GL */ - XlcCharSet GR_charset; /* charset of initial state in GR */ - /* MB shift state */ - CodeSet GL_codeset; - CodeSet GR_codeset; -} StateRec, *State; - -#define GR 0x80 /* begins right-side (non-ascii) region */ -#define GL 0x7f /* ends left-side (ascii) region */ -#define ESC 0x1b -#define CSI 0x9b -#define STX 0x02 - -#define isrightside(c) ((c) & GR) -#define isleftside(c) (!isrightside(c)) - -/* Forward declarations for local routines. */ -static int mbstocts (XlcConv conv, XPointer *from, int *from_left, - XPointer *to, int *to_left, XPointer *args, int num_args); -static int ctstombs (XlcConv conv, XPointer *from, int *from_left, - XPointer *to, int *to_left, XPointer *args, int num_args); -static int cstombs (XlcConv conv, XPointer *from, int *from_left, - XPointer *to, int *to_left, XPointer *args, int num_args); - -/* ------------------------------------------------------------------------- */ -/* Misc */ -/* ------------------------------------------------------------------------- */ - -static int -compare( - const char *src, - const char *encoding, - int length) -{ - const char *start = src; - - while (length-- > 0) { - if (*src++ != *encoding++) - return 0; - if (*encoding == '\0') - return src - start; - } - - return 0; -} - -static unsigned long -conv_to_dest( - Conversion conv, - unsigned long code) -{ - int i; - int conv_num = conv->conv_num; - FontScope convlist = conv->convlist; - - for (i = 0; i < conv_num; i++) { - if (convlist[i].start <= code && code <= convlist[i].end) { - switch (convlist[i].shift_direction) { - case '+': - return(code + convlist[i].shift); - case '-': - return(code - convlist[i].shift); - default: - return(code); - } - } - } - - return(code); -} - -static unsigned long -conv_to_source( - Conversion conv, - unsigned long code) -{ - int i; - int conv_num; - FontScope convlist; - unsigned long start_p; - unsigned long start_m; - unsigned long end_p; - unsigned long end_m; - - if (!conv) - return(code); - - conv_num = conv->conv_num; - convlist = conv->convlist; - - for (i = 0; i < conv_num; i++) { - switch (convlist[i].shift_direction) { - case '+': - start_p = convlist[i].start + convlist[i].shift; - end_p = convlist[i].end + convlist[i].shift; - if (start_p <= code && code <= end_p) - return(code - convlist[i].shift); - break; - case '-': - start_m = convlist[i].start - convlist[i].shift; - end_m = convlist[i].end - convlist[i].shift; - if (start_m <= code && code <= end_m) - return(code + convlist[i].shift); - break; - default: - continue; - } - } - - return(code); -} - -static unsigned long -mb_to_gi( - unsigned long mb, - CodeSet codeset) -{ - int i; - unsigned long mb_tmp, mask = 0; - - if (codeset->mbconv) { - mb_tmp = conv_to_dest(codeset->mbconv, mb); - if (mb_tmp != mb) - return(mb_tmp); - } - - if (codeset->side == XlcC0 || codeset->side == XlcGL || - codeset->side == XlcC1 || codeset->side == XlcGR) { - - for (i = 0; i < codeset->length; i++) - mask = (mask << 8) | GL; - mb = mb & mask; - } - - return(mb); -} - -static unsigned long -gi_to_mb( - unsigned long glyph_index, - CodeSet codeset) -{ - int i; - unsigned long mask = 0; - - if (codeset->side == XlcC1 || codeset->side == XlcGR) { - for (i = 0; i < codeset->length; i++) - mask = (mask << 8) | GR; - glyph_index = glyph_index | mask; - } - - if (codeset->mbconv) - return( conv_to_source(codeset->mbconv, glyph_index) ); - - return(glyph_index); -} - -static Bool -gi_to_wc( - XLCd lcd, - unsigned long glyph_index, - CodeSet codeset, - wchar_t *wc) -{ - unsigned char mask = 0; - unsigned long wc_encoding = codeset->wc_encoding; - int length = codeset->length; - unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits); - - mask = (1 << wc_shift_bits) - 1 ; - - for (*wc = 0, length--; length >= 0; length--) - *wc = (*wc << wc_shift_bits) | ((glyph_index >> (length * 8 )) & mask); - - *wc = *wc | wc_encoding; - - return(True); -} - -static Bool -wc_to_gi( - XLCd lcd, - wchar_t wc, - unsigned long *glyph_index, - CodeSet *codeset) -{ - int i; - unsigned char mask = 0; - unsigned long wc_encoding; - unsigned long wc_encode_mask = XLC_GENERIC(lcd, wc_encode_mask); - unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits); - int codeset_num = XLC_GENERIC(lcd, codeset_num); - CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); - - wc_encoding = wc & wc_encode_mask; - for (*codeset = NULL, i = 0; i < codeset_num; i++) { - if (wc_encoding == codeset_list[i]->wc_encoding) { - *codeset = codeset_list[i]; - break; - } - } - if (*codeset == NULL) - return(False); - - mask = (1 << wc_shift_bits) - 1 ; - - wc = wc & ~wc_encode_mask; - for (*glyph_index = 0, i = (*codeset)->length - 1; i >= 0; i--) - *glyph_index = (*glyph_index << 8) | - ( ((unsigned long)wc >> (i * wc_shift_bits)) & mask ); - - return(True); -} - -static CodeSet -mb_parse_codeset( - State state, - int num, - const char **inbufptr, - int *from_left) -{ - int len; - int from_len = (*from_left) + 1; - const char *src = (*inbufptr) - 1; - ParseInfo *mb_parse_list = XLC_GENERIC(state->lcd, mb_parse_list); - ParseInfo parse_info; - CodeSet codeset; - - for (--num ; (parse_info = mb_parse_list[num]) != NULL; num++) { - len = compare(src, parse_info->encoding, from_len); - if (len > 0) { - codeset = parse_info->codeset; - if (parse_info->type == E_LSL) - state->GL_codeset = codeset; - else if (parse_info->type == E_LSR) - state->GR_codeset = codeset; - --len; - *inbufptr += len; - *from_left -= len; - return codeset; - } - } - return (CodeSet) NULL; -} - -static CodeSet -byteM_parse_codeset( - XLCd lcd, - const char *inbufptr) -{ - unsigned char ch; - CodeSet codeset; - ByteInfoList byteM; - ByteInfoListRec byteM_rec; - ByteInfo byteinfo; - ByteInfoRec byteinfo_rec; - Bool hit = False; - int i, j, k; - - int codeset_num = XLC_GENERIC(lcd, codeset_num); - CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); - - for (i = 0; i < codeset_num; i++) { - codeset = codeset_list[i]; - byteM = codeset->byteM; - if (codeset->side != XlcNONE || byteM == NULL) - continue; - - for (j = 0; j < codeset->length; j++) { - ch = *((unsigned char *)(inbufptr + j)); - byteM_rec = byteM[j]; - byteinfo = byteM_rec.byteinfo; - - for (hit = False, k = 0; k < byteM_rec.byteinfo_num; k++) { - byteinfo_rec = byteinfo[k]; - if (byteinfo_rec.start <= ch && ch <= byteinfo_rec.end) { - hit = True; - break; - } - } - - if (!hit) - break; - } - - if (hit) - return(codeset); - } - - return(NULL); -} - -#define GLGR_parse_codeset(ch) \ - (isrightside(ch) ? (state->GR_codeset) : \ - (state->GL_codeset) ) - -static XlcCharSet -gi_parse_charset( - unsigned long glyph_index, - CodeSet codeset) -{ - int i; - XlcCharSet *charset_list = codeset->charset_list; - int num_charsets = codeset->num_charsets; - ExtdSegment ctextseg = codeset->ctextseg; - XlcCharSet charset = NULL; - int area_num; - FontScope area; - - /* lockup ct sequence */ - for (i = 0; i < num_charsets; i++) { - charset = charset_list[i]; - if (*charset->ct_sequence != '\0') - break; - } - if (i >= num_charsets) - return(NULL); - - if (charset->source != CSsrcStd) - return (charset); - - if (!ctextseg) - return(charset); - - area = ctextseg->area; - area_num = ctextseg->area_num; - - for (i = 0; i < area_num; i++) { - - if (area[i].start <= glyph_index && glyph_index <= area[i].end) { - - charset = ctextseg->charset; - - if (*charset->ct_sequence == '\0') - return(NULL); - - break; - } - } - - return(charset); -} - -static Bool -ct_parse_csi( - const char *inbufptr, - int *ctr_seq_len) -{ - int i; - int num = sizeof(directionality_data) / sizeof(directionality_data[0]); - - for (i = 0; i < num; i++) { - if ( !(*ctr_seq_len = strlen(directionality_data[i].encoding)) ) - continue; - - if ( strncmp(inbufptr, directionality_data[i].encoding, - *ctr_seq_len) == 0) - return(True); - } - - return(False); -} - -static int -cmp_esc_sequence( - const char *inbufptr, - XlcCharSet charset) -{ - int seq_len, name_len, total_len; - unsigned char byte_m, byte_l; - const char *ct_sequence = charset->ct_sequence; - const char *encoding_name = charset->encoding_name; - - /* check esc sequence */ - if ( !(seq_len = strlen(ct_sequence) ) ) - return(0); - if ( strncmp(inbufptr, ct_sequence, seq_len) != 0) - return(0); - - /* Standard Character Set Encoding ? */ - if (charset->source == CSsrcStd) - return(seq_len); - - /* - * Non-Standard Character Set Encoding - * - * +--- ---+-----+-----+-----+---- ----+-----+-----+------- ------+ - * | ctseq | M | L | encoding name | STX | contents | - * +--- ---+-----+-----+-----+---- ----+-----+-----+------- ------+ - * 4bytes 1byte 1byte variable length 1byte variable length - * | | - * +----------------------------------------------+ - * rest length = ((M - 128) * 128) + (L - 128) - */ - - /* get length of encoding name */ - inbufptr += seq_len; - byte_m = *inbufptr++; - byte_l = *inbufptr++; - name_len = strlen(encoding_name); - - if (((byte_m - 128) * 128 + (byte_l - 128) - 1) < name_len) - return(0); - - if ( _XlcNCompareISOLatin1(inbufptr, encoding_name, name_len) != 0 ) - return(0); - - /* check STX (Start of Text) */ - inbufptr = inbufptr + name_len; - if ( *inbufptr != STX ) - return(0); - - total_len = seq_len + name_len + 3; - return(total_len); -} - -static Bool -ct_parse_charset( - XLCd lcd, - const char *inbufptr, - XlcCharSet *charset, - int *ctr_seq_len) -{ - int i, j; - ExtdSegment ctextseg; - int num_charsets; - XlcCharSet *charset_list; - CodeSet codeset; - int codeset_num = XLC_GENERIC(lcd, codeset_num); - CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); - int segment_conv_num = XLC_GENERIC(lcd, segment_conv_num); - SegConv segment_conv = XLC_GENERIC(lcd, segment_conv); - - /* get charset from XLC_XLOCALE by escape sequence */ - - for (i = 0; i < codeset_num; i++) { - codeset = codeset_list[i]; - - num_charsets = codeset->num_charsets; - charset_list = codeset->charset_list; - ctextseg = codeset->ctextseg; - - for (j = 0; j < num_charsets; j++) { - *charset = charset_list[j]; - if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) - return(True); - } - - if (ctextseg) { - *charset = ctextseg->charset; - if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) - return(True); - } - } - - /* get charset from XLC_SEGMENTCONVERSION by escape sequence */ - - if (!segment_conv) - return(False); - - for (i = 0; i < segment_conv_num; i++) { - *charset = segment_conv[i].source; - if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) - return(True); - *charset = segment_conv[i].dest; - if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset))) - return(True); - } - - return(False); -} - -static Bool -segment_conversion( - XLCd lcd, - XlcCharSet *charset, - unsigned long *glyph_index) -{ - int i; - int segment_conv_num = XLC_GENERIC(lcd, segment_conv_num); - SegConv segment_conv = XLC_GENERIC(lcd, segment_conv); - FontScopeRec range; - ConversionRec conv_rec; - - if (!segment_conv) - return(True); - - for (i = 0; i < segment_conv_num; i++) { - if (segment_conv[i].source == *charset) - break; - } - - if (i >= segment_conv_num) - return(True); - - range = segment_conv[i].range; - if (*glyph_index < range.start || range.end < *glyph_index) - return(True); - - *charset = segment_conv[i].dest; - conv_rec.conv_num = segment_conv[i].conv_num; - conv_rec.convlist = segment_conv[i].conv; - *glyph_index = conv_to_dest(&conv_rec, *glyph_index); - - return(True); -} - -static CodeSet -_XlcGetCodeSetFromName( - XLCd lcd, - const char *name) -{ - int i, j; - XlcCharSet charset; - int num_charsets; - XlcCharSet *charset_list; - CodeSet codeset; - - int codeset_num = XLC_GENERIC(lcd, codeset_num); - CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); - - for (i = 0; i < codeset_num; i++) { - codeset = codeset_list[i]; - - num_charsets = codeset->num_charsets; - charset_list = codeset->charset_list; - - for (j = 0; j < num_charsets; j++) { - charset = charset_list[j]; - - if (!strlen(charset->name)) - continue; - if ( strcmp(charset->name, name) == 0) - return(codeset); - } - } - - return(NULL); -} - -static Bool -_XlcGetCodeSetFromCharSet( - XLCd lcd, - XlcCharSet charset, - CodeSet *codeset, - unsigned long *glyph_index) -{ - int j, num; - CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list); - XlcCharSet *charset_list; - int codeset_num, num_charsets; - Conversion ctconv; - unsigned long glyph_index_tmp = 0; - ExtdSegment ctextseg; - - codeset_num = XLC_GENERIC(lcd, codeset_num); - - for (num = 0 ; num < codeset_num; num++) { - *codeset = codeset_list[num]; - ctconv = (*codeset)->ctconv; - ctextseg = (*codeset)->ctextseg; - - num_charsets = (*codeset)->num_charsets; - charset_list = (*codeset)->charset_list; - - glyph_index_tmp = conv_to_source(ctconv, *glyph_index); - - if (charset->source == CSsrcStd) { - - /* Standard Character Set Encoding */ - if (glyph_index_tmp == *glyph_index) { - for (j = 0; j < num_charsets; j++) { - if (charset_list[j] == charset) { - goto end_loop; - } - } - } - - } else { - - /* Non-Standard Character Set Encoding */ - for (j = 0; j < num_charsets; j++) { - if (charset_list[j] == charset) { - goto end_loop; - } - } - - if (glyph_index_tmp != *glyph_index) { - if (ctextseg && ctextseg->charset == charset) { - goto end_loop; - } - } - - } - - } - -end_loop: - if (num < codeset_num) { - *glyph_index = glyph_index_tmp; - return(True); - } - - return(False); -} - -#define check_string_encoding(codeset) (codeset->string_encoding) - -static void -output_ulong_value( - char *outbufptr, - unsigned long code, - int length, - XlcSide side) -{ - int i; - - for (i = (length - 1) * 8; i >= 0; i -= 8) { - *outbufptr = ( code >> i) & 0xff; - - if (side == XlcC0 || side == XlcGL) { - *outbufptr = *outbufptr & GL; - } else if (side == XlcC1 || side == XlcGR) { - *outbufptr = *outbufptr | GR; - } - - outbufptr++; - } -} - -/* -------------------------------------------------------------------------- */ -/* Init */ -/* -------------------------------------------------------------------------- */ - -static XlcCharSet default_GL_charset = 0; -static XlcCharSet default_GR_charset = 0; - -static void -init_state( - XlcConv conv) -{ - State state = (State) conv->state; - - /* for CT */ - state->charset = NULL; - state->GL_charset = default_GL_charset; - state->GR_charset = default_GR_charset; - - /* for MB shift state */ - state->GL_codeset = XLC_GENERIC(state->lcd, initial_state_GL); - state->GR_codeset = XLC_GENERIC(state->lcd, initial_state_GR); -} - -/* -------------------------------------------------------------------------- */ -/* Convert */ -/* -------------------------------------------------------------------------- */ - -static int -mbstowcs_org( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - unsigned char ch; - unsigned long mb = 0; - wchar_t wc; - - int length = 0, len_left = 0; - int unconv_num = 0; - int num; - - CodeSet codeset = NULL; - - const char *inbufptr = *from; - wchar_t *outbufptr = (wchar_t *) *to; - int from_size = *from_left; - - unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table); - - if (from == NULL || *from == NULL) { - _XlcResetConverter(conv); - return( 0 ); - } - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - ch = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!ch) { - if (outbufptr) {*outbufptr++ = L'\0';} - (*to_left)--; - - /* error check */ - if (len_left) { - unconv_num += (length - len_left); - len_left = 0; - } - - continue; - } - - /* same mb char data */ - if (len_left) - goto output_one_wc; - - /* next mb char data for single shift ? */ - if (mb_parse_table && (num = mb_parse_table[ch]) ) { - codeset = mb_parse_codeset(state, num, &inbufptr, from_left); - if (codeset != NULL) { - length = len_left = codeset->length; - mb = 0; - continue; - } - } - - /* next mb char data for byteM ? */ - if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1)))) - goto next_mb_char; - - /* next mb char data for GL or GR side ? */ - if ((codeset = GLGR_parse_codeset(ch))) - goto next_mb_char; - - /* can't find codeset for the ch */ - unconv_num++; - continue; - -next_mb_char: - length = len_left = codeset->length; - mb = 0; - -output_one_wc: - mb = (mb << 8) | ch; /* 1 byte left shift */ - len_left--; - - /* last of one mb char data */ - if (!len_left) { - gi_to_wc(lcd, mb_to_gi(mb, codeset), codeset, &wc); - if (outbufptr) {*outbufptr++ = wc;} - (*to_left)--; - } - - } /* end of while */ - - /* error check on last char */ - if (len_left) { - inbufptr -= (length - len_left); - (*from_left) += (length - len_left); - unconv_num += (length - len_left); - } - - *from = (XPointer) ((const char *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -stdc_mbstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - const char *src = *((const char **) from); - wchar_t *dst = *((wchar_t **) to); - int src_left = *from_left; - int dst_left = *to_left; - int length, unconv_num = 0; - - while (src_left > 0 && dst_left > 0) { - length = mbtowc(dst, src, src_left); - - if (length > 0) { - src += length; - src_left -= length; - if (dst) - dst++; - dst_left--; - } else if (length < 0) { - src++; - src_left--; - unconv_num++; - } else { - /* null ? */ - src++; - src_left--; - if (dst) - *dst++ = L'\0'; - dst_left--; - } - } - - *from = (XPointer) src; - if (dst) - *to = (XPointer) dst; - *from_left = src_left; - *to_left = dst_left; - - return unconv_num; -} - -static int -wcstombs_org( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - char *encoding; - unsigned long mb, glyph_index; - wchar_t wc; - - int length; - int unconv_num = 0; - - CodeSet codeset; - - const wchar_t *inbufptr = (const wchar_t *) *from; - char *outbufptr = *to; - int from_size = *from_left; - - const char *default_string = XLC_PUBLIC(lcd, default_string); - int defstr_len = strlen(default_string); - - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - wc = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!wc) { - if (outbufptr) {*outbufptr++ = '\0';} - (*to_left)--; - - continue; - } - - /* convert */ - if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { - - /* output default_string of XDefaultString() */ - if (*to_left < defstr_len) - break; - if (outbufptr) { - strncpy((char *)outbufptr, default_string, defstr_len); - outbufptr += defstr_len; - } - (*to_left) -= defstr_len; - - unconv_num++; - - } else { - mb = gi_to_mb(glyph_index, codeset); - if (codeset->parse_info) { - Bool need_shift = False; - switch (codeset->parse_info->type) { - case E_LSL : - if (codeset != state->GL_codeset) { - need_shift = True; - state->GL_codeset = codeset; - } - break; - case E_LSR : - if (codeset != state->GR_codeset) { - need_shift = True; - state->GR_codeset = codeset; - } - break; - /* case E_SS */ - default: - need_shift = True; - } - - /* output shift sequence */ - if (need_shift) { - encoding = codeset->parse_info->encoding; - length = strlen(encoding); - if (*to_left < length) - break; - if (outbufptr) { - strncpy((char *)outbufptr, encoding, length); - outbufptr += length; - } - (*to_left) -= length; - } - } - - /* output characters */ - length = codeset->length; - if (*to_left < length) - break; - - if (outbufptr) { - output_ulong_value(outbufptr, mb, length, XlcNONE); - outbufptr += length; - } - - (*to_left) -= length; - } - - } /* end of while */ - - *from = (XPointer) ((const wchar_t *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -stdc_wcstombs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - const wchar_t *src = *((const wchar_t **) from); - char *dst = *((char **) to); - int src_left = *from_left; - int dst_left = *to_left; - int length, unconv_num = 0; - - while (src_left > 0 && dst_left >= MB_CUR_MAX) { - length = wctomb(dst, *src); /* XXX */ - - if (length > 0) { - src++; - src_left--; - if (dst) - dst += length; - dst_left -= length; - } else if (length < 0) { - src++; - src_left--; - unconv_num++; - } - } - - *from = (XPointer) src; - if (dst) - *to = (XPointer) dst; - *from_left = src_left; - *to_left = dst_left; - - return unconv_num; -} - -static int -wcstocts( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - unsigned long glyph_index; - wchar_t wc; - - int total_len, seq_len, name_len; - int unconv_num = 0; - Bool first_flag = True, standard_flag; - XlcSide side; - - CodeSet codeset; - XlcCharSet charset, old_charset = NULL; - const char *ct_sequence; - - const wchar_t *inbufptr = (const wchar_t *) *from; - char *outbufptr = *to; - int from_size = *from_left; - char *ext_seg_len = NULL; - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - wc = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!wc) { - if (outbufptr) {*outbufptr++ = '\0';} - (*to_left)--; - - continue; - } - - /* convert */ - if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { - unconv_num++; - continue; - } - - /* parse charset */ - if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) { - unconv_num++; - continue; - } - - /* Standard Character Set Encoding ? */ - standard_flag = charset->source == CSsrcStd ? True : False; - - /* - * Non-Standard Character Set Encoding - * - * +-----+-----+-----+-----+-----+-----+-----+---- ----+-----+-----+ - * | esc sequence | M | L | encoding name | STX | - * +-----+-----+-----+-----+-----+-----+-----+---- ----+-----+-----+ - * 4bytes 1byte 1byte variable length 1byte - * | | - * +-----------------------------------------+ - * name length = ((M - 128) * 128) + (L - 128) - */ - - /* make encoding data */ - ct_sequence = charset->ct_sequence; - side = charset->side; - seq_len = strlen(ct_sequence); - if (standard_flag) { - name_len = 0; - total_len = seq_len; - } else { - name_len = strlen(charset->encoding_name) + 1; - total_len = seq_len + name_len + 2; - } - - /* output escape sequence of CT */ - if ( (charset != old_charset) && - !(first_flag && charset->string_encoding) ){ - - if ( (ext_seg_len != NULL) && outbufptr) { - int i = (outbufptr - ext_seg_len) - 2; - *ext_seg_len++ = i / 128 + 128; - *ext_seg_len = i % 128 + 128; - ext_seg_len = NULL; - } - - if (*to_left < total_len + 1) { - unconv_num++; - break; - } - - if (outbufptr) { - strcpy((char *)outbufptr, ct_sequence); - outbufptr += seq_len; - - if (!standard_flag) { - const char *i = charset->encoding_name; - ext_seg_len = outbufptr; - outbufptr += 2; - for (; *i ; i++) - *outbufptr++ = ((*i >= 'A') && (*i <= 'Z')) ? - *i - 'A' + 'a' : *i; - *outbufptr++ = STX; - } - } - - (*to_left) -= total_len; - - first_flag = False; - old_charset = charset; - } - - /* output glyph index */ - if (codeset->ctconv) - glyph_index = conv_to_dest(codeset->ctconv, glyph_index); - if (*to_left < charset->char_size) { - unconv_num++; - break; - } - - if (outbufptr) { - output_ulong_value(outbufptr, glyph_index, charset->char_size, side); - outbufptr += charset->char_size; - } - - (*to_left) -= charset->char_size; - - } /* end of while */ - - if ( (ext_seg_len != NULL) && outbufptr) { - int i = (outbufptr - ext_seg_len) - 2; - *ext_seg_len++ = i / 128 + 128; - *ext_seg_len = i % 128 + 128; - } - - *from = (XPointer) ((const wchar_t *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -stdc_wcstocts( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left) * MB_CUR_MAX; - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = stdc_wcstombs(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = buf_ptr1 - buf_ptr2; - - unconv_num2 = mbstocts(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -static int -ctstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - unsigned char ch; - unsigned long glyph_index = 0; - wchar_t wc; - - int ctr_seq_len = 0, gi_len_left = 0, gi_len = 0; - int unconv_num = 0; - - CodeSet codeset = NULL; - XlcCharSet charset_tmp; - - const char *inbufptr = *from; - wchar_t *outbufptr = (wchar_t *) *to; - int from_size = *from_left; - - _XlcResetConverter(conv); /* ??? */ - - if (from == NULL || *from == NULL) { - _XlcResetConverter(conv); - return( 0 ); - } - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - ch = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!ch) { - if (outbufptr) {*outbufptr++ = L'\0';} - (*to_left)--; - - /* error check */ - if (gi_len_left) { - unconv_num += (gi_len - gi_len_left); - gi_len_left = 0; - } - - continue; - } - - /* same glyph_index data */ - if (gi_len_left) - goto output_one_wc; - - /* control sequence ? */ - if (ch == CSI) { - if ( !ct_parse_csi(inbufptr - 1, &ctr_seq_len) ) - goto skip_the_seg; - - if (*from_left + 1 < ctr_seq_len) { - inbufptr--; - (*from_left)++; - unconv_num += *from_left; - break; - } - - /* skip the control sequence */ - inbufptr += (ctr_seq_len - 1); - *from_left -= (ctr_seq_len - 1); - - continue; - } - - /* escape sequence ? */ - if (ch == ESC) { - if ( !ct_parse_charset(lcd, - inbufptr - 1, &state->charset, &ctr_seq_len) ) - goto skip_the_seg; - - if (state->charset->side == XlcC0 || - state->charset->side == XlcGL) - { - state->GL_charset = state->charset; - } - else if (state->charset->side == XlcC1 || - state->charset->side == XlcGR) - { - state->GR_charset = state->charset; - } - else if (state->charset->side == XlcGLGR) - { - state->GL_charset = state->charset; - state->GR_charset = state->charset; - } - - if (*from_left + 1 < ctr_seq_len) { - inbufptr--; - (*from_left)++; - unconv_num += *from_left; - break; - } - - /* skip the escape sequence */ - inbufptr += (ctr_seq_len - 1); - *from_left -= (ctr_seq_len - 1); - - continue; - } - - /* check current state */ - if (isleftside(ch)) - state->charset = state->GL_charset; - else - state->charset = state->GR_charset; - - gi_len = gi_len_left = state->charset->char_size; - glyph_index = 0; - -output_one_wc: - if (state->charset->side == XlcC1 || state->charset->side == XlcGR) - glyph_index = (glyph_index << 8) | (ch & GL); - else - glyph_index = (glyph_index << 8) | ch; - - gi_len_left--; - - /* last of one glyph_index data */ - if (!gi_len_left) { - - /* segment conversion */ - charset_tmp = state->charset; - segment_conversion(lcd, &charset_tmp, &glyph_index); - - /* get codeset */ - if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp, - &codeset, &glyph_index) ) { - unconv_num += gi_len; - continue; - } - - /* convert glyph index to wicd char */ - gi_to_wc(lcd, glyph_index, codeset, &wc); - if (outbufptr) {*outbufptr++ = wc;} - (*to_left)--; - } - - continue; - -skip_the_seg: - /* skip until next escape or control sequence */ - while ( *from_left ) { - ch = *inbufptr++; - (*from_left)--; - unconv_num++; - - if (ch == ESC || ch == CSI) { - inbufptr--; - (*from_left)++; - unconv_num--; - break; - } - } - - if ( !(*from_left) ) - break; - - } /* end of while */ - - /* error check on last char */ - if (gi_len_left) { - inbufptr -= (gi_len - gi_len_left); - (*from_left) += (gi_len - gi_len_left); - unconv_num += (gi_len - gi_len_left); - } - - *from = (XPointer) ((const char *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -cstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - unsigned char ch; - unsigned long glyph_index = 0; - wchar_t wc; - int gi_len_left = 0, gi_len = 0; - - int unconv_num = 0; - - CodeSet codeset = NULL; - XlcCharSet charset, charset_tmp; - - const char *inbufptr = *from; - wchar_t *outbufptr = (wchar_t *) *to; - int from_size = *from_left; - - if (from == NULL || *from == NULL) { - return( 0 ); - } - - charset = (XlcCharSet) args[0]; - - while (*from_left && *to_left) { - - if (!gi_len_left) { - gi_len_left = gi_len = charset->char_size; - glyph_index = 0; - } - - ch = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!ch) { - if (outbufptr) {*outbufptr++ = L'\0';} - (*to_left)--; - - /* error check */ - if (gi_len_left) { - unconv_num += (gi_len - gi_len_left); - gi_len_left = 0; - } - continue; - } - - if (charset->side == XlcC1 || charset->side == XlcGR) - glyph_index = (glyph_index << 8) | (ch & GL); - else - glyph_index = (glyph_index << 8) | ch; - - gi_len_left--; - - /* last of one glyph_index data */ - if (!gi_len_left) { - - /* segment conversion */ - charset_tmp = charset; - segment_conversion(lcd, &charset_tmp, &glyph_index); - - /* get codeset */ - if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp, - &codeset, &glyph_index) ) { - unconv_num += gi_len; - continue; - } - - /* convert glyph index to wicd char */ - gi_to_wc(lcd, glyph_index, codeset, &wc); - if (outbufptr) {*outbufptr++ = wc;} - (*to_left)--; - } - - } /* end of while */ - - /* error check on last char */ - if (gi_len_left) { - inbufptr -= (gi_len - gi_len_left); - (*from_left) += (gi_len - gi_len_left); - unconv_num += (gi_len - gi_len_left); - } - - *from = (XPointer) ((const char *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -stdc_ctstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left) * MB_CUR_MAX; - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = ctstombs(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = buf_ptr1 - buf_ptr2; - - unconv_num2 = stdc_mbstowcs(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -static int -stdc_cstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left) * MB_CUR_MAX; - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = cstombs(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = buf_ptr1 - buf_ptr2; - - unconv_num2 = stdc_mbstowcs(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -static int -mbstocts( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left); - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = mbstowcs_org(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); - - unconv_num2 += wcstocts(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -static int -mbstostr( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - unsigned char ch; - unsigned long mb = 0; - - int length = 0, len_left = 0; - int unconv_num = 0; - int num; - - CodeSet codeset = NULL; - - const char *inbufptr = *from; - char *outbufptr = *to; - int from_size = *from_left; - - unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table); - - if (from == NULL || *from == NULL) { - _XlcResetConverter(conv); - return( 0 ); - } - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - ch = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!ch) { - if (outbufptr) {*outbufptr++ = '\0';} - (*to_left)--; - - /* error check */ - if (len_left) { - unconv_num += (length - len_left); - len_left = 0; - } - - continue; - } - - /* same mb char data */ - if (len_left) - goto output_one_mb; - - /* next mb char data for single shift ? */ - if (mb_parse_table && (num = mb_parse_table[ch]) ) { - codeset = mb_parse_codeset(state, num, &inbufptr, from_left); - if (codeset != NULL) { - length = len_left = codeset->length; - mb = 0; - continue; - } - } - - /* next char data : byteM ? */ - if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1)))) - goto next_mb_char; - - /* next char data : GL or GR side ? */ - if ((codeset = GLGR_parse_codeset(ch))) - goto next_mb_char; - - /* can't find codeset for the ch */ - unconv_num++; - continue; - -next_mb_char: - length = len_left = codeset->length; - mb = 0; - -output_one_mb: - mb = (mb << 8) | ch; /* 1 byte left shift */ - len_left--; - - /* last of one mb char data */ - if (!len_left) { - if (check_string_encoding(codeset)) { - if (outbufptr) {*outbufptr++ = mb & 0xff;} - (*to_left)--; - } else { - unconv_num++; - } - } - - } /* end of while */ - - /* error check on last char */ - if (len_left) { - inbufptr -= (length - len_left); - (*from_left) += (length - len_left); - unconv_num += (length - len_left); - } - - *from = (XPointer) ((const char *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -mbtocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - unsigned char ch; - unsigned long mb = 0; - unsigned long glyph_index; - - int length = 0, len_left = 0, char_len; - int unconv_num = 0; - int num; - XlcSide side; - - CodeSet codeset = NULL; - XlcCharSet charset = NULL; - - const char *inbufptr = *from; - char *outbufptr = *to; - int from_size = *from_left; - - unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table); - - if (from == NULL || *from == NULL) { - _XlcResetConverter(conv); - return( 0 ); - } - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - ch = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!ch) { - unconv_num = 1; - if (len_left) - unconv_num += (length - len_left); - break; - } - - /* same mb char data */ - if (len_left) - goto output; - - /* next mb char data for single shift ? */ - if (mb_parse_table && (num = mb_parse_table[ch]) ) { - codeset = mb_parse_codeset(state, num, &inbufptr, from_left); - if (codeset != NULL) { - length = len_left = codeset->length; - mb = 0; - continue; - } - } - - /* next mb char data for byteM ? */ - if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1)))) - goto next_mb_char; - - /* next mb char data for GL or GR side ? */ - if ((codeset = GLGR_parse_codeset(ch))) - goto next_mb_char; - - /* can't find codeset for the ch */ - unconv_num = 1; - break; - -next_mb_char: - length = len_left = codeset->length; - mb = 0; - -output: - mb = (mb << 8) | ch; /* 1 byte left shift */ - len_left--; - - /* last of one mb char data */ - if (!len_left) { - glyph_index = mb_to_gi(mb, codeset); - if (!(charset = gi_parse_charset(glyph_index, codeset))) { - unconv_num = length; - break; - } - char_len = charset->char_size; - side = charset->side; - - /* output glyph index */ - if (codeset->ctconv) - glyph_index = conv_to_dest(codeset->ctconv, glyph_index); - if (*to_left < char_len) { - unconv_num = length; - break; - } - - if (outbufptr) { - output_ulong_value(outbufptr, glyph_index, char_len, side); - outbufptr += char_len; - } - - (*to_left) -= char_len; - - break; - } - - } /* end of while */ - - /* error end */ - if (unconv_num) { - *from = (XPointer) ((const char *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - return -1; - } - - /* nomal end */ - *from = (XPointer) inbufptr; - *to = (XPointer) outbufptr; - - if (num_args > 0) - *((XlcCharSet *) args[0]) = charset; - - return 0; -} - -static int -mbstocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - int ret; - XlcCharSet charset_old, charset = NULL; - XPointer tmp_args[1]; - - const char *inbufptr; - int in_left; - char *outbufptr; - int out_left; - tmp_args[0] = (XPointer) &charset; - - ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1); - charset_old = charset; - - while ( ret == 0 && *from_left && *to_left) { - inbufptr = *from; - in_left = *from_left; - outbufptr = *to; - out_left = *to_left; - ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1); - if (charset_old != charset) { - *from = (XPointer) inbufptr; - *from_left = in_left; - *to = (XPointer) outbufptr; - *to_left = out_left; - break; - } - } - - if (num_args > 0) - *((XlcCharSet *) args[0]) = charset_old; - - /* error end */ - if (ret != 0) - return( -1 ); - - return(0); -} - -static int -wcstostr( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - char *encoding; - unsigned long mb, glyph_index; - wchar_t wc; - - int length; - int unconv_num = 0; - - CodeSet codeset; - - const wchar_t *inbufptr = (const wchar_t *) *from; - char *outbufptr = *to; - int from_size = *from_left; - - const char *default_string = XLC_PUBLIC(lcd, default_string); - int defstr_len = strlen(default_string); - - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - wc = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!wc) { - if (outbufptr) {*outbufptr++ = '\0';} - (*to_left)--; - - continue; - } - - /* convert */ - if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { - - /* output default_string of XDefaultString() */ - if (*to_left < defstr_len) - break; - if (outbufptr) { - strncpy((char *)outbufptr, default_string, defstr_len); - outbufptr += defstr_len; - } - (*to_left) -= defstr_len; - - unconv_num++; - - } else { - mb = gi_to_mb(glyph_index, codeset); - - if (check_string_encoding(codeset)) { - if (codeset->parse_info) { - Bool need_shift = False; - switch (codeset->parse_info->type) { - case E_LSL : - if (codeset != state->GL_codeset) { - need_shift = True; - state->GL_codeset = codeset; - } - break; - case E_LSR : - if (codeset != state->GR_codeset) { - need_shift = True; - state->GR_codeset = codeset; - } - break; - /* case E_SS */ - default: - need_shift = True; - } - - /* output shift sequence */ - if (need_shift) { - encoding = codeset->parse_info->encoding; - length = strlen(encoding); - if (*to_left < length) - break; - - if (outbufptr) { - strncpy((char *)outbufptr, encoding, length); - outbufptr += length; - } - (*to_left) -= length; - } - } - - /* output characters */ - length = codeset->length; - if (*to_left < length) - break; - - if (outbufptr) { - output_ulong_value(outbufptr, mb, length, XlcNONE); - outbufptr += length; - } - - (*to_left) -= length; - } else { - unconv_num++; - } - } - - } /* end of while */ - - *from = (XPointer) ((const wchar_t *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -stdc_wcstostr( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left) * MB_CUR_MAX; - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = stdc_wcstombs(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = buf_ptr1 - buf_ptr2; - - unconv_num2 = mbstostr(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -static int -wctocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - wchar_t wc; - unsigned long glyph_index; - - int char_len; - int unconv_num = 0; - XlcSide side; - - CodeSet codeset; - XlcCharSet charset = NULL; - - const wchar_t *inbufptr = (const wchar_t *) *from; - char *outbufptr = *to; - int from_size = *from_left; - - if (*from_left > *to_left) - *from_left = *to_left; - - if (*from_left && *to_left) { - - wc = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!wc) { - unconv_num = 1; - goto end; - } - - /* convert */ - if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) { - unconv_num = 1; - goto end; - } - - if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) { - unconv_num = 1; - goto end; - } - char_len = charset->char_size; - side = charset->side; - - /* output glyph index */ - if (codeset->ctconv) - glyph_index = conv_to_dest(codeset->ctconv, glyph_index); - if (*to_left < char_len) { - unconv_num++; - goto end; - } - - if (outbufptr) { - output_ulong_value(outbufptr, glyph_index, char_len, side); - outbufptr += char_len; - } - - (*to_left) -= char_len; - - } - -end: - - /* error end */ - if (unconv_num) { - *from = (XPointer) ((const wchar_t *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - return -1; - } - - /* nomal end */ - *from = (XPointer) inbufptr; - *to = (XPointer) outbufptr; - - if (num_args > 0) - *((XlcCharSet *) args[0]) = charset; - - return 0; -} - -static int -stdc_wctocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - const wchar_t *src = *((const wchar_t **) from); - wchar_t wch; - XPointer tmp_from, save_from = *from; - char tmp[32]; - int length, ret, src_left = *from_left; - int from_size = *from_left; - - if (src_left > 0 && *to_left > 0) { - if ((wch = *src)) { - length = wctomb(tmp, wch); - } else { - goto end; - } - - if (length < 0) - goto end; - - tmp_from = (XPointer) tmp; - ret = mbtocs(conv, &tmp_from, &length, to, to_left, args, num_args); - if (ret < 0) - goto end; - - src++; - src_left--; - } - -end: - /* error end */ - if (save_from == (XPointer) src) { - *from = (XPointer) ((const wchar_t *) *from + from_size); - *from_left = 0; - return -1; - } - - /* nomal end */ - *from = (XPointer) src; - *from_left = src_left; - - return 0; -} - -static int -wcstocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - int ret; - XlcCharSet charset_old, charset = NULL; - XPointer tmp_args[1]; - - const wchar_t *inbufptr; - int in_left; - XPointer outbufptr; - int out_left; - tmp_args[0] = (XPointer) &charset; - - ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1); - charset_old = charset; - - while ( ret == 0 && *from_left && *to_left) { - inbufptr = (const wchar_t *) *from; - in_left = *from_left; - outbufptr = *to; - out_left = *to_left; - ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1); - if (charset_old != charset) { - *from = (XPointer) inbufptr; - *from_left = in_left; - *to = (XPointer) outbufptr; - *to_left = out_left; - break; - } - } - - if (num_args > 0) - *((XlcCharSet *) args[0]) = charset_old; - - /* error end */ - if (ret != 0) - return( -1 ); - - return(0); -} - -#ifdef STDCVT - -static int -stdc_wcstocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - int ret; - XlcCharSet charset_old, charset = NULL; - XPointer tmp_args[1]; - - const wchar_t *inbufptr; - int in_left; - XPointer outbufptr; - int out_left; - tmp_args[0] = (XPointer) &charset; - - ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1); - charset_old = charset; - - while ( ret == 0 && *from_left && *to_left ) { - inbufptr = (const wchar_t *) *from; - in_left = *from_left; - outbufptr = *to; - out_left = *to_left; - ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1); - if (charset_old != charset) { - *from = (XPointer) inbufptr; - *from_left = in_left; - *to = (XPointer) outbufptr; - *to_left = out_left; - break; - } - } - - if (num_args > 0) - *((XlcCharSet *) args[0]) = charset_old; - - /* error end */ - if (ret != 0) - return( -1 ); - - return(0); -} - -#endif - -static int -ctstombs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left); - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = ctstowcs(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); - - unconv_num2 += wcstombs_org(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -static int -cstombs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t)); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left); - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = cstowcs(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t); - - unconv_num2 += wcstombs_org(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -static int -strtombs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - char *encoding; - unsigned long mb, glyph_index; - unsigned char ch; - - int length; - int unconv_num = 0; - - CodeSet codeset; - - const char *inbufptr = *from; - char *outbufptr = *to; - int from_size = *from_left; - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - ch = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!ch) { - if (outbufptr) {*outbufptr++ = '\0';} - (*to_left)--; - - continue; - } - - /* convert */ - if (isleftside(ch)) { - glyph_index = ch; - codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL"); - } else { - glyph_index = ch & GL; - codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR"); - } - - if (!codeset) { - unconv_num++; - continue; - } - - mb = gi_to_mb(glyph_index, codeset); - if (codeset->parse_info) { - Bool need_shift = False; - switch (codeset->parse_info->type) { - case E_LSL : - if (codeset != state->GL_codeset) { - need_shift = True; - state->GL_codeset = codeset; - } - break; - case E_LSR : - if (codeset != state->GR_codeset) { - need_shift = True; - state->GR_codeset = codeset; - } - break; - /* case E_SS */ - default: - need_shift = True; - } - - /* output shift sequence */ - if (need_shift) { - encoding = codeset->parse_info->encoding; - length = strlen(encoding); - if (*to_left < length) - break; - if (outbufptr) { - strncpy((char *)outbufptr, encoding, length); - outbufptr += length; - } - (*to_left) -= length; - } - } - - /* output characters */ - length = codeset->length; - if (*to_left < length) - break; - - if (outbufptr) { - output_ulong_value(outbufptr, mb, length, XlcNONE); - outbufptr += length; - } - - (*to_left) -= length; - - } /* end of while */ - - *from = (XPointer) ((const char *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -strtowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - - unsigned char ch; - unsigned long glyph_index; - wchar_t wc; - - int unconv_num = 0; - CodeSet codeset; - - const char *inbufptr = *from; - wchar_t *outbufptr = (wchar_t *)*to; - int from_size = *from_left; - - if (*from_left > *to_left) - *from_left = *to_left; - - while (*from_left && *to_left) { - - ch = *inbufptr++; - (*from_left)--; - - /* null ? */ - if (!ch) { - if (outbufptr) {*outbufptr++ = L'\0';} - (*to_left)--; - - continue; - } - - /* convert */ - if (isleftside(ch)) { - glyph_index = ch; - codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL"); - } else { - glyph_index = ch & GL; - codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR"); - } - - if (!codeset) { - unconv_num++; - continue; - } - - gi_to_wc(lcd, glyph_index, codeset, &wc); - if (outbufptr) {*outbufptr++ = wc;} - (*to_left)--; - - } /* end of while */ - - *from = (XPointer) ((const char *) *from + from_size); - *from_left = 0; - *to = (XPointer) outbufptr; - - return unconv_num; -} - -static int -stdc_strtowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX); - char *buf_ptr1 = buf; - int buf_left1 = (*from_left) * MB_CUR_MAX; - char *buf_ptr2 = buf_ptr1; - int buf_left2; - int unconv_num1 = 0, unconv_num2 = 0; - - unconv_num1 = strtombs(conv, - from, from_left, &buf_ptr1, &buf_left1, args, num_args); - if (unconv_num1 < 0) - goto ret; - - buf_left2 = buf_ptr1 - buf_ptr2; - - unconv_num2 = stdc_mbstowcs(conv, - &buf_ptr2, &buf_left2, to, to_left, args, num_args); - if (unconv_num2 < 0) - goto ret; - -ret: - if (buf) - Xfree((char *)buf); - - return (unconv_num1 + unconv_num2); -} - -/* -------------------------------------------------------------------------- */ -/* Close */ -/* -------------------------------------------------------------------------- */ - -static void -close_converter( - XlcConv conv) -{ - if (conv->state) { - Xfree((char *) conv->state); - } - - if (conv->methods) { - Xfree((char *) conv->methods); - } - - Xfree((char *) conv); -} - -/* -------------------------------------------------------------------------- */ -/* Open */ -/* -------------------------------------------------------------------------- */ - -static XlcConv -create_conv( - XLCd lcd, - XlcConvMethods methods) -{ - XlcConv conv; - State state; - - conv = (XlcConv) Xcalloc(1, sizeof(XlcConvRec)); - if (conv == NULL) - return (XlcConv) NULL; - - conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec)); - if (conv->methods == NULL) - goto err; - *conv->methods = *methods; - conv->methods->reset = init_state; - - conv->state = (XPointer) Xmalloc(sizeof(StateRec)); - if (conv->state == NULL) - goto err; - bzero((char *) conv->state, sizeof(StateRec)); - - state = (State) conv->state; - state->lcd = lcd; - - _XlcResetConverter(conv); - - return conv; - -err: - close_converter(conv); - - return (XlcConv) NULL; -} - -static XlcConvMethodsRec mbstocts_methods = { - close_converter, - mbstocts, - NULL -}; - -static XlcConv -open_mbstocts( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &mbstocts_methods); -} - -static XlcConvMethodsRec mbstostr_methods = { - close_converter, - mbstostr, - NULL -}; - -static XlcConv -open_mbstostr( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &mbstostr_methods); -} - -static XlcConvMethodsRec mbstocs_methods = { - close_converter, - mbstocs, - NULL -}; - -static XlcConv -open_mbstocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &mbstocs_methods); -} - -static XlcConvMethodsRec mbtocs_methods = { - close_converter, - mbtocs, - NULL -}; - -static XlcConv -open_mbtocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &mbtocs_methods); -} - -static XlcConvMethodsRec ctstombs_methods = { - close_converter, - ctstombs, - NULL -}; - -static XlcConv -open_ctstombs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &ctstombs_methods); -} - -static XlcConvMethodsRec cstombs_methods = { - close_converter, - cstombs, - NULL -}; - -static XlcConv -open_cstombs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &cstombs_methods); -} - -static XlcConvMethodsRec strtombs_methods = { - close_converter, - strtombs, - NULL -}; - -static XlcConv -open_strtombs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &strtombs_methods); -} - -#ifdef STDCVT - -static XlcConvMethodsRec stdc_mbstowcs_methods = { - close_converter, - stdc_mbstowcs, - NULL -}; - -static XlcConv -open_stdc_mbstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_mbstowcs_methods); -} - -static XlcConvMethodsRec stdc_wcstombs_methods = { - close_converter, - stdc_wcstombs, - NULL -}; - -static XlcConv -open_stdc_wcstombs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_wcstombs_methods); -} - -static XlcConvMethodsRec stdc_wcstocts_methods = { - close_converter, - stdc_wcstocts, - NULL -}; - -static XlcConv -open_stdc_wcstocts( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_wcstocts_methods); -} - -static XlcConvMethodsRec stdc_wcstostr_methods = { - close_converter, - stdc_wcstostr, - NULL -}; - -static XlcConv -open_stdc_wcstostr( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_wcstostr_methods); -} - -static XlcConvMethodsRec stdc_wcstocs_methods = { - close_converter, - stdc_wcstocs, - NULL -}; - -static XlcConv -open_stdc_wcstocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_wcstocs_methods); -} - -static XlcConvMethodsRec stdc_wctocs_methods = { - close_converter, - stdc_wctocs, - NULL -}; - -static XlcConv -open_stdc_wctocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_wctocs_methods); -} - -static XlcConvMethodsRec stdc_ctstowcs_methods = { - close_converter, - stdc_ctstowcs, - NULL -}; - -static XlcConv -open_stdc_ctstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_ctstowcs_methods); -} - -static XlcConvMethodsRec stdc_cstowcs_methods = { - close_converter, - stdc_cstowcs, - NULL -}; - -static XlcConv -open_stdc_cstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_cstowcs_methods); -} - -static XlcConvMethodsRec stdc_strtowcs_methods = { - close_converter, - stdc_strtowcs, - NULL -}; - -static XlcConv -open_stdc_strtowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_strtowcs_methods); -} - -#endif /* STDCVT */ - -static XlcConvMethodsRec mbstowcs_methods = { - close_converter, - mbstowcs_org, - NULL -}; - -static XlcConv -open_mbstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &mbstowcs_methods); -} - -static XlcConvMethodsRec wcstombs_methods = { - close_converter, - wcstombs_org, - NULL -}; - -static XlcConv -open_wcstombs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &wcstombs_methods); -} - -static XlcConvMethodsRec wcstocts_methods = { - close_converter, - wcstocts, - NULL -}; - -static XlcConv -open_wcstocts( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &wcstocts_methods); -} - -static XlcConvMethodsRec wcstostr_methods = { - close_converter, - wcstostr, - NULL -}; - -static XlcConv -open_wcstostr( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &wcstostr_methods); -} - -static XlcConvMethodsRec wcstocs_methods = { - close_converter, - wcstocs, - NULL -}; - -static XlcConv -open_wcstocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &wcstocs_methods); -} - -static XlcConvMethodsRec wctocs_methods = { - close_converter, - wctocs, - NULL -}; - -static XlcConv -open_wctocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &wctocs_methods); -} - -static XlcConvMethodsRec ctstowcs_methods = { - close_converter, - ctstowcs, - NULL -}; - -static XlcConv -open_ctstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &ctstowcs_methods); -} - -static XlcConvMethodsRec cstowcs_methods = { - close_converter, - cstowcs, - NULL -}; - -static XlcConv -open_cstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &cstowcs_methods); -} - -static XlcConvMethodsRec strtowcs_methods = { - close_converter, - strtowcs, - NULL -}; - -static XlcConv -open_strtowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &strtowcs_methods); -} - -/* -------------------------------------------------------------------------- */ -/* Loader */ -/* -------------------------------------------------------------------------- */ - -XLCd -_XlcGenericLoader( - const char *name) -{ - XLCd lcd; -#ifdef STDCVT - XLCdGenericPart *gen; -#endif - - lcd = _XlcCreateLC(name, _XlcGenericMethods); - - if (lcd == NULL) - return lcd; - - default_GL_charset = _XlcGetCharSet("ISO8859-1:GL"); - default_GR_charset = _XlcGetCharSet("ISO8859-1:GR"); - - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts); - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_mbstostr); - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs); - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs); - _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs); - _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_strtombs); - _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs); - -#ifdef STDCVT - gen = XLC_GENERIC_PART(lcd); - - if (gen->use_stdc_env != True) { -#endif - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wctocs); - _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs); - _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs); - _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs); -#ifdef STDCVT - } -#endif - -#ifdef STDCVT - if (gen->use_stdc_env == True) { - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_stdc_mbstowcs); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_stdc_wcstombs); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_stdc_wcstocts); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_stdc_wcstostr); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_stdc_wcstocs); - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_stdc_wctocs); - _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_stdc_ctstowcs); - _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_stdc_strtowcs); - _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_stdc_cstowcs); - } -#endif - - _XlcAddUtf8Converters(lcd); - - return lcd; -} +/*
+ * 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.
+ *
+ * Modifier: Masayoshi Shimamura FUJITSU LIMITED
+ *
+ */
+/*
+ * 2000
+ * Modifier: Ivan Pascal The XFree86 Project
+ */
+
+/*
+ * A generic locale loader for all kinds of ISO-2022 based codesets.
+ * Supports: all locales.
+ * How: Provides generic converters for ISO-2022 based codesets. Extensible as
+ * far as ISO-2022 is extensible: codesets can be given by name in the
+ * stream. Overall distinction between GL (0x00..0x7f) and GR (0x80..0xff).
+ * In every chunk between escape sequences, the number of bytes per
+ * character (char_size) is constant.
+ * Platforms: all systems.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+#include <stdio.h>
+
+#if !defined(Lynx_22) && !defined(X_LOCALE)
+#define STDCVT
+#endif
+
+typedef struct _CTDataRec {
+ const char *name;
+ const char *encoding; /* Compound Text encoding */
+} CTDataRec, *CTData;
+
+static CTDataRec directionality_data[] =
+{
+ { "BEGIN_LEFT-TO-RIGHT_TEXT", "\2331]" },
+ { "BEGIN_RIGHT-TO-LEFT_TEXT", "\2332]" },
+ { "END_OF_STRING", "\233]" },
+};
+
+typedef struct _StateRec {
+ XLCd lcd;
+ /* CT state */
+ XlcCharSet charset; /* charset of current state */
+ XlcCharSet GL_charset; /* charset of initial state in GL */
+ XlcCharSet GR_charset; /* charset of initial state in GR */
+ /* MB shift state */
+ CodeSet GL_codeset;
+ CodeSet GR_codeset;
+} StateRec, *State;
+
+#define GR 0x80 /* begins right-side (non-ascii) region */
+#define GL 0x7f /* ends left-side (ascii) region */
+#define ESC 0x1b
+#define CSI 0x9b
+#define STX 0x02
+
+#define isrightside(c) ((c) & GR)
+#define isleftside(c) (!isrightside(c))
+
+/* Forward declarations for local routines. */
+static int mbstocts (XlcConv conv, XPointer *from, int *from_left,
+ XPointer *to, int *to_left, XPointer *args, int num_args);
+static int ctstombs (XlcConv conv, XPointer *from, int *from_left,
+ XPointer *to, int *to_left, XPointer *args, int num_args);
+static int cstombs (XlcConv conv, XPointer *from, int *from_left,
+ XPointer *to, int *to_left, XPointer *args, int num_args);
+
+/* ------------------------------------------------------------------------- */
+/* Misc */
+/* ------------------------------------------------------------------------- */
+
+static int
+compare(
+ const char *src,
+ const char *encoding,
+ int length)
+{
+ const char *start = src;
+
+ while (length-- > 0) {
+ if (*src++ != *encoding++)
+ return 0;
+ if (*encoding == '\0')
+ return src - start;
+ }
+
+ return 0;
+}
+
+static unsigned long
+conv_to_dest(
+ Conversion conv,
+ unsigned long code)
+{
+ int i;
+ int conv_num = conv->conv_num;
+ FontScope convlist = conv->convlist;
+
+ for (i = 0; i < conv_num; i++) {
+ if (convlist[i].start <= code && code <= convlist[i].end) {
+ switch (convlist[i].shift_direction) {
+ case '+':
+ return(code + convlist[i].shift);
+ case '-':
+ return(code - convlist[i].shift);
+ default:
+ return(code);
+ }
+ }
+ }
+
+ return(code);
+}
+
+static unsigned long
+conv_to_source(
+ Conversion conv,
+ unsigned long code)
+{
+ int i;
+ int conv_num;
+ FontScope convlist;
+ unsigned long start_p;
+ unsigned long start_m;
+ unsigned long end_p;
+ unsigned long end_m;
+
+ if (!conv)
+ return(code);
+
+ conv_num = conv->conv_num;
+ convlist = conv->convlist;
+
+ for (i = 0; i < conv_num; i++) {
+ switch (convlist[i].shift_direction) {
+ case '+':
+ start_p = convlist[i].start + convlist[i].shift;
+ end_p = convlist[i].end + convlist[i].shift;
+ if (start_p <= code && code <= end_p)
+ return(code - convlist[i].shift);
+ break;
+ case '-':
+ start_m = convlist[i].start - convlist[i].shift;
+ end_m = convlist[i].end - convlist[i].shift;
+ if (start_m <= code && code <= end_m)
+ return(code + convlist[i].shift);
+ break;
+ default:
+ continue;
+ }
+ }
+
+ return(code);
+}
+
+static unsigned long
+mb_to_gi(
+ unsigned long mb,
+ CodeSet codeset)
+{
+ int i;
+ unsigned long mb_tmp, mask = 0;
+
+ if (codeset->mbconv) {
+ mb_tmp = conv_to_dest(codeset->mbconv, mb);
+ if (mb_tmp != mb)
+ return(mb_tmp);
+ }
+
+ if (codeset->side == XlcC0 || codeset->side == XlcGL ||
+ codeset->side == XlcC1 || codeset->side == XlcGR) {
+
+ for (i = 0; i < codeset->length; i++)
+ mask = (mask << 8) | GL;
+ mb = mb & mask;
+ }
+
+ return(mb);
+}
+
+static unsigned long
+gi_to_mb(
+ unsigned long glyph_index,
+ CodeSet codeset)
+{
+ int i;
+ unsigned long mask = 0;
+
+ if (codeset->side == XlcC1 || codeset->side == XlcGR) {
+ for (i = 0; i < codeset->length; i++)
+ mask = (mask << 8) | GR;
+ glyph_index = glyph_index | mask;
+ }
+
+ if (codeset->mbconv)
+ return( conv_to_source(codeset->mbconv, glyph_index) );
+
+ return(glyph_index);
+}
+
+static Bool
+gi_to_wc(
+ XLCd lcd,
+ unsigned long glyph_index,
+ CodeSet codeset,
+ wchar_t *wc)
+{
+ unsigned char mask = 0;
+ unsigned long wc_encoding = codeset->wc_encoding;
+ int length = codeset->length;
+ unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+
+ mask = (1 << wc_shift_bits) - 1 ;
+
+ for (*wc = 0, length--; length >= 0; length--)
+ *wc = (*wc << wc_shift_bits) | ((glyph_index >> (length * 8 )) & mask);
+
+ *wc = *wc | wc_encoding;
+
+ return(True);
+}
+
+static Bool
+wc_to_gi(
+ XLCd lcd,
+ wchar_t wc,
+ unsigned long *glyph_index,
+ CodeSet *codeset)
+{
+ int i;
+ unsigned char mask = 0;
+ unsigned long wc_encoding;
+ unsigned long wc_encode_mask = XLC_GENERIC(lcd, wc_encode_mask);
+ unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+
+ wc_encoding = wc & wc_encode_mask;
+ for (*codeset = NULL, i = 0; i < codeset_num; i++) {
+ if (wc_encoding == codeset_list[i]->wc_encoding) {
+ *codeset = codeset_list[i];
+ break;
+ }
+ }
+ if (*codeset == NULL)
+ return(False);
+
+ mask = (1 << wc_shift_bits) - 1 ;
+
+ wc = wc & ~wc_encode_mask;
+ for (*glyph_index = 0, i = (*codeset)->length - 1; i >= 0; i--)
+ *glyph_index = (*glyph_index << 8) |
+ ( ((unsigned long)wc >> (i * wc_shift_bits)) & mask );
+
+ return(True);
+}
+
+static CodeSet
+mb_parse_codeset(
+ State state,
+ int num,
+ const char **inbufptr,
+ int *from_left)
+{
+ int len;
+ int from_len = (*from_left) + 1;
+ const char *src = (*inbufptr) - 1;
+ ParseInfo *mb_parse_list = XLC_GENERIC(state->lcd, mb_parse_list);
+ ParseInfo parse_info;
+ CodeSet codeset;
+
+ for (--num ; (parse_info = mb_parse_list[num]) != NULL; num++) {
+ len = compare(src, parse_info->encoding, from_len);
+ if (len > 0) {
+ codeset = parse_info->codeset;
+ if (parse_info->type == E_LSL)
+ state->GL_codeset = codeset;
+ else if (parse_info->type == E_LSR)
+ state->GR_codeset = codeset;
+ --len;
+ *inbufptr += len;
+ *from_left -= len;
+ return codeset;
+ }
+ }
+ return (CodeSet) NULL;
+}
+
+static CodeSet
+byteM_parse_codeset(
+ XLCd lcd,
+ const char *inbufptr)
+{
+ unsigned char ch;
+ CodeSet codeset;
+ ByteInfoList byteM;
+ ByteInfoListRec byteM_rec;
+ ByteInfo byteinfo;
+ ByteInfoRec byteinfo_rec;
+ Bool hit = False;
+ int i, j, k;
+
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+
+ for (i = 0; i < codeset_num; i++) {
+ codeset = codeset_list[i];
+ byteM = codeset->byteM;
+ if (codeset->side != XlcNONE || byteM == NULL)
+ continue;
+
+ for (j = 0; j < codeset->length; j++) {
+ ch = *((unsigned char *)(inbufptr + j));
+ byteM_rec = byteM[j];
+ byteinfo = byteM_rec.byteinfo;
+
+ for (hit = False, k = 0; k < byteM_rec.byteinfo_num; k++) {
+ byteinfo_rec = byteinfo[k];
+ if (byteinfo_rec.start <= ch && ch <= byteinfo_rec.end) {
+ hit = True;
+ break;
+ }
+ }
+
+ if (!hit)
+ break;
+ }
+
+ if (hit)
+ return(codeset);
+ }
+
+ return(NULL);
+}
+
+#define GLGR_parse_codeset(ch) \
+ (isrightside(ch) ? (state->GR_codeset) : \
+ (state->GL_codeset) )
+
+static XlcCharSet
+gi_parse_charset(
+ unsigned long glyph_index,
+ CodeSet codeset)
+{
+ int i;
+ XlcCharSet *charset_list = codeset->charset_list;
+ int num_charsets = codeset->num_charsets;
+ ExtdSegment ctextseg = codeset->ctextseg;
+ XlcCharSet charset = NULL;
+ int area_num;
+ FontScope area;
+
+ /* lockup ct sequence */
+ for (i = 0; i < num_charsets; i++) {
+ charset = charset_list[i];
+ if (*charset->ct_sequence != '\0')
+ break;
+ }
+ if (i >= num_charsets)
+ return(NULL);
+
+ if (charset->source != CSsrcStd)
+ return (charset);
+
+ if (!ctextseg)
+ return(charset);
+
+ area = ctextseg->area;
+ area_num = ctextseg->area_num;
+
+ for (i = 0; i < area_num; i++) {
+
+ if (area[i].start <= glyph_index && glyph_index <= area[i].end) {
+
+ charset = ctextseg->charset;
+
+ if (*charset->ct_sequence == '\0')
+ return(NULL);
+
+ break;
+ }
+ }
+
+ return(charset);
+}
+
+static Bool
+ct_parse_csi(
+ const char *inbufptr,
+ int *ctr_seq_len)
+{
+ int i;
+ int num = sizeof(directionality_data) / sizeof(directionality_data[0]);
+
+ for (i = 0; i < num; i++) {
+ if ( !(*ctr_seq_len = strlen(directionality_data[i].encoding)) )
+ continue;
+
+ if ( strncmp(inbufptr, directionality_data[i].encoding,
+ *ctr_seq_len) == 0)
+ return(True);
+ }
+
+ return(False);
+}
+
+static int
+cmp_esc_sequence(
+ const char *inbufptr,
+ XlcCharSet charset)
+{
+ int seq_len, name_len, total_len;
+ unsigned char byte_m, byte_l;
+ const char *ct_sequence = charset->ct_sequence;
+ const char *encoding_name = charset->encoding_name;
+
+ /* check esc sequence */
+ if ( !(seq_len = strlen(ct_sequence) ) )
+ return(0);
+ if ( strncmp(inbufptr, ct_sequence, seq_len) != 0)
+ return(0);
+
+ /* Standard Character Set Encoding ? */
+ if (charset->source == CSsrcStd)
+ return(seq_len);
+
+ /*
+ * Non-Standard Character Set Encoding
+ *
+ * +--- ---+-----+-----+-----+---- ----+-----+-----+------- ------+
+ * | ctseq | M | L | encoding name | STX | contents |
+ * +--- ---+-----+-----+-----+---- ----+-----+-----+------- ------+
+ * 4bytes 1byte 1byte variable length 1byte variable length
+ * | |
+ * +----------------------------------------------+
+ * rest length = ((M - 128) * 128) + (L - 128)
+ */
+
+ /* get length of encoding name */
+ inbufptr += seq_len;
+ byte_m = *inbufptr++;
+ byte_l = *inbufptr++;
+ name_len = strlen(encoding_name);
+
+ if (((byte_m - 128) * 128 + (byte_l - 128) - 1) < name_len)
+ return(0);
+
+ if ( _XlcNCompareISOLatin1(inbufptr, encoding_name, name_len) != 0 )
+ return(0);
+
+ /* check STX (Start of Text) */
+ inbufptr = inbufptr + name_len;
+ if ( *inbufptr != STX )
+ return(0);
+
+ total_len = seq_len + name_len + 3;
+ return(total_len);
+}
+
+static Bool
+ct_parse_charset(
+ XLCd lcd,
+ const char *inbufptr,
+ XlcCharSet *charset,
+ int *ctr_seq_len)
+{
+ int i, j;
+ ExtdSegment ctextseg;
+ int num_charsets;
+ XlcCharSet *charset_list;
+ CodeSet codeset;
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+ int segment_conv_num = XLC_GENERIC(lcd, segment_conv_num);
+ SegConv segment_conv = XLC_GENERIC(lcd, segment_conv);
+
+ /* get charset from XLC_XLOCALE by escape sequence */
+
+ for (i = 0; i < codeset_num; i++) {
+ codeset = codeset_list[i];
+
+ num_charsets = codeset->num_charsets;
+ charset_list = codeset->charset_list;
+ ctextseg = codeset->ctextseg;
+
+ for (j = 0; j < num_charsets; j++) {
+ *charset = charset_list[j];
+ if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+ return(True);
+ }
+
+ if (ctextseg) {
+ *charset = ctextseg->charset;
+ if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+ return(True);
+ }
+ }
+
+ /* get charset from XLC_SEGMENTCONVERSION by escape sequence */
+
+ if (!segment_conv)
+ return(False);
+
+ for (i = 0; i < segment_conv_num; i++) {
+ *charset = segment_conv[i].source;
+ if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+ return(True);
+ *charset = segment_conv[i].dest;
+ if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+ return(True);
+ }
+
+ return(False);
+}
+
+static Bool
+segment_conversion(
+ XLCd lcd,
+ XlcCharSet *charset,
+ unsigned long *glyph_index)
+{
+ int i;
+ int segment_conv_num = XLC_GENERIC(lcd, segment_conv_num);
+ SegConv segment_conv = XLC_GENERIC(lcd, segment_conv);
+ FontScopeRec range;
+ ConversionRec conv_rec;
+
+ if (!segment_conv)
+ return(True);
+
+ for (i = 0; i < segment_conv_num; i++) {
+ if (segment_conv[i].source == *charset)
+ break;
+ }
+
+ if (i >= segment_conv_num)
+ return(True);
+
+ range = segment_conv[i].range;
+ if (*glyph_index < range.start || range.end < *glyph_index)
+ return(True);
+
+ *charset = segment_conv[i].dest;
+ conv_rec.conv_num = segment_conv[i].conv_num;
+ conv_rec.convlist = segment_conv[i].conv;
+ *glyph_index = conv_to_dest(&conv_rec, *glyph_index);
+
+ return(True);
+}
+
+static CodeSet
+_XlcGetCodeSetFromName(
+ XLCd lcd,
+ const char *name)
+{
+ int i, j;
+ XlcCharSet charset;
+ int num_charsets;
+ XlcCharSet *charset_list;
+ CodeSet codeset;
+
+ int codeset_num = XLC_GENERIC(lcd, codeset_num);
+ CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+
+ for (i = 0; i < codeset_num; i++) {
+ codeset = codeset_list[i];
+
+ num_charsets = codeset->num_charsets;
+ charset_list = codeset->charset_list;
+
+ for (j = 0; j < num_charsets; j++) {
+ charset = charset_list[j];
+
+ if (!strlen(charset->name))
+ continue;
+ if ( strcmp(charset->name, name) == 0)
+ return(codeset);
+ }
+ }
+
+ return(NULL);
+}
+
+static Bool
+_XlcGetCodeSetFromCharSet(
+ XLCd lcd,
+ XlcCharSet charset,
+ CodeSet *codeset,
+ unsigned long *glyph_index)
+{
+ int j, num;
+ CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+ XlcCharSet *charset_list;
+ int codeset_num, num_charsets;
+ Conversion ctconv;
+ unsigned long glyph_index_tmp = 0;
+ ExtdSegment ctextseg;
+
+ codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+ for (num = 0 ; num < codeset_num; num++) {
+ *codeset = codeset_list[num];
+ ctconv = (*codeset)->ctconv;
+ ctextseg = (*codeset)->ctextseg;
+
+ num_charsets = (*codeset)->num_charsets;
+ charset_list = (*codeset)->charset_list;
+
+ glyph_index_tmp = conv_to_source(ctconv, *glyph_index);
+
+ if (charset->source == CSsrcStd) {
+
+ /* Standard Character Set Encoding */
+ if (glyph_index_tmp == *glyph_index) {
+ for (j = 0; j < num_charsets; j++) {
+ if (charset_list[j] == charset) {
+ goto end_loop;
+ }
+ }
+ }
+
+ } else {
+
+ /* Non-Standard Character Set Encoding */
+ for (j = 0; j < num_charsets; j++) {
+ if (charset_list[j] == charset) {
+ goto end_loop;
+ }
+ }
+
+ if (glyph_index_tmp != *glyph_index) {
+ if (ctextseg && ctextseg->charset == charset) {
+ goto end_loop;
+ }
+ }
+
+ }
+
+ }
+
+end_loop:
+ if (num < codeset_num) {
+ *glyph_index = glyph_index_tmp;
+ return(True);
+ }
+
+ return(False);
+}
+
+#define check_string_encoding(codeset) (codeset->string_encoding)
+
+static void
+output_ulong_value(
+ char *outbufptr,
+ unsigned long code,
+ int length,
+ XlcSide side)
+{
+ int i;
+
+ for (i = (length - 1) * 8; i >= 0; i -= 8) {
+ *outbufptr = ( code >> i) & 0xff;
+
+ if (side == XlcC0 || side == XlcGL) {
+ *outbufptr = *outbufptr & GL;
+ } else if (side == XlcC1 || side == XlcGR) {
+ *outbufptr = *outbufptr | GR;
+ }
+
+ outbufptr++;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+/* Init */
+/* -------------------------------------------------------------------------- */
+
+static XlcCharSet default_GL_charset = 0;
+static XlcCharSet default_GR_charset = 0;
+
+static void
+init_state(
+ XlcConv conv)
+{
+ State state = (State) conv->state;
+
+ /* for CT */
+ state->charset = NULL;
+ state->GL_charset = default_GL_charset;
+ state->GR_charset = default_GR_charset;
+
+ /* for MB shift state */
+ state->GL_codeset = XLC_GENERIC(state->lcd, initial_state_GL);
+ state->GR_codeset = XLC_GENERIC(state->lcd, initial_state_GR);
+}
+
+/* -------------------------------------------------------------------------- */
+/* Convert */
+/* -------------------------------------------------------------------------- */
+
+static int
+mbstowcs_org(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ unsigned char ch;
+ unsigned long mb = 0;
+ wchar_t wc;
+
+ int length = 0, len_left = 0;
+ int unconv_num = 0;
+ int num;
+
+ CodeSet codeset = NULL;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ int from_size = *from_left;
+
+ unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+
+ if (from == NULL || *from == NULL) {
+ _XlcResetConverter(conv);
+ return( 0 );
+ }
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ ch = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!ch) {
+ if (outbufptr) {*outbufptr++ = L'\0';}
+ (*to_left)--;
+
+ /* error check */
+ if (len_left) {
+ unconv_num += (length - len_left);
+ len_left = 0;
+ }
+
+ continue;
+ }
+
+ /* same mb char data */
+ if (len_left)
+ goto output_one_wc;
+
+ /* next mb char data for single shift ? */
+ if (mb_parse_table && (num = mb_parse_table[ch]) ) {
+ codeset = mb_parse_codeset(state, num, &inbufptr, from_left);
+ if (codeset != NULL) {
+ length = len_left = codeset->length;
+ mb = 0;
+ continue;
+ }
+ }
+
+ /* next mb char data for byteM ? */
+ if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1))))
+ goto next_mb_char;
+
+ /* next mb char data for GL or GR side ? */
+ if ((codeset = GLGR_parse_codeset(ch)))
+ goto next_mb_char;
+
+ /* can't find codeset for the ch */
+ unconv_num++;
+ continue;
+
+next_mb_char:
+ length = len_left = codeset->length;
+ mb = 0;
+
+output_one_wc:
+ mb = (mb << 8) | ch; /* 1 byte left shift */
+ len_left--;
+
+ /* last of one mb char data */
+ if (!len_left) {
+ gi_to_wc(lcd, mb_to_gi(mb, codeset), codeset, &wc);
+ if (outbufptr) {*outbufptr++ = wc;}
+ (*to_left)--;
+ }
+
+ } /* end of while */
+
+ /* error check on last char */
+ if (len_left) {
+ inbufptr -= (length - len_left);
+ (*from_left) += (length - len_left);
+ unconv_num += (length - len_left);
+ }
+
+ *from = (XPointer) ((const char *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+stdc_mbstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *src = *((const char **) from);
+ wchar_t *dst = *((wchar_t **) to);
+ int src_left = *from_left;
+ int dst_left = *to_left;
+ int length, unconv_num = 0;
+
+ while (src_left > 0 && dst_left > 0) {
+ length = mbtowc(dst, src, src_left);
+
+ if (length > 0) {
+ src += length;
+ src_left -= length;
+ if (dst)
+ dst++;
+ dst_left--;
+ } else if (length < 0) {
+ src++;
+ src_left--;
+ unconv_num++;
+ } else {
+ /* null ? */
+ src++;
+ src_left--;
+ if (dst)
+ *dst++ = L'\0';
+ dst_left--;
+ }
+ }
+
+ *from = (XPointer) src;
+ if (dst)
+ *to = (XPointer) dst;
+ *from_left = src_left;
+ *to_left = dst_left;
+
+ return unconv_num;
+}
+
+static int
+wcstombs_org(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ char *encoding;
+ unsigned long mb, glyph_index;
+ wchar_t wc;
+
+ int length;
+ int unconv_num = 0;
+
+ CodeSet codeset;
+
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *outbufptr = *to;
+ int from_size = *from_left;
+
+ const char *default_string = XLC_PUBLIC(lcd, default_string);
+ int defstr_len = strlen(default_string);
+
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ wc = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!wc) {
+ if (outbufptr) {*outbufptr++ = '\0';}
+ (*to_left)--;
+
+ continue;
+ }
+
+ /* convert */
+ if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+
+ /* output default_string of XDefaultString() */
+ if (*to_left < defstr_len)
+ break;
+ if (outbufptr) {
+ strncpy((char *)outbufptr, default_string, defstr_len);
+ outbufptr += defstr_len;
+ }
+ (*to_left) -= defstr_len;
+
+ unconv_num++;
+
+ } else {
+ mb = gi_to_mb(glyph_index, codeset);
+ if (codeset->parse_info) {
+ Bool need_shift = False;
+ switch (codeset->parse_info->type) {
+ case E_LSL :
+ if (codeset != state->GL_codeset) {
+ need_shift = True;
+ state->GL_codeset = codeset;
+ }
+ break;
+ case E_LSR :
+ if (codeset != state->GR_codeset) {
+ need_shift = True;
+ state->GR_codeset = codeset;
+ }
+ break;
+ /* case E_SS */
+ default:
+ need_shift = True;
+ }
+
+ /* output shift sequence */
+ if (need_shift) {
+ encoding = codeset->parse_info->encoding;
+ length = strlen(encoding);
+ if (*to_left < length)
+ break;
+ if (outbufptr) {
+ strncpy((char *)outbufptr, encoding, length);
+ outbufptr += length;
+ }
+ (*to_left) -= length;
+ }
+ }
+
+ /* output characters */
+ length = codeset->length;
+ if (*to_left < length)
+ break;
+
+ if (outbufptr) {
+ output_ulong_value(outbufptr, mb, length, XlcNONE);
+ outbufptr += length;
+ }
+
+ (*to_left) -= length;
+ }
+
+ } /* end of while */
+
+ *from = (XPointer) ((const wchar_t *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+stdc_wcstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *src = *((const wchar_t **) from);
+ char *dst = *((char **) to);
+ int src_left = *from_left;
+ int dst_left = *to_left;
+ int length, unconv_num = 0;
+
+ while (src_left > 0 && dst_left >= MB_CUR_MAX) {
+ length = wctomb(dst, *src); /* XXX */
+
+ if (length > 0) {
+ src++;
+ src_left--;
+ if (dst)
+ dst += length;
+ dst_left -= length;
+ } else if (length < 0) {
+ src++;
+ src_left--;
+ unconv_num++;
+ }
+ }
+
+ *from = (XPointer) src;
+ if (dst)
+ *to = (XPointer) dst;
+ *from_left = src_left;
+ *to_left = dst_left;
+
+ return unconv_num;
+}
+
+static int
+wcstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ unsigned long glyph_index;
+ wchar_t wc;
+
+ int total_len, seq_len, name_len;
+ int unconv_num = 0;
+ Bool first_flag = True, standard_flag;
+ XlcSide side;
+
+ CodeSet codeset;
+ XlcCharSet charset, old_charset = NULL;
+ const char *ct_sequence;
+
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *outbufptr = *to;
+ int from_size = *from_left;
+ char *ext_seg_len = NULL;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ wc = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!wc) {
+ if (outbufptr) {*outbufptr++ = '\0';}
+ (*to_left)--;
+
+ continue;
+ }
+
+ /* convert */
+ if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+ unconv_num++;
+ continue;
+ }
+
+ /* parse charset */
+ if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) {
+ unconv_num++;
+ continue;
+ }
+
+ /* Standard Character Set Encoding ? */
+ standard_flag = charset->source == CSsrcStd ? True : False;
+
+ /*
+ * Non-Standard Character Set Encoding
+ *
+ * +-----+-----+-----+-----+-----+-----+-----+---- ----+-----+-----+
+ * | esc sequence | M | L | encoding name | STX |
+ * +-----+-----+-----+-----+-----+-----+-----+---- ----+-----+-----+
+ * 4bytes 1byte 1byte variable length 1byte
+ * | |
+ * +-----------------------------------------+
+ * name length = ((M - 128) * 128) + (L - 128)
+ */
+
+ /* make encoding data */
+ ct_sequence = charset->ct_sequence;
+ side = charset->side;
+ seq_len = strlen(ct_sequence);
+ if (standard_flag) {
+ name_len = 0;
+ total_len = seq_len;
+ } else {
+ name_len = strlen(charset->encoding_name) + 1;
+ total_len = seq_len + name_len + 2;
+ }
+
+ /* output escape sequence of CT */
+ if ( (charset != old_charset) &&
+ !(first_flag && charset->string_encoding) ){
+
+ if ( (ext_seg_len != NULL) && outbufptr) {
+ int i = (outbufptr - ext_seg_len) - 2;
+ *ext_seg_len++ = i / 128 + 128;
+ *ext_seg_len = i % 128 + 128;
+ ext_seg_len = NULL;
+ }
+
+ if (*to_left < total_len + 1) {
+ unconv_num++;
+ break;
+ }
+
+ if (outbufptr) {
+ strcpy((char *)outbufptr, ct_sequence);
+ outbufptr += seq_len;
+
+ if (!standard_flag) {
+ const char *i = charset->encoding_name;
+ ext_seg_len = outbufptr;
+ outbufptr += 2;
+ for (; *i ; i++)
+ *outbufptr++ = ((*i >= 'A') && (*i <= 'Z')) ?
+ *i - 'A' + 'a' : *i;
+ *outbufptr++ = STX;
+ }
+ }
+
+ (*to_left) -= total_len;
+
+ first_flag = False;
+ old_charset = charset;
+ }
+
+ /* output glyph index */
+ if (codeset->ctconv)
+ glyph_index = conv_to_dest(codeset->ctconv, glyph_index);
+ if (*to_left < charset->char_size) {
+ unconv_num++;
+ break;
+ }
+
+ if (outbufptr) {
+ output_ulong_value(outbufptr, glyph_index, charset->char_size, side);
+ outbufptr += charset->char_size;
+ }
+
+ (*to_left) -= charset->char_size;
+
+ } /* end of while */
+
+ if ( (ext_seg_len != NULL) && outbufptr) {
+ int i = (outbufptr - ext_seg_len) - 2;
+ *ext_seg_len++ = i / 128 + 128;
+ *ext_seg_len = i % 128 + 128;
+ }
+
+ *from = (XPointer) ((const wchar_t *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+stdc_wcstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left) * MB_CUR_MAX;
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = stdc_wcstombs(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = buf_ptr1 - buf_ptr2;
+
+ unconv_num2 = mbstocts(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+static int
+ctstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ unsigned char ch;
+ unsigned long glyph_index = 0;
+ wchar_t wc;
+
+ int ctr_seq_len = 0, gi_len_left = 0, gi_len = 0;
+ int unconv_num = 0;
+
+ CodeSet codeset = NULL;
+ XlcCharSet charset_tmp;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ int from_size = *from_left;
+
+ _XlcResetConverter(conv); /* ??? */
+
+ if (from == NULL || *from == NULL) {
+ _XlcResetConverter(conv);
+ return( 0 );
+ }
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ ch = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!ch) {
+ if (outbufptr) {*outbufptr++ = L'\0';}
+ (*to_left)--;
+
+ /* error check */
+ if (gi_len_left) {
+ unconv_num += (gi_len - gi_len_left);
+ gi_len_left = 0;
+ }
+
+ continue;
+ }
+
+ /* same glyph_index data */
+ if (gi_len_left)
+ goto output_one_wc;
+
+ /* control sequence ? */
+ if (ch == CSI) {
+ if ( !ct_parse_csi(inbufptr - 1, &ctr_seq_len) )
+ goto skip_the_seg;
+
+ if (*from_left + 1 < ctr_seq_len) {
+ inbufptr--;
+ (*from_left)++;
+ unconv_num += *from_left;
+ break;
+ }
+
+ /* skip the control sequence */
+ inbufptr += (ctr_seq_len - 1);
+ *from_left -= (ctr_seq_len - 1);
+
+ continue;
+ }
+
+ /* escape sequence ? */
+ if (ch == ESC) {
+ if ( !ct_parse_charset(lcd,
+ inbufptr - 1, &state->charset, &ctr_seq_len) )
+ goto skip_the_seg;
+
+ if (state->charset->side == XlcC0 ||
+ state->charset->side == XlcGL)
+ {
+ state->GL_charset = state->charset;
+ }
+ else if (state->charset->side == XlcC1 ||
+ state->charset->side == XlcGR)
+ {
+ state->GR_charset = state->charset;
+ }
+ else if (state->charset->side == XlcGLGR)
+ {
+ state->GL_charset = state->charset;
+ state->GR_charset = state->charset;
+ }
+
+ if (*from_left + 1 < ctr_seq_len) {
+ inbufptr--;
+ (*from_left)++;
+ unconv_num += *from_left;
+ break;
+ }
+
+ /* skip the escape sequence */
+ inbufptr += (ctr_seq_len - 1);
+ *from_left -= (ctr_seq_len - 1);
+
+ continue;
+ }
+
+ /* check current state */
+ if (isleftside(ch))
+ state->charset = state->GL_charset;
+ else
+ state->charset = state->GR_charset;
+
+ gi_len = gi_len_left = state->charset->char_size;
+ glyph_index = 0;
+
+output_one_wc:
+ if (state->charset->side == XlcC1 || state->charset->side == XlcGR)
+ glyph_index = (glyph_index << 8) | (ch & GL);
+ else
+ glyph_index = (glyph_index << 8) | ch;
+
+ gi_len_left--;
+
+ /* last of one glyph_index data */
+ if (!gi_len_left) {
+
+ /* segment conversion */
+ charset_tmp = state->charset;
+ segment_conversion(lcd, &charset_tmp, &glyph_index);
+
+ /* get codeset */
+ if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp,
+ &codeset, &glyph_index) ) {
+ unconv_num += gi_len;
+ continue;
+ }
+
+ /* convert glyph index to wicd char */
+ gi_to_wc(lcd, glyph_index, codeset, &wc);
+ if (outbufptr) {*outbufptr++ = wc;}
+ (*to_left)--;
+ }
+
+ continue;
+
+skip_the_seg:
+ /* skip until next escape or control sequence */
+ while ( *from_left ) {
+ ch = *inbufptr++;
+ (*from_left)--;
+ unconv_num++;
+
+ if (ch == ESC || ch == CSI) {
+ inbufptr--;
+ (*from_left)++;
+ unconv_num--;
+ break;
+ }
+ }
+
+ if ( !(*from_left) )
+ break;
+
+ } /* end of while */
+
+ /* error check on last char */
+ if (gi_len_left) {
+ inbufptr -= (gi_len - gi_len_left);
+ (*from_left) += (gi_len - gi_len_left);
+ unconv_num += (gi_len - gi_len_left);
+ }
+
+ *from = (XPointer) ((const char *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ unsigned char ch;
+ unsigned long glyph_index = 0;
+ wchar_t wc;
+ int gi_len_left = 0, gi_len = 0;
+
+ int unconv_num = 0;
+
+ CodeSet codeset = NULL;
+ XlcCharSet charset, charset_tmp;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *) *to;
+ int from_size = *from_left;
+
+ if (from == NULL || *from == NULL) {
+ return( 0 );
+ }
+
+ charset = (XlcCharSet) args[0];
+
+ while (*from_left && *to_left) {
+
+ if (!gi_len_left) {
+ gi_len_left = gi_len = charset->char_size;
+ glyph_index = 0;
+ }
+
+ ch = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!ch) {
+ if (outbufptr) {*outbufptr++ = L'\0';}
+ (*to_left)--;
+
+ /* error check */
+ if (gi_len_left) {
+ unconv_num += (gi_len - gi_len_left);
+ gi_len_left = 0;
+ }
+ continue;
+ }
+
+ if (charset->side == XlcC1 || charset->side == XlcGR)
+ glyph_index = (glyph_index << 8) | (ch & GL);
+ else
+ glyph_index = (glyph_index << 8) | ch;
+
+ gi_len_left--;
+
+ /* last of one glyph_index data */
+ if (!gi_len_left) {
+
+ /* segment conversion */
+ charset_tmp = charset;
+ segment_conversion(lcd, &charset_tmp, &glyph_index);
+
+ /* get codeset */
+ if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp,
+ &codeset, &glyph_index) ) {
+ unconv_num += gi_len;
+ continue;
+ }
+
+ /* convert glyph index to wicd char */
+ gi_to_wc(lcd, glyph_index, codeset, &wc);
+ if (outbufptr) {*outbufptr++ = wc;}
+ (*to_left)--;
+ }
+
+ } /* end of while */
+
+ /* error check on last char */
+ if (gi_len_left) {
+ inbufptr -= (gi_len - gi_len_left);
+ (*from_left) += (gi_len - gi_len_left);
+ unconv_num += (gi_len - gi_len_left);
+ }
+
+ *from = (XPointer) ((const char *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+stdc_ctstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left) * MB_CUR_MAX;
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = ctstombs(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = buf_ptr1 - buf_ptr2;
+
+ unconv_num2 = stdc_mbstowcs(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+static int
+stdc_cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left) * MB_CUR_MAX;
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = cstombs(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = buf_ptr1 - buf_ptr2;
+
+ unconv_num2 = stdc_mbstowcs(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+static int
+mbstocts(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t));
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left);
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = mbstowcs_org(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t);
+
+ unconv_num2 += wcstocts(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+static int
+mbstostr(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ unsigned char ch;
+ unsigned long mb = 0;
+
+ int length = 0, len_left = 0;
+ int unconv_num = 0;
+ int num;
+
+ CodeSet codeset = NULL;
+
+ const char *inbufptr = *from;
+ char *outbufptr = *to;
+ int from_size = *from_left;
+
+ unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+
+ if (from == NULL || *from == NULL) {
+ _XlcResetConverter(conv);
+ return( 0 );
+ }
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ ch = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!ch) {
+ if (outbufptr) {*outbufptr++ = '\0';}
+ (*to_left)--;
+
+ /* error check */
+ if (len_left) {
+ unconv_num += (length - len_left);
+ len_left = 0;
+ }
+
+ continue;
+ }
+
+ /* same mb char data */
+ if (len_left)
+ goto output_one_mb;
+
+ /* next mb char data for single shift ? */
+ if (mb_parse_table && (num = mb_parse_table[ch]) ) {
+ codeset = mb_parse_codeset(state, num, &inbufptr, from_left);
+ if (codeset != NULL) {
+ length = len_left = codeset->length;
+ mb = 0;
+ continue;
+ }
+ }
+
+ /* next char data : byteM ? */
+ if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1))))
+ goto next_mb_char;
+
+ /* next char data : GL or GR side ? */
+ if ((codeset = GLGR_parse_codeset(ch)))
+ goto next_mb_char;
+
+ /* can't find codeset for the ch */
+ unconv_num++;
+ continue;
+
+next_mb_char:
+ length = len_left = codeset->length;
+ mb = 0;
+
+output_one_mb:
+ mb = (mb << 8) | ch; /* 1 byte left shift */
+ len_left--;
+
+ /* last of one mb char data */
+ if (!len_left) {
+ if (check_string_encoding(codeset)) {
+ if (outbufptr) {*outbufptr++ = mb & 0xff;}
+ (*to_left)--;
+ } else {
+ unconv_num++;
+ }
+ }
+
+ } /* end of while */
+
+ /* error check on last char */
+ if (len_left) {
+ inbufptr -= (length - len_left);
+ (*from_left) += (length - len_left);
+ unconv_num += (length - len_left);
+ }
+
+ *from = (XPointer) ((const char *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+mbtocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ unsigned char ch;
+ unsigned long mb = 0;
+ unsigned long glyph_index;
+
+ int length = 0, len_left = 0, char_len;
+ int unconv_num = 0;
+ int num;
+ XlcSide side;
+
+ CodeSet codeset = NULL;
+ XlcCharSet charset = NULL;
+
+ const char *inbufptr = *from;
+ char *outbufptr = *to;
+ int from_size = *from_left;
+
+ unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+
+ if (from == NULL || *from == NULL) {
+ _XlcResetConverter(conv);
+ return( 0 );
+ }
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ ch = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!ch) {
+ unconv_num = 1;
+ if (len_left)
+ unconv_num += (length - len_left);
+ break;
+ }
+
+ /* same mb char data */
+ if (len_left)
+ goto output;
+
+ /* next mb char data for single shift ? */
+ if (mb_parse_table && (num = mb_parse_table[ch]) ) {
+ codeset = mb_parse_codeset(state, num, &inbufptr, from_left);
+ if (codeset != NULL) {
+ length = len_left = codeset->length;
+ mb = 0;
+ continue;
+ }
+ }
+
+ /* next mb char data for byteM ? */
+ if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1))))
+ goto next_mb_char;
+
+ /* next mb char data for GL or GR side ? */
+ if ((codeset = GLGR_parse_codeset(ch)))
+ goto next_mb_char;
+
+ /* can't find codeset for the ch */
+ unconv_num = 1;
+ break;
+
+next_mb_char:
+ length = len_left = codeset->length;
+ mb = 0;
+
+output:
+ mb = (mb << 8) | ch; /* 1 byte left shift */
+ len_left--;
+
+ /* last of one mb char data */
+ if (!len_left) {
+ glyph_index = mb_to_gi(mb, codeset);
+ if (!(charset = gi_parse_charset(glyph_index, codeset))) {
+ unconv_num = length;
+ break;
+ }
+ char_len = charset->char_size;
+ side = charset->side;
+
+ /* output glyph index */
+ if (codeset->ctconv)
+ glyph_index = conv_to_dest(codeset->ctconv, glyph_index);
+ if (*to_left < char_len) {
+ unconv_num = length;
+ break;
+ }
+
+ if (outbufptr) {
+ output_ulong_value(outbufptr, glyph_index, char_len, side);
+ outbufptr += char_len;
+ }
+
+ (*to_left) -= char_len;
+
+ break;
+ }
+
+ } /* end of while */
+
+ /* error end */
+ if (unconv_num) {
+ *from = (XPointer) ((const char *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+ return -1;
+ }
+
+ /* nomal end */
+ *from = (XPointer) inbufptr;
+ *to = (XPointer) outbufptr;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return 0;
+}
+
+static int
+mbstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ret;
+ XlcCharSet charset_old, charset = NULL;
+ XPointer tmp_args[1];
+
+ const char *inbufptr;
+ int in_left;
+ char *outbufptr;
+ int out_left;
+ tmp_args[0] = (XPointer) &charset;
+
+ ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1);
+ charset_old = charset;
+
+ while ( ret == 0 && *from_left && *to_left) {
+ inbufptr = *from;
+ in_left = *from_left;
+ outbufptr = *to;
+ out_left = *to_left;
+ ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1);
+ if (charset_old != charset) {
+ *from = (XPointer) inbufptr;
+ *from_left = in_left;
+ *to = (XPointer) outbufptr;
+ *to_left = out_left;
+ break;
+ }
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset_old;
+
+ /* error end */
+ if (ret != 0)
+ return( -1 );
+
+ return(0);
+}
+
+static int
+wcstostr(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ char *encoding;
+ unsigned long mb, glyph_index;
+ wchar_t wc;
+
+ int length;
+ int unconv_num = 0;
+
+ CodeSet codeset;
+
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *outbufptr = *to;
+ int from_size = *from_left;
+
+ const char *default_string = XLC_PUBLIC(lcd, default_string);
+ int defstr_len = strlen(default_string);
+
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ wc = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!wc) {
+ if (outbufptr) {*outbufptr++ = '\0';}
+ (*to_left)--;
+
+ continue;
+ }
+
+ /* convert */
+ if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+
+ /* output default_string of XDefaultString() */
+ if (*to_left < defstr_len)
+ break;
+ if (outbufptr) {
+ strncpy((char *)outbufptr, default_string, defstr_len);
+ outbufptr += defstr_len;
+ }
+ (*to_left) -= defstr_len;
+
+ unconv_num++;
+
+ } else {
+ mb = gi_to_mb(glyph_index, codeset);
+
+ if (check_string_encoding(codeset)) {
+ if (codeset->parse_info) {
+ Bool need_shift = False;
+ switch (codeset->parse_info->type) {
+ case E_LSL :
+ if (codeset != state->GL_codeset) {
+ need_shift = True;
+ state->GL_codeset = codeset;
+ }
+ break;
+ case E_LSR :
+ if (codeset != state->GR_codeset) {
+ need_shift = True;
+ state->GR_codeset = codeset;
+ }
+ break;
+ /* case E_SS */
+ default:
+ need_shift = True;
+ }
+
+ /* output shift sequence */
+ if (need_shift) {
+ encoding = codeset->parse_info->encoding;
+ length = strlen(encoding);
+ if (*to_left < length)
+ break;
+
+ if (outbufptr) {
+ strncpy((char *)outbufptr, encoding, length);
+ outbufptr += length;
+ }
+ (*to_left) -= length;
+ }
+ }
+
+ /* output characters */
+ length = codeset->length;
+ if (*to_left < length)
+ break;
+
+ if (outbufptr) {
+ output_ulong_value(outbufptr, mb, length, XlcNONE);
+ outbufptr += length;
+ }
+
+ (*to_left) -= length;
+ } else {
+ unconv_num++;
+ }
+ }
+
+ } /* end of while */
+
+ *from = (XPointer) ((const wchar_t *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+stdc_wcstostr(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left) * MB_CUR_MAX;
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = stdc_wcstombs(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = buf_ptr1 - buf_ptr2;
+
+ unconv_num2 = mbstostr(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+static int
+wctocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ wchar_t wc;
+ unsigned long glyph_index;
+
+ int char_len;
+ int unconv_num = 0;
+ XlcSide side;
+
+ CodeSet codeset;
+ XlcCharSet charset = NULL;
+
+ const wchar_t *inbufptr = (const wchar_t *) *from;
+ char *outbufptr = *to;
+ int from_size = *from_left;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ if (*from_left && *to_left) {
+
+ wc = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!wc) {
+ unconv_num = 1;
+ goto end;
+ }
+
+ /* convert */
+ if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+ unconv_num = 1;
+ goto end;
+ }
+
+ if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) {
+ unconv_num = 1;
+ goto end;
+ }
+ char_len = charset->char_size;
+ side = charset->side;
+
+ /* output glyph index */
+ if (codeset->ctconv)
+ glyph_index = conv_to_dest(codeset->ctconv, glyph_index);
+ if (*to_left < char_len) {
+ unconv_num++;
+ goto end;
+ }
+
+ if (outbufptr) {
+ output_ulong_value(outbufptr, glyph_index, char_len, side);
+ outbufptr += char_len;
+ }
+
+ (*to_left) -= char_len;
+
+ }
+
+end:
+
+ /* error end */
+ if (unconv_num) {
+ *from = (XPointer) ((const wchar_t *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+ return -1;
+ }
+
+ /* nomal end */
+ *from = (XPointer) inbufptr;
+ *to = (XPointer) outbufptr;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return 0;
+}
+
+static int
+stdc_wctocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *src = *((const wchar_t **) from);
+ wchar_t wch;
+ XPointer tmp_from, save_from = *from;
+ char tmp[32];
+ int length, ret, src_left = *from_left;
+ int from_size = *from_left;
+
+ if (src_left > 0 && *to_left > 0) {
+ if ((wch = *src)) {
+ length = wctomb(tmp, wch);
+ } else {
+ goto end;
+ }
+
+ if (length < 0)
+ goto end;
+
+ tmp_from = (XPointer) tmp;
+ ret = mbtocs(conv, &tmp_from, &length, to, to_left, args, num_args);
+ if (ret < 0)
+ goto end;
+
+ src++;
+ src_left--;
+ }
+
+end:
+ /* error end */
+ if (save_from == (XPointer) src) {
+ *from = (XPointer) ((const wchar_t *) *from + from_size);
+ *from_left = 0;
+ return -1;
+ }
+
+ /* nomal end */
+ *from = (XPointer) src;
+ *from_left = src_left;
+
+ return 0;
+}
+
+static int
+wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ret;
+ XlcCharSet charset_old, charset = NULL;
+ XPointer tmp_args[1];
+
+ const wchar_t *inbufptr;
+ int in_left;
+ XPointer outbufptr;
+ int out_left;
+ tmp_args[0] = (XPointer) &charset;
+
+ ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+ charset_old = charset;
+
+ while ( ret == 0 && *from_left && *to_left) {
+ inbufptr = (const wchar_t *) *from;
+ in_left = *from_left;
+ outbufptr = *to;
+ out_left = *to_left;
+ ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+ if (charset_old != charset) {
+ *from = (XPointer) inbufptr;
+ *from_left = in_left;
+ *to = (XPointer) outbufptr;
+ *to_left = out_left;
+ break;
+ }
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset_old;
+
+ /* error end */
+ if (ret != 0)
+ return( -1 );
+
+ return(0);
+}
+
+#ifdef STDCVT
+
+static int
+stdc_wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ int ret;
+ XlcCharSet charset_old, charset = NULL;
+ XPointer tmp_args[1];
+
+ const wchar_t *inbufptr;
+ int in_left;
+ XPointer outbufptr;
+ int out_left;
+ tmp_args[0] = (XPointer) &charset;
+
+ ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+ charset_old = charset;
+
+ while ( ret == 0 && *from_left && *to_left ) {
+ inbufptr = (const wchar_t *) *from;
+ in_left = *from_left;
+ outbufptr = *to;
+ out_left = *to_left;
+ ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+ if (charset_old != charset) {
+ *from = (XPointer) inbufptr;
+ *from_left = in_left;
+ *to = (XPointer) outbufptr;
+ *to_left = out_left;
+ break;
+ }
+ }
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset_old;
+
+ /* error end */
+ if (ret != 0)
+ return( -1 );
+
+ return(0);
+}
+
+#endif
+
+static int
+ctstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t));
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left);
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = ctstowcs(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t);
+
+ unconv_num2 += wcstombs_org(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+static int
+cstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t));
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left);
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = cstowcs(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t);
+
+ unconv_num2 += wcstombs_org(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+static int
+strtombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ char *encoding;
+ unsigned long mb, glyph_index;
+ unsigned char ch;
+
+ int length;
+ int unconv_num = 0;
+
+ CodeSet codeset;
+
+ const char *inbufptr = *from;
+ char *outbufptr = *to;
+ int from_size = *from_left;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ ch = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!ch) {
+ if (outbufptr) {*outbufptr++ = '\0';}
+ (*to_left)--;
+
+ continue;
+ }
+
+ /* convert */
+ if (isleftside(ch)) {
+ glyph_index = ch;
+ codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL");
+ } else {
+ glyph_index = ch & GL;
+ codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR");
+ }
+
+ if (!codeset) {
+ unconv_num++;
+ continue;
+ }
+
+ mb = gi_to_mb(glyph_index, codeset);
+ if (codeset->parse_info) {
+ Bool need_shift = False;
+ switch (codeset->parse_info->type) {
+ case E_LSL :
+ if (codeset != state->GL_codeset) {
+ need_shift = True;
+ state->GL_codeset = codeset;
+ }
+ break;
+ case E_LSR :
+ if (codeset != state->GR_codeset) {
+ need_shift = True;
+ state->GR_codeset = codeset;
+ }
+ break;
+ /* case E_SS */
+ default:
+ need_shift = True;
+ }
+
+ /* output shift sequence */
+ if (need_shift) {
+ encoding = codeset->parse_info->encoding;
+ length = strlen(encoding);
+ if (*to_left < length)
+ break;
+ if (outbufptr) {
+ strncpy((char *)outbufptr, encoding, length);
+ outbufptr += length;
+ }
+ (*to_left) -= length;
+ }
+ }
+
+ /* output characters */
+ length = codeset->length;
+ if (*to_left < length)
+ break;
+
+ if (outbufptr) {
+ output_ulong_value(outbufptr, mb, length, XlcNONE);
+ outbufptr += length;
+ }
+
+ (*to_left) -= length;
+
+ } /* end of while */
+
+ *from = (XPointer) ((const char *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+strtowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+
+ unsigned char ch;
+ unsigned long glyph_index;
+ wchar_t wc;
+
+ int unconv_num = 0;
+ CodeSet codeset;
+
+ const char *inbufptr = *from;
+ wchar_t *outbufptr = (wchar_t *)*to;
+ int from_size = *from_left;
+
+ if (*from_left > *to_left)
+ *from_left = *to_left;
+
+ while (*from_left && *to_left) {
+
+ ch = *inbufptr++;
+ (*from_left)--;
+
+ /* null ? */
+ if (!ch) {
+ if (outbufptr) {*outbufptr++ = L'\0';}
+ (*to_left)--;
+
+ continue;
+ }
+
+ /* convert */
+ if (isleftside(ch)) {
+ glyph_index = ch;
+ codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL");
+ } else {
+ glyph_index = ch & GL;
+ codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR");
+ }
+
+ if (!codeset) {
+ unconv_num++;
+ continue;
+ }
+
+ gi_to_wc(lcd, glyph_index, codeset, &wc);
+ if (outbufptr) {*outbufptr++ = wc;}
+ (*to_left)--;
+
+ } /* end of while */
+
+ *from = (XPointer) ((const char *) *from + from_size);
+ *from_left = 0;
+ *to = (XPointer) outbufptr;
+
+ return unconv_num;
+}
+
+static int
+stdc_strtowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+ char *buf_ptr1 = buf;
+ int buf_left1 = (*from_left) * MB_CUR_MAX;
+ char *buf_ptr2 = buf_ptr1;
+ int buf_left2;
+ int unconv_num1 = 0, unconv_num2 = 0;
+
+ unconv_num1 = strtombs(conv,
+ from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+ if (unconv_num1 < 0)
+ goto ret;
+
+ buf_left2 = buf_ptr1 - buf_ptr2;
+
+ unconv_num2 = stdc_mbstowcs(conv,
+ &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+ if (unconv_num2 < 0)
+ goto ret;
+
+ret:
+ if (buf)
+ Xfree((char *)buf);
+
+ return (unconv_num1 + unconv_num2);
+}
+
+/* -------------------------------------------------------------------------- */
+/* Close */
+/* -------------------------------------------------------------------------- */
+
+static void
+close_converter(
+ XlcConv conv)
+{
+ if (conv->state) {
+ Xfree((char *) conv->state);
+ }
+
+ if (conv->methods) {
+ Xfree((char *) conv->methods);
+ }
+
+ Xfree((char *) conv);
+}
+
+/* -------------------------------------------------------------------------- */
+/* Open */
+/* -------------------------------------------------------------------------- */
+
+static XlcConv
+create_conv(
+ XLCd lcd,
+ XlcConvMethods methods)
+{
+ XlcConv conv;
+ State state;
+
+ conv = (XlcConv) Xcalloc(1, sizeof(XlcConvRec));
+ if (conv == NULL)
+ return (XlcConv) NULL;
+
+ conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec));
+ if (conv->methods == NULL)
+ goto err;
+ *conv->methods = *methods;
+ conv->methods->reset = init_state;
+
+ conv->state = Xcalloc(1, sizeof(StateRec));
+ if (conv->state == NULL)
+ goto err;
+
+ state = (State) conv->state;
+ state->lcd = lcd;
+
+ _XlcResetConverter(conv);
+
+ return conv;
+
+err:
+ close_converter(conv);
+
+ return (XlcConv) NULL;
+}
+
+static XlcConvMethodsRec mbstocts_methods = {
+ close_converter,
+ mbstocts,
+ NULL
+};
+
+static XlcConv
+open_mbstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbstocts_methods);
+}
+
+static XlcConvMethodsRec mbstostr_methods = {
+ close_converter,
+ mbstostr,
+ NULL
+};
+
+static XlcConv
+open_mbstostr(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbstostr_methods);
+}
+
+static XlcConvMethodsRec mbstocs_methods = {
+ close_converter,
+ mbstocs,
+ NULL
+};
+
+static XlcConv
+open_mbstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbstocs_methods);
+}
+
+static XlcConvMethodsRec mbtocs_methods = {
+ close_converter,
+ mbtocs,
+ NULL
+};
+
+static XlcConv
+open_mbtocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbtocs_methods);
+}
+
+static XlcConvMethodsRec ctstombs_methods = {
+ close_converter,
+ ctstombs,
+ NULL
+};
+
+static XlcConv
+open_ctstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &ctstombs_methods);
+}
+
+static XlcConvMethodsRec cstombs_methods = {
+ close_converter,
+ cstombs,
+ NULL
+};
+
+static XlcConv
+open_cstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &cstombs_methods);
+}
+
+static XlcConvMethodsRec strtombs_methods = {
+ close_converter,
+ strtombs,
+ NULL
+};
+
+static XlcConv
+open_strtombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &strtombs_methods);
+}
+
+#ifdef STDCVT
+
+static XlcConvMethodsRec stdc_mbstowcs_methods = {
+ close_converter,
+ stdc_mbstowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_mbstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstombs_methods = {
+ close_converter,
+ stdc_wcstombs,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstombs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstocts_methods = {
+ close_converter,
+ stdc_wcstocts,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstocts_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstostr_methods = {
+ close_converter,
+ stdc_wcstostr,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstostr(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstostr_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstocs_methods = {
+ close_converter,
+ stdc_wcstocs,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstocs_methods);
+}
+
+static XlcConvMethodsRec stdc_wctocs_methods = {
+ close_converter,
+ stdc_wctocs,
+ NULL
+};
+
+static XlcConv
+open_stdc_wctocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wctocs_methods);
+}
+
+static XlcConvMethodsRec stdc_ctstowcs_methods = {
+ close_converter,
+ stdc_ctstowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_ctstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_ctstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_cstowcs_methods = {
+ close_converter,
+ stdc_cstowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_cstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_strtowcs_methods = {
+ close_converter,
+ stdc_strtowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_strtowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_strtowcs_methods);
+}
+
+#endif /* STDCVT */
+
+static XlcConvMethodsRec mbstowcs_methods = {
+ close_converter,
+ mbstowcs_org,
+ NULL
+};
+
+static XlcConv
+open_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbstowcs_methods);
+}
+
+static XlcConvMethodsRec wcstombs_methods = {
+ close_converter,
+ wcstombs_org,
+ NULL
+};
+
+static XlcConv
+open_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &wcstombs_methods);
+}
+
+static XlcConvMethodsRec wcstocts_methods = {
+ close_converter,
+ wcstocts,
+ NULL
+};
+
+static XlcConv
+open_wcstocts(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &wcstocts_methods);
+}
+
+static XlcConvMethodsRec wcstostr_methods = {
+ close_converter,
+ wcstostr,
+ NULL
+};
+
+static XlcConv
+open_wcstostr(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &wcstostr_methods);
+}
+
+static XlcConvMethodsRec wcstocs_methods = {
+ close_converter,
+ wcstocs,
+ NULL
+};
+
+static XlcConv
+open_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &wcstocs_methods);
+}
+
+static XlcConvMethodsRec wctocs_methods = {
+ close_converter,
+ wctocs,
+ NULL
+};
+
+static XlcConv
+open_wctocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &wctocs_methods);
+}
+
+static XlcConvMethodsRec ctstowcs_methods = {
+ close_converter,
+ ctstowcs,
+ NULL
+};
+
+static XlcConv
+open_ctstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &ctstowcs_methods);
+}
+
+static XlcConvMethodsRec cstowcs_methods = {
+ close_converter,
+ cstowcs,
+ NULL
+};
+
+static XlcConv
+open_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &cstowcs_methods);
+}
+
+static XlcConvMethodsRec strtowcs_methods = {
+ close_converter,
+ strtowcs,
+ NULL
+};
+
+static XlcConv
+open_strtowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &strtowcs_methods);
+}
+
+/* -------------------------------------------------------------------------- */
+/* Loader */
+/* -------------------------------------------------------------------------- */
+
+XLCd
+_XlcGenericLoader(
+ const char *name)
+{
+ XLCd lcd;
+#ifdef STDCVT
+ XLCdGenericPart *gen;
+#endif
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+
+ if (lcd == NULL)
+ return lcd;
+
+ default_GL_charset = _XlcGetCharSet("ISO8859-1:GL");
+ default_GR_charset = _XlcGetCharSet("ISO8859-1:GR");
+
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_mbstostr);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+ _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_strtombs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+
+#ifdef STDCVT
+ gen = XLC_GENERIC_PART(lcd);
+
+ if (gen->use_stdc_env != True) {
+#endif
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wctocs);
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
+ _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+#ifdef STDCVT
+ }
+#endif
+
+#ifdef STDCVT
+ if (gen->use_stdc_env == True) {
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_stdc_mbstowcs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_stdc_wcstombs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_stdc_wcstocts);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_stdc_wcstostr);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_stdc_wcstocs);
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_stdc_wctocs);
+ _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_stdc_ctstowcs);
+ _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_stdc_strtowcs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_stdc_cstowcs);
+ }
+#endif
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
diff --git a/libX11/modules/lc/xlocale/lcJis.c b/libX11/modules/lc/xlocale/lcJis.c index 594e6363c..c2ca2f560 100644 --- a/libX11/modules/lc/xlocale/lcJis.c +++ b/libX11/modules/lc/xlocale/lcJis.c @@ -1,945 +1,944 @@ -/* - * 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 - */ - -/* - * A Japanese JIS locale. - * Supports: all locales with codeset JIS7. - * How: Provides converters for JIS. - * 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 <stdio.h> - -#if !defined(X_LOCALE) -#define STDCVT -#endif - -typedef struct _StateRec { - XLCd lcd; - XlcCharSet charset; - XlcCharSet GL_charset; - XlcCharSet GR_charset; -} StateRec, *State; - -static void -init_state( - XlcConv conv) -{ - State state = (State) conv->state; - XLCdGenericPart *gen = XLC_GENERIC_PART(state->lcd); - CodeSet codeset; - - codeset = gen->initial_state_GL; - if (codeset && codeset->charset_list) - state->GL_charset = *codeset->charset_list; - codeset = gen->initial_state_GR; - if (codeset && codeset->charset_list) - state->GR_charset = *codeset->charset_list; - - if (state->GL_charset == NULL) - if ((codeset = *gen->codeset_list) != NULL) - state->GL_charset = *codeset->charset_list; -} - -static int -compare( - const char *src, - const char *encoding, - int length) -{ - const char *start = src; - - while (length-- > 0) { - if (*src++ != *encoding++) - return 0; - if (*encoding == '\0') - return src - start; - } - - return 0; -} - -static int -mbtocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - const char *src; - char *dst; - unsigned char *mb_parse_table; - ParseInfo *parse_list, parse_info; - XlcCharSet charset; - int length, number, encoding_len = 0; - int i; - - src = *((const char **) from); - dst = *((char **) to); - - mb_parse_table = XLC_GENERIC(lcd, mb_parse_table); - if (mb_parse_table != NULL) { - number = mb_parse_table[(unsigned char) *src]; - if (number > 0) { - parse_list = XLC_GENERIC(lcd, mb_parse_list) + number - 1; - for ( ; (parse_info = *parse_list) != NULL; parse_list++) { - encoding_len = compare(src, parse_info->encoding, *from_left); - if (encoding_len > 0) { - switch (parse_info->type) { - case E_SS: - src += encoding_len; - charset = *parse_info->codeset->charset_list; - goto found; - case E_LSL: - case E_LSR: - src += encoding_len; - charset = *parse_info->codeset->charset_list; - if (parse_info->type == E_LSL) - state->GL_charset = charset; - else - state->GR_charset = charset; - length = 0; - goto end; - case E_GL: - charset = state->GL_charset; - goto found; - case E_GR: - charset = state->GR_charset; - goto found; - default: - break; - } - } - } - } - } - - if ((*src & 0x80) && state->GR_charset) - charset = state->GR_charset; - else - charset = state->GL_charset; - -found: - if (charset == NULL || - (num_args == 2 && (XlcCharSet) args[1] != charset)) - return -1; - - length = charset->char_size; - if (length > *from_left - encoding_len) - return -1; - - if (dst) { - if (length > *to_left) - return -1; - if (charset->side == XlcGL) { - for (i = 0; i < length; i++) - *dst++ = *src++ & 0x7f; - } else if (charset->side == XlcGR) { - for (i = 0; i < length; i++) - *dst++ = *src++ | 0x80; - } else { - for (i = 0; i < length; i++) - *dst++ = *src++; - } - *to = (XPointer) dst; - *to_left -= length; - } -end: - *from = (XPointer) src; - *from_left -= encoding_len + length; - state->charset = charset; - if (num_args == 1) - *((XlcCharSet *) args[0]) = charset; - - return 0; -} - -static int -mbstocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XlcCharSet charset = NULL; - XPointer tmp_args[2], save_from = *from; - int ret, unconv_num = 0, tmp_num = 1; - - tmp_args[0] = (XPointer) &charset; - - while (*from_left > 0 && *to_left > 0) { - ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, tmp_num); - if (ret < 0) - break; - unconv_num += ret; - if (tmp_num == 1 && charset) { - tmp_args[1] = (XPointer) charset; - tmp_num = 2; - } - } - - if (save_from == *from) - return -1; - - if (num_args > 0) - *((XlcCharSet *) args[0]) = charset; - - return unconv_num; -} - -static CodeSet -wc_parse_codeset( - XLCd lcd, - const wchar_t *wcstr) -{ - CodeSet *codeset; - unsigned long wc_encoding; - int num; - - wc_encoding = *wcstr & XLC_GENERIC(lcd, wc_encode_mask); - num = XLC_GENERIC(lcd, codeset_num); - codeset = XLC_GENERIC(lcd, codeset_list); - while (num-- > 0) { - if (wc_encoding == (*codeset)->wc_encoding) - return *codeset; - codeset++; - } - - return NULL; -} - -static int -wcstocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - const wchar_t *wcptr; - char *bufptr; - wchar_t wch; - char *tmpptr; - int length; - CodeSet codeset; - unsigned long wc_encoding; - int wcstr_len, buf_len; - - if (from == NULL || *from == NULL) - return 0; - - wcptr = *((const wchar_t **) from); - bufptr = *((char **) to); - wcstr_len = *from_left; - buf_len = *to_left; - - codeset = wc_parse_codeset(lcd, wcptr); - if (codeset == NULL) - 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; - if ((*codeset->charset_list)->side == XlcGL) { - while (length--) { - *tmpptr-- = (unsigned char) (wch & 0x7f); - wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits); - } - } else if ((*codeset->charset_list)->side == XlcGR) { - while (length--) { - *tmpptr-- = (unsigned char) (wch | 0x80); - wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits); - } - } else { - while (length--) { - *tmpptr-- = (unsigned char) 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 - *((char **) 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 -cstombs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - const char *csptr; - char *bufptr; - int csstr_len; - int buf_len; - int num, encoding_len = 0; - CodeSet codeset; - XlcCharSet charset; - EncodingType type; - int cvt_length; - - csptr = *((const char **) from); - bufptr = *((char **) to); - csstr_len = *from_left; - buf_len = *to_left; - - if (num_args < 1) - return -1; - - charset = (XlcCharSet) args[0]; - - codeset = GetCodeSetFromCharSet(state->lcd, charset); - if (codeset == NULL) - return -1; - - cvt_length = 0; - if (codeset->parse_info) { - switch (type = codeset->parse_info->type) { - case E_SS: - encoding_len = strlen(codeset->parse_info->encoding); - break; - case E_LSL: - case E_LSR: - if (type == E_LSL) { - if (charset == state->GL_charset) - break; - } else { - if (charset == state->GR_charset) - break; - } - encoding_len = strlen(codeset->parse_info->encoding); - if (encoding_len > buf_len) - return -1; - cvt_length += encoding_len; - if (bufptr) { - strcpy(bufptr, codeset->parse_info->encoding); - bufptr += encoding_len; - } - buf_len -= encoding_len; - encoding_len = 0; - if (type == E_LSL) - state->GL_charset = charset; - else - state->GR_charset = charset; - break; - default: - break; - } - } - - csstr_len /= codeset->length; - buf_len /= codeset->length + encoding_len; - if (csstr_len < buf_len) - buf_len = csstr_len; - - cvt_length += buf_len * (encoding_len + codeset->length); - if (bufptr) { - while (buf_len--) { - if (encoding_len) { - strcpy(bufptr, codeset->parse_info->encoding); - bufptr += encoding_len; - } - num = codeset->length; - if (codeset->side == XlcGL) { - while (num--) - *bufptr++ = *csptr++ & 0x7f; - } else if (codeset->side == XlcGR) { - while (num--) - *bufptr++ = *csptr++ | 0x80; - } else { - while (num--) - *bufptr++ = *csptr++; - } - } - } - - *from_left -= csptr - *((char **) from); - *from = (XPointer) csptr; - - if (bufptr) - *to = (XPointer) bufptr; - *to_left -= cvt_length; - - return 0; -} - -static int -cstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - State state = (State) conv->state; - XLCd lcd = state->lcd; - const char *csptr; - wchar_t *bufptr; - int csstr_len; - int buf_len; - wchar_t wch; - unsigned long code_mask, wc_encoding; - int num, length, wc_shift_bits; - CodeSet codeset; - - csptr = *((const char **) from); - bufptr = *((wchar_t **) to); - csstr_len = *from_left; - buf_len = *to_left; - - if (num_args < 1) - return -1; - - codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0]); - if (codeset == NULL) - return -1; - - length = codeset->length; - csstr_len /= length; - if (csstr_len < buf_len) - buf_len = csstr_len; - - code_mask = ~XLC_GENERIC(lcd, wc_encode_mask); - wc_encoding = codeset->wc_encoding; - wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits); - - *to_left -= buf_len; - - if (bufptr) { - while (buf_len--) { - wch = (wchar_t) (*csptr++ & 0x7f); - num = length - 1; - while (num--) - wch = (wch << wc_shift_bits) | (*csptr++ & 0x7f); - - *bufptr++ = (wch & code_mask) | wc_encoding; - } - } - - *from_left -= csptr - *((char **) from); - *from = (XPointer) csptr; - - if (bufptr) - *to = (XPointer) bufptr; - - return 0; -} - - -static void -close_converter( - XlcConv conv) -{ - if (conv->state) { - Xfree((char *) conv->state); - } - - Xfree((char *) conv); -} - -static XlcConv -create_conv( - XLCd lcd, - XlcConvMethods methods) -{ - XlcConv conv; - State state; - - conv = (XlcConv) Xmalloc(sizeof(XlcConvRec)); - if (conv == NULL) - return (XlcConv) NULL; - - conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec)); - if (conv->methods == NULL) - goto err; - *conv->methods = *methods; - if (XLC_PUBLIC(lcd, is_state_depend)) - conv->methods->reset = init_state; - - conv->state = (XPointer) Xmalloc(sizeof(StateRec)); - if (conv->state == NULL) - goto err; - bzero((char *) conv->state, sizeof(StateRec)); - - state = (State) conv->state; - state->lcd = lcd; - init_state(conv); - - return conv; - -err: - close_converter(conv); - - return (XlcConv) NULL; -} - -static XlcConvMethodsRec mbstocs_methods = { - close_converter, - mbstocs, - NULL -}; - -static XlcConv -open_mbstocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &mbstocs_methods); -} - -static XlcConvMethodsRec wcstocs_methods = { - close_converter, - wcstocs, - NULL -}; - -static XlcConv -open_wcstocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &wcstocs_methods); -} - -static XlcConvMethodsRec mbtocs_methods = { - close_converter, - mbtocs, - NULL -}; - -static XlcConv -open_mbtocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &mbtocs_methods); -} - -static XlcConvMethodsRec cstombs_methods = { - close_converter, - cstombs, - NULL -}; - -static XlcConv -open_cstombs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &cstombs_methods); -} - -static XlcConvMethodsRec cstowcs_methods = { - close_converter, - cstowcs, - NULL -}; - -static XlcConv -open_cstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &cstowcs_methods); -} - -#ifdef STDCVT -static int -stdc_mbstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - const char *src = *((const char **) from); - wchar_t *dst = *((wchar_t **) to); - int src_left = *from_left; - int dst_left = *to_left; - int length; - - while (src_left > 0 && dst_left > 0) { - length = mbtowc(dst, src, src_left); - if (length < 0) - break; - - src += length; - src_left -= length; - if (dst) - dst++; - dst_left--; - - if (length == 0) { - src++; - src_left--; - break; - } - } - - if (*from_left == src_left) - return -1; - - *from = (XPointer) src; - if (dst) - *to = (XPointer) dst; - *from_left = src_left; - *to_left = dst_left; - - return 0; -} - -static int -stdc_wcstombs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - const wchar_t *src = *((const wchar_t **) from); - char *dst = *((char **) to); - int src_left = *from_left; - int dst_left = *to_left; - int length; - - while (src_left > 0 && dst_left > 0) { - length = wctomb(dst, *src); /* XXX */ - if (length < 0 || dst_left < length) - break; - - src++; - src_left--; - dst += length; - dst_left -= length; - - if (length == 0) { - dst++; - dst_left--; - break; - } - } - - if (*from_left == src_left) - return -1; - - *from = (XPointer) src; - *to = (XPointer) dst; - *from_left = src_left; - *to_left = dst_left; - - return 0; -} - -static int -stdc_wcstocs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - const wchar_t *src = *((const wchar_t **) from); - wchar_t wch; - XlcCharSet charset = NULL; - XPointer tmp_args[2], tmp_from, save_from = *from; - char tmp[32]; - int length, ret, src_left = *from_left; - int unconv_num = 0, tmp_num = 1; - - tmp_args[0] = (XPointer) &charset; - - while (src_left > 0 && *to_left > 0) { - if (wch = *src) { - length = wctomb(tmp, wch); - } else { - length = 1; - *tmp = '\0'; - } - - if (length < 0) - break; - - tmp_from = (XPointer) tmp; - ret = mbtocs(conv, &tmp_from, &length, to, to_left, tmp_args, tmp_num); - if (ret < 0) - break; - unconv_num += ret; - if (tmp_num == 1 && charset) { - tmp_args[1] = (XPointer) charset; - tmp_num = 2; - } - - src++; - src_left--; - } - - if (save_from == (XPointer) src) - return -1; - - *from = (XPointer) src; - *from_left = src_left; - - if (num_args > 0) - *((XlcCharSet *) args[0]) = charset; - - return unconv_num; -} - -#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 int -stdc_cstowcs( - XlcConv conv, - XPointer *from, - int *from_left, - XPointer *to, - int *to_left, - XPointer *args, - int num_args) -{ - XLCd lcd = ((State) conv->state)->lcd; - DefineLocalBuf; - XPointer buf, save_buf; - int length, left, ret; - - left = length = *to_left * XLC_PUBLIC(lcd, mb_cur_max); - buf = save_buf = (XPointer) AllocLocalBuf(length); - if (buf == NULL) - return -1; - - ret = cstombs(conv, from, from_left, &buf, &left, args, num_args); - if (ret < 0) - goto err; - - buf = save_buf; - length -= left; - if (stdc_mbstowcs(conv, &buf, &length, to, to_left, args, num_args) < 0) - ret = -1; - -err: - FreeLocalBuf(save_buf); - - return ret; -} - -static XlcConvMethodsRec stdc_mbstowcs_methods = { - close_converter, - stdc_mbstowcs, - NULL -}; - -static XlcConv -open_stdc_mbstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_mbstowcs_methods); -} - -static XlcConvMethodsRec stdc_wcstombs_methods = { - close_converter, - stdc_wcstombs, - NULL -}; - -static XlcConv -open_stdc_wcstombs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_wcstombs_methods); -} - -static XlcConvMethodsRec stdc_wcstocs_methods = { - close_converter, - stdc_wcstocs, - NULL -}; - -static XlcConv -open_stdc_wcstocs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_wcstocs_methods); -} - -static XlcConvMethodsRec stdc_cstowcs_methods = { - close_converter, - stdc_cstowcs, - NULL -}; - -static XlcConv -open_stdc_cstowcs( - XLCd from_lcd, - const char *from_type, - XLCd to_lcd, - const char *to_type) -{ - return create_conv(from_lcd, &stdc_cstowcs_methods); -} -#endif /* STDCVT */ - -XLCd -_XlcJisLoader( - const char *name) -{ - XLCd lcd; -#ifdef STDCVT - XLCdGenericPart *gen; -#endif - - lcd = _XlcCreateLC(name, _XlcGenericMethods); - if (lcd == NULL) - return lcd; - - if (!XLC_PUBLIC_PART(lcd)->codeset || - (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "JIS7"))) { - _XlcDestroyLC(lcd); - return (XLCd) NULL; - } - - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs); - _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs); - _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs); - -#ifdef STDCVT - gen = XLC_GENERIC_PART(lcd); - - if (gen->use_stdc_env == True) { - _XlcSetConverter(lcd,XlcNMultiByte,lcd,XlcNWideChar,open_stdc_mbstowcs); - _XlcSetConverter(lcd,XlcNWideChar,lcd,XlcNMultiByte,open_stdc_wcstombs); - } - if (gen->force_convert_to_mb == True) { - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet,open_stdc_wcstocs); - _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar,open_stdc_cstowcs); - } else { -#endif - _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs); - _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs); -#ifdef STDCVT - } -#endif - - _XlcAddUtf8Converters(lcd); - - return lcd; -} - -#else -typedef int dummy; -#endif /* X_LOCALE */ +/*
+ * 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
+ */
+
+/*
+ * A Japanese JIS locale.
+ * Supports: all locales with codeset JIS7.
+ * How: Provides converters for JIS.
+ * 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 <stdio.h>
+
+#if !defined(X_LOCALE)
+#define STDCVT
+#endif
+
+typedef struct _StateRec {
+ XLCd lcd;
+ XlcCharSet charset;
+ XlcCharSet GL_charset;
+ XlcCharSet GR_charset;
+} StateRec, *State;
+
+static void
+init_state(
+ XlcConv conv)
+{
+ State state = (State) conv->state;
+ XLCdGenericPart *gen = XLC_GENERIC_PART(state->lcd);
+ CodeSet codeset;
+
+ codeset = gen->initial_state_GL;
+ if (codeset && codeset->charset_list)
+ state->GL_charset = *codeset->charset_list;
+ codeset = gen->initial_state_GR;
+ if (codeset && codeset->charset_list)
+ state->GR_charset = *codeset->charset_list;
+
+ if (state->GL_charset == NULL)
+ if ((codeset = *gen->codeset_list) != NULL)
+ state->GL_charset = *codeset->charset_list;
+}
+
+static int
+compare(
+ const char *src,
+ const char *encoding,
+ int length)
+{
+ const char *start = src;
+
+ while (length-- > 0) {
+ if (*src++ != *encoding++)
+ return 0;
+ if (*encoding == '\0')
+ return src - start;
+ }
+
+ return 0;
+}
+
+static int
+mbtocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+ const char *src;
+ char *dst;
+ unsigned char *mb_parse_table;
+ ParseInfo *parse_list, parse_info;
+ XlcCharSet charset;
+ int length, number, encoding_len = 0;
+ int i;
+
+ src = *((const char **) from);
+ dst = *((char **) to);
+
+ mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+ if (mb_parse_table != NULL) {
+ number = mb_parse_table[(unsigned char) *src];
+ if (number > 0) {
+ parse_list = XLC_GENERIC(lcd, mb_parse_list) + number - 1;
+ for ( ; (parse_info = *parse_list) != NULL; parse_list++) {
+ encoding_len = compare(src, parse_info->encoding, *from_left);
+ if (encoding_len > 0) {
+ switch (parse_info->type) {
+ case E_SS:
+ src += encoding_len;
+ charset = *parse_info->codeset->charset_list;
+ goto found;
+ case E_LSL:
+ case E_LSR:
+ src += encoding_len;
+ charset = *parse_info->codeset->charset_list;
+ if (parse_info->type == E_LSL)
+ state->GL_charset = charset;
+ else
+ state->GR_charset = charset;
+ length = 0;
+ goto end;
+ case E_GL:
+ charset = state->GL_charset;
+ goto found;
+ case E_GR:
+ charset = state->GR_charset;
+ goto found;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if ((*src & 0x80) && state->GR_charset)
+ charset = state->GR_charset;
+ else
+ charset = state->GL_charset;
+
+found:
+ if (charset == NULL ||
+ (num_args == 2 && (XlcCharSet) args[1] != charset))
+ return -1;
+
+ length = charset->char_size;
+ if (length > *from_left - encoding_len)
+ return -1;
+
+ if (dst) {
+ if (length > *to_left)
+ return -1;
+ if (charset->side == XlcGL) {
+ for (i = 0; i < length; i++)
+ *dst++ = *src++ & 0x7f;
+ } else if (charset->side == XlcGR) {
+ for (i = 0; i < length; i++)
+ *dst++ = *src++ | 0x80;
+ } else {
+ for (i = 0; i < length; i++)
+ *dst++ = *src++;
+ }
+ *to = (XPointer) dst;
+ *to_left -= length;
+ }
+end:
+ *from = (XPointer) src;
+ *from_left -= encoding_len + length;
+ state->charset = charset;
+ if (num_args == 1)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return 0;
+}
+
+static int
+mbstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XlcCharSet charset = NULL;
+ XPointer tmp_args[2], save_from = *from;
+ int ret, unconv_num = 0, tmp_num = 1;
+
+ tmp_args[0] = (XPointer) &charset;
+
+ while (*from_left > 0 && *to_left > 0) {
+ ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, tmp_num);
+ if (ret < 0)
+ break;
+ unconv_num += ret;
+ if (tmp_num == 1 && charset) {
+ tmp_args[1] = (XPointer) charset;
+ tmp_num = 2;
+ }
+ }
+
+ if (save_from == *from)
+ return -1;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+static CodeSet
+wc_parse_codeset(
+ XLCd lcd,
+ const wchar_t *wcstr)
+{
+ CodeSet *codeset;
+ unsigned long wc_encoding;
+ int num;
+
+ wc_encoding = *wcstr & XLC_GENERIC(lcd, wc_encode_mask);
+ num = XLC_GENERIC(lcd, codeset_num);
+ codeset = XLC_GENERIC(lcd, codeset_list);
+ while (num-- > 0) {
+ if (wc_encoding == (*codeset)->wc_encoding)
+ return *codeset;
+ codeset++;
+ }
+
+ return NULL;
+}
+
+static int
+wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+ const wchar_t *wcptr;
+ char *bufptr;
+ wchar_t wch;
+ char *tmpptr;
+ int length;
+ CodeSet codeset;
+ unsigned long wc_encoding;
+ int wcstr_len, buf_len;
+
+ if (from == NULL || *from == NULL)
+ return 0;
+
+ wcptr = *((const wchar_t **) from);
+ bufptr = *((char **) to);
+ wcstr_len = *from_left;
+ buf_len = *to_left;
+
+ codeset = wc_parse_codeset(lcd, wcptr);
+ if (codeset == NULL)
+ 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;
+ if ((*codeset->charset_list)->side == XlcGL) {
+ while (length--) {
+ *tmpptr-- = (unsigned char) (wch & 0x7f);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ } else if ((*codeset->charset_list)->side == XlcGR) {
+ while (length--) {
+ *tmpptr-- = (unsigned char) (wch | 0x80);
+ wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+ }
+ } else {
+ while (length--) {
+ *tmpptr-- = (unsigned char) 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 - *((char **) 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
+cstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ const char *csptr;
+ char *bufptr;
+ int csstr_len;
+ int buf_len;
+ int num, encoding_len = 0;
+ CodeSet codeset;
+ XlcCharSet charset;
+ EncodingType type;
+ int cvt_length;
+
+ csptr = *((const char **) from);
+ bufptr = *((char **) to);
+ csstr_len = *from_left;
+ buf_len = *to_left;
+
+ if (num_args < 1)
+ return -1;
+
+ charset = (XlcCharSet) args[0];
+
+ codeset = GetCodeSetFromCharSet(state->lcd, charset);
+ if (codeset == NULL)
+ return -1;
+
+ cvt_length = 0;
+ if (codeset->parse_info) {
+ switch (type = codeset->parse_info->type) {
+ case E_SS:
+ encoding_len = strlen(codeset->parse_info->encoding);
+ break;
+ case E_LSL:
+ case E_LSR:
+ if (type == E_LSL) {
+ if (charset == state->GL_charset)
+ break;
+ } else {
+ if (charset == state->GR_charset)
+ break;
+ }
+ encoding_len = strlen(codeset->parse_info->encoding);
+ if (encoding_len > buf_len)
+ return -1;
+ cvt_length += encoding_len;
+ if (bufptr) {
+ strcpy(bufptr, codeset->parse_info->encoding);
+ bufptr += encoding_len;
+ }
+ buf_len -= encoding_len;
+ encoding_len = 0;
+ if (type == E_LSL)
+ state->GL_charset = charset;
+ else
+ state->GR_charset = charset;
+ break;
+ default:
+ break;
+ }
+ }
+
+ csstr_len /= codeset->length;
+ buf_len /= codeset->length + encoding_len;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ cvt_length += buf_len * (encoding_len + codeset->length);
+ if (bufptr) {
+ while (buf_len--) {
+ if (encoding_len) {
+ strcpy(bufptr, codeset->parse_info->encoding);
+ bufptr += encoding_len;
+ }
+ num = codeset->length;
+ if (codeset->side == XlcGL) {
+ while (num--)
+ *bufptr++ = *csptr++ & 0x7f;
+ } else if (codeset->side == XlcGR) {
+ while (num--)
+ *bufptr++ = *csptr++ | 0x80;
+ } else {
+ while (num--)
+ *bufptr++ = *csptr++;
+ }
+ }
+ }
+
+ *from_left -= csptr - *((char **) from);
+ *from = (XPointer) csptr;
+
+ if (bufptr)
+ *to = (XPointer) bufptr;
+ *to_left -= cvt_length;
+
+ return 0;
+}
+
+static int
+cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ State state = (State) conv->state;
+ XLCd lcd = state->lcd;
+ const char *csptr;
+ wchar_t *bufptr;
+ int csstr_len;
+ int buf_len;
+ wchar_t wch;
+ unsigned long code_mask, wc_encoding;
+ int num, length, wc_shift_bits;
+ CodeSet codeset;
+
+ csptr = *((const char **) from);
+ bufptr = *((wchar_t **) to);
+ csstr_len = *from_left;
+ buf_len = *to_left;
+
+ if (num_args < 1)
+ return -1;
+
+ codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0]);
+ if (codeset == NULL)
+ return -1;
+
+ length = codeset->length;
+ csstr_len /= length;
+ if (csstr_len < buf_len)
+ buf_len = csstr_len;
+
+ code_mask = ~XLC_GENERIC(lcd, wc_encode_mask);
+ wc_encoding = codeset->wc_encoding;
+ wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+
+ *to_left -= buf_len;
+
+ if (bufptr) {
+ while (buf_len--) {
+ wch = (wchar_t) (*csptr++ & 0x7f);
+ num = length - 1;
+ while (num--)
+ wch = (wch << wc_shift_bits) | (*csptr++ & 0x7f);
+
+ *bufptr++ = (wch & code_mask) | wc_encoding;
+ }
+ }
+
+ *from_left -= csptr - *((char **) from);
+ *from = (XPointer) csptr;
+
+ if (bufptr)
+ *to = (XPointer) bufptr;
+
+ return 0;
+}
+
+
+static void
+close_converter(
+ XlcConv conv)
+{
+ if (conv->state) {
+ Xfree((char *) conv->state);
+ }
+
+ Xfree((char *) conv);
+}
+
+static XlcConv
+create_conv(
+ XLCd lcd,
+ XlcConvMethods methods)
+{
+ XlcConv conv;
+ State state;
+
+ conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+ if (conv == NULL)
+ return (XlcConv) NULL;
+
+ conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec));
+ if (conv->methods == NULL)
+ goto err;
+ *conv->methods = *methods;
+ if (XLC_PUBLIC(lcd, is_state_depend))
+ conv->methods->reset = init_state;
+
+ conv->state = Xcalloc(1, sizeof(StateRec));
+ if (conv->state == NULL)
+ goto err;
+
+ state = (State) conv->state;
+ state->lcd = lcd;
+ init_state(conv);
+
+ return conv;
+
+err:
+ close_converter(conv);
+
+ return (XlcConv) NULL;
+}
+
+static XlcConvMethodsRec mbstocs_methods = {
+ close_converter,
+ mbstocs,
+ NULL
+};
+
+static XlcConv
+open_mbstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbstocs_methods);
+}
+
+static XlcConvMethodsRec wcstocs_methods = {
+ close_converter,
+ wcstocs,
+ NULL
+};
+
+static XlcConv
+open_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &wcstocs_methods);
+}
+
+static XlcConvMethodsRec mbtocs_methods = {
+ close_converter,
+ mbtocs,
+ NULL
+};
+
+static XlcConv
+open_mbtocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &mbtocs_methods);
+}
+
+static XlcConvMethodsRec cstombs_methods = {
+ close_converter,
+ cstombs,
+ NULL
+};
+
+static XlcConv
+open_cstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &cstombs_methods);
+}
+
+static XlcConvMethodsRec cstowcs_methods = {
+ close_converter,
+ cstowcs,
+ NULL
+};
+
+static XlcConv
+open_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &cstowcs_methods);
+}
+
+#ifdef STDCVT
+static int
+stdc_mbstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const char *src = *((const char **) from);
+ wchar_t *dst = *((wchar_t **) to);
+ int src_left = *from_left;
+ int dst_left = *to_left;
+ int length;
+
+ while (src_left > 0 && dst_left > 0) {
+ length = mbtowc(dst, src, src_left);
+ if (length < 0)
+ break;
+
+ src += length;
+ src_left -= length;
+ if (dst)
+ dst++;
+ dst_left--;
+
+ if (length == 0) {
+ src++;
+ src_left--;
+ break;
+ }
+ }
+
+ if (*from_left == src_left)
+ return -1;
+
+ *from = (XPointer) src;
+ if (dst)
+ *to = (XPointer) dst;
+ *from_left = src_left;
+ *to_left = dst_left;
+
+ return 0;
+}
+
+static int
+stdc_wcstombs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *src = *((const wchar_t **) from);
+ char *dst = *((char **) to);
+ int src_left = *from_left;
+ int dst_left = *to_left;
+ int length;
+
+ while (src_left > 0 && dst_left > 0) {
+ length = wctomb(dst, *src); /* XXX */
+ if (length < 0 || dst_left < length)
+ break;
+
+ src++;
+ src_left--;
+ dst += length;
+ dst_left -= length;
+
+ if (length == 0) {
+ dst++;
+ dst_left--;
+ break;
+ }
+ }
+
+ if (*from_left == src_left)
+ return -1;
+
+ *from = (XPointer) src;
+ *to = (XPointer) dst;
+ *from_left = src_left;
+ *to_left = dst_left;
+
+ return 0;
+}
+
+static int
+stdc_wcstocs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ const wchar_t *src = *((const wchar_t **) from);
+ wchar_t wch;
+ XlcCharSet charset = NULL;
+ XPointer tmp_args[2], tmp_from, save_from = *from;
+ char tmp[32];
+ int length, ret, src_left = *from_left;
+ int unconv_num = 0, tmp_num = 1;
+
+ tmp_args[0] = (XPointer) &charset;
+
+ while (src_left > 0 && *to_left > 0) {
+ if (wch = *src) {
+ length = wctomb(tmp, wch);
+ } else {
+ length = 1;
+ *tmp = '\0';
+ }
+
+ if (length < 0)
+ break;
+
+ tmp_from = (XPointer) tmp;
+ ret = mbtocs(conv, &tmp_from, &length, to, to_left, tmp_args, tmp_num);
+ if (ret < 0)
+ break;
+ unconv_num += ret;
+ if (tmp_num == 1 && charset) {
+ tmp_args[1] = (XPointer) charset;
+ tmp_num = 2;
+ }
+
+ src++;
+ src_left--;
+ }
+
+ if (save_from == (XPointer) src)
+ return -1;
+
+ *from = (XPointer) src;
+ *from_left = src_left;
+
+ if (num_args > 0)
+ *((XlcCharSet *) args[0]) = charset;
+
+ return unconv_num;
+}
+
+#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 int
+stdc_cstowcs(
+ XlcConv conv,
+ XPointer *from,
+ int *from_left,
+ XPointer *to,
+ int *to_left,
+ XPointer *args,
+ int num_args)
+{
+ XLCd lcd = ((State) conv->state)->lcd;
+ DefineLocalBuf;
+ XPointer buf, save_buf;
+ int length, left, ret;
+
+ left = length = *to_left * XLC_PUBLIC(lcd, mb_cur_max);
+ buf = save_buf = (XPointer) AllocLocalBuf(length);
+ if (buf == NULL)
+ return -1;
+
+ ret = cstombs(conv, from, from_left, &buf, &left, args, num_args);
+ if (ret < 0)
+ goto err;
+
+ buf = save_buf;
+ length -= left;
+ if (stdc_mbstowcs(conv, &buf, &length, to, to_left, args, num_args) < 0)
+ ret = -1;
+
+err:
+ FreeLocalBuf(save_buf);
+
+ return ret;
+}
+
+static XlcConvMethodsRec stdc_mbstowcs_methods = {
+ close_converter,
+ stdc_mbstowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_mbstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_mbstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstombs_methods = {
+ close_converter,
+ stdc_wcstombs,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstombs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstombs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstocs_methods = {
+ close_converter,
+ stdc_wcstocs,
+ NULL
+};
+
+static XlcConv
+open_stdc_wcstocs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_wcstocs_methods);
+}
+
+static XlcConvMethodsRec stdc_cstowcs_methods = {
+ close_converter,
+ stdc_cstowcs,
+ NULL
+};
+
+static XlcConv
+open_stdc_cstowcs(
+ XLCd from_lcd,
+ const char *from_type,
+ XLCd to_lcd,
+ const char *to_type)
+{
+ return create_conv(from_lcd, &stdc_cstowcs_methods);
+}
+#endif /* STDCVT */
+
+XLCd
+_XlcJisLoader(
+ const char *name)
+{
+ XLCd lcd;
+#ifdef STDCVT
+ XLCdGenericPart *gen;
+#endif
+
+ lcd = _XlcCreateLC(name, _XlcGenericMethods);
+ if (lcd == NULL)
+ return lcd;
+
+ if (!XLC_PUBLIC_PART(lcd)->codeset ||
+ (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "JIS7"))) {
+ _XlcDestroyLC(lcd);
+ return (XLCd) NULL;
+ }
+
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+
+#ifdef STDCVT
+ gen = XLC_GENERIC_PART(lcd);
+
+ if (gen->use_stdc_env == True) {
+ _XlcSetConverter(lcd,XlcNMultiByte,lcd,XlcNWideChar,open_stdc_mbstowcs);
+ _XlcSetConverter(lcd,XlcNWideChar,lcd,XlcNMultiByte,open_stdc_wcstombs);
+ }
+ if (gen->force_convert_to_mb == True) {
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet,open_stdc_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar,open_stdc_cstowcs);
+ } else {
+#endif
+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+#ifdef STDCVT
+ }
+#endif
+
+ _XlcAddUtf8Converters(lcd);
+
+ return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/libX11/modules/om/generic/omGeneric.c b/libX11/modules/om/generic/omGeneric.c index 330186d13..f705fbdbe 100644 --- a/libX11/modules/om/generic/omGeneric.c +++ b/libX11/modules/om/generic/omGeneric.c @@ -523,9 +523,7 @@ get_font_name( if (list == NULL)
return NULL;
- name = (char *) Xmalloc(strlen(*list) + 1);
- if (name)
- strcpy(name, *list);
+ name = strdup(*list);
XFreeFontNames(list);
@@ -549,10 +547,9 @@ get_rotate_fontname( || len > XLFD_MAX_LEN)
return NULL;
- pattern = (char *)Xmalloc(len + 1);
+ pattern = strdup(font_name);
if(!pattern)
return NULL;
- strcpy(pattern, font_name);
memset(fields, 0, sizeof(char *) * 14);
ptr = pattern;
@@ -661,10 +658,8 @@ get_font_name_from_list( for (i = 0; i < count; i++) {
fname = list[i];
if(is_match_charset(font_data, fname) == True) {
- name = (char *) Xmalloc(strlen(fname) + 1);
- if (name)
- strcpy(name, fname);
- break;
+ name = strdup(fname);
+ break;
}
}
@@ -685,11 +680,10 @@ parse_all_name( if(is_match_charset(font_data, pattern) != True)
return False;
- font_data->xlfd_name = (char *)Xmalloc(strlen(pattern)+1);
+ font_data->xlfd_name = strdup(pattern);
if(font_data->xlfd_name == NULL)
return (-1);
- strcpy(font_data->xlfd_name, pattern);
return True;
#else /* OLDCODE */
Display *dpy = oc->core.om->core.display;
@@ -723,11 +717,10 @@ parse_all_name( }
}
- font_data->xlfd_name = (char *)Xmalloc(strlen(pattern)+1);
+ font_data->xlfd_name = strdup(pattern);
if(font_data->xlfd_name == NULL)
return (-1);
- strcpy(font_data->xlfd_name, pattern);
return True;
#endif /* OLDCODE */
}
@@ -946,12 +939,9 @@ parse_fontdata( * -- jjw/pma (HP)
*/
if (font_data_return) {
- font_data_return->xlfd_name = (char *)Xmalloc
- (strlen(font_data->xlfd_name) + 1);
+ font_data_return->xlfd_name = strdup(font_data->xlfd_name);
if (!font_data_return->xlfd_name) return -1;
- strcpy (font_data_return->xlfd_name, font_data->xlfd_name);
-
font_data_return->side = font_data->side;
}
#ifdef FONTDEBUG
@@ -996,11 +986,9 @@ parse_fontdata( #ifdef FONTDEBUG
fprintf(stderr,"XLFD name: %s\n",font_data->xlfd_name);
#endif
- font_data_return->xlfd_name = (char *)Xmalloc
- (strlen(font_data->xlfd_name) + 1);
+ font_data_return->xlfd_name = strdup(font_data->xlfd_name);
if (!font_data_return->xlfd_name) return -1;
- strcpy (font_data_return->xlfd_name, font_data->xlfd_name);
font_data_return->side = font_data->side;
}
@@ -1192,11 +1180,10 @@ parse_fontname( * be matched. It returns the required information in
* font_data_return.
*/
- font_set->font_name = (char *)Xmalloc
- (strlen(font_data_return.xlfd_name) + 1);
+ font_set->font_name = strdup(font_data_return.xlfd_name);
if(font_set->font_name == (char *) NULL)
goto err;
- strcpy(font_set->font_name, font_data_return.xlfd_name);
+
font_set->side = font_data_return.side;
Xfree (font_data_return.xlfd_name);
@@ -1223,11 +1210,10 @@ parse_fontname( break;
}
}
- font_set->font_name = (char *)Xmalloc
- (strlen(font_set->substitute[i].xlfd_name) + 1);
+ font_set->font_name = strdup(font_set->substitute[i].xlfd_name);
if(font_set->font_name == (char *) NULL)
goto err;
- strcpy(font_set->font_name,font_set->substitute[i].xlfd_name);
+
font_set->side = font_set->substitute[i].side;
if(parse_vw(oc, font_set, name_list, count) == -1)
goto err;
@@ -1237,11 +1223,10 @@ parse_fontname( }
}
- base_name = (char *) Xmalloc(strlen(oc->core.base_name_list) + 1);
+ base_name = strdup(oc->core.base_name_list);
if (base_name == NULL)
goto err;
- strcpy(base_name, oc->core.base_name_list);
oc->core.base_name_list = base_name;
XFreeStringList(name_list);
@@ -1654,10 +1639,9 @@ create_oc( XOCMethodsList methods_list = oc_methods_list;
int count;
- oc = (XOC) Xmalloc(sizeof(XOCGenericRec));
+ oc = Xcalloc(1, sizeof(XOCGenericRec));
if (oc == NULL)
return (XOC) NULL;
- bzero((char *) oc, sizeof(XOCGenericRec));
oc->core.om = om;
@@ -1842,26 +1826,23 @@ create_om( {
XOM om;
- om = (XOM) Xmalloc(sizeof(XOMGenericRec));
+ om = Xcalloc(1, sizeof(XOMGenericRec));
if (om == NULL)
return (XOM) NULL;
- bzero((char *) om, sizeof(XOMGenericRec));
om->methods = &methods;
om->core.lcd = lcd;
om->core.display = dpy;
om->core.rdb = rdb;
if (res_name) {
- om->core.res_name = (char *) Xmalloc(strlen(res_name) + 1);
+ om->core.res_name = strdup(res_name);
if (om->core.res_name == NULL)
goto err;
- strcpy(om->core.res_name, res_name);
}
if (res_class) {
- om->core.res_class = (char *) Xmalloc(strlen(res_class) + 1);
+ om->core.res_class = strdup(res_class);
if (om->core.res_class == NULL)
goto err;
- strcpy(om->core.res_class, res_class);
}
if (om_resources[0].xrm_name == NULLQUARK)
@@ -1913,10 +1894,9 @@ read_EncodingInfo( FontData font_data,ret;
char *buf, *bufptr,*scp;
int len;
- font_data = (FontData) Xmalloc(sizeof(FontDataRec) * count);
+ font_data = Xcalloc(count, sizeof(FontDataRec));
if (font_data == NULL)
return NULL;
- bzero((char *) font_data, sizeof(FontDataRec) * count);
ret = font_data;
for ( ; count-- > 0; font_data++) {
@@ -2017,10 +1997,9 @@ init_om( _XlcGetResource(lcd, "XLC_FONTSET", "object_name", &value, &count);
if (count > 0) {
- gen->object_name = (char *) Xmalloc(strlen(*value) + 1);
+ gen->object_name = strdup(*value);
if (gen->object_name == NULL)
return False;
- strcpy(gen->object_name, *value);
}
for (num = 0; ; num++) {
|