]> git.sur5r.net Git - i3/i3/blobdiff - i3-input/ucs2_to_utf8.c
little style fixes
[i3/i3] / i3-input / ucs2_to_utf8.c
index dcd0619702607c5cdbe16069f4fec6758a4a75e1..4557c9dab73199b270642a57ba724859ab08bf8b 100644 (file)
  */
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 #include <err.h>
 #include <iconv.h>
 
 static iconv_t conversion_descriptor = 0;
+static iconv_t conversion_descriptor2 = 0;
 
 /*
  * Returns the input string, but converted from UCS-2 to UTF-8. Memory will be
@@ -53,3 +55,50 @@ char *convert_ucs_to_utf8(char *input) {
 
        return buffer;
 }
+
+/*
+ * Converts the given string to UCS-2 big endian for use with
+ * xcb_image_text_16(). The amount of real glyphs is stored in real_strlen,
+ * a buffer containing the UCS-2 encoded string (16 bit per glyph) is
+ * returned. It has to be freed when done.
+ *
+ */
+char *convert_utf8_to_ucs2(char *input, int *real_strlen) {
+       size_t input_size = strlen(input) + 1;
+       /* UCS-2 consumes exactly two bytes for each glyph */
+       int buffer_size = input_size * 2;
+
+       char *buffer = malloc(buffer_size);
+        if (buffer == NULL)
+                err(EXIT_FAILURE, "malloc() failed\n");
+       size_t output_size = buffer_size;
+       /* We need to use an additional pointer, because iconv() modifies it */
+       char *output = buffer;
+
+       /* We convert the input into UCS-2 big endian */
+        if (conversion_descriptor2 == 0) {
+                conversion_descriptor2 = iconv_open("UCS-2BE", "UTF-8");
+                if (conversion_descriptor2 == 0) {
+                        fprintf(stderr, "error opening the conversion context\n");
+                        exit(1);
+                }
+        }
+
+       /* Get the conversion descriptor back to original state */
+       iconv(conversion_descriptor2, NULL, NULL, NULL, NULL);
+
+       /* Convert our text */
+       int rc = iconv(conversion_descriptor2, (void*)&input, &input_size, &output, &output_size);
+        if (rc == (size_t)-1) {
+                perror("Converting to UCS-2 failed");
+                if (real_strlen != NULL)
+                       *real_strlen = 0;
+                return NULL;
+       }
+
+        if (real_strlen != NULL)
+               *real_strlen = ((buffer_size - output_size) / 2) - 1;
+
+       return buffer;
+}
+