42 lines
945 B
C
42 lines
945 B
C
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <xcb-imdkit/encoding.h>
|
|
|
|
static char*
|
|
ximutf8compound(const char *s, size_t len, size_t *outlen)
|
|
{
|
|
static const char begin[] = "\033%G";
|
|
static const char end[] = "\033%@";
|
|
char *ct;
|
|
size_t n;
|
|
|
|
if(s == NULL || len > SIZE_MAX - (sizeof begin + sizeof end - 1))
|
|
return NULL;
|
|
n = len + sizeof begin + sizeof end - 2;
|
|
ct = malloc(n + 1);
|
|
if(ct == NULL)
|
|
return NULL;
|
|
memcpy(ct, begin, sizeof begin - 1);
|
|
memcpy(ct + sizeof begin - 1, s, len);
|
|
memcpy(ct + sizeof begin - 1 + len, end, sizeof end - 1);
|
|
ct[n] = '\0';
|
|
if(outlen != NULL)
|
|
*outlen = n;
|
|
return ct;
|
|
}
|
|
|
|
char*
|
|
ximcompound(const char *s, size_t len, size_t *outlen)
|
|
{
|
|
char *ct;
|
|
|
|
if(s == NULL)
|
|
return NULL;
|
|
ct = xcb_utf8_to_compound_text(s, len, outlen);
|
|
if(ct != NULL)
|
|
return ct;
|
|
/* X.Org Compound Text extension for characters in no legacy charset. */
|
|
return ximutf8compound(s, len, outlen);
|
|
}
|