Blame src/Lookup.c

Packit cd2a55
/*
Packit cd2a55
Packit cd2a55
Copyright 1988, 1989, 1998  The Open Group
Packit cd2a55
Packit cd2a55
Permission to use, copy, modify, distribute, and sell this software and its
Packit cd2a55
documentation for any purpose is hereby granted without fee, provided that
Packit cd2a55
the above copyright notice appear in all copies and that both that
Packit cd2a55
copyright notice and this permission notice appear in supporting
Packit cd2a55
documentation.
Packit cd2a55
Packit cd2a55
The above copyright notice and this permission notice shall be included in
Packit cd2a55
all copies or substantial portions of the Software.
Packit cd2a55
Packit cd2a55
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit cd2a55
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit cd2a55
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit cd2a55
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit cd2a55
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit cd2a55
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit cd2a55
Packit cd2a55
Except as contained in this notice, the name of The Open Group shall not be
Packit cd2a55
used in advertising or otherwise to promote the sale, use or other dealings
Packit cd2a55
in this Software without prior written authorization from The Open Group.
Packit cd2a55
Packit cd2a55
*/
Packit cd2a55
Packit cd2a55
#ifdef HAVE_CONFIG_H
Packit cd2a55
#include <config.h>
Packit cd2a55
#endif
Packit cd2a55
#include <X11/Xmu/Lookup.h>
Packit cd2a55
Packit cd2a55
#define XK_LATIN1
Packit cd2a55
#define XK_PUBLISHING
Packit cd2a55
#include <X11/keysymdef.h>
Packit cd2a55
Packit cd2a55
/* bit (1<
Packit cd2a55
static unsigned short _Xconst latin1[128] =
Packit cd2a55
  {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x10ee, 0x0000, 0x1000, 0x1084, 0x102e, 0x1000, 0x1080, 0x108e, /* 10 */
Packit cd2a55
   0x108e, 0x1080, 0x0000, 0x1080, 0x1080, 0x10ee, 0x1000, 0x1008,
Packit cd2a55
   0x108e, 0x1080, 0x1084, 0x1084, 0x108e, 0x1004, 0x1000, 0x1084, /* 11 */
Packit cd2a55
   0x100e, 0x1000, 0x0000, 0x1080, 0x1000, 0x1084, 0x1000, 0x0000,
Packit cd2a55
   0x0004, 0x000e, 0x000e, 0x0008, 0x000e, 0x0008, 0x0008, 0x0006, /* 12 */
Packit cd2a55
   0x0004, 0x000e, 0x0004, 0x000e, 0x0004, 0x000e, 0x000e, 0x0004,
Packit cd2a55
   0x0000, 0x0004, 0x0004, 0x0006, 0x000e, 0x0008, 0x000e, 0x000e, /* 13 */
Packit cd2a55
   0x0008, 0x0004, 0x000e, 0x000c, 0x000e, 0x0002, 0x0000, 0x000e,
Packit cd2a55
   0x0004, 0x000e, 0x000e, 0x0008, 0x000e, 0x0008, 0x0008, 0x0006, /* 14 */
Packit cd2a55
   0x0004, 0x000e, 0x0004, 0x000e, 0x0004, 0x000e, 0x000e, 0x0004,
Packit cd2a55
   0x0000, 0x0004, 0x0004, 0x0006, 0x000e, 0x0008, 0x000e, 0x000e, /* 15 */
Packit cd2a55
   0x0008, 0x0004, 0x000e, 0x000c, 0x000e, 0x0002, 0x0000, 0x0000};
Packit cd2a55
Packit cd2a55
/* bit (1<
Packit cd2a55
static unsigned short _Xconst latin2[128] =
Packit cd2a55
  {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0008, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10 */
Packit cd2a55
   0x0000, 0x0008, 0x0004, 0x0000, 0x0000, 0x0000, 0x0008, 0x0004,
Packit cd2a55
   0x0000, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, /* 11 */
Packit cd2a55
   0x0000, 0x0008, 0x0004, 0x0000, 0x0000, 0x0000, 0x0008, 0x0004,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 12 */
Packit cd2a55
   0x0008, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 13 */
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 14 */
Packit cd2a55
   0x0008, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
Packit cd2a55
   0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 15 */
