#include #include #include #include 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); }