unicode: provide utf8 converter
authorDavid Herrmann <dh.herrmann@googlemail.com>
Sun, 1 Jan 2012 16:42:57 +0000 (17:42 +0100)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Sun, 1 Jan 2012 16:42:57 +0000 (17:42 +0100)
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>
src/unicode.c
src/unicode.h

index c485189..13619e4 100644 (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);
 }
index 80008fe..a9a4318 100644 (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 */