Mercurial > sdl-ios-xcode
view src/video/qnxgf/SDL_hiddi_keyboard.h @ 3539:f2846bf19360
Fixed bug #896
John Popplewell 2009-12-08 23:05:50 PST
Originally reported by AKFoerster on the mailing list.
Error decoding UTF8 Russian text to UTF-16LE on Windows, but specifically on
platforms without iconv support (the default on Windows).
Valid UTF8 characters are flagged as being overlong and then substituted by the
UNKNOWN_UNICODE character.
After studying the testiconv.c example program, reading the RFCs and putting
some printf statements in SDL_iconv.c the problem is in a test for 'Maximum
overlong sequences', specifically 4.2.1, which is carried out by the following
code:
} else if ( p[0] >= 0xC0 ) {
if ( (p[0] & 0xE0) != 0xC0 ) {
/* Skip illegal sequences
return SDL_ICONV_EILSEQ;
*/
ch = UNKNOWN_UNICODE;
} else {
if ( (p[0] & 0xCE) == 0xC0 ) { <<<<<<<< here
overlong = SDL_TRUE;
}
ch = (Uint32)(p[0] & 0x1F);
left = 1;
}
} else {
Here is the 2-byte encoding of a character in range 00000080 - 000007FF
110xxxxx 10xxxxxx
The line in question is supposed to be checking for an overlong sequence which
would be less than
11000001 10111111
which should be represented as a single byte.
BUT, the mask value (0xCE) is wrong, it isn't checking the top-most bit:
11000001 value
11001110 mask (incorrect)
^
and should be (0xDE):
11000001 value
11011110 mask (correct)
making the above code:
} else if ( p[0] >= 0xC0 ) {
if ( (p[0] & 0xE0) != 0xC0 ) {
/* Skip illegal sequences
return SDL_ICONV_EILSEQ;
*/
ch = UNKNOWN_UNICODE;
} else {
if ( (p[0] & 0xDE) == 0xC0 ) { <<<<<<<< here
overlong = SDL_TRUE;
}
ch = (Uint32)(p[0] & 0x1F);
left = 1;
}
} else {
I can supply a test program and/or a patch if required,
best regards,
John Popplewell
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 11 Dec 2009 08:03:43 +0000 |
parents | 7f684f249ec9 |
children | f7b03b6838cb |
line wrap: on
line source
/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2009 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Sam Lantinga slouken@libsdl.org QNX Graphics Framework SDL driver Copyright (C) 2009 Mike Gorchak (mike@malva.ua, lestat@i.com.ua) */ #ifndef __SDL_HIDDI_KEYBOARD_H__ #define __SDL_HIDDI_KEYBOARD_H__ #include <inttypes.h> /* PS/2 and USB keyboards are generating this packet */ typedef struct key_packet { uint8_t modifiers; uint8_t data; uint8_t codes[6]; } key_packet; /* Key modifier codes */ #define HIDDI_MKEY_LEFT_CTRL 0x00000001 #define HIDDI_MKEY_LEFT_SHIFT 0x00000002 #define HIDDI_MKEY_LEFT_ALT 0x00000004 #define HIDDI_MKEY_LEFT_WFLAG 0x00000008 #define HIDDI_MKEY_RIGHT_CTRL 0x00000010 #define HIDDI_MKEY_RIGHT_SHIFT 0x00000020 #define HIDDI_MKEY_RIGHT_ALT 0x00000040 #define HIDDI_MKEY_RIGHT_WFLAG 0x00000080 /* Key codes */ #define HIDDI_KEY_UNPRESSED 0x00000000 #define HIDDI_KEY_OVERFLOW 0x00000001 #define HIDDI_KEY_ESC 0x00000029 #define HIDDI_KEY_F1 0x0000003A #define HIDDI_KEY_F2 0x0000003B #define HIDDI_KEY_F3 0x0000003C #define HIDDI_KEY_F4 0x0000003D #define HIDDI_KEY_F5 0x0000003E #define HIDDI_KEY_F6 0x0000003F #define HIDDI_KEY_F7 0x00000040 #define HIDDI_KEY_F8 0x00000041 #define HIDDI_KEY_F9 0x00000042 #define HIDDI_KEY_F10 0x00000043 #define HIDDI_KEY_F11 0x00000044 #define HIDDI_KEY_F12 0x00000045 #define HIDDI_KEY_BACKQUOTE 0x00000035 #define HIDDI_KEY_1 0x0000001E #define HIDDI_KEY_2 0x0000001F #define HIDDI_KEY_3 0x00000020 #define HIDDI_KEY_4 0x00000021 #define HIDDI_KEY_5 0x00000022 #define HIDDI_KEY_6 0x00000023 #define HIDDI_KEY_7 0x00000024 #define HIDDI_KEY_8 0x00000025 #define HIDDI_KEY_9 0x00000026 #define HIDDI_KEY_0 0x00000027 #define HIDDI_KEY_MINUS 0x0000002D #define HIDDI_KEY_EQUAL 0x0000002E #define HIDDI_KEY_BACKSPACE 0x0000002A #define HIDDI_KEY_TAB 0x0000002B #define HIDDI_KEY_Q 0x00000014 #define HIDDI_KEY_W 0x0000001A #define HIDDI_KEY_E 0x00000008 #define HIDDI_KEY_R 0x00000015 #define HIDDI_KEY_T 0x00000017 #define HIDDI_KEY_Y 0x0000001C #define HIDDI_KEY_U 0x00000018 #define HIDDI_KEY_I 0x0000000C #define HIDDI_KEY_O 0x00000012 #define HIDDI_KEY_P 0x00000013 #define HIDDI_KEY_LEFT_SQ_BRACKET 0x0000002F #define HIDDI_KEY_RIGHT_SQ_BRACKET 0x00000030 #define HIDDI_KEY_BACKSLASH 0x00000031 #define HIDDI_KEY_CAPSLOCK 0x00000039 #define HIDDI_KEY_A 0x00000004 #define HIDDI_KEY_S 0x00000016 #define HIDDI_KEY_D 0x00000007 #define HIDDI_KEY_F 0x00000009 #define HIDDI_KEY_G 0x0000000A #define HIDDI_KEY_H 0x0000000B #define HIDDI_KEY_J 0x0000000D #define HIDDI_KEY_K 0x0000000E #define HIDDI_KEY_L 0x0000000F #define HIDDI_KEY_SEMICOLON 0x00000033 #define HIDDI_KEY_QUOTE 0x00000034 #define HIDDI_KEY_ENTER 0x00000028 #define HIDDI_KEY_Z 0x0000001D #define HIDDI_KEY_X 0x0000001B #define HIDDI_KEY_C 0x00000006 #define HIDDI_KEY_V 0x00000019 #define HIDDI_KEY_B 0x00000005 #define HIDDI_KEY_N 0x00000011 #define HIDDI_KEY_M 0x00000010 #define HIDDI_KEY_COMMA 0x00000036 #define HIDDI_KEY_POINT 0x00000037 #define HIDDI_KEY_SLASH 0x00000038 #define HIDDI_KEY_SPACE 0x0000002C #define HIDDI_KEY_MENU 0x00000065 #define HIDDI_KEY_PRINTSCREEN 0x00000046 #define HIDDI_KEY_SCROLLLOCK 0x00000047 #define HIDDI_KEY_PAUSE 0x00000048 #define HIDDI_KEY_INSERT 0x00000049 #define HIDDI_KEY_HOME 0x0000004A #define HIDDI_KEY_PAGEUP 0x0000004B #define HIDDI_KEY_DELETE 0x0000004C #define HIDDI_KEY_END 0x0000004D #define HIDDI_KEY_PAGEDOWN 0x0000004E #define HIDDI_KEY_UP 0x00000052 #define HIDDI_KEY_LEFT 0x00000050 #define HIDDI_KEY_DOWN 0x00000051 #define HIDDI_KEY_RIGHT 0x0000004F #define HIDDI_KEY_NUMLOCK 0x00000053 #define HIDDI_KEY_GR_SLASH 0x00000054 #define HIDDI_KEY_GR_ASTERISK 0x00000055 #define HIDDI_KEY_GR_MINUS 0x00000056 #define HIDDI_KEY_GR_7 0x0000005F #define HIDDI_KEY_GR_8 0x00000060 #define HIDDI_KEY_GR_9 0x00000061 #define HIDDI_KEY_GR_PLUS 0x00000057 #define HIDDI_KEY_GR_4 0x0000005C #define HIDDI_KEY_GR_5 0x0000005D #define HIDDI_KEY_GR_6 0x0000005E #define HIDDI_KEY_GR_1 0x00000059 #define HIDDI_KEY_GR_2 0x0000005A #define HIDDI_KEY_GR_3 0x0000005B #define HIDDI_KEY_GR_ENTER 0x00000058 #define HIDDI_KEY_GR_0 0x00000062 #define HIDDI_KEY_GR_DELETE 0x00000063 #endif /* __SDL_HIDDI_KEYBOARD_H__ */