unicode: provide utf8 converter
Allow converting a ucs4 string into a utf8 string. Also export the default symbol so other subsystems may use it. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
b3ce42bc63
commit
4eca3ef714
@ -52,7 +52,8 @@
|
||||
#define KMSCON_UCS4_MAXLEN 10
|
||||
#define KMSCON_UCS4_MAX 0x7fffffffUL
|
||||
|
||||
static const kmscon_symbol_t default_symbol = 0;
|
||||
const kmscon_symbol_t kmscon_symbol_default = 0;
|
||||
static const char default_u8[] = { 0 };
|
||||
|
||||
struct kmscon_symbol_table {
|
||||
unsigned long ref;
|
||||
@ -253,5 +254,35 @@ const uint32_t *kmscon_symbol_get(const struct kmscon_symbol_table *st,
|
||||
def_value:
|
||||
if (size)
|
||||
*size = 1;
|
||||
return &default_symbol;
|
||||
return &kmscon_symbol_default;
|
||||
}
|
||||
|
||||
const char *kmscon_symbol_get_u8(const struct kmscon_symbol_table *st,
|
||||
kmscon_symbol_t sym, size_t *size)
|
||||
{
|
||||
const uint32_t *ucs4;
|
||||
gchar *val;
|
||||
glong len;
|
||||
|
||||
if (!st)
|
||||
goto def_value;
|
||||
|
||||
ucs4 = kmscon_symbol_get(st, &sym, size);
|
||||
val = g_ucs4_to_utf8(ucs4, *size, NULL, &len, NULL);
|
||||
if (!val || len < 0)
|
||||
goto def_value;
|
||||
|
||||
*size = len;
|
||||
return val;
|
||||
|
||||
def_value:
|
||||
if (size)
|
||||
*size = 1;
|
||||
return default_u8;
|
||||
}
|
||||
|
||||
void kmscon_symbol_free_u8(const char *s)
|
||||
{
|
||||
if (s != default_u8)
|
||||
g_free((char*)s);
|
||||
}
|
||||
|
@ -54,6 +54,8 @@
|
||||
struct kmscon_symbol_table;
|
||||
typedef uint32_t kmscon_symbol_t;
|
||||
|
||||
extern const kmscon_symbol_t kmscon_symbol_default;
|
||||
|
||||
int kmscon_symbol_table_new(struct kmscon_symbol_table **out);
|
||||
void kmscon_symbol_table_ref(struct kmscon_symbol_table *st);
|
||||
void kmscon_symbol_table_unref(struct kmscon_symbol_table *st);
|
||||
@ -63,5 +65,8 @@ kmscon_symbol_t kmscon_symbol_append(struct kmscon_symbol_table *st,
|
||||
kmscon_symbol_t sym, uint32_t ucs4);
|
||||
const uint32_t *kmscon_symbol_get(const struct kmscon_symbol_table *st,
|
||||
kmscon_symbol_t *sym, size_t *size);
|
||||
const char *kmscon_symbol_get_u8(const struct kmscon_symbol_table *st,
|
||||
kmscon_symbol_t sym, size_t *size);
|
||||
void kmscon_symbol_free_u8(const char *s);
|
||||
|
||||
#endif /* KMSCON_UNICODE_H */
|
||||
|
Loading…
x
Reference in New Issue
Block a user