summaryrefslogtreecommitdiff
path: root/ucs2_to_utf8.c
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2012-10-26 20:24:55 +0200
committerMichael Stapelberg <michael@stapelberg.de>2012-10-26 20:39:59 +0200
commite1d86a327945111b99148650dc536c9ad8598cc1 (patch)
treef120f2e29e47cfa7eb494f811c3282449cf3d720 /ucs2_to_utf8.c
parent1d08065fe02304f078c9b34250148777f3d0a734 (diff)
use libxkbcommon for input handling
Thanks to Ran Benita and Daniel Stone (the libxkbcommon authors) for answering my questions and reviewing this code. With this commit, input handling should be more correct with using less code (in i3lock, that is).
Diffstat (limited to 'ucs2_to_utf8.c')
-rw-r--r--ucs2_to_utf8.c111
1 files changed, 0 insertions, 111 deletions
diff --git a/ucs2_to_utf8.c b/ucs2_to_utf8.c
deleted file mode 100644
index ab56bf2..0000000
--- a/ucs2_to_utf8.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * vim:ts=8:expandtab
- *
- * i3 - an improved dynamic tiling window manager
- *
- * © 2009-2012 Michael Stapelberg and contributors
- *
- * See file LICENSE for license information.
- *
- */
-#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;
-
-/* isutf, u8_dec © 2005 Jeff Bezanson, public domain */
-#define isutf(c) (((c) & 0xC0) != 0x80)
-
-/*
- * Decrements i to point to the previous unicode glyph
- *
- */
-void u8_dec(char *s, int *i) {
- (void)(isutf(s[--(*i)]) || isutf(s[--(*i)]) || isutf(s[--(*i)]) || --(*i));
-}
-
-/*
- * Returns the input string, but converted from UCS-2 to UTF-8. Memory will be
- * allocated, thus the caller has to free the output.
- *
- */
-int convert_ucs_to_utf8(char *input, char *output) {
- size_t input_size = 2;
-
- /* UTF-8 may consume up to 4 byte */
- size_t output_size = 8;
- /* We need to use an additional pointer, because iconv() modifies it */
- char *outptr = output;
-
- /* We convert the input into UCS-2 big endian */
- if (conversion_descriptor == 0) {
- conversion_descriptor = iconv_open("UTF-8", "UCS-2BE");
- if (conversion_descriptor == 0) {
- fprintf(stderr, "error opening the conversion context\n");
- exit(1);
- }
- }
-
- /* Get the conversion descriptor back to original state */
- iconv(conversion_descriptor, NULL, NULL, NULL, NULL);
-
- /* Convert our text */
- int rc = iconv(conversion_descriptor, (void*)&input, &input_size, &outptr, &output_size);
- if (rc == (size_t)-1) {
- perror("Converting to UCS-2 failed");
- return 0;
- }
-
- return (8 - output_size);
-}
-
-/*
- * 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;
-}
-