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:
David Herrmann 2012-01-01 17:42:57 +01:00
parent b3ce42bc63
commit 4eca3ef714
2 changed files with 38 additions and 2 deletions

View File

@ -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);
}

View File

@ -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 */