Blame util/IMdkit/IMConn.c

Packit Service 1d8f1c
/******************************************************************
Packit Service 1d8f1c
 
Packit Service 1d8f1c
         Copyright 1994, 1995 by Sun Microsystems, Inc.
Packit Service 1d8f1c
         Copyright 1993, 1994 by Hewlett-Packard Company
Packit Service 1d8f1c
 
Packit Service 1d8f1c
Permission to use, copy, modify, distribute, and sell this software
Packit Service 1d8f1c
and its documentation for any purpose is hereby granted without fee,
Packit Service 1d8f1c
provided that the above copyright notice appear in all copies and
Packit Service 1d8f1c
that both that copyright notice and this permission notice appear
Packit Service 1d8f1c
in supporting documentation, and that the name of Sun Microsystems, Inc.
Packit Service 1d8f1c
and Hewlett-Packard not be used in advertising or publicity pertaining to
Packit Service 1d8f1c
distribution of the software without specific, written prior permission.
Packit Service 1d8f1c
Sun Microsystems, Inc. and Hewlett-Packard make no representations about
Packit Service 1d8f1c
the suitability of this software for any purpose.  It is provided "as is"
Packit Service 1d8f1c
without express or implied warranty.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL
Packit Service 1d8f1c
WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
Packit Service 1d8f1c
WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit Service 1d8f1c
SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY
Packit Service 1d8f1c
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
Packit Service 1d8f1c
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
Packit Service 1d8f1c
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
Packit Service 1d8f1c
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
  Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc.
Packit Service 1d8f1c
Packit Service 1d8f1c
    This version tidied and debugged by Steve Underwood May 1999
Packit Service 1d8f1c
 
Packit Service 1d8f1c
******************************************************************/
Packit Service 1d8f1c
Packit Service 1d8f1c
#include <X11/Xlib.h>
Packit Service 1d8f1c
#include <stdlib.h>
Packit Service 1d8f1c
#include <string.h>
Packit Service 1d8f1c
#include "IMdkit.h"
Packit Service 1d8f1c
#include <stdarg.h>
Packit Service 1d8f1c
Packit Service 1d8f1c
#define Va_start(a,b) va_start(a,b)
Packit Service 1d8f1c
Packit Service 1d8f1c
static void _IMCountVaList(va_list var, int *total_count)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    char *attr;
Packit Service 1d8f1c
Packit Service 1d8f1c
    *total_count = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    for (attr = va_arg (var, char*);  attr;  attr = va_arg (var, char*))
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
	(void)va_arg (var, XIMArg *);
Packit Service 1d8f1c
	++(*total_count);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endfor*/
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void _IMVaToNestedList(va_list var, int max_count, XIMArg **args_return)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    XIMArg *args;
Packit Service 1d8f1c
    char   *attr;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (max_count <= 0)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
	*args_return = (XIMArg *) NULL;
Packit Service 1d8f1c
	return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
Packit Service 1d8f1c
    args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg));
Packit Service 1d8f1c
    *args_return = args;
Packit Service 1d8f1c
    if (!args)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
Packit Service 1d8f1c
    for (attr = va_arg (var, char*);  attr;  attr = va_arg (var, char *))
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
	args->name = attr;
Packit Service 1d8f1c
	args->value = va_arg (var, XPointer);
Packit Service 1d8f1c
	args++;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endfor*/
Packit Service 1d8f1c
    args->name = (char*)NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static char *_FindModifiers (XIMArg *args)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    char *modifiers;
Packit Service 1d8f1c
Packit Service 1d8f1c
    while (args && args->name)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
	if (strcmp (args->name, IMModifiers) == 0)
Packit Service 1d8f1c
	{
Packit Service 1d8f1c
	    modifiers = args->value;
Packit Service 1d8f1c
	    return modifiers;
Packit Service 1d8f1c
	}
Packit Service 1d8f1c
	else
Packit Service 1d8f1c
	{
Packit Service 1d8f1c
	    args++;
Packit Service 1d8f1c
	}
Packit Service 1d8f1c
	/*endif*/
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endwhile*/
Packit Service 1d8f1c
    return NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
XIMS _GetIMS (char *modifiers)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    XIMS ims;
Packit Service 1d8f1c
    extern IMMethodsRec Xi18n_im_methods;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((ims = (XIMS) malloc (sizeof (XIMProtocolRec))) == (XIMS) NULL)
Packit Service 1d8f1c
	return ((XIMS) NULL);
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    memset ((void *) ims, 0, sizeof (XIMProtocolRec));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (modifiers == NULL
Packit Service 1d8f1c
	||
Packit Service 1d8f1c
	modifiers[0] == '\0'
Packit Service 1d8f1c
	||
Packit Service 1d8f1c
	strcmp (modifiers, "Xi18n") == 0)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
	ims->methods = &Xi18n_im_methods;
Packit Service 1d8f1c
	return ims;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    XFree (ims);
Packit Service 1d8f1c
    return (XIMS) NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
XIMS IMOpenIM (Display *display, ...)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    va_list var;
Packit Service 1d8f1c
    int total_count;
Packit Service 1d8f1c
    XIMArg *args;
Packit Service 1d8f1c
    XIMS ims;
Packit Service 1d8f1c
    char *modifiers;
Packit Service 1d8f1c
    Status ret;
Packit Service 1d8f1c
Packit Service 1d8f1c
    Va_start (var, display);
Packit Service 1d8f1c
    _IMCountVaList (var, &total_count);
Packit Service 1d8f1c
    va_end (var);
Packit Service 1d8f1c
Packit Service 1d8f1c
    Va_start (var, display);
Packit Service 1d8f1c
    _IMVaToNestedList (var, total_count, &args);
Packit Service 1d8f1c
    va_end (var);
Packit Service 1d8f1c
Packit Service 1d8f1c
    modifiers = _FindModifiers (args);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ims = _GetIMS (modifiers);
Packit Service 1d8f1c
    if (ims == (XIMS) NULL) {
Packit Service 1d8f1c
        XFree (args);
Packit Service 1d8f1c
        return (XIMS) NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    
Packit Service 1d8f1c
    ims->core.display = display;
Packit Service 1d8f1c
Packit Service 1d8f1c
    ims->protocol = (*ims->methods->setup) (display, args);
Packit Service 1d8f1c
    XFree (args);
Packit Service 1d8f1c
    if (ims->protocol == (void *) NULL)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
	XFree (ims);
Packit Service 1d8f1c
	return (XIMS) NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    ret = (ims->methods->openIM) (ims);
Packit Service 1d8f1c
    if (ret == False)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
	XFree (ims);
Packit Service 1d8f1c
	return (XIMS) NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    return (XIMS) ims;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Status IMCloseIM (XIMS ims)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    (ims->methods->closeIM) (ims);
Packit Service 1d8f1c
    XFree (ims);
Packit Service 1d8f1c
    return True;
Packit Service 1d8f1c
}