Packit cd2a55
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c};
Packit cd2a55
Packit cd2a55
/* maps Cyrillic keysyms to 8859-5 */
Packit cd2a55
static unsigned char _Xconst cyrillic[128] =
Packit cd2a55
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0xf2, 0xf3, 0xf1, 0xf4, 0xf5, 0xf6, 0xf7, /* 10 */
Packit cd2a55
    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff,
Packit cd2a55
    0xf0, 0xa2, 0xa3, 0xa1, 0xa4, 0xa5, 0xa6, 0xa7, /* 11 */
Packit cd2a55
    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf,
Packit cd2a55
    0xee, 0xd0, 0xd1, 0xe6, 0xd4, 0xd5, 0xe4, 0xd3, /* 12 */
Packit cd2a55
    0xe5, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
Packit cd2a55
    0xdf, 0xef, 0xe0, 0xe1, 0xe2, 0xe3, 0xd6, 0xd2, /* 13 */
Packit cd2a55
    0xec, 0xeb, 0xd7, 0xe8, 0xed, 0xe9, 0xe7, 0xea,
Packit cd2a55
    0xce, 0xb0, 0xb1, 0xc6, 0xb4, 0xb5, 0xc4, 0xb3, /* 14 */
Packit cd2a55
    0xc5, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
Packit cd2a55
    0xbf, 0xcf, 0xc0, 0xc1, 0xc2, 0xc3, 0xb6, 0xb2, /* 15 */
Packit cd2a55
    0xcc, 0xcb, 0xb7, 0xc8, 0xcd, 0xc9, 0xc7, 0xca};
Packit cd2a55
Packit cd2a55
/* maps Greek keysyms to 8859-7 */
Packit cd2a55
static unsigned char _Xconst greek[128] =
Packit cd2a55
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0xb6, 0xb8, 0xb9, 0xba, 0xda, 0x00, 0xbc, /* 10 */
Packit cd2a55
    0xbe, 0xdb, 0x00, 0xbf, 0x00, 0x00, 0xb5, 0xaf,
Packit cd2a55
    0x00, 0xdc, 0xdd, 0xde, 0xdf, 0xfa, 0xc0, 0xfc, /* 11 */
Packit cd2a55
    0xfd, 0xfb, 0xe0, 0xfe, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 12 */
Packit cd2a55
    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
Packit cd2a55
    0xd0, 0xd1, 0xd3, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, /* 13 */
Packit cd2a55
    0xd8, 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit cd2a55
    0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 14 */
Packit cd2a55
    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
Packit cd2a55
    0xf0, 0xf1, 0xf3, 0xf2, 0xf4, 0xf5, 0xf6, 0xf7, /* 15 */
Packit cd2a55
    0xf8, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Packit cd2a55
Packit cd2a55
#define sLatin1		(unsigned long)0
Packit cd2a55
#define sLatin2		(unsigned long)1
Packit cd2a55
#define sLatin3		(unsigned long)2
Packit cd2a55
#define sLatin4		(unsigned long)3
Packit cd2a55
#define sKana		(unsigned long)4
Packit cd2a55
#define sX0201		(unsigned long)0x01000004
Packit cd2a55
#define sArabic		(unsigned long)5
Packit cd2a55
#define sCyrillic	(unsigned long)6
Packit cd2a55
#define sGreek		(unsigned long)7
Packit cd2a55
#define sAPL		(unsigned long)11
Packit cd2a55
#define sHebrew		(unsigned long)12
Packit cd2a55
Packit cd2a55
int
Packit cd2a55
XmuLookupString(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		KeySym *keysym, XComposeStatus *status,
Packit cd2a55
		unsigned long keysymSet)
