hidapi, libusb: don't use iconv on OS/2, it lacks wchar_t functionality.

Taken from a patch by Silvan Scherrer at bitwiseworks' OS/2 fork.
This commit is contained in:
Ozkan Sezer 2022-01-14 14:39:04 +03:00
parent 9a2bbd8acb
commit e9511f7136
1 changed files with 25 additions and 0 deletions

View File

@ -388,12 +388,16 @@ static int is_language_supported(libusb_device_handle *dev, uint16_t lang)
/* This function returns a newly allocated wide string containing the USB /* This function returns a newly allocated wide string containing the USB
device string numbered by the index. The returned string must be freed device string numbered by the index. The returned string must be freed
by using free(). */ by using free(). */
#if defined(__OS2__) /* don't use iconv on OS/2: no support for wchar_t. */
#define NO_ICONV
#endif
static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx) static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
{ {
char buf[512]; char buf[512];
int len; int len;
wchar_t *str = NULL; wchar_t *str = NULL;
#if !defined(NO_ICONV)
wchar_t wbuf[256]; wchar_t wbuf[256];
SDL_iconv_t ic; SDL_iconv_t ic;
size_t inbytes; size_t inbytes;
@ -401,6 +405,9 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
size_t res; size_t res;
const char *inptr; const char *inptr;
char *outptr; char *outptr;
#else
int i;
#endif
/* Determine which language to use. */ /* Determine which language to use. */
uint16_t lang; uint16_t lang;
@ -417,6 +424,23 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
if (len < 0) if (len < 0)
return NULL; return NULL;
#if defined(NO_ICONV) /* original hidapi code for NO_ICONV : */
/* Bionic does not have wchar_t iconv support, so it
has to be done manually. The following code will only work for
code points that can be represented as a single UTF-16 character,
and will incorrectly convert any code points which require more
than one UTF-16 character.
Skip over the first character (2-bytes). */
len -= 2;
str = (wchar_t*) malloc((len / 2 + 1) * sizeof(wchar_t));
for (i = 0; i < len / 2; i++) {
str[i] = buf[i * 2 + 2] | (buf[i * 2 + 3] << 8);
}
str[len / 2] = 0x00000000;
#else
/* buf does not need to be explicitly NULL-terminated because /* buf does not need to be explicitly NULL-terminated because
it is only passed into iconv() which does not need it. */ it is only passed into iconv() which does not need it. */
@ -449,6 +473,7 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
err: err:
SDL_iconv_close(ic); SDL_iconv_close(ic);
#endif
return str; return str;
} }