Packit cd2a55
{
Packit cd2a55
    int count;
Packit cd2a55
    KeySym symbol;
Packit cd2a55
    unsigned long kset;
Packit cd2a55
Packit cd2a55
    kset = keysymSet & 0xffffff;
Packit cd2a55
    count = XLookupString(event, (char *)buffer, nbytes, &symbol, status);
Packit cd2a55
    if (keysym) *keysym = symbol;
Packit cd2a55
    if ((nbytes == 0) || (symbol == NoSymbol)) {
Packit cd2a55
	/* nothing */
Packit cd2a55
    } else if ((count == 0) && ((symbol >> 8) == kset)) {
Packit cd2a55
	count = 1;
Packit cd2a55
	switch (keysymSet) {
Packit cd2a55
	case sKana:
Packit cd2a55
	    buffer[0] = (symbol & 0xff);
Packit cd2a55
	    if (buffer[0] == 0x7e)
Packit cd2a55
		count = 0;
Packit cd2a55
	    break;
Packit cd2a55
	case sCyrillic:
Packit cd2a55
	    buffer[0] = cyrillic[symbol & 0x7f];
Packit cd2a55
	    break;
Packit cd2a55
	case sGreek:
Packit cd2a55
	    buffer[0] = greek[symbol & 0x7f];
Packit cd2a55
	    if (!buffer[0])
Packit cd2a55
		count = 0;
Packit cd2a55
	    break;
Packit cd2a55
	default:
Packit cd2a55
	    buffer[0] = (symbol & 0xff);
Packit cd2a55
	    break;
Packit cd2a55
	}
Packit cd2a55
    } else if ((keysymSet != 0) && (count == 1) &&
Packit cd2a55
	       (((unsigned char *)buffer)[0] == symbol) &&
Packit cd2a55
	       (symbol & 0x80) &&
Packit cd2a55
	       !(latin1[symbol & 0x7f] & (1 << kset))) {
Packit cd2a55
	if ((keysymSet == sHebrew) && (symbol == XK_multiply))
Packit cd2a55
	    buffer[0] = 0xaa;
Packit cd2a55
	else if ((keysymSet == sHebrew) && (symbol == XK_division))
Packit cd2a55
	    buffer[0] = 0xba;
Packit cd2a55
	else if ((keysymSet == sCyrillic) && (symbol == XK_section))
Packit cd2a55
	    buffer[0] = 0xfd;
Packit cd2a55
	else if ((keysymSet == sX0201) && (symbol == XK_yen))
Packit cd2a55
	    buffer[0] = 0x5c;
Packit cd2a55
	else
Packit cd2a55
	    count = 0;
Packit cd2a55
    } else if (count != 0) {
Packit cd2a55
	if ((keysymSet == sX0201) &&
Packit cd2a55
	    ((symbol == XK_backslash) || (symbol == XK_asciitilde)))
Packit cd2a55
	    count = 0;
Packit cd2a55
    } else if (((symbol >> 8) == sLatin2) &&
Packit cd2a55
	       (symbol & 0x80) && (latin2[symbol & 0x7f] & (1 << kset))) {
Packit cd2a55
	buffer[0] = (symbol & 0xff);
Packit cd2a55
	count = 1;
Packit cd2a55
    } else if ((keysymSet == sGreek) &&
Packit cd2a55
	       ((symbol == XK_leftsinglequotemark) ||
Packit cd2a55
		(symbol == XK_rightsinglequotemark))) {
Packit cd2a55
	buffer[0] = symbol - (XK_leftsinglequotemark - 0xa1);
Packit cd2a55
	count = 1;
Packit cd2a55
    }
Packit cd2a55
    return count;
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-1 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupLatin1(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XLookupString(event, (char *)buffer, nbytes, keysym, status);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-2 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupLatin2(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sLatin2);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-3 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupLatin3(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sLatin3);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-4 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupLatin4(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sLatin4);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-1 GL plus Katakana plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupKana(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
	      KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sKana);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces JIS X0201-1976 (8-bit) */
Packit cd2a55
int
Packit cd2a55
XmuLookupJISX0201(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		  KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sX0201);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-6 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupArabic(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sArabic);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO/IEC 8859-5 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupCyrillic(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		  KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sCyrillic);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-7 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupGreek(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
	       KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sGreek);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* XXX this character set needs work */
Packit cd2a55
Packit cd2a55
int
Packit cd2a55
XmuLookupAPL(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
	     KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sAPL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* produces ISO 8859-8 encoding plus ASCII control */
Packit cd2a55
int
Packit cd2a55
XmuLookupHebrew(register XKeyEvent *event, unsigned char *buffer, int nbytes,
Packit cd2a55
		KeySym *keysym, XComposeStatus *status)
Packit cd2a55
{
Packit cd2a55
    return XmuLookupString(event, buffer, nbytes, keysym, status, sHebrew);
Packit cd2a55
}